@geometra/core 1.0.0 → 1.0.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/README.md +10 -1
- package/dist/a11y.d.ts.map +1 -1
- package/dist/a11y.js +6 -2
- package/dist/a11y.js.map +1 -1
- package/dist/animation.d.ts +39 -1
- package/dist/animation.d.ts.map +1 -1
- package/dist/animation.js +148 -1
- package/dist/animation.js.map +1 -1
- package/dist/app.d.ts +4 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +17 -3
- package/dist/app.js.map +1 -1
- package/dist/direction.d.ts +11 -0
- package/dist/direction.d.ts.map +1 -0
- package/dist/direction.js +18 -0
- package/dist/direction.js.map +1 -0
- package/dist/elements.d.ts +4 -4
- package/dist/elements.d.ts.map +1 -1
- package/dist/elements.js.map +1 -1
- package/dist/focus-trap.d.ts +12 -1
- package/dist/focus-trap.d.ts.map +1 -1
- package/dist/focus-trap.js +12 -1
- package/dist/focus-trap.js.map +1 -1
- package/dist/focus.d.ts +3 -2
- package/dist/focus.d.ts.map +1 -1
- package/dist/focus.js +6 -0
- package/dist/focus.js.map +1 -1
- package/dist/fonts.d.ts +35 -2
- package/dist/fonts.d.ts.map +1 -1
- package/dist/fonts.js +335 -12
- package/dist/fonts.js.map +1 -1
- package/dist/hit-test.d.ts +35 -4
- package/dist/hit-test.d.ts.map +1 -1
- package/dist/hit-test.js +195 -70
- package/dist/hit-test.js.map +1 -1
- package/dist/index.d.ts +21 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -6
- package/dist/index.js.map +1 -1
- package/dist/keyboard.d.ts +5 -2
- package/dist/keyboard.d.ts.map +1 -1
- package/dist/keyboard.js +5 -2
- package/dist/keyboard.js.map +1 -1
- package/dist/selection.d.ts +5 -2
- package/dist/selection.d.ts.map +1 -1
- package/dist/selection.js +37 -8
- package/dist/selection.js.map +1 -1
- package/dist/seo.d.ts +27 -0
- package/dist/seo.d.ts.map +1 -1
- package/dist/seo.js +240 -13
- package/dist/seo.js.map +1 -1
- package/dist/signals.d.ts.map +1 -1
- package/dist/signals.js +44 -7
- package/dist/signals.js.map +1 -1
- package/dist/text-input-history.d.ts +14 -4
- package/dist/text-input-history.d.ts.map +1 -1
- package/dist/text-input-history.js +37 -8
- package/dist/text-input-history.js.map +1 -1
- package/dist/text-input.d.ts +8 -8
- package/dist/text-input.d.ts.map +1 -1
- package/dist/text-input.js +45 -17
- package/dist/text-input.js.map +1 -1
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +3 -0
- package/dist/tree.js.map +1 -1
- package/dist/types.d.ts +29 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/virtual-scroll.d.ts +11 -1
- package/dist/virtual-scroll.d.ts.map +1 -1
- package/dist/virtual-scroll.js +14 -5
- package/dist/virtual-scroll.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ npm install @geometra/core
|
|
|
18
18
|
- `insertInputText`, `backspaceInput`, `deleteInput` -- text-input editing primitives
|
|
19
19
|
- `getInputCaretGeometry` -- caret x/y/height from measured text lines
|
|
20
20
|
- `createTextInputHistory`, `undoTextInputHistory` -- undo/redo state helpers
|
|
21
|
-
- `transition`, `spring` -- animation utilities
|
|
21
|
+
- `transition`, `spring`, `createTweenTimeline`, `createPropertyTimeline`, `setMotionPreference` -- animation utilities
|
|
22
22
|
|
|
23
23
|
## Usage
|
|
24
24
|
|
|
@@ -44,8 +44,17 @@ const app = createApp(() =>
|
|
|
44
44
|
- `insertInputText`/`replaceInputSelection` always collapse caret after replacement.
|
|
45
45
|
- `backspaceInput`/`deleteInput` delete active selections first, then apply boundary merge behavior across nodes.
|
|
46
46
|
- `moveInputCaret` supports range extension via `extendSelection=true`.
|
|
47
|
+
- `moveInputCaret` and `moveInputCaretByWord` accept an optional reading direction (`ltr` default, `rtl` supported) for horizontal key semantics.
|
|
48
|
+
- `moveInputCaretToLineBoundary` also accepts optional reading direction so Home/End semantics can follow visual direction in RTL contexts.
|
|
47
49
|
- `getInputCaretGeometry` is defined for collapsed selections with measured line metrics; expanded ranges return `null`.
|
|
48
50
|
|
|
51
|
+
## Direction model baseline
|
|
52
|
+
|
|
53
|
+
- Elements may provide `dir: 'ltr' | 'rtl' | 'auto'` on `box()`, `text()`, and `image()` props.
|
|
54
|
+
- `dir='auto'` currently inherits from parent direction (script-level auto detection is deferred).
|
|
55
|
+
- Omitted `dir` inherits from parent; root fallback is `ltr`.
|
|
56
|
+
- Direction metadata is kept in the declarative tree and intentionally stripped from Yoga layout props.
|
|
57
|
+
|
|
49
58
|
## Accessibility guarantees and limits
|
|
50
59
|
|
|
51
60
|
- `toAccessibilityTree(tree, layout)` emits deterministic role/name/bounds/focusable nodes for geometry-rendered UIs.
|
package/dist/a11y.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAyC,MAAM,YAAY,CAAA;AAElF,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAyC,MAAM,YAAY,CAAA;AAElF,MAAM,WAAW,mBAAmB;IAClC,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAOD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE;QACN,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;KACnB,CAAA;IACD,MAAM,EAAE,mBAAmB,CAAA;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,SAAS,EAAE,OAAO,CAAA;CACnB;AAgGD,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,iBAAiB,CAE9F"}
|
package/dist/a11y.js
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/** Ignore non-finite and non-number scroll props so child offsets stay finite (same rule as pointer hit-testing). */
|
|
2
|
+
function finiteScrollOffset(value) {
|
|
3
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : 0;
|
|
4
|
+
}
|
|
1
5
|
function inferTextRole(element) {
|
|
2
6
|
if (element.semantic?.role)
|
|
3
7
|
return element.semantic.role;
|
|
@@ -80,8 +84,8 @@ function walk(element, layout, offsetX, offsetY, path) {
|
|
|
80
84
|
const y = offsetY + layout.y;
|
|
81
85
|
const children = [];
|
|
82
86
|
if (element.kind === 'box') {
|
|
83
|
-
const childOffsetX = x - (element.props.scrollX
|
|
84
|
-
const childOffsetY = y - (element.props.scrollY
|
|
87
|
+
const childOffsetX = x - finiteScrollOffset(element.props.scrollX);
|
|
88
|
+
const childOffsetY = y - finiteScrollOffset(element.props.scrollY);
|
|
85
89
|
for (let i = 0; i < element.children.length; i++) {
|
|
86
90
|
const childLayout = layout.children[i];
|
|
87
91
|
if (childLayout) {
|
package/dist/a11y.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"a11y.js","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"a11y.js","sourceRoot":"","sources":["../src/a11y.ts"],"names":[],"mappings":"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"}
|
package/dist/animation.d.ts
CHANGED
|
@@ -7,11 +7,49 @@ export declare const easing: {
|
|
|
7
7
|
easeInOut: (t: number) => number;
|
|
8
8
|
};
|
|
9
9
|
export type EasingFn = (t: number) => number;
|
|
10
|
+
export type TweenPlaybackState = 'idle' | 'running' | 'paused' | 'finished' | 'cancelled';
|
|
11
|
+
export interface TweenTimeline {
|
|
12
|
+
value: Signal<number>;
|
|
13
|
+
/** Schedule/interrupt toward a new target. */
|
|
14
|
+
to(to: number, durationMs: number, easingFn?: EasingFn): void;
|
|
15
|
+
/** Deterministically advance timeline by fixed milliseconds. */
|
|
16
|
+
step(deltaMs: number): number;
|
|
17
|
+
pause(): void;
|
|
18
|
+
resume(): void;
|
|
19
|
+
cancel(): void;
|
|
20
|
+
state(): TweenPlaybackState;
|
|
21
|
+
}
|
|
22
|
+
export interface PropertyTimeline {
|
|
23
|
+
values: Record<string, Signal<number>>;
|
|
24
|
+
to(targets: Record<string, number>, durationMs: number, easingFn?: EasingFn): void;
|
|
25
|
+
step(deltaMs: number): Record<string, number>;
|
|
26
|
+
pause(): void;
|
|
27
|
+
resume(): void;
|
|
28
|
+
cancel(): void;
|
|
29
|
+
state(): TweenPlaybackState;
|
|
30
|
+
}
|
|
31
|
+
export type MotionPreference = 'full' | 'reduced';
|
|
32
|
+
/** Set global motion preference for animation helpers. */
|
|
33
|
+
export declare function setMotionPreference(preference: MotionPreference): void;
|
|
34
|
+
/** Read current global motion preference. */
|
|
35
|
+
export declare function getMotionPreference(): MotionPreference;
|
|
10
36
|
/**
|
|
11
37
|
* Create an animated signal that transitions from `from` to `to` over `duration` ms.
|
|
12
38
|
* Returns a signal whose `.value` tracks the current interpolated value.
|
|
13
39
|
*/
|
|
14
|
-
export declare function transition(from: number, to: number, duration: number, easingFn?: EasingFn
|
|
40
|
+
export declare function transition(from: number, to: number, duration: number, easingFn?: EasingFn, options?: {
|
|
41
|
+
respectReducedMotion?: boolean;
|
|
42
|
+
}): Signal<number>;
|
|
43
|
+
/**
|
|
44
|
+
* Deterministic tween timeline for tests and frame-stepped animation orchestration.
|
|
45
|
+
* Unlike `transition()`, this helper does not use `requestAnimationFrame`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function createTweenTimeline(initialValue: number): TweenTimeline;
|
|
48
|
+
/**
|
|
49
|
+
* Multi-property deterministic timeline for geometry/paint numeric fields.
|
|
50
|
+
* Typical usage includes x/y/width/height/opacity style numeric transitions.
|
|
51
|
+
*/
|
|
52
|
+
export declare function createPropertyTimeline(initialValues: Record<string, number>): PropertyTimeline;
|
|
15
53
|
/**
|
|
16
54
|
* Create a spring-physics animated signal that follows a target value.
|
|
17
55
|
* Returns a signal that smoothly converges to `target.value`.
|
package/dist/animation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAU1C,+BAA+B;AAC/B,eAAO,MAAM,MAAM;gBACL,MAAM;gBACN,MAAM;iBACL,MAAM;mBACJ,MAAM;CACtB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAU1C,+BAA+B;AAC/B,eAAO,MAAM,MAAM;gBACL,MAAM;gBACN,MAAM;iBACL,MAAM;mBACJ,MAAM;CACtB,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;AAC5C,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,CAAA;AAEzF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACrB,8CAA8C;IAC9C,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC7D,gEAAgE;IAChE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,KAAK,IAAI,IAAI,CAAA;IACb,MAAM,IAAI,IAAI,CAAA;IACd,MAAM,IAAI,IAAI,CAAA;IACd,KAAK,IAAI,kBAAkB,CAAA;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IACtC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAClF,IAAI,CAAC,OAAO,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,kBAAkB,CAAA;CAC5B;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAAA;AAIjD,0DAA0D;AAC1D,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAEtE;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,QAA2B,EACrC,OAAO,GAAE;IAAE,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,MAAM,CAAC,MAAM,CAAC,CAiBhB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,CA+DvE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAiE9F;AAED;;;GAGG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EACtB,MAAM,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACnE,MAAM,CAAC,MAAM,CAAC,CAgDhB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GAAG,MAAM,IAAI,CAmB3E"}
|
package/dist/animation.js
CHANGED
|
@@ -12,12 +12,25 @@ export const easing = {
|
|
|
12
12
|
easeOut: (t) => 1 - Math.pow(1 - t, 3),
|
|
13
13
|
easeInOut: (t) => t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2,
|
|
14
14
|
};
|
|
15
|
+
const motionPreference = signal('full');
|
|
16
|
+
/** Set global motion preference for animation helpers. */
|
|
17
|
+
export function setMotionPreference(preference) {
|
|
18
|
+
motionPreference.set(preference);
|
|
19
|
+
}
|
|
20
|
+
/** Read current global motion preference. */
|
|
21
|
+
export function getMotionPreference() {
|
|
22
|
+
return motionPreference.peek();
|
|
23
|
+
}
|
|
15
24
|
/**
|
|
16
25
|
* Create an animated signal that transitions from `from` to `to` over `duration` ms.
|
|
17
26
|
* Returns a signal whose `.value` tracks the current interpolated value.
|
|
18
27
|
*/
|
|
19
|
-
export function transition(from, to, duration, easingFn = easing.easeInOut) {
|
|
28
|
+
export function transition(from, to, duration, easingFn = easing.easeInOut, options = {}) {
|
|
20
29
|
const s = signal(from);
|
|
30
|
+
if (options.respectReducedMotion && getMotionPreference() === 'reduced') {
|
|
31
|
+
s.set(to);
|
|
32
|
+
return s;
|
|
33
|
+
}
|
|
21
34
|
const start = Date.now();
|
|
22
35
|
function tick() {
|
|
23
36
|
const elapsed = Date.now() - start;
|
|
@@ -29,6 +42,140 @@ export function transition(from, to, duration, easingFn = easing.easeInOut) {
|
|
|
29
42
|
raf(tick);
|
|
30
43
|
return s;
|
|
31
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Deterministic tween timeline for tests and frame-stepped animation orchestration.
|
|
47
|
+
* Unlike `transition()`, this helper does not use `requestAnimationFrame`.
|
|
48
|
+
*/
|
|
49
|
+
export function createTweenTimeline(initialValue) {
|
|
50
|
+
const value = signal(initialValue);
|
|
51
|
+
let from = initialValue;
|
|
52
|
+
let to = initialValue;
|
|
53
|
+
let elapsed = 0;
|
|
54
|
+
let duration = 0;
|
|
55
|
+
let easingFn = easing.linear;
|
|
56
|
+
let playbackState = 'idle';
|
|
57
|
+
function toTarget(nextTo, durationMs, nextEasing = easing.easeInOut) {
|
|
58
|
+
if (getMotionPreference() === 'reduced') {
|
|
59
|
+
value.set(nextTo);
|
|
60
|
+
from = nextTo;
|
|
61
|
+
to = nextTo;
|
|
62
|
+
elapsed = 0;
|
|
63
|
+
duration = 1;
|
|
64
|
+
easingFn = nextEasing;
|
|
65
|
+
playbackState = 'finished';
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
from = value.peek();
|
|
69
|
+
to = nextTo;
|
|
70
|
+
elapsed = 0;
|
|
71
|
+
duration = Math.max(1, durationMs);
|
|
72
|
+
easingFn = nextEasing;
|
|
73
|
+
playbackState = 'running';
|
|
74
|
+
}
|
|
75
|
+
function step(deltaMs) {
|
|
76
|
+
if (playbackState !== 'running')
|
|
77
|
+
return value.peek();
|
|
78
|
+
elapsed += Math.max(0, deltaMs);
|
|
79
|
+
const t = Math.min(elapsed / duration, 1);
|
|
80
|
+
const next = from + (to - from) * easingFn(t);
|
|
81
|
+
value.set(next);
|
|
82
|
+
if (t >= 1) {
|
|
83
|
+
playbackState = 'finished';
|
|
84
|
+
}
|
|
85
|
+
return next;
|
|
86
|
+
}
|
|
87
|
+
function pause() {
|
|
88
|
+
if (playbackState === 'running')
|
|
89
|
+
playbackState = 'paused';
|
|
90
|
+
}
|
|
91
|
+
function resume() {
|
|
92
|
+
if (playbackState === 'paused')
|
|
93
|
+
playbackState = 'running';
|
|
94
|
+
}
|
|
95
|
+
function cancel() {
|
|
96
|
+
if (playbackState === 'running' || playbackState === 'paused') {
|
|
97
|
+
playbackState = 'cancelled';
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
value,
|
|
102
|
+
to: toTarget,
|
|
103
|
+
step,
|
|
104
|
+
pause,
|
|
105
|
+
resume,
|
|
106
|
+
cancel,
|
|
107
|
+
state: () => playbackState,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Multi-property deterministic timeline for geometry/paint numeric fields.
|
|
112
|
+
* Typical usage includes x/y/width/height/opacity style numeric transitions.
|
|
113
|
+
*/
|
|
114
|
+
export function createPropertyTimeline(initialValues) {
|
|
115
|
+
const timelines = new Map();
|
|
116
|
+
const values = {};
|
|
117
|
+
for (const key of Object.keys(initialValues)) {
|
|
118
|
+
const timeline = createTweenTimeline(initialValues[key] ?? 0);
|
|
119
|
+
timelines.set(key, timeline);
|
|
120
|
+
values[key] = timeline.value;
|
|
121
|
+
}
|
|
122
|
+
function ensureTimeline(key) {
|
|
123
|
+
const existing = timelines.get(key);
|
|
124
|
+
if (existing)
|
|
125
|
+
return existing;
|
|
126
|
+
const created = createTweenTimeline(0);
|
|
127
|
+
timelines.set(key, created);
|
|
128
|
+
values[key] = created.value;
|
|
129
|
+
return created;
|
|
130
|
+
}
|
|
131
|
+
function to(targets, durationMs, easingFn = easing.easeInOut) {
|
|
132
|
+
for (const key of Object.keys(targets)) {
|
|
133
|
+
ensureTimeline(key).to(targets[key] ?? 0, durationMs, easingFn);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function step(deltaMs) {
|
|
137
|
+
const next = {};
|
|
138
|
+
for (const [key, timeline] of timelines) {
|
|
139
|
+
next[key] = timeline.step(deltaMs);
|
|
140
|
+
}
|
|
141
|
+
return next;
|
|
142
|
+
}
|
|
143
|
+
function pause() {
|
|
144
|
+
for (const timeline of timelines.values())
|
|
145
|
+
timeline.pause();
|
|
146
|
+
}
|
|
147
|
+
function resume() {
|
|
148
|
+
for (const timeline of timelines.values())
|
|
149
|
+
timeline.resume();
|
|
150
|
+
}
|
|
151
|
+
function cancel() {
|
|
152
|
+
for (const timeline of timelines.values())
|
|
153
|
+
timeline.cancel();
|
|
154
|
+
}
|
|
155
|
+
function state() {
|
|
156
|
+
let hasRunning = false;
|
|
157
|
+
let hasPaused = false;
|
|
158
|
+
let hasCancelled = false;
|
|
159
|
+
let hasFinished = false;
|
|
160
|
+
for (const timeline of timelines.values()) {
|
|
161
|
+
const s = timeline.state();
|
|
162
|
+
hasRunning = hasRunning || s === 'running';
|
|
163
|
+
hasPaused = hasPaused || s === 'paused';
|
|
164
|
+
hasCancelled = hasCancelled || s === 'cancelled';
|
|
165
|
+
hasFinished = hasFinished || s === 'finished';
|
|
166
|
+
}
|
|
167
|
+
if (hasRunning)
|
|
168
|
+
return 'running';
|
|
169
|
+
if (hasPaused)
|
|
170
|
+
return 'paused';
|
|
171
|
+
if (hasCancelled)
|
|
172
|
+
return 'cancelled';
|
|
173
|
+
if (hasFinished)
|
|
174
|
+
return 'finished';
|
|
175
|
+
return 'idle';
|
|
176
|
+
}
|
|
177
|
+
return { values, to, step, pause, resume, cancel, state };
|
|
178
|
+
}
|
|
32
179
|
/**
|
|
33
180
|
* Create a spring-physics animated signal that follows a target value.
|
|
34
181
|
* Returns a signal that smoothly converges to `target.value`.
|
package/dist/animation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAGrC,MAAM,GAAG,GAAG,OAAO,qBAAqB,KAAK,WAAW;IACtD,CAAC,CAAC,qBAAqB;IACvB,CAAC,CAAC,CAAC,EAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAsB,CAAA;AAE1F,MAAM,SAAS,GAAG,OAAO,oBAAoB,KAAK,WAAW;IAC3D,CAAC,CAAC,oBAAoB;IACtB,CAAC,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;AAEpC,+BAA+B;AAC/B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9C,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC;CACpF,CAAA;
|
|
1
|
+
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../src/animation.ts"],"names":[],"mappings":"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"}
|
package/dist/app.d.ts
CHANGED
|
@@ -12,7 +12,10 @@ export interface AppOptions {
|
|
|
12
12
|
* Reduces first-paint layout shift for web fonts.
|
|
13
13
|
*/
|
|
14
14
|
waitForFonts?: boolean;
|
|
15
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* Max time to wait for fonts when `waitForFonts` is true. Default `10_000`.
|
|
17
|
+
* Non-finite or negative values fall back to the default (same rules as `waitForFonts` in `fonts.js`).
|
|
18
|
+
*/
|
|
16
19
|
fontLoadTimeoutMs?: number;
|
|
17
20
|
}
|
|
18
21
|
export interface App {
|
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAQtF,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAQtF,MAAM,WAAW,UAAU;IACzB,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,MAAM,WAAW,GAAG;IAClB,mCAAmC;IACnC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;IAC7B,gCAAgC;IAChC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,oCAAoC;IACpC,MAAM,IAAI,IAAI,CAAA;IACd,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAA;IACxG,wDAAwD;IACxD,WAAW,CAAC,SAAS,EAAE,WAAW,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAA;IACjG,gEAAgE;IAChE,mBAAmB,CACjB,SAAS,EAAE,oBAAoB,GAAG,qBAAqB,GAAG,kBAAkB,EAC5E,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GACtB,OAAO,CAAA;IACV,yBAAyB;IACzB,OAAO,IAAI,IAAI,CAAA;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,SAAS,EACrB,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,GAAG,CAAC,CAwEd"}
|
package/dist/app.js
CHANGED
|
@@ -3,7 +3,7 @@ import { toLayoutTree } from './tree.js';
|
|
|
3
3
|
import { dispatchHit } from './hit-test.js';
|
|
4
4
|
import { effect } from './signals.js';
|
|
5
5
|
import { focusedElement, setFocus } from './focus.js';
|
|
6
|
-
import { collectFontFamiliesFromTree, waitForFonts } from './fonts.js';
|
|
6
|
+
import { collectFontFamiliesFromTree, resolveFontLoadTimeoutMs, waitForFonts } from './fonts.js';
|
|
7
7
|
import { dispatchKeyboardEvent, dispatchCompositionEvent } from './keyboard.js';
|
|
8
8
|
/**
|
|
9
9
|
* Mount a reactive UI tree onto a renderer.
|
|
@@ -14,8 +14,19 @@ import { dispatchKeyboardEvent, dispatchCompositionEvent } from './keyboard.js';
|
|
|
14
14
|
export async function createApp(view, renderer, options = {}) {
|
|
15
15
|
await init();
|
|
16
16
|
if (options.waitForFonts && typeof document !== 'undefined') {
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
try {
|
|
18
|
+
const initialTree = view();
|
|
19
|
+
await waitForFonts(collectFontFamiliesFromTree(initialTree), resolveFontLoadTimeoutMs(options.fontLoadTimeoutMs, 10_000));
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (options.onError) {
|
|
23
|
+
options.onError(err);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
console.error('Geometra render error:', err);
|
|
27
|
+
}
|
|
28
|
+
throw err;
|
|
29
|
+
}
|
|
19
30
|
}
|
|
20
31
|
const app = {
|
|
21
32
|
layout: null,
|
|
@@ -24,10 +35,13 @@ export async function createApp(view, renderer, options = {}) {
|
|
|
24
35
|
try {
|
|
25
36
|
app.tree = view();
|
|
26
37
|
const layoutTree = toLayoutTree(app.tree);
|
|
38
|
+
const layoutStart = typeof performance !== 'undefined' ? performance.now() : 0;
|
|
27
39
|
app.layout = computeLayout(layoutTree, {
|
|
28
40
|
width: options.width,
|
|
29
41
|
height: options.height,
|
|
30
42
|
});
|
|
43
|
+
const layoutMs = typeof performance !== 'undefined' ? performance.now() - layoutStart : 0;
|
|
44
|
+
renderer.setFrameTimings?.({ layoutMs });
|
|
31
45
|
renderer.render(app.layout, app.tree);
|
|
32
46
|
}
|
|
33
47
|
catch (err) {
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrD,OAAO,EAAE,2BAA2B,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Direction, UIElement } from './types.js';
|
|
2
|
+
export type ResolvedDirection = 'ltr' | 'rtl';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve an element direction value to a concrete runtime direction.
|
|
5
|
+
* Only `ltr` and `rtl` are honored; `undefined`, `auto`, and any other value (e.g. malformed
|
|
6
|
+
* serialized props) inherit {@link parentDirection} until script-level `auto` detection lands.
|
|
7
|
+
*/
|
|
8
|
+
export declare function resolveDirectionValue(dir: Direction | undefined, parentDirection?: ResolvedDirection): ResolvedDirection;
|
|
9
|
+
/** Resolve concrete direction for a UI element from its own `dir` and parent context. */
|
|
10
|
+
export declare function resolveElementDirection(element: UIElement, parentDirection?: ResolvedDirection): ResolvedDirection;
|
|
11
|
+
//# sourceMappingURL=direction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direction.d.ts","sourceRoot":"","sources":["../src/direction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtD,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,KAAK,CAAA;AAE7C;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,SAAS,GAAG,SAAS,EAC1B,eAAe,GAAE,iBAAyB,GACzC,iBAAiB,CAInB;AAED,yFAAyF;AACzF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,EAClB,eAAe,GAAE,iBAAyB,GACzC,iBAAiB,CAGnB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve an element direction value to a concrete runtime direction.
|
|
3
|
+
* Only `ltr` and `rtl` are honored; `undefined`, `auto`, and any other value (e.g. malformed
|
|
4
|
+
* serialized props) inherit {@link parentDirection} until script-level `auto` detection lands.
|
|
5
|
+
*/
|
|
6
|
+
export function resolveDirectionValue(dir, parentDirection = 'ltr') {
|
|
7
|
+
if (dir === 'rtl')
|
|
8
|
+
return 'rtl';
|
|
9
|
+
if (dir === 'ltr')
|
|
10
|
+
return 'ltr';
|
|
11
|
+
return parentDirection;
|
|
12
|
+
}
|
|
13
|
+
/** Resolve concrete direction for a UI element from its own `dir` and parent context. */
|
|
14
|
+
export function resolveElementDirection(element, parentDirection = 'ltr') {
|
|
15
|
+
const dir = element.props.dir;
|
|
16
|
+
return resolveDirectionValue(dir, parentDirection);
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=direction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direction.js","sourceRoot":"","sources":["../src/direction.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAA0B,EAC1B,kBAAqC,KAAK;IAE1C,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IAC/B,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAA;IAC/B,OAAO,eAAe,CAAA;AACxB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,uBAAuB,CACrC,OAAkB,EAClB,kBAAqC,KAAK;IAE1C,MAAM,GAAG,GAAI,OAAO,CAAC,KAA6B,CAAC,GAAG,CAAA;IACtD,OAAO,qBAAqB,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA;AACpD,CAAC"}
|
package/dist/elements.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { FlexProps } from 'textura';
|
|
2
|
-
import type { StyleProps, BoxElement, TextElement, ImageElement, UIElement, EventHandlers, SemanticProps } from './types.js';
|
|
3
|
-
type BoxProps = FlexProps & StyleProps & EventHandlers & {
|
|
2
|
+
import type { StyleProps, BoxElement, TextElement, ImageElement, UIElement, EventHandlers, SemanticProps, DirectionProps } from './types.js';
|
|
3
|
+
type BoxProps = FlexProps & StyleProps & DirectionProps & EventHandlers & {
|
|
4
4
|
key?: string;
|
|
5
5
|
semantic?: SemanticProps;
|
|
6
6
|
};
|
|
7
|
-
type TextProps = FlexProps & StyleProps & {
|
|
7
|
+
type TextProps = FlexProps & StyleProps & DirectionProps & {
|
|
8
8
|
text: string;
|
|
9
9
|
font: string;
|
|
10
10
|
lineHeight: number;
|
|
@@ -13,7 +13,7 @@ type TextProps = FlexProps & StyleProps & {
|
|
|
13
13
|
key?: string;
|
|
14
14
|
semantic?: SemanticProps;
|
|
15
15
|
};
|
|
16
|
-
type ImageProps = FlexProps & StyleProps & {
|
|
16
|
+
type ImageProps = FlexProps & StyleProps & DirectionProps & {
|
|
17
17
|
src: string;
|
|
18
18
|
alt?: string;
|
|
19
19
|
objectFit?: 'fill' | 'contain' | 'cover';
|
package/dist/elements.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACxC,OAAO,KAAK,EACV,UAAU,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,EACb,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,KAAK,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,aAAa,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,aAAa,CAAA;CAAE,CAAA;AACpH,KAAK,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG;IACzD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAA;IAClC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,aAAa,CAAA;CACzB,CAAA;AACD,KAAK,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG;IAC1D,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;IACxC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,aAAa,CAAA;CACzB,CAAA;AAED,wCAAwC;AACxC,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAE,SAAS,EAAO,GAAG,UAAU,CAoC3E;AAED,kCAAkC;AAClC,wBAAgB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,CAGlD;AAED,+BAA+B;AAC/B,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAGrD"}
|
package/dist/elements.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"elements.js","sourceRoot":"","sources":["../src/elements.ts"],"names":[],"mappings":"AA8BA,wCAAwC;AACxC,MAAM,UAAU,GAAG,CAAC,KAAe,EAAE,WAAwB,EAAE;IAC7D,MAAM,EACJ,OAAO,EACP,aAAa,EACb,WAAW,EACX,aAAa,EACb,OAAO,EACP,SAAS,EACT,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,GAAG,EACH,QAAQ,EACR,GAAG,IAAI,EACR,GAAG,KAAK,CAAA;IACT,MAAM,QAAQ,GAAkB,EAAE,CAAA;IAClC,IAAI,OAAO;QAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAA;IACvC,IAAI,aAAa;QAAE,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAA;IACzD,IAAI,WAAW;QAAE,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAA;IACnD,IAAI,aAAa;QAAE,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAA;IACzD,IAAI,OAAO;QAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAA;IACvC,IAAI,SAAS;QAAE,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAA;IAC7C,IAAI,OAAO;QAAE,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAA;IACvC,IAAI,kBAAkB;QAAE,QAAQ,CAAC,kBAAkB,GAAG,kBAAkB,CAAA;IACxE,IAAI,mBAAmB;QAAE,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAA;IAC3E,IAAI,gBAAgB;QAAE,QAAQ,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;IAElE,OAAO;QACL,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,IAAI;QACX,QAAQ;QACR,GAAG;QACH,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;QACjE,QAAQ;KACT,CAAA;AACH,CAAC;AAED,kCAAkC;AAClC,MAAM,UAAU,IAAI,CAAC,KAAgB;IACnC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IACxC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;AACrD,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,KAAK,CAAC,KAAiB;IACrC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAA;IACxC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;AACtD,CAAC"}
|
package/dist/focus-trap.d.ts
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
import type { ComputedLayout } from 'textura';
|
|
2
2
|
import type { UIElement } from './types.js';
|
|
3
3
|
/**
|
|
4
|
-
* Move focus
|
|
4
|
+
* Move focus to the next or previous focusable box inside a subtree (modal / overlay trap).
|
|
5
|
+
*
|
|
6
|
+
* Focusables are boxes with any of `onClick`, `onKeyDown`, `onKeyUp`, or composition handlers,
|
|
7
|
+
* in tree order (same rule as {@link collectFocusOrder}).
|
|
8
|
+
*
|
|
9
|
+
* When the current {@link focusedElement} is missing or not inside the trap list, `'next'`
|
|
10
|
+
* jumps to the first focusable and `'prev'` to the last — so focus can enter the trap from
|
|
11
|
+
* outside without clearing focus first.
|
|
12
|
+
*
|
|
13
|
+
* @param scopePath — Indices from the tree root to the trap root box (inclusive). Invalid
|
|
14
|
+
* paths (out-of-range index, non-box node, or empty focusable list under the subtree) yield `false`.
|
|
15
|
+
* @returns `true` if focus was moved, `false` if the scope is invalid or contains no focusables.
|
|
5
16
|
*/
|
|
6
17
|
export declare function trapFocusStep(tree: UIElement, layout: ComputedLayout, scopePath: number[], direction?: 'next' | 'prev'): boolean;
|
|
7
18
|
//# sourceMappingURL=focus-trap.d.ts.map
|
package/dist/focus-trap.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-trap.d.ts","sourceRoot":"","sources":["../src/focus-trap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,YAAY,CAAA;AA8CvD
|
|
1
|
+
{"version":3,"file":"focus-trap.d.ts","sourceRoot":"","sources":["../src/focus-trap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAc,MAAM,YAAY,CAAA;AA8CvD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EACf,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,EAAE,EACnB,SAAS,GAAE,MAAM,GAAG,MAAe,GAClC,OAAO,CAgBT"}
|
package/dist/focus-trap.js
CHANGED
|
@@ -35,7 +35,18 @@ function resolveSubtree(tree, layout, path) {
|
|
|
35
35
|
return { element: el, layout: lo };
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* Move focus
|
|
38
|
+
* Move focus to the next or previous focusable box inside a subtree (modal / overlay trap).
|
|
39
|
+
*
|
|
40
|
+
* Focusables are boxes with any of `onClick`, `onKeyDown`, `onKeyUp`, or composition handlers,
|
|
41
|
+
* in tree order (same rule as {@link collectFocusOrder}).
|
|
42
|
+
*
|
|
43
|
+
* When the current {@link focusedElement} is missing or not inside the trap list, `'next'`
|
|
44
|
+
* jumps to the first focusable and `'prev'` to the last — so focus can enter the trap from
|
|
45
|
+
* outside without clearing focus first.
|
|
46
|
+
*
|
|
47
|
+
* @param scopePath — Indices from the tree root to the trap root box (inclusive). Invalid
|
|
48
|
+
* paths (out-of-range index, non-box node, or empty focusable list under the subtree) yield `false`.
|
|
49
|
+
* @returns `true` if focus was moved, `false` if the scope is invalid or contains no focusables.
|
|
39
50
|
*/
|
|
40
51
|
export function trapFocusStep(tree, layout, scopePath, direction = 'next') {
|
|
41
52
|
const scope = resolveSubtree(tree, layout, scopePath);
|
package/dist/focus-trap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus-trap.js","sourceRoot":"","sources":["../src/focus-trap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAOrD,SAAS,gBAAgB,CAAC,OAAkB,EAAE,MAAsB,EAAE,GAAkB;IACtF,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK;QAAE,OAAM;IAClC,IACE,OAAO,CAAC,QAAQ,EAAE,OAAO;QACzB,OAAO,CAAC,QAAQ,EAAE,SAAS;QAC3B,OAAO,CAAC,QAAQ,EAAE,OAAO;QACzB,OAAO,CAAC,QAAQ,EAAE,kBAAkB;QACpC,OAAO,CAAC,QAAQ,EAAE,mBAAmB;QACrC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAClC,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAC/B,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QACtC,IAAI,KAAK,IAAI,WAAW;YAAE,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,CAAA;IACrE,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,IAAe,EACf,MAAsB,EACtB,IAAc;IAEd,IAAI,EAAE,GAAc,IAAI,CAAA;IACxB,IAAI,EAAE,GAAmB,MAAM,CAAA;IAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAA;QAClC,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACnC,EAAE,GAAG,MAAM,CAAA;QACX,EAAE,GAAG,MAAM,CAAA;IACb,CAAC;IACD,IAAI,EAAE,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA;IAClC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;AACpC,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"focus-trap.js","sourceRoot":"","sources":["../src/focus-trap.ts"],"names":[],"mappings":"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"}
|
package/dist/focus.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ComputedLayout } from 'textura';
|
|
2
2
|
import type { UIElement, BoxElement } from './types.js';
|
|
3
3
|
import type { Signal } from './signals.js';
|
|
4
|
-
interface FocusTarget {
|
|
4
|
+
export interface FocusTarget {
|
|
5
5
|
element: BoxElement;
|
|
6
6
|
layout: ComputedLayout;
|
|
7
7
|
focusIndex?: number;
|
|
@@ -12,11 +12,12 @@ export declare const focusedElement: Signal<FocusTarget | null>;
|
|
|
12
12
|
export declare function setFocus(element: BoxElement, layout: ComputedLayout): void;
|
|
13
13
|
/** Clear the current focus. */
|
|
14
14
|
export declare function clearFocus(): void;
|
|
15
|
+
/** Document-order focusable elements (Tab order). Useful for inspector overlays. */
|
|
16
|
+
export declare function collectFocusOrder(element: UIElement, layout: ComputedLayout): FocusTarget[];
|
|
15
17
|
/** Resolve currently focused target against the latest tree/layout after rerenders. */
|
|
16
18
|
export declare function resolveFocusedTarget(tree: UIElement, layout: ComputedLayout): FocusTarget | null;
|
|
17
19
|
/** Move focus to the next focusable element. */
|
|
18
20
|
export declare function focusNext(tree: UIElement, layout: ComputedLayout): void;
|
|
19
21
|
/** Move focus to the previous focusable element. */
|
|
20
22
|
export declare function focusPrev(tree: UIElement, layout: ComputedLayout): void;
|
|
21
|
-
export {};
|
|
22
23
|
//# sourceMappingURL=focus.d.ts.map
|
package/dist/focus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../src/focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,
|
|
1
|
+
{"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../src/focus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,CAAA;IACnB,MAAM,EAAE,cAAc,CAAA;IACtB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,qDAAqD;AACrD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAAoC,CAAA;AAE1F,+BAA+B;AAC/B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAE1E;AAED,+BAA+B;AAC/B,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,SAAS,EAClB,MAAM,EAAE,cAAc,GACrB,WAAW,EAAE,CAIf;AAsCD,uFAAuF;AACvF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,WAAW,GAAG,IAAI,CAmBhG;AAED,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAgBvE;AAED,oDAAoD;AACpD,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAiBvE"}
|
package/dist/focus.js
CHANGED
|
@@ -9,6 +9,12 @@ export function setFocus(element, layout) {
|
|
|
9
9
|
export function clearFocus() {
|
|
10
10
|
focusedElement.set(null);
|
|
11
11
|
}
|
|
12
|
+
/** Document-order focusable elements (Tab order). Useful for inspector overlays. */
|
|
13
|
+
export function collectFocusOrder(element, layout) {
|
|
14
|
+
const results = [];
|
|
15
|
+
collectFocusable(element, layout, results);
|
|
16
|
+
return results;
|
|
17
|
+
}
|
|
12
18
|
/** Collect all focusable elements (those with keyboard or click handlers) in document order. */
|
|
13
19
|
function collectFocusable(element, layout, results) {
|
|
14
20
|
if (element.kind === 'box') {
|
package/dist/focus.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"focus.js","sourceRoot":"","sources":["../src/focus.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"focus.js","sourceRoot":"","sources":["../src/focus.ts"],"names":[],"mappings":"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"}
|