diff --git a/demo/rxconfig.py b/demo/rxconfig.py index ee62e37..53b28a1 100644 --- a/demo/rxconfig.py +++ b/demo/rxconfig.py @@ -3,5 +3,8 @@ config = rx.Config( app_name="demo", telemetry_enabled=False, - plugins=[rx.plugins.TailwindV4Plugin()], + plugins=[ + rx.plugins.SitemapPlugin(), + rx.plugins.TailwindV4Plugin(), + ], ) diff --git a/reflex_ui/__init__.py b/reflex_ui/__init__.py index 68a6459..aa7d0d6 100644 --- a/reflex_ui/__init__.py +++ b/reflex_ui/__init__.py @@ -15,6 +15,7 @@ "components.base.menu": ["menu"], "components.base.navigation_menu": ["navigation_menu"], "components.base.popover": ["popover"], + "components.base.preview_card": ["preview_card"], "components.base.scroll_area": ["scroll_area"], "components.base.select": ["select"], "components.base.skeleton": ["skeleton"], diff --git a/reflex_ui/__init__.pyi b/reflex_ui/__init__.pyi index 5ffd8ca..2032ebe 100644 --- a/reflex_ui/__init__.pyi +++ b/reflex_ui/__init__.pyi @@ -17,6 +17,7 @@ from .components.base.link import link from .components.base.menu import menu from .components.base.navigation_menu import navigation_menu from .components.base.popover import popover +from .components.base.preview_card import preview_card from .components.base.scroll_area import scroll_area from .components.base.select import select from .components.base.skeleton import skeleton @@ -44,6 +45,7 @@ _REFLEX_UI_MAPPING = { "components.base.menu": ["menu"], "components.base.navigation_menu": ["navigation_menu"], "components.base.popover": ["popover"], + "components.base.preview_card": ["preview_card"], "components.base.scroll_area": ["scroll_area"], "components.base.select": ["select"], "components.base.skeleton": ["skeleton"], @@ -82,6 +84,7 @@ __all__ = [ "menu", "navigation_menu", "popover", + "preview_card", "scroll_area", "select", "skeleton", diff --git a/reflex_ui/components/base/__init__.pyi b/reflex_ui/components/base/__init__.pyi index 2436a31..5308070 100644 --- a/reflex_ui/components/base/__init__.pyi +++ b/reflex_ui/components/base/__init__.pyi @@ -17,6 +17,7 @@ from .link import link from .menu import menu from .navigation_menu import navigation_menu from .popover import popover +from .preview_card import preview_card from .scroll_area import scroll_area from .select import select from .skeleton import skeleton @@ -46,6 +47,7 @@ __all__ = [ "menu", "navigation_menu", "popover", + "preview_card", "scroll_area", "select", "skeleton", diff --git a/reflex_ui/components/base/preview_card.py b/reflex_ui/components/base/preview_card.py new file mode 100644 index 0000000..095a39b --- /dev/null +++ b/reflex_ui/components/base/preview_card.py @@ -0,0 +1,280 @@ +"""Custom preview card component.""" + +from typing import Literal + +from reflex.components.component import Component, ComponentNamespace +from reflex.event import EventHandler, passthrough_event_spec +from reflex.utils.imports import ImportVar +from reflex.vars.base import Var + +from reflex_ui.components.base_ui import PACKAGE_NAME, BaseUIComponent +from reflex_ui.utils.twmerge import cn + +LiteralAlign = Literal["start", "center", "end"] +LiteralSide = Literal["bottom", "inline-end", "inline-start", "left", "right", "top"] +LiteralPosition = Literal["absolute", "fixed"] + + +class ClassNames: + """Class names for preview card components.""" + + ROOT = "" + TRIGGER = "" + BACKDROP = "" + PORTAL = "" + POSITIONER = "" + POPUP = "origin-(--transform-origin) rounded-xl p-4 border border-secondary-a4 bg-secondary-1 shadow-large transition-[transform,scale,opacity] data-[ending-style]:scale-95 data-[starting-style]:scale-95 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0 outline-none min-w-64 flex flex-col gap-3" + ARROW = "data-[side=bottom]:top-[-8px] data-[side=left]:right-[-13px] data-[side=left]:rotate-90 data-[side=right]:left-[-13px] data-[side=right]:-rotate-90 data-[side=top]:bottom-[-8px] data-[side=top]:rotate-180" + + +class PreviewCardBaseComponent(BaseUIComponent): + """Base component for preview card components.""" + + library = f"{PACKAGE_NAME}/preview-card" + + @property + def import_var(self): + """Return the import variable for the preview card component.""" + return ImportVar(tag="PreviewCard", package_path="", install=False) + + +class PreviewCardRoot(PreviewCardBaseComponent): + """Groups all parts of the preview card. Doesn't render its own HTML element.""" + + tag = "PreviewCard.Root" + + # Whether the preview card is initially open. To render a controlled preview card, use the `open` prop instead. Defaults to false. + default_open: Var[bool] + + # Whether the preview card is currently open. + open: Var[bool] + + # Event handler called when the preview card is opened or closed. + on_open_change: EventHandler[passthrough_event_spec(bool, dict, str)] + + # Event handler called after any animations complete when the preview card is opened or closed. + on_open_change_complete: EventHandler[passthrough_event_spec(bool)] + + # How long to wait before the preview card opens. Specified in milliseconds. Defaults to 600. + delay: Var[int] + + # How long to wait before closing the preview card that was opened on hover. Specified in milliseconds. Defaults to 300. + close_delay: Var[int] + + @classmethod + def create(cls, *children, **props) -> BaseUIComponent: + """Create the preview card root component.""" + props["data-slot"] = "preview-card" + return super().create(*children, **props) + + +class PreviewCardTrigger(PreviewCardBaseComponent): + """A button that opens the preview card. Renders a