diff --git a/.coveragerc b/.coveragerc index d505ff27e..ff81b0c77 100644 --- a/.coveragerc +++ b/.coveragerc @@ -11,7 +11,7 @@ omit = [report] show_missing = true # TODO bump back to 79 -fail_under = 70 +fail_under = 66 precision = 2 # Regexes for lines to exclude from consideration diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index eb6eac00c..b46ff1442 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -14,3 +14,4 @@ jobs: uses: actions/dependency-review-action@v4 with: allow-licenses: Apache-2.0, BSD-2-Clause, BSD-3-Clause, HPND, ISC, MIT, MPL-2.0, PSF-2.0, Unlicense + allow-dependencies-licenses: 'pkg:pypi/lazy-loader' diff --git a/integration/test_tailwind.py b/integration/test_tailwind.py index ce6bab225..6155729c9 100644 --- a/integration/test_tailwind.py +++ b/integration/test_tailwind.py @@ -26,7 +26,6 @@ def TailwindApp( paragraph_class_name: Tailwind class_name for the paragraph. """ import reflex as rx - import reflex.components.radix.themes as rdxt class UnusedState(rx.State): pass @@ -35,7 +34,7 @@ def TailwindApp( return rx.el.div( rx.chakra.text(paragraph_text, class_name=paragraph_class_name), rx.el.p(paragraph_text, class_name=paragraph_class_name), - rdxt.text(paragraph_text, as_="p", class_name=paragraph_class_name), + rx.text(paragraph_text, as_="p", class_name=paragraph_class_name), id="p-content", ) diff --git a/poetry.lock b/poetry.lock index 6ab08de7d..150b96a8b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "alembic" version = "1.13.1" description = "A database migration tool for SQLAlchemy." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -25,6 +26,7 @@ tz = ["backports.zoneinfo"] name = "annotated-types" version = "0.6.0" description = "Reusable constraint types to use with typing.Annotated" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -39,6 +41,7 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.9\""} name = "anyio" version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -61,6 +64,7 @@ trio = ["trio (>=0.23)"] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -72,6 +76,7 @@ files = [ name = "asynctest" version = "0.13.0" description = "Enhance the standard unittest package with features for testing asyncio libraries" +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -83,6 +88,7 @@ files = [ name = "attrs" version = "23.2.0" description = "Classes Without Boilerplate" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -102,6 +108,7 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p name = "backports-tarfile" version = "1.1.1" description = "Backport of CPython tarfile module" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -117,6 +124,7 @@ testing = ["jaraco.test", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "p name = "bidict" version = "0.23.1" description = "The bidirectional mapping library for Python." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -128,6 +136,7 @@ files = [ name = "black" version = "22.12.0" description = "The uncompromising code formatter." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -163,6 +172,7 @@ uvloop = ["uvloop (>=0.15.2)"] name = "build" version = "1.2.1" description = "A simple, correct Python build frontend" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -188,6 +198,7 @@ virtualenv = ["virtualenv (>=20.0.35)"] name = "certifi" version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -199,6 +210,7 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -263,6 +275,7 @@ pycparser = "*" name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -274,6 +287,7 @@ files = [ name = "charset-normalizer" version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -373,6 +387,7 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -387,6 +402,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -398,6 +414,7 @@ files = [ name = "coverage" version = "7.5.1" description = "Code coverage measurement for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -465,6 +482,7 @@ toml = ["tomli"] name = "cryptography" version = "42.0.7" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -519,6 +537,7 @@ test-randomorder = ["pytest-randomly"] name = "darglint" version = "1.8.1" description = "A utility for ensuring Google-style docstrings stay up to date with the source code." +category = "dev" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -530,6 +549,7 @@ files = [ name = "dill" version = "0.3.8" description = "serialize all of Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -545,6 +565,7 @@ profile = ["gprof2dot (>=2022.7.29)"] name = "distlib" version = "0.3.8" description = "Distribution utilities" +category = "dev" optional = false python-versions = "*" files = [ @@ -556,6 +577,7 @@ files = [ name = "distro" version = "1.9.0" description = "Distro - an OS platform information API" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -567,14 +589,19 @@ files = [ name = "docutils" version = "0.20.1" description = "Docutils -- Python Documentation Utilities" +category = "main" optional = false -python-versions = "*" -files = [] +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] [[package]] name = "exceptiongroup" version = "1.2.1" description = "Backport of PEP 654 (exception groups)" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -589,6 +616,7 @@ test = ["pytest (>=6)"] name = "fastapi" version = "0.110.3" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -608,6 +636,7 @@ all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)" name = "filelock" version = "3.14.0" description = "A platform independent file lock." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -624,6 +653,7 @@ typing = ["typing-extensions (>=4.8)"] name = "greenlet" version = "3.0.3" description = "Lightweight in-process concurrent programming" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -695,6 +725,7 @@ test = ["objgraph", "psutil"] name = "gunicorn" version = "22.0.0" description = "WSGI HTTP Server for UNIX" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -716,6 +747,7 @@ tornado = ["tornado (>=0.2)"] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -727,6 +759,7 @@ files = [ name = "httpcore" version = "1.0.5" description = "A minimal low-level HTTP client." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -741,13 +774,14 @@ h11 = ">=0.13,<0.15" [package.extras] asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" version = "0.27.0" description = "The next generation HTTP client." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -758,20 +792,21 @@ files = [ [package.dependencies] anyio = "*" certifi = "*" -httpcore = "==1.*" +httpcore = ">=1.0.0,<2.0.0" idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] +socks = ["socksio (>=1.0.0,<2.0.0)"] [[package]] name = "identify" version = "2.5.36" description = "File identification library for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -786,6 +821,7 @@ license = ["ukkonen"] name = "idna" version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -797,6 +833,7 @@ files = [ name = "importlib-metadata" version = "7.1.0" description = "Read metadata from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -816,6 +853,7 @@ testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", name = "importlib-resources" version = "6.4.0" description = "Read resources from Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -834,6 +872,7 @@ testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "p name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -845,6 +884,7 @@ files = [ name = "jaraco-classes" version = "3.4.0" description = "Utility functions for Python class constructs" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -863,6 +903,7 @@ testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-ena name = "jaraco-context" version = "5.3.0" description = "Useful decorators and context managers" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -881,6 +922,7 @@ testing = ["portend", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytes name = "jaraco-functools" version = "4.0.1" description = "Functools like those found in stdlib" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -899,6 +941,7 @@ testing = ["jaraco.classes", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest name = "jeepney" version = "0.8.0" description = "Low-level, pure Python DBus protocol wrapper." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -914,6 +957,7 @@ trio = ["async_generator", "trio"] name = "jinja2" version = "3.1.4" description = "A very fast and expressive template engine." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -931,6 +975,7 @@ i18n = ["Babel (>=2.7)"] name = "keyring" version = "25.2.0" description = "Store and access your passwords safely." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -953,10 +998,31 @@ completion = ["shtab (>=1.1.0)"] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] testing = ["pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +[[package]] +name = "lazy-loader" +version = "0.4" +description = "Makes it easy to load subpackages and functions on demand." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy_loader-0.4-py3-none-any.whl", hash = "sha256:342aa8e14d543a154047afb4ba8ef17f5563baad3fc610d7b15b213b0f119efc"}, + {file = "lazy_loader-0.4.tar.gz", hash = "sha256:47c75182589b91a4e1a85a136c074285a5ad4d9f39c63e0d7fb76391c4574cd1"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +dev = ["changelist (==0.5)"] +lint = ["pre-commit (==3.7.0)"] +test = ["pytest (>=7.4)", "pytest-cov (>=4.1)"] + [[package]] name = "mako" version = "1.3.3" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -976,6 +1042,7 @@ testing = ["pytest"] name = "markdown-it-py" version = "3.0.0" description = "Python port of markdown-it. Markdown parsing, done right!" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1000,6 +1067,7 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] name = "markupsafe" version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1069,6 +1137,7 @@ files = [ name = "mdurl" version = "0.1.2" description = "Markdown URL utilities" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1080,6 +1149,7 @@ files = [ name = "more-itertools" version = "10.2.0" description = "More routines for operating on iterables, beyond itertools" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1091,6 +1161,7 @@ files = [ name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1102,6 +1173,7 @@ files = [ name = "nh3" version = "0.2.17" description = "Python bindings to the ammonia HTML sanitization library." +category = "main" optional = false python-versions = "*" files = [ @@ -1127,6 +1199,7 @@ files = [ name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" +category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -1141,6 +1214,7 @@ setuptools = "*" name = "numpy" version = "1.24.4" description = "Fundamental package for array computing in Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1178,6 +1252,7 @@ files = [ name = "numpy" version = "1.26.4" description = "Fundamental package for array computing in Python" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1223,6 +1298,7 @@ files = [ name = "outcome" version = "1.3.0.post0" description = "Capture the outcome of Python function calls." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1237,6 +1313,7 @@ attrs = ">=19.2.0" name = "packaging" version = "24.0" description = "Core utilities for Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1248,6 +1325,7 @@ files = [ name = "pandas" version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1292,6 +1370,7 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] name = "pandas" version = "2.2.2" description = "Powerful data structures for data analysis, time series, and statistics" +category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1365,6 +1444,7 @@ xml = ["lxml (>=4.9.2)"] name = "pathspec" version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1376,6 +1456,7 @@ files = [ name = "pillow" version = "10.3.0" description = "Python Imaging Library (Fork)" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1462,6 +1543,7 @@ xmp = ["defusedxml"] name = "pip" version = "24.0" description = "The PyPA recommended tool for installing Python packages." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1473,6 +1555,7 @@ files = [ name = "pipdeptree" version = "2.16.2" description = "Command line utility to show dependency tree of packages." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1491,6 +1574,7 @@ test = ["covdefaults (>=2.3)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pyte name = "pkginfo" version = "1.10.0" description = "Query metadata from sdists / bdists / installed packages." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1505,6 +1589,7 @@ testing = ["pytest", "pytest-cov", "wheel"] name = "platformdirs" version = "4.2.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1521,6 +1606,7 @@ type = ["mypy (>=1.8)"] name = "plotly" version = "5.22.0" description = "An open-source, interactive data visualization library for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1536,6 +1622,7 @@ tenacity = ">=6.2.0" name = "pluggy" version = "1.5.0" description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1551,6 +1638,7 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "3.5.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1569,6 +1657,7 @@ virtualenv = ">=20.10.0" name = "psutil" version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -1597,6 +1686,7 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "py-cpuinfo" version = "9.0.0" description = "Get CPU info with pure Python" +category = "dev" optional = false python-versions = "*" files = [ @@ -1608,6 +1698,7 @@ files = [ name = "pycparser" version = "2.22" description = "C parser in Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1619,6 +1710,7 @@ files = [ name = "pydantic" version = "2.7.1" description = "Data validation using Python type hints" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1638,6 +1730,7 @@ email = ["email-validator (>=2.0.0)"] name = "pydantic-core" version = "2.18.2" description = "Core functionality for Pydantic validation and serialization" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1729,6 +1822,7 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" name = "pygments" version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1743,6 +1837,7 @@ windows-terminal = ["colorama (>=0.4.6)"] name = "pyproject-hooks" version = "1.1.0" description = "Wrappers to call pyproject.toml-based build backend hooks." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1754,6 +1849,7 @@ files = [ name = "pyright" version = "1.1.334" description = "Command line wrapper for pyright" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1772,6 +1868,7 @@ dev = ["twine (>=3.4.1)"] name = "pysocks" version = "1.7.1" description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1784,6 +1881,7 @@ files = [ name = "pytest" version = "7.4.4" description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1806,6 +1904,7 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-asyncio" version = "0.21.2" description = "Pytest support for asyncio" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1824,6 +1923,7 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy name = "pytest-benchmark" version = "4.0.0" description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1844,6 +1944,7 @@ histogram = ["pygal", "pygaljs"] name = "pytest-cov" version = "4.1.0" description = "Pytest plugin for measuring coverage." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1862,6 +1963,7 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale name = "pytest-mock" version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1879,6 +1981,7 @@ dev = ["pre-commit", "pytest-asyncio", "tox"] name = "python-dateutil" version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1893,6 +1996,7 @@ six = ">=1.5" name = "python-engineio" version = "4.9.0" description = "Engine.IO server and client for Python" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1912,6 +2016,7 @@ docs = ["sphinx"] name = "python-multipart" version = "0.0.9" description = "A streaming multipart parser for Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1926,6 +2031,7 @@ dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatc name = "python-socketio" version = "5.11.2" description = "Socket.IO server and client for Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1946,6 +2052,7 @@ docs = ["sphinx"] name = "pytz" version = "2024.1" description = "World timezone definitions, modern and historical" +category = "dev" optional = false python-versions = "*" files = [ @@ -1957,6 +2064,7 @@ files = [ name = "pywin32-ctypes" version = "0.2.2" description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1968,6 +2076,7 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" +category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2017,6 +2126,7 @@ files = [ name = "readme-renderer" version = "43.0" description = "readme_renderer is a library for rendering readme descriptions for Warehouse" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2036,6 +2146,7 @@ md = ["cmarkgfm (>=0.8.0)"] name = "redis" version = "5.0.4" description = "Python client for Redis database and key-value store" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2054,6 +2165,7 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "reflex-hosting-cli" version = "0.1.13" description = "Reflex Hosting CLI" +category = "main" optional = false python-versions = "<4.0,>=3.8" files = [ @@ -2077,6 +2189,7 @@ websockets = ">=10.4" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2098,6 +2211,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-toolbelt" version = "1.0.0" description = "A utility belt for advanced users of python-requests" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2112,6 +2226,7 @@ requests = ">=2.0.1,<3.0.0" name = "rfc3986" version = "2.0.0" description = "Validating URI References per RFC 3986" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2126,6 +2241,7 @@ idna2008 = ["idna"] name = "rich" version = "13.7.1" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -2145,6 +2261,7 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] name = "ruff" version = "0.1.0" description = "An extremely fast Python linter, written in Rust." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2171,6 +2288,7 @@ files = [ name = "secretstorage" version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2186,6 +2304,7 @@ jeepney = ">=0.6" name = "selenium" version = "4.20.0" description = "" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2204,6 +2323,7 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]} name = "setuptools" version = "69.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2220,6 +2340,7 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "shellingham" version = "1.5.4" description = "Tool to Detect Surrounding Shell" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2231,6 +2352,7 @@ files = [ name = "simple-websocket" version = "1.0.0" description = "Simple WebSocket server and client for Python" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2248,6 +2370,7 @@ docs = ["sphinx"] name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2259,6 +2382,7 @@ files = [ name = "sniffio" version = "1.3.1" description = "Sniff out which async library your code is running under" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2270,6 +2394,7 @@ files = [ name = "sortedcontainers" version = "2.4.0" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "dev" optional = false python-versions = "*" files = [ @@ -2281,6 +2406,7 @@ files = [ name = "sqlalchemy" version = "2.0.30" description = "Database Abstraction Library" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2368,6 +2494,7 @@ sqlcipher = ["sqlcipher3_binary"] name = "sqlmodel" version = "0.0.18" description = "SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2383,6 +2510,7 @@ SQLAlchemy = ">=2.0.0,<2.1.0" name = "starlette" version = "0.37.2" description = "The little ASGI library that shines." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2401,6 +2529,7 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7 name = "starlette-admin" version = "0.13.2" description = "Fast, beautiful and extensible administrative interface framework for Starlette/FastApi applications" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2424,6 +2553,7 @@ test = ["aiomysql (>=0.1.1,<0.3.0)", "aiosqlite (>=0.17.0,<0.20.0)", "arrow (>=1 name = "tabulate" version = "0.9.0" description = "Pretty-print tabular data" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2438,6 +2568,7 @@ widechars = ["wcwidth"] name = "tenacity" version = "8.3.0" description = "Retry code until it succeeds" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2453,6 +2584,7 @@ test = ["pytest", "tornado (>=4.5)", "typeguard"] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -2464,6 +2596,7 @@ files = [ name = "tomli" version = "2.0.1" description = "A lil' TOML parser" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2475,6 +2608,7 @@ files = [ name = "tomlkit" version = "0.12.4" description = "Style preserving TOML library" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2486,6 +2620,7 @@ files = [ name = "trio" version = "0.25.0" description = "A friendly Python library for async concurrency and I/O" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2506,6 +2641,7 @@ sortedcontainers = "*" name = "trio-websocket" version = "0.11.1" description = "WebSocket library for Trio" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2522,6 +2658,7 @@ wsproto = ">=0.14" name = "twine" version = "5.0.0" description = "Collection of utilities for publishing packages on PyPI" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2544,6 +2681,7 @@ urllib3 = ">=1.26.0" name = "typer" version = "0.12.3" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2561,6 +2699,7 @@ typing-extensions = ">=3.7.4.3" name = "typing-extensions" version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2572,6 +2711,7 @@ files = [ name = "tzdata" version = "2024.1" description = "Provider of IANA time zone data" +category = "dev" optional = false python-versions = ">=2" files = [ @@ -2583,6 +2723,7 @@ files = [ name = "urllib3" version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2603,6 +2744,7 @@ zstd = ["zstandard (>=0.18.0)"] name = "uvicorn" version = "0.20.0" description = "The lightning-fast ASGI server." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2621,6 +2763,7 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", name = "uvicorn" version = "0.24.0.post1" description = "The lightning-fast ASGI server." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2639,6 +2782,7 @@ standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", name = "virtualenv" version = "20.26.1" description = "Virtual Python Environment builder" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2659,6 +2803,7 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "watchdog" version = "4.0.0" description = "Filesystem events monitoring" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2700,6 +2845,7 @@ watchmedo = ["PyYAML (>=3.10)"] name = "watchfiles" version = "0.21.0" description = "Simple, modern and high performance file watching and code reload in python." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2787,6 +2933,7 @@ anyio = ">=3.0.0" name = "websockets" version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2868,6 +3015,7 @@ files = [ name = "wheel" version = "0.43.0" description = "A built-package format for Python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2882,6 +3030,7 @@ test = ["pytest (>=6.0.0)", "setuptools (>=65)"] name = "wrapt" version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2961,6 +3110,7 @@ files = [ name = "wsproto" version = "1.2.0" description = "WebSockets state-machine based protocol implementation" +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -2975,6 +3125,7 @@ h11 = ">=0.9.0,<1" name = "zipp" version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2989,4 +3140,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "a5abcbe48c3d9d39752223c5abb7cebadf0ad444b8d6af400a7c2c769543bb13" +content-hash = "586d6cce442baa6f294c9b0be6e8e84aed2cd243f776e0654d2c2fb03fbc29e7" diff --git a/pyproject.toml b/pyproject.toml index e47f52027..c86697ea2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,7 @@ setuptools = ">=69.1.1,<70.0" httpx = ">=0.25.1,<1.0" twine = ">=4.0.0,<6.0" tomlkit = ">=0.12.4,<1.0" +lazy_loader = ">=0.4" [tool.poetry.group.dev.dependencies] pytest = ">=7.1.2,<8.0" diff --git a/reflex/__init__.py b/reflex/__init__.py index b67208ec9..46ed9e400 100644 --- a/reflex/__init__.py +++ b/reflex/__init__.py @@ -1,141 +1,281 @@ """Import all classes and functions the end user will need to make an app. Anything imported here will be available in the default Reflex import as `rx.*`. -To signal to typecheckers that something should be reexported, -we use the Flask "import name as name" syntax. + +Dynamic Imports +--------------- +Reflex utilizes dynamic imports, or lazy loading, to reduce startup/import times. +With this approach, imports are delayed until they are actually needed. We use +the `lazy_loader` library(https://github.com/scientific-python/lazy_loader) to achieve this. + +How it works +-------------- +`lazy_loader.attach` takes two optional arguments: `submodules` and `submod_attrs`. +- `submodules` typically points to directories or files to be accessed. +- `submod_attrs` defines a mapping of directory or file names as keys with a list + of attributes or modules to access. + +Example directory structure: + +reflex/ + |_ components/ + |_ radix/ + |_ themes/ + |_ components/ + |_ box.py + +To add `box` under the `rx` namespace (`rx.box`), add the relative path to `submod_attrs` in +`reflex/__init__.py` (this file): + +```python +lazy_loader.attach( + submodules={"components"}, + submod_attrs={ + "components.radix.themes.components.box": ["box"] + } +) +``` + +This implies that `box` will be imported from `reflex/components/radix/themes/components/box.py`. + +To add box under the `rx.radix` namespace (`rx.radix.box`), add the relative path to the +submod_attrs argument in `reflex/components/radix/__init__.py`: + +```python +lazy_loader.attach( + submodules = {"themes"}, + submod_attrs = { + "themes.components.box": ["box"] + } +) +``` + +Note: It is important to specify the immediate submodules of a directory in the submodules +argument to ensure they are registered at runtime. For example, 'components' for reflex, +'radix' for components, 'themes' for radix, etc. + + +Pyi_generator +-------------- +To generate `.pyi` files for `__init__.py` files, we read the `_SUBMODULES` and `_SUBMOD_ATTRS` +attributes to generate the import statements. It is highly recommended to define these with +the provided annotations to facilitate their generation. + + +Aliases +------------ +This is a special case to specify an alias for a component. +As an example, we use this typically for `rx.list` where defining `list` attribute in the list.py +overshadows python's list object which messes up the pyi generation for `list.pyi`. As a result, aliases +should be used for similar cases like this. Note that this logic is employed to fix the pyi generation and alias +should still be defined or accessible. Check out the __getattr__ logic in `reflex/components/radix/themes/layouts/list.py` + +```python +lazy_loader.attach( + submodules={"components"}, + submod_attrs={ + "components.radix.themes.layouts": [("list_ns", "list")] + } +) +``` + +In the example above, you will be able to do `rx.list` """ from __future__ import annotations -import importlib -from typing import Type +from reflex.utils import lazy_loader -from reflex.page import page as page -from reflex.utils import console -from reflex.utils.format import to_snake_case +# import this here explicitly to avoid returning the page module since page attr has the +# same name as page module(page.py) +from .page import page as page -_ALL_COMPONENTS = [ - # Core - "color", - "cond", - "foreach", - "html", - "match", - "color_mode_cond", - "connection_banner", - "connection_modal", - "debounce_input", - # Base - "fragment", - "Fragment", - "image", - "script", - # Responsive - "desktop_only", - "mobile_and_tablet", - "mobile_only", - "tablet_and_desktop", - "tablet_only", - # Upload - "cancel_upload", - "clear_selected_files", - "get_upload_dir", - "get_upload_url", - "selected_files", - "upload", - # Radix - "accordion", - "alert_dialog", - "aspect_ratio", - "avatar", - "badge", - "blockquote", - "box", - "button", - "callout", - "card", - "center", - "checkbox", - "code", - "container", - "context_menu", - "data_list", - "dialog", - "divider", - "drawer", - "flex", - "form", - "grid", - "heading", - "hover_card", - "hstack", - "icon_button", - "inset", - "input", - "link", - "menu", - "popover", - "progress", - "radio", - "scroll_area", - "section", - "select", - "skeleton", - "slider", - "spacer", - "spinner", - "stack", - "switch", - "table", - "tabs", - "text", - "text_area", - "theme", - "theme_panel", - "tooltip", - "vstack", - # Other - "code_block", - "data_editor", - "data_editor_theme", - "data_table", - "plotly", - "audio", - "video", - "editor", - "EditorButtonList", - "EditorOptions", - "icon", - "markdown", - "list", - "list_item", - "unordered_list", - "ordered_list", - "moment", - "logo", - # Toast is in experimental namespace initially - # "toast", -] +RADIX_THEMES_MAPPING: dict = { + "components.radix.themes.base": ["color_mode", "theme", "theme_panel"], + "components.radix.themes.color_mode": ["color_mode"], +} +RADIX_THEMES_COMPONENTS_MAPPING: dict = { + **{ + f"components.radix.themes.components.{mod}": [mod] + for mod in [ + "alert_dialog", + "aspect_ratio", + "avatar", + "badge", + "button", + "callout", + "card", + "checkbox", + "context_menu", + "data_list", + "dialog", + "hover_card", + "icon_button", + "input", + "inset", + "popover", + "scroll_area", + "select", + "skeleton", + "slider", + "spinner", + "switch", + "table", + "tabs", + "text_area", + "tooltip", + "segmented_control", + "radio_cards", + "checkbox_cards", + "checkbox_group", + ] + }, + "components.radix.themes.components.text_field": ["text_field", "input"], + "components.radix.themes.components.radio_group": ["radio", "radio_group"], + "components.radix.themes.components.dropdown_menu": ["menu", "dropdown_menu"], + "components.radix.themes.components.separator": ["divider", "separator"], +} -_MAPPING = { - "reflex.experimental": ["_x"], - "reflex.admin": ["admin", "AdminDash"], - "reflex.app": ["app", "App", "UploadFile"], - "reflex.base": ["base", "Base"], - "reflex.compiler": ["compiler"], - "reflex.components": _ALL_COMPONENTS, - "reflex.components.component": ["Component", "NoSSRComponent", "memo"], - "reflex.components.chakra": ["chakra"], - "reflex.components.el": ["el"], - "reflex.components.lucide": ["lucide"], - "reflex.components.next": ["next"], - "reflex.components.radix": ["radix", "color_mode"], - "reflex.components.recharts": ["recharts"], - "reflex.components.moment.moment": ["MomentDelta"], - "reflex.config": ["config", "Config", "DBConfig"], - "reflex.constants": ["constants", "Env"], - "reflex.event": [ - "event", +RADIX_THEMES_LAYOUT_MAPPING: dict = { + "components.radix.themes.layout.box": [ + "box", + ], + "components.radix.themes.layout.center": [ + "center", + ], + "components.radix.themes.layout.container": [ + "container", + ], + "components.radix.themes.layout.flex": [ + "flex", + ], + "components.radix.themes.layout.grid": [ + "grid", + ], + "components.radix.themes.layout.section": [ + "section", + ], + "components.radix.themes.layout.spacer": [ + "spacer", + ], + "components.radix.themes.layout.stack": [ + "stack", + "hstack", + "vstack", + ], + "components.radix.themes.layout.list": [ + ("list_ns", "list"), + "list_item", + "ordered_list", + "unordered_list", + ], +} + +RADIX_THEMES_TYPOGRAPHY_MAPPING: dict = { + "components.radix.themes.typography.blockquote": [ + "blockquote", + ], + "components.radix.themes.typography.code": [ + "code", + ], + "components.radix.themes.typography.heading": [ + "heading", + ], + "components.radix.themes.typography.link": [ + "link", + ], + "components.radix.themes.typography.text": [ + "text", + ], +} + +RADIX_PRIMITIVES_MAPPING: dict = { + "components.radix.primitives.accordion": [ + "accordion", + ], + "components.radix.primitives.drawer": [ + "drawer", + ], + "components.radix.primitives.form": [ + "form", + ], + "components.radix.primitives.progress": ["progress"], +} + +COMPONENTS_CORE_MAPPING: dict = { + "components.core.banner": [ + "connection_banner", + "connection_modal", + ], + "components.core.cond": ["cond", "color_mode_cond"], + "components.core.foreach": ["foreach"], + "components.core.debounce": ["debounce_input"], + "components.core.html": ["html"], + "components.core.match": ["match"], + "components.core.colors": ["color"], + "components.core.responsive": [ + "desktop_only", + "mobile_and_tablet", + "mobile_only", + "tablet_and_desktop", + "tablet_only", + ], + "components.core.upload": [ + "cancel_upload", + "clear_selected_files", + "get_upload_dir", + "get_upload_url", + "selected_files", + "upload", + ], +} + +COMPONENTS_BASE_MAPPING: dict = { + "components.base.fragment": ["fragment", "Fragment"], + "components.base.script": ["script", "Script"], +} + +RADIX_MAPPING: dict = { + **RADIX_THEMES_MAPPING, + **RADIX_THEMES_COMPONENTS_MAPPING, + **RADIX_THEMES_TYPOGRAPHY_MAPPING, + **RADIX_THEMES_LAYOUT_MAPPING, + **RADIX_PRIMITIVES_MAPPING, +} + +_MAPPING: dict = { + "experimental": ["_x"], + "admin": ["AdminDash"], + "app": ["App", "UploadFile"], + "base": ["Base"], + "components.component": ["Component", "NoSSRComponent", "memo"], + "components.el.elements.media": ["image"], + "components.lucide": ["icon"], + **COMPONENTS_BASE_MAPPING, + "components.suneditor": [ + "editor", + "EditorButtonList", + "EditorOptions", + ], + "components": ["el", "chakra", "radix", "lucide", "recharts", "next"], + "components.markdown": ["markdown"], + **RADIX_MAPPING, + "components.plotly": ["plotly"], + "components.react_player": ["audio", "video"], + **COMPONENTS_CORE_MAPPING, + "components.datadisplay.code": [ + "code_block", + ], + "components.datadisplay.dataeditor": [ + "data_editor", + "data_editor_theme", + ], + "components.datadisplay.logo": ["logo"], + "components.gridjs": ["data_table"], + "components.moment": ["MomentDelta", "moment"], + "config": ["Config", "DBConfig"], + "constants": ["Env"], + "event": [ "EventChain", "EventHandler", "background", @@ -155,84 +295,38 @@ _MAPPING = { "upload_files", "window_alert", ], - "reflex.middleware": ["middleware", "Middleware"], - "reflex.model": ["model", "session", "Model"], - "reflex.page": ["page"], - "reflex.route": ["route"], - "reflex.state": [ - "state", + "middleware": ["middleware", "Middleware"], + "model": ["session", "Model"], + "state": [ "var", "Cookie", "LocalStorage", "ComponentState", "State", ], - "reflex.style": ["style", "toggle_color_mode"], - "reflex.testing": ["testing"], - "reflex.utils": ["utils"], - "reflex.utils.imports": ["ImportVar"], - "reflex.vars": ["vars", "cached_var", "Var"], + "style": ["Style", "toggle_color_mode"], + "utils.imports": ["ImportVar"], + "utils.serializers": ["serializer"], + "vars": ["cached_var", "Var"], } - -def _reverse_mapping(mapping: dict[str, list]) -> dict[str, str]: - """Reverse the mapping used to lazy loading, and check for conflicting name. - - Args: - mapping: The mapping to reverse. - - Returns: - The reversed mapping. - """ - reversed_mapping = {} - for key, values in mapping.items(): - for value in values: - if value not in reversed_mapping: - reversed_mapping[value] = key - else: - console.warn( - f"Key {value} is present multiple times in the imports _MAPPING: {key} / {reversed_mapping[value]}" - ) - return reversed_mapping - - -# _MAPPING = {value: key for key, values in _MAPPING.items() for value in values} -_MAPPING = _reverse_mapping(_MAPPING) - - -def _removeprefix(text, prefix): - return text[text.startswith(prefix) and len(prefix) :] - - -__all__ = (_removeprefix(mod, "reflex.") for mod in _MAPPING) - - -def __getattr__(name: str) -> Type: - """Lazy load all modules. - - Args: - name: name of the module to load. - - Returns: - The module or the attribute of the module. - - Raises: - AttributeError: If the module or the attribute does not exist. - """ - try: - # Check for import of a module that is not in the mapping. - if name not in _MAPPING: - # If the name does not start with reflex, add it. - if not name.startswith("reflex") and name != "__all__": - name = f"reflex.{name}" - return importlib.import_module(name) - - # Import the module. - module = importlib.import_module(_MAPPING[name]) - - # Get the attribute from the module if the name is not the module itself. - return ( - getattr(module, name) if name != _MAPPING[name].rsplit(".")[-1] else module - ) - except ModuleNotFoundError: - raise AttributeError(f"module 'reflex' has no attribute {name}") from None +_SUBMODULES: set[str] = { + "components", + "event", + "app", + "style", + "admin", + "base", + "model", + "testing", + "utils", + "vars", + "config", + "compiler", +} +_SUBMOD_ATTRS: dict = _MAPPING +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submodules=_SUBMODULES, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/__init__.pyi b/reflex/__init__.pyi index f919220a8..8bea0c90a 100644 --- a/reflex/__init__.pyi +++ b/reflex/__init__.pyi @@ -1,157 +1,196 @@ -from reflex.experimental import _x as _x -from reflex import admin as admin -from reflex.admin import AdminDash as AdminDash -from reflex import app as app -from reflex.app import App as App -from reflex.app import UploadFile as UploadFile -from reflex import base as base -from reflex.base import Base as Base -from reflex import compiler as compiler -from reflex.components import color as color -from reflex.components import cond as cond -from reflex.components import foreach as foreach -from reflex.components import html as html -from reflex.components import match as match -from reflex.components import color_mode_cond as color_mode_cond -from reflex.components import connection_banner as connection_banner -from reflex.components import connection_modal as connection_modal -from reflex.components import debounce_input as debounce_input -from reflex.components import fragment as fragment -from reflex.components import Fragment as Fragment -from reflex.components import image as image -from reflex.components import script as script -from reflex.components import desktop_only as desktop_only -from reflex.components import mobile_and_tablet as mobile_and_tablet -from reflex.components import mobile_only as mobile_only -from reflex.components import tablet_and_desktop as tablet_and_desktop -from reflex.components import tablet_only as tablet_only -from reflex.components import cancel_upload as cancel_upload -from reflex.components import clear_selected_files as clear_selected_files -from reflex.components import get_upload_dir as get_upload_dir -from reflex.components import get_upload_url as get_upload_url -from reflex.components import selected_files as selected_files -from reflex.components import upload as upload -from reflex.components import accordion as accordion -from reflex.components import alert_dialog as alert_dialog -from reflex.components import aspect_ratio as aspect_ratio -from reflex.components import avatar as avatar -from reflex.components import badge as badge -from reflex.components import blockquote as blockquote -from reflex.components import box as box -from reflex.components import button as button -from reflex.components import callout as callout -from reflex.components import card as card -from reflex.components import center as center -from reflex.components import checkbox as checkbox -from reflex.components import code as code -from reflex.components import container as container -from reflex.components import context_menu as context_menu -from reflex.components import data_list as data_list -from reflex.components import dialog as dialog -from reflex.components import divider as divider -from reflex.components import drawer as drawer -from reflex.components import flex as flex -from reflex.components import form as form -from reflex.components import grid as grid -from reflex.components import heading as heading -from reflex.components import hover_card as hover_card -from reflex.components import hstack as hstack -from reflex.components import icon_button as icon_button -from reflex.components import inset as inset -from reflex.components import input as input -from reflex.components import link as link -from reflex.components import menu as menu -from reflex.components import popover as popover -from reflex.components import progress as progress -from reflex.components import radio as radio -from reflex.components import scroll_area as scroll_area -from reflex.components import section as section -from reflex.components import select as select -from reflex.components import skeleton as skeleton -from reflex.components import slider as slider -from reflex.components import spacer as spacer -from reflex.components import spinner as spinner -from reflex.components import stack as stack -from reflex.components import switch as switch -from reflex.components import table as table -from reflex.components import tabs as tabs -from reflex.components import text as text -from reflex.components import text_area as text_area -from reflex.components import theme as theme -from reflex.components import theme_panel as theme_panel -from reflex.components import tooltip as tooltip -from reflex.components import vstack as vstack -from reflex.components import code_block as code_block -from reflex.components import data_editor as data_editor -from reflex.components import data_editor_theme as data_editor_theme -from reflex.components import data_table as data_table -from reflex.components import plotly as plotly -from reflex.components import audio as audio -from reflex.components import video as video -from reflex.components import editor as editor -from reflex.components import EditorButtonList as EditorButtonList -from reflex.components import EditorOptions as EditorOptions -from reflex.components import icon as icon -from reflex.components import markdown as markdown -from reflex.components import list as list -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 import moment as moment -from reflex.components import logo as logo -from reflex.components.component import Component as Component -from reflex.components.component import NoSSRComponent as NoSSRComponent -from reflex.components.component import memo as memo -from reflex.components import chakra as chakra -from reflex.components import el as el -from reflex.components import lucide as lucide -from reflex.components import next as next -from reflex.components import radix as radix -from reflex.components.radix import color_mode as color_mode -from reflex.components import recharts as recharts -from reflex.components.moment.moment import MomentDelta as MomentDelta -from reflex import config as config -from reflex.config import Config as Config -from reflex.config import DBConfig as DBConfig -from reflex import constants as constants -from reflex.constants import Env as Env -from reflex import event as event -from reflex.event import EventChain as EventChain -from reflex.event import EventHandler as EventHandler -from reflex.event import background as background -from reflex.event import call_script as call_script -from reflex.event import clear_local_storage as clear_local_storage -from reflex.event import console_log as console_log -from reflex.event import download as download -from reflex.event import prevent_default as prevent_default -from reflex.event import redirect as redirect -from reflex.event import remove_cookie as remove_cookie -from reflex.event import remove_local_storage as remove_local_storage -from reflex.event import set_clipboard as set_clipboard -from reflex.event import set_focus as set_focus -from reflex.event import scroll_to as scroll_to -from reflex.event import set_value as set_value -from reflex.event import stop_propagation as stop_propagation -from reflex.event import upload_files as upload_files -from reflex.event import window_alert as window_alert -from reflex import middleware as middleware -from reflex.middleware import Middleware as Middleware -from reflex import model as model -from reflex.model import session as session -from reflex.model import Model as Model -from reflex.page import page as page -from reflex import route as route -from reflex import state as state -from reflex.state import var as var -from reflex.state import Cookie as Cookie -from reflex.state import LocalStorage as LocalStorage -from reflex.state import ComponentState as ComponentState -from reflex.state import State as State -from reflex import style as style -from reflex.style import toggle_color_mode as toggle_color_mode -from reflex import testing as testing -from reflex import utils as utils -from reflex.utils.imports import ImportVar as ImportVar -from reflex import vars as vars -from reflex.vars import cached_var as cached_var -from reflex.vars import Var as Var +"""Stub file for reflex/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from . import admin as admin +from . import app as app +from . import base as base +from . import compiler as compiler +from . import components as components +from . import config as config +from . import event as event +from . import model as model +from . import style as style +from . import testing as testing +from . import utils as utils +from . import vars as vars + +from .experimental import _x as _x +from .admin import AdminDash as AdminDash +from .app import App as App +from .app import UploadFile as UploadFile +from .base import Base as Base +from .components.component import Component as Component +from .components.component import NoSSRComponent as NoSSRComponent +from .components.component import memo as memo +from .components.el.elements.media import image as image +from .components.lucide import icon as icon +from .components.base.fragment import fragment as fragment +from .components.base.fragment import Fragment as Fragment +from .components.base.script import script as script +from .components.base.script import Script as Script +from .components.suneditor import editor as editor +from .components.suneditor import EditorButtonList as EditorButtonList +from .components.suneditor import EditorOptions as EditorOptions +from .components import el as el +from .components import chakra as chakra +from .components import radix as radix +from .components import lucide as lucide +from .components import recharts as recharts +from .components import next as next +from .components.markdown import markdown as markdown +from .components.radix.themes.color_mode import color_mode as color_mode +from .components.radix.themes.base import theme as theme +from .components.radix.themes.base import theme_panel as theme_panel +from .components.radix.themes.components.alert_dialog import ( + alert_dialog as alert_dialog, +) +from .components.radix.themes.components.aspect_ratio import ( + aspect_ratio as aspect_ratio, +) +from .components.radix.themes.components.avatar import avatar as avatar +from .components.radix.themes.components.badge import badge as badge +from .components.radix.themes.components.button import button as button +from .components.radix.themes.components.callout import callout as callout +from .components.radix.themes.components.card import card as card +from .components.radix.themes.components.checkbox import checkbox as checkbox +from .components.radix.themes.components.context_menu import ( + context_menu as context_menu, +) +from .components.radix.themes.components.data_list import data_list as data_list +from .components.radix.themes.components.dialog import dialog as dialog +from .components.radix.themes.components.hover_card import hover_card as hover_card +from .components.radix.themes.components.icon_button import icon_button as icon_button +from .components.radix.themes.components.text_field import input as input +from .components.radix.themes.components.inset import inset as inset +from .components.radix.themes.components.popover import popover as popover +from .components.radix.themes.components.scroll_area import scroll_area as scroll_area +from .components.radix.themes.components.select import select as select +from .components.radix.themes.components.skeleton import skeleton as skeleton +from .components.radix.themes.components.slider import slider as slider +from .components.radix.themes.components.spinner import spinner as spinner +from .components.radix.themes.components.switch import switch as switch +from .components.radix.themes.components.table import table as table +from .components.radix.themes.components.tabs import tabs as tabs +from .components.radix.themes.components.text_area import text_area as text_area +from .components.radix.themes.components.tooltip import tooltip as tooltip +from .components.radix.themes.components.segmented_control import ( + segmented_control as segmented_control, +) +from .components.radix.themes.components.radio_cards import radio_cards as radio_cards +from .components.radix.themes.components.checkbox_cards import ( + checkbox_cards as checkbox_cards, +) +from .components.radix.themes.components.checkbox_group import ( + checkbox_group as checkbox_group, +) +from .components.radix.themes.components.text_field import text_field as text_field +from .components.radix.themes.components.radio_group import radio as radio +from .components.radix.themes.components.radio_group import radio_group as radio_group +from .components.radix.themes.components.dropdown_menu import menu as menu +from .components.radix.themes.components.dropdown_menu import ( + dropdown_menu as dropdown_menu, +) +from .components.radix.themes.components.separator import divider as divider +from .components.radix.themes.components.separator import separator as separator +from .components.radix.themes.typography.blockquote import blockquote as blockquote +from .components.radix.themes.typography.code import code as code +from .components.radix.themes.typography.heading import heading as heading +from .components.radix.themes.typography.link import link as link +from .components.radix.themes.typography.text import text as text +from .components.radix.themes.layout.box import box as box +from .components.radix.themes.layout.center import center as center +from .components.radix.themes.layout.container import container as container +from .components.radix.themes.layout.flex import flex as flex +from .components.radix.themes.layout.grid import grid as grid +from .components.radix.themes.layout.section import section as section +from .components.radix.themes.layout.spacer import spacer as spacer +from .components.radix.themes.layout.stack import stack as stack +from .components.radix.themes.layout.stack import hstack as hstack +from .components.radix.themes.layout.stack import vstack as vstack +from .components.radix.themes.layout.list import list_ns as list +from .components.radix.themes.layout.list import list_item as list_item +from .components.radix.themes.layout.list import ordered_list as ordered_list +from .components.radix.themes.layout.list import unordered_list as unordered_list +from .components.radix.primitives.accordion import accordion as accordion +from .components.radix.primitives.drawer import drawer as drawer +from .components.radix.primitives.form import form as form +from .components.radix.primitives.progress import progress as progress +from .components.plotly import plotly as plotly +from .components.react_player import audio as audio +from .components.react_player import video as video +from .components.core.banner import connection_banner as connection_banner +from .components.core.banner import connection_modal as connection_modal +from .components.core.cond import cond as cond +from .components.core.cond import color_mode_cond as color_mode_cond +from .components.core.foreach import foreach as foreach +from .components.core.debounce import debounce_input as debounce_input +from .components.core.html import html as html +from .components.core.match import match as match +from .components.core.colors import color as color +from .components.core.responsive import desktop_only as desktop_only +from .components.core.responsive import mobile_and_tablet as mobile_and_tablet +from .components.core.responsive import mobile_only as mobile_only +from .components.core.responsive import tablet_and_desktop as tablet_and_desktop +from .components.core.responsive import tablet_only as tablet_only +from .components.core.upload import cancel_upload as cancel_upload +from .components.core.upload import clear_selected_files as clear_selected_files +from .components.core.upload import get_upload_dir as get_upload_dir +from .components.core.upload import get_upload_url as get_upload_url +from .components.core.upload import selected_files as selected_files +from .components.core.upload import upload as upload +from .components.datadisplay.code import code_block as code_block +from .components.datadisplay.dataeditor import data_editor as data_editor +from .components.datadisplay.dataeditor import data_editor_theme as data_editor_theme +from .components.datadisplay.logo import logo as logo +from .components.gridjs import data_table as data_table +from .components.moment import MomentDelta as MomentDelta +from .components.moment import moment as moment +from .config import Config as Config +from .config import DBConfig as DBConfig +from .constants import Env as Env +from .event import EventChain as EventChain +from .event import EventHandler as EventHandler +from .event import background as background +from .event import call_script as call_script +from .event import clear_local_storage as clear_local_storage +from .event import console_log as console_log +from .event import download as download +from .event import prevent_default as prevent_default +from .event import redirect as redirect +from .event import remove_cookie as remove_cookie +from .event import remove_local_storage as remove_local_storage +from .event import set_clipboard as set_clipboard +from .event import set_focus as set_focus +from .event import scroll_to as scroll_to +from .event import set_value as set_value +from .event import stop_propagation as stop_propagation +from .event import upload_files as upload_files +from .event import window_alert as window_alert +from .middleware import middleware as middleware +from .middleware import Middleware as Middleware +from .model import session as session +from .model import Model as Model +from .state import var as var +from .state import Cookie as Cookie +from .state import LocalStorage as LocalStorage +from .state import ComponentState as ComponentState +from .state import State as State +from .style import Style as Style +from .style import toggle_color_mode as toggle_color_mode +from .utils.imports import ImportVar as ImportVar +from .utils.serializers import serializer as serializer +from .vars import cached_var as cached_var +from .vars import Var as Var +from reflex.utils import lazy_loader +from .page import page as page + +RADIX_THEMES_MAPPING: dict +RADIX_THEMES_COMPONENTS_MAPPING: dict +RADIX_THEMES_LAYOUT_MAPPING: dict +RADIX_THEMES_TYPOGRAPHY_MAPPING: dict +RADIX_PRIMITIVES_MAPPING: dict +COMPONENTS_CORE_MAPPING: dict +COMPONENTS_BASE_MAPPING: dict +RADIX_MAPPING: dict diff --git a/reflex/app.py b/reflex/app.py index 98ad1eacf..89d68c1db 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -50,7 +50,7 @@ from reflex.components.component import ( ComponentStyle, evaluate_style_namespaces, ) -from reflex.components.core import connection_pulser, connection_toaster +from reflex.components.core.banner import connection_pulser, connection_toaster from reflex.components.core.client_side_routing import ( Default404Page, wait_for_client_redirect, diff --git a/reflex/components/__init__.py b/reflex/components/__init__.py index a5a7fa5d0..680f5f4db 100644 --- a/reflex/components/__init__.py +++ b/reflex/components/__init__.py @@ -1,21 +1,35 @@ """Import all the components.""" from __future__ import annotations -from . import lucide -from .base import Fragment, Script, fragment, script -from .component import Component -from .component import NoSSRComponent as NoSSRComponent -from .core import * -from .datadisplay import * -from .el import img as image -from .gridjs import * -from .markdown import * -from .moment import * -from .next import NextLink, next_link -from .plotly import * -from .radix import * -from .react_player import * -from .sonner import * -from .suneditor import * +from reflex.utils import lazy_loader -icon = lucide.icon +_SUBMODULES: set[str] = { + "lucide", + "core", + "datadisplay", + "gridjs", + "markdown", + "moment", + "plotly", + "radix", + "react_player", + "sonner", + "suneditor", + "chakra", + "el", + "base", + "recharts", +} + +_SUBMOD_ATTRS: dict[str, list[str]] = { + "component": [ + "Component", + "NoSSRComponent", + ], + "next": ["NextLink", "next_link"], +} +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submodules=_SUBMODULES, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/__init__.pyi b/reflex/components/__init__.pyi new file mode 100644 index 000000000..1d96cfb44 --- /dev/null +++ b/reflex/components/__init__.pyi @@ -0,0 +1,26 @@ +"""Stub file for reflex/components/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from . import base as base +from . import chakra as chakra +from . import core as core +from . import datadisplay as datadisplay +from . import el as el +from . import gridjs as gridjs +from . import lucide as lucide +from . import markdown as markdown +from . import moment as moment +from . import plotly as plotly +from . import radix as radix +from . import react_player as react_player +from . import recharts as recharts +from . import sonner as sonner +from . import suneditor as suneditor + +from .component import Component as Component +from .component import NoSSRComponent as NoSSRComponent +from .next import NextLink as NextLink +from .next import next_link as next_link +from reflex.utils import lazy_loader diff --git a/reflex/components/base/__init__.py b/reflex/components/base/__init__.py index 58a0f6a55..f5d668e8e 100644 --- a/reflex/components/base/__init__.py +++ b/reflex/components/base/__init__.py @@ -1,12 +1,28 @@ """Base components.""" +from __future__ import annotations -from .body import Body -from .document import DocumentHead, Html, Main, NextScript -from .fragment import Fragment -from .head import Head -from .link import RawLink, ScriptTag -from .meta import Description, Image, Meta, Title -from .script import Script +from reflex.utils import lazy_loader -fragment = Fragment.create -script = Script.create +_SUBMODULES: set[str] = {"app_wrap", "bare"} + +_SUBMOD_ATTRS: dict[str, list[str]] = { + "body": ["Body"], + "document": ["DocumentHead", "Html", "Main", "NextScript"], + "fragment": [ + "Fragment", + "fragment", + ], + "head": [ + "head", + "Head", + ], + "link": ["RawLink", "ScriptTag"], + "meta": ["Description", "Image", "Meta", "Title"], + "script": ["Script", "script"], +} + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submodules=_SUBMODULES, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/base/__init__.pyi b/reflex/components/base/__init__.pyi new file mode 100644 index 000000000..efe0ea6d4 --- /dev/null +++ b/reflex/components/base/__init__.pyi @@ -0,0 +1,26 @@ +"""Stub file for reflex/components/base/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from . import app_wrap as app_wrap +from . import bare as bare + +from .body import Body as Body +from .document import DocumentHead as DocumentHead +from .document import Html as Html +from .document import Main as Main +from .document import NextScript as NextScript +from .fragment import Fragment as Fragment +from .fragment import fragment as fragment +from .head import head as head +from .head import Head as Head +from .link import RawLink as RawLink +from .link import ScriptTag as ScriptTag +from .meta import Description as Description +from .meta import Image as Image +from .meta import Meta as Meta +from .meta import Title as Title +from .script import Script as Script +from .script import script as script +from reflex.utils import lazy_loader diff --git a/reflex/components/base/fragment.py b/reflex/components/base/fragment.py index 99554ede9..38c6f0b13 100644 --- a/reflex/components/base/fragment.py +++ b/reflex/components/base/fragment.py @@ -7,3 +7,6 @@ class Fragment(Component): library = "react" tag = "Fragment" + + +fragment = Fragment.create diff --git a/reflex/components/base/fragment.pyi b/reflex/components/base/fragment.pyi index 9d9754d37..845d39dc5 100644 --- a/reflex/components/base/fragment.pyi +++ b/reflex/components/base/fragment.pyi @@ -84,3 +84,5 @@ class Fragment(Component): The component. """ ... + +fragment = Fragment.create diff --git a/reflex/components/base/head.py b/reflex/components/base/head.py index c8a63e7b4..b130ed22f 100644 --- a/reflex/components/base/head.py +++ b/reflex/components/base/head.py @@ -15,3 +15,6 @@ class Head(NextHeadLib, MemoizationLeaf): tag = "NextHead" is_default = True + + +head = Head.create diff --git a/reflex/components/base/head.pyi b/reflex/components/base/head.pyi index eb5112d55..205a2076c 100644 --- a/reflex/components/base/head.pyi +++ b/reflex/components/base/head.pyi @@ -160,3 +160,5 @@ class Head(NextHeadLib, MemoizationLeaf): The memoization leaf """ ... + +head = Head.create diff --git a/reflex/components/base/script.py b/reflex/components/base/script.py index e379a1824..ae3dfc598 100644 --- a/reflex/components/base/script.py +++ b/reflex/components/base/script.py @@ -70,3 +70,6 @@ class Script(Component): "on_ready": lambda: [], "on_error": lambda: [], } + + +script = Script.create diff --git a/reflex/components/base/script.pyi b/reflex/components/base/script.pyi index 3bd824122..92cfd9513 100644 --- a/reflex/components/base/script.pyi +++ b/reflex/components/base/script.pyi @@ -113,3 +113,5 @@ class Script(Component): """ ... def get_event_triggers(self) -> dict[str, Union[Var, Any]]: ... + +script = Script.create diff --git a/reflex/components/core/__init__.py b/reflex/components/core/__init__.py index 877d27739..6c866269e 100644 --- a/reflex/components/core/__init__.py +++ b/reflex/components/core/__init__.py @@ -1,40 +1,54 @@ """Core Reflex components.""" +from __future__ import annotations -from . import layout as layout -from .banner import ( - ConnectionBanner, - ConnectionModal, - ConnectionPulser, - ConnectionToaster, -) -from .colors import color -from .cond import Cond, color_mode_cond, cond -from .debounce import DebounceInput -from .foreach import Foreach -from .html import Html -from .match import Match -from .responsive import ( - desktop_only, - mobile_and_tablet, - mobile_only, - tablet_and_desktop, - tablet_only, -) -from .upload import ( - UploadNamespace, - cancel_upload, - clear_selected_files, - get_upload_dir, - get_upload_url, - selected_files, -) +from reflex.utils import lazy_loader -connection_banner = ConnectionBanner.create -connection_modal = ConnectionModal.create -connection_toaster = ConnectionToaster.create -connection_pulser = ConnectionPulser.create -debounce_input = DebounceInput.create -foreach = Foreach.create -html = Html.create -match = Match.create -upload = UploadNamespace() +_SUBMODULES: set[str] = {"layout"} + +_SUBMOD_ATTRS: dict[str, list[str]] = { + "banner": [ + "ConnectionBanner", + "ConnectionModal", + "ConnectionPulser", + "ConnectionToaster", + "connection_banner", + "connection_modal", + "connection_toaster", + "connection_pulser", + ], + "colors": [ + "color", + ], + "cond": ["Cond", "color_mode_cond", "cond"], + "debounce": ["DebounceInput", "debounce_input"], + "foreach": [ + "foreach", + "Foreach", + ], + "html": ["html", "Html"], + "match": [ + "match", + "Match", + ], + "responsive": [ + "desktop_only", + "mobile_and_tablet", + "mobile_only", + "tablet_and_desktop", + "tablet_only", + ], + "upload": [ + "upload", + "cancel_upload", + "clear_selected_files", + "get_upload_dir", + "get_upload_url", + "selected_files", + ], +} + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submodules=_SUBMODULES, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/core/__init__.pyi b/reflex/components/core/__init__.pyi new file mode 100644 index 000000000..85e0dd328 --- /dev/null +++ b/reflex/components/core/__init__.pyi @@ -0,0 +1,39 @@ +"""Stub file for reflex/components/core/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from . import layout as layout + +from .banner import ConnectionBanner as ConnectionBanner +from .banner import ConnectionModal as ConnectionModal +from .banner import ConnectionPulser as ConnectionPulser +from .banner import ConnectionToaster as ConnectionToaster +from .banner import connection_banner as connection_banner +from .banner import connection_modal as connection_modal +from .banner import connection_toaster as connection_toaster +from .banner import connection_pulser as connection_pulser +from .colors import color as color +from .cond import Cond as Cond +from .cond import color_mode_cond as color_mode_cond +from .cond import cond as cond +from .debounce import DebounceInput as DebounceInput +from .debounce import debounce_input as debounce_input +from .foreach import foreach as foreach +from .foreach import Foreach as Foreach +from .html import html as html +from .html import Html as Html +from .match import match as match +from .match import Match as Match +from .responsive import desktop_only as desktop_only +from .responsive import mobile_and_tablet as mobile_and_tablet +from .responsive import mobile_only as mobile_only +from .responsive import tablet_and_desktop as tablet_and_desktop +from .responsive import tablet_only as tablet_only +from .upload import upload as upload +from .upload import cancel_upload as cancel_upload +from .upload import clear_selected_files as clear_selected_files +from .upload import get_upload_dir as get_upload_dir +from .upload import get_upload_url as get_upload_url +from .upload import selected_files as selected_files +from reflex.utils import lazy_loader diff --git a/reflex/components/core/banner.py b/reflex/components/core/banner.py index c6250743c..07d2143c5 100644 --- a/reflex/components/core/banner.py +++ b/reflex/components/core/banner.py @@ -14,7 +14,7 @@ from reflex.components.radix.themes.components.dialog import ( DialogRoot, DialogTitle, ) -from reflex.components.radix.themes.layout import Flex +from reflex.components.radix.themes.layout.flex import Flex from reflex.components.radix.themes.typography.text import Text from reflex.components.sonner.toast import Toaster, ToastProps from reflex.constants import Dirs, Hooks, Imports @@ -278,3 +278,9 @@ class ConnectionPulser(Div): width="100vw", height="0", ) + + +connection_banner = ConnectionBanner.create +connection_modal = ConnectionModal.create +connection_toaster = ConnectionToaster.create +connection_pulser = ConnectionPulser.create diff --git a/reflex/components/core/banner.pyi b/reflex/components/core/banner.pyi index 64f9761f9..1cf4ec87c 100644 --- a/reflex/components/core/banner.pyi +++ b/reflex/components/core/banner.pyi @@ -18,7 +18,7 @@ from reflex.components.radix.themes.components.dialog import ( DialogRoot, DialogTitle, ) -from reflex.components.radix.themes.layout import Flex +from reflex.components.radix.themes.layout.flex import Flex from reflex.components.radix.themes.typography.text import Text from reflex.components.sonner.toast import Toaster, ToastProps from reflex.constants import Dirs, Hooks, Imports @@ -574,3 +574,8 @@ class ConnectionPulser(Div): The connection pulser component. """ ... + +connection_banner = ConnectionBanner.create +connection_modal = ConnectionModal.create +connection_toaster = ConnectionToaster.create +connection_pulser = ConnectionPulser.create diff --git a/reflex/components/core/debounce.py b/reflex/components/core/debounce.py index 88d1e1f94..d34981426 100644 --- a/reflex/components/core/debounce.py +++ b/reflex/components/core/debounce.py @@ -136,3 +136,6 @@ class DebounceInput(Component): def _render(self): return super()._render().remove_props("ref") + + +debounce_input = DebounceInput.create diff --git a/reflex/components/core/debounce.pyi b/reflex/components/core/debounce.pyi index 7b87a3cfe..ab8dc6453 100644 --- a/reflex/components/core/debounce.pyi +++ b/reflex/components/core/debounce.pyi @@ -106,3 +106,5 @@ class DebounceInput(Component): """ ... def get_event_triggers(self) -> dict[str, Any]: ... + +debounce_input = DebounceInput.create diff --git a/reflex/components/core/foreach.py b/reflex/components/core/foreach.py index 9a6765491..b62764444 100644 --- a/reflex/components/core/foreach.py +++ b/reflex/components/core/foreach.py @@ -139,3 +139,6 @@ class Foreach(Component): arg_index=tag.get_index_var_arg(), iterable_type=tag.iterable._var_type.mro()[0].__name__, ) + + +foreach = Foreach.create diff --git a/reflex/components/core/html.py b/reflex/components/core/html.py index e344cb3d7..f4d9ba923 100644 --- a/reflex/components/core/html.py +++ b/reflex/components/core/html.py @@ -43,3 +43,6 @@ class Html(Div): # Create the component. return super().create(**props) + + +html = Html.create diff --git a/reflex/components/core/html.pyi b/reflex/components/core/html.pyi index e07f455bb..e37eace5d 100644 --- a/reflex/components/core/html.pyi +++ b/reflex/components/core/html.pyi @@ -149,3 +149,5 @@ class Html(Div): ValueError: If children are not provided or more than one child is provided. """ ... + +html = Html.create diff --git a/reflex/components/core/match.py b/reflex/components/core/match.py index 97741b9fa..8b684678e 100644 --- a/reflex/components/core/match.py +++ b/reflex/components/core/match.py @@ -273,3 +273,6 @@ class Match(MemoizationLeaf): super()._get_imports(), getattr(self.cond._var_data, "imports", {}), ) + + +match = Match.create diff --git a/reflex/components/core/responsive.py b/reflex/components/core/responsive.py index 98033fd70..e1c7f0cb3 100644 --- a/reflex/components/core/responsive.py +++ b/reflex/components/core/responsive.py @@ -1,6 +1,6 @@ """Responsive components.""" -from reflex.components.radix.themes.layout import Box +from reflex.components.radix.themes.layout.box import Box # Add responsive styles shortcuts. diff --git a/reflex/components/core/upload.py b/reflex/components/core/upload.py index 65c441924..98a3d597e 100644 --- a/reflex/components/core/upload.py +++ b/reflex/components/core/upload.py @@ -7,9 +7,9 @@ from pathlib import Path from typing import Any, Callable, ClassVar, Dict, List, Optional, Union from reflex import constants -from reflex.components.chakra.forms.input import Input -from reflex.components.chakra.layout.box import Box from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf +from reflex.components.el.elements.forms import Input +from reflex.components.radix.themes.layout.box import Box from reflex.constants import Dirs from reflex.event import ( CallableEventSpec, @@ -339,3 +339,6 @@ class UploadNamespace(ComponentNamespace): root = Upload.create __call__ = StyledUpload.create + + +upload = UploadNamespace() diff --git a/reflex/components/core/upload.pyi b/reflex/components/core/upload.pyi index e415761e0..b9b4ad8d0 100644 --- a/reflex/components/core/upload.pyi +++ b/reflex/components/core/upload.pyi @@ -11,9 +11,9 @@ import os from pathlib import Path from typing import Any, Callable, ClassVar, Dict, List, Optional, Union from reflex import constants -from reflex.components.chakra.forms.input import Input -from reflex.components.chakra.layout.box import Box from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf +from reflex.components.el.elements.forms import Input +from reflex.components.radix.themes.layout.box import Box from reflex.constants import Dirs from reflex.event import ( CallableEventSpec, @@ -417,3 +417,5 @@ class UploadNamespace(ComponentNamespace): The styled upload component. """ ... + +upload = UploadNamespace() diff --git a/reflex/components/datadisplay/__init__.py b/reflex/components/datadisplay/__init__.py index 2d90b1843..678dfc686 100644 --- a/reflex/components/datadisplay/__init__.py +++ b/reflex/components/datadisplay/__init__.py @@ -1,11 +1,20 @@ """Data grid components.""" +from __future__ import annotations -from .code import CodeBlock -from .code import LiteralCodeBlockTheme as LiteralCodeBlockTheme -from .code import LiteralCodeLanguage as LiteralCodeLanguage -from .dataeditor import DataEditor, DataEditorTheme -from .logo import logo +from reflex.utils import lazy_loader -code_block = CodeBlock.create -data_editor = DataEditor.create -data_editor_theme = DataEditorTheme +_SUBMOD_ATTRS: dict[str, list[str]] = { + "code": [ + "CodeBlock", + "code_block", + "LiteralCodeBlockTheme", + "LiteralCodeLanguage", + ], + "dataeditor": ["data_editor", "data_editor_theme", "DataEditorTheme"], + "logo": ["logo"], +} + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/datadisplay/__init__.pyi b/reflex/components/datadisplay/__init__.pyi new file mode 100644 index 000000000..1297d1c52 --- /dev/null +++ b/reflex/components/datadisplay/__init__.pyi @@ -0,0 +1,14 @@ +"""Stub file for reflex/components/datadisplay/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from .code import CodeBlock as CodeBlock +from .code import code_block as code_block +from .code import LiteralCodeBlockTheme as LiteralCodeBlockTheme +from .code import LiteralCodeLanguage as LiteralCodeLanguage +from .dataeditor import data_editor as data_editor +from .dataeditor import data_editor_theme as data_editor_theme +from .dataeditor import DataEditorTheme as DataEditorTheme +from .logo import logo as logo +from reflex.utils import lazy_loader diff --git a/reflex/components/datadisplay/code.py b/reflex/components/datadisplay/code.py index e6daf45f6..8e150c691 100644 --- a/reflex/components/datadisplay/code.py +++ b/reflex/components/datadisplay/code.py @@ -523,3 +523,6 @@ class CodeBlock(Component): if theme in ["light", "dark"]: return f"one-{theme}" return theme + + +code_block = CodeBlock.create diff --git a/reflex/components/datadisplay/code.pyi b/reflex/components/datadisplay/code.pyi index 901bf38e3..238cb2fb6 100644 --- a/reflex/components/datadisplay/code.pyi +++ b/reflex/components/datadisplay/code.pyi @@ -1114,3 +1114,5 @@ class CodeBlock(Component): def add_style(self): ... @staticmethod def convert_theme_name(theme) -> str: ... + +code_block = CodeBlock.create diff --git a/reflex/components/datadisplay/dataeditor.py b/reflex/components/datadisplay/dataeditor.py index ce9e3134f..7b9003534 100644 --- a/reflex/components/datadisplay/dataeditor.py +++ b/reflex/components/datadisplay/dataeditor.py @@ -410,3 +410,7 @@ def serialize_dataeditortheme(theme: DataEditorTheme): return format.json_dumps( {format.to_camel_case(k): v for k, v in theme.__dict__.items() if v is not None} ) + + +data_editor = DataEditor.create +data_editor_theme = DataEditorTheme diff --git a/reflex/components/datadisplay/dataeditor.pyi b/reflex/components/datadisplay/dataeditor.pyi index fe8c52aad..92a0509a2 100644 --- a/reflex/components/datadisplay/dataeditor.pyi +++ b/reflex/components/datadisplay/dataeditor.pyi @@ -236,3 +236,6 @@ class DataEditor(NoSSRComponent): @serializer def serialize_dataeditortheme(theme: DataEditorTheme): ... + +data_editor = DataEditor.create +data_editor_theme = DataEditorTheme diff --git a/reflex/components/el/__init__.py b/reflex/components/el/__init__.py index 6b6517f77..4aacc8ce0 100644 --- a/reflex/components/el/__init__.py +++ b/reflex/components/el/__init__.py @@ -1,3 +1,17 @@ """The el package exports raw HTML elements.""" +from __future__ import annotations -from .elements import * +from reflex.utils import lazy_loader + +from . import elements + +_SUBMODULES: set[str] = {"elements"} +_SUBMOD_ATTRS: dict[str, list[str]] = { + f"elements.{k}": v for k, v in elements._MAPPING.items() +} + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submodules=_SUBMODULES, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/el/__init__.pyi b/reflex/components/el/__init__.pyi new file mode 100644 index 000000000..81b00e37e --- /dev/null +++ b/reflex/components/el/__init__.pyi @@ -0,0 +1,227 @@ +"""Stub file for reflex/components/el/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from . import elements as elements + +from .elements.forms import button as button +from .elements.forms import fieldset as fieldset +from .elements.forms import form as form +from .elements.forms import input as input +from .elements.forms import label as label +from .elements.forms import legend as legend +from .elements.forms import meter as meter +from .elements.forms import optgroup as optgroup +from .elements.forms import option as option +from .elements.forms import output as output +from .elements.forms import progress as progress +from .elements.forms import select as select +from .elements.forms import textarea as textarea +from .elements.forms import Button as Button +from .elements.forms import Fieldset as Fieldset +from .elements.forms import Form as Form +from .elements.forms import Input as Input +from .elements.forms import Label as Label +from .elements.forms import Legend as Legend +from .elements.forms import Meter as Meter +from .elements.forms import Optgroup as Optgroup +from .elements.forms import Option as Option +from .elements.forms import Output as Output +from .elements.forms import Progress as Progress +from .elements.forms import Select as Select +from .elements.forms import Textarea as Textarea +from .elements.inline import a as a +from .elements.inline import abbr as abbr +from .elements.inline import b as b +from .elements.inline import bdi as bdi +from .elements.inline import bdo as bdo +from .elements.inline import br as br +from .elements.inline import cite as cite +from .elements.inline import code as code +from .elements.inline import data as data +from .elements.inline import dfn as dfn +from .elements.inline import em as em +from .elements.inline import i as i +from .elements.inline import kbd as kbd +from .elements.inline import mark as mark +from .elements.inline import q as q +from .elements.inline import rp as rp +from .elements.inline import rt as rt +from .elements.inline import ruby as ruby +from .elements.inline import s as s +from .elements.inline import samp as samp +from .elements.inline import small as small +from .elements.inline import span as span +from .elements.inline import strong as strong +from .elements.inline import sub as sub +from .elements.inline import sup as sup +from .elements.inline import time as time +from .elements.inline import u as u +from .elements.inline import wbr as wbr +from .elements.inline import A as A +from .elements.inline import Abbr as Abbr +from .elements.inline import B as B +from .elements.inline import Bdi as Bdi +from .elements.inline import Bdo as Bdo +from .elements.inline import Br as Br +from .elements.inline import Cite as Cite +from .elements.inline import Code as Code +from .elements.inline import Data as Data +from .elements.inline import Dfn as Dfn +from .elements.inline import Em as Em +from .elements.inline import I as I +from .elements.inline import Kbd as Kbd +from .elements.inline import Mark as Mark +from .elements.inline import Q as Q +from .elements.inline import Rp as Rp +from .elements.inline import Rt as Rt +from .elements.inline import Ruby as Ruby +from .elements.inline import S as S +from .elements.inline import Samp as Samp +from .elements.inline import Small as Small +from .elements.inline import Span as Span +from .elements.inline import Strong as Strong +from .elements.inline import Sub as Sub +from .elements.inline import Sup as Sup +from .elements.inline import Time as Time +from .elements.inline import U as U +from .elements.inline import Wbr as Wbr +from .elements.media import area as area +from .elements.media import audio as audio +from .elements.media import img as img +from .elements.media import image as image +from .elements.media import map as map +from .elements.media import track as track +from .elements.media import video as video +from .elements.media import embed as embed +from .elements.media import iframe as iframe +from .elements.media import object as object +from .elements.media import picture as picture +from .elements.media import portal as portal +from .elements.media import source as source +from .elements.media import svg as svg +from .elements.media import path as path +from .elements.media import Area as Area +from .elements.media import Audio as Audio +from .elements.media import Img as Img +from .elements.media import Map as Map +from .elements.media import Track as Track +from .elements.media import Video as Video +from .elements.media import Embed as Embed +from .elements.media import Iframe as Iframe +from .elements.media import Object as Object +from .elements.media import Picture as Picture +from .elements.media import Portal as Portal +from .elements.media import Source as Source +from .elements.media import Svg as Svg +from .elements.media import Path as Path +from .elements.metadata import base as base +from .elements.metadata import head as head +from .elements.metadata import link as link +from .elements.metadata import meta as meta +from .elements.metadata import title as title +from .elements.metadata import Base as Base +from .elements.metadata import Head as Head +from .elements.metadata import Link as Link +from .elements.metadata import Meta as Meta +from .elements.metadata import Title as Title +from .elements.other import details as details +from .elements.other import dialog as dialog +from .elements.other import summary as summary +from .elements.other import slot as slot +from .elements.other import template as template +from .elements.other import math as math +from .elements.other import html as html +from .elements.other import Details as Details +from .elements.other import Dialog as Dialog +from .elements.other import Summary as Summary +from .elements.other import Slot as Slot +from .elements.other import Template as Template +from .elements.other import Math as Math +from .elements.other import Html as Html +from .elements.scripts import canvas as canvas +from .elements.scripts import noscript as noscript +from .elements.scripts import script as script +from .elements.scripts import Canvas as Canvas +from .elements.scripts import Noscript as Noscript +from .elements.scripts import Script as Script +from .elements.sectioning import address as address +from .elements.sectioning import article as article +from .elements.sectioning import aside as aside +from .elements.sectioning import body as body +from .elements.sectioning import header as header +from .elements.sectioning import footer as footer +from .elements.sectioning import h1 as h1 +from .elements.sectioning import h2 as h2 +from .elements.sectioning import h3 as h3 +from .elements.sectioning import h4 as h4 +from .elements.sectioning import h5 as h5 +from .elements.sectioning import h6 as h6 +from .elements.sectioning import main as main +from .elements.sectioning import nav as nav +from .elements.sectioning import section as section +from .elements.sectioning import Address as Address +from .elements.sectioning import Article as Article +from .elements.sectioning import Aside as Aside +from .elements.sectioning import Body as Body +from .elements.sectioning import Header as Header +from .elements.sectioning import Footer as Footer +from .elements.sectioning import H1 as H1 +from .elements.sectioning import H2 as H2 +from .elements.sectioning import H3 as H3 +from .elements.sectioning import H4 as H4 +from .elements.sectioning import H5 as H5 +from .elements.sectioning import H6 as H6 +from .elements.sectioning import Main as Main +from .elements.sectioning import Nav as Nav +from .elements.sectioning import Section as Section +from .elements.tables import caption as caption +from .elements.tables import col as col +from .elements.tables import colgroup as colgroup +from .elements.tables import table as table +from .elements.tables import td as td +from .elements.tables import tfoot as tfoot +from .elements.tables import th as th +from .elements.tables import thead as thead +from .elements.tables import tr as tr +from .elements.tables import Tbody as Tbody +from .elements.tables import Caption as Caption +from .elements.tables import Col as Col +from .elements.tables import Colgroup as Colgroup +from .elements.tables import Table as Table +from .elements.tables import Td as Td +from .elements.tables import Tfoot as Tfoot +from .elements.tables import Th as Th +from .elements.tables import Thead as Thead +from .elements.tables import Tr as Tr +from .elements.typography import blockquote as blockquote +from .elements.typography import dd as dd +from .elements.typography import div as div +from .elements.typography import dl as dl +from .elements.typography import dt as dt +from .elements.typography import figcaption as figcaption +from .elements.typography import hr as hr +from .elements.typography import ol as ol +from .elements.typography import li as li +from .elements.typography import p as p +from .elements.typography import pre as pre +from .elements.typography import ul as ul +from .elements.typography import ins as ins +from .elements.typography import del_ as del_ +from .elements.typography import Del as Del +from .elements.typography import Blockquote as Blockquote +from .elements.typography import Dd as Dd +from .elements.typography import Div as Div +from .elements.typography import Dl as Dl +from .elements.typography import Dt as Dt +from .elements.typography import Figcaption as Figcaption +from .elements.typography import Hr as Hr +from .elements.typography import Ol as Ol +from .elements.typography import Li as Li +from .elements.typography import P as P +from .elements.typography import Pre as Pre +from .elements.typography import Ul as Ul +from .elements.typography import Ins as Ins +from reflex.utils import lazy_loader +from . import elements diff --git a/reflex/components/el/elements/__init__.py b/reflex/components/el/elements/__init__.py index 240990280..4a029e7dc 100644 --- a/reflex/components/el/elements/__init__.py +++ b/reflex/components/el/elements/__init__.py @@ -1,227 +1,136 @@ """Element classes.""" -from .forms import ( - Button, - Fieldset, - Form, - Input, - Label, - Legend, - Meter, - Optgroup, - Option, - Output, - Progress, - Select, - Textarea, +from __future__ import annotations + +from reflex.utils import lazy_loader + +_MAPPING = { + "forms": [ + "button", + "fieldset", + "form", + "input", + "label", + "legend", + "meter", + "optgroup", + "option", + "output", + "progress", + "select", + "textarea", + ], + "inline": [ + "a", + "abbr", + "b", + "bdi", + "bdo", + "br", + "cite", + "code", + "data", + "dfn", + "em", + "i", + "kbd", + "mark", + "q", + "rp", + "rt", + "ruby", + "s", + "samp", + "small", + "span", + "strong", + "sub", + "sup", + "time", + "u", + "wbr", + ], + "media": [ + "area", + "audio", + "img", + "image", + "map", + "track", + "video", + "embed", + "iframe", + "object", + "picture", + "portal", + "source", + "svg", + "path", + ], + "metadata": [ + "base", + "head", + "link", + "meta", + "title", + ], + "other": ["details", "dialog", "summary", "slot", "template", "math", "html"], + "scripts": ["canvas", "noscript", "script"], + "sectioning": [ + "address", + "article", + "aside", + "body", + "header", + "footer", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "main", + "nav", + "section", + ], + "tables": [ + "caption", + "col", + "colgroup", + "table", + "td", + "tfoot", + "th", + "thead", + "tr", + "Tbody", + ], + "typography": [ + "blockquote", + "dd", + "div", + "dl", + "dt", + "figcaption", + "hr", + "ol", + "li", + "p", + "pre", + "ul", + "ins", + "del_", + "Del", + ], +} + + +EXCLUDE = ["del_", "Del", "image"] +for _, v in _MAPPING.items(): + v.extend([mod.capitalize() for mod in v if mod not in EXCLUDE]) + +_SUBMOD_ATTRS: dict[str, list[str]] = _MAPPING + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submod_attrs=_SUBMOD_ATTRS, ) -from .inline import ( - A, - Abbr, - B, - Bdi, - Bdo, - Br, - Cite, - Code, - Data, - Dfn, - Em, - I, - Kbd, - Mark, - Q, - Rp, - Rt, - Ruby, - S, - Samp, - Small, - Span, - Strong, - Sub, - Sup, - Time, - U, - Wbr, -) -from .media import ( - Area, - Audio, - Embed, - Iframe, - Img, - Map, - Object, - Path, - Picture, - Portal, - Source, - Svg, - Track, - Video, -) -from .metadata import Base, Head, Link, Meta, Title -from .other import Details, Dialog, Html, Math, Slot, Summary, Template -from .scripts import Canvas, Noscript, Script -from .sectioning import ( - H1, - H2, - H3, - H4, - H5, - H6, - Address, - Article, - Aside, - Body, - Footer, - Header, - Main, - Nav, - Section, -) -from .tables import Caption, Col, Colgroup, Table, Tbody, Td, Tfoot, Th, Thead, Tr -from .typography import ( - Blockquote, - Dd, - Del, - Div, - Dl, - Dt, - Figcaption, - Hr, - Ins, - Li, - Ol, - P, - Pre, - Ul, -) - -# Forms -button = Button.create -fieldset = Fieldset.create -form = Form.create -input = Input.create -label = Label.create -legend = Legend.create -meter = Meter.create -optgroup = Optgroup.create -option = Option.create -output = Output.create -progress = Progress.create -select = Select.create -textarea = Textarea.create - -# Tables -caption = Caption.create -col = Col.create -colgroup = Colgroup.create -table = Table.create -tbody = Tbody.create -td = Td.create -tfoot = Tfoot.create -th = Th.create -thead = Thead.create -tr = Tr.create - -# Media -area = Area.create -audio = Audio.create -img = Img.create -map = Map.create -track = Track.create -video = Video.create -embed = Embed.create -iframe = Iframe.create -object = Object.create -picture = Picture.create -portal = Portal.create -source = Source.create -svg = Svg.create -path = Path.create - -# Sectioning -address = Address.create -article = Article.create -aside = Aside.create -body = Body.create -header = Header.create -footer = Footer.create - -# Typography -blockquote = Blockquote.create -dd = Dd.create -div = Div.create -dl = Dl.create -dt = Dt.create -figcaption = Figcaption.create -hr = Hr.create -li = Li.create -ol = Ol.create -p = P.create -pre = Pre.create -ul = Ul.create -ins = Ins.create -del_ = Del.create # 'del' is a reserved keyword in Python -h1 = H1.create -h2 = H2.create -h3 = H3.create -h4 = H4.create -h5 = H5.create -h6 = H6.create -main = Main.create -nav = Nav.create -section = Section.create - -# Inline -a = A.create -abbr = Abbr.create -b = B.create -bdi = Bdi.create -bdo = Bdo.create -br = Br.create -cite = Cite.create -code = Code.create -data = Data.create -dfn = Dfn.create -em = Em.create -i = I.create -kbd = Kbd.create -mark = Mark.create -q = Q.create -rp = Rp.create -rt = Rt.create -ruby = Ruby.create -s = S.create -samp = Samp.create -small = Small.create -span = Span.create -strong = Strong.create -sub = Sub.create -sup = Sup.create -time = Time.create -u = U.create -wbr = Wbr.create - -# Metadata -base = Base.create -head = Head.create -link = Link.create -meta = Meta.create -title = Title.create - -# Scripts -canvas = Canvas.create -noscript = Noscript.create -script = Script.create - -# Other -details = Details.create -dialog = Dialog.create -summary = Summary.create -slot = Slot.create -template = Template.create -svg = Svg.create -math = Math.create -html = Html.create diff --git a/reflex/components/el/elements/__init__.pyi b/reflex/components/el/elements/__init__.pyi new file mode 100644 index 000000000..9e812790a --- /dev/null +++ b/reflex/components/el/elements/__init__.pyi @@ -0,0 +1,341 @@ +"""Stub file for reflex/components/el/elements/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from .forms import button as button +from .forms import fieldset as fieldset +from .forms import form as form +from .forms import input as input +from .forms import label as label +from .forms import legend as legend +from .forms import meter as meter +from .forms import optgroup as optgroup +from .forms import option as option +from .forms import output as output +from .forms import progress as progress +from .forms import select as select +from .forms import textarea as textarea +from .forms import Button as Button +from .forms import Fieldset as Fieldset +from .forms import Form as Form +from .forms import Input as Input +from .forms import Label as Label +from .forms import Legend as Legend +from .forms import Meter as Meter +from .forms import Optgroup as Optgroup +from .forms import Option as Option +from .forms import Output as Output +from .forms import Progress as Progress +from .forms import Select as Select +from .forms import Textarea as Textarea +from .inline import a as a +from .inline import abbr as abbr +from .inline import b as b +from .inline import bdi as bdi +from .inline import bdo as bdo +from .inline import br as br +from .inline import cite as cite +from .inline import code as code +from .inline import data as data +from .inline import dfn as dfn +from .inline import em as em +from .inline import i as i +from .inline import kbd as kbd +from .inline import mark as mark +from .inline import q as q +from .inline import rp as rp +from .inline import rt as rt +from .inline import ruby as ruby +from .inline import s as s +from .inline import samp as samp +from .inline import small as small +from .inline import span as span +from .inline import strong as strong +from .inline import sub as sub +from .inline import sup as sup +from .inline import time as time +from .inline import u as u +from .inline import wbr as wbr +from .inline import A as A +from .inline import Abbr as Abbr +from .inline import B as B +from .inline import Bdi as Bdi +from .inline import Bdo as Bdo +from .inline import Br as Br +from .inline import Cite as Cite +from .inline import Code as Code +from .inline import Data as Data +from .inline import Dfn as Dfn +from .inline import Em as Em +from .inline import I as I +from .inline import Kbd as Kbd +from .inline import Mark as Mark +from .inline import Q as Q +from .inline import Rp as Rp +from .inline import Rt as Rt +from .inline import Ruby as Ruby +from .inline import S as S +from .inline import Samp as Samp +from .inline import Small as Small +from .inline import Span as Span +from .inline import Strong as Strong +from .inline import Sub as Sub +from .inline import Sup as Sup +from .inline import Time as Time +from .inline import U as U +from .inline import Wbr as Wbr +from .media import area as area +from .media import audio as audio +from .media import img as img +from .media import image as image +from .media import map as map +from .media import track as track +from .media import video as video +from .media import embed as embed +from .media import iframe as iframe +from .media import object as object +from .media import picture as picture +from .media import portal as portal +from .media import source as source +from .media import svg as svg +from .media import path as path +from .media import Area as Area +from .media import Audio as Audio +from .media import Img as Img +from .media import Map as Map +from .media import Track as Track +from .media import Video as Video +from .media import Embed as Embed +from .media import Iframe as Iframe +from .media import Object as Object +from .media import Picture as Picture +from .media import Portal as Portal +from .media import Source as Source +from .media import Svg as Svg +from .media import Path as Path +from .metadata import base as base +from .metadata import head as head +from .metadata import link as link +from .metadata import meta as meta +from .metadata import title as title +from .metadata import Base as Base +from .metadata import Head as Head +from .metadata import Link as Link +from .metadata import Meta as Meta +from .metadata import Title as Title +from .other import details as details +from .other import dialog as dialog +from .other import summary as summary +from .other import slot as slot +from .other import template as template +from .other import math as math +from .other import html as html +from .other import Details as Details +from .other import Dialog as Dialog +from .other import Summary as Summary +from .other import Slot as Slot +from .other import Template as Template +from .other import Math as Math +from .other import Html as Html +from .scripts import canvas as canvas +from .scripts import noscript as noscript +from .scripts import script as script +from .scripts import Canvas as Canvas +from .scripts import Noscript as Noscript +from .scripts import Script as Script +from .sectioning import address as address +from .sectioning import article as article +from .sectioning import aside as aside +from .sectioning import body as body +from .sectioning import header as header +from .sectioning import footer as footer +from .sectioning import h1 as h1 +from .sectioning import h2 as h2 +from .sectioning import h3 as h3 +from .sectioning import h4 as h4 +from .sectioning import h5 as h5 +from .sectioning import h6 as h6 +from .sectioning import main as main +from .sectioning import nav as nav +from .sectioning import section as section +from .sectioning import Address as Address +from .sectioning import Article as Article +from .sectioning import Aside as Aside +from .sectioning import Body as Body +from .sectioning import Header as Header +from .sectioning import Footer as Footer +from .sectioning import H1 as H1 +from .sectioning import H2 as H2 +from .sectioning import H3 as H3 +from .sectioning import H4 as H4 +from .sectioning import H5 as H5 +from .sectioning import H6 as H6 +from .sectioning import Main as Main +from .sectioning import Nav as Nav +from .sectioning import Section as Section +from .tables import caption as caption +from .tables import col as col +from .tables import colgroup as colgroup +from .tables import table as table +from .tables import td as td +from .tables import tfoot as tfoot +from .tables import th as th +from .tables import thead as thead +from .tables import tr as tr +from .tables import Tbody as Tbody +from .tables import Caption as Caption +from .tables import Col as Col +from .tables import Colgroup as Colgroup +from .tables import Table as Table +from .tables import Td as Td +from .tables import Tfoot as Tfoot +from .tables import Th as Th +from .tables import Thead as Thead +from .tables import Tr as Tr +from .typography import blockquote as blockquote +from .typography import dd as dd +from .typography import div as div +from .typography import dl as dl +from .typography import dt as dt +from .typography import figcaption as figcaption +from .typography import hr as hr +from .typography import ol as ol +from .typography import li as li +from .typography import p as p +from .typography import pre as pre +from .typography import ul as ul +from .typography import ins as ins +from .typography import del_ as del_ +from .typography import Del as Del +from .typography import Blockquote as Blockquote +from .typography import Dd as Dd +from .typography import Div as Div +from .typography import Dl as Dl +from .typography import Dt as Dt +from .typography import Figcaption as Figcaption +from .typography import Hr as Hr +from .typography import Ol as Ol +from .typography import Li as Li +from .typography import P as P +from .typography import Pre as Pre +from .typography import Ul as Ul +from .typography import Ins as Ins +from reflex.utils import lazy_loader + +_MAPPING = { + "forms": [ + "button", + "fieldset", + "form", + "input", + "label", + "legend", + "meter", + "optgroup", + "option", + "output", + "progress", + "select", + "textarea", + ], + "inline": [ + "a", + "abbr", + "b", + "bdi", + "bdo", + "br", + "cite", + "code", + "data", + "dfn", + "em", + "i", + "kbd", + "mark", + "q", + "rp", + "rt", + "ruby", + "s", + "samp", + "small", + "span", + "strong", + "sub", + "sup", + "time", + "u", + "wbr", + ], + "media": [ + "area", + "audio", + "img", + "image", + "map", + "track", + "video", + "embed", + "iframe", + "object", + "picture", + "portal", + "source", + "svg", + "path", + ], + "metadata": ["base", "head", "link", "meta", "title"], + "other": ["details", "dialog", "summary", "slot", "template", "math", "html"], + "scripts": ["canvas", "noscript", "script"], + "sectioning": [ + "address", + "article", + "aside", + "body", + "header", + "footer", + "h1", + "h2", + "h3", + "h4", + "h5", + "h6", + "main", + "nav", + "section", + ], + "tables": [ + "caption", + "col", + "colgroup", + "table", + "td", + "tfoot", + "th", + "thead", + "tr", + "Tbody", + ], + "typography": [ + "blockquote", + "dd", + "div", + "dl", + "dt", + "figcaption", + "hr", + "ol", + "li", + "p", + "pre", + "ul", + "ins", + "del_", + "Del", + ], +} +EXCLUDE = ["del_", "Del", "image"] +for _, v in _MAPPING.items(): + v.extend([mod.capitalize() for mod in v if mod not in EXCLUDE]) diff --git a/reflex/components/el/elements/forms.py b/reflex/components/el/elements/forms.py index 37051b279..0cd04c1a7 100644 --- a/reflex/components/el/elements/forms.py +++ b/reflex/components/el/elements/forms.py @@ -650,3 +650,18 @@ class Textarea(BaseHTML): EventTriggers.ON_KEY_DOWN: lambda e0: [e0.key], EventTriggers.ON_KEY_UP: lambda e0: [e0.key], } + + +button = Button.create +fieldset = Fieldset.create +form = Form.create +input = Input.create +label = Label.create +legend = Legend.create +meter = Meter.create +optgroup = Optgroup.create +option = Option.create +output = Output.create +progress = Progress.create +select = Select.create +textarea = Textarea.create diff --git a/reflex/components/el/elements/forms.pyi b/reflex/components/el/elements/forms.pyi index 38853ce40..42d308773 100644 --- a/reflex/components/el/elements/forms.pyi +++ b/reflex/components/el/elements/forms.pyi @@ -2180,3 +2180,17 @@ class Textarea(BaseHTML): The component. """ ... + +button = Button.create +fieldset = Fieldset.create +form = Form.create +input = Input.create +label = Label.create +legend = Legend.create +meter = Meter.create +optgroup = Optgroup.create +option = Option.create +output = Output.create +progress = Progress.create +select = Select.create +textarea = Textarea.create diff --git a/reflex/components/el/elements/inline.py b/reflex/components/el/elements/inline.py index a8454217b..6cd765762 100644 --- a/reflex/components/el/elements/inline.py +++ b/reflex/components/el/elements/inline.py @@ -208,3 +208,33 @@ class Wbr(BaseHTML): """Display the wbr element.""" tag = "wbr" + + +a = A.create +abbr = Abbr.create +b = B.create +bdi = Bdi.create +bdo = Bdo.create +br = Br.create +cite = Cite.create +code = Code.create +data = Data.create +dfn = Dfn.create +em = Em.create +i = I.create +kbd = Kbd.create +mark = Mark.create +q = Q.create +rp = Rp.create +rt = Rt.create +ruby = Ruby.create +s = S.create +samp = Samp.create +small = Small.create +span = Span.create +strong = Strong.create +sub = Sub.create +sup = Sup.create +time = Time.create +u = U.create +wbr = Wbr.create diff --git a/reflex/components/el/elements/inline.pyi b/reflex/components/el/elements/inline.pyi index a18f86243..d0fc90ad4 100644 --- a/reflex/components/el/elements/inline.pyi +++ b/reflex/components/el/elements/inline.pyi @@ -3746,3 +3746,32 @@ class Wbr(BaseHTML): The component. """ ... + +a = A.create +abbr = Abbr.create +b = B.create +bdi = Bdi.create +bdo = Bdo.create +br = Br.create +cite = Cite.create +code = Code.create +data = Data.create +dfn = Dfn.create +em = Em.create +i = I.create +kbd = Kbd.create +mark = Mark.create +q = Q.create +rp = Rp.create +rt = Rt.create +ruby = Ruby.create +s = S.create +samp = Samp.create +small = Small.create +span = Span.create +strong = Strong.create +sub = Sub.create +sup = Sup.create +time = Time.create +u = U.create +wbr = Wbr.create diff --git a/reflex/components/el/elements/media.py b/reflex/components/el/elements/media.py index 88c35e4cc..9a64995c7 100644 --- a/reflex/components/el/elements/media.py +++ b/reflex/components/el/elements/media.py @@ -316,3 +316,19 @@ class Path(BaseHTML): # Defines the shape of the path d: Var[Union[str, int, bool]] + + +area = Area.create +audio = Audio.create +image = img = Img.create +map = Map.create +track = Track.create +video = Video.create +embed = Embed.create +iframe = Iframe.create +object = Object.create +picture = Picture.create +portal = Portal.create +source = Source.create +svg = Svg.create +path = Path.create diff --git a/reflex/components/el/elements/media.pyi b/reflex/components/el/elements/media.pyi index 53e2a341f..d2d9ca287 100644 --- a/reflex/components/el/elements/media.pyi +++ b/reflex/components/el/elements/media.pyi @@ -2086,3 +2086,18 @@ class Path(BaseHTML): The component. """ ... + +area = Area.create +audio = Audio.create +image = img = Img.create +map = Map.create +track = Track.create +video = Video.create +embed = Embed.create +iframe = Iframe.create +object = Object.create +picture = Picture.create +portal = Portal.create +source = Source.create +svg = Svg.create +path = Path.create diff --git a/reflex/components/el/elements/metadata.py b/reflex/components/el/elements/metadata.py index 2ff25755e..c8b0ba61f 100644 --- a/reflex/components/el/elements/metadata.py +++ b/reflex/components/el/elements/metadata.py @@ -53,3 +53,10 @@ class Title(Element): # noqa: E742 """Display the title element.""" tag = "title" + + +base = Base.create +head = Head.create +link = Link.create +meta = Meta.create +title = Title.create diff --git a/reflex/components/el/elements/metadata.pyi b/reflex/components/el/elements/metadata.pyi index b9e126a6c..4a200652a 100644 --- a/reflex/components/el/elements/metadata.pyi +++ b/reflex/components/el/elements/metadata.pyi @@ -650,3 +650,9 @@ class Title(Element): The component. """ ... + +base = Base.create +head = Head.create +link = Link.create +meta = Meta.create +title = Title.create diff --git a/reflex/components/el/elements/other.py b/reflex/components/el/elements/other.py index 26dbf6050..46420ade4 100644 --- a/reflex/components/el/elements/other.py +++ b/reflex/components/el/elements/other.py @@ -59,3 +59,12 @@ class Html(BaseHTML): # Specifies the URL of the document's cache manifest (obsolete in HTML5) manifest: Var[Union[str, int, bool]] + + +details = Details.create +dialog = Dialog.create +summary = Summary.create +slot = Slot.create +template = Template.create +math = Math.create +html = Html.create diff --git a/reflex/components/el/elements/other.pyi b/reflex/components/el/elements/other.pyi index ed89bd745..676e59eac 100644 --- a/reflex/components/el/elements/other.pyi +++ b/reflex/components/el/elements/other.pyi @@ -942,3 +942,11 @@ class Html(BaseHTML): The component. """ ... + +details = Details.create +dialog = Dialog.create +summary = Summary.create +slot = Slot.create +template = Template.create +math = Math.create +html = Html.create diff --git a/reflex/components/el/elements/scripts.py b/reflex/components/el/elements/scripts.py index a37a32494..6d2e85f54 100644 --- a/reflex/components/el/elements/scripts.py +++ b/reflex/components/el/elements/scripts.py @@ -50,3 +50,8 @@ class Script(BaseHTML): # Specifies the MIME type of the script type: Var[Union[str, int, bool]] + + +canvas = Canvas.create +noscript = Noscript.create +script = Script.create diff --git a/reflex/components/el/elements/scripts.pyi b/reflex/components/el/elements/scripts.pyi index 79363df76..917cddc2b 100644 --- a/reflex/components/el/elements/scripts.pyi +++ b/reflex/components/el/elements/scripts.pyi @@ -438,3 +438,7 @@ class Script(BaseHTML): The component. """ ... + +canvas = Canvas.create +noscript = Noscript.create +script = Script.create diff --git a/reflex/components/el/elements/sectioning.py b/reflex/components/el/elements/sectioning.py index ce3549573..e1544bd15 100644 --- a/reflex/components/el/elements/sectioning.py +++ b/reflex/components/el/elements/sectioning.py @@ -93,3 +93,20 @@ class Section(BaseHTML): # noqa: E742 """Display the section element.""" tag = "section" + + +address = Address.create +article = Article.create +aside = Aside.create +body = Body.create +header = Header.create +footer = Footer.create +h1 = H1.create +h2 = H2.create +h3 = H3.create +h4 = H4.create +h5 = H5.create +h6 = H6.create +main = Main.create +nav = Nav.create +section = Section.create diff --git a/reflex/components/el/elements/sectioning.pyi b/reflex/components/el/elements/sectioning.pyi index 26f663e66..411a8a705 100644 --- a/reflex/components/el/elements/sectioning.pyi +++ b/reflex/components/el/elements/sectioning.pyi @@ -1989,3 +1989,19 @@ class Section(BaseHTML): The component. """ ... + +address = Address.create +article = Article.create +aside = Aside.create +body = Body.create +header = Header.create +footer = Footer.create +h1 = H1.create +h2 = H2.create +h3 = H3.create +h4 = H4.create +h5 = H5.create +h6 = H6.create +main = Main.create +nav = Nav.create +section = Section.create diff --git a/reflex/components/el/elements/tables.py b/reflex/components/el/elements/tables.py index 1277e1bea..0f1db184e 100644 --- a/reflex/components/el/elements/tables.py +++ b/reflex/components/el/elements/tables.py @@ -124,3 +124,15 @@ class Tr(BaseHTML): # Alignment of the content within the table row align: Var[Union[str, int, bool]] + + +caption = Caption.create +col = Col.create +colgroup = Colgroup.create +table = Table.create +tbody = Tbody.create +td = Td.create +tfoot = Tfoot.create +th = Th.create +thead = Thead.create +tr = Tr.create diff --git a/reflex/components/el/elements/tables.pyi b/reflex/components/el/elements/tables.pyi index 6a81d3fad..35470301e 100644 --- a/reflex/components/el/elements/tables.pyi +++ b/reflex/components/el/elements/tables.pyi @@ -1406,3 +1406,14 @@ class Tr(BaseHTML): The component. """ ... + +caption = Caption.create +col = Col.create +colgroup = Colgroup.create +table = Table.create +tbody = Tbody.create +td = Td.create +tfoot = Tfoot.create +th = Th.create +thead = Thead.create +tr = Tr.create diff --git a/reflex/components/el/elements/typography.py b/reflex/components/el/elements/typography.py index f8e3769fa..c53edf4ec 100644 --- a/reflex/components/el/elements/typography.py +++ b/reflex/components/el/elements/typography.py @@ -124,3 +124,19 @@ class Del(BaseHTML): # Specifies the date and time of when the text was deleted. date_time: Var[Union[str, int, bool]] + + +blockquote = Blockquote.create +dd = Dd.create +div = Div.create +dl = Dl.create +dt = Dt.create +figcaption = Figcaption.create +hr = Hr.create +li = Li.create +ol = Ol.create +p = P.create +pre = Pre.create +ul = Ul.create +ins = Ins.create +del_ = Del.create # 'del' is a reserved keyword in Python diff --git a/reflex/components/el/elements/typography.pyi b/reflex/components/el/elements/typography.pyi index f6562cacc..563f4652c 100644 --- a/reflex/components/el/elements/typography.pyi +++ b/reflex/components/el/elements/typography.pyi @@ -2020,3 +2020,18 @@ class Del(BaseHTML): The component. """ ... + +blockquote = Blockquote.create +dd = Dd.create +div = Div.create +dl = Dl.create +dt = Dt.create +figcaption = Figcaption.create +hr = Hr.create +li = Li.create +ol = Ol.create +p = P.create +pre = Pre.create +ul = Ul.create +ins = Ins.create +del_ = Del.create diff --git a/reflex/components/moment/__init__.py b/reflex/components/moment/__init__.py index f144680fe..9f4987c56 100644 --- a/reflex/components/moment/__init__.py +++ b/reflex/components/moment/__init__.py @@ -1,5 +1,5 @@ """Moment.js component.""" -from .moment import Moment +from .moment import Moment, MomentDelta moment = Moment.create diff --git a/reflex/components/radix/__init__.py b/reflex/components/radix/__init__.py index 08d1dcfef..a37f9e161 100644 --- a/reflex/components/radix/__init__.py +++ b/reflex/components/radix/__init__.py @@ -1,4 +1,16 @@ """Namespace for components provided by @radix-ui packages.""" +from __future__ import annotations -from .primitives import * -from .themes import * +from reflex import RADIX_MAPPING +from reflex.utils import lazy_loader + +_SUBMODULES: set[str] = {"themes", "primitives"} + +_SUBMOD_ATTRS: dict[str, list[str]] = { + "".join(k.split("components.radix.")[-1]): v for k, v in RADIX_MAPPING.items() +} +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submodules=_SUBMODULES, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/radix/__init__.pyi b/reflex/components/radix/__init__.pyi new file mode 100644 index 000000000..ea331830b --- /dev/null +++ b/reflex/components/radix/__init__.pyi @@ -0,0 +1,73 @@ +"""Stub file for reflex/components/radix/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from . import primitives as primitives +from . import themes as themes + +from .themes.color_mode import color_mode as color_mode +from .themes.base import theme as theme +from .themes.base import theme_panel as theme_panel +from .themes.components.alert_dialog import alert_dialog as alert_dialog +from .themes.components.aspect_ratio import aspect_ratio as aspect_ratio +from .themes.components.avatar import avatar as avatar +from .themes.components.badge import badge as badge +from .themes.components.button import button as button +from .themes.components.callout import callout as callout +from .themes.components.card import card as card +from .themes.components.checkbox import checkbox as checkbox +from .themes.components.context_menu import context_menu as context_menu +from .themes.components.data_list import data_list as data_list +from .themes.components.dialog import dialog as dialog +from .themes.components.hover_card import hover_card as hover_card +from .themes.components.icon_button import icon_button as icon_button +from .themes.components.text_field import input as input +from .themes.components.inset import inset as inset +from .themes.components.popover import popover as popover +from .themes.components.scroll_area import scroll_area as scroll_area +from .themes.components.select import select as select +from .themes.components.skeleton import skeleton as skeleton +from .themes.components.slider import slider as slider +from .themes.components.spinner import spinner as spinner +from .themes.components.switch import switch as switch +from .themes.components.table import table as table +from .themes.components.tabs import tabs as tabs +from .themes.components.text_area import text_area as text_area +from .themes.components.tooltip import tooltip as tooltip +from .themes.components.segmented_control import segmented_control as segmented_control +from .themes.components.radio_cards import radio_cards as radio_cards +from .themes.components.checkbox_cards import checkbox_cards as checkbox_cards +from .themes.components.checkbox_group import checkbox_group as checkbox_group +from .themes.components.text_field import text_field as text_field +from .themes.components.radio_group import radio as radio +from .themes.components.radio_group import radio_group as radio_group +from .themes.components.dropdown_menu import menu as menu +from .themes.components.dropdown_menu import dropdown_menu as dropdown_menu +from .themes.components.separator import divider as divider +from .themes.components.separator import separator as separator +from .themes.typography.blockquote import blockquote as blockquote +from .themes.typography.code import code as code +from .themes.typography.heading import heading as heading +from .themes.typography.link import link as link +from .themes.typography.text import text as text +from .themes.layout.box import box as box +from .themes.layout.center import center as center +from .themes.layout.container import container as container +from .themes.layout.flex import flex as flex +from .themes.layout.grid import grid as grid +from .themes.layout.section import section as section +from .themes.layout.spacer import spacer as spacer +from .themes.layout.stack import stack as stack +from .themes.layout.stack import hstack as hstack +from .themes.layout.stack import vstack as vstack +from .themes.layout.list import list_ns as list +from .themes.layout.list import list_item as list_item +from .themes.layout.list import ordered_list as ordered_list +from .themes.layout.list import unordered_list as unordered_list +from .primitives.accordion import accordion as accordion +from .primitives.drawer import drawer as drawer +from .primitives.form import form as form +from .primitives.progress import progress as progress +from reflex import RADIX_MAPPING +from reflex.utils import lazy_loader diff --git a/reflex/components/radix/primitives/__init__.py b/reflex/components/radix/primitives/__init__.py index 23070044e..22cacbfd7 100644 --- a/reflex/components/radix/primitives/__init__.py +++ b/reflex/components/radix/primitives/__init__.py @@ -1,7 +1,15 @@ """Radix primitive components (https://www.radix-ui.com/primitives).""" +from __future__ import annotations -from .accordion import accordion -from .drawer import drawer -from .form import form -from .progress import progress -from .slider import slider +from reflex import RADIX_PRIMITIVES_MAPPING +from reflex.utils import lazy_loader + +_SUBMOD_ATTRS: dict[str, list[str]] = { + "".join(k.split("components.radix.primitives.")[-1]): v + for k, v in RADIX_PRIMITIVES_MAPPING.items() +} + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/radix/primitives/__init__.pyi b/reflex/components/radix/primitives/__init__.pyi new file mode 100644 index 000000000..619c0fb0a --- /dev/null +++ b/reflex/components/radix/primitives/__init__.pyi @@ -0,0 +1,11 @@ +"""Stub file for reflex/components/radix/primitives/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from .accordion import accordion as accordion +from .drawer import drawer as drawer +from .form import form as form +from .progress import progress as progress +from reflex import RADIX_PRIMITIVES_MAPPING +from reflex.utils import lazy_loader diff --git a/reflex/components/radix/themes/__init__.py b/reflex/components/radix/themes/__init__.py index e1d39fb52..e394c9dc0 100644 --- a/reflex/components/radix/themes/__init__.py +++ b/reflex/components/radix/themes/__init__.py @@ -1,7 +1,21 @@ """Namespace for components provided by the @radix-ui/themes library.""" -from .base import theme as theme -from .base import theme_panel as theme_panel -from .color_mode import color_mode_var_and_namespace as color_mode -from .components import * -from .layout import * -from .typography import * +from __future__ import annotations + +from reflex.utils import lazy_loader + +_SUBMODULES: set[str] = {"components", "layout", "typography"} +_SUBMOD_ATTRS: dict[str, list[str]] = { + "base": [ + "theme", + "theme_panel", + ], + "color_mode": [ + "color_mode", + ], +} + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submodules=_SUBMODULES, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/radix/themes/__init__.pyi b/reflex/components/radix/themes/__init__.pyi new file mode 100644 index 000000000..ed30a5266 --- /dev/null +++ b/reflex/components/radix/themes/__init__.pyi @@ -0,0 +1,13 @@ +"""Stub file for reflex/components/radix/themes/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from . import components as components +from . import layout as layout +from . import typography as typography + +from .base import theme as theme +from .base import theme_panel as theme_panel +from .color_mode import color_mode as color_mode +from reflex.utils import lazy_loader diff --git a/reflex/components/radix/themes/color_mode.py b/reflex/components/radix/themes/color_mode.py index 2329918f4..7a26d960b 100644 --- a/reflex/components/radix/themes/color_mode.py +++ b/reflex/components/radix/themes/color_mode.py @@ -174,4 +174,6 @@ class ColorModeNamespace(BaseVar): switch = staticmethod(ColorModeSwitch.create) -color_mode_var_and_namespace = ColorModeNamespace(**dataclasses.asdict(color_mode)) +color_mode = color_mode_var_and_namespace = ColorModeNamespace( + **dataclasses.asdict(color_mode) +) diff --git a/reflex/components/radix/themes/color_mode.pyi b/reflex/components/radix/themes/color_mode.pyi index e4a2cbcac..80549b777 100644 --- a/reflex/components/radix/themes/color_mode.pyi +++ b/reflex/components/radix/themes/color_mode.pyi @@ -543,4 +543,6 @@ class ColorModeNamespace(BaseVar): button = staticmethod(ColorModeIconButton.create) switch = staticmethod(ColorModeSwitch.create) -color_mode_var_and_namespace = ColorModeNamespace(**dataclasses.asdict(color_mode)) +color_mode = color_mode_var_and_namespace = ColorModeNamespace( + **dataclasses.asdict(color_mode) +) diff --git a/reflex/components/radix/themes/components/__init__.py b/reflex/components/radix/themes/components/__init__.py index 7df1f7707..7c6b10a04 100644 --- a/reflex/components/radix/themes/components/__init__.py +++ b/reflex/components/radix/themes/components/__init__.py @@ -1,83 +1,15 @@ """Radix themes components.""" +from __future__ import annotations -from .alert_dialog import alert_dialog as alert_dialog -from .aspect_ratio import aspect_ratio as aspect_ratio -from .avatar import avatar as avatar -from .badge import badge as badge -from .button import button as button -from .callout import callout as callout -from .card import card as card -from .checkbox import checkbox as checkbox -from .checkbox_cards import checkbox_cards as checkbox_cards -from .checkbox_group import checkbox_group as checkbox_group -from .context_menu import context_menu as context_menu -from .data_list import data_list as data_list -from .dialog import dialog as dialog -from .dropdown_menu import dropdown_menu as dropdown_menu -from .dropdown_menu import menu as menu -from .hover_card import hover_card as hover_card -from .icon_button import icon_button as icon_button -from .inset import inset as inset -from .popover import popover as popover -from .progress import progress as progress -from .radio_cards import radio_cards as radio_cards -from .radio_group import radio as radio -from .radio_group import radio_group as radio_group -from .scroll_area import scroll_area as scroll_area -from .segmented_control import segmented_control as segmented_control -from .select import select as select -from .separator import divider as divider -from .separator import separator as separator -from .skeleton import skeleton as skeleton -from .slider import slider as slider -from .spinner import spinner as spinner -from .switch import switch as switch -from .table import table as table -from .tabs import tabs as tabs -from .text_area import text_area as text_area -from .text_field import text_field as text_field -from .tooltip import tooltip as tooltip +from reflex import RADIX_THEMES_COMPONENTS_MAPPING +from reflex.utils import lazy_loader -input = text_field +_SUBMOD_ATTRS: dict[str, list[str]] = { + "".join(k.split("components.radix.themes.components.")[-1]): v + for k, v in RADIX_THEMES_COMPONENTS_MAPPING.items() +} -__all__ = [ - "alert_dialog", - "aspect_ratio", - "avatar", - "badge", - "button", - "callout", - "card", - "checkbox", - "checkbox_cards", - "checkbox_group", - "context_menu", - "data_list", - "dialog", - "divider", - "dropdown_menu", - "hover_card", - "icon_button", - "input", - "inset", - "menu", - "popover", - # progress is in experimental namespace until https://github.com/radix-ui/themes/pull/492 - # "progress", - "radio", - "radio_cards", - "radio_group", - "scroll_area", - "segmented_control", - "select", - "separator", - "skeleton", - "slider", - "spinner", - "switch", - "table", - "tabs", - "text_area", - "text_field", - "tooltip", -] +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/radix/themes/components/__init__.pyi b/reflex/components/radix/themes/components/__init__.pyi new file mode 100644 index 000000000..a0cf54d5c --- /dev/null +++ b/reflex/components/radix/themes/components/__init__.pyi @@ -0,0 +1,44 @@ +"""Stub file for reflex/components/radix/themes/components/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from .alert_dialog import alert_dialog as alert_dialog +from .aspect_ratio import aspect_ratio as aspect_ratio +from .avatar import avatar as avatar +from .badge import badge as badge +from .button import button as button +from .callout import callout as callout +from .card import card as card +from .checkbox import checkbox as checkbox +from .context_menu import context_menu as context_menu +from .data_list import data_list as data_list +from .dialog import dialog as dialog +from .hover_card import hover_card as hover_card +from .icon_button import icon_button as icon_button +from .text_field import input as input +from .inset import inset as inset +from .popover import popover as popover +from .scroll_area import scroll_area as scroll_area +from .select import select as select +from .skeleton import skeleton as skeleton +from .slider import slider as slider +from .spinner import spinner as spinner +from .switch import switch as switch +from .table import table as table +from .tabs import tabs as tabs +from .text_area import text_area as text_area +from .tooltip import tooltip as tooltip +from .segmented_control import segmented_control as segmented_control +from .radio_cards import radio_cards as radio_cards +from .checkbox_cards import checkbox_cards as checkbox_cards +from .checkbox_group import checkbox_group as checkbox_group +from .text_field import text_field as text_field +from .radio_group import radio as radio +from .radio_group import radio_group as radio_group +from .dropdown_menu import menu as menu +from .dropdown_menu import dropdown_menu as dropdown_menu +from .separator import divider as divider +from .separator import separator as separator +from reflex import RADIX_THEMES_COMPONENTS_MAPPING +from reflex.utils import lazy_loader diff --git a/reflex/components/radix/themes/components/alert_dialog.py b/reflex/components/radix/themes/components/alert_dialog.py index b8e713bb5..7bda9589b 100644 --- a/reflex/components/radix/themes/components/alert_dialog.py +++ b/reflex/components/radix/themes/components/alert_dialog.py @@ -1,8 +1,8 @@ """Interactive components provided by @radix-ui/themes.""" from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var @@ -37,7 +37,7 @@ class AlertDialogTrigger(RadixThemesTriggerComponent): tag = "AlertDialog.Trigger" -class AlertDialogContent(el.Div, RadixThemesComponent): +class AlertDialogContent(elements.Div, RadixThemesComponent): """Contains the content of the dialog. This component is based on the div element.""" tag = "AlertDialog.Content" diff --git a/reflex/components/radix/themes/components/alert_dialog.pyi b/reflex/components/radix/themes/components/alert_dialog.pyi index a61a5bbbc..9b5fd9aa7 100644 --- a/reflex/components/radix/themes/components/alert_dialog.pyi +++ b/reflex/components/radix/themes/components/alert_dialog.pyi @@ -8,8 +8,8 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var from ..base import RadixThemesComponent, RadixThemesTriggerComponent @@ -171,7 +171,7 @@ class AlertDialogTrigger(RadixThemesTriggerComponent): """ ... -class AlertDialogContent(el.Div, RadixThemesComponent): +class AlertDialogContent(elements.Div, RadixThemesComponent): def get_event_triggers(self) -> Dict[str, Any]: ... @overload @classmethod diff --git a/reflex/components/radix/themes/components/badge.py b/reflex/components/radix/themes/components/badge.py index 587a83030..87bb939fe 100644 --- a/reflex/components/radix/themes/components/badge.py +++ b/reflex/components/radix/themes/components/badge.py @@ -2,7 +2,7 @@ from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -12,7 +12,7 @@ from ..base import ( ) -class Badge(el.Span, RadixThemesComponent): +class Badge(elements.Span, RadixThemesComponent): """A stylized badge element.""" tag = "Badge" diff --git a/reflex/components/radix/themes/components/badge.pyi b/reflex/components/radix/themes/components/badge.pyi index 758630905..317a288d8 100644 --- a/reflex/components/radix/themes/components/badge.pyi +++ b/reflex/components/radix/themes/components/badge.pyi @@ -8,11 +8,11 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import LiteralAccentColor, LiteralRadius, RadixThemesComponent -class Badge(el.Span, RadixThemesComponent): +class Badge(elements.Span, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/button.py b/reflex/components/radix/themes/components/button.py index 0e8f95345..f7fd5d185 100644 --- a/reflex/components/radix/themes/components/button.py +++ b/reflex/components/radix/themes/components/button.py @@ -2,7 +2,7 @@ from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -16,7 +16,7 @@ from ..base import ( LiteralButtonSize = Literal["1", "2", "3", "4"] -class Button(el.Button, RadixLoadingProp, RadixThemesComponent): +class Button(elements.Button, RadixLoadingProp, RadixThemesComponent): """Trigger an action or event, such as submitting a form or displaying a dialog.""" tag = "Button" diff --git a/reflex/components/radix/themes/components/button.pyi b/reflex/components/radix/themes/components/button.pyi index 617b7b389..c0ef03e2b 100644 --- a/reflex/components/radix/themes/components/button.pyi +++ b/reflex/components/radix/themes/components/button.pyi @@ -8,7 +8,7 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( LiteralAccentColor, @@ -20,7 +20,7 @@ from ..base import ( LiteralButtonSize = Literal["1", "2", "3", "4"] -class Button(el.Button, RadixLoadingProp, RadixThemesComponent): +class Button(elements.Button, RadixLoadingProp, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/callout.py b/reflex/components/radix/themes/components/callout.py index 5eaf1cac0..6273c8256 100644 --- a/reflex/components/radix/themes/components/callout.py +++ b/reflex/components/radix/themes/components/callout.py @@ -3,8 +3,8 @@ from typing import Literal, Union import reflex as rx -from reflex import el from reflex.components.component import Component, ComponentNamespace +from reflex.components.el import elements from reflex.components.lucide.icon import Icon from reflex.vars import Var @@ -16,7 +16,7 @@ from ..base import ( CalloutVariant = Literal["soft", "surface", "outline"] -class CalloutRoot(el.Div, RadixThemesComponent): +class CalloutRoot(elements.Div, RadixThemesComponent): """Groups Icon and Text parts of a Callout.""" tag = "Callout.Root" @@ -37,13 +37,13 @@ class CalloutRoot(el.Div, RadixThemesComponent): high_contrast: Var[bool] -class CalloutIcon(el.Div, RadixThemesComponent): +class CalloutIcon(elements.Div, RadixThemesComponent): """Provides width and height for the icon associated with the callout.""" tag = "Callout.Icon" -class CalloutText(el.P, RadixThemesComponent): +class CalloutText(elements.P, RadixThemesComponent): """Renders the callout text. This component is based on the p element.""" tag = "Callout.Text" diff --git a/reflex/components/radix/themes/components/callout.pyi b/reflex/components/radix/themes/components/callout.pyi index ff7cf0b00..871b8345c 100644 --- a/reflex/components/radix/themes/components/callout.pyi +++ b/reflex/components/radix/themes/components/callout.pyi @@ -9,15 +9,15 @@ from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal, Union import reflex as rx -from reflex import el from reflex.components.component import Component, ComponentNamespace +from reflex.components.el import elements from reflex.components.lucide.icon import Icon from reflex.vars import Var from ..base import LiteralAccentColor, RadixThemesComponent CalloutVariant = Literal["soft", "surface", "outline"] -class CalloutRoot(el.Div, RadixThemesComponent): +class CalloutRoot(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -230,7 +230,7 @@ class CalloutRoot(el.Div, RadixThemesComponent): """ ... -class CalloutIcon(el.Div, RadixThemesComponent): +class CalloutIcon(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -365,7 +365,7 @@ class CalloutIcon(el.Div, RadixThemesComponent): """ ... -class CalloutText(el.P, RadixThemesComponent): +class CalloutText(elements.P, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/card.py b/reflex/components/radix/themes/components/card.py index ab4cf2b88..af8dc40b2 100644 --- a/reflex/components/radix/themes/components/card.py +++ b/reflex/components/radix/themes/components/card.py @@ -1,7 +1,7 @@ """Interactive components provided by @radix-ui/themes.""" from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -9,7 +9,7 @@ from ..base import ( ) -class Card(el.Div, RadixThemesComponent): +class Card(elements.Div, RadixThemesComponent): """Container that groups related content and actions.""" tag = "Card" diff --git a/reflex/components/radix/themes/components/card.pyi b/reflex/components/radix/themes/components/card.pyi index b6df648cb..3394fb42f 100644 --- a/reflex/components/radix/themes/components/card.pyi +++ b/reflex/components/radix/themes/components/card.pyi @@ -8,11 +8,11 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import RadixThemesComponent -class Card(el.Div, RadixThemesComponent): +class Card(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/dialog.py b/reflex/components/radix/themes/components/dialog.py index 1f25efd1b..fb64566e1 100644 --- a/reflex/components/radix/themes/components/dialog.py +++ b/reflex/components/radix/themes/components/dialog.py @@ -2,8 +2,8 @@ from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var @@ -45,7 +45,7 @@ class DialogTitle(RadixThemesComponent): tag = "Dialog.Title" -class DialogContent(el.Div, RadixThemesComponent): +class DialogContent(elements.Div, RadixThemesComponent): """Content component to display inside a Dialog modal.""" tag = "Dialog.Content" diff --git a/reflex/components/radix/themes/components/dialog.pyi b/reflex/components/radix/themes/components/dialog.pyi index f3d158418..82bfdcf42 100644 --- a/reflex/components/radix/themes/components/dialog.pyi +++ b/reflex/components/radix/themes/components/dialog.pyi @@ -8,8 +8,8 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var from ..base import RadixThemesComponent, RadixThemesTriggerComponent @@ -248,7 +248,7 @@ class DialogTitle(RadixThemesComponent): """ ... -class DialogContent(el.Div, RadixThemesComponent): +class DialogContent(elements.Div, RadixThemesComponent): def get_event_triggers(self) -> Dict[str, Any]: ... @overload @classmethod diff --git a/reflex/components/radix/themes/components/hover_card.py b/reflex/components/radix/themes/components/hover_card.py index 9b90f98ce..a85af135e 100644 --- a/reflex/components/radix/themes/components/hover_card.py +++ b/reflex/components/radix/themes/components/hover_card.py @@ -1,8 +1,8 @@ """Interactive components provided by @radix-ui/themes.""" from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var @@ -47,7 +47,7 @@ class HoverCardTrigger(RadixThemesTriggerComponent): tag = "HoverCard.Trigger" -class HoverCardContent(el.Div, RadixThemesComponent): +class HoverCardContent(elements.Div, RadixThemesComponent): """Contains the content of the open hover card.""" tag = "HoverCard.Content" diff --git a/reflex/components/radix/themes/components/hover_card.pyi b/reflex/components/radix/themes/components/hover_card.pyi index 697ef2cdc..8f9bec917 100644 --- a/reflex/components/radix/themes/components/hover_card.pyi +++ b/reflex/components/radix/themes/components/hover_card.pyi @@ -8,8 +8,8 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var from ..base import RadixThemesComponent, RadixThemesTriggerComponent @@ -175,7 +175,7 @@ class HoverCardTrigger(RadixThemesTriggerComponent): """ ... -class HoverCardContent(el.Div, RadixThemesComponent): +class HoverCardContent(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/icon_button.py b/reflex/components/radix/themes/components/icon_button.py index 452e37640..3ce68db04 100644 --- a/reflex/components/radix/themes/components/icon_button.py +++ b/reflex/components/radix/themes/components/icon_button.py @@ -3,9 +3,9 @@ from __future__ import annotations from typing import Literal -from reflex import el from reflex.components.component import Component from reflex.components.core.match import Match +from reflex.components.el import elements from reflex.components.lucide import Icon from reflex.style import Style from reflex.vars import Var @@ -21,7 +21,7 @@ from ..base import ( LiteralButtonSize = Literal["1", "2", "3", "4"] -class IconButton(el.Button, RadixLoadingProp, RadixThemesComponent): +class IconButton(elements.Button, RadixLoadingProp, RadixThemesComponent): """A button designed specifically for usage with a single icon.""" tag = "IconButton" diff --git a/reflex/components/radix/themes/components/icon_button.pyi b/reflex/components/radix/themes/components/icon_button.pyi index 3e3657dbf..0eb51721d 100644 --- a/reflex/components/radix/themes/components/icon_button.pyi +++ b/reflex/components/radix/themes/components/icon_button.pyi @@ -8,9 +8,9 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal -from reflex import el from reflex.components.component import Component from reflex.components.core.match import Match +from reflex.components.el import elements from reflex.components.lucide import Icon from reflex.style import Style from reflex.vars import Var @@ -24,7 +24,7 @@ from ..base import ( LiteralButtonSize = Literal["1", "2", "3", "4"] -class IconButton(el.Button, RadixLoadingProp, RadixThemesComponent): +class IconButton(elements.Button, RadixLoadingProp, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/inset.py b/reflex/components/radix/themes/components/inset.py index fcdafc6a0..45409a930 100644 --- a/reflex/components/radix/themes/components/inset.py +++ b/reflex/components/radix/themes/components/inset.py @@ -1,7 +1,7 @@ """Interactive components provided by @radix-ui/themes.""" from typing import Literal, Union -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -11,7 +11,7 @@ from ..base import ( LiteralButtonSize = Literal["1", "2", "3", "4"] -class Inset(el.Div, RadixThemesComponent): +class Inset(elements.Div, RadixThemesComponent): """Applies a negative margin to allow content to bleed into the surrounding container.""" tag = "Inset" diff --git a/reflex/components/radix/themes/components/inset.pyi b/reflex/components/radix/themes/components/inset.pyi index 23f212d09..16417a0b1 100644 --- a/reflex/components/radix/themes/components/inset.pyi +++ b/reflex/components/radix/themes/components/inset.pyi @@ -8,13 +8,13 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal, Union -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import RadixThemesComponent LiteralButtonSize = Literal["1", "2", "3", "4"] -class Inset(el.Div, RadixThemesComponent): +class Inset(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/popover.py b/reflex/components/radix/themes/components/popover.py index 08415ba56..a73a9ffd0 100644 --- a/reflex/components/radix/themes/components/popover.py +++ b/reflex/components/radix/themes/components/popover.py @@ -1,8 +1,8 @@ """Interactive components provided by @radix-ui/themes.""" from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var @@ -41,7 +41,7 @@ class PopoverTrigger(RadixThemesTriggerComponent): tag = "Popover.Trigger" -class PopoverContent(el.Div, RadixThemesComponent): +class PopoverContent(elements.Div, RadixThemesComponent): """Contains content to be rendered in the open popover.""" tag = "Popover.Content" diff --git a/reflex/components/radix/themes/components/popover.pyi b/reflex/components/radix/themes/components/popover.pyi index 04d705051..3844a8916 100644 --- a/reflex/components/radix/themes/components/popover.pyi +++ b/reflex/components/radix/themes/components/popover.pyi @@ -8,8 +8,8 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Any, Dict, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var from ..base import RadixThemesComponent, RadixThemesTriggerComponent @@ -171,7 +171,7 @@ class PopoverTrigger(RadixThemesTriggerComponent): """ ... -class PopoverContent(el.Div, RadixThemesComponent): +class PopoverContent(elements.Div, RadixThemesComponent): def get_event_triggers(self) -> Dict[str, Any]: ... @overload @classmethod diff --git a/reflex/components/radix/themes/components/table.py b/reflex/components/radix/themes/components/table.py index a2b3bada3..fa8c5795c 100644 --- a/reflex/components/radix/themes/components/table.py +++ b/reflex/components/radix/themes/components/table.py @@ -1,8 +1,8 @@ """Interactive components provided by @radix-ui/themes.""" from typing import List, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -10,7 +10,7 @@ from ..base import ( ) -class TableRoot(el.Table, RadixThemesComponent): +class TableRoot(elements.Table, RadixThemesComponent): """A semantic table for presenting tabular data.""" tag = "Table.Root" @@ -22,7 +22,7 @@ class TableRoot(el.Table, RadixThemesComponent): variant: Var[Literal["surface", "ghost"]] -class TableHeader(el.Thead, RadixThemesComponent): +class TableHeader(elements.Thead, RadixThemesComponent): """The header of the table defines column names and other non-data elements.""" tag = "Table.Header" @@ -32,7 +32,7 @@ class TableHeader(el.Thead, RadixThemesComponent): _valid_parents: List[str] = ["TableRoot"] -class TableRow(el.Tr, RadixThemesComponent): +class TableRow(elements.Tr, RadixThemesComponent): """A row containing table cells.""" tag = "Table.Row" @@ -43,7 +43,7 @@ class TableRow(el.Tr, RadixThemesComponent): _invalid_children: List[str] = ["TableBody", "TableHeader", "TableRow"] -class TableColumnHeaderCell(el.Th, RadixThemesComponent): +class TableColumnHeaderCell(elements.Th, RadixThemesComponent): """A table cell that is semantically treated as a column header.""" tag = "Table.ColumnHeaderCell" @@ -61,7 +61,7 @@ class TableColumnHeaderCell(el.Th, RadixThemesComponent): ] -class TableBody(el.Tbody, RadixThemesComponent): +class TableBody(elements.Tbody, RadixThemesComponent): """The body of the table contains the data rows.""" tag = "Table.Body" @@ -76,7 +76,7 @@ class TableBody(el.Tbody, RadixThemesComponent): _valid_parents: List[str] = ["TableRoot"] -class TableCell(el.Td, RadixThemesComponent): +class TableCell(elements.Td, RadixThemesComponent): """A cell containing data.""" tag = "Table.Cell" @@ -93,7 +93,7 @@ class TableCell(el.Td, RadixThemesComponent): ] -class TableRowHeaderCell(el.Th, RadixThemesComponent): +class TableRowHeaderCell(elements.Th, RadixThemesComponent): """A table cell that is semantically treated as a row header.""" tag = "Table.RowHeaderCell" diff --git a/reflex/components/radix/themes/components/table.pyi b/reflex/components/radix/themes/components/table.pyi index 5669d717c..4e26b9103 100644 --- a/reflex/components/radix/themes/components/table.pyi +++ b/reflex/components/radix/themes/components/table.pyi @@ -8,12 +8,12 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import List, Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.vars import Var from ..base import RadixThemesComponent -class TableRoot(el.Table, RadixThemesComponent): +class TableRoot(elements.Table, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -164,7 +164,7 @@ class TableRoot(el.Table, RadixThemesComponent): """ ... -class TableHeader(el.Thead, RadixThemesComponent): +class TableHeader(elements.Thead, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -303,7 +303,7 @@ class TableHeader(el.Thead, RadixThemesComponent): """ ... -class TableRow(el.Tr, RadixThemesComponent): +class TableRow(elements.Tr, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -445,7 +445,7 @@ class TableRow(el.Tr, RadixThemesComponent): """ ... -class TableColumnHeaderCell(el.Th, RadixThemesComponent): +class TableColumnHeaderCell(elements.Th, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -607,7 +607,7 @@ class TableColumnHeaderCell(el.Th, RadixThemesComponent): """ ... -class TableBody(el.Tbody, RadixThemesComponent): +class TableBody(elements.Tbody, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -746,7 +746,7 @@ class TableBody(el.Tbody, RadixThemesComponent): """ ... -class TableCell(el.Td, RadixThemesComponent): +class TableCell(elements.Td, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -904,7 +904,7 @@ class TableCell(el.Td, RadixThemesComponent): """ ... -class TableRowHeaderCell(el.Th, RadixThemesComponent): +class TableRowHeaderCell(elements.Th, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/text_area.py b/reflex/components/radix/themes/components/text_area.py index 2eec48631..732fb2d51 100644 --- a/reflex/components/radix/themes/components/text_area.py +++ b/reflex/components/radix/themes/components/text_area.py @@ -1,9 +1,9 @@ """Interactive components provided by @radix-ui/themes.""" from typing import Any, Dict, Literal, Union -from reflex import el from reflex.components.component import Component from reflex.components.core.debounce import DebounceInput +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var @@ -15,7 +15,7 @@ from ..base import ( LiteralTextAreaSize = Literal["1", "2", "3"] -class TextArea(RadixThemesComponent, el.Textarea): +class TextArea(RadixThemesComponent, elements.Textarea): """The input part of a TextArea, may be used by itself.""" tag = "TextArea" diff --git a/reflex/components/radix/themes/components/text_area.pyi b/reflex/components/radix/themes/components/text_area.pyi index 48220be54..88734a865 100644 --- a/reflex/components/radix/themes/components/text_area.pyi +++ b/reflex/components/radix/themes/components/text_area.pyi @@ -8,16 +8,16 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Any, Dict, Literal, Union -from reflex import el from reflex.components.component import Component from reflex.components.core.debounce import DebounceInput +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.vars import Var from ..base import LiteralAccentColor, RadixThemesComponent LiteralTextAreaSize = Literal["1", "2", "3"] -class TextArea(RadixThemesComponent, el.Textarea): +class TextArea(RadixThemesComponent, elements.Textarea): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/radix/themes/components/text_field.py b/reflex/components/radix/themes/components/text_field.py index 970b950e3..b8c1b2a07 100644 --- a/reflex/components/radix/themes/components/text_field.py +++ b/reflex/components/radix/themes/components/text_field.py @@ -3,10 +3,10 @@ from __future__ import annotations from typing import Any, Dict, Literal, Union -from reflex.components import el from reflex.components.base.fragment import Fragment from reflex.components.component import Component, ComponentNamespace from reflex.components.core.debounce import DebounceInput +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.style import Style, format_as_emotion from reflex.utils import console @@ -22,7 +22,7 @@ LiteralTextFieldSize = Literal["1", "2", "3"] LiteralTextFieldVariant = Literal["classic", "surface", "soft"] -class TextFieldRoot(el.Div, RadixThemesComponent): +class TextFieldRoot(elements.Div, RadixThemesComponent): """Captures user input with an optional slot for buttons and icons.""" tag = "TextField.Root" @@ -197,4 +197,4 @@ class TextField(ComponentNamespace): __call__ = staticmethod(TextFieldRoot.create) -text_field = TextField() +input = text_field = TextField() diff --git a/reflex/components/radix/themes/components/text_field.pyi b/reflex/components/radix/themes/components/text_field.pyi index c14fb031a..d6ddf3a34 100644 --- a/reflex/components/radix/themes/components/text_field.pyi +++ b/reflex/components/radix/themes/components/text_field.pyi @@ -8,10 +8,10 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Any, Dict, Literal, Union -from reflex.components import el from reflex.components.base.fragment import Fragment from reflex.components.component import Component, ComponentNamespace from reflex.components.core.debounce import DebounceInput +from reflex.components.el import elements from reflex.constants import EventTriggers from reflex.style import Style, format_as_emotion from reflex.utils import console @@ -21,7 +21,7 @@ from ..base import LiteralAccentColor, LiteralRadius, RadixThemesComponent LiteralTextFieldSize = Literal["1", "2", "3"] LiteralTextFieldVariant = Literal["classic", "surface", "soft"] -class TextFieldRoot(el.Div, RadixThemesComponent): +class TextFieldRoot(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -662,4 +662,4 @@ class TextField(ComponentNamespace): """ ... -text_field = TextField() +input = text_field = TextField() diff --git a/reflex/components/radix/themes/layout/__init__.py b/reflex/components/radix/themes/layout/__init__.py index 4832c60db..74aefdcdb 100644 --- a/reflex/components/radix/themes/layout/__init__.py +++ b/reflex/components/radix/themes/layout/__init__.py @@ -1,42 +1,16 @@ """Layout components.""" +from __future__ import annotations -from .box import Box -from .center import Center -from .container import Container -from .flex import Flex -from .grid import Grid -from .list import list_ns as list -from .section import Section -from .spacer import Spacer -from .stack import HStack, Stack, VStack +from reflex import RADIX_THEMES_LAYOUT_MAPPING +from reflex.utils import lazy_loader -box = Box.create -center = Center.create -container = Container.create -flex = Flex.create -grid = Grid.create -section = Section.create -spacer = Spacer.create -stack = Stack.create -hstack = HStack.create -vstack = VStack.create -list_item = list.item -ordered_list = list.ordered -unordered_list = list.unordered +_SUBMOD_ATTRS: dict[str, list[str]] = { + "".join(k.split("components.radix.themes.layout.")[-1]): v + for k, v in RADIX_THEMES_LAYOUT_MAPPING.items() +} -__all__ = [ - "box", - "center", - "container", - "flex", - "grid", - "section", - "spacer", - "stack", - "hstack", - "vstack", - "list", - "list_item", - "ordered_list", - "unordered_list", -] + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/radix/themes/layout/__init__.pyi b/reflex/components/radix/themes/layout/__init__.pyi new file mode 100644 index 000000000..6ed4630e9 --- /dev/null +++ b/reflex/components/radix/themes/layout/__init__.pyi @@ -0,0 +1,21 @@ +"""Stub file for reflex/components/radix/themes/layout/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from .box import box as box +from .center import center as center +from .container import container as container +from .flex import flex as flex +from .grid import grid as grid +from .section import section as section +from .spacer import spacer as spacer +from .stack import stack as stack +from .stack import hstack as hstack +from .stack import vstack as vstack +from .list import list_ns as list +from .list import list_item as list_item +from .list import ordered_list as ordered_list +from .list import unordered_list as unordered_list +from reflex import RADIX_THEMES_LAYOUT_MAPPING +from reflex.utils import lazy_loader diff --git a/reflex/components/radix/themes/layout/box.py b/reflex/components/radix/themes/layout/box.py index b9bb99107..8cefceba7 100644 --- a/reflex/components/radix/themes/layout/box.py +++ b/reflex/components/radix/themes/layout/box.py @@ -1,12 +1,15 @@ """Declarative layout and common spacing props.""" from __future__ import annotations -from reflex import el +from reflex.components.el import elements from ..base import RadixThemesComponent -class Box(el.Div, RadixThemesComponent): +class Box(elements.Div, RadixThemesComponent): """A fundamental layout building block, based on `div` element.""" tag = "Box" + + +box = Box.create diff --git a/reflex/components/radix/themes/layout/box.pyi b/reflex/components/radix/themes/layout/box.pyi index 323a88540..119d902d7 100644 --- a/reflex/components/radix/themes/layout/box.pyi +++ b/reflex/components/radix/themes/layout/box.pyi @@ -7,10 +7,10 @@ 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 reflex import el +from reflex.components.el import elements from ..base import RadixThemesComponent -class Box(el.Div, RadixThemesComponent): +class Box(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -144,3 +144,5 @@ class Box(el.Div, RadixThemesComponent): A new component instance. """ ... + +box = Box.create diff --git a/reflex/components/radix/themes/layout/center.py b/reflex/components/radix/themes/layout/center.py index 6799f94e9..3ac4fecb1 100644 --- a/reflex/components/radix/themes/layout/center.py +++ b/reflex/components/radix/themes/layout/center.py @@ -21,3 +21,6 @@ class Center(Flex): "align_items": "center", "justify_content": "center", } + + +center = Center.create diff --git a/reflex/components/radix/themes/layout/center.pyi b/reflex/components/radix/themes/layout/center.pyi index 9a05e6f99..3b9df4790 100644 --- a/reflex/components/radix/themes/layout/center.pyi +++ b/reflex/components/radix/themes/layout/center.pyi @@ -182,3 +182,5 @@ class Center(Flex): A new component instance. """ ... + +center = Center.create diff --git a/reflex/components/radix/themes/layout/container.py b/reflex/components/radix/themes/layout/container.py index 2ab548cdf..9abf1c0d6 100644 --- a/reflex/components/radix/themes/layout/container.py +++ b/reflex/components/radix/themes/layout/container.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.style import STACK_CHILDREN_FULL_WIDTH from reflex.vars import Var @@ -12,7 +12,7 @@ from ..base import RadixThemesComponent LiteralContainerSize = Literal["1", "2", "3", "4"] -class Container(el.Div, RadixThemesComponent): +class Container(elements.Div, RadixThemesComponent): """Constrains the maximum width of page content. See https://www.radix-ui.com/themes/docs/components/container @@ -49,3 +49,6 @@ class Container(el.Div, RadixThemesComponent): padding=padding, **props, ) + + +container = Container.create diff --git a/reflex/components/radix/themes/layout/container.pyi b/reflex/components/radix/themes/layout/container.pyi index a2ea0266f..43da5f3ab 100644 --- a/reflex/components/radix/themes/layout/container.pyi +++ b/reflex/components/radix/themes/layout/container.pyi @@ -8,14 +8,14 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.style import STACK_CHILDREN_FULL_WIDTH from reflex.vars import Var from ..base import RadixThemesComponent LiteralContainerSize = Literal["1", "2", "3", "4"] -class Container(el.Div, RadixThemesComponent): +class Container(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -131,3 +131,5 @@ class Container(el.Div, RadixThemesComponent): The container component. """ ... + +container = Container.create diff --git a/reflex/components/radix/themes/layout/flex.py b/reflex/components/radix/themes/layout/flex.py index ef7aed16c..31563a494 100644 --- a/reflex/components/radix/themes/layout/flex.py +++ b/reflex/components/radix/themes/layout/flex.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Dict, Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -18,7 +18,7 @@ LiteralFlexDirection = Literal["row", "column", "row-reverse", "column-reverse"] LiteralFlexWrap = Literal["nowrap", "wrap", "wrap-reverse"] -class Flex(el.Div, RadixThemesComponent): +class Flex(elements.Div, RadixThemesComponent): """Component for creating flex layouts.""" tag = "Flex" @@ -43,3 +43,6 @@ class Flex(el.Div, RadixThemesComponent): # Reflex maps the "spacing" prop to "gap" prop. _rename_props: Dict[str, str] = {"spacing": "gap"} + + +flex = Flex.create diff --git a/reflex/components/radix/themes/layout/flex.pyi b/reflex/components/radix/themes/layout/flex.pyi index 115e1d1ae..9198c73ca 100644 --- a/reflex/components/radix/themes/layout/flex.pyi +++ b/reflex/components/radix/themes/layout/flex.pyi @@ -8,14 +8,14 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Dict, Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import LiteralAlign, LiteralJustify, LiteralSpacing, RadixThemesComponent LiteralFlexDirection = Literal["row", "column", "row-reverse", "column-reverse"] LiteralFlexWrap = Literal["nowrap", "wrap", "wrap-reverse"] -class Flex(el.Div, RadixThemesComponent): +class Flex(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -186,3 +186,5 @@ class Flex(el.Div, RadixThemesComponent): A new component instance. """ ... + +flex = Flex.create diff --git a/reflex/components/radix/themes/layout/grid.py b/reflex/components/radix/themes/layout/grid.py index 565703643..50a878823 100644 --- a/reflex/components/radix/themes/layout/grid.py +++ b/reflex/components/radix/themes/layout/grid.py @@ -4,7 +4,7 @@ from __future__ import annotations from typing import Dict, Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -17,7 +17,7 @@ from ..base import ( LiteralGridFlow = Literal["row", "column", "dense", "row-dense", "column-dense"] -class Grid(el.Div, RadixThemesComponent): +class Grid(elements.Div, RadixThemesComponent): """Component for creating grid layouts.""" tag = "Grid" @@ -55,3 +55,6 @@ class Grid(el.Div, RadixThemesComponent): "spacing_x": "gap_x", "spacing_y": "gap_y", } + + +grid = Grid.create diff --git a/reflex/components/radix/themes/layout/grid.pyi b/reflex/components/radix/themes/layout/grid.pyi index cfb9c447e..e76ad59c5 100644 --- a/reflex/components/radix/themes/layout/grid.pyi +++ b/reflex/components/radix/themes/layout/grid.pyi @@ -8,13 +8,13 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Dict, Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import LiteralAlign, LiteralJustify, LiteralSpacing, RadixThemesComponent LiteralGridFlow = Literal["row", "column", "dense", "row-dense", "column-dense"] -class Grid(el.Div, RadixThemesComponent): +class Grid(elements.Div, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -196,3 +196,5 @@ class Grid(el.Div, RadixThemesComponent): A new component instance. """ ... + +grid = Grid.create diff --git a/reflex/components/radix/themes/layout/list.py b/reflex/components/radix/themes/layout/list.py index e2e0c15f8..e1e7770c2 100644 --- a/reflex/components/radix/themes/layout/list.py +++ b/reflex/components/radix/themes/layout/list.py @@ -184,3 +184,17 @@ class List(ComponentNamespace): list_ns = List() +list_item = list_ns.item +ordered_list = list_ns.ordered +unordered_list = list_ns.unordered + + +def __getattr__(name): + # special case for when accessing list to avoid shadowing + # python's built in list object. + if name == "list": + return list_ns + try: + return globals()[name] + except KeyError: + raise AttributeError(f"module '{__name__} has no attribute '{name}'") from None diff --git a/reflex/components/radix/themes/layout/list.pyi b/reflex/components/radix/themes/layout/list.pyi index 6ff3a0a0f..eca3a7ec4 100644 --- a/reflex/components/radix/themes/layout/list.pyi +++ b/reflex/components/radix/themes/layout/list.pyi @@ -702,3 +702,6 @@ class List(ComponentNamespace): ... list_ns = List() +list_item = list_ns.item +ordered_list = list_ns.ordered +unordered_list = list_ns.unordered diff --git a/reflex/components/radix/themes/layout/section.py b/reflex/components/radix/themes/layout/section.py index 13ff4d54e..b1bd743a4 100644 --- a/reflex/components/radix/themes/layout/section.py +++ b/reflex/components/radix/themes/layout/section.py @@ -3,7 +3,7 @@ from __future__ import annotations from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import RadixThemesComponent @@ -11,10 +11,13 @@ from ..base import RadixThemesComponent LiteralSectionSize = Literal["1", "2", "3"] -class Section(el.Section, RadixThemesComponent): +class Section(elements.Section, RadixThemesComponent): """Denotes a section of page content.""" tag = "Section" # The size of the section: "1" - "3" (default "2") size: Var[LiteralSectionSize] = Var.create_safe("2") + + +section = Section.create diff --git a/reflex/components/radix/themes/layout/section.pyi b/reflex/components/radix/themes/layout/section.pyi index 4442a31ed..cd971f845 100644 --- a/reflex/components/radix/themes/layout/section.pyi +++ b/reflex/components/radix/themes/layout/section.pyi @@ -8,13 +8,13 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import RadixThemesComponent LiteralSectionSize = Literal["1", "2", "3"] -class Section(el.Section, RadixThemesComponent): +class Section(elements.Section, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -152,3 +152,5 @@ class Section(el.Section, RadixThemesComponent): A new component instance. """ ... + +section = Section.create diff --git a/reflex/components/radix/themes/layout/spacer.py b/reflex/components/radix/themes/layout/spacer.py index 3186552b1..9579b0b27 100644 --- a/reflex/components/radix/themes/layout/spacer.py +++ b/reflex/components/radix/themes/layout/spacer.py @@ -21,3 +21,6 @@ class Spacer(Flex): "justify_self": "stretch", "align_self": "stretch", } + + +spacer = Spacer.create diff --git a/reflex/components/radix/themes/layout/spacer.pyi b/reflex/components/radix/themes/layout/spacer.pyi index b991e9381..d7a2c1028 100644 --- a/reflex/components/radix/themes/layout/spacer.pyi +++ b/reflex/components/radix/themes/layout/spacer.pyi @@ -182,3 +182,5 @@ class Spacer(Flex): A new component instance. """ ... + +spacer = Spacer.create diff --git a/reflex/components/radix/themes/layout/stack.py b/reflex/components/radix/themes/layout/stack.py index 8f0abf433..13f80dc1e 100644 --- a/reflex/components/radix/themes/layout/stack.py +++ b/reflex/components/radix/themes/layout/stack.py @@ -57,3 +57,8 @@ class HStack(Stack): # The direction of the stack. direction: Var[LiteralFlexDirection] = "row" # type: ignore + + +stack = Stack.create +hstack = HStack.create +vstack = VStack.create diff --git a/reflex/components/radix/themes/layout/stack.pyi b/reflex/components/radix/themes/layout/stack.pyi index c35f1dad8..430776861 100644 --- a/reflex/components/radix/themes/layout/stack.pyi +++ b/reflex/components/radix/themes/layout/stack.pyi @@ -488,3 +488,7 @@ class HStack(Stack): The stack component. """ ... + +stack = Stack.create +hstack = HStack.create +vstack = VStack.create diff --git a/reflex/components/radix/themes/typography/__init__.py b/reflex/components/radix/themes/typography/__init__.py index a14e21007..11b550a61 100644 --- a/reflex/components/radix/themes/typography/__init__.py +++ b/reflex/components/radix/themes/typography/__init__.py @@ -1,20 +1,15 @@ """Typographic components.""" +from __future__ import annotations -from .blockquote import Blockquote -from .code import Code -from .heading import Heading -from .link import Link -from .text import text +from reflex import RADIX_THEMES_TYPOGRAPHY_MAPPING +from reflex.utils import lazy_loader -blockquote = Blockquote.create -code = Code.create -heading = Heading.create -link = Link.create +_SUBMOD_ATTRS: dict[str, list[str]] = { + "".join(k.split("components.radix.themes.typography.")[-1]): v + for k, v in RADIX_THEMES_TYPOGRAPHY_MAPPING.items() +} -__all__ = [ - "blockquote", - "code", - "heading", - "link", - "text", -] +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submod_attrs=_SUBMOD_ATTRS, +) diff --git a/reflex/components/radix/themes/typography/__init__.pyi b/reflex/components/radix/themes/typography/__init__.pyi new file mode 100644 index 000000000..bf6269985 --- /dev/null +++ b/reflex/components/radix/themes/typography/__init__.pyi @@ -0,0 +1,12 @@ +"""Stub file for reflex/components/radix/themes/typography/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from .blockquote import blockquote as blockquote +from .code import code as code +from .heading import heading as heading +from .link import link as link +from .text import text as text +from reflex import RADIX_THEMES_TYPOGRAPHY_MAPPING +from reflex.utils import lazy_loader diff --git a/reflex/components/radix/themes/typography/blockquote.py b/reflex/components/radix/themes/typography/blockquote.py index 6525064d5..5f134f8ea 100644 --- a/reflex/components/radix/themes/typography/blockquote.py +++ b/reflex/components/radix/themes/typography/blockquote.py @@ -4,7 +4,7 @@ https://www.radix-ui.com/themes/docs/theme/typography """ from __future__ import annotations -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -17,7 +17,7 @@ from .base import ( ) -class Blockquote(el.Blockquote, RadixThemesComponent): +class Blockquote(elements.Blockquote, RadixThemesComponent): """A block level extended quotation.""" tag = "Blockquote" @@ -33,3 +33,6 @@ class Blockquote(el.Blockquote, RadixThemesComponent): # Whether to render the text with higher contrast color high_contrast: Var[bool] + + +blockquote = Blockquote.create diff --git a/reflex/components/radix/themes/typography/blockquote.pyi b/reflex/components/radix/themes/typography/blockquote.pyi index 76855b287..566969574 100644 --- a/reflex/components/radix/themes/typography/blockquote.pyi +++ b/reflex/components/radix/themes/typography/blockquote.pyi @@ -7,12 +7,12 @@ 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 reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import LiteralAccentColor, RadixThemesComponent from .base import LiteralTextSize, LiteralTextWeight -class Blockquote(el.Blockquote, RadixThemesComponent): +class Blockquote(elements.Blockquote, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -227,3 +227,5 @@ class Blockquote(el.Blockquote, RadixThemesComponent): A new component instance. """ ... + +blockquote = Blockquote.create diff --git a/reflex/components/radix/themes/typography/code.py b/reflex/components/radix/themes/typography/code.py index 8ee0d2be2..5a2c9a871 100644 --- a/reflex/components/radix/themes/typography/code.py +++ b/reflex/components/radix/themes/typography/code.py @@ -4,7 +4,7 @@ https://www.radix-ui.com/themes/docs/theme/typography """ from __future__ import annotations -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -18,7 +18,7 @@ from .base import ( ) -class Code(el.Code, RadixThemesComponent): +class Code(elements.Code, RadixThemesComponent): """A block level extended quotation.""" tag = "Code" @@ -37,3 +37,6 @@ class Code(el.Code, RadixThemesComponent): # Whether to render the text with higher contrast color high_contrast: Var[bool] + + +code = Code.create diff --git a/reflex/components/radix/themes/typography/code.pyi b/reflex/components/radix/themes/typography/code.pyi index 354c31cd1..d306ed0c5 100644 --- a/reflex/components/radix/themes/typography/code.pyi +++ b/reflex/components/radix/themes/typography/code.pyi @@ -7,12 +7,12 @@ 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 reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import LiteralAccentColor, LiteralVariant, RadixThemesComponent from .base import LiteralTextSize, LiteralTextWeight -class Code(el.Code, RadixThemesComponent): +class Code(elements.Code, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -232,3 +232,5 @@ class Code(el.Code, RadixThemesComponent): A new component instance. """ ... + +code = Code.create diff --git a/reflex/components/radix/themes/typography/heading.py b/reflex/components/radix/themes/typography/heading.py index 729d06624..a02f10ce4 100644 --- a/reflex/components/radix/themes/typography/heading.py +++ b/reflex/components/radix/themes/typography/heading.py @@ -4,7 +4,7 @@ https://www.radix-ui.com/themes/docs/theme/typography """ from __future__ import annotations -from reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -19,7 +19,7 @@ from .base import ( ) -class Heading(el.H1, RadixThemesComponent): +class Heading(elements.H1, RadixThemesComponent): """A foundational text primitive based on the element.""" tag = "Heading" @@ -47,3 +47,6 @@ class Heading(el.H1, RadixThemesComponent): # Whether to render the text with higher contrast color high_contrast: Var[bool] + + +heading = Heading.create diff --git a/reflex/components/radix/themes/typography/heading.pyi b/reflex/components/radix/themes/typography/heading.pyi index b10ea01ca..8e2abb520 100644 --- a/reflex/components/radix/themes/typography/heading.pyi +++ b/reflex/components/radix/themes/typography/heading.pyi @@ -7,12 +7,12 @@ 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 reflex import el +from reflex.components.el import elements from reflex.vars import Var from ..base import LiteralAccentColor, RadixThemesComponent from .base import LiteralTextAlign, LiteralTextSize, LiteralTextTrim, LiteralTextWeight -class Heading(el.H1, RadixThemesComponent): +class Heading(elements.H1, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -243,3 +243,5 @@ class Heading(el.H1, RadixThemesComponent): A new component instance. """ ... + +heading = Heading.create diff --git a/reflex/components/radix/themes/typography/link.py b/reflex/components/radix/themes/typography/link.py index 7a4e424ed..4df8a71f5 100644 --- a/reflex/components/radix/themes/typography/link.py +++ b/reflex/components/radix/themes/typography/link.py @@ -102,3 +102,6 @@ class Link(RadixThemesComponent, A, MemoizationLeaf): **props, ) return super().create(*children, **props) + + +link = Link.create diff --git a/reflex/components/radix/themes/typography/link.pyi b/reflex/components/radix/themes/typography/link.pyi index ebcb8dce6..c203d5d37 100644 --- a/reflex/components/radix/themes/typography/link.pyi +++ b/reflex/components/radix/themes/typography/link.pyi @@ -282,3 +282,5 @@ class Link(RadixThemesComponent, A, MemoizationLeaf): Component: The link component """ ... + +link = Link.create diff --git a/reflex/components/radix/themes/typography/text.py b/reflex/components/radix/themes/typography/text.py index 96512fe58..abba5ed90 100644 --- a/reflex/components/radix/themes/typography/text.py +++ b/reflex/components/radix/themes/typography/text.py @@ -7,8 +7,8 @@ from __future__ import annotations from typing import Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.vars import Var from ..base import ( @@ -44,7 +44,7 @@ LiteralType = Literal[ ] -class Text(el.Span, RadixThemesComponent): +class Text(elements.Span, RadixThemesComponent): """A foundational text primitive based on the element.""" tag = "Text" @@ -80,13 +80,13 @@ class Span(Text): as_: Var[LiteralType] = "span" # type: ignore -class Em(el.Em, RadixThemesComponent): +class Em(elements.Em, RadixThemesComponent): """Marks text to stress emphasis.""" tag = "Em" -class Kbd(el.Kbd, RadixThemesComponent): +class Kbd(elements.Kbd, RadixThemesComponent): """Represents keyboard input or a hotkey.""" tag = "Kbd" @@ -95,13 +95,13 @@ class Kbd(el.Kbd, RadixThemesComponent): size: Var[LiteralTextSize] -class Quote(el.Q, RadixThemesComponent): +class Quote(elements.Q, RadixThemesComponent): """A short inline quotation.""" tag = "Quote" -class Strong(el.Strong, RadixThemesComponent): +class Strong(elements.Strong, RadixThemesComponent): """Marks text to signify strong importance.""" tag = "Strong" diff --git a/reflex/components/radix/themes/typography/text.pyi b/reflex/components/radix/themes/typography/text.pyi index ea52eaca1..7a143a111 100644 --- a/reflex/components/radix/themes/typography/text.pyi +++ b/reflex/components/radix/themes/typography/text.pyi @@ -8,8 +8,8 @@ from reflex.vars import Var, BaseVar, ComputedVar from reflex.event import EventChain, EventHandler, EventSpec from reflex.style import Style from typing import Literal -from reflex import el from reflex.components.component import ComponentNamespace +from reflex.components.el import elements from reflex.vars import Var from ..base import LiteralAccentColor, RadixThemesComponent from .base import LiteralTextAlign, LiteralTextSize, LiteralTextTrim, LiteralTextWeight @@ -35,7 +35,7 @@ LiteralType = Literal[ "sup", ] -class Text(el.Span, RadixThemesComponent): +class Text(elements.Span, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -589,7 +589,7 @@ class Span(Text): """ ... -class Em(el.Em, RadixThemesComponent): +class Em(elements.Em, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -724,7 +724,7 @@ class Em(el.Em, RadixThemesComponent): """ ... -class Kbd(el.Kbd, RadixThemesComponent): +class Kbd(elements.Kbd, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -866,7 +866,7 @@ class Kbd(el.Kbd, RadixThemesComponent): """ ... -class Quote(el.Q, RadixThemesComponent): +class Quote(elements.Q, RadixThemesComponent): @overload @classmethod def create( # type: ignore @@ -1003,7 +1003,7 @@ class Quote(el.Q, RadixThemesComponent): """ ... -class Strong(el.Strong, RadixThemesComponent): +class Strong(elements.Strong, RadixThemesComponent): @overload @classmethod def create( # type: ignore diff --git a/reflex/components/recharts/__init__.py b/reflex/components/recharts/__init__.py index 327b9b326..498c877be 100644 --- a/reflex/components/recharts/__init__.py +++ b/reflex/components/recharts/__init__.py @@ -1,108 +1,118 @@ """Recharts components.""" +from __future__ import annotations -from .cartesian import ( - Area, - Bar, - Brush, - Cartesian, - CartesianAxis, - CartesianGrid, - ErrorBar, - Funnel, - Line, - ReferenceArea, - ReferenceDot, - ReferenceLine, - Scatter, - XAxis, - YAxis, - ZAxis, +from reflex.utils import lazy_loader + +_SUBMOD_ATTRS: dict = { + "cartesian": [ + "area", + "Area", + "bar", + "Bar", + "line", + "Line", + "scatter", + "Scatter", + "x_axis", + "XAxis", + "y_axis", + "YAxis", + "z_axis", + "ZAxis", + "brush", + "Brush", + "cartesian_axis", + "CartesianAxis", + "cartesian_grid", + "CartesianGrid", + "reference_line", + "ReferenceLine", + "reference_dot", + "ReferenceDot", + "reference_area", + "ReferenceArea", + "error_bar", + "ErrorBar", + "funnel", + "Funnel", + ], + "charts": [ + "area_chart", + "AreaChart", + "bar_chart", + "BarChart", + "line_chart", + "LineChart", + "composed_chart", + "ComposedChart", + "pie_chart", + "PieChart", + "radar_chart", + "RadarChart", + "radial_bar_chart", + "RadialBarChart", + "scatter_chart", + "ScatterChart", + "funnel_chart", + "FunnelChart", + "treemap", + "Treemap", + ], + "general": [ + "responsive_container", + "ResponsiveContainer", + "legend", + "Legend", + "graphing_tooltip", + "GraphingTooltip", + "label", + "Label", + "label_list", + "LabelList", + ], + "polar": [ + "pie", + "Pie", + "radar", + "Radar", + "radial_bar", + "RadialBar", + "polar_angle_axis", + "PolarAngleAxis", + "polar_grid", + "PolarGrid", + "polar_radius_axis", + "PolarRadiusAxis", + ], + "recharts": [ + "LiteralAnimationEasing", + "LiteralAreaType", + "LiteralAxisType", + "LiteralBarChartStackOffset", + "LiteralComposedChartBaseValue", + "LiteralDirection", + "LiteralGridType", + "LiteralIconType", + "LiteralIfOverflow", + "LiteralInterval", + "LiteralLayout", + "LiteralLegendAlign", + "LiteralLegendType", + "LiteralLineType", + "LiteralOrientation", + "LiteralOrientationLeftRightMiddle", + "LiteralOrientationTopBottom", + "LiteralOrientationTopBottomLeftRight", + "LiteralPolarRadiusType", + "LiteralScale", + "LiteralShape", + "LiteralStackOffset", + "LiteralSyncMethod", + "LiteralVerticalAlign", + ], +} + +__getattr__, __dir__, __all__ = lazy_loader.attach( + __name__, + submod_attrs=_SUBMOD_ATTRS, ) -from .charts import ( - AreaChart, - BarChart, - ComposedChart, - FunnelChart, - LineChart, - PieChart, - RadarChart, - RadialBarChart, - ScatterChart, - Treemap, -) -from .general import GraphingTooltip, Label, LabelList, Legend, ResponsiveContainer -from .polar import ( - Pie, - PolarAngleAxis, - PolarGrid, - PolarRadiusAxis, - Radar, - RadialBar, -) -from .recharts import ( - LiteralAnimationEasing, - LiteralAreaType, - LiteralAxisType, - LiteralBarChartStackOffset, - LiteralComposedChartBaseValue, - LiteralDirection, - LiteralGridType, - LiteralIconType, - LiteralIfOverflow, - LiteralInterval, - LiteralLayout, - LiteralLegendAlign, - LiteralLegendType, - LiteralLineType, - LiteralOrientation, - LiteralOrientationLeftRightMiddle, - LiteralOrientationTopBottom, - LiteralOrientationTopBottomLeftRight, - LiteralPolarRadiusType, - LiteralScale, - LiteralShape, - LiteralStackOffset, - LiteralSyncMethod, - LiteralVerticalAlign, -) - -area_chart = AreaChart.create -bar_chart = BarChart.create -line_chart = LineChart.create -composed_chart = ComposedChart.create -pie_chart = PieChart.create -radar_chart = RadarChart.create -radial_bar_chart = RadialBarChart.create -scatter_chart = ScatterChart.create -funnel_chart = FunnelChart.create -treemap = Treemap.create - - -area = Area.create -bar = Bar.create -line = Line.create -scatter = Scatter.create -x_axis = XAxis.create -y_axis = YAxis.create -z_axis = ZAxis.create -brush = Brush.create -cartesian_axis = CartesianAxis.create -cartesian_grid = CartesianGrid.create -reference_line = ReferenceLine.create -reference_dot = ReferenceDot.create -reference_area = ReferenceArea.create -error_bar = ErrorBar.create -funnel = Funnel.create - -responsive_container = ResponsiveContainer.create -legend = Legend.create -graphing_tooltip = GraphingTooltip.create -label = Label.create -label_list = LabelList.create - -pie = Pie.create -radar = Radar.create -radial_bar = RadialBar.create -polar_angle_axis = PolarAngleAxis.create -polar_grid = PolarGrid.create -polar_radius_axis = PolarRadiusAxis.create diff --git a/reflex/components/recharts/__init__.pyi b/reflex/components/recharts/__init__.pyi new file mode 100644 index 000000000..2453ef10a --- /dev/null +++ b/reflex/components/recharts/__init__.pyi @@ -0,0 +1,106 @@ +"""Stub file for reflex/components/recharts/__init__.py""" +# ------------------- DO NOT EDIT ---------------------- +# This file was generated by `reflex/utils/pyi_generator.py`! +# ------------------------------------------------------ + +from .cartesian import area as area +from .cartesian import Area as Area +from .cartesian import bar as bar +from .cartesian import Bar as Bar +from .cartesian import line as line +from .cartesian import Line as Line +from .cartesian import scatter as scatter +from .cartesian import Scatter as Scatter +from .cartesian import x_axis as x_axis +from .cartesian import XAxis as XAxis +from .cartesian import y_axis as y_axis +from .cartesian import YAxis as YAxis +from .cartesian import z_axis as z_axis +from .cartesian import ZAxis as ZAxis +from .cartesian import brush as brush +from .cartesian import Brush as Brush +from .cartesian import cartesian_axis as cartesian_axis +from .cartesian import CartesianAxis as CartesianAxis +from .cartesian import cartesian_grid as cartesian_grid +from .cartesian import CartesianGrid as CartesianGrid +from .cartesian import reference_line as reference_line +from .cartesian import ReferenceLine as ReferenceLine +from .cartesian import reference_dot as reference_dot +from .cartesian import ReferenceDot as ReferenceDot +from .cartesian import reference_area as reference_area +from .cartesian import ReferenceArea as ReferenceArea +from .cartesian import error_bar as error_bar +from .cartesian import ErrorBar as ErrorBar +from .cartesian import funnel as funnel +from .cartesian import Funnel as Funnel +from .charts import area_chart as area_chart +from .charts import AreaChart as AreaChart +from .charts import bar_chart as bar_chart +from .charts import BarChart as BarChart +from .charts import line_chart as line_chart +from .charts import LineChart as LineChart +from .charts import composed_chart as composed_chart +from .charts import ComposedChart as ComposedChart +from .charts import pie_chart as pie_chart +from .charts import PieChart as PieChart +from .charts import radar_chart as radar_chart +from .charts import RadarChart as RadarChart +from .charts import radial_bar_chart as radial_bar_chart +from .charts import RadialBarChart as RadialBarChart +from .charts import scatter_chart as scatter_chart +from .charts import ScatterChart as ScatterChart +from .charts import funnel_chart as funnel_chart +from .charts import FunnelChart as FunnelChart +from .charts import treemap as treemap +from .charts import Treemap as Treemap +from .general import responsive_container as responsive_container +from .general import ResponsiveContainer as ResponsiveContainer +from .general import legend as legend +from .general import Legend as Legend +from .general import graphing_tooltip as graphing_tooltip +from .general import GraphingTooltip as GraphingTooltip +from .general import label as label +from .general import Label as Label +from .general import label_list as label_list +from .general import LabelList as LabelList +from .polar import pie as pie +from .polar import Pie as Pie +from .polar import radar as radar +from .polar import Radar as Radar +from .polar import radial_bar as radial_bar +from .polar import RadialBar as RadialBar +from .polar import polar_angle_axis as polar_angle_axis +from .polar import PolarAngleAxis as PolarAngleAxis +from .polar import polar_grid as polar_grid +from .polar import PolarGrid as PolarGrid +from .polar import polar_radius_axis as polar_radius_axis +from .polar import PolarRadiusAxis as PolarRadiusAxis +from .recharts import LiteralAnimationEasing as LiteralAnimationEasing +from .recharts import LiteralAreaType as LiteralAreaType +from .recharts import LiteralAxisType as LiteralAxisType +from .recharts import LiteralBarChartStackOffset as LiteralBarChartStackOffset +from .recharts import LiteralComposedChartBaseValue as LiteralComposedChartBaseValue +from .recharts import LiteralDirection as LiteralDirection +from .recharts import LiteralGridType as LiteralGridType +from .recharts import LiteralIconType as LiteralIconType +from .recharts import LiteralIfOverflow as LiteralIfOverflow +from .recharts import LiteralInterval as LiteralInterval +from .recharts import LiteralLayout as LiteralLayout +from .recharts import LiteralLegendAlign as LiteralLegendAlign +from .recharts import LiteralLegendType as LiteralLegendType +from .recharts import LiteralLineType as LiteralLineType +from .recharts import LiteralOrientation as LiteralOrientation +from .recharts import ( + LiteralOrientationLeftRightMiddle as LiteralOrientationLeftRightMiddle, +) +from .recharts import LiteralOrientationTopBottom as LiteralOrientationTopBottom +from .recharts import ( + LiteralOrientationTopBottomLeftRight as LiteralOrientationTopBottomLeftRight, +) +from .recharts import LiteralPolarRadiusType as LiteralPolarRadiusType +from .recharts import LiteralScale as LiteralScale +from .recharts import LiteralShape as LiteralShape +from .recharts import LiteralStackOffset as LiteralStackOffset +from .recharts import LiteralSyncMethod as LiteralSyncMethod +from .recharts import LiteralVerticalAlign as LiteralVerticalAlign +from reflex.utils import lazy_loader diff --git a/reflex/components/recharts/cartesian.py b/reflex/components/recharts/cartesian.py index 136bddf9f..c4659c9fd 100644 --- a/reflex/components/recharts/cartesian.py +++ b/reflex/components/recharts/cartesian.py @@ -572,3 +572,20 @@ class CartesianAxis(Grid): # The margin between tick line and tick. tick_margin: Var[int] + + +area = Area.create +bar = Bar.create +line = Line.create +scatter = Scatter.create +x_axis = XAxis.create +y_axis = YAxis.create +z_axis = ZAxis.create +brush = Brush.create +cartesian_axis = CartesianAxis.create +cartesian_grid = CartesianGrid.create +reference_line = ReferenceLine.create +reference_dot = ReferenceDot.create +reference_area = ReferenceArea.create +error_bar = ErrorBar.create +funnel = Funnel.create diff --git a/reflex/components/recharts/cartesian.pyi b/reflex/components/recharts/cartesian.pyi index a12994d9e..8db7872ec 100644 --- a/reflex/components/recharts/cartesian.pyi +++ b/reflex/components/recharts/cartesian.pyi @@ -1849,3 +1849,19 @@ class CartesianAxis(Grid): The component. """ ... + +area = Area.create +bar = Bar.create +line = Line.create +scatter = Scatter.create +x_axis = XAxis.create +y_axis = YAxis.create +z_axis = ZAxis.create +brush = Brush.create +cartesian_axis = CartesianAxis.create +cartesian_grid = CartesianGrid.create +reference_line = ReferenceLine.create +reference_dot = ReferenceDot.create +reference_area = ReferenceArea.create +error_bar = ErrorBar.create +funnel = Funnel.create diff --git a/reflex/components/recharts/charts.py b/reflex/components/recharts/charts.py index 5a29cc2aa..0acad98ce 100644 --- a/reflex/components/recharts/charts.py +++ b/reflex/components/recharts/charts.py @@ -521,3 +521,15 @@ class Treemap(RechartsCharts): width=props.pop("width", "100%"), height=props.pop("height", "100%"), ) + + +area_chart = AreaChart.create +bar_chart = BarChart.create +line_chart = LineChart.create +composed_chart = ComposedChart.create +pie_chart = PieChart.create +radar_chart = RadarChart.create +radial_bar_chart = RadialBarChart.create +scatter_chart = ScatterChart.create +funnel_chart = FunnelChart.create +treemap = Treemap.create diff --git a/reflex/components/recharts/charts.pyi b/reflex/components/recharts/charts.pyi index e8562ee4d..ce1a3a5dd 100644 --- a/reflex/components/recharts/charts.pyi +++ b/reflex/components/recharts/charts.pyi @@ -893,3 +893,14 @@ class Treemap(RechartsCharts): The Treemap component wrapped in a responsive container. """ ... + +area_chart = AreaChart.create +bar_chart = BarChart.create +line_chart = LineChart.create +composed_chart = ComposedChart.create +pie_chart = PieChart.create +radar_chart = RadarChart.create +radial_bar_chart = RadialBarChart.create +scatter_chart = ScatterChart.create +funnel_chart = FunnelChart.create +treemap = Treemap.create diff --git a/reflex/components/recharts/general.py b/reflex/components/recharts/general.py index ad23204d6..bb58811c0 100644 --- a/reflex/components/recharts/general.py +++ b/reflex/components/recharts/general.py @@ -182,3 +182,10 @@ class LabelList(Recharts): # Color of the stroke stroke: Var[str] + + +responsive_container = ResponsiveContainer.create +legend = Legend.create +graphing_tooltip = GraphingTooltip.create +label = Label.create +label_list = LabelList.create diff --git a/reflex/components/recharts/general.pyi b/reflex/components/recharts/general.pyi index 5b59acba6..93c8dee96 100644 --- a/reflex/components/recharts/general.pyi +++ b/reflex/components/recharts/general.pyi @@ -573,3 +573,9 @@ class LabelList(Recharts): The component. """ ... + +responsive_container = ResponsiveContainer.create +legend = Legend.create +graphing_tooltip = GraphingTooltip.create +label = Label.create +label_list = LabelList.create diff --git a/reflex/components/recharts/polar.py b/reflex/components/recharts/polar.py index ade6f72c8..f005f6ee7 100644 --- a/reflex/components/recharts/polar.py +++ b/reflex/components/recharts/polar.py @@ -325,3 +325,11 @@ class PolarRadiusAxis(Recharts): EventTriggers.ON_MOUSE_ENTER: lambda: [], EventTriggers.ON_MOUSE_LEAVE: lambda: [], } + + +pie = Pie.create +radar = Radar.create +radial_bar = RadialBar.create +polar_angle_axis = PolarAngleAxis.create +polar_grid = PolarGrid.create +polar_radius_axis = PolarRadiusAxis.create diff --git a/reflex/components/recharts/polar.pyi b/reflex/components/recharts/polar.pyi index a5fe60d99..38c7423f9 100644 --- a/reflex/components/recharts/polar.pyi +++ b/reflex/components/recharts/polar.pyi @@ -547,3 +547,10 @@ class PolarRadiusAxis(Recharts): The component. """ ... + +pie = Pie.create +radar = Radar.create +radial_bar = RadialBar.create +polar_angle_axis = PolarAngleAxis.create +polar_grid = PolarGrid.create +polar_radius_axis = PolarRadiusAxis.create diff --git a/reflex/experimental/layout.py b/reflex/experimental/layout.py index 033379158..b9a8e6d34 100644 --- a/reflex/experimental/layout.py +++ b/reflex/experimental/layout.py @@ -9,7 +9,9 @@ from reflex.components.base.fragment import Fragment from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf from reflex.components.radix.primitives.drawer import DrawerRoot, drawer from reflex.components.radix.themes.components.icon_button import IconButton -from reflex.components.radix.themes.layout import Box, Container, HStack +from reflex.components.radix.themes.layout.box import Box +from reflex.components.radix.themes.layout.container import Container +from reflex.components.radix.themes.layout.stack import HStack from reflex.event import call_script from reflex.experimental import hooks from reflex.state import ComponentState diff --git a/reflex/utils/lazy_loader.py b/reflex/utils/lazy_loader.py new file mode 100644 index 000000000..3d7fea2a9 --- /dev/null +++ b/reflex/utils/lazy_loader.py @@ -0,0 +1,33 @@ +"""Module to implement lazy loading in reflex.""" +import copy + +import lazy_loader as lazy + + +def attach(package_name, submodules=None, submod_attrs=None): + """Replaces a package's __getattr__, __dir__, and __all__ attributes using lazy.attach. + The lazy loader __getattr__ doesn't support tuples as list values. We needed to add + this functionality (tuples) in Reflex to support 'import as _' statements. This function + reformats the submod_attrs dictionary to flatten the module list before passing it to + lazy_loader. + + Args: + package_name: name of the package. + submodules : List of submodules to attach. + submod_attrs : Dictionary of submodule -> list of attributes / functions. + These attributes are imported as they are used. + + Returns: + __getattr__, __dir__, __all__ + """ + _submod_attrs = copy.deepcopy(submod_attrs) + if _submod_attrs: + for k, v in _submod_attrs.items(): + # when flattening the list, only keep the alias in the tuple(mod[1]) + _submod_attrs[k] = [ + mod if not isinstance(mod, tuple) else mod[1] for mod in v + ] + + return lazy.attach( + package_name=package_name, submodules=submodules, submod_attrs=_submod_attrs + ) diff --git a/reflex/utils/pyi_generator.py b/reflex/utils/pyi_generator.py index d14a8af4b..a9468e4fc 100644 --- a/reflex/utils/pyi_generator.py +++ b/reflex/utils/pyi_generator.py @@ -29,11 +29,9 @@ from reflex.vars import Var logger = logging.getLogger("pyi_generator") -INIT_FILE = Path("reflex/__init__.pyi").resolve() PWD = Path(".").resolve() EXCLUDED_FILES = [ - "__init__.py", # "app.py", "component.py", "bare.py", @@ -775,6 +773,13 @@ class StubGenerator(ast.NodeTransformer): # Remove annotated assignments in Component classes (props) return None + # remove dunder method assignments for lazy_loader.attach + for target in node.targets: + if isinstance(target, ast.Tuple): + for name in target.elts: + if isinstance(name, ast.Name) and name.id.startswith("_"): + return + return node def visit_AnnAssign(self, node: ast.AnnAssign) -> ast.AnnAssign | None: @@ -805,6 +810,23 @@ class StubGenerator(ast.NodeTransformer): return node +class InitStubGenerator(StubGenerator): + """A node transformer that will generate the stubs for a given init file.""" + + def visit_Import( + self, node: ast.Import | ast.ImportFrom + ) -> ast.Import | ast.ImportFrom | list[ast.Import | ast.ImportFrom]: + """Collect import statements from the init module. + + Args: + node: The import node to visit. + + Returns: + The modified import node(s). + """ + return [node] + + class PyiGenerator: """A .pyi file generator that will scan all defined Component in Reflex and generate the approriate stub. @@ -842,6 +864,37 @@ class PyiGenerator: pyi_path.write_text("\n".join(pyi_content)) logger.info(f"Wrote {relpath}") + def _get_init_lazy_imports(self, mod, new_tree): + # retrieve the _SUBMODULES and _SUBMOD_ATTRS from an init file if present. + sub_mods = getattr(mod, "_SUBMODULES", None) + sub_mod_attrs = getattr(mod, "_SUBMOD_ATTRS", None) + + if not sub_mods and not sub_mod_attrs: + return + sub_mods_imports = [] + sub_mod_attrs_imports = [] + + if sub_mods: + sub_mods_imports = [ + f"from . import {mod} as {mod}" for mod in sorted(sub_mods) + ] + sub_mods_imports.append("") + + if sub_mod_attrs: + sub_mod_attrs = { + attr: mod for mod, attrs in sub_mod_attrs.items() for attr in attrs + } + # construct the import statement and handle special cases for aliases + sub_mod_attrs_imports = [ + f"from .{path} import {mod if not isinstance(mod, tuple) else mod[0]} as {mod if not isinstance(mod, tuple) else mod[1]}" + for mod, path in sub_mod_attrs.items() + ] + sub_mod_attrs_imports.append("") + + text = "\n" + "\n".join([*sub_mods_imports, *sub_mod_attrs_imports]) + text += ast.unparse(new_tree) + "\n" + return text + def _scan_file(self, module_path: Path): module_import = ( _relative_to_pwd(module_path) @@ -860,13 +913,22 @@ class PyiGenerator: and obj != Component and inspect.getmodule(obj) == module } - if not class_names: + is_init_file = _relative_to_pwd(module_path).name == "__init__.py" + if not class_names and not is_init_file: return - new_tree = StubGenerator(module, class_names).visit( - ast.parse(inspect.getsource(module)) - ) - self._write_pyi_file(module_path, ast.unparse(new_tree)) + if is_init_file: + new_tree = InitStubGenerator(module, class_names).visit( + ast.parse(inspect.getsource(module)) + ) + init_imports = self._get_init_lazy_imports(module, new_tree) + if init_imports: + self._write_pyi_file(module_path, init_imports) + else: + new_tree = StubGenerator(module, class_names).visit( + ast.parse(inspect.getsource(module)) + ) + self._write_pyi_file(module_path, ast.unparse(new_tree)) def _scan_files_multiprocess(self, files: list[Path]): with Pool(processes=cpu_count()) as pool: @@ -922,16 +984,3 @@ class PyiGenerator: self._scan_files(file_targets) else: self._scan_files_multiprocess(file_targets) - - -def generate_init(): - """Generate a pyi file for the main __init__.py.""" - from reflex import _MAPPING # type: ignore - - imports = [ - f"from {path if mod != path.rsplit('.')[-1] or mod == 'page' else '.'.join(path.rsplit('.')[:-1])} import {mod} as {mod}" - for mod, path in _MAPPING.items() - ] - imports.append("") - with contextlib.suppress(Exception): - INIT_FILE.write_text("\n".join(imports)) diff --git a/scripts/make_pyi.py b/scripts/make_pyi.py index 10a2e1acd..61773b4ab 100644 --- a/scripts/make_pyi.py +++ b/scripts/make_pyi.py @@ -5,7 +5,7 @@ import subprocess import sys from pathlib import Path -from reflex.utils.pyi_generator import PyiGenerator, _relative_to_pwd, generate_init +from reflex.utils.pyi_generator import PyiGenerator, _relative_to_pwd logger = logging.getLogger("pyi_generator") @@ -92,7 +92,7 @@ if __name__ == "__main__": targets = ( [arg for arg in sys.argv[1:] if not arg.startswith("tests")] if len(sys.argv) > 1 - else ["reflex/components"] + else ["reflex/components", "reflex/__init__.py"] ) logger.info(f"Running .pyi generator for {targets}") @@ -104,7 +104,6 @@ if __name__ == "__main__": gen = PyiGenerator() gen.scan_all(targets, changed_files) - generate_init() current_commit_sha = subprocess.run( ["git", "rev-parse", "HEAD"], capture_output=True, encoding="utf-8" diff --git a/tests/components/core/test_foreach.py b/tests/components/core/test_foreach.py index 6c4184590..3fe38def9 100644 --- a/tests/components/core/test_foreach.py +++ b/tests/components/core/test_foreach.py @@ -2,9 +2,16 @@ from typing import Dict, List, Set, Tuple, Union import pytest -from reflex.components import box, el, foreach, text +from reflex import el from reflex.components.component import Component -from reflex.components.core.foreach import Foreach, ForeachRenderError, ForeachVarError +from reflex.components.core.foreach import ( + Foreach, + ForeachRenderError, + ForeachVarError, + foreach, +) +from reflex.components.radix.themes.layout.box import box +from reflex.components.radix.themes.typography.text import text from reflex.state import BaseState, ComponentState from reflex.vars import Var diff --git a/tests/components/forms/test_uploads.py b/tests/components/forms/test_uploads.py index 930d669ef..9050bc0dd 100644 --- a/tests/components/forms/test_uploads.py +++ b/tests/components/forms/test_uploads.py @@ -79,16 +79,16 @@ def test_upload_root_component_render(upload_root_component): # box inside of upload [box] = upload["children"] - assert box["name"] == "Box" + assert box["name"] == "RadixThemesBox" assert box["props"] == [ "className={`rx-Upload`}", - 'sx={{"border": "1px dotted black"}}', + 'css={{"border": "1px dotted black"}}', "{...getRootProps()}", ] # input, button and text inside of box [input, button, text] = box["children"] - assert input["name"] == "Input" + assert input["name"] == "input" assert input["props"] == ["type={`file`}", "{...getInputProps()}"] assert button["name"] == "RadixThemesButton" @@ -121,16 +121,16 @@ def test_upload_component_render(upload_component): # box inside of upload [box] = upload["children"] - assert box["name"] == "Box" + assert box["name"] == "RadixThemesBox" assert box["props"] == [ "className={`rx-Upload`}", - 'sx={{"border": "1px dotted black", "padding": "5em", "textAlign": "center"}}', + 'css={{"border": "1px dotted black", "padding": "5em", "textAlign": "center"}}', "{...getRootProps()}", ] # input, button and text inside of box [input, button, text] = box["children"] - assert input["name"] == "Input" + assert input["name"] == "input" assert input["props"] == ["type={`file`}", "{...getInputProps()}"] assert button["name"] == "RadixThemesButton" diff --git a/tests/components/graphing/test_recharts.py b/tests/components/graphing/test_recharts.py index b87935d1a..c1b986dfd 100644 --- a/tests/components/graphing/test_recharts.py +++ b/tests/components/graphing/test_recharts.py @@ -1,4 +1,4 @@ -from reflex.components.recharts import ( +from reflex.components.recharts.charts import ( AreaChart, BarChart, LineChart, diff --git a/tests/components/test_component.py b/tests/components/test_component.py index e4d7205d7..356b9feae 100644 --- a/tests/components/test_component.py +++ b/tests/components/test_component.py @@ -1320,10 +1320,24 @@ def test_instantiate_all_components(): "Tfoot", "Thead", } - for component_name in rx._ALL_COMPONENTS: # type: ignore + component_nested_list = [ + *rx.RADIX_MAPPING.values(), + *rx.COMPONENTS_BASE_MAPPING.values(), + *rx.COMPONENTS_CORE_MAPPING.values(), + ] + for component_name in [ + comp_name + for submodule_list in component_nested_list + for comp_name in submodule_list + ]: # type: ignore if component_name in untested_components: continue - component = getattr(rx, component_name) + component = getattr( + rx, + component_name + if not isinstance(component_name, tuple) + else component_name[1], + ) if isinstance(component, type) and issubclass(component, Component): component.create() diff --git a/tests/test_app.py b/tests/test_app.py index 0e204c7d5..46079e6da 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -27,7 +27,9 @@ from reflex.app import ( process, upload, ) -from reflex.components import Component, Cond, Fragment +from reflex.components import Component +from reflex.components.base.fragment import Fragment +from reflex.components.core.cond import Cond from reflex.components.radix.themes.typography.text import Text from reflex.event import Event from reflex.middleware import HydrateMiddleware diff --git a/tests/test_init.py b/tests/test_init.py deleted file mode 100644 index 4f511983b..000000000 --- a/tests/test_init.py +++ /dev/null @@ -1,9 +0,0 @@ -from reflex import _reverse_mapping # type: ignore - - -def test__reverse_mapping(): - assert _reverse_mapping({"a": ["b"], "c": ["d"]}) == {"b": "a", "d": "c"} - - -def test__reverse_mapping_duplicate(): - assert _reverse_mapping({"a": ["b", "c"], "d": ["b"]}) == {"b": "a", "c": "a"}