base.py 5.3 KB

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