reflex 0.5.10a2__py3-none-any.whl → 0.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

Files changed (303) hide show
  1. reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +2 -2
  2. reflex/.templates/jinja/web/pages/_app.js.jinja2 +1 -1
  3. reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -4
  4. reflex/.templates/jinja/web/utils/context.js.jinja2 +1 -1
  5. reflex/.templates/jinja/web/utils/theme.js.jinja2 +1 -1
  6. reflex/.templates/web/utils/state.js +3 -1
  7. reflex/__init__.py +10 -3
  8. reflex/__init__.pyi +3 -2
  9. reflex/app.py +47 -11
  10. reflex/app_module_for_backend.py +1 -1
  11. reflex/base.py +3 -2
  12. reflex/compiler/compiler.py +5 -5
  13. reflex/compiler/utils.py +5 -3
  14. reflex/components/base/app_wrap.py +2 -4
  15. reflex/components/base/app_wrap.pyi +16 -26
  16. reflex/components/base/bare.py +6 -4
  17. reflex/components/base/body.pyi +16 -26
  18. reflex/components/base/document.pyi +76 -126
  19. reflex/components/base/error_boundary.py +9 -8
  20. reflex/components/base/error_boundary.pyi +18 -30
  21. reflex/components/base/fragment.pyi +16 -26
  22. reflex/components/base/head.pyi +31 -51
  23. reflex/components/base/link.py +1 -1
  24. reflex/components/base/link.pyi +31 -51
  25. reflex/components/base/meta.pyi +61 -101
  26. reflex/components/base/script.py +2 -2
  27. reflex/components/base/script.pyi +20 -36
  28. reflex/components/component.py +107 -130
  29. reflex/components/core/banner.py +61 -66
  30. reflex/components/core/banner.pyi +129 -230
  31. reflex/components/core/client_side_routing.py +2 -2
  32. reflex/components/core/client_side_routing.pyi +31 -51
  33. reflex/components/core/clipboard.py +4 -3
  34. reflex/components/core/clipboard.pyi +19 -31
  35. reflex/components/core/cond.py +21 -44
  36. reflex/components/core/debounce.py +7 -9
  37. reflex/components/core/debounce.pyi +19 -31
  38. reflex/components/core/foreach.py +4 -14
  39. reflex/components/core/html.py +1 -1
  40. reflex/components/core/html.pyi +34 -44
  41. reflex/components/core/match.py +36 -43
  42. reflex/components/core/upload.py +27 -26
  43. reflex/components/core/upload.pyi +81 -116
  44. reflex/components/datadisplay/code.py +55 -29
  45. reflex/components/datadisplay/code.pyi +303 -410
  46. reflex/components/datadisplay/dataeditor.py +13 -9
  47. reflex/components/datadisplay/dataeditor.pyi +39 -51
  48. reflex/components/el/__init__.py +0 -1
  49. reflex/components/el/__init__.pyi +0 -11
  50. reflex/components/el/element.pyi +16 -26
  51. reflex/components/el/elements/__init__.py +1 -7
  52. reflex/components/el/elements/__init__.pyi +1 -15
  53. reflex/components/el/elements/base.py +1 -1
  54. reflex/components/el/elements/base.pyi +33 -43
  55. reflex/components/el/elements/forms.py +26 -33
  56. reflex/components/el/elements/forms.pyi +542 -694
  57. reflex/components/el/elements/inline.py +1 -1
  58. reflex/components/el/elements/inline.pyi +909 -1189
  59. reflex/components/el/elements/media.py +1 -22
  60. reflex/components/el/elements/media.pyi +765 -975
  61. reflex/components/el/elements/metadata.py +3 -5
  62. reflex/components/el/elements/metadata.pyi +175 -235
  63. reflex/components/el/elements/other.py +1 -1
  64. reflex/components/el/elements/other.pyi +228 -298
  65. reflex/components/el/elements/scripts.py +1 -1
  66. reflex/components/el/elements/scripts.pyi +106 -136
  67. reflex/components/el/elements/sectioning.py +0 -2
  68. reflex/components/el/elements/sectioning.pyi +481 -631
  69. reflex/components/el/elements/tables.py +1 -1
  70. reflex/components/el/elements/tables.pyi +341 -441
  71. reflex/components/el/elements/typography.py +1 -1
  72. reflex/components/el/elements/typography.pyi +491 -641
  73. reflex/components/gridjs/datatable.py +9 -13
  74. reflex/components/gridjs/datatable.pyi +33 -53
  75. reflex/components/lucide/icon.py +3 -127
  76. reflex/components/lucide/icon.pyi +31 -160
  77. reflex/components/markdown/markdown.py +32 -42
  78. reflex/components/markdown/markdown.pyi +28 -41
  79. reflex/components/moment/moment.py +13 -12
  80. reflex/components/moment/moment.pyi +22 -33
  81. reflex/components/next/base.pyi +16 -26
  82. reflex/components/next/image.py +1 -5
  83. reflex/components/next/image.pyi +21 -35
  84. reflex/components/next/link.py +1 -1
  85. reflex/components/next/link.pyi +16 -26
  86. reflex/components/next/video.py +1 -1
  87. reflex/components/next/video.pyi +16 -26
  88. reflex/components/plotly/plotly.py +17 -30
  89. reflex/components/plotly/plotly.pyi +38 -52
  90. reflex/components/props.py +21 -10
  91. reflex/components/radix/__init__.pyi +2 -1
  92. reflex/components/radix/primitives/accordion.py +6 -7
  93. reflex/components/radix/primitives/accordion.pyi +415 -485
  94. reflex/components/radix/primitives/base.py +1 -1
  95. reflex/components/radix/primitives/base.pyi +31 -51
  96. reflex/components/radix/primitives/drawer.py +1 -1
  97. reflex/components/radix/primitives/drawer.pyi +162 -262
  98. reflex/components/radix/primitives/form.py +1 -1
  99. reflex/components/radix/primitives/form.pyi +247 -353
  100. reflex/components/radix/primitives/progress.py +1 -1
  101. reflex/components/radix/primitives/progress.pyi +226 -276
  102. reflex/components/radix/primitives/slider.py +1 -1
  103. reflex/components/radix/primitives/slider.pyi +82 -132
  104. reflex/components/radix/themes/base.py +8 -25
  105. reflex/components/radix/themes/base.pyi +171 -242
  106. reflex/components/radix/themes/color_mode.py +11 -20
  107. reflex/components/radix/themes/color_mode.pyi +198 -231
  108. reflex/components/radix/themes/components/__init__.pyi +1 -0
  109. reflex/components/radix/themes/components/alert_dialog.py +1 -1
  110. reflex/components/radix/themes/components/alert_dialog.pyi +129 -199
  111. reflex/components/radix/themes/components/aspect_ratio.py +1 -1
  112. reflex/components/radix/themes/components/aspect_ratio.pyi +16 -26
  113. reflex/components/radix/themes/components/avatar.py +1 -1
  114. reflex/components/radix/themes/components/avatar.pyi +69 -79
  115. reflex/components/radix/themes/components/badge.py +1 -1
  116. reflex/components/radix/themes/components/badge.pyi +87 -97
  117. reflex/components/radix/themes/components/button.py +1 -1
  118. reflex/components/radix/themes/components/button.pyi +97 -107
  119. reflex/components/radix/themes/components/callout.py +1 -1
  120. reflex/components/radix/themes/components/callout.pyi +317 -367
  121. reflex/components/radix/themes/components/card.py +1 -1
  122. reflex/components/radix/themes/components/card.pyi +37 -47
  123. reflex/components/radix/themes/components/checkbox.py +2 -4
  124. reflex/components/radix/themes/components/checkbox.pyi +205 -241
  125. reflex/components/radix/themes/components/checkbox_cards.py +1 -1
  126. reflex/components/radix/themes/components/checkbox_cards.pyi +92 -112
  127. reflex/components/radix/themes/components/checkbox_group.py +1 -1
  128. reflex/components/radix/themes/components/checkbox_group.pyi +84 -104
  129. reflex/components/radix/themes/components/context_menu.py +1 -1
  130. reflex/components/radix/themes/components/context_menu.pyi +230 -310
  131. reflex/components/radix/themes/components/data_list.py +6 -1
  132. reflex/components/radix/themes/components/data_list.pyi +131 -166
  133. reflex/components/radix/themes/components/dialog.py +1 -1
  134. reflex/components/radix/themes/components/dialog.pyi +132 -202
  135. reflex/components/radix/themes/components/dropdown_menu.py +1 -1
  136. reflex/components/radix/themes/components/dropdown_menu.pyi +241 -323
  137. reflex/components/radix/themes/components/hover_card.py +1 -1
  138. reflex/components/radix/themes/components/hover_card.pyi +86 -126
  139. reflex/components/radix/themes/components/icon_button.py +1 -1
  140. reflex/components/radix/themes/components/icon_button.pyi +97 -107
  141. reflex/components/radix/themes/components/inset.py +1 -1
  142. reflex/components/radix/themes/components/inset.pyi +46 -56
  143. reflex/components/radix/themes/components/popover.py +1 -1
  144. reflex/components/radix/themes/components/popover.pyi +91 -131
  145. reflex/components/radix/themes/components/progress.py +1 -1
  146. reflex/components/radix/themes/components/progress.pyi +70 -80
  147. reflex/components/radix/themes/components/radio.py +1 -1
  148. reflex/components/radix/themes/components/radio.pyi +68 -78
  149. reflex/components/radix/themes/components/radio_cards.py +1 -1
  150. reflex/components/radix/themes/components/radio_cards.pyi +96 -116
  151. reflex/components/radix/themes/components/radio_group.py +32 -31
  152. reflex/components/radix/themes/components/radio_group.pyi +230 -266
  153. reflex/components/radix/themes/components/scroll_area.py +1 -1
  154. reflex/components/radix/themes/components/scroll_area.pyi +20 -30
  155. reflex/components/radix/themes/components/segmented_control.py +1 -1
  156. reflex/components/radix/themes/components/segmented_control.pyi +88 -110
  157. reflex/components/radix/themes/components/select.py +1 -1
  158. reflex/components/radix/themes/components/select.pyi +365 -461
  159. reflex/components/radix/themes/components/separator.py +2 -4
  160. reflex/components/radix/themes/components/separator.pyi +68 -78
  161. reflex/components/radix/themes/components/skeleton.py +1 -1
  162. reflex/components/radix/themes/components/skeleton.pyi +22 -32
  163. reflex/components/radix/themes/components/slider.py +1 -1
  164. reflex/components/radix/themes/components/slider.pyi +74 -86
  165. reflex/components/radix/themes/components/spinner.py +1 -1
  166. reflex/components/radix/themes/components/spinner.pyi +18 -28
  167. reflex/components/radix/themes/components/switch.py +1 -1
  168. reflex/components/radix/themes/components/switch.pyi +70 -82
  169. reflex/components/radix/themes/components/table.py +1 -1
  170. reflex/components/radix/themes/components/table.pyi +254 -324
  171. reflex/components/radix/themes/components/tabs.py +1 -1
  172. reflex/components/radix/themes/components/tabs.pyi +134 -188
  173. reflex/components/radix/themes/components/text_area.py +1 -1
  174. reflex/components/radix/themes/components/text_area.pyi +95 -109
  175. reflex/components/radix/themes/components/text_field.py +1 -80
  176. reflex/components/radix/themes/components/text_field.pyi +245 -290
  177. reflex/components/radix/themes/components/tooltip.py +1 -1
  178. reflex/components/radix/themes/components/tooltip.pyi +25 -35
  179. reflex/components/radix/themes/layout/__init__.pyi +1 -0
  180. reflex/components/radix/themes/layout/base.py +1 -1
  181. reflex/components/radix/themes/layout/base.pyi +55 -65
  182. reflex/components/radix/themes/layout/box.pyi +33 -43
  183. reflex/components/radix/themes/layout/center.pyi +55 -65
  184. reflex/components/radix/themes/layout/container.py +2 -4
  185. reflex/components/radix/themes/layout/container.pyi +35 -45
  186. reflex/components/radix/themes/layout/flex.py +1 -1
  187. reflex/components/radix/themes/layout/flex.pyi +55 -65
  188. reflex/components/radix/themes/layout/grid.py +1 -1
  189. reflex/components/radix/themes/layout/grid.pyi +63 -73
  190. reflex/components/radix/themes/layout/list.py +1 -1
  191. reflex/components/radix/themes/layout/list.pyi +188 -238
  192. reflex/components/radix/themes/layout/section.py +2 -4
  193. reflex/components/radix/themes/layout/section.pyi +35 -45
  194. reflex/components/radix/themes/layout/spacer.pyi +55 -65
  195. reflex/components/radix/themes/layout/stack.py +1 -1
  196. reflex/components/radix/themes/layout/stack.pyi +125 -155
  197. reflex/components/radix/themes/typography/blockquote.py +1 -1
  198. reflex/components/radix/themes/typography/blockquote.pyi +88 -98
  199. reflex/components/radix/themes/typography/code.py +1 -1
  200. reflex/components/radix/themes/typography/code.pyi +89 -99
  201. reflex/components/radix/themes/typography/heading.py +1 -1
  202. reflex/components/radix/themes/typography/heading.pyi +95 -105
  203. reflex/components/radix/themes/typography/link.py +1 -1
  204. reflex/components/radix/themes/typography/link.pyi +101 -111
  205. reflex/components/radix/themes/typography/text.py +1 -1
  206. reflex/components/radix/themes/typography/text.pyi +494 -564
  207. reflex/components/react_player/audio.pyi +32 -58
  208. reflex/components/react_player/react_player.py +1 -1
  209. reflex/components/react_player/react_player.pyi +32 -58
  210. reflex/components/react_player/video.pyi +32 -58
  211. reflex/components/recharts/cartesian.py +22 -19
  212. reflex/components/recharts/cartesian.pyi +658 -840
  213. reflex/components/recharts/charts.py +3 -3
  214. reflex/components/recharts/charts.pyi +238 -342
  215. reflex/components/recharts/general.py +8 -8
  216. reflex/components/recharts/general.pyi +175 -225
  217. reflex/components/recharts/polar.py +11 -11
  218. reflex/components/recharts/polar.pyi +135 -171
  219. reflex/components/recharts/recharts.pyi +31 -51
  220. reflex/components/sonner/toast.py +27 -31
  221. reflex/components/sonner/toast.pyi +36 -45
  222. reflex/components/suneditor/editor.py +1 -1
  223. reflex/components/suneditor/editor.pyi +54 -76
  224. reflex/components/tags/cond_tag.py +6 -4
  225. reflex/components/tags/iter_tag.py +37 -25
  226. reflex/components/tags/match_tag.py +6 -4
  227. reflex/components/tags/tag.py +43 -28
  228. reflex/constants/base.py +3 -1
  229. reflex/constants/event.py +1 -0
  230. reflex/custom_components/custom_components.py +3 -1
  231. reflex/event.py +166 -108
  232. reflex/experimental/__init__.py +25 -6
  233. reflex/experimental/client_state.py +34 -57
  234. reflex/experimental/hooks.py +12 -17
  235. reflex/experimental/layout.py +4 -4
  236. reflex/experimental/layout.pyi +130 -180
  237. reflex/middleware/hydrate_middleware.py +2 -0
  238. reflex/middleware/middleware.py +3 -3
  239. reflex/model.py +22 -0
  240. reflex/reflex.py +4 -0
  241. reflex/state.py +491 -110
  242. reflex/style.py +56 -39
  243. reflex/testing.py +8 -3
  244. reflex/utils/exceptions.py +32 -0
  245. reflex/utils/exec.py +0 -14
  246. reflex/utils/format.py +80 -209
  247. reflex/utils/imports.py +16 -73
  248. reflex/utils/net.py +43 -0
  249. reflex/utils/path_ops.py +13 -1
  250. reflex/utils/prerequisites.py +81 -41
  251. reflex/utils/pyi_generator.py +12 -6
  252. reflex/utils/serializers.py +13 -41
  253. reflex/utils/telemetry.py +3 -2
  254. reflex/utils/types.py +47 -7
  255. reflex/{experimental/vars → vars}/__init__.py +6 -3
  256. reflex/vars/base.py +2563 -0
  257. reflex/vars/function.py +196 -0
  258. reflex/vars/number.py +1158 -0
  259. reflex/vars/object.py +562 -0
  260. reflex/vars/sequence.py +1604 -0
  261. {reflex-0.5.10a2.dist-info → reflex-0.6.0.dist-info}/METADATA +6 -9
  262. reflex-0.6.0.dist-info/RECORD +382 -0
  263. reflex/.templates/apps/demo/.gitignore +0 -4
  264. reflex/.templates/apps/demo/assets/favicon.ico +0 -0
  265. reflex/.templates/apps/demo/assets/github.svg +0 -10
  266. reflex/.templates/apps/demo/assets/icon.svg +0 -37
  267. reflex/.templates/apps/demo/assets/logo.svg +0 -68
  268. reflex/.templates/apps/demo/assets/paneleft.svg +0 -13
  269. reflex/.templates/apps/demo/code/__init__.py +0 -1
  270. reflex/.templates/apps/demo/code/demo.py +0 -127
  271. reflex/.templates/apps/demo/code/pages/__init__.py +0 -7
  272. reflex/.templates/apps/demo/code/pages/chatapp.py +0 -31
  273. reflex/.templates/apps/demo/code/pages/datatable.py +0 -360
  274. reflex/.templates/apps/demo/code/pages/forms.py +0 -257
  275. reflex/.templates/apps/demo/code/pages/graphing.py +0 -253
  276. reflex/.templates/apps/demo/code/pages/home.py +0 -56
  277. reflex/.templates/apps/demo/code/sidebar.py +0 -178
  278. reflex/.templates/apps/demo/code/state.py +0 -22
  279. reflex/.templates/apps/demo/code/states/form_state.py +0 -40
  280. reflex/.templates/apps/demo/code/states/pie_state.py +0 -47
  281. reflex/.templates/apps/demo/code/styles.py +0 -68
  282. reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
  283. reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -4
  284. reflex/.templates/apps/demo/code/webui/components/chat.py +0 -118
  285. reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -19
  286. reflex/.templates/apps/demo/code/webui/components/modal.py +0 -56
  287. reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -70
  288. reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -66
  289. reflex/.templates/apps/demo/code/webui/state.py +0 -146
  290. reflex/.templates/apps/demo/code/webui/styles.py +0 -88
  291. reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +0 -36
  292. reflex/experimental/vars/base.py +0 -583
  293. reflex/experimental/vars/function.py +0 -290
  294. reflex/experimental/vars/number.py +0 -1458
  295. reflex/experimental/vars/object.py +0 -804
  296. reflex/experimental/vars/sequence.py +0 -1764
  297. reflex/utils/watch.py +0 -96
  298. reflex/vars.py +0 -2604
  299. reflex/vars.pyi +0 -218
  300. reflex-0.5.10a2.dist-info/RECORD +0 -413
  301. {reflex-0.5.10a2.dist-info → reflex-0.6.0.dist-info}/LICENSE +0 -0
  302. {reflex-0.5.10a2.dist-info → reflex-0.6.0.dist-info}/WHEEL +0 -0
  303. {reflex-0.5.10a2.dist-info → reflex-0.6.0.dist-info}/entry_points.txt +0 -0
