Browse Source

Radix Themes + Tailwind Harmony (#3355)

Masen Furer 11 months ago
parent
commit
ac1c660bf0

+ 1 - 0
reflex/.templates/web/postcss.config.js

@@ -1,5 +1,6 @@
 module.exports = {
 module.exports = {
   plugins: {
   plugins: {
+    "postcss-import": {},
     tailwindcss: {},
     tailwindcss: {},
     autoprefixer: {},
     autoprefixer: {},
   },
   },

+ 4 - 1
reflex/.templates/web/styles/tailwind.css

@@ -1,3 +1,6 @@
-@tailwind base;
+@import "tailwindcss/base";
+
+@import "@radix-ui/themes/styles.css";
+
 @tailwind components;
 @tailwind components;
 @tailwind utilities;
 @tailwind utilities;

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

@@ -6,7 +6,8 @@ from typing import Any, Dict, Literal
 
 
 from reflex.components import Component
 from reflex.components import Component
 from reflex.components.tags import Tag
 from reflex.components.tags import Tag
-from reflex.utils import imports
+from reflex.config import get_config
+from reflex.utils.imports import ImportVar
 from reflex.vars import Var
 from reflex.vars import Var
 
 
 LiteralAlign = Literal["start", "center", "end", "baseline", "stretch"]
 LiteralAlign = Literal["start", "center", "end", "baseline", "stretch"]
@@ -208,18 +209,23 @@ class Theme(RadixThemesComponent):
             children = [ThemePanel.create(), *children]
             children = [ThemePanel.create(), *children]
         return super().create(*children, **props)
         return super().create(*children, **props)
 
 
-    def _get_imports(self) -> imports.ImportDict:
-        return imports.merge_imports(
-            super()._get_imports(),
-            {
-                "": [
-                    imports.ImportVar(tag="@radix-ui/themes/styles.css", install=False)
-                ],
-                "/utils/theme.js": [
-                    imports.ImportVar(tag="theme", is_default=True),
-                ],
-            },
-        )
+    def add_imports(self) -> dict[str, list[ImportVar] | ImportVar]:
+        """Add imports for the Theme component.
+
+        Returns:
+            The import dict.
+        """
+        _imports: dict[str, list[ImportVar] | ImportVar] = {
+            "/utils/theme.js": [ImportVar(tag="theme", is_default=True)],
+        }
+        if get_config().tailwind is None:
+            # When tailwind is disabled, import the radix-ui styles directly because they will
+            # not be included in the tailwind.css file.
+            _imports[""] = ImportVar(
+                tag="@radix-ui/themes/styles.css",
+                install=False,
+            )
+        return _imports
 
 
     def _render(self, props: dict[str, Any] | None = None) -> Tag:
     def _render(self, props: dict[str, Any] | None = None) -> Tag:
         tag = super()._render(props)
         tag = super()._render(props)
@@ -243,13 +249,13 @@ class ThemePanel(RadixThemesComponent):
     # Whether the panel is open. Defaults to False.
     # Whether the panel is open. Defaults to False.
     default_open: Var[bool]
     default_open: Var[bool]
 
 
-    def _get_imports(self) -> dict[str, list[imports.ImportVar]]:
-        return imports.merge_imports(
-            super()._get_imports(),
-            {
-                "react": [imports.ImportVar(tag="useEffect")],
-            },
-        )
+    def add_imports(self) -> dict[str, str]:
+        """Add imports for the ThemePanel component.
+
+        Returns:
+            The import dict.
+        """
+        return {"react": "useEffect"}
 
 
     def _get_hooks(self) -> str | None:
     def _get_hooks(self) -> str | None:
         # The panel freezes the tab if the user color preference differs from the
         # The panel freezes the tab if the user color preference differs from the

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

@@ -10,7 +10,8 @@ from reflex.style import Style
 from typing import Any, Dict, Literal
 from typing import Any, Dict, Literal
 from reflex.components import Component
 from reflex.components import Component
 from reflex.components.tags import Tag
 from reflex.components.tags import Tag
-from reflex.utils import imports
+from reflex.config import get_config
+from reflex.utils.imports import ImportVar
 from reflex.vars import Var
 from reflex.vars import Var
 
 
 LiteralAlign = Literal["start", "center", "end", "baseline", "stretch"]
 LiteralAlign = Literal["start", "center", "end", "baseline", "stretch"]
@@ -579,8 +580,10 @@ class Theme(RadixThemesComponent):
             A new component instance.
             A new component instance.
         """
         """
         ...
         ...
+    def add_imports(self) -> dict[str, list[ImportVar] | ImportVar]: ...
 
 
 class ThemePanel(RadixThemesComponent):
 class ThemePanel(RadixThemesComponent):
+    def add_imports(self) -> dict[str, str]: ...
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore

+ 1 - 0
reflex/constants/installer.py

@@ -123,4 +123,5 @@ class PackageJson(SimpleNamespace):
     DEV_DEPENDENCIES = {
     DEV_DEPENDENCIES = {
         "autoprefixer": "10.4.14",
         "autoprefixer": "10.4.14",
         "postcss": "8.4.31",
         "postcss": "8.4.31",
+        "postcss-import": "16.1.0",
     }
     }