chakra.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. "gray",
  75. "red",
  76. "orange",
  77. "yellow",
  78. "green",
  79. "teal",
  80. "blue",
  81. "cyan",
  82. "purple",
  83. "pink",
  84. "whiteAlpha",
  85. "blackAlpha",
  86. "linkedin",
  87. "facebook",
  88. "messenger",
  89. "whatsapp",
  90. "twitter",
  91. "telegram",
  92. ]
  93. LiteralVariant = Literal["solid", "subtle", "outline"]
  94. LiteralDividerVariant = Literal["solid", "dashed"]
  95. LiteralTheme = Literal["light", "dark"]
  96. LiteralTagColorScheme = Literal[
  97. "gray",
  98. "red",
  99. "orange",
  100. "yellow",
  101. "green",
  102. "teal",
  103. "blue",
  104. "cyan",
  105. "purple",
  106. "pink",
  107. ]
  108. LiteralTagAlign = Literal["center", "end", "start"]
  109. LiteralTabsVariant = Literal[
  110. "line",
  111. "enclosed",
  112. "enclosed-colored",
  113. "soft-rounded",
  114. "solid-rounded",
  115. "unstyled",
  116. ]
  117. LiteralStatus = Literal["success", "info", "warning", "error"]
  118. LiteralAlertVariant = Literal["subtle", "left-accent", "top-accent", "solid"]
  119. LiteralButtonVariant = Literal["ghost", "outline", "solid", "link", "unstyled"]
  120. LiteralSpinnerPlacement = Literal["start", "end"]
  121. LiteralLanguage = Literal[
  122. "en",
  123. "da",
  124. "de",
  125. "es",
  126. "fr",
  127. "ja",
  128. "ko",
  129. "pt_br",
  130. "ru",
  131. "zh_cn",
  132. "ro",
  133. "pl",
  134. "ckb",
  135. "lv",
  136. "se",
  137. "ua",
  138. "he",
  139. "it",
  140. ]
  141. LiteralInputVariant = Literal["outline", "filled", "flushed", "unstyled"]
  142. LiteralInputNumberMode = [
  143. "text",
  144. "search",
  145. "none",
  146. "tel",
  147. "url",
  148. "email",
  149. "numeric",
  150. "decimal",
  151. ]
  152. LiteralChakraDirection = Literal["ltr", "rtl"]
  153. LiteralCardVariant = Literal["outline", "filled", "elevated", "unstyled"]
  154. LiteralStackDirection = Literal["row", "column"]
  155. LiteralImageLoading = Literal["eager", "lazy"]
  156. LiteralTagSize = Literal["sm", "md", "lg"]
  157. LiteralSpinnerSize = Literal[Literal[LiteralTagSize], "xs", "xl"]
  158. LiteralAvatarSize = Literal[Literal[LiteralTagSize], "xl", "xs", "2xl", "full", "2xs"]
  159. LiteralButtonSize = Literal["sm", "md", "lg", "xs"]
  160. # Applies to AlertDialog and Modal
  161. LiteralAlertDialogSize = Literal[
  162. "sm", "md", "lg", "xs", "2xl", "full", "3xl", "4xl", "5xl", "6xl"
  163. ]
  164. LiteralDrawerSize = Literal[Literal[LiteralSpinnerSize], "xl", "full"]
  165. LiteralMenuStrategy = Literal["fixed", "absolute"]
  166. LiteralMenuOption = Literal["checkbox", "radio"]
  167. LiteralPopOverTrigger = Literal["click", "hover"]
  168. LiteralHeadingSize = Literal["lg", "md", "sm", "xs", "xl", "2xl", "3xl", "4xl"]