@@ -8,11 +8,11 @@ version = "0.0.1"
8
8
  description = "Reflex custom component {{ module_name }}"
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
11
- requires-python = ">=3.8"
11
+ requires-python = ">=3.9"
12
12
  authors = [{ name = "", email = "YOUREMAIL@domain.com" }]
13
13
  keywords = ["reflex","reflex-custom-components"]
14
14
 
15
- dependencies = ["reflex>=0.4.2"]
15
+ dependencies = ["reflex>={{ reflex_version }}"]
16
16
 
17
17
  classifiers = ["Development Status :: 4 - Beta"]
18
18
 
@@ -27,7 +27,7 @@ function AppWrap({children}) {
27
27
 
28
28
  export default function MyApp({ Component, pageProps }) {
29
29
  return (
30
- <ThemeProvider defaultTheme={ defaultColorMode } storageKey="chakra-ui-color-mode" attribute="class">
30
+ <ThemeProvider defaultTheme={ defaultColorMode } attribute="class">
31
31
  <AppWrap>
32
32
  <StateProvider>
33
33
  <EventLoopProvider>
@@ -64,11 +64,11 @@
64
64
  {# Args: #}
65
65
  {# component: component dictionary #}
66
66
  {% macro render_iterable_tag(component) %}
67
- { {%- if component.iterable_type == 'dict' -%}Object.entries({{- component.iterable_state }}){%- else -%}{{- component.iterable_state }}{%- endif -%}.map(({{ component.arg_name }}, {{ component.arg_index }}) => (
67
+ <>{ {%- if component.iterable_type == 'dict' -%}Object.entries({{- component.iterable_state }}){%- else -%}{{- component.iterable_state }}{%- endif -%}.map(({{ component.arg_name }}, {{ component.arg_index }}) => (
68
68
  {% for child in component.children %}
69
69
  {{ render(child) }}
70
70
  {% endfor %}
71
- ))}
71
+ ))}</>
72
72
  {%- endmacro %}
73
73
 
74
74
 
@@ -85,10 +85,10 @@
85
85
  {% macro render_match_tag(component) %}
86
86
  {
87
87
  (() => {
88
- switch (JSON.stringify({{ component.cond._var_name_unwrapped }})) {
88
+ switch (JSON.stringify({{ component.cond._js_expr }})) {
89
89
  {% for case in component.match_cases %}
90
90
  {% for condition in case[:-1] %}
91
- case JSON.stringify({{ condition._var_name_unwrapped }}):
91
+ case JSON.stringify({{ condition._js_expr }}):
92
92
  {% endfor %}
93
93
  return {{ case[-1] }};
94
94
  break;
@@ -7,7 +7,7 @@ export const initialState = {{ initial_state|json_dumps }}
7
7
  export const initialState = {}
8
8
  {% endif %}
9
9
 
10
- export const defaultColorMode = "{{ default_color_mode }}"
10
+ export const defaultColorMode = {{ default_color_mode }}
11
11
  export const ColorModeContext = createContext(null);
12
12
  export const UploadFilesContext = createContext(null);
13
13
  export const DispatchContext = createContext(null);
@@ -1 +1 @@
1
- export default {{ theme|json_dumps }}
1
+ export default {{ theme }}
@@ -805,7 +805,9 @@ export const useEventLoop = (
805
805
  * @returns True if the value is truthy, false otherwise.
806
806
  */
807
807
  export const isTrue = (val) => {
808
- return Array.isArray(val) ? val.length > 0 : !!val;
808
+ if (Array.isArray(val)) return val.length > 0;
809
+ if (val === Object(val)) return Object.keys(val).length > 0;
810
+ return Boolean(val);
809
811
  };
810
812
 
811
813
  /**
reflex/__init__.py CHANGED
@@ -140,6 +140,7 @@ RADIX_THEMES_COMPONENTS_MAPPING: dict = {
140
140
  "components.radix.themes.components.radio_group": ["radio", "radio_group"],
141
141
  "components.radix.themes.components.dropdown_menu": ["menu", "dropdown_menu"],
142
142
  "components.radix.themes.components.separator": ["divider", "separator"],
143
+ "components.radix.themes.components.progress": ["progress"],
143
144
  }
144
145
 
145
146
  RADIX_THEMES_LAYOUT_MAPPING: dict = {
@@ -205,7 +206,13 @@ RADIX_PRIMITIVES_MAPPING: dict = {
205
206
  "components.radix.primitives.form": [
206
207
  "form",
207
208
  ],
208
- "components.radix.primitives.progress": ["progress"],
209
+ "components.radix.primitives.progress": [
210
+ "progress",
211
+ ],
212
+ }
213
+
214
+ RADIX_PRIMITIVES_SHORTCUT_MAPPING: dict = {
215
+ k: v for k, v in RADIX_PRIMITIVES_MAPPING.items() if "progress" not in k
209
216
  }
210
217
 
211
218
  COMPONENTS_CORE_MAPPING: dict = {
@@ -248,7 +255,7 @@ RADIX_MAPPING: dict = {
248
255
  **RADIX_THEMES_COMPONENTS_MAPPING,
249
256
  **RADIX_THEMES_TYPOGRAPHY_MAPPING,
250
257
  **RADIX_THEMES_LAYOUT_MAPPING,
251
- **RADIX_PRIMITIVES_MAPPING,
258
+ **RADIX_PRIMITIVES_SHORTCUT_MAPPING,
252
259
  }
253
260
 
254
261
  _MAPPING: dict = {
@@ -324,7 +331,7 @@ _MAPPING: dict = {
324
331
  "style": ["Style", "toggle_color_mode"],
325
332
  "utils.imports": ["ImportVar"],
326
333
  "utils.serializers": ["serializer"],
327
- "vars": ["cached_var", "Var"],
334
+ "vars": ["Var"],
328
335
  }
329
336
 
330
337
  _SUBMODULES: set[str] = {
reflex/__init__.pyi CHANGED
@@ -70,7 +70,6 @@ from .components.plotly import plotly as plotly
70
70
  from .components.radix.primitives.accordion import accordion as accordion
71
71
  from .components.radix.primitives.drawer import drawer as drawer
72
72
  from .components.radix.primitives.form import form as form
73
- from .components.radix.primitives.progress import progress as progress
74
73
  from .components.radix.themes.base import theme as theme
75
74
  from .components.radix.themes.base import theme_panel as theme_panel
76
75
  from .components.radix.themes.color_mode import color_mode as color_mode
@@ -105,6 +104,7 @@ from .components.radix.themes.components.hover_card import hover_card as hover_c
105
104
  from .components.radix.themes.components.icon_button import icon_button as icon_button
106
105
  from .components.radix.themes.components.inset import inset as inset
107
106
  from .components.radix.themes.components.popover import popover as popover
107
+ from .components.radix.themes.components.progress import progress as progress
108
108
  from .components.radix.themes.components.radio_cards import radio_cards as radio_cards
109
109
  from .components.radix.themes.components.radio_group import radio as radio
110
110
  from .components.radix.themes.components.radio_group import radio_group as radio_group
@@ -131,6 +131,7 @@ from .components.radix.themes.layout.container import container as container
131
131
  from .components.radix.themes.layout.flex import flex as flex
132
132
  from .components.radix.themes.layout.grid import grid as grid
133
133
  from .components.radix.themes.layout.list import list_item as list_item
134
+ from .components.radix.themes.layout.list import list_ns as list # noqa
134
135
  from .components.radix.themes.layout.list import ordered_list as ordered_list
135
136
  from .components.radix.themes.layout.list import unordered_list as unordered_list
136
137
  from .components.radix.themes.layout.section import section as section
@@ -189,7 +190,6 @@ from .style import toggle_color_mode as toggle_color_mode
189
190
  from .utils.imports import ImportVar as ImportVar
190
191
  from .utils.serializers import serializer as serializer
191
192
  from .vars import Var as Var
192
- from .vars import cached_var as cached_var
193
193
 
194
194
  del compat
195
195
  RADIX_THEMES_MAPPING: dict
@@ -197,6 +197,7 @@ RADIX_THEMES_COMPONENTS_MAPPING: dict
197
197
  RADIX_THEMES_LAYOUT_MAPPING: dict
198
198
  RADIX_THEMES_TYPOGRAPHY_MAPPING: dict
199
199
  RADIX_PRIMITIVES_MAPPING: dict
200
+ RADIX_PRIMITIVES_SHORTCUT_MAPPING: dict
200
201
  COMPONENTS_CORE_MAPPING: dict
201
202
  COMPONENTS_BASE_MAPPING: dict
202
203
  RADIX_MAPPING: dict
reflex/app.py CHANGED
@@ -9,6 +9,7 @@ import copy
9
9
  import functools
10
10
  import inspect
11
11
  import io
12
+ import json
12
13
  import multiprocessing
13
14
  import os
14
15
  import platform
@@ -33,7 +34,7 @@ from typing import (
33
34
 
34
35
  from fastapi import FastAPI, HTTPException, Request, UploadFile
35
36
  from fastapi.middleware import cors
36
- from fastapi.responses import StreamingResponse
37
+ from fastapi.responses import JSONResponse, StreamingResponse
37
38
  from fastapi.staticfiles import StaticFiles
38
39
  from rich.progress import MofNCompleteColumn, Progress, TimeElapsedColumn
39
40
  from socketio import ASGIApp, AsyncNamespace, AsyncServer
@@ -65,7 +66,7 @@ from reflex.components.core.upload import Upload, get_upload_dir
65
66
  from reflex.components.radix import themes
66
67
  from reflex.config import get_config
67
68
  from reflex.event import Event, EventHandler, EventSpec, window_alert
68
- from reflex.model import Model
69
+ from reflex.model import Model, get_db_status
69
70
  from reflex.page import (
70
71
  DECORATED_PAGES,
71
72
  )
@@ -269,13 +270,12 @@ class App(MiddlewareMixin, LifespanMixin, Base):
269
270
  "`connect_error_component` is deprecated, use `overlay_component` instead"
270
271
  )
271
272
  super().__init__(**kwargs)
272
- base_state_subclasses = BaseState.__subclasses__()
273
273
 
274
274
  # Special case to allow test cases have multiple subclasses of rx.BaseState.
275
- if not is_testing_env() and len(base_state_subclasses) > 1:
276
- # Only one Base State class is allowed.
275
+ if not is_testing_env() and BaseState.__subclasses__() != [State]:
276
+ # Only rx.State is allowed as Base State subclass.
277
277
  raise ValueError(
278
- "rx.BaseState cannot be subclassed multiple times. use rx.State instead"
278
+ "rx.BaseState cannot be subclassed directly. Use rx.State instead"
279
279
  )
280
280
 
281
281
  if "breakpoints" in self.style:
@@ -377,6 +377,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
377
377
  """Add default api endpoints (ping)."""
378
378
  # To test the server.
379
379
  self.api.get(str(constants.Endpoint.PING))(ping)
380
+ self.api.get(str(constants.Endpoint.HEALTH))(health)
380
381
 
381
382
  def _add_optional_endpoints(self):
382
383
  """Add optional api endpoints (_upload)."""
@@ -442,7 +443,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
442
443
  raise
443
444
  except TypeError as e:
444
445
  message = str(e)
445
- if "BaseVar" in message or "ComputedVar" in message:
446
+ if "Var" in message:
446
447
  raise VarOperationTypeError(
447
448
  "You may be trying to use an invalid Python function on a state var. "
448
449
  "When referencing a var inside your render code, only limited var operations are supported. "
@@ -527,9 +528,10 @@ class App(MiddlewareMixin, LifespanMixin, Base):
527
528
  self._enable_state()
528
529
  else:
529
530
  for var in component._get_vars(include_children=True):
530
- if not var._var_data:
531
+ var_data = var._get_all_var_data()
532
+ if not var_data:
531
533
  continue
532
- if not var._var_data.state:
534
+ if not var_data.state:
533
535
  continue
534
536
  self._enable_state()
535
537
  break
@@ -822,7 +824,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
822
824
  for dep in deps:
823
825
  if dep not in state.vars and dep not in state.backend_vars:
824
826
  raise exceptions.VarDependencyError(
825
- f"ComputedVar {var._var_name} on state {state.__name__} has an invalid dependency {dep}"
827
+ f"ComputedVar {var._js_expr} on state {state.__name__} has an invalid dependency {dep}"
826
828
  )
827
829
 
828
830
  for substate in state.class_subclasses:
@@ -1113,6 +1115,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
1113
1115
  Task if the event was backgroundable, otherwise None
1114
1116
  """
1115
1117
  substate, handler = state._get_event_handler(event)
1118
+
1116
1119
  if not handler.is_background:
1117
1120
  return None
1118
1121
 
@@ -1317,6 +1320,38 @@ async def ping() -> str:
1317
1320
  return "pong"
1318
1321
 
1319
1322
 
1323
+ async def health() -> JSONResponse:
1324
+ """Health check endpoint to assess the status of the database and Redis services.
1325
+
1326
+ Returns:
1327
+ JSONResponse: A JSON object with the health status:
1328
+ - "status" (bool): Overall health, True if all checks pass.
1329
+ - "db" (bool or str): Database status - True, False, or "NA".
1330
+ - "redis" (bool or str): Redis status - True, False, or "NA".
1331
+ """
1332
+ health_status = {"status": True}
1333
+ status_code = 200
1334
+
1335
+ db_status, redis_status = await asyncio.gather(
1336
+ get_db_status(), prerequisites.get_redis_status()
1337
+ )
1338
+
1339
+ health_status["db"] = db_status
1340
+
1341
+ if redis_status is None:
1342
+ health_status["redis"] = False
1343
+ else:
1344
+ health_status["redis"] = redis_status
1345
+
1346
+ if not health_status["db"] or (
1347
+ not health_status["redis"] and redis_status is not None
1348
+ ):
1349
+ health_status["status"] = False
1350
+ status_code = 503
1351
+
1352
+ return JSONResponse(content=health_status, status_code=status_code)
1353
+
1354
+
1320
1355
  def upload(app: App):
1321
1356
  """Upload a file.
1322
1357
 
@@ -1497,8 +1532,9 @@ class EventNamespace(AsyncNamespace):
1497
1532
  sid: The Socket.IO session id.
1498
1533
  data: The event data.
1499
1534
  """
1535
+ fields = json.loads(data)
1500
1536
  # Get the event.
1501
- event = Event.parse_raw(data)
1537
+ event = Event(**{k: v for k, v in fields.items() if k != "handler"})
1502
1538
 
1503
1539
  self.token_to_sid[event.token] = sid
1504
1540
  self.sid_to_token[sid] = event.token
@@ -15,7 +15,7 @@ if constants.CompileVars.APP != "app":
15
15
  telemetry.send("compile")
16
16
  app_module = get_app(reload=False)
17
17
  app = getattr(app_module, constants.CompileVars.APP)
18
- # For py3.8 and py3.9 compatibility when redis is used, we MUST add any decorator pages
18
+ # For py3.9 compatibility when redis is used, we MUST add any decorator pages
19
19
  # before compiling the app in a thread to avoid event loop error (REF-2172).
20
20
  app._apply_decorated_pages()
21
21
  compile_future = ThreadPoolExecutor(max_workers=1).submit(app._compile)
reflex/base.py CHANGED
@@ -110,14 +110,15 @@ class Base(BaseModel): # pyright: ignore [reportUnboundVariable]
110
110
  var: The variable to add a pydantic field for.
111
111
  default_value: The default value of the field
112
112
  """
113
+ var_name = var._js_expr.split(".")[-1]
113
114
  new_field = ModelField.infer(
114
- name=var._var_name,
115
+ name=var_name,
115
116
  value=default_value,
116
117
  annotation=var._var_type,
117
118
  class_validators=None,
118
119
  config=cls.__config__, # type: ignore
119
120
  )
120
- cls.__fields__.update({var._var_name: new_field})
121
+ cls.__fields__.update({var_name: new_field})
121
122
 
122
123
  def get_value(self, key: str) -> Any:
123
124
  """Get the value of a field.
@@ -22,7 +22,7 @@ from reflex.style import SYSTEM_COLOR_MODE
22
22
  from reflex.utils.exec import is_prod_mode
23
23
  from reflex.utils.imports import ImportVar
24
24
  from reflex.utils.prerequisites import get_web_dir
25
- from reflex.vars import Var
25
+ from reflex.vars.base import LiteralVar, Var
26
26
 
27
27
 
28
28
  def _compile_document_root(root: Component) -> str:
@@ -57,7 +57,7 @@ def _compile_app(app_root: Component) -> str:
57
57
  )
58
58
 
59
59
 
60
- def _compile_theme(theme: dict) -> str:
60
+ def _compile_theme(theme: str) -> str:
61
61
  """Compile the theme.
62
62
 
63
63
  Args:
@@ -80,8 +80,8 @@ def _compile_contexts(state: Optional[Type[BaseState]], theme: Component | None)
80
80
  The compiled context file.
81
81
  """
82
82
  appearance = getattr(theme, "appearance", None)
83
- if appearance is None or Var.create_safe(appearance)._var_name == "inherit":
84
- appearance = SYSTEM_COLOR_MODE
83
+ if appearance is None or str(LiteralVar.create(appearance)) == '"inherit"':
84
+ appearance = LiteralVar.create(SYSTEM_COLOR_MODE)
85
85
 
86
86
  last_compiled_time = str(datetime.now())
87
87
  return (
@@ -377,7 +377,7 @@ def compile_theme(style: ComponentStyle) -> tuple[str, str]:
377
377
  theme = utils.create_theme(style)
378
378
 
379
379
  # Compile the theme.
380
- code = _compile_theme(theme)
380
+ code = _compile_theme(str(LiteralVar.create(theme)))
381
381
  return output_path, code
382
382
 
383
383
 
reflex/compiler/utils.py CHANGED
@@ -8,6 +8,7 @@ from typing import Any, Callable, Dict, Optional, Type, Union
8
8
  from urllib.parse import urlparse
9
9
 
10
10
  from reflex.utils.prerequisites import get_web_dir
11
+ from reflex.vars.base import Var
11
12
 
12
13
  try:
13
14
  from pydantic.v1.fields import ModelField
@@ -32,7 +33,6 @@ from reflex.state import BaseState, Cookie, LocalStorage, SessionStorage
32
33
  from reflex.style import Style
33
34
  from reflex.utils import console, format, imports, path_ops
34
35
  from reflex.utils.imports import ImportVar, ParsedImportDict
35
- from reflex.vars import Var
36
36
 
37
37
  # To re-export this function.
38
38
  merge_imports = imports.merge_imports
@@ -152,7 +152,9 @@ def compile_state(state: Type[BaseState]) -> dict:
152
152
  console.warn(
153
153
  f"Failed to compile initial state with computed vars, excluding them: {e}"
154
154
  )
155
- initial_state = state(_reflex_internal_init=True).dict(include_computed=False)
155
+ initial_state = state(_reflex_internal_init=True).dict(
156
+ initial=True, include_computed=False
157
+ )
156
158
  return format.format_state(initial_state)
157
159
 
158
160
 
@@ -266,7 +268,7 @@ def compile_custom_component(
266
268
  }
267
269
 
268
270
  # Concatenate the props.
269
- props = [prop._var_name for prop in component.get_prop_vars()]
271
+ props = [prop._js_expr for prop in component.get_prop_vars()]
270
272
 
271
273
  # Compile the component.
272
274
  return (
@@ -2,7 +2,7 @@
2
2
 
3
3
  from reflex.components.base.fragment import Fragment
4
4
  from reflex.components.component import Component
5
- from reflex.vars import Var
5
+ from reflex.vars.base import Var
6
6
 
7
7
 
8
8
  class AppWrap(Fragment):
@@ -15,6 +15,4 @@ class AppWrap(Fragment):
15
15
  Returns:
16
16
  A new AppWrap component containing {children}.
17
17
  """
18
- return super().create(
19
- Var.create("{children}", _var_is_local=False, _var_is_string=False)
20
- )
18
+ return super().create(Var(_js_expr="children"))
@@ -8,7 +8,7 @@ from typing import Any, Callable, Dict, Optional, Union, overload
8
8
  from reflex.components.base.fragment import Fragment
9
9
  from reflex.event import EventHandler, EventSpec
10
10
  from reflex.style import Style
11
- from reflex.vars import BaseVar, Var
11
+ from reflex.vars.base import Var
12
12
 
13
13
  class AppWrap(Fragment):
14
14
  @overload
@@ -22,50 +22,40 @@ class AppWrap(Fragment):
22
22
  class_name: Optional[Any] = None,
23
23
  autofocus: Optional[bool] = None,
24
24
  custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
25
- on_blur: Optional[
26
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
27
- ] = None,
28
- on_click: Optional[
29
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
30
- ] = None,
25
+ on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
26
+ on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
31
27
  on_context_menu: Optional[
32
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
28
+ Union[EventHandler, EventSpec, list, Callable, Var]
33
29
  ] = None,
34
30
  on_double_click: Optional[
35
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
36
- ] = None,
37
- on_focus: Optional[
38
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
39
- ] = None,
40
- on_mount: Optional[
41
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
31
+ Union[EventHandler, EventSpec, list, Callable, Var]
42
32
  ] = None,
33
+ on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
34
+ on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
43
35
  on_mouse_down: Optional[
44
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
36
+ Union[EventHandler, EventSpec, list, Callable, Var]
45
37
  ] = None,
46
38
  on_mouse_enter: Optional[
47
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
39
+ Union[EventHandler, EventSpec, list, Callable, Var]
48
40
  ] = None,
49
41
  on_mouse_leave: Optional[
50
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
42
+ Union[EventHandler, EventSpec, list, Callable, Var]
51
43
  ] = None,
52
44
  on_mouse_move: Optional[
53
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
45
+ Union[EventHandler, EventSpec, list, Callable, Var]
54
46
  ] = None,
55
47
  on_mouse_out: Optional[
56
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
48
+ Union[EventHandler, EventSpec, list, Callable, Var]
57
49
  ] = None,
58
50
  on_mouse_over: Optional[
59
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
51
+ Union[EventHandler, EventSpec, list, Callable, Var]
60
52
  ] = None,
61
53
  on_mouse_up: Optional[
62
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
63
- ] = None,
64
- on_scroll: Optional[
65
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
54
+ Union[EventHandler, EventSpec, list, Callable, Var]
66
55
  ] = None,
56
+ on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
67
57
  on_unmount: Optional[
68
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
58
+ Union[EventHandler, EventSpec, list, Callable, Var]
69
59
  ] = None,
70
60
  **props,
71
61
  ) -> "AppWrap":
@@ -7,13 +7,13 @@ from typing import Any, Iterator
7
7
  from reflex.components.component import Component
8
8
  from reflex.components.tags import Tag
9
9
  from reflex.components.tags.tagless import Tagless
10
- from reflex.vars import Var
10
+ from reflex.vars.base import Var
11
11
 
12
12
 
13
13
  class Bare(Component):
14
14
  """A component with no tag."""
15
15
 
16
- contents: Var[str]
16
+ contents: Var[Any]
17
17
 
18
18
  @classmethod
19
19
  def create(cls, contents: Any) -> Component:
@@ -25,13 +25,15 @@ class Bare(Component):
25
25
  Returns:
26
26
  The component.
27
27
  """
28
- if isinstance(contents, Var) and contents._var_data:
29
- contents = contents.to(str)
28
+ if isinstance(contents, Var):
29
+ return cls(contents=contents)
30
30
  else:
31
31
  contents = str(contents) if contents is not None else ""
32
32
  return cls(contents=contents) # type: ignore
33
33
 
34
34
  def _render(self) -> Tag:
35
+ if isinstance(self.contents, Var):
36
+ return Tagless(contents=f"{{{str(self.contents)}}}")
35
37
  return Tagless(contents=str(self.contents))
36
38
 
37
39
  def _get_vars(self, include_children: bool = False) -> Iterator[Var]:
@@ -8,7 +8,7 @@ from typing import Any, Callable, Dict, Optional, Union, overload
8
8
  from reflex.components.component import Component
9
9
  from reflex.event import EventHandler, EventSpec
10
10
  from reflex.style import Style
11
- from reflex.vars import BaseVar, Var
11
+ from reflex.vars.base import Var
12
12
 
13
13
  class Body(Component):
14
14
  @overload
@@ -22,50 +22,40 @@ class Body(Component):
22
22
  class_name: Optional[Any] = None,
23
23
  autofocus: Optional[bool] = None,
24
24
  custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
25
- on_blur: Optional[
26
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
27
- ] = None,
28
- on_click: Optional[
29
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
30
- ] = None,
25
+ on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
26
+ on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
31
27
  on_context_menu: Optional[
32
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
28
+ Union[EventHandler, EventSpec, list, Callable, Var]
33
29
  ] = None,
34
30
  on_double_click: Optional[
35
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
36
- ] = None,
37
- on_focus: Optional[
38
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
39
- ] = None,
40
- on_mount: Optional[
41
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
31
+ Union[EventHandler, EventSpec, list, Callable, Var]
42
32
  ] = None,
33
+ on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
34
+ on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
43
35
  on_mouse_down: Optional[
44
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
36
+ Union[EventHandler, EventSpec, list, Callable, Var]
45
37
  ] = None,
46
38
  on_mouse_enter: Optional[
47
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
39
+ Union[EventHandler, EventSpec, list, Callable, Var]
48
40
  ] = None,
49
41
  on_mouse_leave: Optional[
50
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
42
+ Union[EventHandler, EventSpec, list, Callable, Var]
51
43
  ] = None,
52
44
  on_mouse_move: Optional[
53
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
45
+ Union[EventHandler, EventSpec, list, Callable, Var]
54
46
  ] = None,
55
47
  on_mouse_out: Optional[
56
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
48
+ Union[EventHandler, EventSpec, list, Callable, Var]
57
49
  ] = None,
58
50
  on_mouse_over: Optional[
59
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
51
+ Union[EventHandler, EventSpec, list, Callable, Var]
60
52
  ] = None,
61
53
  on_mouse_up: Optional[
62
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
63
- ] = None,
64
- on_scroll: Optional[
65
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
54
+ Union[EventHandler, EventSpec, list, Callable, Var]
66
55
  ] = None,
56
+ on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
67
57
  on_unmount: Optional[
68
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
58
+ Union[EventHandler, EventSpec, list, Callable, Var]
69
59
  ] = None,
70
60
  **props,
71
61
  ) -> "Body":