@remix-run/ui 0.0.0 → 0.1.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/LICENSE +21 -0
- package/README.md +195 -2
- package/dist/animation/animate-layout-mixin.d.ts +12 -0
- package/dist/animation/animate-layout-mixin.js +214 -0
- package/dist/animation/animate-layout-mixin.js.map +1 -0
- package/dist/animation/animate-mixins.d.ts +29 -0
- package/dist/animation/animate-mixins.js +235 -0
- package/dist/animation/animate-mixins.js.map +1 -0
- package/dist/animation/index.d.ts +6 -0
- package/dist/animation/index.js +5 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/animation/spring.d.ts +75 -0
- package/dist/animation/spring.js +183 -0
- package/dist/animation/spring.js.map +1 -0
- package/dist/animation/tween.d.ts +70 -0
- package/dist/animation/tween.js +93 -0
- package/dist/animation/tween.js.map +1 -0
- package/dist/components/accordion/accordion.d.ts +92 -0
- package/dist/components/accordion/accordion.js +337 -0
- package/dist/components/accordion/accordion.js.map +1 -0
- package/dist/components/anchor/anchor.d.ts +13 -0
- package/dist/components/anchor/anchor.js +558 -0
- package/dist/components/anchor/anchor.js.map +1 -0
- package/dist/components/breadcrumbs/breadcrumbs.d.ts +11 -0
- package/dist/components/breadcrumbs/breadcrumbs.js +78 -0
- package/dist/components/breadcrumbs/breadcrumbs.js.map +1 -0
- package/dist/components/button/button.d.ts +23 -0
- package/dist/components/button/button.js +147 -0
- package/dist/components/button/button.js.map +1 -0
- package/dist/components/combobox/combobox.d.ts +101 -0
- package/dist/components/combobox/combobox.js +708 -0
- package/dist/components/combobox/combobox.js.map +1 -0
- package/dist/components/glyph/glyph.d.ts +14 -0
- package/dist/components/glyph/glyph.js +65 -0
- package/dist/components/glyph/glyph.js.map +1 -0
- package/dist/components/listbox/listbox.d.ts +67 -0
- package/dist/components/listbox/listbox.js +340 -0
- package/dist/components/listbox/listbox.js.map +1 -0
- package/dist/components/menu/hover-aim.d.ts +5 -0
- package/dist/components/menu/hover-aim.js +308 -0
- package/dist/components/menu/hover-aim.js.map +1 -0
- package/dist/components/menu/menu.d.ts +164 -0
- package/dist/components/menu/menu.js +1106 -0
- package/dist/components/menu/menu.js.map +1 -0
- package/dist/components/popover/popover.d.ts +35 -0
- package/dist/components/popover/popover.js +138 -0
- package/dist/components/popover/popover.js.map +1 -0
- package/dist/components/select/select.d.ts +67 -0
- package/dist/components/select/select.js +397 -0
- package/dist/components/select/select.js.map +1 -0
- package/dist/components/separator/separator.d.ts +2 -0
- package/dist/components/separator/separator.js +15 -0
- package/dist/components/separator/separator.js.map +1 -0
- package/dist/components/tabs/tabs.d.ts +78 -0
- package/dist/components/tabs/tabs.js +341 -0
- package/dist/components/tabs/tabs.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/interactions/keydown/keydown.d.ts +1 -0
- package/dist/interactions/keydown/keydown.js +8 -0
- package/dist/interactions/keydown/keydown.js.map +1 -0
- package/dist/interactions/outside-click/outside-click-mixin.d.ts +2 -0
- package/dist/interactions/outside-click/outside-click-mixin.js +29 -0
- package/dist/interactions/outside-click/outside-click-mixin.js.map +1 -0
- package/dist/interactions/typeahead/typeahead-mixin.d.ts +8 -0
- package/dist/interactions/typeahead/typeahead-mixin.js +59 -0
- package/dist/interactions/typeahead/typeahead-mixin.js.map +1 -0
- package/dist/jsx-runtime.d.ts +2 -0
- package/dist/jsx-runtime.js +3 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/runtime/client-entries.d.ts +91 -0
- package/dist/runtime/client-entries.js +40 -0
- package/dist/runtime/client-entries.js.map +1 -0
- package/dist/runtime/component.d.ts +223 -0
- package/dist/runtime/component.js +152 -0
- package/dist/runtime/component.js.map +1 -0
- package/dist/runtime/create-element.d.ts +10 -0
- package/dist/runtime/create-element.js +29 -0
- package/dist/runtime/create-element.js.map +1 -0
- package/dist/runtime/diff-dom.d.ts +2 -0
- package/dist/runtime/diff-dom.js +364 -0
- package/dist/runtime/diff-dom.js.map +1 -0
- package/dist/runtime/diff-props.d.ts +9 -0
- package/dist/runtime/diff-props.js +195 -0
- package/dist/runtime/diff-props.js.map +1 -0
- package/dist/runtime/document-state.d.ts +11 -0
- package/dist/runtime/document-state.js +106 -0
- package/dist/runtime/document-state.js.map +1 -0
- package/dist/runtime/dom.d.ts +3189 -0
- package/dist/runtime/dom.js +2 -0
- package/dist/runtime/dom.js.map +1 -0
- package/dist/runtime/error-event.d.ts +20 -0
- package/dist/runtime/error-event.js +19 -0
- package/dist/runtime/error-event.js.map +1 -0
- package/dist/runtime/event-listeners.d.ts +50 -0
- package/dist/runtime/event-listeners.js +31 -0
- package/dist/runtime/event-listeners.js.map +1 -0
- package/dist/runtime/frame.d.ts +119 -0
- package/dist/runtime/frame.js +915 -0
- package/dist/runtime/frame.js.map +1 -0
- package/dist/runtime/invariant.d.ts +23 -0
- package/dist/runtime/invariant.js +33 -0
- package/dist/runtime/invariant.js.map +1 -0
- package/dist/runtime/jsx.d.ts +320 -0
- package/dist/runtime/jsx.js +31 -0
- package/dist/runtime/jsx.js.map +1 -0
- package/dist/runtime/mixins/attrs-mixin.d.ts +9 -0
- package/dist/runtime/mixins/attrs-mixin.js +23 -0
- package/dist/runtime/mixins/attrs-mixin.js.map +1 -0
- package/dist/runtime/mixins/link-mixin.d.ts +17 -0
- package/dist/runtime/mixins/link-mixin.js +101 -0
- package/dist/runtime/mixins/link-mixin.js.map +1 -0
- package/dist/runtime/mixins/mixin.d.ts +145 -0
- package/dist/runtime/mixins/mixin.js +570 -0
- package/dist/runtime/mixins/mixin.js.map +1 -0
- package/dist/runtime/mixins/on-mixin.d.ts +16 -0
- package/dist/runtime/mixins/on-mixin.js +49 -0
- package/dist/runtime/mixins/on-mixin.js.map +1 -0
- package/dist/runtime/mixins/ref-mixin.d.ts +9 -0
- package/dist/runtime/mixins/ref-mixin.js +21 -0
- package/dist/runtime/mixins/ref-mixin.js.map +1 -0
- package/dist/runtime/navigation.d.ts +22 -0
- package/dist/runtime/navigation.js +102 -0
- package/dist/runtime/navigation.js.map +1 -0
- package/dist/runtime/reconcile.d.ts +11 -0
- package/dist/runtime/reconcile.js +1240 -0
- package/dist/runtime/reconcile.js.map +1 -0
- package/dist/runtime/render.d.ts +54 -0
- package/dist/runtime/render.js +50 -0
- package/dist/runtime/render.js.map +1 -0
- package/dist/runtime/run.d.ts +45 -0
- package/dist/runtime/run.js +68 -0
- package/dist/runtime/run.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +30 -0
- package/dist/runtime/scheduler.js +185 -0
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/svg-attributes.d.ts +5 -0
- package/dist/runtime/svg-attributes.js +124 -0
- package/dist/runtime/svg-attributes.js.map +1 -0
- package/dist/runtime/to-vnode.d.ts +3 -0
- package/dist/runtime/to-vnode.js +43 -0
- package/dist/runtime/to-vnode.js.map +1 -0
- package/dist/runtime/typed-event-target.d.ts +50 -0
- package/dist/runtime/typed-event-target.js +6 -0
- package/dist/runtime/typed-event-target.js.map +1 -0
- package/dist/runtime/vdom.d.ts +55 -0
- package/dist/runtime/vdom.js +198 -0
- package/dist/runtime/vdom.js.map +1 -0
- package/dist/runtime/vnode.d.ts +79 -0
- package/dist/runtime/vnode.js +38 -0
- package/dist/runtime/vnode.js.map +1 -0
- package/dist/server/stream.d.ts +57 -0
- package/dist/server/stream.js +1007 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/style/css-mixin.d.ts +8 -0
- package/dist/style/css-mixin.js +54 -0
- package/dist/style/css-mixin.js.map +1 -0
- package/dist/style/index.d.ts +5 -0
- package/dist/style/index.js +4 -0
- package/dist/style/index.js.map +1 -0
- package/dist/style/style.d.ts +24 -0
- package/dist/style/style.js +269 -0
- package/dist/style/style.js.map +1 -0
- package/dist/style/stylesheet.d.ts +11 -0
- package/dist/style/stylesheet.js +174 -0
- package/dist/style/stylesheet.js.map +1 -0
- package/dist/test.d.ts +2 -0
- package/dist/test.js +2 -0
- package/dist/test.js.map +1 -0
- package/dist/theme/contract.d.ts +259 -0
- package/dist/theme/contract.js +131 -0
- package/dist/theme/contract.js.map +1 -0
- package/dist/theme/glyph-contract.d.ts +13 -0
- package/dist/theme/glyph-contract.js +34 -0
- package/dist/theme/glyph-contract.js.map +1 -0
- package/dist/theme/presets/rmx-01/glyphs.d.ts +2 -0
- package/dist/theme/presets/rmx-01/glyphs.js +252 -0
- package/dist/theme/presets/rmx-01/glyphs.js.map +1 -0
- package/dist/theme/presets/rmx-01/index.d.ts +2 -0
- package/dist/theme/presets/rmx-01/index.js +119 -0
- package/dist/theme/presets/rmx-01/index.js.map +1 -0
- package/dist/theme/runtime.d.ts +2 -0
- package/dist/theme/runtime.js +81 -0
- package/dist/theme/runtime.js.map +1 -0
- package/dist/theme/theme.d.ts +6 -0
- package/dist/theme/theme.js +5 -0
- package/dist/theme/theme.js.map +1 -0
- package/dist/utils/flash-attribute.d.ts +1 -0
- package/dist/utils/flash-attribute.js +11 -0
- package/dist/utils/flash-attribute.js.map +1 -0
- package/dist/utils/scroll-lock.d.ts +3 -0
- package/dist/utils/scroll-lock.js +69 -0
- package/dist/utils/scroll-lock.js.map +1 -0
- package/dist/utils/wait-for-css-transition.d.ts +1 -0
- package/dist/utils/wait-for-css-transition.js +58 -0
- package/dist/utils/wait-for-css-transition.js.map +1 -0
- package/dist/utils/wait.d.ts +1 -0
- package/dist/utils/wait.js +6 -0
- package/dist/utils/wait.js.map +1 -0
- package/package.json +125 -5
- package/src/animation/animate-layout-mixin.ts +266 -0
- package/src/animation/animate-mixins.ts +292 -0
- package/src/animation/index.ts +6 -0
- package/src/animation/spring.ts +299 -0
- package/src/animation/tween.ts +134 -0
- package/src/components/accordion/accordion.tsx +565 -0
- package/src/components/anchor/anchor.ts +904 -0
- package/src/components/breadcrumbs/breadcrumbs.tsx +124 -0
- package/src/components/button/README.md +44 -0
- package/src/components/button/button.tsx +188 -0
- package/src/components/combobox/README.md +145 -0
- package/src/components/combobox/combobox.tsx +1014 -0
- package/src/components/glyph/glyph.tsx +110 -0
- package/src/components/listbox/listbox.ts +447 -0
- package/src/components/menu/hover-aim.ts +428 -0
- package/src/components/menu/menu.tsx +1547 -0
- package/src/components/popover/README.md +122 -0
- package/src/components/popover/popover.ts +201 -0
- package/src/components/select/select.tsx +585 -0
- package/src/components/separator/separator.ts +19 -0
- package/src/components/tabs/README.md +105 -0
- package/src/components/tabs/tabs.tsx +499 -0
- package/src/index.ts +72 -0
- package/src/interactions/keydown/keydown.ts +14 -0
- package/src/interactions/outside-click/outside-click-mixin.ts +55 -0
- package/src/interactions/typeahead/typeahead-mixin.ts +89 -0
- package/src/jsx-runtime.ts +2 -0
- package/src/runtime/client-entries.ts +137 -0
- package/src/runtime/component.ts +402 -0
- package/src/runtime/create-element.ts +38 -0
- package/src/runtime/diff-dom.ts +404 -0
- package/src/runtime/diff-props.ts +209 -0
- package/src/runtime/document-state.ts +130 -0
- package/src/runtime/dom.ts +3971 -0
- package/src/runtime/error-event.ts +26 -0
- package/src/runtime/event-listeners.ts +171 -0
- package/src/runtime/frame.ts +1211 -0
- package/src/runtime/invariant.ts +31 -0
- package/src/runtime/jsx.ts +398 -0
- package/src/runtime/mixins/attrs-mixin.ts +35 -0
- package/src/runtime/mixins/link-mixin.ts +131 -0
- package/src/runtime/mixins/mixin.ts +908 -0
- package/src/runtime/mixins/on-mixin.ts +89 -0
- package/src/runtime/mixins/ref-mixin.ts +32 -0
- package/src/runtime/navigation.ts +136 -0
- package/src/runtime/reconcile.ts +1722 -0
- package/src/runtime/render.ts +101 -0
- package/src/runtime/run.ts +100 -0
- package/src/runtime/scheduler.ts +262 -0
- package/src/runtime/svg-attributes.ts +133 -0
- package/src/runtime/to-vnode.ts +50 -0
- package/src/runtime/typed-event-target.ts +67 -0
- package/src/runtime/vdom.ts +295 -0
- package/src/runtime/vnode.ts +137 -0
- package/src/server/stream.ts +1342 -0
- package/src/style/css-mixin.ts +82 -0
- package/src/style/index.ts +10 -0
- package/src/style/style.ts +312 -0
- package/src/style/stylesheet.ts +209 -0
- package/src/test/setup.ts +7 -0
- package/src/test/utils.ts +45 -0
- package/src/test.ts +2 -0
- package/src/theme/contract.ts +183 -0
- package/src/theme/glyph-contract.ts +57 -0
- package/src/theme/presets/rmx-01/glyphs.tsx +308 -0
- package/src/theme/presets/rmx-01/index.ts +121 -0
- package/src/theme/runtime.ts +116 -0
- package/src/theme/theme.ts +15 -0
- package/src/utils/flash-attribute.ts +11 -0
- package/src/utils/scroll-lock.ts +97 -0
- package/src/utils/wait-for-css-transition.ts +66 -0
- package/src/utils/wait.ts +5 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Shopify Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,196 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Runtime UI primitives for Remix apps, including the component runtime, server rendering, frame hydration, reusable mixins, first-party components, and theme tokens.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- Component runtime APIs for rendering, hydration, frame navigation, and JSX
|
|
8
|
+
- Server rendering APIs for streaming Remix UI trees and frames
|
|
9
|
+
- `mix` composition with event, ref, CSS, and animation helpers
|
|
10
|
+
- First-party components such as buttons, menus, listboxes, popovers, and selects
|
|
11
|
+
- Fixed typed `theme` contract whose leaves resolve to `var(--rmx-...)`
|
|
12
|
+
- `createTheme()` and `createGlyphSheet()` utilities for shared app styling and glyphs
|
|
13
|
+
|
|
14
|
+
## Installation
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npm i remix
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
Define your app theme once:
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { createTheme } from 'remix/ui'
|
|
26
|
+
|
|
27
|
+
let Theme = createTheme({
|
|
28
|
+
space: {
|
|
29
|
+
none: '0px',
|
|
30
|
+
px: '1px',
|
|
31
|
+
xs: '2px',
|
|
32
|
+
sm: '4px',
|
|
33
|
+
md: '8px',
|
|
34
|
+
lg: '12px',
|
|
35
|
+
xl: '16px',
|
|
36
|
+
xxl: '24px',
|
|
37
|
+
},
|
|
38
|
+
radius: {
|
|
39
|
+
none: '0px',
|
|
40
|
+
sm: '4px',
|
|
41
|
+
md: '8px',
|
|
42
|
+
lg: '12px',
|
|
43
|
+
xl: '16px',
|
|
44
|
+
full: '9999px',
|
|
45
|
+
},
|
|
46
|
+
fontSize: {
|
|
47
|
+
xxxs: '10px',
|
|
48
|
+
xxs: '11px',
|
|
49
|
+
xs: '12px',
|
|
50
|
+
sm: '14px',
|
|
51
|
+
md: '16px',
|
|
52
|
+
lg: '18px',
|
|
53
|
+
xl: '20px',
|
|
54
|
+
xxl: '28px',
|
|
55
|
+
},
|
|
56
|
+
lineHeight: {
|
|
57
|
+
tight: '1.2',
|
|
58
|
+
normal: '1.5',
|
|
59
|
+
relaxed: '1.7',
|
|
60
|
+
},
|
|
61
|
+
fontWeight: {
|
|
62
|
+
normal: '400',
|
|
63
|
+
medium: '500',
|
|
64
|
+
semibold: '600',
|
|
65
|
+
bold: '700',
|
|
66
|
+
},
|
|
67
|
+
shadow: {
|
|
68
|
+
xs: '0 1px 2px rgb(0 0 0 / 0.05)',
|
|
69
|
+
sm: '0 1px 3px rgb(0 0 0 / 0.10)',
|
|
70
|
+
md: '0 4px 10px rgb(0 0 0 / 0.12)',
|
|
71
|
+
lg: '0 10px 30px rgb(0 0 0 / 0.16)',
|
|
72
|
+
xl: '0 20px 50px rgb(0 0 0 / 0.20)',
|
|
73
|
+
},
|
|
74
|
+
zIndex: {
|
|
75
|
+
dropdown: '1000',
|
|
76
|
+
popover: '1100',
|
|
77
|
+
sticky: '1200',
|
|
78
|
+
overlay: '1300',
|
|
79
|
+
modal: '1400',
|
|
80
|
+
toast: '1500',
|
|
81
|
+
tooltip: '1600',
|
|
82
|
+
},
|
|
83
|
+
surface: {
|
|
84
|
+
lvl0: '#ffffff',
|
|
85
|
+
lvl1: '#f8fafc',
|
|
86
|
+
lvl2: '#f1f5f9',
|
|
87
|
+
lvl3: '#e5edf7',
|
|
88
|
+
lvl4: '#dbe6f4',
|
|
89
|
+
},
|
|
90
|
+
colors: {
|
|
91
|
+
text: {
|
|
92
|
+
primary: '#111827',
|
|
93
|
+
secondary: '#374151',
|
|
94
|
+
muted: '#6b7280',
|
|
95
|
+
link: '#2563eb',
|
|
96
|
+
},
|
|
97
|
+
border: {
|
|
98
|
+
subtle: '#e5e7eb',
|
|
99
|
+
default: '#d1d5db',
|
|
100
|
+
strong: '#9ca3af',
|
|
101
|
+
},
|
|
102
|
+
focus: {
|
|
103
|
+
ring: '#3b82f6',
|
|
104
|
+
},
|
|
105
|
+
overlay: {
|
|
106
|
+
scrim: 'rgb(0 0 0 / 0.45)',
|
|
107
|
+
},
|
|
108
|
+
action: {
|
|
109
|
+
primary: {
|
|
110
|
+
background: '#2563eb',
|
|
111
|
+
backgroundHover: '#1d4ed8',
|
|
112
|
+
backgroundActive: '#1e40af',
|
|
113
|
+
foreground: '#ffffff',
|
|
114
|
+
border: '#2563eb',
|
|
115
|
+
},
|
|
116
|
+
secondary: {
|
|
117
|
+
background: '#ffffff',
|
|
118
|
+
backgroundHover: '#f8fafc',
|
|
119
|
+
backgroundActive: '#f1f5f9',
|
|
120
|
+
foreground: '#111827',
|
|
121
|
+
border: '#d1d5db',
|
|
122
|
+
},
|
|
123
|
+
danger: {
|
|
124
|
+
background: '#dc2626',
|
|
125
|
+
backgroundHover: '#b91c1c',
|
|
126
|
+
backgroundActive: '#991b1b',
|
|
127
|
+
foreground: '#ffffff',
|
|
128
|
+
border: '#dc2626',
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Render the theme once near the top of your document:
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
function Layout(props: { children: RemixNode }) {
|
|
139
|
+
return (
|
|
140
|
+
<html>
|
|
141
|
+
<head>
|
|
142
|
+
<Theme />
|
|
143
|
+
</head>
|
|
144
|
+
<body>{props.children}</body>
|
|
145
|
+
</html>
|
|
146
|
+
)
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Consume the shared token contract from app code and first-party components:
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
import { css } from 'remix/ui'
|
|
154
|
+
import { theme } from 'remix/ui'
|
|
155
|
+
|
|
156
|
+
let card = css({
|
|
157
|
+
backgroundColor: theme.surface.lvl0,
|
|
158
|
+
color: theme.colors.text.primary,
|
|
159
|
+
border: `1px solid ${theme.colors.border.subtle}`,
|
|
160
|
+
borderRadius: theme.radius.md,
|
|
161
|
+
paddingInline: theme.space.md,
|
|
162
|
+
paddingBlock: theme.space.sm,
|
|
163
|
+
})
|
|
164
|
+
|
|
165
|
+
<div mix={card} />
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Render shared glyphs separately from the theme styles:
|
|
169
|
+
|
|
170
|
+
```tsx
|
|
171
|
+
import type { RemixNode } from 'remix/ui'
|
|
172
|
+
import { Button } from '@remix-run/ui/button'
|
|
173
|
+
import { Glyph } from '@remix-run/ui/glyph'
|
|
174
|
+
import { RMX_01, RMX_01_GLYPHS } from '@remix-run/ui/theme'
|
|
175
|
+
|
|
176
|
+
function Layout(props: { children: RemixNode }) {
|
|
177
|
+
return (
|
|
178
|
+
<html>
|
|
179
|
+
<head>
|
|
180
|
+
<RMX_01 />
|
|
181
|
+
</head>
|
|
182
|
+
<body>
|
|
183
|
+
<RMX_01_GLYPHS />
|
|
184
|
+
<Button startIcon={<Glyph name="add" />} tone="primary">
|
|
185
|
+
New project
|
|
186
|
+
</Button>
|
|
187
|
+
{props.children}
|
|
188
|
+
</body>
|
|
189
|
+
</html>
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## License
|
|
195
|
+
|
|
196
|
+
See [LICENSE](https://github.com/remix-run/remix/blob/main/LICENSE)
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ElementProps } from '../runtime/jsx.ts';
|
|
2
|
+
import type { MixinDescriptor } from '../runtime/mixins/mixin.ts';
|
|
3
|
+
import type { LayoutAnimationConfig } from '../runtime/dom.ts';
|
|
4
|
+
type LayoutConfig = true | false | null | undefined | LayoutAnimationConfig;
|
|
5
|
+
/**
|
|
6
|
+
* Animates layout changes for an element using FLIP-style transforms.
|
|
7
|
+
*
|
|
8
|
+
* @param config Layout animation configuration.
|
|
9
|
+
* @returns A mixin descriptor for the target element.
|
|
10
|
+
*/
|
|
11
|
+
export declare function animateLayout<target extends EventTarget = Element>(config?: LayoutConfig): MixinDescriptor<target, [LayoutConfig?], ElementProps>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { createMixin } from "../runtime/mixins/mixin.js";
|
|
2
|
+
const DEFAULT_DURATION = 200;
|
|
3
|
+
const DEFAULT_EASING = 'ease-out';
|
|
4
|
+
const SCALE_PRECISION = 0.0001;
|
|
5
|
+
const TRANSLATE_PRECISION = 0.01;
|
|
6
|
+
function createAxisDelta() {
|
|
7
|
+
return { translate: 0, scale: 1, origin: 0.5, originPoint: 0 };
|
|
8
|
+
}
|
|
9
|
+
function createDelta() {
|
|
10
|
+
return { x: createAxisDelta(), y: createAxisDelta() };
|
|
11
|
+
}
|
|
12
|
+
function mix(from, to, progress) {
|
|
13
|
+
return from + (to - from) * progress;
|
|
14
|
+
}
|
|
15
|
+
function isNear(value, target, threshold) {
|
|
16
|
+
return Math.abs(value - target) <= threshold;
|
|
17
|
+
}
|
|
18
|
+
function calcLength(axis) {
|
|
19
|
+
return axis.max - axis.min;
|
|
20
|
+
}
|
|
21
|
+
function calcAxisDelta(delta, source, target, origin = 0.5) {
|
|
22
|
+
delta.origin = origin;
|
|
23
|
+
delta.originPoint = mix(source.min, source.max, origin);
|
|
24
|
+
let sourceLength = calcLength(source);
|
|
25
|
+
let targetLength = calcLength(target);
|
|
26
|
+
delta.scale = sourceLength !== 0 ? targetLength / sourceLength : 1;
|
|
27
|
+
let targetOriginPoint = mix(target.min, target.max, origin);
|
|
28
|
+
delta.translate = targetOriginPoint - delta.originPoint;
|
|
29
|
+
if (isNear(delta.scale, 1, SCALE_PRECISION) || Number.isNaN(delta.scale)) {
|
|
30
|
+
delta.scale = 1;
|
|
31
|
+
}
|
|
32
|
+
if (isNear(delta.translate, 0, TRANSLATE_PRECISION) || Number.isNaN(delta.translate)) {
|
|
33
|
+
delta.translate = 0;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function calcBoxDelta(delta, source, target, layoutConfig) {
|
|
37
|
+
let origin = layoutConfig.size === false ? 0 : 0.5;
|
|
38
|
+
calcAxisDelta(delta.x, source.x, target.x, origin);
|
|
39
|
+
calcAxisDelta(delta.y, source.y, target.y, origin);
|
|
40
|
+
}
|
|
41
|
+
function mixAxisDelta(output, delta, progress) {
|
|
42
|
+
output.translate = mix(delta.translate, 0, progress);
|
|
43
|
+
output.scale = mix(delta.scale, 1, progress);
|
|
44
|
+
output.origin = delta.origin;
|
|
45
|
+
output.originPoint = delta.originPoint;
|
|
46
|
+
}
|
|
47
|
+
function mixDelta(output, delta, progress) {
|
|
48
|
+
mixAxisDelta(output.x, delta.x, progress);
|
|
49
|
+
mixAxisDelta(output.y, delta.y, progress);
|
|
50
|
+
}
|
|
51
|
+
function copyAxisDeltaInto(target, source) {
|
|
52
|
+
target.translate = source.translate;
|
|
53
|
+
target.scale = source.scale;
|
|
54
|
+
target.origin = source.origin;
|
|
55
|
+
target.originPoint = source.originPoint;
|
|
56
|
+
}
|
|
57
|
+
function copyDeltaInto(target, source) {
|
|
58
|
+
copyAxisDeltaInto(target.x, source.x);
|
|
59
|
+
copyAxisDeltaInto(target.y, source.y);
|
|
60
|
+
}
|
|
61
|
+
function buildProjectionTransform(delta, layoutConfig) {
|
|
62
|
+
let transform = '';
|
|
63
|
+
if (delta.x.translate || delta.y.translate) {
|
|
64
|
+
transform = `translate3d(${delta.x.translate}px, ${delta.y.translate}px, 0)`;
|
|
65
|
+
}
|
|
66
|
+
if (layoutConfig.size !== false && (delta.x.scale !== 1 || delta.y.scale !== 1)) {
|
|
67
|
+
transform += transform ? ' ' : '';
|
|
68
|
+
transform += `scale(${delta.x.scale}, ${delta.y.scale})`;
|
|
69
|
+
}
|
|
70
|
+
return transform || 'none';
|
|
71
|
+
}
|
|
72
|
+
function buildTransformOrigin(delta) {
|
|
73
|
+
return `${delta.x.origin * 100}% ${delta.y.origin * 100}%`;
|
|
74
|
+
}
|
|
75
|
+
function rectToBox(rect) {
|
|
76
|
+
return {
|
|
77
|
+
x: { min: rect.left, max: rect.right },
|
|
78
|
+
y: { min: rect.top, max: rect.bottom },
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function measureNaturalBox(node) {
|
|
82
|
+
let prevTransform = node.style.transform;
|
|
83
|
+
let prevOrigin = node.style.transformOrigin;
|
|
84
|
+
node.style.transform = 'none';
|
|
85
|
+
node.style.transformOrigin = '';
|
|
86
|
+
let rect = node.getBoundingClientRect();
|
|
87
|
+
node.style.transform = prevTransform;
|
|
88
|
+
node.style.transformOrigin = prevOrigin;
|
|
89
|
+
return rectToBox(rect);
|
|
90
|
+
}
|
|
91
|
+
function resolveLayoutConfig(config) {
|
|
92
|
+
if (!config)
|
|
93
|
+
return null;
|
|
94
|
+
if (config === true)
|
|
95
|
+
return {};
|
|
96
|
+
return config;
|
|
97
|
+
}
|
|
98
|
+
function isVisualDeltaZero(delta, layoutConfig) {
|
|
99
|
+
return (isNear(delta.x.translate, 0, TRANSLATE_PRECISION) &&
|
|
100
|
+
isNear(delta.y.translate, 0, TRANSLATE_PRECISION) &&
|
|
101
|
+
(layoutConfig.size === false ||
|
|
102
|
+
(isNear(delta.x.scale, 1, SCALE_PRECISION) && isNear(delta.y.scale, 1, SCALE_PRECISION))));
|
|
103
|
+
}
|
|
104
|
+
const animateLayoutMixin = createMixin((handle) => {
|
|
105
|
+
let snapshot = null;
|
|
106
|
+
let currentConfig = true;
|
|
107
|
+
let currentDelta = null;
|
|
108
|
+
let animationProgress = 0;
|
|
109
|
+
let animation = null;
|
|
110
|
+
let scheduleProgressTracking = (duration, active) => {
|
|
111
|
+
let start = performance.now();
|
|
112
|
+
let tick = () => {
|
|
113
|
+
if (animation !== active)
|
|
114
|
+
return;
|
|
115
|
+
animationProgress = Math.min(1, (performance.now() - start) / duration);
|
|
116
|
+
if (animationProgress < 1) {
|
|
117
|
+
requestAnimationFrame(tick);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
requestAnimationFrame(tick);
|
|
121
|
+
};
|
|
122
|
+
let clearProjectionStyles = (node) => {
|
|
123
|
+
node.style.transform = '';
|
|
124
|
+
node.style.transformOrigin = '';
|
|
125
|
+
};
|
|
126
|
+
let resetAnimation = () => {
|
|
127
|
+
animation = null;
|
|
128
|
+
currentDelta = null;
|
|
129
|
+
animationProgress = 0;
|
|
130
|
+
};
|
|
131
|
+
handle.addEventListener('beforeUpdate', (event) => {
|
|
132
|
+
let layoutConfig = resolveLayoutConfig(currentConfig);
|
|
133
|
+
if (!layoutConfig)
|
|
134
|
+
return;
|
|
135
|
+
snapshot = measureNaturalBox(event.node);
|
|
136
|
+
});
|
|
137
|
+
handle.addEventListener('commit', (event) => {
|
|
138
|
+
let layoutConfig = resolveLayoutConfig(currentConfig);
|
|
139
|
+
let htmlNode = event.node;
|
|
140
|
+
let latest = measureNaturalBox(htmlNode);
|
|
141
|
+
if (!layoutConfig) {
|
|
142
|
+
animation?.cancel();
|
|
143
|
+
clearProjectionStyles(htmlNode);
|
|
144
|
+
resetAnimation();
|
|
145
|
+
snapshot = latest;
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if (!snapshot) {
|
|
149
|
+
snapshot = latest;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
let targetDelta = createDelta();
|
|
153
|
+
calcBoxDelta(targetDelta, latest, snapshot, layoutConfig);
|
|
154
|
+
if (isVisualDeltaZero(targetDelta, layoutConfig)) {
|
|
155
|
+
snapshot = latest;
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (animation && animation.playState === 'running') {
|
|
159
|
+
animation.cancel();
|
|
160
|
+
if (currentDelta && animationProgress > 0 && animationProgress < 1) {
|
|
161
|
+
let visual = createDelta();
|
|
162
|
+
mixDelta(visual, currentDelta, animationProgress);
|
|
163
|
+
targetDelta.x.translate += visual.x.translate;
|
|
164
|
+
targetDelta.y.translate += visual.y.translate;
|
|
165
|
+
targetDelta.x.scale *= visual.x.scale;
|
|
166
|
+
targetDelta.y.scale *= visual.y.scale;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (!currentDelta)
|
|
170
|
+
currentDelta = createDelta();
|
|
171
|
+
copyDeltaInto(currentDelta, targetDelta);
|
|
172
|
+
animationProgress = 0;
|
|
173
|
+
let invert = buildProjectionTransform(targetDelta, layoutConfig);
|
|
174
|
+
let origin = buildTransformOrigin(targetDelta);
|
|
175
|
+
htmlNode.style.transform = invert;
|
|
176
|
+
htmlNode.style.transformOrigin = origin;
|
|
177
|
+
let duration = layoutConfig.duration ?? DEFAULT_DURATION;
|
|
178
|
+
let easing = layoutConfig.easing ?? DEFAULT_EASING;
|
|
179
|
+
let active = htmlNode.animate([
|
|
180
|
+
{ transform: invert, transformOrigin: origin },
|
|
181
|
+
{ transform: 'none', transformOrigin: origin },
|
|
182
|
+
], { duration, easing, fill: 'forwards' });
|
|
183
|
+
animation = active;
|
|
184
|
+
scheduleProgressTracking(duration, active);
|
|
185
|
+
active.finished
|
|
186
|
+
.then(() => {
|
|
187
|
+
if (animation !== active)
|
|
188
|
+
return;
|
|
189
|
+
clearProjectionStyles(htmlNode);
|
|
190
|
+
resetAnimation();
|
|
191
|
+
snapshot = rectToBox(htmlNode.getBoundingClientRect());
|
|
192
|
+
})
|
|
193
|
+
.catch(() => { });
|
|
194
|
+
});
|
|
195
|
+
handle.addEventListener('remove', () => {
|
|
196
|
+
animation?.cancel();
|
|
197
|
+
resetAnimation();
|
|
198
|
+
snapshot = null;
|
|
199
|
+
});
|
|
200
|
+
return (config = true) => {
|
|
201
|
+
currentConfig = config;
|
|
202
|
+
return handle.element;
|
|
203
|
+
};
|
|
204
|
+
});
|
|
205
|
+
/**
|
|
206
|
+
* Animates layout changes for an element using FLIP-style transforms.
|
|
207
|
+
*
|
|
208
|
+
* @param config Layout animation configuration.
|
|
209
|
+
* @returns A mixin descriptor for the target element.
|
|
210
|
+
*/
|
|
211
|
+
export function animateLayout(config = true) {
|
|
212
|
+
return animateLayoutMixin(config);
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=animate-layout-mixin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animate-layout-mixin.js","sourceRoot":"","sources":["../../src/animation/animate-layout-mixin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ElementProps } from '../runtime/jsx.ts';
|
|
2
|
+
import type { MixinDescriptor } from '../runtime/mixins/mixin.ts';
|
|
3
|
+
type AnimateTiming = {
|
|
4
|
+
duration: number;
|
|
5
|
+
easing?: string;
|
|
6
|
+
delay?: number;
|
|
7
|
+
composite?: CompositeOperation;
|
|
8
|
+
initial?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type AnimateStyleProps = {
|
|
11
|
+
[property: string]: unknown;
|
|
12
|
+
};
|
|
13
|
+
export type AnimateMixinConfig = AnimateTiming & AnimateStyleProps;
|
|
14
|
+
type AnimationConfig = true | false | null | undefined | AnimateMixinConfig;
|
|
15
|
+
/**
|
|
16
|
+
* Animates an element when it is inserted into the DOM.
|
|
17
|
+
*
|
|
18
|
+
* @param config Entrance animation configuration.
|
|
19
|
+
* @returns A mixin descriptor for the target element.
|
|
20
|
+
*/
|
|
21
|
+
export declare function animateEntrance<target extends EventTarget = Element>(config?: AnimationConfig): MixinDescriptor<target, [AnimationConfig], ElementProps>;
|
|
22
|
+
/**
|
|
23
|
+
* Animates an element when it is removed from the DOM.
|
|
24
|
+
*
|
|
25
|
+
* @param config Exit animation configuration.
|
|
26
|
+
* @returns A mixin descriptor for the target element.
|
|
27
|
+
*/
|
|
28
|
+
export declare function animateExit<target extends EventTarget = Element>(config?: AnimationConfig): MixinDescriptor<target, [AnimationConfig], ElementProps>;
|
|
29
|
+
export {};
|