reflex 0.7.14a5__py3-none-any.whl → 0.8.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 (236) hide show
  1. reflex/.templates/jinja/app/rxconfig.py.jinja2 +4 -1
  2. reflex/.templates/jinja/web/package.json.jinja2 +1 -1
  3. reflex/.templates/jinja/web/pages/_app.js.jinja2 +21 -11
  4. reflex/.templates/jinja/web/pages/_document.js.jinja2 +1 -1
  5. reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -1
  6. reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +4 -0
  7. reflex/.templates/jinja/web/styles/styles.css.jinja2 +1 -0
  8. reflex/.templates/jinja/web/utils/context.js.jinja2 +25 -8
  9. reflex/.templates/web/app/entry.client.js +8 -0
  10. reflex/.templates/web/app/routes.js +10 -0
  11. reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +12 -37
  12. reflex/.templates/web/postcss.config.js +1 -1
  13. reflex/.templates/web/react-router.config.js +6 -0
  14. reflex/.templates/web/styles/__reflex_style_reset.css +399 -0
  15. reflex/.templates/web/utils/client_side_routing.js +21 -19
  16. reflex/.templates/web/utils/react-theme.js +92 -0
  17. reflex/.templates/web/utils/state.js +251 -100
  18. reflex/.templates/web/vite-plugin-safari-cachebust.js +160 -0
  19. reflex/.templates/web/vite.config.js +39 -0
  20. reflex/__init__.py +1 -6
  21. reflex/__init__.pyi +327 -192
  22. reflex/app.py +103 -152
  23. reflex/base.py +1 -87
  24. reflex/compiler/compiler.py +70 -19
  25. reflex/compiler/templates.py +3 -3
  26. reflex/compiler/utils.py +91 -33
  27. reflex/components/__init__.py +0 -2
  28. reflex/components/__init__.pyi +34 -18
  29. reflex/components/base/__init__.py +1 -5
  30. reflex/components/base/__init__.pyi +30 -21
  31. reflex/components/base/app_wrap.pyi +7 -7
  32. reflex/components/base/body.pyi +7 -7
  33. reflex/components/base/document.py +18 -14
  34. reflex/components/base/document.pyi +88 -38
  35. reflex/components/base/error_boundary.pyi +7 -7
  36. reflex/components/base/fragment.pyi +7 -7
  37. reflex/components/base/link.pyi +12 -12
  38. reflex/components/base/meta.py +4 -15
  39. reflex/components/base/meta.pyi +31 -31
  40. reflex/components/base/script.py +60 -58
  41. reflex/components/base/script.pyi +248 -34
  42. reflex/components/base/strict_mode.pyi +7 -7
  43. reflex/components/component.py +146 -217
  44. reflex/components/core/__init__.py +1 -0
  45. reflex/components/core/__init__.pyi +77 -37
  46. reflex/components/core/auto_scroll.pyi +7 -7
  47. reflex/components/core/banner.pyi +33 -33
  48. reflex/components/core/client_side_routing.py +7 -6
  49. reflex/components/core/client_side_routing.pyi +8 -59
  50. reflex/components/core/clipboard.pyi +7 -7
  51. reflex/components/core/debounce.py +1 -0
  52. reflex/components/core/debounce.pyi +7 -7
  53. reflex/components/core/foreach.py +5 -4
  54. reflex/components/core/helmet.py +14 -0
  55. reflex/components/{next/base.pyi → core/helmet.pyi} +12 -10
  56. reflex/components/core/html.pyi +7 -7
  57. reflex/components/core/match.py +3 -3
  58. reflex/components/core/sticky.pyi +21 -20
  59. reflex/components/core/upload.py +4 -2
  60. reflex/components/core/upload.pyi +26 -25
  61. reflex/components/datadisplay/__init__.pyi +13 -7
  62. reflex/components/datadisplay/code.py +14 -79
  63. reflex/components/datadisplay/code.pyi +11 -13
  64. reflex/components/datadisplay/dataeditor.pyi +38 -15
  65. reflex/components/datadisplay/shiki_code_block.py +5 -3
  66. reflex/components/datadisplay/shiki_code_block.pyi +16 -15
  67. reflex/components/dynamic.py +5 -5
  68. reflex/components/el/__init__.pyi +506 -246
  69. reflex/components/el/element.pyi +7 -7
  70. reflex/components/el/elements/__init__.pyi +504 -245
  71. reflex/components/el/elements/base.pyi +7 -7
  72. reflex/components/el/elements/forms.pyi +146 -101
  73. reflex/components/el/elements/inline.pyi +142 -142
  74. reflex/components/el/elements/media.pyi +131 -130
  75. reflex/components/el/elements/metadata.pyi +32 -32
  76. reflex/components/el/elements/other.pyi +37 -37
  77. reflex/components/el/elements/scripts.pyi +17 -17
  78. reflex/components/el/elements/sectioning.pyi +77 -77
  79. reflex/components/el/elements/tables.pyi +52 -52
  80. reflex/components/el/elements/typography.pyi +77 -77
  81. reflex/components/field.py +175 -0
  82. reflex/components/gridjs/datatable.py +2 -2
  83. reflex/components/gridjs/datatable.pyi +14 -14
  84. reflex/components/lucide/icon.py +6 -2
  85. reflex/components/lucide/icon.pyi +19 -17
  86. reflex/components/markdown/markdown.py +5 -3
  87. reflex/components/markdown/markdown.pyi +7 -7
  88. reflex/components/moment/moment.py +1 -1
  89. reflex/components/moment/moment.pyi +7 -7
  90. reflex/components/plotly/plotly.py +12 -6
  91. reflex/components/plotly/plotly.pyi +50 -49
  92. reflex/components/props.py +376 -27
  93. reflex/components/radix/__init__.pyi +123 -65
  94. reflex/components/radix/primitives/__init__.pyi +6 -4
  95. reflex/components/radix/primitives/accordion.py +8 -1
  96. reflex/components/radix/primitives/accordion.pyi +37 -37
  97. reflex/components/radix/primitives/base.pyi +12 -12
  98. reflex/components/radix/primitives/drawer.pyi +56 -55
  99. reflex/components/radix/primitives/form.pyi +63 -53
  100. reflex/components/radix/primitives/progress.pyi +26 -25
  101. reflex/components/radix/primitives/slider.pyi +27 -27
  102. reflex/components/radix/themes/__init__.pyi +5 -6
  103. reflex/components/radix/themes/base.py +3 -3
  104. reflex/components/radix/themes/base.pyi +42 -42
  105. reflex/components/radix/themes/color_mode.py +5 -6
  106. reflex/components/radix/themes/color_mode.pyi +17 -17
  107. reflex/components/radix/themes/components/__init__.pyi +75 -38
  108. reflex/components/radix/themes/components/alert_dialog.pyi +37 -37
  109. reflex/components/radix/themes/components/aspect_ratio.pyi +7 -7
  110. reflex/components/radix/themes/components/avatar.pyi +7 -7
  111. reflex/components/radix/themes/components/badge.pyi +7 -7
  112. reflex/components/radix/themes/components/button.pyi +7 -7
  113. reflex/components/radix/themes/components/callout.pyi +26 -25
  114. reflex/components/radix/themes/components/card.pyi +7 -7
  115. reflex/components/radix/themes/components/checkbox.pyi +16 -15
  116. reflex/components/radix/themes/components/checkbox_cards.pyi +12 -12
  117. reflex/components/radix/themes/components/checkbox_group.pyi +12 -12
  118. reflex/components/radix/themes/components/context_menu.pyi +67 -67
  119. reflex/components/radix/themes/components/data_list.pyi +22 -22
  120. reflex/components/radix/themes/components/dialog.pyi +36 -35
  121. reflex/components/radix/themes/components/dropdown_menu.pyi +42 -42
  122. reflex/components/radix/themes/components/hover_card.pyi +21 -20
  123. reflex/components/radix/themes/components/icon_button.pyi +7 -7
  124. reflex/components/radix/themes/components/inset.pyi +7 -7
  125. reflex/components/radix/themes/components/popover.pyi +22 -22
  126. reflex/components/radix/themes/components/progress.pyi +7 -7
  127. reflex/components/radix/themes/components/radio.pyi +7 -7
  128. reflex/components/radix/themes/components/radio_cards.pyi +12 -12
  129. reflex/components/radix/themes/components/radio_group.pyi +21 -20
  130. reflex/components/radix/themes/components/scroll_area.pyi +7 -7
  131. reflex/components/radix/themes/components/segmented_control.pyi +12 -12
  132. reflex/components/radix/themes/components/select.pyi +46 -45
  133. reflex/components/radix/themes/components/separator.pyi +7 -7
  134. reflex/components/radix/themes/components/skeleton.pyi +7 -7
  135. reflex/components/radix/themes/components/slider.pyi +17 -9
  136. reflex/components/radix/themes/components/spinner.pyi +7 -7
  137. reflex/components/radix/themes/components/switch.pyi +7 -7
  138. reflex/components/radix/themes/components/table.pyi +37 -37
  139. reflex/components/radix/themes/components/tabs.pyi +26 -25
  140. reflex/components/radix/themes/components/text_area.pyi +15 -9
  141. reflex/components/radix/themes/components/text_field.pyi +32 -19
  142. reflex/components/radix/themes/components/tooltip.pyi +7 -7
  143. reflex/components/radix/themes/layout/__init__.pyi +27 -14
  144. reflex/components/radix/themes/layout/base.pyi +7 -7
  145. reflex/components/radix/themes/layout/box.pyi +7 -7
  146. reflex/components/radix/themes/layout/center.pyi +7 -7
  147. reflex/components/radix/themes/layout/container.pyi +7 -7
  148. reflex/components/radix/themes/layout/flex.pyi +7 -7
  149. reflex/components/radix/themes/layout/grid.pyi +7 -7
  150. reflex/components/radix/themes/layout/list.pyi +26 -25
  151. reflex/components/radix/themes/layout/section.pyi +7 -7
  152. reflex/components/radix/themes/layout/spacer.pyi +7 -7
  153. reflex/components/radix/themes/layout/stack.pyi +17 -17
  154. reflex/components/radix/themes/typography/__init__.pyi +7 -5
  155. reflex/components/radix/themes/typography/blockquote.pyi +7 -7
  156. reflex/components/radix/themes/typography/code.pyi +7 -7
  157. reflex/components/radix/themes/typography/heading.pyi +7 -7
  158. reflex/components/radix/themes/typography/link.py +46 -11
  159. reflex/components/radix/themes/typography/link.pyi +312 -9
  160. reflex/components/radix/themes/typography/text.pyi +36 -35
  161. reflex/components/react_player/audio.pyi +10 -8
  162. reflex/components/react_player/react_player.pyi +7 -7
  163. reflex/components/react_player/video.pyi +10 -8
  164. reflex/components/recharts/__init__.pyi +208 -100
  165. reflex/components/recharts/cartesian.py +10 -8
  166. reflex/components/recharts/cartesian.pyi +90 -94
  167. reflex/components/recharts/charts.py +4 -2
  168. reflex/components/recharts/charts.pyi +49 -49
  169. reflex/components/recharts/general.pyi +31 -31
  170. reflex/components/recharts/polar.py +8 -4
  171. reflex/components/recharts/polar.pyi +23 -23
  172. reflex/components/recharts/recharts.py +2 -2
  173. reflex/components/recharts/recharts.pyi +12 -12
  174. reflex/components/sonner/toast.py +3 -3
  175. reflex/components/sonner/toast.pyi +9 -9
  176. reflex/config.py +10 -113
  177. reflex/constants/__init__.py +2 -2
  178. reflex/constants/base.py +28 -11
  179. reflex/constants/compiler.py +12 -3
  180. reflex/constants/event.py +1 -0
  181. reflex/constants/installer.py +26 -20
  182. reflex/constants/route.py +27 -8
  183. reflex/constants/state.py +2 -0
  184. reflex/custom_components/custom_components.py +0 -14
  185. reflex/environment.py +77 -5
  186. reflex/event.py +178 -81
  187. reflex/experimental/__init__.py +0 -30
  188. reflex/istate/__init__.py +69 -0
  189. reflex/istate/manager.py +1 -0
  190. reflex/istate/proxy.py +5 -3
  191. reflex/page.py +0 -27
  192. reflex/plugins/__init__.py +3 -2
  193. reflex/plugins/base.py +5 -1
  194. reflex/plugins/shared_tailwind.py +215 -0
  195. reflex/plugins/sitemap.py +206 -0
  196. reflex/plugins/tailwind_v3.py +15 -108
  197. reflex/plugins/tailwind_v4.py +18 -110
  198. reflex/reflex.py +1 -0
  199. reflex/route.py +157 -75
  200. reflex/state.py +171 -155
  201. reflex/testing.py +86 -16
  202. reflex/utils/build.py +38 -82
  203. reflex/utils/exec.py +83 -175
  204. reflex/utils/export.py +2 -2
  205. reflex/utils/format.py +1 -5
  206. reflex/utils/imports.py +5 -16
  207. reflex/utils/misc.py +67 -0
  208. reflex/utils/prerequisites.py +66 -68
  209. reflex/utils/processes.py +24 -47
  210. reflex/utils/pyi_generator.py +44 -49
  211. reflex/utils/serializers.py +14 -1
  212. reflex/utils/telemetry.py +0 -15
  213. reflex/utils/types.py +197 -62
  214. reflex/vars/__init__.py +2 -0
  215. reflex/vars/base.py +367 -134
  216. {reflex-0.7.14a5.dist-info → reflex-0.8.0.dist-info}/METADATA +15 -8
  217. reflex-0.8.0.dist-info/RECORD +403 -0
  218. reflex/.templates/web/next.config.js +0 -7
  219. reflex/components/base/head.py +0 -20
  220. reflex/components/base/head.pyi +0 -116
  221. reflex/components/next/__init__.py +0 -10
  222. reflex/components/next/base.py +0 -7
  223. reflex/components/next/image.py +0 -117
  224. reflex/components/next/image.pyi +0 -94
  225. reflex/components/next/link.py +0 -20
  226. reflex/components/next/link.pyi +0 -67
  227. reflex/components/next/video.py +0 -38
  228. reflex/components/next/video.pyi +0 -68
  229. reflex/components/suneditor/__init__.py +0 -5
  230. reflex/components/suneditor/editor.py +0 -269
  231. reflex/components/suneditor/editor.pyi +0 -199
  232. reflex/experimental/layout.py +0 -254
  233. reflex-0.7.14a5.dist-info/RECORD +0 -407
  234. {reflex-0.7.14a5.dist-info → reflex-0.8.0.dist-info}/WHEEL +0 -0
  235. {reflex-0.7.14a5.dist-info → reflex-0.8.0.dist-info}/entry_points.txt +0 -0
  236. {reflex-0.7.14a5.dist-info → reflex-0.8.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,160 @@
1
+ /* vite-plugin-safari-cachebust.js
2
+ *
3
+ * Rewrite modulepreload <link> tags and ESM imports to include a cache-busting
4
+ * query parameter for Safari browser.
5
+ *
6
+ * https://github.com/remix-run/react-router/issues/12761
7
+ *
8
+ * The issue seems to be Safari over-aggressive caching of ESM imports (and modulepreload)
9
+ * which does not respect the cache-control headers sent by the server. This approach
10
+ * allows hot reload to work in Safari when adding routes or changing dependencies.
11
+ *
12
+ * No equivalent transformation is needed for production builds, as the
13
+ * output already contains the file hash in the name.
14
+ */
15
+
16
+ /**
17
+ * @typedef {import('vite').Plugin} Plugin
18
+ * @typedef {import('vite').ViteDevServer} ViteDevServer
19
+ * @typedef {import('http').IncomingMessage} IncomingMessage
20
+ * @typedef {import('http').ServerResponse} ServerResponse
21
+ * @typedef {import('connect').NextHandleFunction} NextHandleFunction
22
+ */
23
+
24
+ const pluginName = "vite-plugin-safari-cachebust";
25
+
26
+ /**
27
+ * Creates a Vite plugin that adds cache-busting for Safari browsers
28
+ * @returns {Plugin} The Vite plugin
29
+ */
30
+ export default function safariCacheBustPlugin() {
31
+ return {
32
+ name: pluginName,
33
+ /**
34
+ * Configure the dev server with the Safari middleware
35
+ * @param {ViteDevServer} server - The Vite dev server instance
36
+ */
37
+ configureServer(server) {
38
+ server.middlewares.use(createSafariMiddleware());
39
+ },
40
+ };
41
+ }
42
+
43
+ /**
44
+ * Determines if the user agent is Safari
45
+ * @param {string} ua - The user agent string
46
+ * @returns {boolean} True if the browser is Safari
47
+ */
48
+ function isSafari(ua) {
49
+ return /Safari/.test(ua) && !/Chrome/.test(ua);
50
+ }
51
+
52
+ /**
53
+ * Creates a middleware that adds cache-busting for Safari browsers
54
+ * @returns {NextHandleFunction} The middleware function
55
+ */
56
+ function createSafariMiddleware() {
57
+ // Set when a log message for rewriting n links has been emitted.
58
+ let _have_logged_n = -1;
59
+
60
+ /**
61
+ * Rewrites module import links in HTML content with cache-busting parameters
62
+ * @param {string} html - The HTML content to process
63
+ * @returns {string} The processed HTML content
64
+ */
65
+ function rewriteModuleImports(html) {
66
+ const currentTimestamp = new Date().getTime();
67
+ const parts = html.split(/(<link\s+rel="modulepreload"[^>]*>)/g);
68
+ /** @type {[string, string][]} */
69
+ const replacements = parts
70
+ .map((chunk) => {
71
+ const match = chunk.match(
72
+ /<link\s+rel="modulepreload"\s+href="([^"]+)"(.*?)\/?>/,
73
+ );
74
+ if (!match) return;
75
+
76
+ const [fullMatch, href, rest] = match;
77
+ if (/^(https?:)?\/\//.test(href)) return;
78
+
79
+ try {
80
+ const newHref = href.includes("?")
81
+ ? `${href}&__reflex_ts=${currentTimestamp}`
82
+ : `${href}?__reflex_ts=${currentTimestamp}`;
83
+ return [href, newHref];
84
+ } catch {
85
+ // no worries;
86
+ }
87
+ })
88
+ .filter(Boolean);
89
+ if (replacements.length && _have_logged_n !== replacements.length) {
90
+ _have_logged_n = replacements.length;
91
+ console.debug(
92
+ `[${pluginName}] Rewrote ${replacements.length} modulepreload links with __reflex_ts param.`,
93
+ );
94
+ }
95
+ return replacements.reduce((accumulator, [target, replacement]) => {
96
+ return accumulator.split(target).join(replacement);
97
+ }, html);
98
+ }
99
+
100
+ /**
101
+ * Middleware function to handle Safari cache busting
102
+ * @param {IncomingMessage} req - The incoming request
103
+ * @param {ServerResponse} res - The server response
104
+ * @param {(err?: any) => void} next - The next middleware function
105
+ * @returns {void}
106
+ */
107
+ return function safariCacheBustMiddleware(req, res, next) {
108
+ const ua = req.headers["user-agent"] || "";
109
+ // Remove our special cache bust query param to avoid affecting lower middleware layers.
110
+ if (
111
+ req.url &&
112
+ (req.url.includes("?__reflex_ts=") || req.url.includes("&__reflex_ts="))
113
+ ) {
114
+ req.url = req.url.replace(/(\?|&)__reflex_ts=\d+/, "");
115
+ return next();
116
+ }
117
+
118
+ // Only apply this middleware for Safari browsers.
119
+ if (!isSafari(ua)) return next();
120
+
121
+ // Only transform requests that want HTML.
122
+ const header_accept = req.headers["accept"] || "";
123
+ if (
124
+ typeof header_accept !== "string" ||
125
+ !header_accept.includes("text/html")
126
+ ) {
127
+ return next();
128
+ }
129
+
130
+ let buffer = "";
131
+ const _end = res.end.bind(res);
132
+
133
+ res.setHeader("x-modified-by", "vite-plugin-safari-cachebust");
134
+ /**
135
+ * Overridden write method to collect chunks
136
+ * @param {any} chunk - The chunk to write
137
+ * @param {...any} args - Additional arguments
138
+ * @returns {boolean} Result of the write operation
139
+ */
140
+ res.write = function (chunk, ...args) {
141
+ buffer += chunk instanceof Buffer ? chunk.toString("utf-8") : chunk;
142
+ return true;
143
+ };
144
+
145
+ /**
146
+ * Overridden end method to process and send the final response
147
+ * @param {any} chunk - The final chunk to write
148
+ * @param {...any} args - Additional arguments
149
+ * @returns {ServerResponse<IncomingMessage>} The server response
150
+ */
151
+ res.end = function (chunk, ...args) {
152
+ if (chunk) {
153
+ buffer += chunk instanceof Buffer ? chunk.toString("utf-8") : chunk;
154
+ }
155
+ buffer = rewriteModuleImports(buffer);
156
+ return _end(buffer, ...args);
157
+ };
158
+ return next();
159
+ };
160
+ }
@@ -0,0 +1,39 @@
1
+ import { fileURLToPath, URL } from "url";
2
+ import { reactRouter } from "@react-router/dev/vite";
3
+ import { defineConfig } from "vite";
4
+ import safariCacheBustPlugin from "./vite-plugin-safari-cachebust";
5
+
6
+ export default defineConfig((config) => ({
7
+ plugins: [reactRouter(), safariCacheBustPlugin()],
8
+ build: {
9
+ rollupOptions: {
10
+ jsx: {},
11
+ },
12
+ },
13
+ server: {
14
+ port: process.env.PORT,
15
+ watch: {
16
+ ignored: [
17
+ "**/.web/backend/**",
18
+ "**/.web/reflex.install_frontend_packages.cached",
19
+ ],
20
+ },
21
+ },
22
+ resolve: {
23
+ mainFields: ["browser", "module", "jsnext"],
24
+ alias: [
25
+ {
26
+ find: "$",
27
+ replacement: fileURLToPath(new URL("./", import.meta.url)),
28
+ },
29
+ {
30
+ find: "@",
31
+ replacement: fileURLToPath(new URL("./public", import.meta.url)),
32
+ },
33
+ ].concat(
34
+ config.command === "build"
35
+ ? [{ find: "react-dom/server", replacement: "react-dom/server.node" }]
36
+ : [],
37
+ ),
38
+ },
39
+ }));
reflex/__init__.py CHANGED
@@ -279,12 +279,7 @@ _MAPPING: dict = {
279
279
  "components.el.elements.media": ["image"],
280
280
  "components.lucide": ["icon"],
281
281
  **COMPONENTS_BASE_MAPPING,
282
- "components.suneditor": [
283
- "editor",
284
- "EditorButtonList",
285
- "EditorOptions",
286
- ],
287
- "components": ["el", "radix", "lucide", "recharts", "next"],
282
+ "components": ["el", "radix", "lucide", "recharts"],
288
283
  "components.markdown": ["markdown"],
289
284
  **RADIX_MAPPING,
290
285
  "components.plotly": ["plotly"],