* test_foreach: assert on arg _var_type
* [REF-2682] Foreach over dict uses Tuple arg value
When iterating over a Var with _var_type dict, the resulting arg value
_var_type should be Tuple[key, value] so it can be correctly used with other
var operations.
Fix#3157
* Correct _var_type for iteration over Tuple of multiple types
The arg value when iterating over a tuple could be any of the possible values
mentioned in the annotation.
When only one type is used, the Union collapses to the base type, at least in py3.11
* Add comments
* add more tests
* add tests to raise coverage
* more tests, bump coverage to 73
* fix up icon_button test
* fix darglint for app.py
* fix utcnow usage warning
* set threshold to 72
* fix timestamp
* fix unit tests for linux-redis
* removed commented code and put a TODO
* build pyi files when building/publishing 3rd party
* fix typo in workflow
* add future annotation
* add tests to pass coverage check
* add more unit tests
* omit pyi_generator from test coverage
* change black from dev deps to direct deps
* remake all pyi
* format pyi if black is present, return as if otherwise
* fix requested changes
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Connection pulser only depends on has_connection_errors
Avoid showing the WiFi error icon when the state is hydrating / navigating
because not being hydrated is not indicative of a connection error in itself.
* Set is_hydrated=False at route onChangeStart
When navigation event starts, set is_hydrated=False on the client side before
any on_load event is dispatched. This avoids a flickering problem where the
client browser navigates and briefly shows content on the page before
processing on_load events associated with the page.
Fix#2885
* Update pyi
* [REF-2265] ComponentState: scaffold for copying State per Component instance
Define a base ComponentState which can be used to easily create copies of the
given State definition (Vars and EventHandlers) that are tied to a particular
instance of a Component (returned by get_component)
* Define `State` field on `Component` for typing compatibility.
This is an Optional field of Type[State] and is populated by ComponentState.
* Add integration/test_component_state.py
Create two independent counters and increment them separately
* Add unit test for ComponentState
* textarea: expose auto_height and enter_key_submit props
These two props improve the workflow for chat apps and other situations where
we want multiline input.
auto_height: resize the textarea based on its contents
enter_key_submit: pressing enter submits the enclosing form (shift+enter
inserts new lines)
Fix#1231
* Update pyi
* Revert "Remove width prop from rx.select (#2835)"
This reverts commit d14292dc9b.
* HighLevelSelect: pass flex_shrink prop to SelectTrigger
This allows the high level select to have width="100%" and also shrink-to-fit inside a parent container.
Fix#2824, kind of
* Separate `get_hooks` and `get_hooks_internal` for stable output
When downstream component wrappers depend on State when writing hooks, they
need to be assured that all internal hooks (events, var hooks, memoized
handlers, etc) will be rendered prior to user-defined hooks.
This also makes it less likely for downstream components to feel the need to
overwrite `get_hooks` (no underscore) directly and break internal functioning
of Reflex components.
* Include internal hooks in AppWrap and Page
* Apply get_hooks_internal in a few more places
* CustomComponent ignores the annotation type in favor of the passed value
Do not require rx.memo wrapped functions to have 100% correct annotations.
* test_custom_component_get_imports: test imports from wrapped custom components
* Account for imports of custom components for frontend installation
Create new ImportVar that only install the package to avoid rendering the
imports in the page that contains the custom component itself.
* Handle Imports that should never be installed
* Fix up double negative logic
* Perf Optimization: use the imports we already calculate during compile
Instead of augmenting _get_imports with a weird, slow, recursive crawl and
dictionary reconstruction, just use the imports that we compile into the
components.js file to install frontend packages needed by the custom
components.
Same effect, but adds essentially zero overhead to the compilation.
* Make @rx.memo work with state vars passed as props
Seems like this was a regression from the StatefulComponent refactor, because
trying to pass a state Var to a CustomComponent gave undefined, likely due to
`_get_vars` not accounting for `self.props` in CustomComponents.
With this change, it works.
Integration test added to `test_var_operations.py`
* Allow CustomComponent props to be Component
Avoid calling `.json()` on all Base types because the Var serializer already
does that, but this way, more specific types (like Component) can be serialized
differently.
When the type is Component, attach a VarData with the imports and hooks to when
the Var is rendered, it also carries the correct imports/hooks and does not
throw frontend errors.
* [REF-2158] Enable state when `on_load` or event_triggers are set.
Basically all events in a reflex app require the backend to be up, even the
built-in server side events round trip to the backend and require "state" even
if no user-defined state classes are declared.
test_app_state_determination: checking that state is enabled at the right time
* Clear out DECORATED_PAGES when initializing a new app
* rebase
* pass include_children kwarg in radix FormRoot
* respect include_children
* ruff fixes
* readd statemanager init, run pyi gen
* minor performance imporovements, fix for state changes
* fix pyi and pyright
* pass include_children for chakra
* remove old state detection
* add test for unused states in stateless app
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* [REF-1368] Move common form functionality to rx.el.forms
Allow plain HTML Form element to have magic on_submit event handler.
* Chakra and Radix forms inherit `on_submit` functionality from rx.el.form
Consolidate logic in the basic HTML form and use it in both Radix and Chakra
form wrappers.
* from __future__ import annotations for py38
* [REF-2098] Allow overlay Close components to have on_click handlers
The child of the Radix *Close components are passed `asChild`, meaning they are
treated as the direct child of the Close itself. This causes the `on_click`
handler attached to such an element to override the default `on_click` behavior
of the Close, which is to close the overlay, thus breaking the desired behavior
of the Close component.
When creating a Close component, if the child has an `on_click` handler, then
internally wrap it in a `Flex` so that the `Flex` gets the `asChild` treatment,
and both the default on_click and the child's on_click are both fired.
Bonus fix: pass `asChild` when constructing the `DrawerClose` to avoid a
<button> in <button> warning in the browser console, because the Drawer does
NOT pass `asChild` to the Close by default.
* Move Trigger logic to RadixThemesTriggerComponent base class
Apply trigger logic to Trigger, Close, Cancel, and Accept components; including
hover_card and dropdown_menu.
The ThemePanel fights with the ThemeProvider when the user color preference key differs from the `appearance` prop specified in the theme. To avoid issues when using the ThemePanel (in development), clear out the user color preference before loading the page and before unloading the page (to ensure it does not freeze on reload).
Clearing the user preference isn't ideal production behavior, but typically the
ThemePanel is only used during development for trying out different styles, and
having it not freeze the app is better dev behavior.
Fix#2650
* Expose `on_drop` event trigger for rx.upload component.
If `on_drop` is provided, it should be an EventSpec accepting the special
rx.upload_files() arg.
When `on_drop` is provided, it will be called immediately when files are
selected. The default functionality of saving a file list to be uploaded later
will not be available.
* update pyi file
* Undeprecate explicit EventChain
* [REF-2087] Better rx.progress styling integration with radix themes
Support the `radius` prop on `ProgressRoot`, via data-radius and CSS tokens
Support the `color_scheme` on `ProgressIndicator`, via data-accent-color and CSS token
Move high-level `Progress` to a real `Component` subclass to get better pyi hinting
Allow overriding the background color of the `ProgressIndicator` via low-level api
Remove `value` and `max` props from `ProgressRoot` (these only apply to `ProgressIndicator`)
* Progress: do not pass `value` or `max` to ProgressRoot
* progress: use background_color instead of background-color
* pass lang and custom_attrs from app to html root
* fix some pre-commit errors and try adding lang
* fix tests
* really fix test
* cleanup with @benedikt-bartscher
* fix props and tests
* use str instead of var
* change typing of html_custom_attrs to not allow Vars
* add pulser for connection + adjust condition for connnection_modal
* update style for connection pulser
* rename connectError to connectErrors
* resolve update bug of connectErrors
* fix pulse definition
* rollback pulse definition
* Define WifiOffPulse icon as its own component
Attach the pulse keyframes and imports to the icon itself so that the code gets
properly included in stateful_components.js when it is used.
* limit number of errors in memory
---------
Co-authored-by: Masen Furer <m_github@0x26.net>
* Accordion Items unique Value
use crypto.randomUUID to generate accordion item value at runtime instead of compile time
* use generateUUID in state.js instead of crypto.randomUUID()
* Accordion Root Exclude `color_scheme` and `variant` props in tag
* colorScheme -> color for radix primitives
* remove _rename_props based on pr comments
* lint
* pyi fix
* pop instead of del
* link: respect `is_external` prop and other attributes on A tag
Instead of passing all props to NextLink by default, only pass props that
NextLink understands, placing the remaining props on the Radix link
Add a test case to avoid regression of `is_external` behavior.
* Link is a MemoizationLeaf
Because Link is often rendered with NextLink as_child, and NextLink breaks if
the href is stateful outside of a Link, ensure that any stateful child of Link
gets memoized together.
* rx.el.img accepts Any type for src prop
This retains compatibility with the previous chakra image src prop.
* Re-add `moment` back to top-level namespace
* Component: translate underscore suffix for props supported by chakra
type_ becomes type
min_ becomes min
max_ becomes max
id_ becomes id
The deprecation warning is only displayed when the underscore suffix prop is
passed and the non-underscore suffix prop is defined on the given component.
* Rename type_ to type in accordion and scroll_area
All of the new radix components avoid the underscore suffix names where
possible.
* Update deprecation warning wording
* Refactor for readability
* Do not raise deprecation warning for `id_`
id is kind of a special prop because it exists on all components
* Add test case for deprecating underscore suffix props
* style: shorthand replacements need camelCase
Avoid warning on terminal and in browser console from using kebab-case CSS
props with emotion.
* _rename_props only replace prop name once
In case the value also contains the prop name, we don't want to replace it
multiple times.
* pyi_generator: ignore _rename_props in create signature
* Avoid shadowing CSS prop `display` and `gap`
Replace usages of `gap` with `spacing` to retain Radix sizing number system,
while allowing users to specify a responsive `gap` using CSS units.
Remove `display` props from radix components, allowing `display` to accept
responsive lists.
* checkbox: apply `gap` to `flex` if provided
* Remove _rename_props from .create signatures
* Fix spacing prop in blank template
* Fixup tests after changing style shorthand to return camelCase
* banner.py: fix import specification for getBackendURL
Use the constant Dirs.STATE_PATH
* state.js: only `getBackendURL` dynamically when running client side
During server side rendering, `getBackendURL` cannot access the current
location from the `window`, because there is no `window`.
* Better client-side context checking
Thanks jackie
* upload with StaticFiles
* always create uploaded files folder
* just use /_upload to serve uploaded files
* Upload: update pyi file
* app.py: only mount Upload StaticFiles if the upload component is used
* pyi_generator: always ignore files starting with `tests`
* Move CodeBlock out of chakra namespace
* Expose additional names in the top-level namespace
* code pyi fixup
* expose input and quote at the top-level
* add text_field to top-level namespace (maybe)
* fixup chakra code.pyi
* Remove `text_field` from top level namespace
* Remove top-level big C Cond
* fixup top level pyi
* Reserve top-level __call__ for a future high level API
Instead of aliasing the top-level `__call__` to `.root`, require users
to explicitly call `.root` to avoid breakage when a future high level
API gets implemented and takes over the top-level `__call__`
Fix REF-1839
* alertdialog: forgot this one
* update to ensure every radix component only inherits events from EventTriggers class
* update the naming of event handlers to swap name on_value_change and on_checked_change to on_change
* update to call _replace_prop_names in component.py
* small darglint error fix
* update to ensure every radix component only inherits events from EventTriggers class
* update the naming of event handlers to swap name on_value_change and on_checked_change to on_change
* update to call _replace_prop_names in component.py
* small darglint error fix
* updates to pass pytest tests
* small fix
* duplicate removal
---------
Co-authored-by: Tom Gotsman <tomgotsman@toms-mbp.lan>
* adding cancel and action sub components for alert dialog
* updates to pass integration tests
* add components
---------
Co-authored-by: Tom Gotsman <tomgotsman@Toms-MacBook-Pro.local>
Co-authored-by: Tom Gotsman <tomgotsman@toms-mbp.lan>
* Add inital ui
* More radix updates
* Add el inheritance
* Add el inheritance for layout
* Triggers + primitive prop inheritance
* Initial Primitives
* Small fix
* Update select
* Radix Themes fixups (#2245)
* [REF-1367] Fix up event trigger specs
* Add missing name/value props for form controls
Checkbox was incorrectly tagged Button
TextArea was incorrectly tagged TextArea.Input
* [REF-1364] Radix Link now renders as a NextLink
For href as Var or href does not contain the ://, then
render as a NextLink for efficient inner-app navigation
* More changes
* PYI
* add @radix-ui/icons to radix.themes
* add pyi file
* fix for py3.8
---------
Co-authored-by: Alek Petuskey <alekpetuskey@aleks-mbp.lan>
Co-authored-by: Masen Furer <m_github@0x26.net>
* Expose preventDefault and stopPropagation for DOM events
All EventHandler, EventSpec, and EventChain can now carry these extra
"event_actions" that will be applied inside the frontend code when an event is
triggered from the DOM.
Fix#1621
Fix REF-675
* Test cases (and fixes) for "event_actions"
* form: from __future__ import annotations
for py38, py39 compat
* Revert overzealous merge conflict resolution
* partly add some radix-ui/themes based components
* add @radix-ui/themes integration to top-level app
* WiP: compile _app_wrap based on which component library is used
TODO: working color mode
* WiP get color mode working with agnostic provider
still not perfect, as the RadixColorModeProvider seems to trip hydration errors
when using color_mode_cond component, but for now, this provides a nice balance
between the two libraries and allows them to interoperate.
* WiP template _app.js instead of making a separate wrap file
* WiP: use next-themes for consistent darkmode switching
* strict pin chakra deps
* Move ChakraColorModeProvider to separate js file
* move nasty radix themes js code into js files
* remove chakra from default imports
* chakra fixup import to use .js extension
* Add radix theme typography and layout components
* do NOT special case the radix theme...
avoid templating json and applying it, avoid non-customizable logic
just add the radix Theme component as an app wrap if the user specifies it to
rx.App, and any other app-wrap theme-like component could _also_ be used
without having to change the code.
this also allows different themes for different sections of the app by simply
placing elements inside a different rdxt.theme wrapper.
* Theme uses "radius" not "borderRadius"
* move next-themes to main packages.json
this is always used, regardless of the component library
* test_app: test cases for app_wrap interface
* Finish wrapping Button, Switch, and TextField components
* docstring, comments, static fixups
* debounce: use alias or tag when passing child Element
Fix REF-830
* test_app: ruin my beautiful indentation
* py38 compatibility
* Add event triggers for switch and TextField
* Add type hints for radix theme components
* radix themes fixups from writing the tests
* Add integration test for radix themes components
* test_app: mock out package installation
we only need the compile result, we're not actually trying to install packages
* avoid incompatible version of @emotion/react
* test_radix_themes: include theme_panel component
* next-themes default scheme: "light"
until all of our components look good in dark mode, need to keep the default as
light mode regardless of the system setting.
* Fix dunamic imoprt for react player and plotly
* Fix format
* Fix pr comments
* Update react player
---------
Co-authored-by: Alek Petuskey <alekpetuskey@aleks-mbp.lan>