chakra.py 5.6 KB

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