Skip to content

Commit bff5a23

Browse files
committed
Merge branch 'main' into move-pydantic,-sqlmodel,-alembic-to-optional-dependencies
2 parents 67cd6fd + 40cc4ef commit bff5a23

File tree

17 files changed

+343
-353
lines changed

17 files changed

+343
-353
lines changed

.github/workflows/check_outdated_dependencies.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,12 @@ jobs:
5656
path: reflex-web
5757
- name: Compile pyproject.toml into requirements.txt
5858
working-directory: ./reflex-web
59-
run: uv pip compile pyproject.toml --no-annotate --no-header --no-deps --output-file requirements.txt
59+
run: |
60+
uv pip compile pyproject.toml --no-annotate --no-header --no-deps --output-file requirements.txt
61+
grep -ivE "reflex " requirements.txt > requirements.txt.tmp && mv requirements.txt.tmp requirements.txt
6062
- name: Install Requirements for reflex-web
6163
working-directory: ./reflex-web
62-
run: uv pip install $(grep -ivE "reflex " requirements.txt)
64+
run: uv pip install -r requirements.txt
6365
- name: Init Website for reflex-web
6466
working-directory: ./reflex-web
6567
run: uv run reflex init

.github/workflows/integration_tests.yml

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,12 @@ jobs:
125125

126126
- name: Compile pyproject.toml into requirements.txt
127127
working-directory: ./reflex-web
128-
run: uv pip compile pyproject.toml --no-annotate --no-header --no-deps --output-file requirements.txt
128+
run: |
129+
uv pip compile pyproject.toml --no-annotate --no-header --no-deps --output-file requirements.txt
130+
grep -ivE "reflex " requirements.txt > requirements.txt.tmp && mv requirements.txt.tmp requirements.txt
129131
- name: Install Requirements for reflex-web
130132
working-directory: ./reflex-web
131-
run: uv pip install $(grep -ivE "reflex " requirements.txt)
133+
run: uv pip install -r requirements.txt
132134
- name: Init Website for reflex-web
133135
working-directory: ./reflex-web
134136
run: uv run --active --no-sync reflex init
@@ -189,10 +191,12 @@ jobs:
189191
path: reflex-web
190192
- name: Compile pyproject.toml into requirements.txt
191193
working-directory: ./reflex-web
192-
run: uv pip compile pyproject.toml --no-annotate --no-header --no-deps --output-file requirements.txt
194+
run: |
195+
uv pip compile pyproject.toml --no-annotate --no-header --no-deps --output-file requirements.txt
196+
grep -ivE "reflex " requirements.txt > requirements.txt.tmp && mv requirements.txt.tmp requirements.txt
193197
- name: Install Requirements for reflex-web
194198
working-directory: ./reflex-web
195-
run: uv pip install $(grep -ivE "reflex " requirements.txt)
199+
run: uv pip install -r requirements.txt
196200
- name: Init Website for reflex-web
197201
working-directory: ./reflex-web
198202
run: uv run --active --no-sync reflex init

pyi_hashes.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"reflex/components/el/element.pyi": "7faa2cda13a04870d6c1cbfb4b3a2a0a",
3131
"reflex/components/el/elements/__init__.pyi": "2e30624329b8b535dfd8969f95efdd25",
3232
"reflex/components/el/elements/base.pyi": "3fde62b5c749a40c43d1a4f0d0dccda4",
33-
"reflex/components/el/elements/forms.pyi": "b7db5e64a2d0ee1a7ecf72cac927587a",
33+
"reflex/components/el/elements/forms.pyi": "a316bdcc4bef4adb71d059057c6ffeff",
3434
"reflex/components/el/elements/inline.pyi": "027f051369a253446365e77a4d621013",
3535
"reflex/components/el/elements/media.pyi": "57bf44d696132478da377dd8d78807e2",
3636
"reflex/components/el/elements/metadata.pyi": "23ad6217eb96f622b33a1f550c510cd5",
@@ -40,7 +40,7 @@
4040
"reflex/components/el/elements/tables.pyi": "e5573a4a8c9cb13d8169a596b6699b31",
4141
"reflex/components/el/elements/typography.pyi": "9f9f6990749f4a3c643f8ab344df00cd",
4242
"reflex/components/gridjs/datatable.pyi": "5c19d2b5788a8520d43a4d6dcc247705",
43-
"reflex/components/lucide/icon.pyi": "637bf77970ef805ac4bdc1eba77ece76",
43+
"reflex/components/lucide/icon.pyi": "3d2203dae277f5b3404ba5cc4ef9d9e8",
4444
"reflex/components/markdown/markdown.pyi": "a569dd6a60d67baebfc4d04cddf85020",
4545
"reflex/components/moment/moment.pyi": "4ca29ae9cae720eb5c4955682e4cb7df",
4646
"reflex/components/plotly/plotly.pyi": "1de86aa6881e59d4053206e62e3039c3",

pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "reflex"
3-
version = "0.8.4dev1"
3+
version = "0.8.5dev1"
44
description = "Web apps in pure Python."
55
license.text = "Apache-2.0"
66
authors = [
@@ -32,7 +32,7 @@ dependencies = [
3232
"python-multipart >=0.0.20,<1.0",
3333
"python-socketio >=5.12.0,<6.0",
3434
"redis >=5.2.1,<7.0",
35-
"reflex-hosting-cli >=0.1.51",
35+
"reflex-hosting-cli >=0.1.53",
3636
"rich >=13,<15",
3737
"sqlmodel >=0.0.24,<0.1",
3838
"starlette >=0.47.0",
@@ -233,7 +233,7 @@ fail_fast = true
233233

234234
[[tool.pre-commit.repos]]
235235
repo = "https://github.com/astral-sh/ruff-pre-commit"
236-
rev = "v0.12.3"
236+
rev = "v0.12.5"
237237
hooks = [
238238
{ id = "ruff-format", args = [
239239
"reflex",

reflex/.templates/web/utils/react-theme.js

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,9 @@ const ThemeContext = createContext({
1818

1919
export function ThemeProvider({ children, defaultTheme = "system" }) {
2020
const [theme, setTheme] = useState(defaultTheme);
21-
22-
// Detect system preference synchronously during initialization
23-
const getInitialSystemTheme = () => {
24-
if (defaultTheme !== "system") return defaultTheme;
25-
if (typeof window === "undefined") return "light";
26-
return window.matchMedia("(prefers-color-scheme: dark)").matches
27-
? "dark"
28-
: "light";
29-
};
30-
31-
const [systemTheme, setSystemTheme] = useState(getInitialSystemTheme);
21+
const [systemTheme, setSystemTheme] = useState(
22+
defaultTheme !== "system" ? defaultTheme : "light",
23+
);
3224
const [isInitialized, setIsInitialized] = useState(false);
3325

3426
const firstRender = useRef(true);
@@ -45,6 +37,7 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
4537
if (lastCompiledTheme !== defaultColorMode) {
4638
// on app startup, make sure the application color mode is persisted correctly.
4739
localStorage.setItem("last_compiled_theme", defaultColorMode);
40+
setIsInitialized(true);
4841
return;
4942
}
5043
}
@@ -78,19 +71,21 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
7871
};
7972
});
8073

81-
// Save theme to localStorage whenever it changes (but not on initial mount)
74+
// Save theme to localStorage whenever it changes
75+
// Skip saving only if theme key already exists and we haven't initialized yet
8276
useEffect(() => {
83-
if (isInitialized) {
84-
localStorage.setItem("theme", theme);
85-
}
86-
}, [theme, isInitialized]);
77+
const existingTheme = localStorage.getItem("theme");
78+
if (!isInitialized && existingTheme !== null) return;
79+
localStorage.setItem("theme", theme);
80+
}, [theme]);
8781

8882
useEffect(() => {
83+
if (!isInitialized) return;
8984
const root = window.document.documentElement;
9085
root.classList.remove("light", "dark");
9186
root.classList.add(resolvedTheme);
9287
root.style.colorScheme = resolvedTheme;
93-
}, [resolvedTheme]);
88+
}, [resolvedTheme, isInitialized]);
9489

