@geometra/core 1.52.0 → 1.54.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.
@@ -0,0 +1,88 @@
1
+ import type { Signal } from './signals.js';
2
+ import type { EasingFn, TweenPlaybackState } from './animation.js';
3
+ /**
4
+ * Declarative animation choreography — `sequence`, `parallel`, and `stagger` —
5
+ * plus a scrubbable keyframe timeline. These compose any unit that implements
6
+ * {@link Choreographable} (which includes {@link TweenTimeline} and
7
+ * {@link PropertyTimeline} from `animation.ts`).
8
+ *
9
+ * Stepping is deterministic: advancing a choreography by `deltaMs` advances each
10
+ * child according to the choreography's policy. Finite `deltaMs` values are
11
+ * clamped to `>= 0`; non-finite `deltaMs` is treated as `0`, same as the base
12
+ * animation module.
13
+ */
14
+ /** Smallest surface a choreography child needs. Both {@link TweenTimeline}
15
+ * and {@link PropertyTimeline} already match. */
16
+ export interface Choreographable {
17
+ step(deltaMs: number): unknown;
18
+ state(): TweenPlaybackState;
19
+ cancel(): void;
20
+ }
21
+ /** Running choreography with the same lifecycle controls as an individual timeline. */
22
+ export interface Choreography {
23
+ /** Advance by `deltaMs` ms. Returns the current aggregate state. */
24
+ step(deltaMs: number): TweenPlaybackState;
25
+ /** Force the choreography into the cancelled state; children are also cancelled. */
26
+ cancel(): void;
27
+ /** Aggregate state: `running` if any child is running, then `paused`, then `cancelled`, then `finished`, else `idle`. */
28
+ state(): TweenPlaybackState;
29
+ }
30
+ /**
31
+ * Run children in order: each step only advances the first non-terminal child,
32
+ * carrying remainder time forward when a child finishes mid-step. A child is
33
+ * "terminal" when its state is `finished` or `cancelled`. Finite `deltaMs`
34
+ * clamped to `>= 0`, non-finite coerced to `0` (matches `animation.ts`).
35
+ *
36
+ * The returned state is the first non-terminal child's state, or `finished`
37
+ * when all children have terminated at least once.
38
+ */
39
+ export declare function sequence(children: Choreographable[]): Choreography;
40
+ /** Run all children in parallel. Each step advances every child by `deltaMs`. */
41
+ export declare function parallel(children: Choreographable[]): Choreography;
42
+ /**
43
+ * Start children at staggered intervals of `delayMs`. Each child is held at
44
+ * `idle` until its own start time is reached, then runs to completion.
45
+ * A non-finite or negative `delayMs` is clamped to `0` (all children start together).
46
+ */
47
+ export declare function stagger(children: Choreographable[], delayMs: number): Choreography;
48
+ /** One keyframe in a {@link KeyframeTimeline}. `at` is the absolute time (ms) from the timeline start. */
49
+ export interface Keyframe {
50
+ at: number;
51
+ values: Record<string, number>;
52
+ /** Optional easing applied across this keyframe's leading segment; default inherits the timeline's easing. */
53
+ easing?: EasingFn;
54
+ }
55
+ export type KeyframeTimelinePlaybackState = TweenPlaybackState;
56
+ export interface KeyframeTimeline {
57
+ /** Live signals for each tracked key. */
58
+ values: Record<string, Signal<number>>;
59
+ /** Total duration in ms (time of the last keyframe). */
60
+ duration: number;
61
+ /** Advance by `deltaMs`. */
62
+ step(deltaMs: number): Record<string, number>;
63
+ /** Jump to normalized progress `t ∈ [0, 1]` without changing play state. Values outside [0, 1] clamp. */
64
+ scrubTo(t: number): Record<string, number>;
65
+ /** Jump to absolute time in ms. Values outside [0, duration] clamp. */
66
+ scrubToMs(ms: number): Record<string, number>;
67
+ pause(): void;
68
+ resume(): void;
69
+ cancel(): void;
70
+ state(): KeyframeTimelinePlaybackState;
71
+ }
72
+ /**
73
+ * Multi-property keyframe timeline with scrub support. Keyframes are sorted by
74
+ * `at` and sampled with optional per-segment easing. Requires at least one
75
+ * keyframe; single-keyframe timelines produce a constant pose and finish
76
+ * immediately on the first step.
77
+ *
78
+ * Non-finite numeric values in keyframes are normalized to `0` (matches
79
+ * {@link finiteNumberOrZero} used throughout `animation.ts`) so corrupt JSON
80
+ * can't poison interpolation.
81
+ *
82
+ * When the global motion preference is `reduced`, the timeline jumps straight
83
+ * to the final pose and ends `finished` — same policy as `createTweenTimeline`.
84
+ */
85
+ export declare function createKeyframeTimeline(keyframes: ReadonlyArray<Keyframe>, options?: {
86
+ easing?: EasingFn;
87
+ }): KeyframeTimeline;
88
+ //# sourceMappingURL=animation-choreography.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-choreography.d.ts","sourceRoot":"","sources":["../src/animation-choreography.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAK1C,OAAO,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AAElE;;;;;;;;;;GAUG;AAEH;iDACiD;AACjD,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAA;IAC9B,KAAK,IAAI,kBAAkB,CAAA;IAC3B,MAAM,IAAI,IAAI,CAAA;CACf;AAED,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,oEAAoE;IACpE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAAA;IACzC,oFAAoF;IACpF,MAAM,IAAI,IAAI,CAAA;IACd,yHAAyH;IACzH,KAAK,IAAI,kBAAkB,CAAA;CAC5B;AAyBD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,YAAY,CAwClE;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,YAAY,CAsBlE;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CA6BlF;AAED,0GAA0G;AAC1G,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,8GAA8G;IAC9G,MAAM,CAAC,EAAE,QAAQ,CAAA;CAClB;AAED,MAAM,MAAM,6BAA6B,GAAG,kBAAkB,CAAA;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACtC,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,4BAA4B;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,yGAAyG;IACzG,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1C,uEAAuE;IACvE,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7C,KAAK,IAAI,IAAI,CAAA;IACb,MAAM,IAAI,IAAI,CAAA;IACd,MAAM,IAAI,IAAI,CAAA;IACd,KAAK,IAAI,6BAA6B,CAAA;CACvC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,aAAa,CAAC,QAAQ,CAAC,EAClC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,QAAQ,CAAA;CAAO,GAClC,gBAAgB,CAmFlB"}
@@ -0,0 +1,283 @@
1
+ import { finiteNumberOrZero } from './layout-bounds.js';
2
+ import { signal } from './signals.js';
3
+ import { easing, getMotionPreference, } from './animation.js';
4
+ function clampDelta(deltaMs) {
5
+ return typeof deltaMs === 'number' && Number.isFinite(deltaMs) ? Math.max(0, deltaMs) : 0;
6
+ }
7
+ function aggregateState(children) {
8
+ let hasRunning = false;
9
+ let hasPaused = false;
10
+ let hasCancelled = false;
11
+ let hasFinished = false;
12
+ for (const child of children) {
13
+ const s = child.state();
14
+ hasRunning = hasRunning || s === 'running';
15
+ hasPaused = hasPaused || s === 'paused';
16
+ hasCancelled = hasCancelled || s === 'cancelled';
17
+ hasFinished = hasFinished || s === 'finished';
18
+ }
19
+ if (hasRunning)
20
+ return 'running';
21
+ if (hasPaused)
22
+ return 'paused';
23
+ if (hasCancelled)
24
+ return 'cancelled';
25
+ if (hasFinished)
26
+ return 'finished';
27
+ return 'idle';
28
+ }
29
+ /**
30
+ * Run children in order: each step only advances the first non-terminal child,
31
+ * carrying remainder time forward when a child finishes mid-step. A child is
32
+ * "terminal" when its state is `finished` or `cancelled`. Finite `deltaMs`
33
+ * clamped to `>= 0`, non-finite coerced to `0` (matches `animation.ts`).
34
+ *
35
+ * The returned state is the first non-terminal child's state, or `finished`
36
+ * when all children have terminated at least once.
37
+ */
38
+ export function sequence(children) {
39
+ const items = [...children];
40
+ let index = 0;
41
+ let cancelled = false;
42
+ function step(deltaMs) {
43
+ if (cancelled)
44
+ return 'cancelled';
45
+ let remaining = clampDelta(deltaMs);
46
+ // Advance as many finished children as the budget allows. We give a child
47
+ // up to `remaining` ms; if it finishes and still has budget left, roll over
48
+ // to the next child. We don't know exactly how much of `remaining` the
49
+ // child consumed, so we treat a finishing step as consuming the whole slice.
50
+ // Callers that need frame-exact splitting should use a keyframe timeline.
51
+ while (index < items.length) {
52
+ const child = items[index];
53
+ const before = child.state();
54
+ if (before === 'finished' || before === 'cancelled') {
55
+ index += 1;
56
+ continue;
57
+ }
58
+ child.step(remaining);
59
+ if (child.state() === 'running' || child.state() === 'paused')
60
+ break;
61
+ index += 1;
62
+ remaining = 0;
63
+ }
64
+ return state();
65
+ }
66
+ function cancel() {
67
+ cancelled = true;
68
+ for (const child of items)
69
+ child.cancel();
70
+ }
71
+ function state() {
72
+ if (cancelled)
73
+ return 'cancelled';
74
+ if (index >= items.length)
75
+ return items.length === 0 ? 'idle' : 'finished';
76
+ return items[index].state();
77
+ }
78
+ return { step, cancel, state };
79
+ }
80
+ /** Run all children in parallel. Each step advances every child by `deltaMs`. */
81
+ export function parallel(children) {
82
+ const items = [...children];
83
+ let cancelled = false;
84
+ function step(deltaMs) {
85
+ if (cancelled)
86
+ return 'cancelled';
87
+ const d = clampDelta(deltaMs);
88
+ for (const child of items)
89
+ child.step(d);
90
+ return aggregateState(items);
91
+ }
92
+ function cancel() {
93
+ cancelled = true;
94
+ for (const child of items)
95
+ child.cancel();
96
+ }
97
+ function state() {
98
+ if (cancelled)
99
+ return 'cancelled';
100
+ return aggregateState(items);
101
+ }
102
+ return { step, cancel, state };
103
+ }
104
+ /**
105
+ * Start children at staggered intervals of `delayMs`. Each child is held at
106
+ * `idle` until its own start time is reached, then runs to completion.
107
+ * A non-finite or negative `delayMs` is clamped to `0` (all children start together).
108
+ */
109
+ export function stagger(children, delayMs) {
110
+ const items = [...children];
111
+ const gap = typeof delayMs === 'number' && Number.isFinite(delayMs) && delayMs > 0 ? delayMs : 0;
112
+ const startsAt = items.map((_, i) => i * gap);
113
+ let elapsed = 0;
114
+ let cancelled = false;
115
+ function step(deltaMs) {
116
+ if (cancelled)
117
+ return 'cancelled';
118
+ elapsed += clampDelta(deltaMs);
119
+ for (let i = 0; i < items.length; i++) {
120
+ if (elapsed < startsAt[i])
121
+ continue;
122
+ const budget = elapsed - startsAt[i];
123
+ items[i].step(Math.min(budget, clampDelta(deltaMs)));
124
+ }
125
+ return aggregateState(items);
126
+ }
127
+ function cancel() {
128
+ cancelled = true;
129
+ for (const child of items)
130
+ child.cancel();
131
+ }
132
+ function state() {
133
+ if (cancelled)
134
+ return 'cancelled';
135
+ return aggregateState(items);
136
+ }
137
+ return { step, cancel, state };
138
+ }
139
+ /**
140
+ * Multi-property keyframe timeline with scrub support. Keyframes are sorted by
141
+ * `at` and sampled with optional per-segment easing. Requires at least one
142
+ * keyframe; single-keyframe timelines produce a constant pose and finish
143
+ * immediately on the first step.
144
+ *
145
+ * Non-finite numeric values in keyframes are normalized to `0` (matches
146
+ * {@link finiteNumberOrZero} used throughout `animation.ts`) so corrupt JSON
147
+ * can't poison interpolation.
148
+ *
149
+ * When the global motion preference is `reduced`, the timeline jumps straight
150
+ * to the final pose and ends `finished` — same policy as `createTweenTimeline`.
151
+ */
152
+ export function createKeyframeTimeline(keyframes, options = {}) {
153
+ if (keyframes.length === 0) {
154
+ throw new Error('createKeyframeTimeline requires at least one keyframe');
155
+ }
156
+ const sorted = [...keyframes]
157
+ .map(k => ({
158
+ at: Number.isFinite(k.at) ? Math.max(0, k.at) : 0,
159
+ values: normalizeValues(k.values),
160
+ easing: k.easing,
161
+ }))
162
+ .sort((a, b) => a.at - b.at);
163
+ const defaultEasing = options.easing ?? easing.easeInOut;
164
+ const duration = sorted[sorted.length - 1].at;
165
+ const keys = new Set();
166
+ for (const k of sorted)
167
+ for (const key of Object.keys(k.values))
168
+ keys.add(key);
169
+ const values = Object.create(null);
170
+ for (const key of keys)
171
+ values[key] = signal(sorted[0].values[key] ?? 0);
172
+ let elapsed = 0;
173
+ let playbackState = getMotionPreference() === 'reduced' || duration === 0 ? 'idle' : 'running';
174
+ if (getMotionPreference() === 'reduced') {
175
+ const final = sampleAt(sorted, duration, keys, defaultEasing);
176
+ for (const key of keys)
177
+ values[key].set(final[key] ?? 0);
178
+ playbackState = 'finished';
179
+ }
180
+ else {
181
+ const initial = sampleAt(sorted, 0, keys, defaultEasing);
182
+ for (const key of keys)
183
+ values[key].set(initial[key] ?? 0);
184
+ if (duration === 0)
185
+ playbackState = 'finished';
186
+ }
187
+ function step(deltaMs) {
188
+ if (playbackState === 'running') {
189
+ elapsed = Math.min(elapsed + clampDelta(deltaMs), duration);
190
+ }
191
+ const current = sampleAt(sorted, elapsed, keys, defaultEasing);
192
+ for (const key of keys)
193
+ values[key].set(current[key] ?? 0);
194
+ if (playbackState === 'running' && elapsed >= duration) {
195
+ playbackState = 'finished';
196
+ }
197
+ return current;
198
+ }
199
+ function scrubTo(t) {
200
+ const normalized = Number.isFinite(t) ? Math.min(1, Math.max(0, t)) : 0;
201
+ return scrubToMs(normalized * duration);
202
+ }
203
+ function scrubToMs(ms) {
204
+ const normalized = Number.isFinite(ms) ? Math.min(duration, Math.max(0, ms)) : 0;
205
+ elapsed = normalized;
206
+ const current = sampleAt(sorted, elapsed, keys, defaultEasing);
207
+ for (const key of keys)
208
+ values[key].set(current[key] ?? 0);
209
+ return current;
210
+ }
211
+ function pause() {
212
+ if (playbackState === 'running')
213
+ playbackState = 'paused';
214
+ }
215
+ function resume() {
216
+ if (playbackState === 'paused')
217
+ playbackState = 'running';
218
+ }
219
+ function cancel() {
220
+ if (playbackState === 'running' || playbackState === 'paused') {
221
+ playbackState = 'cancelled';
222
+ }
223
+ }
224
+ return {
225
+ values,
226
+ duration,
227
+ step,
228
+ scrubTo,
229
+ scrubToMs,
230
+ pause,
231
+ resume,
232
+ cancel,
233
+ state: () => playbackState,
234
+ };
235
+ }
236
+ function normalizeValues(input) {
237
+ const out = Object.create(null);
238
+ for (const key of Object.keys(input)) {
239
+ out[key] = finiteNumberOrZero(input[key] ?? 0);
240
+ }
241
+ return out;
242
+ }
243
+ function sampleAt(frames, t, keys, defaultEasing) {
244
+ const out = Object.create(null);
245
+ if (frames.length === 1) {
246
+ const only = frames[0];
247
+ for (const key of keys)
248
+ out[key] = only.values[key] ?? 0;
249
+ return out;
250
+ }
251
+ if (t <= frames[0].at) {
252
+ const first = frames[0];
253
+ for (const key of keys)
254
+ out[key] = first.values[key] ?? 0;
255
+ return out;
256
+ }
257
+ const last = frames[frames.length - 1];
258
+ if (t >= last.at) {
259
+ for (const key of keys)
260
+ out[key] = last.values[key] ?? 0;
261
+ return out;
262
+ }
263
+ let left = frames[0];
264
+ let right = frames[1];
265
+ for (let i = 1; i < frames.length; i++) {
266
+ if (frames[i].at >= t) {
267
+ right = frames[i];
268
+ left = frames[i - 1];
269
+ break;
270
+ }
271
+ }
272
+ const span = right.at - left.at;
273
+ const localT = span > 0 ? (t - left.at) / span : 1;
274
+ const ease = right.easing ?? defaultEasing;
275
+ const eased = Number.isFinite(localT) ? ease(localT) : 1;
276
+ for (const key of keys) {
277
+ const from = left.values[key] ?? right.values[key] ?? 0;
278
+ const to = right.values[key] ?? left.values[key] ?? 0;
279
+ out[key] = from + (to - from) * eased;
280
+ }
281
+ return out;
282
+ }
283
+ //# sourceMappingURL=animation-choreography.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animation-choreography.js","sourceRoot":"","sources":["../src/animation-choreography.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Renderer-agnostic pointer gesture recognizers: pan/drag, swipe, and pinch.
3
+ *
4
+ * Each recognizer is a pure state machine. Host code (canvas hit-test,
5
+ * terminal pointer, native bridge, tests) feeds it pointer events via
6
+ * `pointerDown`/`pointerMove`/`pointerUp`/`pointerCancel`; the recognizer
7
+ * invokes callbacks when thresholds are crossed. No DOM, no raf.
8
+ *
9
+ * Pointer IDs are integers (matching Pointer Events API conventions), but any
10
+ * stable per-pointer identity works — synthesized ids from terminal tap
11
+ * protocols are fine as long as down/move/up match.
12
+ */
13
+ export interface PointerSample {
14
+ id: number;
15
+ x: number;
16
+ y: number;
17
+ /** High-resolution timestamp in ms. Finite values only; callers are responsible. */
18
+ timestampMs: number;
19
+ }
20
+ export interface PanEvent {
21
+ pointerId: number;
22
+ x: number;
23
+ y: number;
24
+ startX: number;
25
+ startY: number;
26
+ deltaX: number;
27
+ deltaY: number;
28
+ /** Time since the gesture started moving past `minDistance`. */
29
+ elapsedMs: number;
30
+ }
31
+ export interface PanRecognizerOptions {
32
+ /** Distance in px the pointer must travel before `onStart` fires. Default 4. */
33
+ minDistance?: number;
34
+ /** Fires when the pointer crosses `minDistance`. */
35
+ onStart?: (event: PanEvent) => void;
36
+ /** Fires on each pointer move after `onStart`. */
37
+ onMove?: (event: PanEvent) => void;
38
+ /** Fires on `pointerUp`. Carries the final sample. */
39
+ onEnd?: (event: PanEvent) => void;
40
+ /** Fires on `pointerCancel`. No event is built if the gesture never started. */
41
+ onCancel?: (event: PanEvent) => void;
42
+ }
43
+ export interface PanRecognizer {
44
+ pointerDown(sample: PointerSample): void;
45
+ pointerMove(sample: PointerSample): void;
46
+ pointerUp(sample: PointerSample): void;
47
+ pointerCancel(pointerId: number): void;
48
+ /** True while the pan gesture has crossed `minDistance` and not yet ended. */
49
+ isActive(): boolean;
50
+ /** Drop any in-flight gesture without firing callbacks. */
51
+ reset(): void;
52
+ }
53
+ export declare function createPanRecognizer(options?: PanRecognizerOptions): PanRecognizer;
54
+ export type SwipeDirection = 'left' | 'right' | 'up' | 'down';
55
+ export interface SwipeEvent {
56
+ pointerId: number;
57
+ direction: SwipeDirection;
58
+ deltaX: number;
59
+ deltaY: number;
60
+ /** px/ms magnitude of the final velocity. */
61
+ velocity: number;
62
+ elapsedMs: number;
63
+ }
64
+ export interface SwipeRecognizerOptions {
65
+ /** Minimum total travel (px) before a swipe can register. Default 24. */
66
+ minDistance?: number;
67
+ /** Minimum velocity (px/ms) of the release. Default 0.3. */
68
+ minVelocity?: number;
69
+ /** Swipe must complete within this many ms. Default 600. */
70
+ maxDurationMs?: number;
71
+ onSwipe?: (event: SwipeEvent) => void;
72
+ }
73
+ export interface SwipeRecognizer {
74
+ pointerDown(sample: PointerSample): void;
75
+ pointerMove(sample: PointerSample): void;
76
+ pointerUp(sample: PointerSample): void;
77
+ pointerCancel(pointerId: number): void;
78
+ reset(): void;
79
+ }
80
+ export declare function createSwipeRecognizer(options?: SwipeRecognizerOptions): SwipeRecognizer;
81
+ export interface PinchEvent {
82
+ pointerIds: [number, number];
83
+ /** Current distance between the two tracked pointers. */
84
+ distance: number;
85
+ /** Distance between pointers when the gesture became active. */
86
+ startDistance: number;
87
+ /** `distance / startDistance`. Values > 1 = zoom in, < 1 = zoom out. */
88
+ scale: number;
89
+ /** Midpoint of the two pointers, useful as a zoom focal point. */
90
+ centerX: number;
91
+ centerY: number;
92
+ elapsedMs: number;
93
+ }
94
+ export interface PinchRecognizerOptions {
95
+ /** Minimum absolute distance change (px) before `onStart` fires. Default 4. */
96
+ minDeltaDistance?: number;
97
+ onStart?: (event: PinchEvent) => void;
98
+ onMove?: (event: PinchEvent) => void;
99
+ onEnd?: (event: PinchEvent) => void;
100
+ }
101
+ export interface PinchRecognizer {
102
+ pointerDown(sample: PointerSample): void;
103
+ pointerMove(sample: PointerSample): void;
104
+ pointerUp(sample: PointerSample): void;
105
+ pointerCancel(pointerId: number): void;
106
+ isActive(): boolean;
107
+ reset(): void;
108
+ }
109
+ export declare function createPinchRecognizer(options?: PinchRecognizerOptions): PinchRecognizer;
110
+ //# sourceMappingURL=gestures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gestures.d.ts","sourceRoot":"","sources":["../src/gestures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,oDAAoD;IACpD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACnC,kDAAkD;IAClD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IAClC,sDAAsD;IACtD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;IACjC,gFAAgF;IAChF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAA;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACxC,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACxC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACtC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,8EAA8E;IAC9E,QAAQ,IAAI,OAAO,CAAA;IACnB,2DAA2D;IAC3D,KAAK,IAAI,IAAI,CAAA;CACd;AAcD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAkErF;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,CAAA;AAE7D,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,cAAc,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACxC,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACxC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACtC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,KAAK,IAAI,IAAI,CAAA;CACd;AAaD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,CAqD3F;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAA;IAChB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAA;IACrB,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAA;IACb,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,sBAAsB;IACrC,+EAA+E;IAC/E,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IACpC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACxC,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACxC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;IACtC,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,QAAQ,IAAI,OAAO,CAAA;IACnB,KAAK,IAAI,IAAI,CAAA;CACd;AAUD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,eAAe,CA2F3F"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Renderer-agnostic pointer gesture recognizers: pan/drag, swipe, and pinch.
3
+ *
4
+ * Each recognizer is a pure state machine. Host code (canvas hit-test,
5
+ * terminal pointer, native bridge, tests) feeds it pointer events via
6
+ * `pointerDown`/`pointerMove`/`pointerUp`/`pointerCancel`; the recognizer
7
+ * invokes callbacks when thresholds are crossed. No DOM, no raf.
8
+ *
9
+ * Pointer IDs are integers (matching Pointer Events API conventions), but any
10
+ * stable per-pointer identity works — synthesized ids from terminal tap
11
+ * protocols are fine as long as down/move/up match.
12
+ */
13
+ function resolveMinDistance(distance, fallback) {
14
+ if (typeof distance !== 'number' || !Number.isFinite(distance) || distance < 0)
15
+ return fallback;
16
+ return distance;
17
+ }
18
+ export function createPanRecognizer(options = {}) {
19
+ const minDistance = resolveMinDistance(options.minDistance, 4);
20
+ const tracked = new Map();
21
+ function buildEvent(t, now) {
22
+ return {
23
+ pointerId: t.start.id,
24
+ x: now.x,
25
+ y: now.y,
26
+ startX: t.start.x,
27
+ startY: t.start.y,
28
+ deltaX: now.x - t.start.x,
29
+ deltaY: now.y - t.start.y,
30
+ elapsedMs: now.timestampMs - t.startTimeMs,
31
+ };
32
+ }
33
+ return {
34
+ pointerDown(sample) {
35
+ tracked.set(sample.id, {
36
+ start: sample,
37
+ last: sample,
38
+ startTimeMs: sample.timestampMs,
39
+ startedGesture: false,
40
+ });
41
+ },
42
+ pointerMove(sample) {
43
+ const t = tracked.get(sample.id);
44
+ if (!t)
45
+ return;
46
+ t.last = sample;
47
+ if (!t.startedGesture) {
48
+ const dx = sample.x - t.start.x;
49
+ const dy = sample.y - t.start.y;
50
+ const dist2 = dx * dx + dy * dy;
51
+ if (dist2 >= minDistance * minDistance) {
52
+ t.startedGesture = true;
53
+ t.startTimeMs = sample.timestampMs;
54
+ options.onStart?.(buildEvent(t, sample));
55
+ }
56
+ return;
57
+ }
58
+ options.onMove?.(buildEvent(t, sample));
59
+ },
60
+ pointerUp(sample) {
61
+ const t = tracked.get(sample.id);
62
+ if (!t)
63
+ return;
64
+ tracked.delete(sample.id);
65
+ if (!t.startedGesture)
66
+ return;
67
+ t.last = sample;
68
+ options.onEnd?.(buildEvent(t, sample));
69
+ },
70
+ pointerCancel(pointerId) {
71
+ const t = tracked.get(pointerId);
72
+ if (!t)
73
+ return;
74
+ tracked.delete(pointerId);
75
+ if (!t.startedGesture)
76
+ return;
77
+ options.onCancel?.(buildEvent(t, t.last));
78
+ },
79
+ isActive() {
80
+ for (const t of tracked.values())
81
+ if (t.startedGesture)
82
+ return true;
83
+ return false;
84
+ },
85
+ reset() {
86
+ tracked.clear();
87
+ },
88
+ };
89
+ }
90
+ function classifyDirection(dx, dy) {
91
+ return Math.abs(dx) >= Math.abs(dy) ? (dx >= 0 ? 'right' : 'left') : dy >= 0 ? 'down' : 'up';
92
+ }
93
+ const VELOCITY_WINDOW_MS = 100;
94
+ export function createSwipeRecognizer(options = {}) {
95
+ const minDistance = resolveMinDistance(options.minDistance, 24);
96
+ const minVelocity = typeof options.minVelocity === 'number' && Number.isFinite(options.minVelocity) && options.minVelocity > 0
97
+ ? options.minVelocity
98
+ : 0.3;
99
+ const maxDurationMs = typeof options.maxDurationMs === 'number' && Number.isFinite(options.maxDurationMs) && options.maxDurationMs > 0
100
+ ? options.maxDurationMs
101
+ : 600;
102
+ const tracked = new Map();
103
+ return {
104
+ pointerDown(sample) {
105
+ tracked.set(sample.id, { start: sample, samples: [sample] });
106
+ },
107
+ pointerMove(sample) {
108
+ const t = tracked.get(sample.id);
109
+ if (!t)
110
+ return;
111
+ t.samples.push(sample);
112
+ // Keep only the trailing window so velocity doesn't drift on long pans.
113
+ const cutoff = sample.timestampMs - VELOCITY_WINDOW_MS;
114
+ while (t.samples.length > 2 && t.samples[0].timestampMs < cutoff)
115
+ t.samples.shift();
116
+ },
117
+ pointerUp(sample) {
118
+ const t = tracked.get(sample.id);
119
+ if (!t)
120
+ return;
121
+ tracked.delete(sample.id);
122
+ const dx = sample.x - t.start.x;
123
+ const dy = sample.y - t.start.y;
124
+ const dist = Math.hypot(dx, dy);
125
+ const elapsedMs = sample.timestampMs - t.start.timestampMs;
126
+ if (dist < minDistance || elapsedMs <= 0 || elapsedMs > maxDurationMs)
127
+ return;
128
+ const windowStart = t.samples[0];
129
+ const ws = sample.timestampMs - windowStart.timestampMs;
130
+ const wdx = sample.x - windowStart.x;
131
+ const wdy = sample.y - windowStart.y;
132
+ const velocity = ws > 0 ? Math.hypot(wdx, wdy) / ws : 0;
133
+ if (velocity < minVelocity)
134
+ return;
135
+ options.onSwipe?.({
136
+ pointerId: t.start.id,
137
+ direction: classifyDirection(dx, dy),
138
+ deltaX: dx,
139
+ deltaY: dy,
140
+ velocity,
141
+ elapsedMs,
142
+ });
143
+ },
144
+ pointerCancel(pointerId) {
145
+ tracked.delete(pointerId);
146
+ },
147
+ reset() {
148
+ tracked.clear();
149
+ },
150
+ };
151
+ }
152
+ export function createPinchRecognizer(options = {}) {
153
+ const minDelta = resolveMinDistance(options.minDeltaDistance, 4);
154
+ const state = {
155
+ pointers: new Map(),
156
+ lastPair: null,
157
+ startDistance: 0,
158
+ startTimeMs: 0,
159
+ started: false,
160
+ };
161
+ function twoPointers() {
162
+ if (state.pointers.size !== 2)
163
+ return null;
164
+ const iter = state.pointers.values();
165
+ const first = iter.next().value;
166
+ const second = iter.next().value;
167
+ return [first, second];
168
+ }
169
+ function distance(a, b) {
170
+ return Math.hypot(a.x - b.x, a.y - b.y);
171
+ }
172
+ function buildEvent(pair, now) {
173
+ const d = distance(pair[0], pair[1]);
174
+ return {
175
+ pointerIds: [pair[0].id, pair[1].id],
176
+ distance: d,
177
+ startDistance: state.startDistance || d,
178
+ scale: state.startDistance > 0 ? d / state.startDistance : 1,
179
+ centerX: (pair[0].x + pair[1].x) / 2,
180
+ centerY: (pair[0].y + pair[1].y) / 2,
181
+ elapsedMs: now - state.startTimeMs,
182
+ };
183
+ }
184
+ function endGesture(lastTimestamp) {
185
+ if (!state.started)
186
+ return;
187
+ const pair = state.lastPair ?? twoPointers();
188
+ if (pair)
189
+ options.onEnd?.(buildEvent(pair, lastTimestamp));
190
+ state.started = false;
191
+ state.startDistance = 0;
192
+ state.lastPair = null;
193
+ }
194
+ return {
195
+ pointerDown(sample) {
196
+ if (state.pointers.size >= 2 && !state.pointers.has(sample.id))
197
+ return;
198
+ state.pointers.set(sample.id, sample);
199
+ if (state.pointers.size === 2 && !state.started) {
200
+ const pair = twoPointers();
201
+ state.startDistance = distance(pair[0], pair[1]);
202
+ state.startTimeMs = sample.timestampMs;
203
+ state.lastPair = pair;
204
+ }
205
+ },
206
+ pointerMove(sample) {
207
+ if (!state.pointers.has(sample.id))
208
+ return;
209
+ state.pointers.set(sample.id, sample);
210
+ const pair = twoPointers();
211
+ if (!pair)
212
+ return;
213
+ state.lastPair = pair;
214
+ const d = distance(pair[0], pair[1]);
215
+ if (!state.started) {
216
+ if (Math.abs(d - state.startDistance) < minDelta)
217
+ return;
218
+ state.started = true;
219
+ options.onStart?.(buildEvent(pair, sample.timestampMs));
220
+ return;
221
+ }
222
+ options.onMove?.(buildEvent(pair, sample.timestampMs));
223
+ },
224
+ pointerUp(sample) {
225
+ const existed = state.pointers.has(sample.id);
226
+ state.pointers.delete(sample.id);
227
+ if (existed && state.pointers.size < 2)
228
+ endGesture(sample.timestampMs);
229
+ },
230
+ pointerCancel(pointerId) {
231
+ const existed = state.pointers.has(pointerId);
232
+ state.pointers.delete(pointerId);
233
+ if (existed && state.pointers.size < 2)
234
+ endGesture(state.startTimeMs);
235
+ },
236
+ isActive() {
237
+ return state.started;
238
+ },
239
+ reset() {
240
+ state.pointers.clear();
241
+ state.started = false;
242
+ state.startDistance = 0;
243
+ state.startTimeMs = 0;
244
+ state.lastPair = null;
245
+ },
246
+ };
247
+ }
248
+ //# sourceMappingURL=gestures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gestures.js","sourceRoot":"","sources":["../src/gestures.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -42,6 +42,10 @@ export type { TextNodeInfo, TextLineInfo, SelectionRange } from './selection.js'
42
42
  export { findInTextNodes } from './find.js';
