@remix-run/ui 0.0.0 → 0.1.1
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 +920 -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 +32 -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 +28 -0
- package/dist/runtime/navigation.js +107 -0
- package/dist/runtime/navigation.js.map +1 -0
- package/dist/runtime/reconcile.d.ts +11 -0
- package/dist/runtime/reconcile.js +1262 -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 +195 -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 +46 -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 +1011 -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 +124 -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 +1218 -0
- package/src/runtime/invariant.ts +31 -0
- package/src/runtime/jsx.ts +397 -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 +148 -0
- package/src/runtime/reconcile.ts +1757 -0
- package/src/runtime/render.ts +101 -0
- package/src/runtime/run.ts +100 -0
- package/src/runtime/scheduler.ts +269 -0
- package/src/runtime/svg-attributes.ts +133 -0
- package/src/runtime/to-vnode.ts +51 -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 +1347 -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/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
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { createMixin } from "../runtime/mixins/mixin.js";
|
|
2
|
+
import { invariant } from "../runtime/invariant.js";
|
|
3
|
+
const DEFAULT_ENTER = {
|
|
4
|
+
opacity: 0,
|
|
5
|
+
duration: 150,
|
|
6
|
+
easing: 'ease-out',
|
|
7
|
+
};
|
|
8
|
+
const DEFAULT_EXIT = {
|
|
9
|
+
opacity: 0,
|
|
10
|
+
duration: 150,
|
|
11
|
+
easing: 'ease-in',
|
|
12
|
+
};
|
|
13
|
+
const animatingNodes = new WeakMap();
|
|
14
|
+
const initialEntranceSeenByParent = new WeakMap();
|
|
15
|
+
function extractStyleProps(config) {
|
|
16
|
+
let result = {};
|
|
17
|
+
for (let key in config) {
|
|
18
|
+
if (key === 'duration' ||
|
|
19
|
+
key === 'easing' ||
|
|
20
|
+
key === 'delay' ||
|
|
21
|
+
key === 'composite' ||
|
|
22
|
+
key === 'initial') {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
let value = config[key];
|
|
26
|
+
if (value === undefined)
|
|
27
|
+
continue;
|
|
28
|
+
if (typeof value !== 'string' && typeof value !== 'number')
|
|
29
|
+
continue;
|
|
30
|
+
result[key] = value;
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
function buildEnterKeyframes(config) {
|
|
35
|
+
let keyframe = extractStyleProps(config);
|
|
36
|
+
return [keyframe, {}];
|
|
37
|
+
}
|
|
38
|
+
function buildExitKeyframes(config) {
|
|
39
|
+
let keyframe = extractStyleProps(config);
|
|
40
|
+
return [{}, keyframe];
|
|
41
|
+
}
|
|
42
|
+
function resolveEnterConfig(config) {
|
|
43
|
+
if (!config)
|
|
44
|
+
return null;
|
|
45
|
+
if (config === true)
|
|
46
|
+
return DEFAULT_ENTER;
|
|
47
|
+
return config;
|
|
48
|
+
}
|
|
49
|
+
function resolveExitConfig(config) {
|
|
50
|
+
if (!config)
|
|
51
|
+
return null;
|
|
52
|
+
if (config === true)
|
|
53
|
+
return DEFAULT_EXIT;
|
|
54
|
+
return config;
|
|
55
|
+
}
|
|
56
|
+
function createAnimationOptions(config, fill) {
|
|
57
|
+
return {
|
|
58
|
+
duration: config.duration,
|
|
59
|
+
delay: config.delay,
|
|
60
|
+
easing: config.easing,
|
|
61
|
+
composite: config.composite,
|
|
62
|
+
fill,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function collectAnimatedProperties(keyframes) {
|
|
66
|
+
let properties = new Set();
|
|
67
|
+
for (let keyframe of keyframes) {
|
|
68
|
+
for (let key in keyframe) {
|
|
69
|
+
if (key === 'offset' || key === 'easing' || key === 'composite')
|
|
70
|
+
continue;
|
|
71
|
+
properties.add(key);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return [...properties];
|
|
75
|
+
}
|
|
76
|
+
function toCssPropertyName(property) {
|
|
77
|
+
return property.includes('-')
|
|
78
|
+
? property
|
|
79
|
+
: property.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`);
|
|
80
|
+
}
|
|
81
|
+
function readInlineStyle(style, property) {
|
|
82
|
+
return style.getPropertyValue(toCssPropertyName(property));
|
|
83
|
+
}
|
|
84
|
+
function writeInlineStyle(style, property, value) {
|
|
85
|
+
let cssProperty = toCssPropertyName(property);
|
|
86
|
+
if (value === '') {
|
|
87
|
+
style.removeProperty(cssProperty);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
style.setProperty(cssProperty, value);
|
|
91
|
+
}
|
|
92
|
+
function trackAnimation(node, animation, keyframes) {
|
|
93
|
+
let properties = collectAnimatedProperties(keyframes);
|
|
94
|
+
animatingNodes.set(node, { animation, properties });
|
|
95
|
+
animation.finished
|
|
96
|
+
.catch(() => { })
|
|
97
|
+
.finally(() => {
|
|
98
|
+
let current = animatingNodes.get(node);
|
|
99
|
+
if (current?.animation !== animation)
|
|
100
|
+
return;
|
|
101
|
+
animatingNodes.delete(node);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function waitForAnimationOrAbort(animation, signal) {
|
|
105
|
+
if (signal.aborted)
|
|
106
|
+
return Promise.resolve();
|
|
107
|
+
return new Promise((resolve) => {
|
|
108
|
+
let settled = false;
|
|
109
|
+
let settle = () => {
|
|
110
|
+
if (settled)
|
|
111
|
+
return;
|
|
112
|
+
settled = true;
|
|
113
|
+
signal.removeEventListener('abort', settle);
|
|
114
|
+
resolve();
|
|
115
|
+
};
|
|
116
|
+
signal.addEventListener('abort', settle, { once: true });
|
|
117
|
+
void animation.finished.catch(() => { }).finally(settle);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function shouldSkipInitialEntrance(event, config) {
|
|
121
|
+
if (config.initial !== false)
|
|
122
|
+
return false;
|
|
123
|
+
if (event.key == null)
|
|
124
|
+
return false;
|
|
125
|
+
let seenForParent = initialEntranceSeenByParent.get(event.parent);
|
|
126
|
+
if (!seenForParent) {
|
|
127
|
+
seenForParent = new Set();
|
|
128
|
+
initialEntranceSeenByParent.set(event.parent, seenForParent);
|
|
129
|
+
}
|
|
130
|
+
if (seenForParent.has(event.key))
|
|
131
|
+
return false;
|
|
132
|
+
seenForParent.add(event.key);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
const animateEntranceMixin = createMixin((handle) => {
|
|
136
|
+
let currentConfig = true;
|
|
137
|
+
handle.addEventListener('insert', (event) => {
|
|
138
|
+
let node = event.node;
|
|
139
|
+
let current = animatingNodes.get(node);
|
|
140
|
+
if (current && current.animation.playState === 'running') {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
let config = resolveEnterConfig(currentConfig);
|
|
144
|
+
if (!config)
|
|
145
|
+
return;
|
|
146
|
+
if (shouldSkipInitialEntrance(event, config))
|
|
147
|
+
return;
|
|
148
|
+
let keyframes = buildEnterKeyframes(config);
|
|
149
|
+
let options = createAnimationOptions(config, 'backwards');
|
|
150
|
+
let animation = node.animate(keyframes, options);
|
|
151
|
+
trackAnimation(node, animation, keyframes);
|
|
152
|
+
});
|
|
153
|
+
return (config) => {
|
|
154
|
+
currentConfig = config;
|
|
155
|
+
return handle.element;
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
const animateExitMixin = createMixin((handle) => {
|
|
159
|
+
let currentConfig = true;
|
|
160
|
+
let node = null;
|
|
161
|
+
handle.addEventListener('insert', (event) => {
|
|
162
|
+
node = event.node;
|
|
163
|
+
});
|
|
164
|
+
handle.addEventListener('reclaimed', (event) => {
|
|
165
|
+
node = event.node;
|
|
166
|
+
let current = animatingNodes.get(event.node);
|
|
167
|
+
if (current && current.animation.playState === 'running') {
|
|
168
|
+
// WAAPI can throw InvalidStateError here if the target is transiently non-rendered
|
|
169
|
+
// during reclaim; we still have computed-style fallback below for retargeting.
|
|
170
|
+
try {
|
|
171
|
+
current.animation.commitStyles();
|
|
172
|
+
}
|
|
173
|
+
catch { }
|
|
174
|
+
current.animation.cancel();
|
|
175
|
+
let style = event.node.style;
|
|
176
|
+
let computed = getComputedStyle(event.node);
|
|
177
|
+
let from = {};
|
|
178
|
+
for (let property of current.properties) {
|
|
179
|
+
let cssProperty = toCssPropertyName(property);
|
|
180
|
+
let value = readInlineStyle(style, property) || computed.getPropertyValue(cssProperty);
|
|
181
|
+
if (value !== '') {
|
|
182
|
+
from[property] = value;
|
|
183
|
+
}
|
|
184
|
+
writeInlineStyle(style, property, '');
|
|
185
|
+
}
|
|
186
|
+
let enterConfig = resolveEnterConfig(currentConfig) ?? DEFAULT_ENTER;
|
|
187
|
+
let keyframes = [from, {}];
|
|
188
|
+
let options = createAnimationOptions(enterConfig, 'none');
|
|
189
|
+
let animation = event.node.animate(keyframes, options);
|
|
190
|
+
trackAnimation(event.node, animation, keyframes);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
handle.addEventListener('beforeRemove', (event) => {
|
|
194
|
+
let config = resolveExitConfig(currentConfig);
|
|
195
|
+
if (!config)
|
|
196
|
+
return;
|
|
197
|
+
event.persistNode(async (signal) => {
|
|
198
|
+
invariant(node);
|
|
199
|
+
let current = animatingNodes.get(node);
|
|
200
|
+
if (current && current.animation.playState === 'running') {
|
|
201
|
+
current.animation.reverse();
|
|
202
|
+
await waitForAnimationOrAbort(current.animation, signal);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
let keyframes = buildExitKeyframes(config);
|
|
206
|
+
let options = createAnimationOptions(config, 'forwards');
|
|
207
|
+
let animation = node.animate(keyframes, options);
|
|
208
|
+
trackAnimation(node, animation, keyframes);
|
|
209
|
+
await waitForAnimationOrAbort(animation, signal);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
return (config) => {
|
|
213
|
+
currentConfig = config;
|
|
214
|
+
return handle.element;
|
|
215
|
+
};
|
|
216
|
+
});
|
|
217
|
+
/**
|
|
218
|
+
* Animates an element when it is inserted into the DOM.
|
|
219
|
+
*
|
|
220
|
+
* @param config Entrance animation configuration.
|
|
221
|
+
* @returns A mixin descriptor for the target element.
|
|
222
|
+
*/
|
|
223
|
+
export function animateEntrance(config = true) {
|
|
224
|
+
return animateEntranceMixin(config);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Animates an element when it is removed from the DOM.
|
|
228
|
+
*
|
|
229
|
+
* @param config Exit animation configuration.
|
|
230
|
+
* @returns A mixin descriptor for the target element.
|
|
231
|
+
*/
|
|
232
|
+
export function animateExit(config = true) {
|
|
233
|
+
return animateExitMixin(config);
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=animate-mixins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animate-mixins.js","sourceRoot":"","sources":["../../src/animation/animate-mixins.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { animateEntrance, animateExit } from './animate-mixins.ts';
|
|
2
|
+
export { animateLayout } from './animate-layout-mixin.ts';
|
|
3
|
+
export { spring } from './spring.ts';
|
|
4
|
+
export type { SpringIterator, SpringPreset, SpringOptions } from './spring.ts';
|
|
5
|
+
export { tween, easings } from './tween.ts';
|
|
6
|
+
export type { TweenOptions, BezierCurve } from './tween.ts';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/animation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spring physics based on SwiftUI's spring math.
|
|
3
|
+
*
|
|
4
|
+
* Returns a decorated iterator that can be:
|
|
5
|
+
* - Iterated to get position values (0→1)
|
|
6
|
+
* - Spread for WAAPI: { ...spring() }
|
|
7
|
+
* - Stringified for CSS: `transform ${spring()}`
|
|
8
|
+
*
|
|
9
|
+
* Spring Parameter Conversion (SwiftUI formulas, mass = 1):
|
|
10
|
+
* stiffness = (2π ÷ duration)²
|
|
11
|
+
* damping = 1 - 4π × bounce ÷ duration (bounce ≥ 0)
|
|
12
|
+
* damping = 4π ÷ (duration + 4π × bounce) (bounce < 0)
|
|
13
|
+
*/
|
|
14
|
+
export type SpringPreset = 'smooth' | 'snappy' | 'bouncy';
|
|
15
|
+
/**
|
|
16
|
+
* Options for generating a spring easing iterator.
|
|
17
|
+
*/
|
|
18
|
+
export interface SpringOptions {
|
|
19
|
+
/** Perceptual duration in milliseconds used to derive spring stiffness. */
|
|
20
|
+
duration?: number;
|
|
21
|
+
/** Spring bounce amount from overdamped (`< 0`) to bouncy (`> 0`). */
|
|
22
|
+
bounce?: number;
|
|
23
|
+
/** Initial velocity in units per second. */
|
|
24
|
+
velocity?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Iterator returned by {@link spring}, decorated for CSS and WAAPI use.
|
|
28
|
+
*/
|
|
29
|
+
export interface SpringIterator extends IterableIterator<number> {
|
|
30
|
+
/** Time when spring settles to rest (milliseconds) */
|
|
31
|
+
duration: number;
|
|
32
|
+
/** CSS linear() easing function */
|
|
33
|
+
easing: string;
|
|
34
|
+
/** Returns "duration ms linear(...)" for CSS transitions */
|
|
35
|
+
toString(): string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create a spring iterator for animations.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* let s = spring('bouncy')
|
|
42
|
+
*
|
|
43
|
+
* // As CSS transition
|
|
44
|
+
* element.style.transition = `transform ${s}`
|
|
45
|
+
*
|
|
46
|
+
* // Spread for WAAPI
|
|
47
|
+
* element.animate(keyframes, { ...spring() })
|
|
48
|
+
*
|
|
49
|
+
* // Iterate for JS animation
|
|
50
|
+
* for (let position of spring()) {
|
|
51
|
+
* element.style.transform = `translateX(${position * 100}px)`
|
|
52
|
+
* }
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* Creates a spring iterator from a named preset.
|
|
56
|
+
*
|
|
57
|
+
* @param preset Preset spring profile to start from.
|
|
58
|
+
* @param overrides Optional preset overrides.
|
|
59
|
+
* @returns A spring iterator.
|
|
60
|
+
*/
|
|
61
|
+
export declare function spring(preset: SpringPreset, overrides?: Omit<SpringOptions, 'bounce'>): SpringIterator;
|
|
62
|
+
/**
|
|
63
|
+
* Creates a spring iterator from explicit spring options.
|
|
64
|
+
*
|
|
65
|
+
* @param options Spring parameters.
|
|
66
|
+
* @returns A spring iterator.
|
|
67
|
+
*/
|
|
68
|
+
export declare function spring(options?: SpringOptions): SpringIterator;
|
|
69
|
+
export declare namespace spring {
|
|
70
|
+
var transition: (property: string | string[], presetOrOptions?: SpringPreset | SpringOptions, overrides?: Omit<SpringOptions, "bounce">) => string;
|
|
71
|
+
var presets: Record<SpringPreset, {
|
|
72
|
+
duration: number;
|
|
73
|
+
bounce: number;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spring physics based on SwiftUI's spring math.
|
|
3
|
+
*
|
|
4
|
+
* Returns a decorated iterator that can be:
|
|
5
|
+
* - Iterated to get position values (0→1)
|
|
6
|
+
* - Spread for WAAPI: { ...spring() }
|
|
7
|
+
* - Stringified for CSS: `transform ${spring()}`
|
|
8
|
+
*
|
|
9
|
+
* Spring Parameter Conversion (SwiftUI formulas, mass = 1):
|
|
10
|
+
* stiffness = (2π ÷ duration)²
|
|
11
|
+
* damping = 1 - 4π × bounce ÷ duration (bounce ≥ 0)
|
|
12
|
+
* damping = 4π ÷ (duration + 4π × bounce) (bounce < 0)
|
|
13
|
+
*/
|
|
14
|
+
const presets = {
|
|
15
|
+
smooth: { duration: 400, bounce: -0.3 },
|
|
16
|
+
snappy: { duration: 200, bounce: 0 },
|
|
17
|
+
bouncy: { duration: 400, bounce: 0.3 },
|
|
18
|
+
};
|
|
19
|
+
// Rest thresholds for determining when spring has settled
|
|
20
|
+
const restSpeed = 0.01;
|
|
21
|
+
const restDelta = 0.005;
|
|
22
|
+
const maxSettlingTime = 20_000;
|
|
23
|
+
const frameMs = 1000 / 60; // ~16.67ms per frame
|
|
24
|
+
export function spring(presetOrOptions, overrides) {
|
|
25
|
+
let options = resolveOptions(presetOrOptions, overrides);
|
|
26
|
+
let { position, settlingTime, easing } = computeSpring(options);
|
|
27
|
+
let duration = Math.round(settlingTime);
|
|
28
|
+
function* generator() {
|
|
29
|
+
let t = 0;
|
|
30
|
+
while (t < settlingTime) {
|
|
31
|
+
yield position(t);
|
|
32
|
+
t += frameMs;
|
|
33
|
+
}
|
|
34
|
+
yield 1;
|
|
35
|
+
}
|
|
36
|
+
let iter = generator();
|
|
37
|
+
// Decorate iterator with spring properties (enumerable for spread)
|
|
38
|
+
Object.defineProperties(iter, {
|
|
39
|
+
duration: { value: duration, enumerable: true },
|
|
40
|
+
easing: { value: easing, enumerable: true },
|
|
41
|
+
toString: {
|
|
42
|
+
value() {
|
|
43
|
+
return `${duration}ms ${easing}`;
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
return iter;
|
|
48
|
+
}
|
|
49
|
+
// Transition helper for CSS transition property
|
|
50
|
+
spring.transition = function transition(property, presetOrOptions, overrides) {
|
|
51
|
+
let s = typeof presetOrOptions === 'string'
|
|
52
|
+
? spring(presetOrOptions, overrides)
|
|
53
|
+
: spring(presetOrOptions);
|
|
54
|
+
let properties = Array.isArray(property) ? property : [property];
|
|
55
|
+
return properties.map((p) => `${p} ${s}`).join(', ');
|
|
56
|
+
};
|
|
57
|
+
// Access preset defaults
|
|
58
|
+
spring.presets = presets;
|
|
59
|
+
function resolveOptions(presetOrOptions, overrides) {
|
|
60
|
+
if (typeof presetOrOptions === 'string') {
|
|
61
|
+
let preset = presets[presetOrOptions];
|
|
62
|
+
return {
|
|
63
|
+
duration: overrides?.duration ?? preset.duration,
|
|
64
|
+
bounce: preset.bounce,
|
|
65
|
+
velocity: overrides?.velocity,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (presetOrOptions) {
|
|
69
|
+
return presetOrOptions;
|
|
70
|
+
}
|
|
71
|
+
// Default to 'snappy' preset
|
|
72
|
+
return presets.snappy;
|
|
73
|
+
}
|
|
74
|
+
// Core spring computation
|
|
75
|
+
function computeSpring(options) {
|
|
76
|
+
let { duration: durationMs = 300, bounce = 0, velocity = 0 } = options;
|
|
77
|
+
// Convert duration to seconds for physics calculations
|
|
78
|
+
let durationSec = durationMs / 1000;
|
|
79
|
+
// Natural frequency: ω₀ = √(stiffness) = 2π / duration
|
|
80
|
+
let omega0 = (2 * Math.PI) / durationSec;
|
|
81
|
+
// Clamp bounce to valid range
|
|
82
|
+
bounce = Math.max(-1, Math.min(0.95, bounce));
|
|
83
|
+
// Damping ratio (ζ):
|
|
84
|
+
// bounce >= 0: ζ = 1 - bounce (linear, 0→1 maps to critical→underdamped)
|
|
85
|
+
// bounce < 0: ζ = 1 / (1 + bounce) (stronger overdamping as bounce→-1)
|
|
86
|
+
let zeta = bounce >= 0 ? 1 - bounce : 1 / (1 + bounce);
|
|
87
|
+
// Convert to per-millisecond for time calculations
|
|
88
|
+
let omega0Ms = omega0 / 1000;
|
|
89
|
+
let velocityMs = -velocity / 1000; // negated for spring equation convention
|
|
90
|
+
// Position function based on damping regime
|
|
91
|
+
let position;
|
|
92
|
+
if (zeta < 1) {
|
|
93
|
+
// Underdamped (bouncy) - oscillates around target
|
|
94
|
+
let omegaD = omega0Ms * Math.sqrt(1 - zeta * zeta);
|
|
95
|
+
position = (t) => {
|
|
96
|
+
let envelope = Math.exp(-zeta * omega0Ms * t);
|
|
97
|
+
return (1 -
|
|
98
|
+
envelope *
|
|
99
|
+
(((velocityMs + zeta * omega0Ms) / omegaD) * Math.sin(omegaD * t) + Math.cos(omegaD * t)));
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
else if (zeta > 1) {
|
|
103
|
+
// Overdamped (smooth) - no oscillation, two decay rates
|
|
104
|
+
let sqrtTerm = Math.sqrt(zeta * zeta - 1);
|
|
105
|
+
let s1 = omega0Ms * (-zeta + sqrtTerm); // slower decay
|
|
106
|
+
let s2 = omega0Ms * (-zeta - sqrtTerm); // faster decay
|
|
107
|
+
let A = (s2 + velocityMs) / (s2 - s1);
|
|
108
|
+
let B = 1 - A;
|
|
109
|
+
position = (t) => 1 - A * Math.exp(s1 * t) - B * Math.exp(s2 * t);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// Critically damped - fastest approach without oscillation
|
|
113
|
+
position = (t) => 1 - Math.exp(-omega0Ms * t) * (1 + (velocityMs + omega0Ms) * t);
|
|
114
|
+
}
|
|
115
|
+
// Velocity via numerical differentiation (units per second)
|
|
116
|
+
let velocitySampleMs = 0.5;
|
|
117
|
+
function velocityAt(t) {
|
|
118
|
+
if (t < velocitySampleMs) {
|
|
119
|
+
return ((position(velocitySampleMs) - position(0)) / velocitySampleMs) * 1000;
|
|
120
|
+
}
|
|
121
|
+
return ((position(t) - position(t - velocitySampleMs)) / velocitySampleMs) * 1000;
|
|
122
|
+
}
|
|
123
|
+
// Find settling time
|
|
124
|
+
let settlingTime = maxSettlingTime;
|
|
125
|
+
let step = 50;
|
|
126
|
+
for (let t = 0; t < maxSettlingTime; t += step) {
|
|
127
|
+
let pos = position(t);
|
|
128
|
+
let vel = Math.abs(velocityAt(t));
|
|
129
|
+
let displacement = Math.abs(1 - pos);
|
|
130
|
+
if (vel <= restSpeed && displacement <= restDelta) {
|
|
131
|
+
settlingTime = t;
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// Generate CSS easing
|
|
136
|
+
let easing = generateEasing(position, settlingTime);
|
|
137
|
+
return { position, settlingTime, easing };
|
|
138
|
+
}
|
|
139
|
+
// Generate CSS linear() easing with adaptive sampling
|
|
140
|
+
function generateEasing(position, settlingTime) {
|
|
141
|
+
let points = adaptiveSample(position, settlingTime);
|
|
142
|
+
return `linear(${points
|
|
143
|
+
.map((p, i) => {
|
|
144
|
+
let isLast = i === points.length - 1;
|
|
145
|
+
let value = isLast ? 1 : Math.round(p.value * 10000) / 10000;
|
|
146
|
+
if (i === 0 || isLast) {
|
|
147
|
+
return value === 1 ? '1' : value.toString();
|
|
148
|
+
}
|
|
149
|
+
let percent = Math.round((p.t / settlingTime) * 1000) / 10;
|
|
150
|
+
return `${value} ${percent}%`;
|
|
151
|
+
})
|
|
152
|
+
.join(', ')})`;
|
|
153
|
+
}
|
|
154
|
+
// Adaptive sampling - more points where curvature is high, fewer where linear
|
|
155
|
+
function adaptiveSample(resolve, duration, tolerance = 0.002, minSegment = 8) {
|
|
156
|
+
let points = [];
|
|
157
|
+
function addPoint(t, value) {
|
|
158
|
+
if (points.length === 0 || points[points.length - 1].t < t) {
|
|
159
|
+
points.push({ t, value });
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function subdivide(t0, v0, t1, v1, depth = 0) {
|
|
163
|
+
if (depth > 12) {
|
|
164
|
+
addPoint(t0, v0);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
let tMid = (t0 + t1) / 2;
|
|
168
|
+
let vMid = resolve(tMid);
|
|
169
|
+
let vLinear = (v0 + v1) / 2;
|
|
170
|
+
let error = Math.abs(vMid - vLinear);
|
|
171
|
+
if (error > tolerance && t1 - t0 > minSegment) {
|
|
172
|
+
subdivide(t0, v0, tMid, vMid, depth + 1);
|
|
173
|
+
subdivide(tMid, vMid, t1, v1, depth + 1);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
addPoint(t0, v0);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
subdivide(0, resolve(0), duration, resolve(duration));
|
|
180
|
+
addPoint(duration, resolve(duration));
|
|
181
|
+
return points;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=spring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring.js","sourceRoot":"","sources":["../../src/animation/spring.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cubic-bezier control points used by {@link tween}.
|
|
3
|
+
*/
|
|
4
|
+
export interface BezierCurve {
|
|
5
|
+
/** First control point x coordinate. */
|
|
6
|
+
x1: number;
|
|
7
|
+
/** First control point y coordinate. */
|
|
8
|
+
y1: number;
|
|
9
|
+
/** Second control point x coordinate. */
|
|
10
|
+
x2: number;
|
|
11
|
+
/** Second control point y coordinate. */
|
|
12
|
+
y2: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Common cubic-bezier presets for {@link tween}.
|
|
16
|
+
*/
|
|
17
|
+
export declare const easings: {
|
|
18
|
+
readonly linear: {
|
|
19
|
+
readonly x1: 0;
|
|
20
|
+
readonly y1: 0;
|
|
21
|
+
readonly x2: 1;
|
|
22
|
+
readonly y2: 1;
|
|
23
|
+
};
|
|
24
|
+
readonly ease: {
|
|
25
|
+
readonly x1: 0.25;
|
|
26
|
+
readonly y1: 0.1;
|
|
27
|
+
readonly x2: 0.25;
|
|
28
|
+
readonly y2: 1;
|
|
29
|
+
};
|
|
30
|
+
readonly easeIn: {
|
|
31
|
+
readonly x1: 0.42;
|
|
32
|
+
readonly y1: 0;
|
|
33
|
+
readonly x2: 1;
|
|
34
|
+
readonly y2: 1;
|
|
35
|
+
};
|
|
36
|
+
readonly easeOut: {
|
|
37
|
+
readonly x1: 0;
|
|
38
|
+
readonly y1: 0;
|
|
39
|
+
readonly x2: 0.58;
|
|
40
|
+
readonly y2: 1;
|
|
41
|
+
};
|
|
42
|
+
readonly easeInOut: {
|
|
43
|
+
readonly x1: 0.42;
|
|
44
|
+
readonly y1: 0;
|
|
45
|
+
readonly x2: 0.58;
|
|
46
|
+
readonly y2: 1;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Options for generating tweened values over time.
|
|
51
|
+
*/
|
|
52
|
+
export interface TweenOptions {
|
|
53
|
+
/** Starting value for the tween. */
|
|
54
|
+
from: number;
|
|
55
|
+
/** Ending value for the tween. */
|
|
56
|
+
to: number;
|
|
57
|
+
/** Total tween duration in milliseconds. */
|
|
58
|
+
duration: number;
|
|
59
|
+
/** Cubic-bezier curve used to shape the interpolation. */
|
|
60
|
+
curve: BezierCurve;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generator that tweens a value over time using a cubic bezier curve.
|
|
64
|
+
* Yields the current value on each frame. Use the iterator's `done` property
|
|
65
|
+
* to check if the animation is complete.
|
|
66
|
+
* @param options The tween configuration
|
|
67
|
+
* @yields The current tweened value
|
|
68
|
+
* @returns The final value
|
|
69
|
+
*/
|
|
70
|
+
export declare function tween(options: TweenOptions): Generator<number, number, number>;
|