9590
return createElement(
9691
ThemeContext.Provider,

reflex/components/component.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,7 @@ def _render(self, props: dict[str, Any] | None = None) -> Tag:
964964
# Create the base tag.
965965
tag = Tag(
966966
name=name,
967-
special_props=self.special_props,
967+
special_props=self.special_props.copy(),
968968
)
969969

970970
if props is None:

reflex/components/el/elements/forms.py

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
from reflex.components.tags.tag import Tag
1313
from reflex.constants import Dirs, EventTriggers
1414
from reflex.event import (
15+
FORM_DATA,
1516
EventChain,
1617
EventHandler,
1718
checked_input_event,
1819
float_input_event,
1920
input_event,
2021
int_input_event,
2122
key_event,
23+
on_submit_event,
24+
on_submit_string_event,
2225
prevent_default,
2326
)
2427
from reflex.utils.imports import ImportDict
@@ -28,7 +31,6 @@
2831

2932
from .base import BaseHTML
3033

31-
FORM_DATA = Var(_js_expr="form_data")
3234
HANDLE_SUBMIT_JS_JINJA2 = Environment().from_string(
3335
"""
3436
const handleSubmit_{{ handle_submit_unique_name }} = useCallback((ev) => {
@@ -110,24 +112,6 @@ class Fieldset(Element):
110112
name: Var[str]
111113

112114

113-
def on_submit_event_spec() -> tuple[Var[dict[str, Any]]]:
114-
"""Event handler spec for the on_submit event.
115-
116-
Returns:
117-
The event handler spec.
118-
"""
119-
return (FORM_DATA,)
120-
121-
122-
def on_submit_string_event_spec() -> tuple[Var[dict[str, str]]]:
123-
"""Event handler spec for the on_submit event.
124-
125-
Returns:
126-
The event handler spec.
127-
"""
128-
return (FORM_DATA,)
129-
130-
131115
class Form(BaseHTML):
132116
"""Display the form element."""
133117

@@ -167,7 +151,7 @@ class Form(BaseHTML):
167151
handle_submit_unique_name: Var[str]
168152

169153
# Fired when the form is submitted
170-
on_submit: EventHandler[on_submit_event_spec, on_submit_string_event_spec]
154+
on_submit: EventHandler[on_submit_event, on_submit_string_event]
171155

172156
@classmethod
173157
def create(cls, *children, **props):

reflex/components/lucide/icon.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from reflex.vars.base import LiteralVar, Var
77
from reflex.vars.sequence import LiteralStringVar, StringVar
88

9-
LUCIDE_LIBRARY = "lucide-react@0.525.0"
9+
LUCIDE_LIBRARY = "lucide-react@0.534.0"
1010

1111

1212
class LucideIconComponent(Component):
@@ -231,6 +231,7 @@ def _get_imports(self):
231231
"badge_pound_sterling",
232232
"badge_russian_ruble",
233233
"badge_swiss_franc",
234+
"badge_turkish_lira",
234235
"badge_x",
235236
"badge",
236237
"baggage_claim",
@@ -501,6 +502,7 @@ def _get_imports(self):
501502
"citrus",
502503
"clapperboard",
503504
"clipboard_check",
505+
"clipboard_clock",
504506
"clipboard_copy",
505507
"clipboard_list",
506508
"clipboard_minus",
@@ -529,6 +531,7 @@ def _get_imports(self):
529531
"clock_fading",
530532
"clock_plus",
531533
"clock",
534+
"closed_caption",
532535
"cloud_alert",
533536
"cloud_check",
534537
"cloud_cog",
@@ -876,12 +879,14 @@ def _get_imports(self):
876879
"hand_metal",
877880
"hand_platter",
878881
"hand",
882+
"handbag",
879883
"handshake",
880884
"hard_drive_download",
881885
"hard_drive_upload",
882886
"hard_drive",
883887
"hard_hat",
884888
"hash",
889+
"hat_glasses",
885890
"haze",
886891
"hdmi_port",
887892
"heading_1",
@@ -1034,6 +1039,7 @@ def _get_imports(self):
10341039
"mail",
10351040
"mailbox",
10361041
"mails",
1042+
"map_minus",
10371043
"map_pin_check_inside",
10381044
"map_pin_check",
10391045
"map_pin_house",
@@ -1289,6 +1295,7 @@ def _get_imports(self):
12891295
"receipt_russian_ruble",
12901296
"receipt_swiss_franc",
12911297
"receipt_text",
1298+
"receipt_turkish_lira",
12921299
"receipt",
12931300
"rectangle_circle",
12941301
"rectangle_ellipsis",
@@ -1450,6 +1457,7 @@ def _get_imports(self):
14501457
"spline",
14511458
"split",
14521459
"spool",
1460+
"spotlight",
14531461
"spray_can",
14541462
"sprout",
14551463
"square_activity",
@@ -1635,6 +1643,7 @@ def _get_imports(self):
16351643
"trophy",
16361644
"truck_electric",
16371645
"truck",
1646+
"turkish_lira",
16381647
"turtle",
16391648
"tv_2",
16401649
"tv_minimal_play",
@@ -1674,6 +1683,7 @@ def _get_imports(self):
16741683
"user_round_x",
16751684
"user_round",
16761685
"user_search",
1686+
"user_star",
16771687
"user_x",
16781688
"user",
16791689
"users_round",
@@ -1726,6 +1736,7 @@ def _get_imports(self):
17261736
"wifi_low",
17271737
"wifi_off",
17281738
"wifi_pen",
1739+
"wifi_sync",
17291740
"wifi_zero",
17301741
"wifi",
17311742
"wind_arrow_down",

reflex/components/plotly/plotly.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class Plotly(NoSSRComponent):
7272

7373
library = "[email protected]"
7474

75-
lib_dependencies: list[str] = ["[email protected].1"]
75+
lib_dependencies: list[str] = ["[email protected].3"]
7676

7777
tag = "Plot"
7878

@@ -295,7 +295,7 @@ class PlotlyBasic(Plotly):
295295

296296
library = "[email protected]"
297297

298-
lib_dependencies: list[str] = ["[email protected].1"]
298+
lib_dependencies: list[str] = ["[email protected].3"]
299299

300300
def add_imports(self) -> ImportDict | list[ImportDict]:
301301
"""Add imports for the plotly basic component.
@@ -321,7 +321,7 @@ class PlotlyCartesian(Plotly):
321321

322322
library = "[email protected]"
323323

324-
lib_dependencies: list[str] = ["[email protected].1"]
324+
lib_dependencies: list[str] = ["[email protected].3"]
325325

326326
def add_imports(self) -> ImportDict | list[ImportDict]:
327327
"""Add imports for the plotly cartesian component.
@@ -347,7 +347,7 @@ class PlotlyGeo(Plotly):
347347

348348
library = "[email protected]"
349349

350-
lib_dependencies: list[str] = ["[email protected].1"]
350+
lib_dependencies: list[str] = ["[email protected].3"]
351351

352352
def add_imports(self) -> ImportDict | list[ImportDict]:
353353
"""Add imports for the plotly geo component.
@@ -373,7 +373,7 @@ class PlotlyGl3d(Plotly):
373373

374374
library = "[email protected]"
375375

376-
lib_dependencies: list[str] = ["[email protected].1"]
376+
lib_dependencies: list[str] = ["[email protected].3"]
377377

378378
def add_imports(self) -> ImportDict | list[ImportDict]:
379379
"""Add imports for the plotly 3d component.
@@ -399,7 +399,7 @@ class PlotlyGl2d(Plotly):
399399

400400
library = "[email protected]"
401401

402-
lib_dependencies: list[str] = ["[email protected].1"]
402+
lib_dependencies: list[str] = ["[email protected].3"]
403403

404404
def add_imports(self) -> ImportDict | list[ImportDict]:
405405
"""Add imports for the plotly 2d component.
@@ -425,7 +425,7 @@ class PlotlyMapbox(Plotly):
425425

426426
library = "[email protected]"
427427

428-
lib_dependencies: list[str] = ["[email protected].1"]
428+
lib_dependencies: list[str] = ["[email protected].3"]
429429

430430
def add_imports(self) -> ImportDict | list[ImportDict]:
431431
"""Add imports for the plotly mapbox component.
@@ -451,7 +451,7 @@ class PlotlyFinance(Plotly):
451451

452452
library = "[email protected]"
453453

454-
lib_dependencies: list[str] = ["[email protected].1"]
454+
lib_dependencies: list[str] = ["[email protected].3"]
455455

456456
def add_imports(self) -> ImportDict | list[ImportDict]:
457457
"""Add imports for the plotly finance component.
@@ -477,7 +477,7 @@ class PlotlyStrict(Plotly):
477477

478478
library = "[email protected]"
479479

480-
lib_dependencies: list[str] = ["[email protected].1"]
480+
lib_dependencies: list[str] = ["[email protected].3"]
481481

482482
def add_imports(self) -> ImportDict | list[ImportDict]:
483483
"""Add imports for the plotly strict component.

0 commit comments

Comments
 (0)