43
43
  export { transition, spring, normalizeSpringConfig, easing, animationLoop, createTweenTimeline, createPropertyTimeline, setMotionPreference, getMotionPreference, } from './animation.js';
44
44
  export type { EasingFn, TweenPlaybackState, TweenTimeline, PropertyTimeline, MotionPreference, } from './animation.js';
45
+ export { sequence, parallel, stagger, createKeyframeTimeline, } from './animation-choreography.js';
46
+ export type { Choreographable, Choreography, Keyframe, KeyframeTimeline, KeyframeTimelinePlaybackState, } from './animation-choreography.js';
47
+ export { createPanRecognizer, createSwipeRecognizer, createPinchRecognizer, } from './gestures.js';
48
+ export type { PointerSample, PanEvent, PanRecognizer, PanRecognizerOptions, SwipeDirection, SwipeEvent, SwipeRecognizer, SwipeRecognizerOptions, PinchEvent, PinchRecognizer, PinchRecognizerOptions, } from './gestures.js';
45
49
  export { streamText } from './stream-text.js';
46
50
  export type { StreamText } from './stream-text.js';
47
51
  export { createViewport, breakpoint, responsive, defaultBreakpoints, } from './responsive.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -46,6 +46,8 @@ export { collectTextNodes, getSelectedText, hitTestText } from './selection.js';
