Bläddra i källkod

[REF-1158] Move chakra-only deps to chakra lib (#2171)

Masen Furer 1 år sedan
förälder
incheckning
0c55723df4

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

@@ -3,6 +3,8 @@
 {% block declaration %}
 {% block declaration %}
 import { EventLoopProvider, StateProvider } from "/utils/context.js";
 import { EventLoopProvider, StateProvider } from "/utils/context.js";
 import { ThemeProvider } from 'next-themes'
 import { ThemeProvider } from 'next-themes'
+import '/styles/styles.css'
+
 
 
 {% for custom_code in custom_codes %}
 {% for custom_code in custom_codes %}
 {{custom_code}}
 {{custom_code}}

+ 0 - 1
reflex/app.py

@@ -563,7 +563,6 @@ class App(Base):
             for i, tags in imports.items()
             for i, tags in imports.items()
             if i
             if i
             not in [
             not in [
-                *compiler.DEFAULT_IMPORTS.keys(),
                 *constants.PackageJson.DEPENDENCIES.keys(),
                 *constants.PackageJson.DEPENDENCIES.keys(),
                 *constants.PackageJson.DEV_DEPENDENCIES.keys(),
                 *constants.PackageJson.DEV_DEPENDENCIES.keys(),
             ]
             ]

+ 2 - 8
reflex/compiler/compiler.py

@@ -16,12 +16,7 @@ from reflex.components.component import (
 )
 )
 from reflex.config import get_config
 from reflex.config import get_config
 from reflex.state import State
 from reflex.state import State
-from reflex.utils.imports import ImportDict, ImportVar
-
-# Imports to be included in every Reflex app.
-DEFAULT_IMPORTS: ImportDict = {
-    "": [ImportVar(tag="focus-visible/dist/focus-visible", install=False)],
-}
+from reflex.utils.imports import ImportVar
 
 
 
 
 def _compile_document_root(root: Component) -> str:
 def _compile_document_root(root: Component) -> str:
