Bläddra i källkod

[REF-3562][REF-3563] Replace chakra usage (#3872)

Elijah Ahianyo 8 månader sedan
förälder
incheckning
625c5302dd

+ 1 - 2
benchmarks/test_benchmark_compile_pages.py

@@ -130,7 +130,6 @@ def render_multiple_pages(app, num: int):
 
 
 def AppWithOnePage():
 def AppWithOnePage():
     """A reflex app with one page."""
     """A reflex app with one page."""
-    import reflex_chakra as rc
     from rxconfig import config  # type: ignore
     from rxconfig import config  # type: ignore
 
 
     import reflex as rx
     import reflex as rx
@@ -145,7 +144,7 @@ def AppWithOnePage():
 
 
     def index() -> rx.Component:
     def index() -> rx.Component:
         return rx.center(
         return rx.center(
-            rc.input(
+            rx.input(
                 id="token", value=State.router.session.client_token, is_read_only=True
                 id="token", value=State.router.session.client_token, is_read_only=True
             ),
             ),
             rx.vstack(
             rx.vstack(

+ 2 - 3
integration/test_background_task.py

@@ -13,7 +13,6 @@ def BackgroundTask():
     import asyncio
     import asyncio
 
 
     import pytest
     import pytest
-    import reflex_chakra as rc
 
 
     import reflex as rx
     import reflex as rx
     from reflex.state import ImmutableStateError
     from reflex.state import ImmutableStateError
@@ -116,11 +115,11 @@ def BackgroundTask():
 
 
     def index() -> rx.Component:
     def index() -> rx.Component:
         return rx.vstack(
         return rx.vstack(
-            rc.input(
+            rx.input(
                 id="token", value=State.router.session.client_token, is_read_only=True
                 id="token", value=State.router.session.client_token, is_read_only=True
             ),
             ),
             rx.heading(State.counter, id="counter"),
             rx.heading(State.counter, id="counter"),
-            rc.input(
+            rx.input(
                 id="iterations",
                 id="iterations",
                 placeholder="Iterations",
                 placeholder="Iterations",
                 value=State.iterations.to_string(),  # type: ignore
                 value=State.iterations.to_string(),  # type: ignore

+ 3 - 7
integration/test_client_storage.py

@@ -17,8 +17,6 @@ from . import utils
 
 
 def ClientSide():
 def ClientSide():
     """App for testing client-side state."""
     """App for testing client-side state."""
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class ClientSideState(rx.State):
     class ClientSideState(rx.State):
@@ -72,18 +70,18 @@ def ClientSide():
 
 
     def index():
     def index():
         return rx.fragment(
         return rx.fragment(
-            rc.input(
+            rx.input(
                 value=ClientSideState.router.session.client_token,
                 value=ClientSideState.router.session.client_token,
                 is_read_only=True,
                 is_read_only=True,
                 id="token",
                 id="token",
             ),
             ),
-            rc.input(
+            rx.input(
                 placeholder="state var",
                 placeholder="state var",
                 value=ClientSideState.state_var,
                 value=ClientSideState.state_var,
                 on_change=ClientSideState.set_state_var,  # type: ignore
                 on_change=ClientSideState.set_state_var,  # type: ignore
                 id="state_var",
                 id="state_var",
             ),
             ),
-            rc.input(
+            rx.input(
                 placeholder="input value",
                 placeholder="input value",
                 value=ClientSideState.input_value,
                 value=ClientSideState.input_value,
                 on_change=ClientSideState.set_input_value,  # type: ignore
                 on_change=ClientSideState.set_input_value,  # type: ignore
@@ -313,7 +311,6 @@ async def test_client_side_state(
     # no cookies should be set yet!
     # no cookies should be set yet!
     assert not driver.get_cookies()
     assert not driver.get_cookies()
     local_storage_items = local_storage.items()
     local_storage_items = local_storage.items()
-    local_storage_items.pop("chakra-ui-color-mode", None)
     local_storage_items.pop("last_compiled_time", None)
     local_storage_items.pop("last_compiled_time", None)
     assert not local_storage_items
     assert not local_storage_items
 
 
@@ -429,7 +426,6 @@ async def test_client_side_state(
         assert f"{sub_state_name}.c3" not in cookie_info_map(driver)
         assert f"{sub_state_name}.c3" not in cookie_info_map(driver)
 
 
     local_storage_items = local_storage.items()
     local_storage_items = local_storage.items()
-    local_storage_items.pop("chakra-ui-color-mode", None)
     local_storage_items.pop("last_compiled_time", None)
     local_storage_items.pop("last_compiled_time", None)
     assert local_storage_items.pop(f"{sub_state_name}.l1") == "l1 value"
     assert local_storage_items.pop(f"{sub_state_name}.l1") == "l1 value"
     assert local_storage_items.pop(f"{sub_state_name}.l2") == "l2 value"
     assert local_storage_items.pop(f"{sub_state_name}.l2") == "l2 value"

+ 5 - 7
integration/test_dynamic_routes.py

@@ -17,8 +17,6 @@ def DynamicRoute():
     """App for testing dynamic routes."""
     """App for testing dynamic routes."""
     from typing import List
     from typing import List
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class DynamicState(rx.State):
     class DynamicState(rx.State):
@@ -41,13 +39,13 @@ def DynamicRoute():
 
 
     def index():
     def index():
         return rx.fragment(
         return rx.fragment(
-            rc.input(
+            rx.input(
                 value=DynamicState.router.session.client_token,
                 value=DynamicState.router.session.client_token,
                 is_read_only=True,
                 is_read_only=True,
                 id="token",
                 id="token",
             ),
             ),
-            rc.input(value=rx.State.page_id, is_read_only=True, id="page_id"),  # type: ignore
-            rc.input(
+            rx.input(value=rx.State.page_id, is_read_only=True, id="page_id"),  # type: ignore
+            rx.input(
                 value=DynamicState.router.page.raw_path,
                 value=DynamicState.router.page.raw_path,
                 is_read_only=True,
                 is_read_only=True,
                 id="raw_path",
                 id="raw_path",
@@ -60,10 +58,10 @@ def DynamicRoute():
                 id="link_page_next",  # type: ignore
                 id="link_page_next",  # type: ignore
             ),
             ),
             rx.link("missing", href="/missing", id="link_missing"),
             rx.link("missing", href="/missing", id="link_missing"),
-            rc.list(
+            rx.list(  # type: ignore
                 rx.foreach(
                 rx.foreach(
                     DynamicState.order,  # type: ignore
                     DynamicState.order,  # type: ignore
-                    lambda i: rc.list_item(rx.text(i)),
+                    lambda i: rx.list_item(rx.text(i)),
                 ),
                 ),
             ),
             ),
         )
         )

+ 3 - 5
integration/test_event_actions.py

@@ -16,8 +16,6 @@ def TestEventAction():
     """App for testing event_actions."""
     """App for testing event_actions."""
     from typing import List, Optional
     from typing import List, Optional
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class EventActionState(rx.State):
     class EventActionState(rx.State):
@@ -55,7 +53,7 @@ def TestEventAction():
 
 
     def index():
     def index():
         return rx.vstack(
         return rx.vstack(
-            rc.input(
+            rx.input(
                 value=EventActionState.router.session.client_token,
                 value=EventActionState.router.session.client_token,
                 is_read_only=True,
                 is_read_only=True,
                 id="token",
                 id="token",
@@ -148,10 +146,10 @@ def TestEventAction():
                     200
                     200
                 ).stop_propagation,
                 ).stop_propagation,
             ),
             ),
-            rc.list(
+            rx.list(  # type: ignore
                 rx.foreach(
                 rx.foreach(
                     EventActionState.order,  # type: ignore
                     EventActionState.order,  # type: ignore
-                    rc.list_item,
+                    rx.list_item,
                 ),
                 ),
             ),
             ),
             on_click=EventActionState.on_click("outer"),  # type: ignore
             on_click=EventActionState.on_click("outer"),  # type: ignore

+ 2 - 4
integration/test_event_chain.py

@@ -18,8 +18,6 @@ def EventChain():
     import time
     import time
     from typing import List
     from typing import List
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     # repeated here since the outer global isn't exported into the App module
     # repeated here since the outer global isn't exported into the App module
@@ -129,7 +127,7 @@ def EventChain():
 
 
     app = rx.App(state=rx.State)
     app = rx.App(state=rx.State)
 
 
-    token_input = rc.input(
+    token_input = rx.input(
         value=State.router.session.client_token, is_read_only=True, id="token"
         value=State.router.session.client_token, is_read_only=True, id="token"
     )
     )
 
 
@@ -137,7 +135,7 @@ def EventChain():
     def index():
     def index():
         return rx.fragment(
         return rx.fragment(
             token_input,
             token_input,
-            rc.input(value=State.interim_value, is_read_only=True, id="interim_value"),
+            rx.input(value=State.interim_value, is_read_only=True, id="interim_value"),
             rx.button(
             rx.button(
                 "Return Event",
                 "Return Event",
                 id="return_event",
                 id="return_event",

+ 17 - 48
integration/test_form_submit.py

@@ -20,8 +20,6 @@ def FormSubmit(form_component):
     """
     """
     from typing import Dict, List
     from typing import Dict, List
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class FormState(rx.State):
     class FormState(rx.State):
@@ -37,28 +35,29 @@ def FormSubmit(form_component):
     @app.add_page
     @app.add_page
     def index():
     def index():
         return rx.vstack(
         return rx.vstack(
-            rc.input(
+            rx.input(
                 value=FormState.router.session.client_token,
                 value=FormState.router.session.client_token,
                 is_read_only=True,
                 is_read_only=True,
                 id="token",
                 id="token",
             ),
             ),
             eval(form_component)(
             eval(form_component)(
                 rx.vstack(
                 rx.vstack(
-                    rc.input(id="name_input"),
-                    rx.hstack(rc.pin_input(length=4, id="pin_input")),
-                    rc.number_input(id="number_input"),
+                    rx.input(id="name_input"),
                     rx.checkbox(id="bool_input"),
                     rx.checkbox(id="bool_input"),
                     rx.switch(id="bool_input2"),
                     rx.switch(id="bool_input2"),
                     rx.checkbox(id="bool_input3"),
                     rx.checkbox(id="bool_input3"),
                     rx.switch(id="bool_input4"),
                     rx.switch(id="bool_input4"),
                     rx.slider(id="slider_input", default_value=[50], width="100%"),
                     rx.slider(id="slider_input", default_value=[50], width="100%"),
-                    rc.range_slider(id="range_input"),
                     rx.radio(["option1", "option2"], id="radio_input"),
                     rx.radio(["option1", "option2"], id="radio_input"),
                     rx.radio(FormState.var_options, id="radio_input_var"),
                     rx.radio(FormState.var_options, id="radio_input_var"),
-                    rc.select(["option1", "option2"], id="select_input"),
-                    rc.select(FormState.var_options, id="select_input_var"),
+                    rx.select(
+                        ["option1", "option2"],
+                        name="select_input",
+                        default_value="option1",
+                    ),
+                    rx.select(FormState.var_options, id="select_input_var"),
                     rx.text_area(id="text_area_input"),
                     rx.text_area(id="text_area_input"),
-                    rc.input(
+                    rx.input(
                         id="debounce_input",
                         id="debounce_input",
                         debounce_timeout=0,
                         debounce_timeout=0,
                         on_change=rx.console_log,
                         on_change=rx.console_log,
@@ -81,8 +80,6 @@ def FormSubmitName(form_component):
     """
     """
     from typing import Dict, List
     from typing import Dict, List
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class FormState(rx.State):
     class FormState(rx.State):
@@ -98,22 +95,19 @@ def FormSubmitName(form_component):
     @app.add_page
     @app.add_page
     def index():
     def index():
         return rx.vstack(
         return rx.vstack(
-            rc.input(
+            rx.input(
                 value=FormState.router.session.client_token,
                 value=FormState.router.session.client_token,
                 is_read_only=True,
                 is_read_only=True,
                 id="token",
                 id="token",
             ),
             ),
             eval(form_component)(
             eval(form_component)(
                 rx.vstack(
                 rx.vstack(
-                    rc.input(name="name_input"),
-                    rx.hstack(rc.pin_input(length=4, name="pin_input")),
-                    rc.number_input(name="number_input"),
+                    rx.input(name="name_input"),
                     rx.checkbox(name="bool_input"),
                     rx.checkbox(name="bool_input"),
                     rx.switch(name="bool_input2"),
                     rx.switch(name="bool_input2"),
                     rx.checkbox(name="bool_input3"),
                     rx.checkbox(name="bool_input3"),
                     rx.switch(name="bool_input4"),
                     rx.switch(name="bool_input4"),
                     rx.slider(name="slider_input", default_value=[50], width="100%"),
                     rx.slider(name="slider_input", default_value=[50], width="100%"),
-                    rc.range_slider(name="range_input"),
                     rx.radio(FormState.options, name="radio_input"),
                     rx.radio(FormState.options, name="radio_input"),
                     rx.select(
                     rx.select(
                         FormState.options,
                         FormState.options,
@@ -121,21 +115,13 @@ def FormSubmitName(form_component):
                         default_value=FormState.options[0],
                         default_value=FormState.options[0],
                     ),
                     ),
                     rx.text_area(name="text_area_input"),
                     rx.text_area(name="text_area_input"),
-                    rc.input_group(
-                        rc.input_left_element(rx.icon(tag="chevron_right")),
-                        rc.input(
-                            name="debounce_input",
-                            debounce_timeout=0,
-                            on_change=rx.console_log,
-                        ),
-                        rc.input_right_element(rx.icon(tag="chevron_left")),
-                    ),
-                    rc.button_group(
-                        rx.button("Submit", type_="submit"),
-                        rx.icon_button(FormState.val, icon=rx.icon(tag="plus")),
-                        variant="outline",
-                        is_attached=True,
+                    rx.input(
+                        name="debounce_input",
+                        debounce_timeout=0,
+                        on_change=rx.console_log,
                     ),
                     ),
+                    rx.button("Submit", type_="submit"),
+                    rx.icon_button(FormState.val, icon=rx.icon(tag="plus")),
                 ),
                 ),
                 on_submit=FormState.form_submit,
                 on_submit=FormState.form_submit,
                 custom_attrs={"action": "/invalid"},
                 custom_attrs={"action": "/invalid"},
@@ -152,16 +138,12 @@ def FormSubmitName(form_component):
         functools.partial(FormSubmitName, form_component="rx.form.root"),
         functools.partial(FormSubmitName, form_component="rx.form.root"),
         functools.partial(FormSubmit, form_component="rx.el.form"),
         functools.partial(FormSubmit, form_component="rx.el.form"),
         functools.partial(FormSubmitName, form_component="rx.el.form"),
         functools.partial(FormSubmitName, form_component="rx.el.form"),
-        functools.partial(FormSubmit, form_component="rc.form"),
-        functools.partial(FormSubmitName, form_component="rc.form"),
     ],
     ],
     ids=[
     ids=[
         "id-radix",
         "id-radix",
         "name-radix",
         "name-radix",
         "id-html",
         "id-html",
         "name-html",
         "name-html",
-        "id-chakra",
-        "name-chakra",
     ],
     ],
 )
 )
 def form_submit(request, tmp_path_factory) -> Generator[AppHarness, None, None]:
 def form_submit(request, tmp_path_factory) -> Generator[AppHarness, None, None]:
@@ -224,16 +206,6 @@ async def test_submit(driver, form_submit: AppHarness):
     name_input = driver.find_element(by, "name_input")
     name_input = driver.find_element(by, "name_input")
     name_input.send_keys("foo")
     name_input.send_keys("foo")
 
 
-    pin_inputs = driver.find_elements(By.CLASS_NAME, "chakra-pin-input")
-    pin_values = ["8", "1", "6", "4"]
-    for i, pin_input in enumerate(pin_inputs):
-        pin_input.send_keys(pin_values[i])
-
-    number_input = driver.find_element(By.CLASS_NAME, "chakra-numberinput")
-    buttons = number_input.find_elements(By.XPATH, "//div[@role='button']")
-    for _ in range(3):
-        buttons[1].click()
-
     checkbox_input = driver.find_element(By.XPATH, "//button[@role='checkbox']")
     checkbox_input = driver.find_element(By.XPATH, "//button[@role='checkbox']")
     checkbox_input.click()
     checkbox_input.click()
 
 
@@ -275,15 +247,12 @@ async def test_submit(driver, form_submit: AppHarness):
     print(form_data)
     print(form_data)
 
 
     assert form_data["name_input"] == "foo"
     assert form_data["name_input"] == "foo"
-    assert form_data["pin_input"] == pin_values
-    assert form_data["number_input"] == "-3"
     assert form_data["bool_input"]
     assert form_data["bool_input"]
     assert form_data["bool_input2"]
     assert form_data["bool_input2"]
     assert not form_data.get("bool_input3", False)
     assert not form_data.get("bool_input3", False)
     assert not form_data.get("bool_input4", False)
     assert not form_data.get("bool_input4", False)
 
 
     assert form_data["slider_input"] == "50"
     assert form_data["slider_input"] == "50"
-    assert form_data["range_input"] == ["25", "75"]
     assert form_data["radio_input"] == "option2"
     assert form_data["radio_input"] == "option2"
     assert form_data["select_input"] == "option1"
     assert form_data["select_input"] == "option1"
     assert form_data["text_area_input"] == "Some\nText"
     assert form_data["text_area_input"] == "Some\nText"

+ 4 - 6
integration/test_server_side_event.py

@@ -11,8 +11,6 @@ from reflex.testing import AppHarness
 
 
 def ServerSideEvent():
 def ServerSideEvent():
     """App with inputs set via event handlers and set_value."""
     """App with inputs set via event handlers and set_value."""
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class SSState(rx.State):
     class SSState(rx.State):
@@ -41,12 +39,12 @@ def ServerSideEvent():
     @app.add_page
     @app.add_page
     def index():
     def index():
         return rx.fragment(
         return rx.fragment(
-            rc.input(
+            rx.input(
                 id="token", value=SSState.router.session.client_token, is_read_only=True
                 id="token", value=SSState.router.session.client_token, is_read_only=True
             ),
             ),
-            rc.input(default_value="a", id="a"),
-            rc.input(default_value="b", id="b"),
-            rc.input(default_value="c", id="c"),
+            rx.input(default_value="a", id="a"),
+            rx.input(default_value="b", id="b"),
+            rx.input(default_value="c", id="c"),
             rx.button(
             rx.button(
                 "Clear Immediate",
                 "Clear Immediate",
                 id="clear_immediate",
                 id="clear_immediate",

+ 27 - 83
integration/test_table.py

@@ -10,89 +10,45 @@ from reflex.testing import AppHarness
 
 
 def Table():
 def Table():
     """App using table component."""
     """App using table component."""
-    from typing import List
-
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
-    class TableState(rx.State):
-        rows: List[List[str]] = [
-            ["John", "30", "New York"],
-            ["Jane", "31", "San Fransisco"],
-            ["Joe", "32", "Los Angeles"],
-        ]
-
-        headers: List[str] = ["Name", "Age", "Location"]
-
-        footers: List[str] = ["footer1", "footer2", "footer3"]
-
-        caption: str = "random caption"
-
     app = rx.App(state=rx.State)
     app = rx.App(state=rx.State)
 
 
     @app.add_page
     @app.add_page
     def index():
     def index():
         return rx.center(
         return rx.center(
-            rc.input(
+            rx.input(
                 id="token",
                 id="token",
-                value=TableState.router.session.client_token,
+                value=rx.State.router.session.client_token,
                 is_read_only=True,
                 is_read_only=True,
             ),
             ),
-            rc.table_container(
-                rc.table(
-                    headers=TableState.headers,
-                    rows=TableState.rows,
-                    footers=TableState.footers,
-                    caption=TableState.caption,
-                    variant="striped",
-                    color_scheme="blue",
-                    width="100%",
+            rx.table.root(
+                rx.table.header(
+                    rx.table.row(
+                        rx.table.column_header_cell("Name"),
+                        rx.table.column_header_cell("Age"),
+                        rx.table.column_header_cell("Location"),
+                    ),
                 ),
                 ),
-            ),
-        )
-
-    @app.add_page
-    def another():
-        return rx.center(
-            rc.table_container(
-                rc.table(  # type: ignore
-                    rc.thead(  # type: ignore
-                        rc.tr(  # type: ignore
-                            rc.th("Name"),
-                            rc.th("Age"),
-                            rc.th("Location"),
-                        )
+                rx.table.body(
+                    rx.table.row(
+                        rx.table.row_header_cell("John"),
+                        rx.table.cell(30),
+                        rx.table.cell("New York"),
                     ),
                     ),
-                    rc.tbody(  # type: ignore
-                        rc.tr(  # type: ignore
-                            rc.td("John"),
-                            rc.td(30),
-                            rc.td("New York"),
-                        ),
-                        rc.tr(  # type: ignore
-                            rc.td("Jane"),
-                            rc.td(31),
-                            rc.td("San Francisco"),
-                        ),
-                        rc.tr(  # type: ignore
-                            rc.td("Joe"),
-                            rc.td(32),
-                            rc.td("Los Angeles"),
-                        ),
+                    rx.table.row(
+                        rx.table.row_header_cell("Jane"),
+                        rx.table.cell(31),
+                        rx.table.cell("San Fransisco"),
                     ),
                     ),
-                    rc.tfoot(  # type: ignore
-                        rc.tr(
-                            rc.td("footer1"),
-                            rc.td("footer2"),
-                            rc.td("footer3"),
-                        )  # type: ignore
+                    rx.table.row(
+                        rx.table.row_header_cell("Joe"),
+                        rx.table.cell(32),
+                        rx.table.cell("Los Angeles"),
                     ),
                     ),
-                    rc.table_caption("random caption"),
-                    variant="striped",
-                    color_scheme="teal",
-                )
-            )
+                ),
+                width="100%",
+            ),
         )
         )
 
 
 
 
@@ -138,23 +94,20 @@ def driver(table: AppHarness):
         driver.quit()
         driver.quit()
 
 
 
 
-@pytest.mark.parametrize("route", ["", "/another"])
-def test_table(driver, table: AppHarness, route):
+def test_table(driver, table: AppHarness):
     """Test that a table component is rendered properly.
     """Test that a table component is rendered properly.
 
 
     Args:
     Args:
         driver: Selenium WebDriver open to the app
         driver: Selenium WebDriver open to the app
         table: Harness for Table app
         table: Harness for Table app
-        route: Page route or path.
     """
     """
-    driver.get(f"{table.frontend_url}/{route}")
     assert table.app_instance is not None, "app is not running"
     assert table.app_instance is not None, "app is not running"
 
 
     thead = driver.find_element(By.TAG_NAME, "thead")
     thead = driver.find_element(By.TAG_NAME, "thead")
     # poll till page is fully loaded.
     # poll till page is fully loaded.
     table.poll_for_content(element=thead)
     table.poll_for_content(element=thead)
     # check headers
     # check headers
-    assert thead.find_element(By.TAG_NAME, "tr").text == "NAME AGE LOCATION"
+    assert thead.find_element(By.TAG_NAME, "tr").text == "Name Age Location"
     # check first row value
     # check first row value
     assert (
     assert (
         driver.find_element(By.TAG_NAME, "tbody")
         driver.find_element(By.TAG_NAME, "tbody")
@@ -162,12 +115,3 @@ def test_table(driver, table: AppHarness, route):
         .text
         .text
         == "John 30 New York"
         == "John 30 New York"
     )
     )
-    # check footer
-    assert (
-        driver.find_element(By.TAG_NAME, "tfoot")
-        .find_element(By.TAG_NAME, "tr")
-        .text.lower()
-        == "footer1 footer2 footer3"
-    )
-    # check caption
-    assert driver.find_element(By.TAG_NAME, "caption").text == "random caption"

+ 1 - 3
integration/test_tailwind.py

@@ -27,8 +27,6 @@ def TailwindApp(
     """
     """
     from pathlib import Path
     from pathlib import Path
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class UnusedState(rx.State):
     class UnusedState(rx.State):
@@ -36,7 +34,7 @@ def TailwindApp(
 
 
     def index():
     def index():
         return rx.el.div(
         return rx.el.div(
-            rc.text(paragraph_text, class_name=paragraph_class_name),
+            rx.text(paragraph_text, class_name=paragraph_class_name),
             rx.el.p(paragraph_text, class_name=paragraph_class_name),
             rx.el.p(paragraph_text, class_name=paragraph_class_name),
             rx.text(paragraph_text, as_="p", class_name=paragraph_class_name),
             rx.text(paragraph_text, as_="p", class_name=paragraph_class_name),
             rx.el.div("Test external stylesheet", class_name="external"),
             rx.el.div("Test external stylesheet", class_name="external"),

+ 1 - 3
integration/test_upload.py

@@ -16,8 +16,6 @@ def UploadFile():
     """App for testing dynamic routes."""
     """App for testing dynamic routes."""
     from typing import Dict, List
     from typing import Dict, List
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
 
 
     class UploadState(rx.State):
     class UploadState(rx.State):
@@ -46,7 +44,7 @@ def UploadFile():
 
 
     def index():
     def index():
         return rx.vstack(
         return rx.vstack(
-            rc.input(
+            rx.input(
                 value=UploadState.router.session.client_token,
                 value=UploadState.router.session.client_token,
                 is_read_only=True,
                 is_read_only=True,
                 id="token",
                 id="token",

+ 1 - 6
integration/test_var_operations.py

@@ -14,8 +14,6 @@ def VarOperations():
     """App with var operations."""
     """App with var operations."""
     from typing import Dict, List
     from typing import Dict, List
 
 
-    import reflex_chakra as rc
-
     import reflex as rx
     import reflex as rx
     from reflex.ivars.base import LiteralVar
     from reflex.ivars.base import LiteralVar
     from reflex.ivars.sequence import ArrayVar
     from reflex.ivars.sequence import ArrayVar
@@ -552,10 +550,7 @@ def VarOperations():
                 VarOperationState.html_str,
                 VarOperationState.html_str,
                 id="html_str",
                 id="html_str",
             ),
             ),
-            rc.highlight(
-                "second",
-                query=[VarOperationState.str_var2],
-            ),
+            rx.el.mark("second"),
             rx.text(ArrayVar.range(2, 5).join(","), id="list_join_range1"),
             rx.text(ArrayVar.range(2, 5).join(","), id="list_join_range1"),
             rx.text(ArrayVar.range(2, 10, 2).join(","), id="list_join_range2"),
             rx.text(ArrayVar.range(2, 10, 2).join(","), id="list_join_range2"),
             rx.text(ArrayVar.range(5, 0, -1).join(","), id="list_join_range3"),
             rx.text(ArrayVar.range(5, 0, -1).join(","), id="list_join_range3"),

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 133 - 11
poetry.lock


+ 1 - 1
pyproject.toml

@@ -59,7 +59,7 @@ httpx = ">=0.25.1,<1.0"
 twine = ">=4.0.0,<6.0"
 twine = ">=4.0.0,<6.0"
 tomlkit = ">=0.12.4,<1.0"
 tomlkit = ">=0.12.4,<1.0"
 lazy_loader = ">=0.4"
 lazy_loader = ">=0.4"
-reflex-chakra = ">=0.6.0a"
+reflex-chakra = ">=0.6.0a6"
 
 
 [tool.poetry.group.dev.dependencies]
 [tool.poetry.group.dev.dependencies]
 pytest = ">=7.1.2,<8.0"
 pytest = ">=7.1.2,<8.0"

+ 1 - 1
reflex/.templates/jinja/web/pages/_app.js.jinja2

@@ -27,7 +27,7 @@ function AppWrap({children}) {
 
 
 export default function MyApp({ Component, pageProps }) {
 export default function MyApp({ Component, pageProps }) {
   return (
   return (
-    <ThemeProvider defaultTheme={ defaultColorMode } storageKey="chakra-ui-color-mode" attribute="class">
+    <ThemeProvider defaultTheme={ defaultColorMode } attribute="class">
       <AppWrap>
       <AppWrap>
         <StateProvider>
         <StateProvider>
           <EventLoopProvider>
           <EventLoopProvider>

+ 0 - 36
reflex/.templates/web/components/reflex/chakra_color_mode_provider.js

@@ -1,36 +0,0 @@
-import { useColorMode as chakraUseColorMode } from "@chakra-ui/react";
-import { useTheme } from "next-themes";
-import { useEffect, useState } from "react";
-import { ColorModeContext, defaultColorMode } from "/utils/context.js";
-
-export default function ChakraColorModeProvider({ children }) {
-  const { theme, resolvedTheme, setTheme } = useTheme();
-  const { colorMode, toggleColorMode } = chakraUseColorMode();
-  const [resolvedColorMode, setResolvedColorMode] = useState(colorMode);
-
-  useEffect(() => {
-    if (colorMode != resolvedTheme) {
-      toggleColorMode();
-    }
-    setResolvedColorMode(resolvedTheme);
-  }, [theme, resolvedTheme]);
-
-  const rawColorMode = colorMode;
-  const setColorMode = (mode) => {
-    const allowedModes = ["light", "dark", "system"];
-    if (!allowedModes.includes(mode)) {
-      console.error(
-        `Invalid color mode "${mode}". Defaulting to "${defaultColorMode}".`
-      );
-      mode = defaultColorMode;
-    }
-    setTheme(mode);
-  };
-  return (
-    <ColorModeContext.Provider
-      value={{ rawColorMode, resolvedColorMode, toggleColorMode, setColorMode }}
-    >
-      {children}
-    </ColorModeContext.Provider>
-  );
-}

+ 1 - 0
reflex/__init__.pyi

@@ -132,6 +132,7 @@ from .components.radix.themes.layout.container import container as container
 from .components.radix.themes.layout.flex import flex as flex
 from .components.radix.themes.layout.flex import flex as flex
 from .components.radix.themes.layout.grid import grid as grid
 from .components.radix.themes.layout.grid import grid as grid
 from .components.radix.themes.layout.list import list_item as list_item
 from .components.radix.themes.layout.list import list_item as list_item
+from .components.radix.themes.layout.list import list_ns as list  # noqa
 from .components.radix.themes.layout.list import ordered_list as ordered_list
 from .components.radix.themes.layout.list import ordered_list as ordered_list
 from .components.radix.themes.layout.list import unordered_list as unordered_list
 from .components.radix.themes.layout.list import unordered_list as unordered_list
 from .components.radix.themes.layout.section import section as section
 from .components.radix.themes.layout.section import section as section

+ 1 - 0
reflex/components/radix/__init__.pyi

@@ -55,6 +55,7 @@ from .themes.layout.container import container as container
 from .themes.layout.flex import flex as flex
 from .themes.layout.flex import flex as flex
 from .themes.layout.grid import grid as grid
 from .themes.layout.grid import grid as grid
 from .themes.layout.list import list_item as list_item
 from .themes.layout.list import list_item as list_item
+from .themes.layout.list import list_ns as list  # noqa
 from .themes.layout.list import ordered_list as ordered_list
 from .themes.layout.list import ordered_list as ordered_list
 from .themes.layout.list import unordered_list as unordered_list
 from .themes.layout.list import unordered_list as unordered_list
 from .themes.layout.section import section as section
 from .themes.layout.section import section as section

+ 0 - 20
reflex/components/radix/themes/base.py

@@ -262,26 +262,6 @@ class ThemePanel(RadixThemesComponent):
         """
         """
         return {"react": "useEffect"}
         return {"react": "useEffect"}
 
 
-    def add_hooks(self) -> list[str]:
-        """Add a hook on the ThemePanel to clear chakra-ui-color-mode.
-
-        Returns:
-            The hooks to render.
-        """
-        # The panel freezes the tab if the user color preference differs from the
-        # theme "appearance", so clear it out when theme panel is used.
-        return [
-            """
-            useEffect(() => {
-                if (typeof window !== 'undefined') {
-                    window.onbeforeunload = () => {
-                        localStorage.removeItem('chakra-ui-color-mode');
-                    }
-                    window.onbeforeunload();
-                }
-            }, [])"""
-        ]
-
 
 
 class RadixThemesColorModeProvider(Component):
 class RadixThemesColorModeProvider(Component):
     """Next-themes integration for radix themes components."""
     """Next-themes integration for radix themes components."""

+ 0 - 1
reflex/components/radix/themes/base.pyi

@@ -583,7 +583,6 @@ class Theme(RadixThemesComponent):
 
 
 class ThemePanel(RadixThemesComponent):
 class ThemePanel(RadixThemesComponent):
     def add_imports(self) -> dict[str, str]: ...
     def add_imports(self) -> dict[str, str]: ...
-    def add_hooks(self) -> list[str]: ...
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore

+ 1 - 0
reflex/components/radix/themes/layout/__init__.pyi

@@ -9,6 +9,7 @@ from .container import container as container
 from .flex import flex as flex
 from .flex import flex as flex
 from .grid import grid as grid
 from .grid import grid as grid
 from .list import list_item as list_item
 from .list import list_item as list_item
+from .list import list_ns as list  # noqa
 from .list import ordered_list as ordered_list
 from .list import ordered_list as ordered_list
 from .list import unordered_list as unordered_list
 from .list import unordered_list as unordered_list
 from .section import section as section
 from .section import section as section

+ 0 - 1
reflex/style.py

@@ -290,7 +290,6 @@ def _format_emotion_style_pseudo_selector(key: str) -> str:
     """
     """
     prefix = None
     prefix = None
     if key.startswith("_"):
     if key.startswith("_"):
-        # Handle pseudo selectors in chakra style format.
         prefix = "&:"
         prefix = "&:"
         key = key[1:]
         key = key[1:]
     if key.startswith(":"):
     if key.startswith(":"):

+ 7 - 1
reflex/utils/pyi_generator.py

@@ -903,7 +903,13 @@ class PyiGenerator:
             # construct the import statement and handle special cases for aliases
             # construct the import statement and handle special cases for aliases
             sub_mod_attrs_imports = [
             sub_mod_attrs_imports = [
                 f"from .{path} import {mod if not isinstance(mod, tuple) else mod[0]} as {mod if not isinstance(mod, tuple) else mod[1]}"
                 f"from .{path} import {mod if not isinstance(mod, tuple) else mod[0]} as {mod if not isinstance(mod, tuple) else mod[1]}"
-                + ("  # type: ignore" if mod in pyright_ignore_imports else "")
+                + (
+                    "  # type: ignore"
+                    if mod in pyright_ignore_imports
+                    else "  # noqa"  # ignore ruff formatting here for cases like rx.list.
+                    if isinstance(mod, tuple)
+                    else ""
+                )
                 for mod, path in sub_mod_attrs.items()
                 for mod, path in sub_mod_attrs.items()
             ]
             ]
             sub_mod_attrs_imports.append("")
             sub_mod_attrs_imports.append("")

+ 0 - 177
tests/components/datadisplay/test_table.py

@@ -1,177 +0,0 @@
-import sys
-from typing import List, Tuple
-
-import pytest
-from reflex_chakra.components.datadisplay.table import Tbody, Tfoot, Thead
-
-from reflex.state import BaseState
-
-PYTHON_GT_V38 = sys.version_info.major >= 3 and sys.version_info.minor > 8
-
-
-class TableState(BaseState):
-    """Test State class."""
-
-    rows_List_List_str: List[List[str]] = [["random", "row"]]
-    rows_List_List: List[List] = [["random", "row"]]
-    rows_List_str: List[str] = ["random", "row"]
-    rows_Tuple_List_str: Tuple[List[str]] = (["random", "row"],)
-    rows_Tuple_List: Tuple[List] = ["random", "row"]  # type: ignore
-    rows_Tuple_str_str: Tuple[str, str] = (
-        "random",
-        "row",
-    )
-    rows_Tuple_Tuple_str_str: Tuple[Tuple[str, str]] = (
-        (
-            "random",
-            "row",
-        ),
-    )
-    rows_Tuple_Tuple: Tuple[Tuple] = (
-        (
-            "random",
-            "row",
-        ),
-    )
-    rows_str: str = "random, row"
-    headers_List_str: List[str] = ["header1", "header2"]
-    headers_Tuple_str_str: Tuple[str, str] = (
-        "header1",
-        "header2",
-    )
-    headers_str: str = "headers1, headers2"
-    footers_List_str: List[str] = ["footer1", "footer2"]
-    footers_Tuple_str_str: Tuple[str, str] = (
-        "footer1",
-        "footer2",
-    )
-    footers_str: str = "footer1, footer2"
-
-    if sys.version_info.major >= 3 and sys.version_info.minor > 8:
-        rows_list_list_str: list[list[str]] = [["random", "row"]]
-        rows_list_list: list[list] = [["random", "row"]]
-        rows_list_str: list[str] = ["random", "row"]
-        rows_tuple_list_str: tuple[list[str]] = (["random", "row"],)
-        rows_tuple_list: tuple[list] = ["random", "row"]  # type: ignore
-        rows_tuple_str_str: tuple[str, str] = (
-            "random",
-            "row",
-        )
-        rows_tuple_tuple_str_str: tuple[tuple[str, str]] = (
-            (
-                "random",
-                "row",
-            ),
-        )
-        rows_tuple_tuple: tuple[tuple] = (
-            (
-                "random",
-                "row",
-            ),
-        )
-
-
-valid_extras = (
-    [
-        TableState.rows_list_list_str,
-        TableState.rows_list_list,
-        TableState.rows_tuple_list_str,
-        TableState.rows_tuple_list,
-        TableState.rows_tuple_tuple_str_str,
-        TableState.rows_tuple_tuple,
-    ]
-    if PYTHON_GT_V38
-    else []
-)
-invalid_extras = (
-    [TableState.rows_list_str, TableState.rows_tuple_str_str] if PYTHON_GT_V38 else []
-)
-
-
-@pytest.mark.parametrize(
-    "rows",
-    [
-        [["random", "row"]],
-        TableState.rows_List_List_str,
-        TableState.rows_List_List,
-        TableState.rows_Tuple_List_str,
-        TableState.rows_Tuple_List,
-        TableState.rows_Tuple_Tuple_str_str,
-        TableState.rows_Tuple_Tuple,
-        *valid_extras,
-    ],
-)
-def test_create_table_body_with_valid_rows_prop(rows):
-    render_dict = Tbody.create(rows=rows).render()
-    assert render_dict["name"] == "Tbody"
-    assert len(render_dict["children"]) == 1
-
-
-@pytest.mark.parametrize(
-    "rows",
-    [
-        ["random", "row"],
-        "random, rows",
-        TableState.rows_List_str,
-        TableState.rows_Tuple_str_str,
-        TableState.rows_str,
-        *invalid_extras,
-    ],
-)
-def test_create_table_body_with_invalid_rows_prop(rows):
-    with pytest.raises(TypeError):
-        Tbody.create(rows=rows)
-
-
-@pytest.mark.parametrize(
-    "headers",
-    [
-        ["random", "header"],
-        TableState.headers_List_str,
-        TableState.headers_Tuple_str_str,
-    ],
-)
-def test_create_table_head_with_valid_headers_prop(headers):
-    render_dict = Thead.create(headers=headers).render()
-    assert render_dict["name"] == "Thead"
-    assert len(render_dict["children"]) == 1
-    assert render_dict["children"][0]["name"] == "Tr"
-
-
-@pytest.mark.parametrize(
-    "headers",
-    [
-        "random, header",
-        TableState.headers_str,
-    ],
-)
-def test_create_table_head_with_invalid_headers_prop(headers):
-    with pytest.raises(TypeError):
-        Thead.create(headers=headers)
-
-
-@pytest.mark.parametrize(
-    "footers",
-    [
-        ["random", "footers"],
-        TableState.footers_List_str,
-        TableState.footers_Tuple_str_str,
-    ],
-)
-def test_create_table_footer_with_valid_footers_prop(footers):
-    render_dict = Tfoot.create(footers=footers).render()
-    assert render_dict["name"] == "Tfoot"
-    assert len(render_dict["children"]) == 1
-    assert render_dict["children"][0]["name"] == "Tr"
-
-
-@pytest.mark.parametrize(
-    "footers",
-    [
-        "random, footers",
-        TableState.footers_str,
-    ],
-)
-def test_create_table_footer_with_invalid_footers_prop(footers):
-    with pytest.raises(TypeError):
-        Tfoot.create(footers=footers)

+ 1 - 2
tests/components/forms/test_form.py

@@ -1,5 +1,4 @@
-from reflex_chakra.components.forms.form import Form
-
+from reflex.components.radix.primitives.form import Form
 from reflex.event import EventChain
 from reflex.event import EventChain
 from reflex.ivars.base import ImmutableVar
 from reflex.ivars.base import ImmutableVar
 
 

+ 0 - 55
tests/components/media/test_icon.py

@@ -1,55 +0,0 @@
-import pytest
-from reflex_chakra.components.media.icon import ICON_LIST, Icon
-
-from reflex.utils import format
-
-
-def test_no_tag_errors():
-    """Test that an icon without a tag raises an error."""
-    with pytest.raises(AttributeError):
-        Icon.create()
-
-
-def test_children_errors():
-    """Test that an icon with children raises an error."""
-    with pytest.raises(AttributeError):
-        Icon.create("child", tag="search")
-
-
-@pytest.mark.parametrize(
-    "tag",
-    ICON_LIST,
-)
-def test_valid_icon(tag: str):
-    """Test that a valid icon does not raise an error.
-
-    Args:
-        tag: The icon tag.
-    """
-    icon = Icon.create(tag=tag)
-    assert icon.tag == format.to_title_case(tag) + "Icon"
-
-
-@pytest.mark.parametrize("tag", ["", " ", "invalid", 123])
-def test_invalid_icon(tag):
-    """Test that an invalid icon raises an error.
-
-    Args:
-        tag: The icon tag.
-    """
-    with pytest.raises(ValueError):
-        Icon.create(tag=tag)
-
-
-@pytest.mark.parametrize(
-    "tag",
-    ["Check", "Close", "eDit"],
-)
-def test_tag_with_capital(tag: str):
-    """Test that an icon that tag with capital does not raise an error.
-
-    Args:
-        tag: The icon tag.
-    """
-    icon = Icon.create(tag=tag)
-    assert icon.tag == format.to_title_case(tag) + "Icon"

+ 3 - 4
tests/components/test_component.py

@@ -2,8 +2,6 @@ from contextlib import nullcontext
 from typing import Any, Dict, List, Optional, Type, Union
 from typing import Any, Dict, List, Optional, Type, Union
 
 
 import pytest
 import pytest
-import reflex_chakra as rc
-from reflex_chakra.components.layout.box import Box
 
 
 import reflex as rx
 import reflex as rx
 from reflex.base import Base
 from reflex.base import Base
@@ -16,6 +14,7 @@ from reflex.components.component import (
     StatefulComponent,
     StatefulComponent,
     custom_component,
     custom_component,
 )
 )
+from reflex.components.radix.themes.layout.box import Box
 from reflex.constants import EventTriggers
 from reflex.constants import EventTriggers
 from reflex.event import EventChain, EventHandler, parse_args_spec
 from reflex.event import EventChain, EventHandler, parse_args_spec
 from reflex.ivars.base import ImmutableVar, LiteralVar
 from reflex.ivars.base import ImmutableVar, LiteralVar
@@ -1114,8 +1113,8 @@ def test_component_with_only_valid_children(fixture, request):
     [
     [
         (rx.text("hi"), '<RadixThemesText as={"p"}>\n  {"hi"}\n</RadixThemesText>'),
         (rx.text("hi"), '<RadixThemesText as={"p"}>\n  {"hi"}\n</RadixThemesText>'),
         (
         (
-            rx.box(rc.heading("test", size="md")),
-            '<RadixThemesBox>\n  <Heading size={"md"}>\n  {"test"}\n</Heading>\n</RadixThemesBox>',
+            rx.box(rx.heading("test", size="3")),
+            '<RadixThemesBox>\n  <RadixThemesHeading size={"3"}>\n  {"test"}\n</RadixThemesHeading>\n</RadixThemesBox>',
         ),
         ),
     ],
     ],
 )
 )

+ 1 - 4
tests/components/typography/test_markdown.py

@@ -1,5 +1,4 @@
 import pytest
 import pytest
-import reflex_chakra as rc
 
 
 import reflex as rx
 import reflex as rx
 from reflex.components.markdown import Markdown
 from reflex.components.markdown import Markdown
@@ -37,9 +36,7 @@ def test_get_component(tag, expected):
 def test_set_component_map():
 def test_set_component_map():
     """Test setting the component map."""
     """Test setting the component map."""
     component_map = {
     component_map = {
-        "h1": lambda value: rx.box(
-            rc.heading(value, as_="h1", size="2xl"), padding="1em"
-        ),
+        "h1": lambda value: rx.box(rx.heading(value, as_="h1"), padding="1em"),
         "p": lambda value: rx.box(rx.text(value), padding="1em"),
         "p": lambda value: rx.box(rx.text(value), padding="1em"),
     }
     }
     md = Markdown.create("# Hello", component_map=component_map)
     md = Markdown.create("# Hello", component_map=component_map)

+ 8 - 11
tests/test_app.py

@@ -13,7 +13,6 @@ from typing import Generator, List, Tuple, Type
 from unittest.mock import AsyncMock
 from unittest.mock import AsyncMock
 
 
 import pytest
 import pytest
-import reflex_chakra as rc
 import sqlmodel
 import sqlmodel
 from fastapi import FastAPI, UploadFile
 from fastapi import FastAPI, UploadFile
 from starlette_admin.auth import AuthProvider
 from starlette_admin.auth import AuthProvider
@@ -1311,13 +1310,13 @@ def test_app_wrap_priority(compilable_app: tuple[App, Path]):
         tag = "Fragment1"
         tag = "Fragment1"
 
 
         def _get_app_wrap_components(self) -> dict[tuple[int, str], Component]:
         def _get_app_wrap_components(self) -> dict[tuple[int, str], Component]:
-            return {(99, "Box"): rc.box()}
+            return {(99, "Box"): rx.box()}
 
 
     class Fragment2(Component):
     class Fragment2(Component):
         tag = "Fragment2"
         tag = "Fragment2"
 
 
         def _get_app_wrap_components(self) -> dict[tuple[int, str], Component]:
         def _get_app_wrap_components(self) -> dict[tuple[int, str], Component]:
-            return {(50, "Text"): rc.text()}
+            return {(50, "Text"): rx.text()}
 
 
     class Fragment3(Component):
     class Fragment3(Component):
         tag = "Fragment3"
         tag = "Fragment3"
@@ -1337,19 +1336,17 @@ def test_app_wrap_priority(compilable_app: tuple[App, Path]):
     assert (
     assert (
         "function AppWrap({children}) {"
         "function AppWrap({children}) {"
         "return ("
         "return ("
-        "<Box>"
-        "<ChakraProvider theme={extendTheme(theme)}>"
-        "<ChakraColorModeProvider>"
-        "<Text>"
+        "<RadixThemesBox>"
+        '<RadixThemesText as={"p"}>'
+        "<RadixThemesColorModeProvider>"
         "<Fragment2>"
         "<Fragment2>"
         "<Fragment>"
         "<Fragment>"
         "{children}"
         "{children}"
         "</Fragment>"
         "</Fragment>"
         "</Fragment2>"
         "</Fragment2>"
-        "</Text>"
-        "</ChakraColorModeProvider>"
-        "</ChakraProvider>"
-        "</Box>"
+        "</RadixThemesColorModeProvider>"
+        "</RadixThemesText>"
+        "</RadixThemesBox>"
         ")"
         ")"
         "}"
         "}"
     ) in "".join(app_js_lines)
     ) in "".join(app_js_lines)

Vissa filer visades inte eftersom för många filer har ändrats