@remix-run/ui 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +116 -157
- package/dist/accordion/index.d.ts +46 -0
- package/dist/accordion/index.js +142 -0
- package/dist/accordion/index.js.map +1 -0
- package/dist/accordion/primitives.d.ts +104 -0
- package/dist/accordion/primitives.js +312 -0
- package/dist/accordion/primitives.js.map +1 -0
- package/dist/{components/anchor/anchor.js → anchor/index.js} +1 -1
- package/dist/anchor/index.js.map +1 -0
- package/dist/animation/animate-layout-mixin.js +1 -1
- package/dist/animation/animate-layout-mixin.js.map +1 -1
- package/dist/animation/animate-mixins.js +2 -2
- package/dist/animation/animate-mixins.js.map +1 -1
- package/dist/animation/demos/color-interpolation.js +1 -1
- package/dist/animation/demos/color-interpolation.js.map +1 -1
- package/dist/animation/demos/drag-release.d.ts +1 -1
- package/dist/animation/demos/hold-to-confirm.d.ts +3 -3
- package/dist/animation/demos/material-ripple.js +1 -3
- package/dist/animation/demos/material-ripple.js.map +1 -1
- package/dist/animation/demos/reordering.js +9 -6
- package/dist/animation/demos/reordering.js.map +1 -1
- package/dist/animation/index.js +4 -4
- package/dist/animation/spring.js.map +1 -1
- package/dist/{components/breadcrumbs/breadcrumbs.js → breadcrumbs/index.js} +19 -19
- package/dist/breadcrumbs/index.js.map +1 -0
- package/dist/button/index.d.ts +15 -0
- package/dist/button/index.js +128 -0
- package/dist/button/index.js.map +1 -0
- package/dist/checkbox/index.d.ts +14 -0
- package/dist/checkbox/index.js +127 -0
- package/dist/checkbox/index.js.map +1 -0
- package/dist/combobox/index.d.ts +21 -0
- package/dist/combobox/index.js +58 -0
- package/dist/combobox/index.js.map +1 -0
- package/dist/{components/combobox/combobox.d.ts → combobox/primitives.d.ts} +4 -8
- package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
- package/dist/combobox/primitives.js.map +1 -0
- package/dist/dev/refresh.d.ts +1 -0
- package/dist/dev/refresh.js +2 -0
- package/dist/dev/refresh.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +14 -14
- package/dist/input/index.d.ts +13 -0
- package/dist/input/index.js +121 -0
- package/dist/input/index.js.map +1 -0
- package/dist/jsx-runtime.js +2 -2
- package/dist/listbox/flash-attribute.js.map +1 -0
- package/dist/{components/listbox/listbox.d.ts → listbox/index.d.ts} +2 -6
- package/dist/{components/listbox/listbox.js → listbox/index.js} +4 -82
- package/dist/listbox/index.js.map +1 -0
- package/dist/menu/hover-aim.js.map +1 -0
- package/dist/menu/index.d.ts +42 -0
- package/dist/menu/index.js +250 -0
- package/dist/menu/index.js.map +1 -0
- package/dist/{components/menu/menu.d.ts → menu/primitives.d.ts} +4 -33
- package/dist/{components/menu/menu.js → menu/primitives.js} +98 -315
- package/dist/menu/primitives.js.map +1 -0
- package/dist/{components/popover/popover.d.ts → popover/index.d.ts} +2 -4
- package/dist/{components/popover/popover.js → popover/index.js} +5 -48
- package/dist/popover/index.js.map +1 -0
- package/dist/{interactions/outside-click/outside-click-mixin.js → popover/outside-click.js} +1 -1
- package/dist/popover/outside-click.js.map +1 -0
- package/dist/popover/scroll-lock.d.ts +1 -0
- package/dist/{utils → popover}/scroll-lock.js +0 -18
- package/dist/popover/scroll-lock.js.map +1 -0
- package/dist/radio/index.d.ts +12 -0
- package/dist/radio/index.js +77 -0
- package/dist/radio/index.js.map +1 -0
- package/dist/runtime/client-entry-boundary.d.ts +14 -0
- package/dist/runtime/client-entry-boundary.js +29 -0
- package/dist/runtime/client-entry-boundary.js.map +1 -0
- package/dist/runtime/component.d.ts +19 -4
- package/dist/runtime/component.js +39 -9
- package/dist/runtime/component.js.map +1 -1
- package/dist/runtime/core/attributes.js +36 -3
- package/dist/runtime/core/attributes.js.map +1 -1
- package/dist/runtime/core/children.d.ts +2 -0
- package/dist/runtime/core/children.js +26 -2
- package/dist/runtime/core/children.js.map +1 -1
- package/dist/runtime/core/props.js +2 -2
- package/dist/runtime/core/vnode.d.ts +3 -3
- package/dist/runtime/core/vnode.js +22 -1
- package/dist/runtime/core/vnode.js.map +1 -1
- package/dist/runtime/create-element.d.ts +2 -2
- package/dist/runtime/create-element.js +3 -2
- package/dist/runtime/create-element.js.map +1 -1
- package/dist/runtime/diff-dom.js +294 -219
- package/dist/runtime/diff-dom.js.map +1 -1
- package/dist/runtime/diff-props.js +3 -3
- package/dist/runtime/dom.d.ts +12 -0
- package/dist/runtime/element-function.d.ts +3 -0
- package/dist/runtime/element-function.js +2 -0
- package/dist/runtime/element-function.js.map +1 -0
- package/dist/runtime/form-navigation.d.ts +25 -0
- package/dist/runtime/form-navigation.js +132 -0
- package/dist/runtime/form-navigation.js.map +1 -0
- package/dist/runtime/frame-resolution.d.ts +5 -0
- package/dist/runtime/frame-resolution.js +10 -0
- package/dist/runtime/frame-resolution.js.map +1 -0
- package/dist/runtime/frame.d.ts +58 -15
- package/dist/runtime/frame.js +367 -114
- package/dist/runtime/frame.js.map +1 -1
- package/dist/runtime/jsx.d.ts +1 -1
- package/dist/runtime/jsx.js +1 -1
- package/dist/runtime/jsx.js.map +1 -1
- package/dist/runtime/key.d.ts +1 -0
- package/dist/runtime/key.js +2 -0
- package/dist/runtime/key.js.map +1 -0
- package/dist/runtime/mixins/attrs-mixin.js +2 -2
- package/dist/runtime/mixins/link-mixin.js +4 -3
- package/dist/runtime/mixins/link-mixin.js.map +1 -1
- package/dist/runtime/mixins/mixin.d.ts +15 -10
- package/dist/runtime/mixins/mixin.js +4 -4
- package/dist/runtime/mixins/mixin.js.map +1 -1
- package/dist/runtime/mixins/on-mixin.js +1 -1
- package/dist/runtime/mixins/ref-mixin.js +1 -1
- package/dist/runtime/navigation.d.ts +4 -1
- package/dist/runtime/navigation.js +157 -32
- package/dist/runtime/navigation.js.map +1 -1
- package/dist/runtime/reconcile.d.ts +11 -10
- package/dist/runtime/reconcile.js +557 -423
- package/dist/runtime/reconcile.js.map +1 -1
- package/dist/runtime/refresh.d.ts +28 -0
- package/dist/runtime/refresh.js +31 -0
- package/dist/runtime/refresh.js.map +1 -0
- package/dist/runtime/render.js +1 -1
- package/dist/runtime/render.js.map +1 -1
- package/dist/runtime/run.d.ts +3 -1
- package/dist/runtime/run.js +15 -7
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/scheduler.js +8 -16
- package/dist/runtime/scheduler.js.map +1 -1
- package/dist/runtime/to-vnode.d.ts +2 -2
- package/dist/runtime/to-vnode.js +68 -20
- package/dist/runtime/to-vnode.js.map +1 -1
- package/dist/runtime/vdom.d.ts +4 -2
- package/dist/runtime/vdom.js +89 -41
- package/dist/runtime/vdom.js.map +1 -1
- package/dist/runtime/vnode.d.ts +138 -67
- package/dist/runtime/vnode.js +17 -12
- package/dist/runtime/vnode.js.map +1 -1
- package/dist/select/index.d.ts +19 -0
- package/dist/select/index.js +95 -0
- package/dist/select/index.js.map +1 -0
- package/dist/select/keydown.js.map +1 -0
- package/dist/{components/select/select.d.ts → select/primitives.d.ts} +5 -7
- package/dist/{components/select/select.js → select/primitives.js} +11 -63
- package/dist/select/primitives.js.map +1 -0
- package/dist/server/stream.js +22 -29
- package/dist/server/stream.js.map +1 -1
- package/dist/shared/focus-styles.d.ts +1 -0
- package/dist/shared/focus-styles.js +2 -0
- package/dist/shared/focus-styles.js.map +1 -0
- package/dist/shared/icons.d.ts +9 -0
- package/dist/shared/icons.js +42 -0
- package/dist/shared/icons.js.map +1 -0
- package/dist/shared/listbox-popover-styles.d.ts +6 -0
- package/dist/shared/listbox-popover-styles.js +137 -0
- package/dist/shared/listbox-popover-styles.js.map +1 -0
- package/dist/shared/style-values.d.ts +78 -0
- package/dist/shared/style-values.js +88 -0
- package/dist/shared/style-values.js.map +1 -0
- package/dist/{interactions/typeahead/typeahead-mixin.js → shared/typeahead.js} +1 -1
- package/dist/shared/typeahead.js.map +1 -0
- package/dist/shared/wait-for-css-transition.js.map +1 -0
- package/dist/shared/wait.js.map +1 -0
- package/dist/style/css-mixin.js +3 -3
- package/dist/style/index.js +2 -2
- package/dist/style/style.js +25 -6
- package/dist/style/style.js.map +1 -1
- package/dist/style/stylesheet.d.ts +0 -1
- package/dist/style/stylesheet.js +13 -54
- package/dist/style/stylesheet.js.map +1 -1
- package/dist/tabs/index.d.ts +32 -0
- package/dist/tabs/index.js +157 -0
- package/dist/tabs/index.js.map +1 -0
- package/dist/tabs/primitives.d.ts +57 -0
- package/dist/tabs/primitives.js +238 -0
- package/dist/tabs/primitives.js.map +1 -0
- package/dist/test.js +1 -1
- package/dist/toggle/index.d.ts +9 -0
- package/dist/toggle/index.js +108 -0
- package/dist/toggle/index.js.map +1 -0
- package/dist/toggle/primitives.d.ts +29 -0
- package/dist/toggle/primitives.js +127 -0
- package/dist/toggle/primitives.js.map +1 -0
- package/package.json +81 -49
- package/src/{components/accordion → accordion}/README.md +50 -14
- package/src/accordion/index.tsx +285 -0
- package/src/accordion/primitives.tsx +512 -0
- package/src/{components/anchor → anchor}/README.md +37 -2
- package/src/animation/animate-mixins.ts +3 -3
- package/src/animation/demos/color-interpolation.tsx +1 -1
- package/src/animation/demos/reordering.tsx +9 -6
- package/src/{components/breadcrumbs → breadcrumbs}/README.md +4 -4
- package/src/{components/breadcrumbs/breadcrumbs.tsx → breadcrumbs/index.tsx} +18 -18
- package/src/button/README.md +44 -0
- package/src/button/index.ts +168 -0
- package/src/checkbox/README.md +59 -0
- package/src/checkbox/index.ts +164 -0
- package/src/{components/combobox → combobox}/README.md +58 -9
- package/src/combobox/index.tsx +112 -0
- package/src/{components/combobox/combobox.tsx → combobox/primitives.tsx} +5 -91
- package/src/dev/refresh.ts +1 -0
- package/src/index.ts +1 -1
- package/src/input/README.md +52 -0
- package/src/input/index.ts +147 -0
- package/src/{components/listbox → listbox}/README.md +9 -41
- package/src/{components/listbox/listbox.ts → listbox/index.ts} +2 -87
- package/src/{components/menu → menu}/README.md +55 -14
- package/src/menu/index.tsx +354 -0
- package/src/{components/menu/menu.tsx → menu/primitives.tsx} +99 -413
- package/src/{components/popover → popover}/README.md +20 -39
- package/src/{components/popover/popover.ts → popover/index.ts} +3 -57
- package/src/{utils → popover}/scroll-lock.ts +0 -28
- package/src/radio/README.md +53 -0
- package/src/radio/index.ts +101 -0
- package/src/runtime/client-entry-boundary.ts +54 -0
- package/src/runtime/component.ts +65 -16
- package/src/runtime/core/attributes.ts +35 -1
- package/src/runtime/core/children.ts +24 -2
- package/src/runtime/core/vnode.ts +25 -4
- package/src/runtime/create-element.ts +6 -5
- package/src/runtime/demos/readme.demo.tsx +20 -18
- package/src/runtime/diff-dom.ts +358 -243
- package/src/runtime/dom.ts +331 -214
- package/src/runtime/element-function.ts +1 -0
- package/src/runtime/event-listeners.ts +1 -1
- package/src/runtime/form-navigation.ts +184 -0
- package/src/runtime/frame-resolution.ts +13 -0
- package/src/runtime/frame.ts +482 -124
- package/src/runtime/jsx.ts +3 -5
- package/src/runtime/key.ts +1 -0
- package/src/runtime/mixins/link-mixin.ts +1 -0
- package/src/runtime/mixins/mixin.ts +21 -18
- package/src/runtime/navigation.ts +204 -30
- package/src/runtime/reconcile.ts +769 -760
- package/src/runtime/refresh.ts +46 -0
- package/src/runtime/run.ts +12 -2
- package/src/runtime/scheduler.ts +9 -29
- package/src/runtime/to-vnode.ts +85 -23
- package/src/runtime/vdom.ts +91 -69
- package/src/runtime/vnode.ts +192 -88
- package/src/{components/select → select}/README.md +29 -19
- package/src/select/index.tsx +159 -0
- package/src/{components/select/select.tsx → select/primitives.tsx} +10 -98
- package/src/server/stream.ts +25 -31
- package/src/shared/focus-styles.ts +2 -0
- package/src/shared/icons.tsx +62 -0
- package/src/shared/listbox-popover-styles.ts +146 -0
- package/src/shared/style-values.ts +165 -0
- package/src/style/style.ts +25 -6
- package/src/style/stylesheet.ts +32 -57
- package/src/tabs/README.md +141 -0
- package/src/tabs/index.tsx +245 -0
- package/src/tabs/primitives.ts +365 -0
- package/src/test/README.md +151 -60
- package/src/toggle/README.md +56 -0
- package/src/toggle/index.tsx +136 -0
- package/src/toggle/primitives.ts +192 -0
- package/dist/animation/demos/animation.demo.d.ts +0 -5
- package/dist/animation/demos/animation.demo.js +0 -92
- package/dist/animation/demos/animation.demo.js.map +0 -1
- package/dist/animation/demos/spring.demo.d.ts +0 -6
- package/dist/animation/demos/spring.demo.js +0 -304
- package/dist/animation/demos/spring.demo.js.map +0 -1
- package/dist/components/accordion/accordion.d.ts +0 -92
- package/dist/components/accordion/accordion.js +0 -335
- package/dist/components/accordion/accordion.js.map +0 -1
- package/dist/components/accordion/demos/card.demo.d.ts +0 -7
- package/dist/components/accordion/demos/card.demo.js +0 -59
- package/dist/components/accordion/demos/card.demo.js.map +0 -1
- package/dist/components/accordion/demos/multiple.demo.d.ts +0 -7
- package/dist/components/accordion/demos/multiple.demo.js +0 -20
- package/dist/components/accordion/demos/multiple.demo.js.map +0 -1
- package/dist/components/accordion/demos/overview.demo.d.ts +0 -7
- package/dist/components/accordion/demos/overview.demo.js +0 -20
- package/dist/components/accordion/demos/overview.demo.js.map +0 -1
- package/dist/components/anchor/anchor.js.map +0 -1
- package/dist/components/breadcrumbs/basic.demo.d.ts +0 -6
- package/dist/components/breadcrumbs/basic.demo.js +0 -15
- package/dist/components/breadcrumbs/basic.demo.js.map +0 -1
- package/dist/components/breadcrumbs/breadcrumbs.js.map +0 -1
- package/dist/components/breadcrumbs/separator.demo.d.ts +0 -6
- package/dist/components/breadcrumbs/separator.demo.js +0 -15
- package/dist/components/breadcrumbs/separator.demo.js.map +0 -1
- package/dist/components/button/button.d.ts +0 -105
- package/dist/components/button/button.js +0 -207
- package/dist/components/button/button.js.map +0 -1
- package/dist/components/button/demos/aliases.demo.d.ts +0 -7
- package/dist/components/button/demos/aliases.demo.js +0 -19
- package/dist/components/button/demos/aliases.demo.js.map +0 -1
- package/dist/components/button/demos/basic.demo.d.ts +0 -7
- package/dist/components/button/demos/basic.demo.js +0 -20
- package/dist/components/button/demos/basic.demo.js.map +0 -1
- package/dist/components/button/demos/states.demo.d.ts +0 -7
- package/dist/components/button/demos/states.demo.js +0 -30
- package/dist/components/button/demos/states.demo.js.map +0 -1
- package/dist/components/combobox/combobox.js.map +0 -1
- package/dist/components/combobox/overview.demo.d.ts +0 -7
- package/dist/components/combobox/overview.demo.js +0 -154
- package/dist/components/combobox/overview.demo.js.map +0 -1
- package/dist/components/glyph/glyph.d.ts +0 -14
- package/dist/components/glyph/glyph.js +0 -65
- package/dist/components/glyph/glyph.js.map +0 -1
- package/dist/components/listbox/listbox.js.map +0 -1
- package/dist/components/listbox/overview.demo.d.ts +0 -7
- package/dist/components/listbox/overview.demo.js +0 -65
- package/dist/components/listbox/overview.demo.js.map +0 -1
- package/dist/components/menu/demos/bubbling.demo.d.ts +0 -6
- package/dist/components/menu/demos/bubbling.demo.js +0 -16
- package/dist/components/menu/demos/bubbling.demo.js.map +0 -1
- package/dist/components/menu/demos/context-trigger.demo.d.ts +0 -7
- package/dist/components/menu/demos/context-trigger.demo.js +0 -87
- package/dist/components/menu/demos/context-trigger.demo.js.map +0 -1
- package/dist/components/menu/demos/overview.demo.d.ts +0 -7
- package/dist/components/menu/demos/overview.demo.js +0 -33
- package/dist/components/menu/demos/overview.demo.js.map +0 -1
- package/dist/components/menu/hover-aim.js.map +0 -1
- package/dist/components/menu/menu.js.map +0 -1
- package/dist/components/popover/overview.demo.d.ts +0 -7
- package/dist/components/popover/overview.demo.js +0 -65
- package/dist/components/popover/overview.demo.js.map +0 -1
- package/dist/components/popover/popover.js.map +0 -1
- package/dist/components/select/deconstructed.demo.d.ts +0 -7
- package/dist/components/select/deconstructed.demo.js +0 -54
- package/dist/components/select/deconstructed.demo.js.map +0 -1
- package/dist/components/select/overview.demo.d.ts +0 -6
- package/dist/components/select/overview.demo.js +0 -28
- package/dist/components/select/overview.demo.js.map +0 -1
- package/dist/components/select/select.js.map +0 -1
- package/dist/components/separator/separator.d.ts +0 -2
- package/dist/components/separator/separator.js +0 -15
- package/dist/components/separator/separator.js.map +0 -1
- package/dist/components/tabs/tabs.d.ts +0 -78
- package/dist/components/tabs/tabs.js +0 -339
- package/dist/components/tabs/tabs.js.map +0 -1
- package/dist/interactions/keydown/keydown.js.map +0 -1
- package/dist/interactions/outside-click/outside-click-mixin.js.map +0 -1
- package/dist/interactions/typeahead/typeahead-mixin.js.map +0 -1
- package/dist/runtime/demos/basic.demo.d.ts +0 -6
- package/dist/runtime/demos/basic.demo.js +0 -16
- package/dist/runtime/demos/basic.demo.js.map +0 -1
- package/dist/runtime/demos/controlled-uncontrolled-values.demo.d.ts +0 -6
- package/dist/runtime/demos/controlled-uncontrolled-values.demo.js +0 -77
- package/dist/runtime/demos/controlled-uncontrolled-values.demo.js.map +0 -1
- package/dist/runtime/demos/keyed-list.demo.d.ts +0 -6
- package/dist/runtime/demos/keyed-list.demo.js +0 -62
- package/dist/runtime/demos/keyed-list.demo.js.map +0 -1
- package/dist/runtime/demos/readme.demo.d.ts +0 -5
- package/dist/runtime/demos/readme.demo.js +0 -396
- package/dist/runtime/demos/readme.demo.js.map +0 -1
- package/dist/theme/contract.d.ts +0 -61
- package/dist/theme/contract.js +0 -131
- package/dist/theme/contract.js.map +0 -1
- package/dist/theme/glyph-contract.d.ts +0 -11
- package/dist/theme/glyph-contract.js +0 -34
- package/dist/theme/glyph-contract.js.map +0 -1
- package/dist/theme/presets/rmx-01/glyphs.d.ts +0 -2
- package/dist/theme/presets/rmx-01/glyphs.js +0 -252
- package/dist/theme/presets/rmx-01/glyphs.js.map +0 -1
- package/dist/theme/presets/rmx-01/index.d.ts +0 -4
- package/dist/theme/presets/rmx-01/index.js +0 -119
- package/dist/theme/presets/rmx-01/index.js.map +0 -1
- package/dist/theme/runtime.d.ts +0 -2
- package/dist/theme/runtime.js +0 -84
- package/dist/theme/runtime.js.map +0 -1
- package/dist/theme/theme.d.ts +0 -6
- package/dist/theme/theme.js +0 -5
- package/dist/theme/theme.js.map +0 -1
- package/dist/utils/flash-attribute.js.map +0 -1
- package/dist/utils/scroll-lock.d.ts +0 -3
- package/dist/utils/scroll-lock.js.map +0 -1
- package/dist/utils/wait-for-css-transition.js.map +0 -1
- package/dist/utils/wait.js.map +0 -1
- package/src/animation/demos/animation.demo.tsx +0 -194
- package/src/animation/demos/spring.demo.tsx +0 -385
- package/src/components/accordion/accordion.tsx +0 -565
- package/src/components/accordion/demos/card.demo.tsx +0 -114
- package/src/components/accordion/demos/multiple.demo.tsx +0 -57
- package/src/components/accordion/demos/overview.demo.tsx +0 -57
- package/src/components/breadcrumbs/basic.demo.tsx +0 -18
- package/src/components/breadcrumbs/separator.demo.tsx +0 -19
- package/src/components/button/README.md +0 -44
- package/src/components/button/button.tsx +0 -286
- package/src/components/button/demos/aliases.demo.tsx +0 -28
- package/src/components/button/demos/basic.demo.tsx +0 -31
- package/src/components/button/demos/states.demo.tsx +0 -53
- package/src/components/combobox/overview.demo.tsx +0 -200
- package/src/components/glyph/README.md +0 -72
- package/src/components/glyph/glyph.tsx +0 -110
- package/src/components/listbox/overview.demo.tsx +0 -102
- package/src/components/menu/demos/bubbling.demo.tsx +0 -35
- package/src/components/menu/demos/context-trigger.demo.tsx +0 -133
- package/src/components/menu/demos/overview.demo.tsx +0 -77
- package/src/components/popover/overview.demo.tsx +0 -144
- package/src/components/select/deconstructed.demo.tsx +0 -96
- package/src/components/select/overview.demo.tsx +0 -52
- package/src/components/separator/separator.ts +0 -19
- package/src/components/tabs/README.md +0 -105
- package/src/components/tabs/tabs.tsx +0 -504
- package/src/runtime/demos/basic.demo.tsx +0 -21
- package/src/runtime/demos/controlled-uncontrolled-values.demo.tsx +0 -177
- package/src/runtime/demos/keyed-list.demo.tsx +0 -94
- package/src/theme/README.md +0 -103
- package/src/theme/contract.ts +0 -215
- package/src/theme/glyph-contract.ts +0 -59
- package/src/theme/presets/rmx-01/glyphs.tsx +0 -308
- package/src/theme/presets/rmx-01/index.ts +0 -123
- package/src/theme/runtime.ts +0 -119
- package/src/theme/theme.ts +0 -15
- package/src/utils/scroll-lock/README.md +0 -33
- /package/dist/{components/anchor/anchor.d.ts → anchor/index.d.ts} +0 -0
- /package/dist/{components/breadcrumbs/breadcrumbs.d.ts → breadcrumbs/index.d.ts} +0 -0
- /package/dist/{utils → listbox}/flash-attribute.d.ts +0 -0
- /package/dist/{utils → listbox}/flash-attribute.js +0 -0
- /package/dist/{components/menu → menu}/hover-aim.d.ts +0 -0
- /package/dist/{components/menu → menu}/hover-aim.js +0 -0
- /package/dist/{interactions/outside-click/outside-click-mixin.d.ts → popover/outside-click.d.ts} +0 -0
- /package/dist/{interactions/keydown → select}/keydown.d.ts +0 -0
- /package/dist/{interactions/keydown → select}/keydown.js +0 -0
- /package/dist/{interactions/typeahead/typeahead-mixin.d.ts → shared/typeahead.d.ts} +0 -0
- /package/dist/{utils → shared}/wait-for-css-transition.d.ts +0 -0
- /package/dist/{utils → shared}/wait-for-css-transition.js +0 -0
- /package/dist/{utils → shared}/wait.d.ts +0 -0
- /package/dist/{utils → shared}/wait.js +0 -0
- /package/src/{components/anchor/anchor.ts → anchor/index.ts} +0 -0
- /package/src/{utils → listbox}/flash-attribute.ts +0 -0
- /package/src/{components/menu → menu}/hover-aim.ts +0 -0
- /package/src/{interactions/outside-click/outside-click-mixin.ts → popover/outside-click.ts} +0 -0
- /package/src/{interactions/keydown → select}/keydown.ts +0 -0
- /package/src/{interactions/typeahead/typeahead-mixin.ts → shared/typeahead.ts} +0 -0
- /package/src/{utils → shared}/wait-for-css-transition.ts +0 -0
- /package/src/{utils → shared}/wait.ts +0 -0
package/src/runtime/vnode.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import type { ComponentHandle,
|
|
2
|
-
import { Fragment, Frame } from './component.ts'
|
|
1
|
+
import type { ComponentHandle, Fragment, Frame, FrameHandle, FrameProps } from './component.ts'
|
|
3
2
|
import { isRemixElement } from './core/vnode.ts'
|
|
4
|
-
import type {
|
|
3
|
+
import type { Frame as FrameInstance } from './frame.ts'
|
|
4
|
+
import type { RemixNode } from './jsx.ts'
|
|
5
|
+
import type { ElementFunction } from './element-function.ts'
|
|
6
|
+
import type { Key } from './key.ts'
|
|
7
|
+
import type { MixinRuntimeState, MixinRuntimeValue } from './mixins/mixin.ts'
|
|
8
|
+
import type { OnMixinDescriptor } from './mixins/on-mixin.ts'
|
|
9
|
+
import type { Scheduler } from './scheduler.ts'
|
|
10
|
+
import type { StyleManager } from '../style/index.ts'
|
|
5
11
|
|
|
6
12
|
export { isRemixElement }
|
|
7
13
|
|
|
@@ -9,136 +15,234 @@ export const TEXT_NODE = Symbol('TEXT_NODE')
|
|
|
9
15
|
export const NON_RENDER_NODE = Symbol('NON_RENDER_NODE')
|
|
10
16
|
export const ROOT_VNODE = Symbol('ROOT_VNODE')
|
|
11
17
|
|
|
12
|
-
export type
|
|
13
|
-
| typeof ROOT_VNODE
|
|
14
|
-
| string // host element
|
|
15
|
-
| Function // component
|
|
16
|
-
| typeof TEXT_NODE
|
|
17
|
-
| typeof NON_RENDER_NODE
|
|
18
|
-
| typeof Fragment
|
|
19
|
-
| typeof Frame
|
|
20
|
-
|
|
21
|
-
export type VNode<T extends VNodeType = VNodeType> = {
|
|
22
|
-
type: T
|
|
23
|
-
props?: ElementProps
|
|
24
|
-
_mixedProps?: ElementProps
|
|
25
|
-
key?: string
|
|
26
|
-
|
|
27
|
-
// _prefixes assigned during reconciliation
|
|
28
|
-
_parent?: VNode
|
|
29
|
-
_children?: VNode[]
|
|
30
|
-
_dom?: unknown
|
|
31
|
-
_controller?: AbortController
|
|
32
|
-
_mixState?: unknown
|
|
33
|
-
_directEventDescriptors?: unknown
|
|
34
|
-
_directEventState?: unknown
|
|
35
|
-
_controlledState?: unknown
|
|
36
|
-
_svg?: boolean
|
|
37
|
-
// Range roots render between comment boundary markers
|
|
38
|
-
_rangeStart?: Node
|
|
39
|
-
_rangeEnd?: Node
|
|
40
|
-
_pendingHydrationComponentId?: string
|
|
41
|
-
_frameInstance?: unknown
|
|
42
|
-
_frameFallbackRoot?: { render: (element: RemixNode) => void; dispose: () => void }
|
|
43
|
-
_frameResolveToken?: number
|
|
44
|
-
_frameResolveController?: AbortController
|
|
45
|
-
_frameResolved?: boolean
|
|
18
|
+
export type VNodeKind = 'root' | 'empty' | 'text' | 'fragment' | 'host' | 'component' | 'frame'
|
|
46
19
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
// Component
|
|
51
|
-
_handle?: ComponentHandle
|
|
52
|
-
_id?: string
|
|
53
|
-
_content?: VNode
|
|
20
|
+
export type RuntimeElementProps = {
|
|
21
|
+
[name: string]: unknown
|
|
22
|
+
}
|
|
54
23
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
24
|
+
export type RuntimeHostProps = RuntimeElementProps & {
|
|
25
|
+
children?: RemixNode
|
|
26
|
+
innerHTML?: string
|
|
27
|
+
mix?: MixinRuntimeValue
|
|
59
28
|
}
|
|
60
29
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
30
|
+
type InputNodeBase<kind extends VNodeKind, type> = {
|
|
31
|
+
kind: kind
|
|
32
|
+
type: type
|
|
33
|
+
key?: Key
|
|
34
|
+
_parent?: never
|
|
64
35
|
}
|
|
65
36
|
|
|
66
|
-
export type
|
|
67
|
-
|
|
37
|
+
export type NonRenderNode = InputNodeBase<'empty', typeof NON_RENDER_NODE>
|
|
38
|
+
|
|
39
|
+
export type TextNode = InputNodeBase<'text', typeof TEXT_NODE> & {
|
|
68
40
|
_text: string
|
|
69
41
|
}
|
|
70
42
|
|
|
71
|
-
export type
|
|
72
|
-
|
|
43
|
+
export type FragmentNode = InputNodeBase<'fragment', typeof Fragment> & {
|
|
44
|
+
_children: VNodeInput[]
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type HostNode = InputNodeBase<'host', string> & {
|
|
48
|
+
props: RuntimeHostProps
|
|
49
|
+
_children: VNodeInput[]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export type ComponentNode = InputNodeBase<'component', ElementFunction> & {
|
|
53
|
+
props: RuntimeElementProps
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export type FrameNode = InputNodeBase<'frame', typeof Frame> & {
|
|
57
|
+
props: RuntimeElementProps & FrameProps
|
|
73
58
|
}
|
|
74
59
|
|
|
75
|
-
export type
|
|
60
|
+
export type VNodeInput =
|
|
61
|
+
| NonRenderNode
|
|
62
|
+
| TextNode
|
|
63
|
+
| FragmentNode
|
|
64
|
+
| HostNode
|
|
65
|
+
| ComponentNode
|
|
66
|
+
| FrameNode
|
|
67
|
+
|
|
68
|
+
type MountedNodeBase = {
|
|
69
|
+
_parent: VNodeParent
|
|
70
|
+
_svg: boolean
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
type CommittedNodeBase<kind extends VNodeKind, type> = {
|
|
74
|
+
kind: kind
|
|
75
|
+
type: type
|
|
76
|
+
key?: Key
|
|
77
|
+
} & MountedNodeBase
|
|
78
|
+
|
|
79
|
+
export type CommittedNonRenderNode = CommittedNodeBase<'empty', typeof NON_RENDER_NODE>
|
|
80
|
+
|
|
81
|
+
export type CommittedTextNode = CommittedNodeBase<'text', typeof TEXT_NODE> & {
|
|
82
|
+
_text: string
|
|
76
83
|
_dom: Text
|
|
77
84
|
}
|
|
78
85
|
|
|
79
|
-
export type
|
|
86
|
+
export type ControlledReflectionState = {
|
|
87
|
+
disposed: boolean
|
|
88
|
+
listenersAttached: boolean
|
|
89
|
+
pendingRestoreVersion: number
|
|
90
|
+
managesValue: boolean
|
|
91
|
+
managesChecked: boolean
|
|
92
|
+
hasControlledValue: boolean
|
|
93
|
+
controlledValue: unknown
|
|
94
|
+
hasControlledChecked: boolean
|
|
95
|
+
controlledChecked: unknown
|
|
96
|
+
onInput(): void
|
|
97
|
+
onChange(): void
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export type DirectEventBinding = {
|
|
80
101
|
type: string
|
|
81
|
-
|
|
82
|
-
|
|
102
|
+
handler: (event: Event, signal: AbortSignal) => void | Promise<void>
|
|
103
|
+
capture: boolean
|
|
104
|
+
stableHandler: ((event: Event) => void) | null
|
|
105
|
+
reentry: AbortController | null
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export type DirectEventState = {
|
|
109
|
+
bindings: DirectEventBinding[]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export type HostPersistenceState = {
|
|
113
|
+
parent: ParentNode
|
|
114
|
+
token: number
|
|
83
115
|
}
|
|
84
116
|
|
|
85
|
-
export type CommittedHostNode =
|
|
117
|
+
export type CommittedHostNode = CommittedNodeBase<'host', string> & {
|
|
118
|
+
props: RuntimeHostProps
|
|
119
|
+
_children: CommittedVNode[]
|
|
86
120
|
_dom: Element
|
|
87
|
-
|
|
121
|
+
_mixedProps: RuntimeHostProps
|
|
122
|
+
_mixState?: MixinRuntimeState
|
|
123
|
+
_directEventDescriptors?: OnMixinDescriptor[]
|
|
124
|
+
_directEventState?: DirectEventState
|
|
125
|
+
_controlledState?: ControlledReflectionState
|
|
126
|
+
_persistence?: HostPersistenceState
|
|
88
127
|
}
|
|
89
128
|
|
|
90
|
-
export type
|
|
91
|
-
|
|
92
|
-
props: ElementProps
|
|
93
|
-
_handle: ComponentHandle
|
|
129
|
+
export type CommittedFragmentNode = CommittedNodeBase<'fragment', typeof Fragment> & {
|
|
130
|
+
_children: CommittedVNode[]
|
|
94
131
|
}
|
|
95
132
|
|
|
96
|
-
export type
|
|
97
|
-
|
|
98
|
-
props: ElementProps
|
|
99
|
-
_content: VNode
|
|
133
|
+
export type MountingComponentNode = CommittedNodeBase<'component', ElementFunction> & {
|
|
134
|
+
props: RuntimeElementProps
|
|
100
135
|
_handle: ComponentHandle
|
|
136
|
+
_context: ReconcileContext
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export type CommittedComponentNode = MountingComponentNode & {
|
|
140
|
+
_content: CommittedVNode
|
|
101
141
|
}
|
|
102
142
|
|
|
103
|
-
export
|
|
104
|
-
|
|
143
|
+
export interface FrameFallbackRoot {
|
|
144
|
+
render(element: RemixNode): void
|
|
145
|
+
dispose(): void
|
|
105
146
|
}
|
|
106
147
|
|
|
107
|
-
export
|
|
108
|
-
|
|
148
|
+
export type FrameMountState = {
|
|
149
|
+
instance: FrameInstance
|
|
150
|
+
fallbackRoot?: FrameFallbackRoot
|
|
151
|
+
resolveToken: number
|
|
152
|
+
resolveController?: AbortController
|
|
153
|
+
resolved: boolean
|
|
109
154
|
}
|
|
110
155
|
|
|
111
|
-
export
|
|
112
|
-
|
|
156
|
+
export type CommittedFrameNode = CommittedNodeBase<'frame', typeof Frame> & {
|
|
157
|
+
props: RuntimeElementProps & FrameProps
|
|
158
|
+
_rangeStart: Comment
|
|
159
|
+
_rangeEnd: Comment
|
|
160
|
+
_state: FrameMountState
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export type CommittedVNode =
|
|
164
|
+
| CommittedNonRenderNode
|
|
165
|
+
| CommittedTextNode
|
|
166
|
+
| CommittedFragmentNode
|
|
167
|
+
| CommittedHostNode
|
|
168
|
+
| CommittedComponentNode
|
|
169
|
+
| CommittedFrameNode
|
|
170
|
+
|
|
171
|
+
export type RootVNode = {
|
|
172
|
+
kind: 'root'
|
|
173
|
+
type: typeof ROOT_VNODE
|
|
174
|
+
_children: CommittedVNode[]
|
|
175
|
+
_svg: boolean
|
|
176
|
+
_rangeStart?: Node
|
|
177
|
+
_rangeEnd?: Node
|
|
178
|
+
_pendingHydrationComponentId?: string
|
|
113
179
|
}
|
|
114
180
|
|
|
115
|
-
export
|
|
116
|
-
|
|
181
|
+
export interface ReconcileContext {
|
|
182
|
+
frame: FrameHandle
|
|
183
|
+
scheduler: Scheduler
|
|
184
|
+
styles: StyleManager
|
|
185
|
+
rootTarget: EventTarget
|
|
117
186
|
}
|
|
118
187
|
|
|
119
|
-
export
|
|
120
|
-
|
|
188
|
+
export type VNodeParent =
|
|
189
|
+
| RootVNode
|
|
190
|
+
| CommittedFragmentNode
|
|
191
|
+
| CommittedHostNode
|
|
192
|
+
| MountingComponentNode
|
|
193
|
+
| CommittedComponentNode
|
|
194
|
+
|
|
195
|
+
export type VNode = VNodeInput | CommittedVNode | RootVNode | MountingComponentNode
|
|
196
|
+
|
|
197
|
+
export function isFragmentNode(node: VNode): node is FragmentNode | CommittedFragmentNode {
|
|
198
|
+
return node.kind === 'fragment'
|
|
121
199
|
}
|
|
122
200
|
|
|
123
|
-
export function
|
|
124
|
-
return
|
|
201
|
+
export function isTextNode(node: VNode): node is TextNode | CommittedTextNode {
|
|
202
|
+
return node.kind === 'text'
|
|
125
203
|
}
|
|
126
204
|
|
|
127
|
-
export function
|
|
128
|
-
return
|
|
205
|
+
export function isNonRenderNode(node: VNode): node is NonRenderNode | CommittedNonRenderNode {
|
|
206
|
+
return node.kind === 'empty'
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export function isCommittedTextNode(node: CommittedVNode): node is CommittedTextNode {
|
|
210
|
+
return node.kind === 'text'
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export function isHostNode(node: VNode): node is HostNode | CommittedHostNode {
|
|
214
|
+
return node.kind === 'host'
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export function isCommittedHostNode(node: CommittedVNode): node is CommittedHostNode {
|
|
218
|
+
return node.kind === 'host'
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function isComponentNode(
|
|
222
|
+
node: VNode,
|
|
223
|
+
): node is ComponentNode | MountingComponentNode | CommittedComponentNode {
|
|
224
|
+
return node.kind === 'component'
|
|
129
225
|
}
|
|
130
226
|
|
|
131
227
|
export function isCommittedComponentNode(node: VNode): node is CommittedComponentNode {
|
|
132
|
-
return
|
|
228
|
+
return node.kind === 'component' && '_content' in node
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export function isFrameNode(node: VNode): node is FrameNode | CommittedFrameNode {
|
|
232
|
+
return node.kind === 'frame'
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export function isCommittedFrameNode(node: CommittedVNode): node is CommittedFrameNode {
|
|
236
|
+
return node.kind === 'frame'
|
|
133
237
|
}
|
|
134
238
|
|
|
135
|
-
export function findContextFromAncestry(node:
|
|
136
|
-
let current:
|
|
239
|
+
export function findContextFromAncestry(node: VNodeParent, type: ElementFunction): unknown {
|
|
240
|
+
let current: VNodeParent | undefined = node
|
|
137
241
|
while (current) {
|
|
138
|
-
if (current.
|
|
242
|
+
if (current.kind === 'component' && current.type === type) {
|
|
139
243
|
return current._handle.getContextValue()
|
|
140
244
|
}
|
|
141
|
-
current = current._parent
|
|
245
|
+
current = '_parent' in current ? current._parent : undefined
|
|
142
246
|
}
|
|
143
247
|
return undefined
|
|
144
248
|
}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
`Select` is a button-triggered popup value picker backed by `listbox` and `popover`. Use it when the user should choose one stable string value from a finite set.
|
|
4
4
|
|
|
5
|
-
## Usage
|
|
5
|
+
## Component Usage
|
|
6
6
|
|
|
7
7
|
```tsx
|
|
8
|
-
import { Option, Select
|
|
8
|
+
import { Option, Select } from 'remix/ui/select'
|
|
9
|
+
import { onSelectChange } from 'remix/ui/select/primitives'
|
|
9
10
|
|
|
10
11
|
export function FrameworkSelect() {
|
|
11
12
|
return (
|
|
@@ -44,34 +45,34 @@ Use `textValue` when closed-trigger typeahead should match a different string fr
|
|
|
44
45
|
</Select>
|
|
45
46
|
```
|
|
46
47
|
|
|
48
|
+
## Primitive Usage
|
|
49
|
+
|
|
47
50
|
Use the lower-level primitives when the trigger or popup structure needs to be owned by another component. Keep the same provider, trigger, popover, list, option, and hidden-input relationship.
|
|
48
51
|
|
|
49
52
|
```tsx
|
|
50
53
|
import type { Handle } from 'remix/ui'
|
|
51
|
-
import * as button from 'remix/ui/button'
|
|
52
|
-
import * as listbox from 'remix/ui/listbox'
|
|
53
54
|
import * as popover from 'remix/ui/popover'
|
|
54
|
-
import
|
|
55
|
+
import { triggerStyle } from 'remix/ui/select'
|
|
56
|
+
import * as select from 'remix/ui/select/primitives'
|
|
57
|
+
import { listStyle, optionStyle, surfaceStyle } from './select.styles'
|
|
55
58
|
|
|
56
59
|
function SelectValue(handle: Handle) {
|
|
57
60
|
let context = handle.context.get(select.Context)
|
|
58
61
|
|
|
59
|
-
return () => <span
|
|
62
|
+
return () => <span>{context.displayedLabel}</span>
|
|
60
63
|
}
|
|
61
64
|
|
|
62
65
|
function IssueTypeSelect() {
|
|
63
66
|
return () => (
|
|
64
|
-
<select.Context defaultLabel="Select a type" name="issueType">
|
|
65
|
-
<button type="button" mix={[
|
|
67
|
+
<select.Context defaultLabel="Select a type" labelSwapDelayMs={100} name="issueType">
|
|
68
|
+
<button type="button" mix={[triggerStyle, select.trigger()]}>
|
|
66
69
|
<SelectValue />
|
|
67
70
|
</button>
|
|
68
71
|
<popover.Context>
|
|
69
|
-
<div mix={[
|
|
70
|
-
<div mix={[
|
|
71
|
-
<div mix={[
|
|
72
|
-
|
|
73
|
-
</div>
|
|
74
|
-
<div mix={[listbox.optionStyle, select.option({ label: 'Feature', value: 'feature' })]}>
|
|
72
|
+
<div mix={[surfaceStyle, select.popover()]}>
|
|
73
|
+
<div mix={[listStyle, select.list()]}>
|
|
74
|
+
<div mix={[optionStyle, select.option({ label: 'Bug', value: 'bug' })]}>Bug</div>
|
|
75
|
+
<div mix={[optionStyle, select.option({ label: 'Feature', value: 'feature' })]}>
|
|
75
76
|
Feature
|
|
76
77
|
</div>
|
|
77
78
|
</div>
|
|
@@ -83,15 +84,24 @@ function IssueTypeSelect() {
|
|
|
83
84
|
}
|
|
84
85
|
```
|
|
85
86
|
|
|
86
|
-
## `select
|
|
87
|
+
## `remix/ui/select`
|
|
87
88
|
|
|
88
89
|
- `Select`: composed trigger, popover, listbox, option list, and optional hidden input for form participation. Accepts `defaultLabel`, `defaultValue`, `disabled`, `name`, and button props.
|
|
89
|
-
- `Option`: option
|
|
90
|
+
- `Option`: option component that renders the standard check indicator and label slot. Accepts `label`, `value`, optional `disabled`, and optional `textValue`.
|
|
91
|
+
- `triggerStyle`: standard select trigger style for custom trigger composition.
|
|
92
|
+
- `SelectProps` and `SelectOptionProps`: public TypeScript props for the composed APIs.
|
|
93
|
+
|
|
94
|
+
## `remix/ui/select/primitives`
|
|
95
|
+
|
|
96
|
+
- `Context`: lower-level provider for custom composition. Accepts `defaultLabel`, `defaultValue`, `disabled`, `name`, and primitive-only `labelSwapDelayMs`; the label-swap delay defaults to `75` milliseconds.
|
|
97
|
+
- `trigger()`: wires the trigger button, open behavior, closed-trigger typeahead, and trigger ARIA attributes.
|
|
98
|
+
- `popover()`: wires the popover surface and keeps its min-width synced to the trigger before open.
|
|
99
|
+
- `list()`: wires the listbox root used inside the popover.
|
|
100
|
+
- `option(...)`: registers one selectable option. Accepts `label`, `value`, optional `disabled`, and optional `textValue`.
|
|
101
|
+
- `hiddenInput()`: mirrors the selected value into a hidden input for form participation.
|
|
90
102
|
- `onSelectChange(...)`: event mixin for the bubbling `SelectChangeEvent`.
|
|
91
|
-
- `Context`, `trigger()`, `popover()`, `list()`, `option(...)`, and `hiddenInput()`: lower-level composition primitives.
|
|
92
|
-
- `triggerStyle`: standard select trigger style.
|
|
93
103
|
- `SelectChangeEvent`: event with `value`, `label`, and `optionId`.
|
|
94
|
-
- `
|
|
104
|
+
- `SelectContextProps`, `SelectProps`, and `SelectOptionProps`: primitive prop types for custom composition.
|
|
95
105
|
|
|
96
106
|
## Behavior Notes
|
|
97
107
|
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { createElement, css } from '@remix-run/ui'
|
|
2
|
+
import type { CSSMixinDescriptor, Handle, Props, RemixNode } from '@remix-run/ui'
|
|
3
|
+
|
|
4
|
+
import * as popover from '@remix-run/ui/popover'
|
|
5
|
+
import * as select from '@remix-run/ui/select/primitives'
|
|
6
|
+
import type { SearchValue } from '../shared/typeahead.ts'
|
|
7
|
+
import { CheckIcon, ChevronVerticalIcon } from '../shared/icons.tsx'
|
|
8
|
+
import {
|
|
9
|
+
listboxIndicatorStyle,
|
|
10
|
+
listboxLabelStyle,
|
|
11
|
+
listboxListStyle,
|
|
12
|
+
listboxOptionStyle,
|
|
13
|
+
popoverSurfaceStyle,
|
|
14
|
+
} from '../shared/listbox-popover-styles.ts'
|
|
15
|
+
|
|
16
|
+
export interface SelectProps extends Omit<Props<'button'>, 'children' | 'name'> {
|
|
17
|
+
children?: RemixNode
|
|
18
|
+
defaultLabel: string
|
|
19
|
+
defaultValue?: string | null
|
|
20
|
+
disabled?: boolean
|
|
21
|
+
name?: string
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type SelectOptionProps = Props<'div'> & {
|
|
25
|
+
children?: RemixNode
|
|
26
|
+
disabled?: boolean
|
|
27
|
+
label: string
|
|
28
|
+
textValue?: SearchValue
|
|
29
|
+
value: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const selectTriggerShadow =
|
|
33
|
+
'0 2px 3px -1px rgba(0, 0, 0, 0.04), 0 3px 4px -1.5px rgba(0, 0, 0, 0.04), 0 4px 5px -2px rgba(0, 0, 0, 0.04), 0 0 0 1px light-dark(rgba(0, 0, 0, 0.12), rgba(255, 255, 255, 0.2))'
|
|
34
|
+
|
|
35
|
+
const selectTriggerFocusShadow =
|
|
36
|
+
'0 2px 3px -1px rgba(0, 0, 0, 0.04), 0 3px 4px -1.5px rgba(0, 0, 0, 0.04), 0 4px 5px -2px rgba(0, 0, 0, 0.04), 0 0 0 1px light-dark(#3573F6, #6eaaff), 0 0 0 4px light-dark(rgba(53, 115, 246, 0.1), rgba(110, 170, 255, 0.18)), 0 6px 32px 4px light-dark(rgba(53, 115, 246, 0.08), rgba(110, 170, 255, 0.14)), inset 0 0 8px 1px light-dark(rgba(53, 115, 246, 0.05), rgba(110, 170, 255, 0.1))'
|
|
37
|
+
|
|
38
|
+
const selectTriggerCss: CSSMixinDescriptor = css({
|
|
39
|
+
appearance: 'none',
|
|
40
|
+
margin: 0,
|
|
41
|
+
boxSizing: 'border-box',
|
|
42
|
+
width: '100%',
|
|
43
|
+
minWidth: 0,
|
|
44
|
+
height: '32px',
|
|
45
|
+
paddingBlock: '6px',
|
|
46
|
+
paddingInlineStart: '12px',
|
|
47
|
+
paddingInlineEnd: '8px',
|
|
48
|
+
display: 'flex',
|
|
49
|
+
alignItems: 'center',
|
|
50
|
+
justifyContent: 'flex-start',
|
|
51
|
+
gap: '6px',
|
|
52
|
+
border: 0,
|
|
53
|
+
borderRadius: '8px',
|
|
54
|
+
background: 'light-dark(#FFFFFF, #1a1a1a)',
|
|
55
|
+
boxShadow: selectTriggerShadow,
|
|
56
|
+
color: 'light-dark(#101010, #ececec)',
|
|
57
|
+
fontFamily: '"Inter Variable", Inter, ui-sans-serif, system-ui, sans-serif',
|
|
58
|
+
fontStyle: 'normal',
|
|
59
|
+
fontWeight: 400,
|
|
60
|
+
fontSize: '13px',
|
|
61
|
+
lineHeight: '20px',
|
|
62
|
+
fontFeatureSettings: '"ss01" on, "cv01" on',
|
|
63
|
+
letterSpacing: 0,
|
|
64
|
+
textAlign: 'left',
|
|
65
|
+
textShadow: '0 1px 0 light-dark(#FFFFFF, rgb(0 0 0 / 0.35))',
|
|
66
|
+
whiteSpace: 'nowrap',
|
|
67
|
+
'&:hover, &:focus-visible, &[aria-expanded="true"], &[aria-expanded="true"]:hover, &[aria-expanded="true"]:focus-visible':
|
|
68
|
+
{
|
|
69
|
+
background: 'light-dark(#FFFFFF, #1a1a1a)',
|
|
70
|
+
color: 'light-dark(#101010, #ececec)',
|
|
71
|
+
},
|
|
72
|
+
'&:active': {
|
|
73
|
+
background: 'light-dark(#FFFFFF, #1a1a1a)',
|
|
74
|
+
},
|
|
75
|
+
'&:focus-visible': {
|
|
76
|
+
outline: 0,
|
|
77
|
+
boxShadow: selectTriggerFocusShadow,
|
|
78
|
+
},
|
|
79
|
+
'&[aria-expanded="true"]': {
|
|
80
|
+
boxShadow: selectTriggerFocusShadow,
|
|
81
|
+
},
|
|
82
|
+
'&:disabled': {
|
|
83
|
+
opacity: 0.55,
|
|
84
|
+
},
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
const triggerLabelCss: CSSMixinDescriptor = css({
|
|
88
|
+
display: 'inline-flex',
|
|
89
|
+
alignItems: 'center',
|
|
90
|
+
flex: '1 1 auto',
|
|
91
|
+
minWidth: 0,
|
|
92
|
+
overflow: 'hidden',
|
|
93
|
+
textOverflow: 'ellipsis',
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
const triggerIconCss: CSSMixinDescriptor = css({
|
|
97
|
+
display: 'inline-flex',
|
|
98
|
+
alignItems: 'center',
|
|
99
|
+
justifyContent: 'center',
|
|
100
|
+
width: '16px',
|
|
101
|
+
height: '16px',
|
|
102
|
+
color: 'light-dark(#707070, #b3b3b3)',
|
|
103
|
+
flex: 'none',
|
|
104
|
+
'& > svg': {
|
|
105
|
+
display: 'block',
|
|
106
|
+
width: '100%',
|
|
107
|
+
height: '100%',
|
|
108
|
+
},
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
export const triggerStyle = selectTriggerCss
|
|
112
|
+
|
|
113
|
+
function SelectLabel(handle: Handle): () => RemixNode {
|
|
114
|
+
let context = handle.context.get(select.Context)
|
|
115
|
+
|
|
116
|
+
return () => <span mix={triggerLabelCss}>{context.displayedLabel}</span>
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function Select(handle: Handle<SelectProps>): () => RemixNode {
|
|
120
|
+
return () => {
|
|
121
|
+
let { children, defaultLabel, defaultValue, disabled, name, mix, ...buttonProps } = handle.props
|
|
122
|
+
|
|
123
|
+
return (
|
|
124
|
+
<select.Context
|
|
125
|
+
defaultLabel={defaultLabel}
|
|
126
|
+
defaultValue={defaultValue}
|
|
127
|
+
disabled={disabled}
|
|
128
|
+
name={name}
|
|
129
|
+
>
|
|
130
|
+
<button type="button" {...buttonProps} mix={[triggerStyle, select.trigger(), mix]}>
|
|
131
|
+
<SelectLabel />
|
|
132
|
+
<ChevronVerticalIcon mix={triggerIconCss} />
|
|
133
|
+
</button>
|
|
134
|
+
<popover.Context>
|
|
135
|
+
<div mix={[popoverSurfaceStyle, select.popover()]}>
|
|
136
|
+
<div mix={[listboxListStyle, select.list()]}>{children}</div>
|
|
137
|
+
</div>
|
|
138
|
+
</popover.Context>
|
|
139
|
+
{name && <input mix={select.hiddenInput()} />}
|
|
140
|
+
</select.Context>
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function Option(handle: Handle<SelectOptionProps>): () => RemixNode {
|
|
146
|
+
return () => {
|
|
147
|
+
let { label, value, disabled, textValue, children, mix, ...divProps } = handle.props
|
|
148
|
+
|
|
149
|
+
return (
|
|
150
|
+
<div
|
|
151
|
+
{...divProps}
|
|
152
|
+
mix={[listboxOptionStyle, select.option({ value, label, disabled, textValue }), mix]}
|
|
153
|
+
>
|
|
154
|
+
<CheckIcon mix={listboxIndicatorStyle} />
|
|
155
|
+
<span mix={listboxLabelStyle}>{children ?? label}</span>
|
|
156
|
+
</div>
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
}
|