base.py 5.1 KB

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