chakra.py 5.0 KB

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