瀏覽代碼

wrap radix icons (#2263)

* Add inital ui

* More radix updates

* Add el inheritance

* Add el inheritance for layout

* Triggers + primitive prop inheritance

* Initial Primitives

* Small fix

* Update select

* Radix Themes fixups (#2245)

* [REF-1367] Fix up event trigger specs

* Add missing name/value props for form controls

Checkbox was incorrectly tagged Button
TextArea was incorrectly tagged TextArea.Input

* [REF-1364] Radix Link now renders as a NextLink

For href as Var or href does not contain the ://, then
render as a NextLink for efficient inner-app navigation

* More changes

* PYI

* add @radix-ui/icons to radix.themes

* add pyi file

* fix for py3.8

---------

Co-authored-by: Alek Petuskey <alekpetuskey@aleks-mbp.lan>
Co-authored-by: Masen Furer <m_github@0x26.net>
Thomas Brandého 1 年之前
父節點
當前提交
0ca903e468

+ 4 - 0
reflex/components/radix/themes/components/__init__.py

@@ -42,6 +42,7 @@ from .dropdownmenu import (
 )
 )
 from .hovercard import HoverCardContent, HoverCardRoot, HoverCardTrigger
 from .hovercard import HoverCardContent, HoverCardRoot, HoverCardTrigger
 from .iconbutton import IconButton
 from .iconbutton import IconButton
+from .icons import Icon
 from .inset import Inset
 from .inset import Inset
 from .popover import PopoverClose, PopoverContent, PopoverRoot, PopoverTrigger
 from .popover import PopoverClose, PopoverContent, PopoverRoot, PopoverTrigger
 from .radiogroup import RadioGroupItem, RadioGroupRoot
 from .radiogroup import RadioGroupItem, RadioGroupRoot
@@ -132,6 +133,9 @@ hovercard_root = HoverCardRoot.create
 hovercard_trigger = HoverCardTrigger.create
 hovercard_trigger = HoverCardTrigger.create
 hovercard_content = HoverCardContent.create
 hovercard_content = HoverCardContent.create
 
 
+# Icon
+icon = Icon.create
+
 # Icon Button
 # Icon Button
 icon_button = IconButton.create
 icon_button = IconButton.create
 
 

+ 400 - 0
reflex/components/radix/themes/components/icons.py

@@ -0,0 +1,400 @@
+"""Radix Icons."""
+
+
+from typing import List
+
+from reflex.components.component import Component
+from reflex.utils import format
+
+
+class RadixIconComponent(Component):
+    """A component used as basis for Radix icons."""
+
+    library = "@radix-ui/react-icons"
+
+
+class Icon(RadixIconComponent):
+    """An image Icon."""
+
+    tag = "None"
+
+    @classmethod
+    def create(cls, *children, **props) -> Component:
+        """Initialize the Icon component.
+
+        Run some additional checks on Icon component.
+
+        Args:
+            *children: The positional arguments
+            **props: The keyword arguments
+
+        Raises:
+            AttributeError: The errors tied to bad usage of the Icon component.
+            ValueError: If the icon tag is invalid.
+
+        Returns:
+            The created component.
+        """
+        if children:
+            raise AttributeError(
+                f"Passing children to Icon component is not allowed: remove positional arguments {children} to fix"
+            )
+        if "tag" not in props.keys():
+            raise AttributeError("Missing 'tag' keyword-argument for Icon")
+        if type(props["tag"]) != str or props["tag"].lower() not in ICON_LIST:
+            raise ValueError(
+                f"Invalid icon tag: {props['tag']}. Please use one of the following: {ICON_LIST}"
+            )
+        props["tag"] = format.to_title_case(props["tag"]) + "Icon"
+        return super().create(*children, **props)
+
+
+ICON_ABSTRACT: List[str] = [
+    "hamburger_menu",
+    "cross_1",
+    "dots_vertical",
+    "dots_horizontal",
+    "plus",
+    "minus",
+    "check",
+    "cross_2",
+    "check_circled",
+    "cross_circled",
+    "plus_circled",
+    "minus_circled",
+    "question_mark",
+    "question_mark_circled",
+    "info_circled",
+    "accessibility",
+    "exclamation_triangle",
+    "share_1",
+    "share_2",
+    "external_link",
+    "open_in_new_window",
+    "enter",
+    "exit",
+    "download",
+    "upload",
+    "reset",
+    "reload",
+    "update",
+    "enter_full_screen",
+    "exit_full_screen",
+    "drag_handle_vertical",
+    "drag_handle_horizontal",
+    "drag_handle_dots_1",
+    "drag_handle_dots_2",
+    "dot",
+    "dot_filled",
+    "commit",
+    "slash",
+    "circle",
+    "circle_backslash",
+    "half_1",
+    "half_2",
+    "view_none",
+    "view_horizontal",
+    "view_vertical",
+    "view_grid",
+    "copy",
+    "square",
+]
+ICON_ALIGNS: List[str] = [
+    "align_top",
+    "align_center_vertically",
+    "align_bottom",
+    "stretch_vertically",
+    "align_left",
+    "align_center_horizontally",
+    "align_right",
+    "stretch_horizontally",
+    "space_between_horizontally",
+    "space_evenly_horizontally",
+    "space_between_vertically",
+    "space_evenly_vertically",
+    "pin_left",
+    "pin_right",
+    "pin_top",
+    "pin_bottom",
+]
+ICON_ARROWS: List[str] = [
+    "arrow_left",
+    "arrow_right",
+    "arrow_up",
+    "arrow_down",
+    "arrow_top_left",
+    "arrow_top_right",
+    "arrow_bottom_left",
+    "arrow_bottom_right",
+    "chevron_left",
+    "chevron_right",
+    "chevron_up",
+    "chevron_down",
+    "double_arrow_down",
+    "double_arrow_right",
+    "double_arrow_left",
+    "double_arrow_up",
+    "thick_arrow_up",
+    "thick_arrow_down",
+    "thick_arrow_right",
+    "thick_arrow_left",
+    "triangle_right",
+    "triangle_left",
+    "triangle_down",
+    "triangle_up",
+    "caret_down",
+    "caret_up",
+    "caret_left",
+    "caret_right",
+    "caret_sort",
+    "width",
+    "height",
+    "size",
+    "move",
+    "all_sides",
+]
+ICON_BORDERS: List[str] = [
+    "border_all",
+    "border_split",
+    "border_none",
+    "border_left",
+    "border_right",
+    "border_top",
+    "border_bottom",
+    "border_width",
+    "corners",
+    "corner_top_left",
+    "corner_top_right",
+    "corner_bottom_right",
+    "corner_bottom_left",
+    "border_style",
+    "border_solid",
+    "border_dashed",
+    "border_dotted",
+]
+ICON_COMPONENTS: List[str] = [
+    "box",
+    "aspect_ratio",
+    "container",
+    "section",
+    "layout",
+    "grid",
+    "table",
+    "image",
+    "switch",
+    "checkbox",
+    "radiobutton",
+    "avatar",
+    "button",
+    "badge",
+    "input",
+    "slider",
+    "quote",
+    "code",
+    "list_bullet",
+    "dropdown_menu",
+    "video",
+    "pie_chart",
+    "calendar",
+    "dashboard",
+    "activity_log",
+    "bar_chart",
+    "divider_horizontal",
+    "divider_vertical",
+]
+ICON_DESIGN: List[str] = [
+    "frame",
+    "crop",
+    "layers",
+    "stack",
+    "tokens",
+    "component_1",
+    "component_2",
+    "component_instance",
+    "component_none",
+    "component_boolean",
+    "component_placeholder",
+    "opacity",
+    "blending_mode",
+    "mask_on",
+    "mask_off",
+    "color_wheel",
+    "shadow",
+    "shadow_none",
+    "shadow_inner",
+    "shadow_outer",
+    "value",
+    "value_none",
+    "zoom_in",
+    "zoom_out",
+    "transparency_grid",
+    "group",
+    "dimensions",
+    "rotate_counter_clockwise",
+    "columns",
+    "rows",
+    "transform",
+    "box_model",
+    "padding",
+    "margin",
+    "angle",
+    "cursor_arrow",
+    "cursor_text",
+    "column_spacing",
+    "row_spacing",
+]
+ICON_LOGOS: List[str] = [
+    "modulz_logo",
+    "stitches_logo",
+    "figma_logo",
+    "framer_logo",
+    "sketch_logo",
+    "twitter_logo",
+    "icon_jar_logo",
+    "git_hub_logo",
+    "code_sandbox_logo",
+    "notion_logo",
+    "discord_logo",
+    "instagram_logo",
+    "linked_in_logo",
+]
+ICON_MUSIC: List[str] = [
+    "play",
+    "resume",
+    "pause",
+    "stop",
+    "track_previous",
+    "track_next",
+    "loop",
+    "shuffle",
+    "speaker_loud",
+    "speaker_moderate",
+    "speaker_quiet",
+    "speaker_off",
+]
+ICON_OBJECTS: List[str] = [
+    "magnifying_glass",
+    "gear",
+    "bell",
+    "home",
+    "lock_closed",
+    "lock_open_1",
+    "lock_open_2",
+    "backpack",
+    "camera",
+    "paper_plane",
+    "rocket",
+    "envelope_closed",
+    "envelope_open",
+    "chat_bubble",
+    "link_1",
+    "link_2",
+    "link_break_1",
+    "link_break_2",
+    "link_none_1",
+    "link_none_2",
+    "trash",
+    "pencil_1",
+    "pencil_2",
+    "bookmark",
+    "bookmark_filled",
+    "drawing_pin",
+    "drawing_pin_filled",
+    "sewing_pin",
+    "sewing_pin_filled",
+    "cube",
+    "archive",
+    "crumpled_paper",
+    "mix",
+    "mixer_horizontal",
+    "mixer_vertical",
+    "file",
+    "file_minus",
+    "file_plus",
+    "file_text",
+    "reader",
+    "card_stack",
+    "card_stack_plus",
+    "card_stack_minus",
+    "id_card",
+    "crosshair_1",
+    "crosshair_2",
+    "target",
+    "globe",
+    "disc",
+    "sun",
+    "moon",
+    "clock",
+    "timer",
+    "counter_clockwise_clock",
+    "countdown_timer",
+    "stopwatch",
+    "lap_timer",
+    "lightning_bolt",
+    "magic_wand",
+    "face",
+    "person",
+    "eye_open",
+    "eye_none",
+    "eye_closed",
+    "hand",
+    "ruler_horizontal",
+    "ruler_square",
+    "clipboard",
+    "clipboard_copy",
+    "desktop",
+    "laptop",
+    "mobile",
+    "keyboard",
+    "star",
+    "star_filled",
+    "heart",
+    "heart_filled",
+    "scissors",
+    "hobby_knife",
+    "eraser",
+    "cookie",
+]
+ICON_TYPOGRAPHY: List[str] = [
+    "font_style",
+    "font_italic",
+    "font_roman",
+    "font_bold",
+    "letter_case_lowercase",
+    "letter_case_capitalize",
+    "letter_case_uppercase",
+    "letter_case_toggle",
+    "letter_spacing",
+    "align_baseline",
+    "font_size",
+    "font_family",
+    "heading",
+    "text",
+    "text_none",
+    "line_height",
+    "underline",
+    "strikethrough",
+    "overline",
+    "pilcrow",
+    "text_align_left",
+    "text_align_center",
+    "text_align_right",
+    "text_align_justify",
+    "text_align_top",
+    "text_align_middle",
+    "text_align_bottom",
+    "dash",
+]
+
+ICON_LIST: List[str] = [
+    *ICON_ABSTRACT,
+    *ICON_ALIGNS,
+    *ICON_ARROWS,
+    *ICON_BORDERS,
+    *ICON_COMPONENTS,
+    *ICON_DESIGN,
+    *ICON_LOGOS,
+    *ICON_MUSIC,
+    *ICON_OBJECTS,
+    *ICON_TYPOGRAPHY,
+]

+ 185 - 0
reflex/components/radix/themes/components/icons.pyi

@@ -0,0 +1,185 @@
+"""Stub file for reflex/components/radix/themes/components/icons.py"""
+# ------------------- DO NOT EDIT ----------------------
+# This file was generated by `scripts/pyi_generator.py`!
+# ------------------------------------------------------
+
+from typing import Any, Dict, Literal, Optional, Union, overload
+from reflex.vars import Var, BaseVar, ComputedVar
+from reflex.event import EventChain, EventHandler, EventSpec
+from reflex.style import Style
+from typing import List
+from reflex.components.component import Component
+from reflex.utils import format
+
+class RadixIconComponent(Component):
+    @overload
+    @classmethod
+    def create(  # type: ignore
+        cls,
+        *children,
+        style: Optional[Style] = None,
+        key: Optional[Any] = None,
+        id: Optional[Any] = None,
+        class_name: Optional[Any] = None,
+        autofocus: Optional[bool] = None,
+        custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
+        on_blur: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_click: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_context_menu: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_double_click: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_focus: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mount: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_down: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_enter: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_leave: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_move: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_out: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_over: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_up: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_scroll: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_unmount: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        **props
+    ) -> "RadixIconComponent":
+        """Create the component.
+
+        Args:
+            *children: The children of the component.
+            style: The style of the component.
+            key: A unique key for the component.
+            id: The id for the component.
+            class_name: The class name for the component.
+            autofocus: Whether the component should take the focus once the page is loaded
+            custom_attrs: custom attribute
+            **props: The props of the component.
+
+        Returns:
+            The component.
+
+        Raises:
+            TypeError: If an invalid child is passed.
+        """
+        ...
+
+class Icon(RadixIconComponent):
+    @overload
+    @classmethod
+    def create(  # type: ignore
+        cls,
+        *children,
+        style: Optional[Style] = None,
+        key: Optional[Any] = None,
+        id: Optional[Any] = None,
+        class_name: Optional[Any] = None,
+        autofocus: Optional[bool] = None,
+        custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
+        on_blur: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_click: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_context_menu: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_double_click: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_focus: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mount: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_down: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_enter: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_leave: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_move: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_out: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_over: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_mouse_up: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_scroll: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        on_unmount: Optional[
+            Union[EventHandler, EventSpec, list, function, BaseVar]
+        ] = None,
+        **props
+    ) -> "Icon":
+        """Initialize the Icon component.
+
+        Run some additional checks on Icon component.
+
+        Args:
+            *children: The positional arguments
+            style: The style of the component.
+            key: A unique key for the component.
+            id: The id for the component.
+            class_name: The class name for the component.
+            autofocus: Whether the component should take the focus once the page is loaded
+            custom_attrs: custom attribute
+            **props: The keyword arguments
+
+        Raises:
+            AttributeError: The errors tied to bad usage of the Icon component.
+            ValueError: If the icon tag is invalid.
+
+        Returns:
+            The created component.
+        """
+        ...
+
+ICON_ABSTRACT: List[str]
+ICON_ALIGNS: List[str]
+ICON_ARROWS: List[str]
+ICON_BORDERS: List[str]
+ICON_COMPONENTS: List[str]
+ICON_DESIGN: List[str]
+ICON_LOGOS: List[str]
+ICON_MUSIC: List[str]
+ICON_OBJECTS: List[str]
+ICON_TYPOGRAPHY: List[str]
+ICON_LIST: List[str]