@@ -103,8 +98,7 @@ def _compile_page(
     Returns:
     Returns:
         The compiled component.
         The compiled component.
     """
     """
-    # Merge the default imports with the app-specific imports.
-    imports = utils.merge_imports(DEFAULT_IMPORTS, component.get_imports())
+    imports = component.get_imports()
     imports = utils.compile_imports(imports)
     imports = utils.compile_imports(imports)
 
 
     # Compile the code to render the component.
     # Compile the code to render the component.

+ 6 - 4
reflex/components/base/app_wrap.py

@@ -1,10 +1,10 @@
 """Top-level component that wraps the entire app."""
 """Top-level component that wraps the entire app."""
 from reflex.components.component import Component
 from reflex.components.component import Component
+from reflex.components.layout.fragment import Fragment
+from reflex.vars import Var
 
 
-from .bare import Bare
 
 
-
-class AppWrap(Bare):
+class AppWrap(Fragment):
     """Top-level component that wraps the entire app."""
     """Top-level component that wraps the entire app."""
 
 
     @classmethod
     @classmethod
@@ -14,4 +14,6 @@ class AppWrap(Bare):
         Returns:
         Returns:
             A new AppWrap component containing {children}.
             A new AppWrap component containing {children}.
         """
         """
-        return super().create(contents="{children}")
+        return super().create(
+            Var.create("{children}", _var_is_local=False, _var_is_string=False)
+        )

+ 3 - 3
reflex/components/base/app_wrap.pyi

@@ -8,15 +8,15 @@ from reflex.vars import Var, BaseVar, ComputedVar
 from reflex.event import EventChain, EventHandler, EventSpec
 from reflex.event import EventChain, EventHandler, EventSpec
 from reflex.style import Style
 from reflex.style import Style
 from reflex.components.component import Component
 from reflex.components.component import Component
-from .bare import Bare
+from reflex.components.layout.fragment import Fragment
+from reflex.vars import Var
 
 
-class AppWrap(Bare):
+class AppWrap(Fragment):
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore
         cls,
         cls,
         *children,
         *children,
-        contents: Optional[Union[Var[str], str]] = None,
         style: Optional[Style] = None,
         style: Optional[Style] = None,
         key: Optional[Any] = None,
         key: Optional[Any] = None,
         id: Optional[Any] = None,
         id: Optional[Any] = None,

+ 1 - 1
reflex/components/component.py

@@ -591,7 +591,7 @@ class Component(BaseComponent, ABC):
         Returns:
         Returns:
             The dictionary of the component style as value and the style notation as key.
             The dictionary of the component style as value and the style notation as key.
         """
         """
-        return {"sx": self.style}
+        return {"style": self.style}
 
 
     def render(self) -> Dict:
     def render(self) -> Dict:
         """Render the component.
         """Render the component.

+ 1 - 29
reflex/components/el/element.py

@@ -1,39 +1,11 @@
 """Base class definition for raw HTML elements."""
 """Base class definition for raw HTML elements."""
 
 
-from typing import Dict
 
 
 from reflex.components.component import Component
 from reflex.components.component import Component
 
 
 
 
 class Element(Component):
 class Element(Component):
-    """The base class for all raw HTML elements.
-
-    The key difference between `Element` and `Component` is that elements do not
-    use Chakra's `sx` prop, instead passing styles directly to the React style
-    prop.
-    """
-
-    def render(self) -> Dict:
-        """Render the element.
-
-        Returns:
-            The code to render the element.
-        """
-        tag = self._render()
-        return dict(
-            tag.add_props(
-                **self.event_triggers,
-                key=self.key,
-                id=self.id,
-                style=self.style,
-                class_name=self.class_name,
-                **self.custom_attrs,
-            ).set(
-                contents=str(tag.contents),
-                children=[child.render() for child in self.children],
-                props=tag.format_props(),
-            )
-        )
+    """The base class for all raw HTML elements."""
 
 
     def __eq__(self, other):
     def __eq__(self, other):
         """Two elements are equal if they have the same tag.
         """Two elements are equal if they have the same tag.

+ 0 - 2
reflex/components/el/element.pyi

@@ -7,11 +7,9 @@ from typing import Any, Dict, Literal, Optional, Union, overload
 from reflex.vars import Var, BaseVar, ComputedVar
 from reflex.vars import Var, BaseVar, ComputedVar
 from reflex.event import EventChain, EventHandler, EventSpec
 from reflex.event import EventChain, EventHandler, EventSpec
 from reflex.style import Style
 from reflex.style import Style
-from typing import Dict
 from reflex.components.component import Component
 from reflex.components.component import Component
 
 
 class Element(Component):
 class Element(Component):
-    def render(self) -> Dict: ...
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore

+ 3 - 1
reflex/components/forms/debounce.py

@@ -113,7 +113,9 @@ class DebounceInput(Component):
             ),
             ),
         )
         )
 
 
-        return super().create(**props)
+        component = super().create(**props)
+        component._get_style = child._get_style
+        return component
 
 
     def get_event_triggers(self) -> dict[str, Any]:
     def get_event_triggers(self) -> dict[str, Any]:
         """Get the event triggers that pass the component's value to the handler.
         """Get the event triggers that pass the component's value to the handler.

+ 29 - 2
reflex/components/libs/chakra.py

@@ -15,6 +15,7 @@ class ChakraComponent(Component):
     library = "@chakra-ui/react@2.6.1"
     library = "@chakra-ui/react@2.6.1"
     lib_dependencies: List[str] = [
     lib_dependencies: List[str] = [
         "@chakra-ui/system@2.5.7",
         "@chakra-ui/system@2.5.7",
+        "focus-visible@5.2.0",
         "framer-motion@10.16.4",
         "framer-motion@10.16.4",
     ]
     ]
 
 
@@ -25,6 +26,33 @@ class ChakraComponent(Component):
             (60, "ChakraProvider"): chakra_provider,
             (60, "ChakraProvider"): chakra_provider,
         }
         }
 
 
