@remix-run/ui 0.3.0 → 0.4.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 +50 -164
- 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/demos/reordering.js +9 -6
- package/dist/animation/demos/reordering.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 +125 -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} +3 -7
- package/dist/{components/combobox/combobox.js → combobox/primitives.js} +8 -61
- package/dist/combobox/primitives.js.map +1 -0
- 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/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} +3 -32
- package/dist/{components/menu/menu.js → menu/primitives.js} +97 -314
- 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/reconcile.js +11 -5
- package/dist/runtime/reconcile.js.map +1 -1
- package/dist/runtime/vdom.js +3 -0
- package/dist/runtime/vdom.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} +4 -6
- package/dist/{components/select/select.js → select/primitives.js} +11 -63
- package/dist/select/primitives.js.map +1 -0
- package/dist/server/stream.js +2 -2
- 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/{theme/presets/rmx-01/index.js → shared/style-values.js} +3 -34
- 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/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/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 +73 -44
- 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/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 +162 -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/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 +100 -0
- package/src/runtime/demos/readme.demo.tsx +16 -14
- package/src/runtime/reconcile.ts +11 -5
- package/src/runtime/vdom.ts +3 -0
- 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 +3 -3
- 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/tabs/README.md +141 -0
- package/src/tabs/index.tsx +244 -0
- package/src/tabs/primitives.ts +365 -0
- package/src/toggle/README.md +56 -0
- package/src/toggle/index.tsx +134 -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.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
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { type Handle } from '@remix-run/ui'
|
|
2
|
-
import { Menu, MenuItem, onMenuSelect, Submenu } from '@remix-run/ui/menu'
|
|
3
|
-
import { separatorStyle } from '@remix-run/ui/separator'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @name Menu Overview
|
|
7
|
-
* @description A hierarchical menu with checkboxes, radio groups, submenus, and separators.
|
|
8
|
-
* @layout center
|
|
9
|
-
*/
|
|
10
|
-
export default function Example(handle: Handle) {
|
|
11
|
-
type Density = 'comfortable' | 'compact'
|
|
12
|
-
let wordWrap = true
|
|
13
|
-
let minimap = false
|
|
14
|
-
let showGutter = true
|
|
15
|
-
let density: Density = 'comfortable'
|
|
16
|
-
|
|
17
|
-
return () => (
|
|
18
|
-
<Menu
|
|
19
|
-
label="View"
|
|
20
|
-
menuLabel="View options"
|
|
21
|
-
mix={onMenuSelect((event) => {
|
|
22
|
-
switch (event.item.name) {
|
|
23
|
-
case 'wordWrap':
|
|
24
|
-
wordWrap = !wordWrap
|
|
25
|
-
break
|
|
26
|
-
case 'minimap':
|
|
27
|
-
minimap = !minimap
|
|
28
|
-
break
|
|
29
|
-
case 'showGutter':
|
|
30
|
-
showGutter = !showGutter
|
|
31
|
-
break
|
|
32
|
-
case 'density':
|
|
33
|
-
density = event.item.value as Density
|
|
34
|
-
break
|
|
35
|
-
}
|
|
36
|
-
handle.update()
|
|
37
|
-
})}
|
|
38
|
-
>
|
|
39
|
-
<MenuItem name="wordWrap" type="checkbox" checked={wordWrap}>
|
|
40
|
-
Word wrap
|
|
41
|
-
</MenuItem>
|
|
42
|
-
<MenuItem name="minimap" type="checkbox" checked={minimap}>
|
|
43
|
-
Minimap
|
|
44
|
-
</MenuItem>
|
|
45
|
-
<MenuItem name="showGutter" type="checkbox" checked={showGutter}>
|
|
46
|
-
Show gutter
|
|
47
|
-
</MenuItem>
|
|
48
|
-
|
|
49
|
-
<hr mix={separatorStyle} />
|
|
50
|
-
<Submenu label="Zoom">
|
|
51
|
-
<MenuItem name="zoomIn" value="zoom-in">
|
|
52
|
-
Zoom In
|
|
53
|
-
</MenuItem>
|
|
54
|
-
<MenuItem name="zoomOut" value="zoom-out">
|
|
55
|
-
Zoom Out
|
|
56
|
-
</MenuItem>
|
|
57
|
-
<MenuItem name="resetZoom" value="reset-zoom">
|
|
58
|
-
Reset Zoom
|
|
59
|
-
</MenuItem>
|
|
60
|
-
</Submenu>
|
|
61
|
-
|
|
62
|
-
<Submenu label="Density">
|
|
63
|
-
<MenuItem
|
|
64
|
-
name="density"
|
|
65
|
-
type="radio"
|
|
66
|
-
value="comfortable"
|
|
67
|
-
checked={density === 'comfortable'}
|
|
68
|
-
>
|
|
69
|
-
Comfortable
|
|
70
|
-
</MenuItem>
|
|
71
|
-
<MenuItem name="density" type="radio" value="compact" checked={density === 'compact'}>
|
|
72
|
-
Compact
|
|
73
|
-
</MenuItem>
|
|
74
|
-
</Submenu>
|
|
75
|
-
</Menu>
|
|
76
|
-
)
|
|
77
|
-
}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { css, on, type Handle } from '@remix-run/ui'
|
|
2
|
-
import { Button } from '@remix-run/ui/button'
|
|
3
|
-
import { Glyph } from '@remix-run/ui/glyph'
|
|
4
|
-
import * as popover from '@remix-run/ui/popover'
|
|
5
|
-
import { Option, Select } from '@remix-run/ui/select'
|
|
6
|
-
import { theme } from '@remix-run/ui/theme'
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @name Popover Overview
|
|
10
|
-
* @description A popover panel anchored to a trigger button, containing form controls and a close action.
|
|
11
|
-
* @layout center
|
|
12
|
-
*/
|
|
13
|
-
export default function Example(handle: Handle) {
|
|
14
|
-
let open = false
|
|
15
|
-
|
|
16
|
-
function closePopover() {
|
|
17
|
-
open = false
|
|
18
|
-
void handle.update()
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return () => (
|
|
22
|
-
<popover.Context>
|
|
23
|
-
<div mix={buttonRowCss}>
|
|
24
|
-
<Button
|
|
25
|
-
endIcon={<Glyph name="chevronDown" />}
|
|
26
|
-
mix={[
|
|
27
|
-
popover.anchor({ placement: 'bottom' }),
|
|
28
|
-
popover.focusOnHide(),
|
|
29
|
-
on('click', () => {
|
|
30
|
-
open = !open
|
|
31
|
-
void handle.update()
|
|
32
|
-
}),
|
|
33
|
-
]}
|
|
34
|
-
tone="secondary"
|
|
35
|
-
>
|
|
36
|
-
View options
|
|
37
|
-
</Button>
|
|
38
|
-
</div>
|
|
39
|
-
|
|
40
|
-
<div
|
|
41
|
-
mix={[
|
|
42
|
-
popover.surfaceStyle,
|
|
43
|
-
popover.surface({
|
|
44
|
-
closeOnAnchorClick: false,
|
|
45
|
-
open,
|
|
46
|
-
onHide() {
|
|
47
|
-
closePopover()
|
|
48
|
-
},
|
|
49
|
-
}),
|
|
50
|
-
]}
|
|
51
|
-
>
|
|
52
|
-
<div mix={[popover.contentStyle, panelCss]}>
|
|
53
|
-
<div mix={fieldCss}>
|
|
54
|
-
<label for={`${handle.id}-grouping`} mix={labelCss}>
|
|
55
|
-
Grouping
|
|
56
|
-
</label>
|
|
57
|
-
<Select
|
|
58
|
-
id={`${handle.id}-grouping`}
|
|
59
|
-
defaultLabel="No grouping"
|
|
60
|
-
defaultValue="none"
|
|
61
|
-
mix={[fieldSelectCss, popover.focusOnShow()]}
|
|
62
|
-
>
|
|
63
|
-
<Option label="No grouping" value="none" />
|
|
64
|
-
<Option label="Status" value="status" />
|
|
65
|
-
<Option label="Priority" value="priority" />
|
|
66
|
-
</Select>
|
|
67
|
-
</div>
|
|
68
|
-
|
|
69
|
-
<div mix={fieldCss}>
|
|
70
|
-
<label for={`${handle.id}-ordering`} mix={labelCss}>
|
|
71
|
-
Ordering
|
|
72
|
-
</label>
|
|
73
|
-
<Select
|
|
74
|
-
id={`${handle.id}-ordering`}
|
|
75
|
-
defaultLabel="Manual"
|
|
76
|
-
defaultValue="manual"
|
|
77
|
-
mix={fieldSelectCss}
|
|
78
|
-
>
|
|
79
|
-
<Option label="Manual" value="manual" />
|
|
80
|
-
<Option label="Newest first" value="newest" />
|
|
81
|
-
<Option label="Oldest first" value="oldest" />
|
|
82
|
-
</Select>
|
|
83
|
-
</div>
|
|
84
|
-
|
|
85
|
-
<div mix={fieldCss}>
|
|
86
|
-
<label for={`${handle.id}-closed-projects`} mix={labelCss}>
|
|
87
|
-
Show closed projects
|
|
88
|
-
</label>
|
|
89
|
-
<Select
|
|
90
|
-
id={`${handle.id}-closed-projects`}
|
|
91
|
-
defaultLabel="All"
|
|
92
|
-
defaultValue="all"
|
|
93
|
-
mix={fieldSelectCss}
|
|
94
|
-
>
|
|
95
|
-
<Option label="All" value="all" />
|
|
96
|
-
<Option label="Open only" value="open" />
|
|
97
|
-
<Option label="Closed only" value="closed" />
|
|
98
|
-
</Select>
|
|
99
|
-
</div>
|
|
100
|
-
|
|
101
|
-
<div mix={actionsCss}>
|
|
102
|
-
<Button mix={on('click', closePopover)} tone="ghost">
|
|
103
|
-
Done
|
|
104
|
-
</Button>
|
|
105
|
-
</div>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
</popover.Context>
|
|
109
|
-
)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const buttonRowCss = css({
|
|
113
|
-
display: 'flex',
|
|
114
|
-
justifyContent: 'flex-start',
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
const panelCss = css({
|
|
118
|
-
display: 'grid',
|
|
119
|
-
gap: theme.space.md,
|
|
120
|
-
width: '22rem',
|
|
121
|
-
padding: theme.space.lg,
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
const fieldCss = css({
|
|
125
|
-
display: 'grid',
|
|
126
|
-
gap: theme.space.px,
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
const labelCss = css({
|
|
130
|
-
margin: 0,
|
|
131
|
-
fontSize: theme.fontSize.xs,
|
|
132
|
-
fontWeight: theme.fontWeight.semibold,
|
|
133
|
-
color: theme.colors.text.primary,
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
const fieldSelectCss = css({
|
|
137
|
-
width: '100%',
|
|
138
|
-
})
|
|
139
|
-
|
|
140
|
-
const actionsCss = css({
|
|
141
|
-
display: 'flex',
|
|
142
|
-
justifyContent: 'flex-end',
|
|
143
|
-
paddingTop: theme.space.xs,
|
|
144
|
-
})
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { css, type Handle } from '@remix-run/ui'
|
|
2
|
-
import * as button from '@remix-run/ui/button'
|
|
3
|
-
import { Glyph } from '@remix-run/ui/glyph'
|
|
4
|
-
import * as listbox from '@remix-run/ui/listbox'
|
|
5
|
-
import * as popover from '@remix-run/ui/popover'
|
|
6
|
-
import * as select from '@remix-run/ui/select'
|
|
7
|
-
import { theme } from '@remix-run/ui/theme'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* @name Select Deconstructed
|
|
11
|
-
* @description Build a fully custom select by composing the select, popover, and listbox primitives directly.
|
|
12
|
-
* @layout center
|
|
13
|
-
*/
|
|
14
|
-
export default function Example(handle: Handle) {
|
|
15
|
-
let label = 'Local'
|
|
16
|
-
let value = 'local'
|
|
17
|
-
let triggerId = `${handle.id}-trigger`
|
|
18
|
-
|
|
19
|
-
return () => (
|
|
20
|
-
<div
|
|
21
|
-
mix={[
|
|
22
|
-
stackCss,
|
|
23
|
-
select.onSelectChange((event) => {
|
|
24
|
-
label = event.label ?? 'Select an environment'
|
|
25
|
-
value = event.value ?? 'null'
|
|
26
|
-
void handle.update()
|
|
27
|
-
}),
|
|
28
|
-
]}
|
|
29
|
-
>
|
|
30
|
-
<p mix={labelCss}>Environment</p>
|
|
31
|
-
|
|
32
|
-
<select.Context defaultLabel="Local" defaultValue="local" name="environment">
|
|
33
|
-
<button
|
|
34
|
-
id={triggerId}
|
|
35
|
-
type="button"
|
|
36
|
-
mix={[button.baseStyle, select.triggerStyle, select.trigger(), selectCss]}
|
|
37
|
-
>
|
|
38
|
-
<span mix={button.labelStyle}>{label}</span>
|
|
39
|
-
<Glyph mix={button.iconStyle} name="chevronVertical" />
|
|
40
|
-
</button>
|
|
41
|
-
|
|
42
|
-
<popover.Context>
|
|
43
|
-
<div mix={[popover.surfaceStyle, select.popover()]}>
|
|
44
|
-
<div
|
|
45
|
-
aria-labelledby={triggerId}
|
|
46
|
-
mix={[popover.contentStyle, listbox.listStyle, select.list()]}
|
|
47
|
-
>
|
|
48
|
-
{environmentOptions.map((option) => (
|
|
49
|
-
<div key={option.value} mix={[listbox.optionStyle, select.option(option)]}>
|
|
50
|
-
<Glyph mix={listbox.glyphStyle} name="check" />
|
|
51
|
-
<span mix={listbox.labelStyle}>{option.label}</span>
|
|
52
|
-
</div>
|
|
53
|
-
))}
|
|
54
|
-
</div>
|
|
55
|
-
</div>
|
|
56
|
-
</popover.Context>
|
|
57
|
-
|
|
58
|
-
<input mix={select.hiddenInput()} />
|
|
59
|
-
</select.Context>
|
|
60
|
-
|
|
61
|
-
<p mix={valueCss}>{`value=${value}`}</p>
|
|
62
|
-
</div>
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const environmentOptions = [
|
|
67
|
-
{ label: 'Local', value: 'local' },
|
|
68
|
-
{ label: 'Staging', value: 'staging' },
|
|
69
|
-
{ label: 'Production', value: 'production' },
|
|
70
|
-
{ disabled: true, label: 'Archived', value: 'archived' },
|
|
71
|
-
] as const
|
|
72
|
-
|
|
73
|
-
const selectCss = css({
|
|
74
|
-
width: '16rem',
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
const stackCss = css({
|
|
78
|
-
display: 'flex',
|
|
79
|
-
flexDirection: 'column',
|
|
80
|
-
gap: theme.space.sm,
|
|
81
|
-
width: '100%',
|
|
82
|
-
})
|
|
83
|
-
|
|
84
|
-
const labelCss = css({
|
|
85
|
-
margin: 0,
|
|
86
|
-
fontSize: theme.fontSize.xs,
|
|
87
|
-
fontWeight: theme.fontWeight.semibold,
|
|
88
|
-
color: theme.colors.text.primary,
|
|
89
|
-
})
|
|
90
|
-
|
|
91
|
-
const valueCss = css({
|
|
92
|
-
margin: 0,
|
|
93
|
-
fontFamily: theme.fontFamily.mono,
|
|
94
|
-
fontSize: theme.fontSize.xs,
|
|
95
|
-
color: theme.colors.text.secondary,
|
|
96
|
-
})
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { css } from '@remix-run/ui'
|
|
2
|
-
import { Option, Select } from '@remix-run/ui/select'
|
|
3
|
-
import { theme } from '@remix-run/ui/theme'
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @name Select Overview
|
|
7
|
-
* @description A styled select control with a searchable dropdown and accessible label.
|
|
8
|
-
* @layout center
|
|
9
|
-
*/
|
|
10
|
-
export default function Example() {
|
|
11
|
-
return () => (
|
|
12
|
-
<div mix={stackCss}>
|
|
13
|
-
<label for="fruit-select" mix={labelCss}>
|
|
14
|
-
Choose a fruit
|
|
15
|
-
</label>
|
|
16
|
-
<Select
|
|
17
|
-
id="fruit-select"
|
|
18
|
-
defaultLabel="Banana"
|
|
19
|
-
defaultValue="banana"
|
|
20
|
-
name="fruit"
|
|
21
|
-
mix={selectCss}
|
|
22
|
-
>
|
|
23
|
-
<Option label="Apple" value="apple" />
|
|
24
|
-
<Option label="Apricot" value="apricot" />
|
|
25
|
-
<Option label="Banana" value="banana" />
|
|
26
|
-
<Option label="Blackberry" value="blackberry" />
|
|
27
|
-
<Option label="Blackcurrant" value="blackcurrant" />
|
|
28
|
-
<Option label="Blueberry" value="blueberry" />
|
|
29
|
-
<Option label="Boysenberry" value="boysenberry" />
|
|
30
|
-
<Option label="Cantaloupe" value="cantaloupe" />
|
|
31
|
-
</Select>
|
|
32
|
-
</div>
|
|
33
|
-
)
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const selectCss = css({
|
|
37
|
-
width: '16rem',
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
const stackCss = css({
|
|
41
|
-
display: 'flex',
|
|
42
|
-
flexDirection: 'column',
|
|
43
|
-
gap: theme.space.sm,
|
|
44
|
-
width: '100%',
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
const labelCss = css({
|
|
48
|
-
margin: 0,
|
|
49
|
-
fontSize: theme.fontSize.xs,
|
|
50
|
-
fontWeight: theme.fontWeight.semibold,
|
|
51
|
-
color: theme.colors.text.primary,
|
|
52
|
-
})
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { css, type CSSMixinDescriptor } from '@remix-run/ui'
|
|
2
|
-
|
|
3
|
-
import { theme } from '../../theme/theme.ts'
|
|
4
|
-
|
|
5
|
-
const itemInset = `var(--rmx-ui-item-inset, ${theme.space.sm})`
|
|
6
|
-
const itemIndicatorHalfInset =
|
|
7
|
-
'calc((var(--rmx-ui-item-indicator-width, 0px) + var(--rmx-ui-item-indicator-gap, 0px)) / 2)'
|
|
8
|
-
|
|
9
|
-
const separatorCss: CSSMixinDescriptor = css({
|
|
10
|
-
flexShrink: 0,
|
|
11
|
-
margin: 0,
|
|
12
|
-
marginBlock: theme.space.xs,
|
|
13
|
-
marginInlineStart: `calc(${itemInset} + ${itemIndicatorHalfInset})`,
|
|
14
|
-
marginInlineEnd: itemInset,
|
|
15
|
-
border: 0,
|
|
16
|
-
borderTop: `1px solid ${theme.colors.border.subtle}`,
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
export const separatorStyle = separatorCss
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# Tabs
|
|
2
|
-
|
|
3
|
-
`tabs` is a primitive for building accessible tabs with automatic activation and simple default styling.
|
|
4
|
-
|
|
5
|
-
Use it when you need a tablist, tab triggers, and tab panels. `tabs.listStyle` and `tabs.triggerStyle` style the tab row and triggers, but panel presentation stays app-owned.
|
|
6
|
-
|
|
7
|
-
## Usage
|
|
8
|
-
|
|
9
|
-
```tsx
|
|
10
|
-
import { css, type Handle } from 'remix/ui'
|
|
11
|
-
import { Tab, Tabs, TabsList, TabsPanel } from 'remix/ui/tabs'
|
|
12
|
-
|
|
13
|
-
let panel = css({
|
|
14
|
-
padding: '16px',
|
|
15
|
-
border: '1px solid #d6d6d6',
|
|
16
|
-
borderRadius: '16px',
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
export function ProjectTabs(_handle: Handle) {
|
|
20
|
-
return () => (
|
|
21
|
-
<Tabs defaultValue="overview">
|
|
22
|
-
<TabsList aria-label="Project sections">
|
|
23
|
-
<Tab value="overview">Overview</Tab>
|
|
24
|
-
<Tab value="analytics">Analytics</Tab>
|
|
25
|
-
<Tab value="reports">Reports</Tab>
|
|
26
|
-
<Tab value="settings">Settings</Tab>
|
|
27
|
-
</TabsList>
|
|
28
|
-
|
|
29
|
-
<TabsPanel mix={panel} value="overview">
|
|
30
|
-
View your key metrics and recent project activity.
|
|
31
|
-
</TabsPanel>
|
|
32
|
-
<TabsPanel mix={panel} value="analytics">
|
|
33
|
-
Track trends and compare performance over time.
|
|
34
|
-
</TabsPanel>
|
|
35
|
-
<TabsPanel mix={panel} value="reports">
|
|
36
|
-
Export and review your latest reports.
|
|
37
|
-
</TabsPanel>
|
|
38
|
-
<TabsPanel mix={panel} value="settings">
|
|
39
|
-
Manage project preferences and defaults.
|
|
40
|
-
</TabsPanel>
|
|
41
|
-
</Tabs>
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## `tabs.*`
|
|
47
|
-
|
|
48
|
-
### `tabs.Context`
|
|
49
|
-
|
|
50
|
-
Provides the shared coordinator for one tabs instance.
|
|
51
|
-
|
|
52
|
-
- Owns the selected tab value for uncontrolled usage.
|
|
53
|
-
- Accepts controlled `value` plus `onValueChange` when the app owns selection state.
|
|
54
|
-
- Accepts `orientation="vertical"` when the tablist should use `ArrowUp` and `ArrowDown`.
|
|
55
|
-
|
|
56
|
-
### `tabs.list()`
|
|
57
|
-
|
|
58
|
-
Turns the host into the tablist.
|
|
59
|
-
|
|
60
|
-
- Wires `role="tablist"`.
|
|
61
|
-
- Adds `aria-orientation="vertical"` when needed.
|
|
62
|
-
|
|
63
|
-
### `tabs.trigger({ value, disabled })`
|
|
64
|
-
|
|
65
|
-
Registers one tab trigger.
|
|
66
|
-
|
|
67
|
-
- Wires `role="tab"`, `aria-selected`, `aria-controls`, and roving `tabIndex`.
|
|
68
|
-
- Selects on press.
|
|
69
|
-
- Supports `ArrowLeft` and `ArrowRight` for horizontal lists.
|
|
70
|
-
- Supports `ArrowUp` and `ArrowDown` for vertical lists.
|
|
71
|
-
- Supports `Home` and `End`.
|
|
72
|
-
|
|
73
|
-
### `tabs.panel({ value })`
|
|
74
|
-
|
|
75
|
-
Turns the host into the panel for one tab value.
|
|
76
|
-
|
|
77
|
-
- Wires `role="tabpanel"` and `aria-labelledby`.
|
|
78
|
-
- Hides inactive panels with `hidden`.
|
|
79
|
-
|
|
80
|
-
### `onTabsChange(...)`
|
|
81
|
-
|
|
82
|
-
The listener mixin for bubbled tab selection changes.
|
|
83
|
-
|
|
84
|
-
- `event.value` is the newly selected tab value.
|
|
85
|
-
- `event.previousValue` is the previously selected value, or `null`.
|
|
86
|
-
|
|
87
|
-
## Convenience Components
|
|
88
|
-
|
|
89
|
-
- `Tabs` is a thin wrapper around `tabs.Context`.
|
|
90
|
-
- `TabsList` applies `tabs.list()` with `tabs.listStyle`.
|
|
91
|
-
- `Tab` applies `tabs.trigger(...)` with `button.baseStyle` and `tabs.triggerStyle`.
|
|
92
|
-
- `TabsPanel` applies `tabs.panel(...)` without adding panel styling.
|
|
93
|
-
|
|
94
|
-
## Behavior Notes
|
|
95
|
-
|
|
96
|
-
- When you do not provide `defaultValue` or controlled `value`, the first enabled tab becomes selected automatically.
|
|
97
|
-
- Arrow-key navigation wraps and skips disabled tabs.
|
|
98
|
-
- Selection follows focus during arrow-key navigation.
|
|
99
|
-
- The default panel contract is behavioral only. Apps own spacing, borders, backgrounds, and layout for tab panels.
|
|
100
|
-
|
|
101
|
-
## When To Use Something Else
|
|
102
|
-
|
|
103
|
-
- Use `accordion` when sections should expand and collapse independently instead of switching a single active panel.
|
|
104
|
-
- Use `select` or `listbox` when the control chooses a form value instead of changing visible page sections.
|
|
105
|
-
- Use `menu` for action lists and command surfaces.
|