46
46
  export { findInTextNodes } from './find.js';
47
47
  // Animation
48
48
  export { transition, spring, normalizeSpringConfig, easing, animationLoop, createTweenTimeline, createPropertyTimeline, setMotionPreference, getMotionPreference, } from './animation.js';
49
+ export { sequence, parallel, stagger, createKeyframeTimeline, } from './animation-choreography.js';
50
+ export { createPanRecognizer, createSwipeRecognizer, createPinchRecognizer, } from './gestures.js';
49
51
  // Streaming text
50
52
  export { streamText } from './stream-text.js';
51
53
  // Responsive helpers
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,aAAa;AACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAG9D,uBAAuB;AACvB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAEnE,yBAAyB;AACzB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAEjG,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGpC,kBAAkB;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAA;AAGvB,cAAc;AACd,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEvG,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAA;AAE7G,sBAAsB;AACtB,OAAO,EACL,8BAA8B,EAC9B,2BAA2B,EAC3B,wBAAwB,EACxB,YAAY,GACb,MAAM,YAAY,CAAA;AAEnB,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE1G,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAA;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAE/E,iBAAiB;AACjB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG/E,sBAAsB;AACtB,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,YAAY;AACZ,OAAO,EACL,UAAU,EACV,MAAM,EACN,qBAAqB,EACrB,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAA;AASvB,iBAAiB;AACjB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAG7C,qBAAqB;AACrB,OAAO,EACL,cAAc,EACd,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AAGxB,yBAAyB;AACzB,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAG1E,MAAM;AACN,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAGzC,wBAAwB;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAG/C,wBAAwB;AACxB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,cAAc,EACd,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geometra/core",
3
- "version": "1.52.0",
3
+ "version": "1.54.0",
4
4
  "description": "DOM-free UI framework core: components, signals, reconciler",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -39,7 +39,7 @@
39
39
  "check": "tsc --noEmit"
40
40
  },
41
41
  "dependencies": {
42
- "textura": "^1.52.0"
42
+ "textura": "^1.54.0"
43
43
  },
44
44
  "optionalDependencies": {
45
45
  "@napi-rs/canvas": "^0.1.65"