reflex 0.8.7a1__py3-none-any.whl → 0.8.8__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 (71) hide show
  1. reflex/.templates/web/utils/state.js +5 -5
  2. reflex/app.py +15 -7
  3. reflex/app_mixins/lifespan.py +8 -2
  4. reflex/compiler/compiler.py +14 -14
  5. reflex/compiler/templates.py +629 -102
  6. reflex/compiler/utils.py +30 -21
  7. reflex/components/base/bare.py +17 -0
  8. reflex/components/component.py +38 -34
  9. reflex/components/core/cond.py +6 -12
  10. reflex/components/core/foreach.py +1 -1
  11. reflex/components/core/match.py +83 -60
  12. reflex/components/dynamic.py +3 -3
  13. reflex/components/el/elements/forms.py +31 -14
  14. reflex/components/el/elements/forms.pyi +0 -5
  15. reflex/components/lucide/icon.py +2 -1
  16. reflex/components/lucide/icon.pyi +2 -1
  17. reflex/components/markdown/markdown.py +2 -2
  18. reflex/components/radix/primitives/accordion.py +1 -1
  19. reflex/components/radix/primitives/drawer.py +10 -22
  20. reflex/components/radix/primitives/drawer.pyi +4 -0
  21. reflex/components/radix/primitives/form.py +1 -1
  22. reflex/components/radix/primitives/slider.py +1 -1
  23. reflex/components/tags/cond_tag.py +14 -5
  24. reflex/components/tags/iter_tag.py +0 -26
  25. reflex/components/tags/match_tag.py +15 -6
  26. reflex/components/tags/tag.py +3 -6
  27. reflex/components/tags/tagless.py +14 -0
  28. reflex/constants/base.py +0 -2
  29. reflex/constants/compiler.py +1 -1
  30. reflex/constants/installer.py +4 -4
  31. reflex/custom_components/custom_components.py +202 -15
  32. reflex/event.py +1 -1
  33. reflex/experimental/client_state.py +1 -1
  34. reflex/istate/manager.py +2 -1
  35. reflex/plugins/shared_tailwind.py +87 -62
  36. reflex/plugins/tailwind_v3.py +2 -2
  37. reflex/plugins/tailwind_v4.py +4 -4
  38. reflex/state.py +5 -1
  39. reflex/utils/format.py +3 -4
  40. reflex/utils/frontend_skeleton.py +2 -2
  41. reflex/utils/imports.py +18 -0
  42. reflex/utils/pyi_generator.py +10 -2
  43. reflex/utils/telemetry.py +4 -1
  44. reflex/utils/templates.py +1 -6
  45. {reflex-0.8.7a1.dist-info → reflex-0.8.8.dist-info}/METADATA +3 -4
  46. {reflex-0.8.7a1.dist-info → reflex-0.8.8.dist-info}/RECORD +49 -71
  47. reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -9
  48. reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -9
  49. reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -1
  50. reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -39
  51. reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -25
  52. reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -57
  53. reflex/.templates/jinja/web/package.json.jinja2 +0 -27
  54. reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -62
  55. reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -9
  56. reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -21
  57. reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -2
  58. reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -22
  59. reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -18
  60. reflex/.templates/jinja/web/pages/macros.js.jinja2 +0 -38
  61. reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -15
  62. reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -5
  63. reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -93
  64. reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -6
  65. reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -129
  66. reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -1
  67. reflex/.templates/jinja/web/vite.config.js.jinja2 +0 -74
  68. reflex/components/core/client_side_routing.pyi +0 -68
  69. {reflex-0.8.7a1.dist-info → reflex-0.8.8.dist-info}/WHEEL +0 -0
  70. {reflex-0.8.7a1.dist-info → reflex-0.8.8.dist-info}/entry_points.txt +0 -0
  71. {reflex-0.8.7a1.dist-info → reflex-0.8.8.dist-info}/licenses/LICENSE +0 -0
