ordered & unordered lists (#2537)
This commit is contained in:
parent
de6244483d
commit
88f0be004d
@ -4,6 +4,7 @@ Anything imported here will be available in the default Reflex import as `rx.*`.
|
|||||||
To signal to typecheckers that something should be reexported,
|
To signal to typecheckers that something should be reexported,
|
||||||
we use the Flask "import name as name" syntax.
|
we use the Flask "import name as name" syntax.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import importlib
|
import importlib
|
||||||
@ -107,6 +108,9 @@ _ALL_COMPONENTS = [
|
|||||||
"EditorOptions",
|
"EditorOptions",
|
||||||
"icon",
|
"icon",
|
||||||
"markdown",
|
"markdown",
|
||||||
|
"list_item",
|
||||||
|
"unordered_list",
|
||||||
|
"ordered_list",
|
||||||
]
|
]
|
||||||
|
|
||||||
_MAPPING = {
|
_MAPPING = {
|
||||||
|
@ -90,6 +90,9 @@ from reflex.components import EditorButtonList as EditorButtonList
|
|||||||
from reflex.components import EditorOptions as EditorOptions
|
from reflex.components import EditorOptions as EditorOptions
|
||||||
from reflex.components import icon as icon
|
from reflex.components import icon as icon
|
||||||
from reflex.components import markdown as markdown
|
from reflex.components import markdown as markdown
|
||||||
|
from reflex.components import list_item as list_item
|
||||||
|
from reflex.components import unordered_list as unordered_list
|
||||||
|
from reflex.components import ordered_list as ordered_list
|
||||||
from reflex.components.component import Component as Component
|
from reflex.components.component import Component as Component
|
||||||
from reflex.components.component import NoSSRComponent as NoSSRComponent
|
from reflex.components.component import NoSSRComponent as NoSSRComponent
|
||||||
from reflex.components.component import memo as memo
|
from reflex.components.component import memo as memo
|
||||||
|
@ -5,6 +5,7 @@ from .center import Center
|
|||||||
from .container import Container
|
from .container import Container
|
||||||
from .flex import Flex
|
from .flex import Flex
|
||||||
from .grid import Grid
|
from .grid import Grid
|
||||||
|
from .list import ListItem, OrderedList, UnorderedList
|
||||||
from .section import Section
|
from .section import Section
|
||||||
from .spacer import Spacer
|
from .spacer import Spacer
|
||||||
from .stack import HStack, Stack, VStack
|
from .stack import HStack, Stack, VStack
|
||||||
@ -19,6 +20,9 @@ spacer = Spacer.create
|
|||||||
stack = Stack.create
|
stack = Stack.create
|
||||||
hstack = HStack.create
|
hstack = HStack.create
|
||||||
vstack = VStack.create
|
vstack = VStack.create
|
||||||
|
list_item = ListItem.create
|
||||||
|
ordered_list = OrderedList.create
|
||||||
|
unordered_list = UnorderedList.create
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
"box",
|
"box",
|
||||||
@ -31,4 +35,7 @@ __all__ = [
|
|||||||
"stack",
|
"stack",
|
||||||
"hstack",
|
"hstack",
|
||||||
"vstack",
|
"vstack",
|
||||||
|
"list_item",
|
||||||
|
"ordered_list",
|
||||||
|
"unordered_list",
|
||||||
]
|
]
|
||||||
|
154
reflex/components/radix/themes/layout/list.py
Normal file
154
reflex/components/radix/themes/layout/list.py
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
"""List components."""
|
||||||
|
|
||||||
|
from types import SimpleNamespace
|
||||||
|
from typing import Iterable, Literal, Optional, Union
|
||||||
|
|
||||||
|
from reflex.components.component import Component
|
||||||
|
from reflex.components.core.foreach import Foreach
|
||||||
|
from reflex.components.el.elements.typography import Li
|
||||||
|
from reflex.style import Style
|
||||||
|
from reflex.vars import Var
|
||||||
|
|
||||||
|
from .base import LayoutComponent
|
||||||
|
from .flex import Flex
|
||||||
|
|
||||||
|
# from reflex.vars import Var
|
||||||
|
|
||||||
|
# from reflex.components.radix.themes.layout import LayoutComponent
|
||||||
|
|
||||||
|
LiteralListStyleTypeUnordered = Literal[
|
||||||
|
"none",
|
||||||
|
"disc",
|
||||||
|
"circle",
|
||||||
|
"square",
|
||||||
|
]
|
||||||
|
|
||||||
|
LiteralListStyleTypeOrdered = Literal[
|
||||||
|
"none",
|
||||||
|
"decimal",
|
||||||
|
"decimal-leading-zero",
|
||||||
|
"lower-roman",
|
||||||
|
"upper-roman",
|
||||||
|
"lower-greek",
|
||||||
|
"lower-latin",
|
||||||
|
"upper-latin",
|
||||||
|
"armenian",
|
||||||
|
"georgian",
|
||||||
|
"lower-alpha",
|
||||||
|
"upper-alpha",
|
||||||
|
"hiragana",
|
||||||
|
"katakana",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class BaseList(Flex, LayoutComponent):
|
||||||
|
"""Base class for ordered and unordered lists."""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
items: Optional[Union[Var[Iterable], Iterable]] = None,
|
||||||
|
list_style_type: str = "",
|
||||||
|
**props,
|
||||||
|
):
|
||||||
|
"""Create a list component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
items: A list of items to add to the list.
|
||||||
|
list_style_type: The style of the list.
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The list component.
|
||||||
|
"""
|
||||||
|
if not children and items is not None:
|
||||||
|
if isinstance(items, Var):
|
||||||
|
children = [Foreach.create(items, ListItem.create)]
|
||||||
|
else:
|
||||||
|
children = [ListItem.create(item) for item in items]
|
||||||
|
props["list_style_type"] = list_style_type
|
||||||
|
props["direction"] = "column"
|
||||||
|
style = props.setdefault("style", {})
|
||||||
|
style["list_style_position"] = "outside"
|
||||||
|
if "gap" in props:
|
||||||
|
style["gap"] = props["gap"]
|
||||||
|
return super().create(*children, **props)
|
||||||
|
|
||||||
|
def _apply_theme(self, theme: Component):
|
||||||
|
self.style = Style(
|
||||||
|
{
|
||||||
|
"direction": "column",
|
||||||
|
"list_style_position": "outside",
|
||||||
|
**self.style,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UnorderedList(BaseList):
|
||||||
|
"""Display an unordered list."""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
items: Optional[Var[Iterable]] = None,
|
||||||
|
list_style_type: LiteralListStyleTypeUnordered = "disc",
|
||||||
|
**props,
|
||||||
|
):
|
||||||
|
"""Create a unordered list component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
items: A list of items to add to the list.
|
||||||
|
list_style_type: The style of the list.
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The list component.
|
||||||
|
"""
|
||||||
|
return super().create(
|
||||||
|
*children, items=items, list_style_type=list_style_type, **props
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class OrderedList(BaseList):
|
||||||
|
"""Display an ordered list."""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def create(
|
||||||
|
cls,
|
||||||
|
*children,
|
||||||
|
items: Optional[Var[Iterable]] = None,
|
||||||
|
list_style_type: LiteralListStyleTypeOrdered = "decimal",
|
||||||
|
**props,
|
||||||
|
):
|
||||||
|
"""Create an ordered list component.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
*children: The children of the component.
|
||||||
|
items: A list of items to add to the list.
|
||||||
|
list_style_type: The style of the list.
|
||||||
|
**props: The properties of the component.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The list component.
|
||||||
|
"""
|
||||||
|
return super().create(
|
||||||
|
*children, items=items, list_style_type=list_style_type, **props
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ListItem(Li):
|
||||||
|
"""Display an item of an ordered or unordered list."""
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
class List(SimpleNamespace):
|
||||||
|
"""List components."""
|
||||||
|
|
||||||
|
item = ListItem.create
|
||||||
|
ordered = OrderedList.create
|
||||||
|
unordered = UnorderedList.create
|
1065
reflex/components/radix/themes/layout/list.pyi
Normal file
1065
reflex/components/radix/themes/layout/list.pyi
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user