+    def get_imports(self) -> imports.ImportDict:
+        """Chakra requires focus-visible and imported into each page.
+
+        This allows the GlobalStyle defined by the ChakraProvider to hide the blue border.
+
+        Returns:
+            The imports for the component.
+        """
+        return imports.merge_imports(
+            super().get_imports(),
+            {
+                "": {
+                    imports.ImportVar(
+                        tag="focus-visible/dist/focus-visible", install=False
+                    )
+                }
+            },
+        )
+
+    def _get_style(self) -> dict:
+        """Get the style for the component.
+
+        Returns:
+            The dictionary of the component style as value and the style notation as key.
+        """
+        return {"sx": self.style}
+
     @classmethod
     @classmethod
     @lru_cache(maxsize=None)
     @lru_cache(maxsize=None)
     def _get_dependencies_imports(cls) -> imports.ImportDict:
     def _get_dependencies_imports(cls) -> imports.ImportDict:
@@ -37,6 +65,7 @@ class ChakraComponent(Component):
             dep: [imports.ImportVar(tag=None, render=False)]
             dep: [imports.ImportVar(tag=None, render=False)]
             for dep in [
             for dep in [
                 "@chakra-ui/system@2.5.7",
                 "@chakra-ui/system@2.5.7",
+                "focus-visible@5.2.0",
                 "framer-motion@10.16.4",
                 "framer-motion@10.16.4",
             ]
             ]
         }
         }
@@ -89,8 +118,6 @@ class ChakraProvider(ChakraComponent):
 
 
     def _get_custom_code(self) -> str | None:
     def _get_custom_code(self) -> str | None:
         return """
         return """
-import '/styles/styles.css'
-
 const GlobalStyles = css`
 const GlobalStyles = css`
   /* Hide the blue border around Chakra components. */
   /* Hide the blue border around Chakra components. */
   .js-focus-visible :focus:not([data-focus-visible-added]) {
   .js-focus-visible :focus:not([data-focus-visible-added]) {

+ 1 - 0
reflex/components/libs/chakra.pyi

@@ -14,6 +14,7 @@ from reflex.utils import imports
 from reflex.vars import Var
 from reflex.vars import Var
 
 
 class ChakraComponent(Component):
 class ChakraComponent(Component):
+    def get_imports(self) -> imports.ImportDict: ...
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore

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

@@ -72,9 +72,6 @@ class RadixThemesComponent(Component):
             (45, "RadixThemesColorModeProvider"): RadixThemesColorModeProvider.create(),
             (45, "RadixThemesColorModeProvider"): RadixThemesColorModeProvider.create(),
         }
         }
 
 
-    def _get_style(self) -> dict:
-        return {"style": self.style}
-
 
 
 LiteralAccentColor = Literal[
 LiteralAccentColor = Literal[
     "tomato",
     "tomato",

+ 0 - 2
reflex/constants/installer.py

@@ -103,8 +103,6 @@ class PackageJson(SimpleNamespace):
 
 
     DEPENDENCIES = {
     DEPENDENCIES = {
         "axios": "1.4.0",
         "axios": "1.4.0",
-        "focus-visible": "5.2.0",
-        "framer-motion": "10.16.4",
         "json5": "2.2.3",
         "json5": "2.2.3",
         "next": "14.0.1",
         "next": "14.0.1",
         "next-sitemap": "4.1.8",
         "next-sitemap": "4.1.8",

+ 4 - 0
tests/test_app.py

@@ -1210,7 +1210,9 @@ def test_app_wrap_compile_theme(compilable_app):
         "function AppWrap({children}) {"
         "function AppWrap({children}) {"
         "return ("
         "return ("
         "<RadixThemesTheme accentColor={`plum`}>"
         "<RadixThemesTheme accentColor={`plum`}>"
+        "<Fragment>"
         "{children}"
         "{children}"
+        "</Fragment>"
         "</RadixThemesTheme>"
         "</RadixThemesTheme>"
         ")"
         ")"
         "}"
         "}"
@@ -1261,7 +1263,9 @@ def test_app_wrap_priority(compilable_app):
         "<ChakraColorModeProvider>"
         "<ChakraColorModeProvider>"
         "<Text>"
         "<Text>"
         "<Fragment2>"
         "<Fragment2>"
+        "<Fragment>"
         "{children}"
         "{children}"
+        "</Fragment>"
         "</Fragment2>"
         "</Fragment2>"
         "</Text>"
         "</Text>"
         "</ChakraColorModeProvider>"
         "</ChakraColorModeProvider>"