base.py 5.1 KB

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