@@ -1,38 +0,0 @@
1
- {% macro renderHooks(hooks) %}
2
- {% set sorted_hooks = sort_hooks(hooks) %}
3
-
4
- {# Render the grouped hooks #}
5
- {% for hook, _ in sorted_hooks[const.hook_position.INTERNAL] %}
6
- {{ hook }}
7
- {% endfor %}
8
-
9
- {% for hook, _ in sorted_hooks[const.hook_position.PRE_TRIGGER] %}
10
- {{ hook }}
11
- {% endfor %}
12
-
13
- {% for hook, _ in sorted_hooks[const.hook_position.POST_TRIGGER] %}
14
- {{ hook }}
15
- {% endfor %}
16
- {% endmacro %}
17
-
18
- {% macro renderHooksWithMemo(hooks, memo)%}
19
- {% set sorted_hooks = sort_hooks(hooks) %}
20
-
21
- {# Render the grouped hooks #}
22
- {% for hook, _ in sorted_hooks[const.hook_position.INTERNAL] %}
23
- {{ hook }}
24
- {% endfor %}
25
-
26
- {% for hook, _ in sorted_hooks[const.hook_position.PRE_TRIGGER] %}
27
- {{ hook }}
28
- {% endfor %}
29
-
30
- {% for hook in memo %}
31
- {{ hook }}
32
- {% endfor %}
33
-
34
- {% for hook, _ in sorted_hooks[const.hook_position.POST_TRIGGER] %}
35
- {{ hook }}
36
- {% endfor %}
37
-
38
- {% endmacro %}
@@ -1,15 +0,0 @@
1
- {% import 'web/pages/utils.js.jinja2' as utils %}
2
- {% from 'web/pages/macros.js.jinja2' import renderHooksWithMemo %}
3
- {% set all_hooks = component._get_all_hooks() %}
4
-
5
- {% if export %}
6
- export function {{tag_name}} () {
7
- {% else %}
8
- function {{tag_name}} () {
9
- {% endif %}
10
- {{ renderHooksWithMemo(all_hooks, memo_trigger_hooks) }}
11
-
12
- return (
13
- {{utils.render(component.render())}}
14
- )
15
- }
@@ -1,5 +0,0 @@
1
- {% extends "web/pages/base_page.js.jinja2" %}
2
-
3
- {% block export %}
4
- {{ memoized_code }}
5
- {% endblock %}
@@ -1,93 +0,0 @@
1
- {# Rendering components recursively. #}
2
- {# Args: #}
3
- {# component: component dictionary #}
4
- {% macro render(component) %}
5
- {%- if component is not mapping %}{{ component }}
6
- {%- elif "iterable" in component %}{{ render_iterable_tag(component) }}
7
- {%- elif component.name == "match"%}{{ render_match_tag(component) }}
8
- {%- elif "cond" in component %}{{ render_condition_tag(component) }}
9
- {%- elif component.children|length %}{{ render_tag(component) }}
10
- {%- else %}{{ render_self_close_tag(component) }}
11
- {%- endif %}
12
- {% endmacro %}
13
-
14
- {# Rendering self close tag. #}
15
- {# Args: #}
16
- {# component: component dictionary #}
17
- {% macro render_self_close_tag(component) %}
18
- {% if component.name|length %}
19
- jsx({{ component.name }},{{ render_props(component.props) }},{{ component.contents }})
20
- {% elif component.contents|length -%}{{ component.contents }}
21
- {% else %}""
22
- {% endif %}
23
- {% endmacro %}
24
-
25
- {# Rendering close tag with args and props. #}
26
- {# Args: #}
27
- {# component: component dictionary #}
28
- {% macro render_tag(component) %}
29
- jsx(
30
- {% if component.name|length %}{{ component.name }}{% else %}Fragment{% endif %},
31
- {{ render_props(component.props) }},
32
- {% if component.contents|length %}{{ component.contents }},{% endif %}
33
- {% for child in component.children %}{% if child is mapping or child|length %}{{ render(child) }},{% endif %}{% endfor %}
34
- )
35
- {%- endmacro %}
36
-
37
-
38
- {# Rendering condition component. #}
39
- {# Args: #}
40
- {# component: component dictionary #}
41
- {% macro render_condition_tag(component) %}
42
- ({{ component.cond_state }} ? ({{ render(component.true_value) }}) : ({{ render(component.false_value) }}))
43
- {%- endmacro %}
44
-
45
-
46
- {# Rendering iterable component. #}
47
- {# Args: #}
48
- {# component: component dictionary #}
49
- {% macro render_iterable_tag(component) %}
50
- {{ component.iterable_state }}.map(({{ component.arg_name }},{{ component.arg_index }})=>({% for child in component.children %}{{ render(child) }}{% endfor %}))
51
- {%- endmacro %}
52
-
53
-
54
- {# Rendering props of a component. #}
55
- {# Args: #}
56
- {# component: component dictionary #}
57
- {% macro render_props(props) %}{{ "{" }}{% if props|length %}{{ props|join(",") }}{% endif %}{{ "}" }}{% endmacro %}
58
-
59
- {# Rendering Match component. #}
60
- {# Args: #}
61
- {# component: component dictionary #}
62
- {% macro render_match_tag(component) %}
63
- (() => {
64
- switch (JSON.stringify({{ component.cond._js_expr }})) {
65
- {% for case in component.match_cases %}
66
- {% for condition in case[:-1] %}
67
- case JSON.stringify({{ condition._js_expr }}):
68
- {% endfor %}
69
- return {{ render(case[-1]) }};
70
- break;
71
- {% endfor %}
72
- default:
73
- return {{ render(component.default) }};
74
- break;
75
- }
76
- })()
77
- {% endmacro %}
78
-
79
-
80
- {# Get react libraries import . #}
81
- {# Args: #}
82
- {# module: react module dictionary #}
83
- {% macro get_import(module)%}
84
- {%- if module.default|length and module.rest|length -%}
85
- import {{module.default}}, { {{module.rest|sort|join(", ")}} } from "{{module.lib}}"
86
- {%- elif module.default|length -%}
87
- import {{module.default}} from "{{module.lib}}"
88
- {%- elif module.rest|length -%}
89
- import { {{module.rest|sort|join(", ")}} } from "{{module.lib}}"
90
- {%- else -%}
91
- import "{{module.lib}}"
92
- {%- endif -%}
93
- {% endmacro %}
@@ -1,6 +0,0 @@
1
- {%- block imports_styles %}
2
- @layer __reflex_base;
3
- {% for sheet_name in stylesheets %}
4
- {{- "@import url('" + sheet_name + "'); " }}
5
- {% endfor %}
6
- {% endblock %}
@@ -1,129 +0,0 @@
1
- import { createContext, useContext, useMemo, useReducer, useState, createElement, useEffect } from "react"
2
- import { applyDelta, Event, hydrateClientStorage, useEventLoop, refs } from "$/utils/state"
3
- import { jsx } from "@emotion/react";
4
-
5
- {% if initial_state %}
6
- export const initialState = {{ initial_state|json_dumps }}
7
- {% else %}
8
- export const initialState = {}
9
- {% endif %}
10
-
11
- export const defaultColorMode = {{ default_color_mode }}
12
- export const ColorModeContext = createContext(null);
13
- export const UploadFilesContext = createContext(null);
14
- export const DispatchContext = createContext(null);
15
- export const StateContexts = {
16
- {% for state_name in initial_state %}
17
- {{state_name|var_name}}: createContext(null),
18
- {% endfor %}
19
- }
20
- export const EventLoopContext = createContext(null);
21
- {% if client_storage %}
22
- export const clientStorage = {{ client_storage|json_dumps }}
23
- {% else %}
24
- export const clientStorage = {}
25
- {% endif %}
26
-
27
- {% if state_name %}
28
- export const state_name = "{{state_name}}"
29
-
30
- export const exception_state_name = "{{const.frontend_exception_state}}"
31
-
32
- // These events are triggered on initial load and each page navigation.
33
- export const onLoadInternalEvent = () => {
34
- const internal_events = [];
35
-
36
- // Get tracked cookie and local storage vars to send to the backend.
37
- const client_storage_vars = hydrateClientStorage(clientStorage);
38
- // But only send the vars if any are actually set in the browser.
39
- if (client_storage_vars && Object.keys(client_storage_vars).length !== 0) {
40
- internal_events.push(
41
- Event(
42
- '{{state_name}}.{{const.update_vars_internal}}',
43
- {vars: client_storage_vars},
44
- ),
45
- );
46
- }
47
-
48
- // `on_load_internal` triggers the correct on_load event(s) for the current page.
49
- // If the page does not define any on_load event, this will just set `is_hydrated = true`.
50
- internal_events.push(Event('{{state_name}}.{{const.on_load_internal}}'));
51
-
52
- return internal_events;
53
- }
54
-
55
- // The following events are sent when the websocket connects or reconnects.
56
- export const initialEvents = () => [
57
- Event('{{state_name}}.{{const.hydrate}}'),
58
- ...onLoadInternalEvent()
59
- ]
60
- {% else %}
61
- export const state_name = undefined
62
-
63
- export const exception_state_name = undefined
64
-
65
- export const onLoadInternalEvent = () => []
66
-
67
- export const initialEvents = () => []
68
- {% endif %}
69
-
70
- export const isDevMode = {{ is_dev_mode|json_dumps }}
71
-
72
- export function UploadFilesProvider({ children }) {
73
- const [filesById, setFilesById] = useState({})
74
- refs["__clear_selected_files"] = (id) => setFilesById(filesById => {
75
- const newFilesById = {...filesById}
76
- delete newFilesById[id]
77
- return newFilesById
78
- })
79
- return createElement(
80
- UploadFilesContext.Provider,
81
- { value: [filesById, setFilesById] },
82
- children
83
- );
84
- }
85
-
86
- export function ClientSide(component) {
87
- return ({ children, ...props }) => {
88
- const [Component, setComponent] = useState(null);
89
- useEffect(() => {
90
- setComponent(component);
91
- }, []);
92
- return Component ? jsx(Component, props, children) : null;
93
- };
94
- }
95
-
96
- export function EventLoopProvider({ children }) {
97
- const dispatch = useContext(DispatchContext)
98
- const [addEvents, connectErrors] = useEventLoop(
99
- dispatch,
100
- initialEvents,
101
- clientStorage,
102
- )
103
- return createElement(
104
- EventLoopContext.Provider,
105
- { value: [addEvents, connectErrors] },
106
- children
107
- );
108
- }
109
-
110
- export function StateProvider({ children }) {
111
- {% for state_name in initial_state %}
112
- const [{{state_name|var_name}}, dispatch_{{state_name|var_name}}] = useReducer(applyDelta, initialState["{{state_name}}"])
113
- {% endfor %}
114
- const dispatchers = useMemo(() => {
115
- return {
116
- {% for state_name in initial_state %}
117
- "{{state_name}}": dispatch_{{state_name|var_name}},
118
- {% endfor %}
119
- }
120
- }, [])
121
-
122
- return (
123
- {% for state_name in initial_state %}
124
- createElement(StateContexts.{{state_name|var_name}},{value: {{state_name|var_name}}},
125
- {% endfor %}
126
- createElement(DispatchContext, {value: dispatchers}, children)
127
- {% for state_name in initial_state %}){% endfor %}
128
- )
129
- }
@@ -1 +0,0 @@
1
- export default {{ theme }}
@@ -1,74 +0,0 @@
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
- // Ensure that bun always uses the react-dom/server.node functions.
7
- function alwaysUseReactDomServerNode() {
8
- return {
9
- name: "vite-plugin-always-use-react-dom-server-node",
10
- enforce: "pre",
11
-
12
- resolveId(source, importer) {
13
- if (
14
- typeof importer === "string" &&
15
- importer.endsWith("/entry.server.node.tsx") &&
16
- source.includes("react-dom/server")
17
- ) {
18
- return this.resolve("react-dom/server.node", importer, {
19
- skipSelf: true,
20
- });
21
- }
22
- return null;
23
- },
24
- };
25
- }
26
-
27
- export default defineConfig((config) => ({
28
- plugins: [
29
- alwaysUseReactDomServerNode(),
30
- reactRouter(),
31
- safariCacheBustPlugin(),
32
- ],
33
- build: {
34
- assetsDir: "{{base}}assets".slice(1),
35
- rollupOptions: {
36
- jsx: {},
37
- output: {
38
- advancedChunks: {
39
- groups: [
40
- {
41
- test: /env.json/,
42
- name: "reflex-env",
43
- },
44
- ],
45
- },
46
- },
47
- },
48
- },
49
- experimental: {
50
- enableNativePlugin: false,
51
- },
52
- server: {
53
- port: process.env.PORT,
54
- watch: {
55
- ignored: [
56
- "**/.web/backend/**",
57
- "**/.web/reflex.install_frontend_packages.cached",
58
- ],
59
- },
60
- },
61
- resolve: {
62
- mainFields: ["browser", "module", "jsnext"],
63
- alias: [
64
- {
65
- find: "$",
66
- replacement: fileURLToPath(new URL("./", import.meta.url)),
67
- },
68
- {
69
- find: "@",
70
- replacement: fileURLToPath(new URL("./public", import.meta.url)),
71
- },
72
- ],
73
- },
74
- }));
@@ -1,68 +0,0 @@
1
- """Stub file for reflex/components/core/client_side_routing.py"""
2
-
3
- # ------------------- DO NOT EDIT ----------------------
4
- # This file was generated by `reflex/utils/pyi_generator.py`!
5
- # ------------------------------------------------------
6
- from collections.abc import Mapping, Sequence
7
- from typing import Any
8
-
9
- from reflex.components.component import Component
10
- from reflex.components.core.breakpoints import Breakpoints
11
- from reflex.event import EventType, PointerEventInfo
12
- from reflex.vars.base import Var
13
-
14
- route_not_found: Var
15
-
16
- class ClientSideRouting(Component):
17
- def add_hooks(self) -> list[str | Var]: ...
18
- def render(self) -> str: ...
19
- @classmethod
20
- def create(
21
- cls,
22
- *children,
23
- style: Sequence[Mapping[str, Any]]
24
- | Mapping[str, Any]
25
- | Var[Mapping[str, Any]]
26
- | Breakpoints
27
- | None = None,
28
- key: Any | None = None,
29
- id: Any | None = None,
30
- ref: Var | None = None,
31
- class_name: Any | None = None,
32
- custom_attrs: dict[str, Var | Any] | None = None,
33
- on_blur: EventType[()] | None = None,
34
- on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
35
- on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
36
- on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
37
- on_focus: EventType[()] | None = None,
38
- on_mount: EventType[()] | None = None,
39
- on_mouse_down: EventType[()] | None = None,
40
- on_mouse_enter: EventType[()] | None = None,
41
- on_mouse_leave: EventType[()] | None = None,
42
- on_mouse_move: EventType[()] | None = None,
43
- on_mouse_out: EventType[()] | None = None,
44
- on_mouse_over: EventType[()] | None = None,
45
- on_mouse_up: EventType[()] | None = None,
46
- on_scroll: EventType[()] | None = None,
47
- on_scroll_end: EventType[()] | None = None,
48
- on_unmount: EventType[()] | None = None,
49
- **props,
50
- ) -> ClientSideRouting:
51
- """Create the component.
52
-
53
- Args:
54
- *children: The children of the component.
55
- style: The style of the component.
56
- key: A unique key for the component.
57
- id: The id for the component.
58
- ref: The Var to pass as the ref to the component.
59
- class_name: The class name for the component.
60
- custom_attrs: custom attribute
61
- **props: The props of the component.
62
-
63
- Returns:
64
- The component.
65
- """
66
-
67
- def wait_for_client_redirect(component: Component) -> Component: ...
68
- def default_404_page() -> Component: ...