base.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. """Components that are based on Chakra-UI."""
  2. from __future__ import annotations
  3. from functools import lru_cache
  4. from typing import List, Literal
  5. from reflex.components.component import Component
  6. from reflex.utils import imports
  7. from reflex.vars import Var
  8. class ChakraComponent(Component):
  9. """A component that wraps a Chakra component."""
  10. library = "@chakra-ui/react@2.6.1"
  11. lib_dependencies: List[str] = [
  12. "@chakra-ui/system@2.5.7",
  13. "framer-motion@10.16.4",
  14. ]
  15. @staticmethod
  16. @lru_cache(maxsize=None)
  17. def _get_app_wrap_components() -> dict[tuple[int, str], Component]:
  18. return {
  19. (60, "ChakraProvider"): chakra_provider,
  20. }
  21. def _get_style(self) -> dict:
  22. """Get the style for the component.
  23. Returns:
  24. The dictionary of the component style as value and the style notation as key.
  25. """
  26. return {"sx": self.style}
  27. @classmethod
  28. @lru_cache(maxsize=None)
  29. def _get_dependencies_imports(cls) -> imports.ImportDict:
  30. """Get the imports from lib_dependencies for installing.
  31. Returns:
  32. The dependencies imports of the component.
  33. """
  34. return {
  35. dep: [imports.ImportVar(tag=None, render=False)]
  36. for dep in [
  37. "@chakra-ui/system@2.5.7",
  38. "framer-motion@10.16.4",
  39. ]
  40. }
  41. class ChakraProvider(ChakraComponent):
  42. """Top level Chakra provider must be included in any app using chakra components."""
  43. tag = "ChakraProvider"
  44. theme: Var[str]
  45. @classmethod
  46. def create(cls) -> Component:
  47. """Create a new ChakraProvider component.
  48. Returns:
  49. A new ChakraProvider component.
  50. """
  51. return super().create(
  52. theme=Var.create("extendTheme(theme)", _var_is_local=False),
  53. )
  54. def _get_imports(self) -> imports.ImportDict:
  55. _imports = super()._get_imports()
  56. _imports.setdefault(self.__fields__["library"].default, []).append(
  57. imports.ImportVar(tag="extendTheme", is_default=False),
  58. )
  59. _imports.setdefault("/utils/theme.js", []).append(
  60. imports.ImportVar(tag="theme", is_default=True),
  61. )
  62. return _imports
  63. @staticmethod
  64. @lru_cache(maxsize=None)
  65. def _get_app_wrap_components() -> dict[tuple[int, str], Component]:
  66. return {
  67. (50, "ChakraColorModeProvider"): chakra_color_mode_provider,
  68. }
  69. chakra_provider = ChakraProvider.create()
  70. class ChakraColorModeProvider(Component):
  71. """Next-themes integration for chakra colorModeProvider."""
  72. library = "/components/reflex/chakra_color_mode_provider.js"
  73. tag = "ChakraColorModeProvider"
  74. is_default = True
  75. chakra_color_mode_provider = ChakraColorModeProvider.create()
  76. LiteralColorScheme = Literal[
  77. "none",
  78. "gray",
  79. "red",
  80. "orange",
  81. "yellow",
  82. "green",
  83. "teal",
  84. "blue",
  85. "cyan",
  86. "purple",
  87. "pink",
  88. "whiteAlpha",
  89. "blackAlpha",
  90. "linkedin",
  91. "facebook",
  92. "messenger",
  93. "whatsapp",
  94. "twitter",
  95. "telegram",
  96. ]
  97. LiteralVariant = Literal["solid", "subtle", "outline"]
  98. LiteralDividerVariant = Literal["solid", "dashed"]
  99. LiteralTheme = Literal["light", "dark"]
  100. LiteralTagColorScheme = Literal[
  101. "gray",
  102. "red",
  103. "orange",
  104. "yellow",
  105. "green",
  106. "teal",
  107. "blue",
  108. "cyan",
  109. "purple",
  110. "pink",
  111. ]
  112. LiteralTagAlign = Literal["center", "end", "start"]
  113. LiteralTabsVariant = Literal[
  114. "line",
  115. "enclosed",
  116. "enclosed-colored",
  117. "soft-rounded",
  118. "solid-rounded",
  119. "unstyled",
  120. ]
  121. LiteralStatus = Literal["success", "info", "warning", "error"]
  122. LiteralAlertVariant = Literal["subtle", "left-accent", "top-accent", "solid"]
  123. LiteralButtonVariant = Literal["ghost", "outline", "solid", "link", "unstyled"]
  124. LiteralSpinnerPlacement = Literal["start", "end"]
  125. LiteralLanguage = Literal[
  126. "en",
  127. "da",
  128. "de",
  129. "es",
  130. "fr",
  131. "ja",
  132. "ko",
  133. "pt_br",
  134. "ru",
  135. "zh_cn",
  136. "ro",
  137. "pl",
  138. "ckb",
  139. "lv",
  140. "se",
  141. "ua",
  142. "he",
  143. "it",
  144. ]
  145. LiteralInputVariant = Literal["outline", "filled", "flushed", "unstyled"]
  146. LiteralInputNumberMode = [
  147. "text",
  148. "search",
  149. "none",
  150. "tel",
  151. "url",
  152. "email",
  153. "numeric",
  154. "decimal",
  155. ]
  156. LiteralChakraDirection = Literal["ltr", "rtl"]
  157. LiteralCardVariant = Literal["outline", "filled", "elevated", "unstyled"]
  158. LiteralStackDirection = Literal["row", "column"]
  159. LiteralImageLoading = Literal["eager", "lazy"]
  160. LiteralTagSize = Literal["sm", "md", "lg"]
  161. LiteralSpinnerSize = Literal[Literal[LiteralTagSize], "xs", "xl"]
  162. LiteralAvatarSize = Literal[Literal[LiteralTagSize], "xl", "xs", "2xl", "full", "2xs"]
  163. LiteralButtonSize = Literal["sm", "md", "lg", "xs"]
  164. # Applies to AlertDialog and Modal
  165. LiteralAlertDialogSize = Literal[
  166. "sm", "md", "lg", "xs", "2xl", "full", "3xl", "4xl", "5xl", "6xl"
  167. ]
  168. LiteralDrawerSize = Literal[Literal[LiteralSpinnerSize], "xl", "full"]
  169. LiteralMenuStrategy = Literal["fixed", "absolute"]
  170. LiteralMenuOption = Literal["checkbox", "radio"]
  171. LiteralPopOverTrigger = Literal["click", "hover"]
  172. LiteralHeadingSize = Literal["lg", "md", "sm", "xs", "xl", "2xl", "3xl", "4xl"]