@geometra/core 0.1.0 → 0.2.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 +42 -0
- package/dist/a11y.d.ts +19 -0
- package/dist/a11y.d.ts.map +1 -0
- package/dist/a11y.js +78 -0
- package/dist/a11y.js.map +1 -0
- package/dist/animation.d.ts +29 -0
- package/dist/animation.d.ts.map +1 -0
- package/dist/animation.js +102 -0
- package/dist/animation.js.map +1 -0
- package/dist/app.d.ts +17 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +41 -9
- package/dist/app.js.map +1 -1
- package/dist/elements.d.ts +13 -1
- package/dist/elements.d.ts.map +1 -1
- package/dist/elements.js +21 -3
- package/dist/elements.js.map +1 -1
- package/dist/focus.d.ts +19 -0
- package/dist/focus.d.ts.map +1 -0
- package/dist/focus.js +61 -0
- package/dist/focus.js.map +1 -0
- package/dist/fonts.d.ts +14 -0
- package/dist/fonts.d.ts.map +1 -0
- package/dist/fonts.js +67 -0
- package/dist/fonts.js.map +1 -0
- package/dist/hit-test.d.ts +13 -2
- package/dist/hit-test.d.ts.map +1 -1
- package/dist/hit-test.js +74 -7
- package/dist/hit-test.js.map +1 -1
- package/dist/index.d.ts +20 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -2
- package/dist/index.js.map +1 -1
- package/dist/keyboard.d.ts +10 -0
- package/dist/keyboard.d.ts.map +1 -0
- package/dist/keyboard.js +49 -0
- package/dist/keyboard.js.map +1 -0
- package/dist/selection.d.ts +46 -0
- package/dist/selection.d.ts.map +1 -0
- package/dist/selection.js +94 -0
- package/dist/selection.js.map +1 -0
- package/dist/seo.d.ts +29 -0
- package/dist/seo.d.ts.map +1 -0
- package/dist/seo.js +109 -0
- package/dist/seo.js.map +1 -0
- package/dist/text-input-history.d.ts +15 -0
- package/dist/text-input-history.d.ts.map +1 -0
- package/dist/text-input-history.js +62 -0
- package/dist/text-input-history.js.map +1 -0
- package/dist/text-input.d.ts +42 -0
- package/dist/text-input.d.ts.map +1 -0
- package/dist/text-input.js +249 -0
- package/dist/text-input.js.map +1 -0
- package/dist/tree.d.ts.map +1 -1
- package/dist/tree.js +9 -3
- package/dist/tree.js.map +1 -1
- package/dist/types.d.ts +81 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
package/dist/seo.js
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/** Infer an HTML tag from a text element's font property. */
|
|
2
|
+
function inferTag(element) {
|
|
3
|
+
const font = element.props.font.toLowerCase();
|
|
4
|
+
// Detect heading-like fonts by size
|
|
5
|
+
const sizeMatch = font.match(/(\d+)px/);
|
|
6
|
+
const size = sizeMatch ? parseInt(sizeMatch[1]) : 14;
|
|
7
|
+
const isBold = font.includes('bold');
|
|
8
|
+
if (isBold && size >= 28)
|
|
9
|
+
return 'h1';
|
|
10
|
+
if (isBold && size >= 22)
|
|
11
|
+
return 'h2';
|
|
12
|
+
if (isBold && size >= 18)
|
|
13
|
+
return 'h3';
|
|
14
|
+
if (isBold && size >= 15)
|
|
15
|
+
return 'h4';
|
|
16
|
+
return 'p';
|
|
17
|
+
}
|
|
18
|
+
/** Infer an HTML tag from a box element's styling and children. */
|
|
19
|
+
function inferBoxTag(element) {
|
|
20
|
+
// Check for nav-like patterns (row of clickable items)
|
|
21
|
+
if (element.handlers?.onClick)
|
|
22
|
+
return 'button';
|
|
23
|
+
return 'div';
|
|
24
|
+
}
|
|
25
|
+
/** Escape HTML special characters. */
|
|
26
|
+
function escapeHTML(str) {
|
|
27
|
+
return str
|
|
28
|
+
.replace(/&/g, '&')
|
|
29
|
+
.replace(/</g, '<')
|
|
30
|
+
.replace(/>/g, '>')
|
|
31
|
+
.replace(/"/g, '"');
|
|
32
|
+
}
|
|
33
|
+
/** Convert a UIElement tree to a semantic HTML string body. */
|
|
34
|
+
function elementToHTML(element, indent) {
|
|
35
|
+
const pad = ' '.repeat(indent);
|
|
36
|
+
if (element.kind === 'image') {
|
|
37
|
+
const imgEl = element;
|
|
38
|
+
const alt = imgEl.semantic?.alt ?? imgEl.props.alt ?? '';
|
|
39
|
+
return `${pad}<img src="${escapeHTML(imgEl.props.src)}" alt="${escapeHTML(alt)}">`;
|
|
40
|
+
}
|
|
41
|
+
if (element.kind === 'text') {
|
|
42
|
+
const tag = element.semantic?.tag ?? inferTag(element);
|
|
43
|
+
const attrs = [];
|
|
44
|
+
if (element.semantic?.role)
|
|
45
|
+
attrs.push(`role="${escapeHTML(element.semantic.role)}"`);
|
|
46
|
+
if (element.semantic?.ariaLabel)
|
|
47
|
+
attrs.push(`aria-label="${escapeHTML(element.semantic.ariaLabel)}"`);
|
|
48
|
+
const attrStr = attrs.length ? ' ' + attrs.join(' ') : '';
|
|
49
|
+
return `${pad}<${tag}${attrStr}>${escapeHTML(element.props.text)}</${tag}>`;
|
|
50
|
+
}
|
|
51
|
+
const tag = element.semantic?.tag ?? inferBoxTag(element);
|
|
52
|
+
const attrs = [];
|
|
53
|
+
if (element.semantic?.role)
|
|
54
|
+
attrs.push(`role="${escapeHTML(element.semantic.role)}"`);
|
|
55
|
+
if (element.semantic?.ariaLabel)
|
|
56
|
+
attrs.push(`aria-label="${escapeHTML(element.semantic.ariaLabel)}"`);
|
|
57
|
+
if (element.semantic?.alt)
|
|
58
|
+
attrs.push(`aria-label="${escapeHTML(element.semantic.alt)}"`);
|
|
59
|
+
const attrStr = attrs.length ? ' ' + attrs.join(' ') : '';
|
|
60
|
+
if (element.children.length === 0) {
|
|
61
|
+
return `${pad}<${tag}${attrStr}></${tag}>`;
|
|
62
|
+
}
|
|
63
|
+
const children = element.children.map(c => elementToHTML(c, indent + 1)).join('\n');
|
|
64
|
+
return `${pad}<${tag}${attrStr}>\n${children}\n${pad}</${tag}>`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate semantic HTML from a UIElement tree.
|
|
68
|
+
*
|
|
69
|
+
* This produces a full HTML document suitable for search engine crawlers.
|
|
70
|
+
* Serve this to user-agents like Googlebot while rendering the canvas
|
|
71
|
+
* version for real users.
|
|
72
|
+
*/
|
|
73
|
+
export function toSemanticHTML(tree, options = {}) {
|
|
74
|
+
const meta = [
|
|
75
|
+
'<meta charset="UTF-8">',
|
|
76
|
+
'<meta name="viewport" content="width=device-width, initial-scale=1.0">',
|
|
77
|
+
];
|
|
78
|
+
if (options.title)
|
|
79
|
+
meta.push(`<title>${escapeHTML(options.title)}</title>`);
|
|
80
|
+
if (options.description)
|
|
81
|
+
meta.push(`<meta name="description" content="${escapeHTML(options.description)}">`);
|
|
82
|
+
if (options.canonical)
|
|
83
|
+
meta.push(`<link rel="canonical" href="${escapeHTML(options.canonical)}">`);
|
|
84
|
+
if (options.og) {
|
|
85
|
+
if (options.og.title)
|
|
86
|
+
meta.push(`<meta property="og:title" content="${escapeHTML(options.og.title)}">`);
|
|
87
|
+
if (options.og.description)
|
|
88
|
+
meta.push(`<meta property="og:description" content="${escapeHTML(options.og.description)}">`);
|
|
89
|
+
if (options.og.image)
|
|
90
|
+
meta.push(`<meta property="og:image" content="${escapeHTML(options.og.image)}">`);
|
|
91
|
+
if (options.og.url)
|
|
92
|
+
meta.push(`<meta property="og:url" content="${escapeHTML(options.og.url)}">`);
|
|
93
|
+
if (options.og.type)
|
|
94
|
+
meta.push(`<meta property="og:type" content="${escapeHTML(options.og.type)}">`);
|
|
95
|
+
}
|
|
96
|
+
if (options.headExtra)
|
|
97
|
+
meta.push(options.headExtra);
|
|
98
|
+
const body = elementToHTML(tree, 2);
|
|
99
|
+
return `<!DOCTYPE html>
|
|
100
|
+
<html lang="en">
|
|
101
|
+
<head>
|
|
102
|
+
${meta.join('\n ')}
|
|
103
|
+
</head>
|
|
104
|
+
<body>
|
|
105
|
+
${body}
|
|
106
|
+
</body>
|
|
107
|
+
</html>`;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=seo.js.map
|
package/dist/seo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seo.js","sourceRoot":"","sources":["../src/seo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TextInputState, TextInputEditResult } from './text-input.js';
|
|
2
|
+
export interface TextInputHistoryState {
|
|
3
|
+
past: TextInputState[];
|
|
4
|
+
present: TextInputState;
|
|
5
|
+
future: TextInputState[];
|
|
6
|
+
}
|
|
7
|
+
/** Create a history container for editable text state. */
|
|
8
|
+
export declare function createTextInputHistory(initial: TextInputState): TextInputHistoryState;
|
|
9
|
+
/** Push a new edit state and clear redo stack. */
|
|
10
|
+
export declare function pushTextInputHistory(history: TextInputHistoryState, next: TextInputState | TextInputEditResult, maxPast?: number): TextInputHistoryState;
|
|
11
|
+
/** Undo one step, if available. */
|
|
12
|
+
export declare function undoTextInputHistory(history: TextInputHistoryState): TextInputHistoryState;
|
|
13
|
+
/** Redo one step, if available. */
|
|
14
|
+
export declare function redoTextInputHistory(history: TextInputHistoryState): TextInputHistoryState;
|
|
15
|
+
//# sourceMappingURL=text-input-history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input-history.d.ts","sourceRoot":"","sources":["../src/text-input-history.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,EAAE,CAAA;IACtB,OAAO,EAAE,cAAc,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;CACzB;AASD,0DAA0D;AAC1D,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,GAAG,qBAAqB,CAMrF;AAED,kDAAkD;AAClD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,EAC9B,IAAI,EAAE,cAAc,GAAG,mBAAmB,EAC1C,OAAO,SAAM,GACZ,qBAAqB,CAyBvB;AAED,mCAAmC;AACnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,CAS1F;AAED,mCAAmC;AACnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,qBAAqB,CAQ1F"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
function cloneState(state) {
|
|
2
|
+
return {
|
|
3
|
+
nodes: [...state.nodes],
|
|
4
|
+
selection: { ...state.selection },
|
|
5
|
+
};
|
|
6
|
+
}
|
|
7
|
+
/** Create a history container for editable text state. */
|
|
8
|
+
export function createTextInputHistory(initial) {
|
|
9
|
+
return {
|
|
10
|
+
past: [],
|
|
11
|
+
present: cloneState(initial),
|
|
12
|
+
future: [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Push a new edit state and clear redo stack. */
|
|
16
|
+
export function pushTextInputHistory(history, next, maxPast = 100) {
|
|
17
|
+
const present = cloneState(history.present);
|
|
18
|
+
const incoming = cloneState({
|
|
19
|
+
nodes: [...next.nodes],
|
|
20
|
+
selection: { ...next.selection },
|
|
21
|
+
});
|
|
22
|
+
if (present.nodes.join('\n') === incoming.nodes.join('\n') &&
|
|
23
|
+
present.selection.anchorNode === incoming.selection.anchorNode &&
|
|
24
|
+
present.selection.anchorOffset === incoming.selection.anchorOffset &&
|
|
25
|
+
present.selection.focusNode === incoming.selection.focusNode &&
|
|
26
|
+
present.selection.focusOffset === incoming.selection.focusOffset) {
|
|
27
|
+
return history;
|
|
28
|
+
}
|
|
29
|
+
const past = [...history.past, present];
|
|
30
|
+
if (past.length > maxPast) {
|
|
31
|
+
past.splice(0, past.length - maxPast);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
past,
|
|
35
|
+
present: incoming,
|
|
36
|
+
future: [],
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Undo one step, if available. */
|
|
40
|
+
export function undoTextInputHistory(history) {
|
|
41
|
+
if (history.past.length === 0)
|
|
42
|
+
return history;
|
|
43
|
+
const past = [...history.past];
|
|
44
|
+
const prev = past.pop();
|
|
45
|
+
return {
|
|
46
|
+
past,
|
|
47
|
+
present: cloneState(prev),
|
|
48
|
+
future: [cloneState(history.present), ...history.future],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Redo one step, if available. */
|
|
52
|
+
export function redoTextInputHistory(history) {
|
|
53
|
+
if (history.future.length === 0)
|
|
54
|
+
return history;
|
|
55
|
+
const [next, ...future] = history.future;
|
|
56
|
+
return {
|
|
57
|
+
past: [...history.past, cloneState(history.present)],
|
|
58
|
+
present: cloneState(next),
|
|
59
|
+
future: future.map(cloneState),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=text-input-history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input-history.js","sourceRoot":"","sources":["../src/text-input-history.ts"],"names":[],"mappings":"AAQA,SAAS,UAAU,CAAC,KAAqB;IACvC,OAAO;QACL,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;QACvB,SAAS,EAAE,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE;KAClC,CAAA;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,sBAAsB,CAAC,OAAuB;IAC5D,OAAO;QACL,IAAI,EAAE,EAAE;QACR,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;QAC5B,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,oBAAoB,CAClC,OAA8B,EAC9B,IAA0C,EAC1C,OAAO,GAAG,GAAG;IAEb,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,UAAU,CAAC;QAC1B,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACtB,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE;KACjC,CAAC,CAAA;IACF,IACE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACtD,OAAO,CAAC,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,SAAS,CAAC,UAAU;QAC9D,OAAO,CAAC,SAAS,CAAC,YAAY,KAAK,QAAQ,CAAC,SAAS,CAAC,YAAY;QAClE,OAAO,CAAC,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,CAAC,SAAS;QAC5D,OAAO,CAAC,SAAS,CAAC,WAAW,KAAK,QAAQ,CAAC,SAAS,CAAC,WAAW,EAChE,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAA;IACvC,CAAC;IACD,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,QAAQ;QACjB,MAAM,EAAE,EAAE;KACX,CAAA;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IAC7C,MAAM,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAG,CAAA;IACxB,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC;QACzB,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;KACzD,CAAA;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,oBAAoB,CAAC,OAA8B;IACjE,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IAC/C,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAA;IACxC,OAAO;QACL,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,EAAE,UAAU,CAAC,IAAK,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;KAC/B,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { SelectionRange } from './selection.js';
|
|
2
|
+
import type { TextNodeInfo } from './selection.js';
|
|
3
|
+
export interface TextInputState {
|
|
4
|
+
/** Editable text split into logical nodes/runs. */
|
|
5
|
+
nodes: string[];
|
|
6
|
+
/** Active selection/caret in node-local offsets. */
|
|
7
|
+
selection: SelectionRange;
|
|
8
|
+
}
|
|
9
|
+
export interface TextInputEditResult {
|
|
10
|
+
nodes: string[];
|
|
11
|
+
selection: SelectionRange;
|
|
12
|
+
}
|
|
13
|
+
export interface CaretGeometry {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
height: number;
|
|
17
|
+
nodeIndex: number;
|
|
18
|
+
offset: number;
|
|
19
|
+
}
|
|
20
|
+
/** True when selection is a collapsed caret. */
|
|
21
|
+
export declare function isCollapsedSelection(selection: SelectionRange): boolean;
|
|
22
|
+
/** Extract selected text from editable nodes. */
|
|
23
|
+
export declare function getInputSelectionText(nodes: string[], selection: SelectionRange): string;
|
|
24
|
+
/**
|
|
25
|
+
* Replace current selection with inserted text.
|
|
26
|
+
* For multi-line insertion, newlines create additional nodes.
|
|
27
|
+
*/
|
|
28
|
+
export declare function replaceInputSelection(nodes: string[], selection: SelectionRange, insertedText: string): TextInputEditResult;
|
|
29
|
+
/** Insert text at current selection/caret. */
|
|
30
|
+
export declare function insertInputText(state: TextInputState, text: string): TextInputEditResult;
|
|
31
|
+
/** Backspace behavior across node boundaries and active selections. */
|
|
32
|
+
export declare function backspaceInput(state: TextInputState): TextInputEditResult;
|
|
33
|
+
/** Delete-forward behavior across node boundaries and active selections. */
|
|
34
|
+
export declare function deleteInput(state: TextInputState): TextInputEditResult;
|
|
35
|
+
/** Move caret by one character; optionally extend existing selection. */
|
|
36
|
+
export declare function moveInputCaret(state: TextInputState, direction: 'left' | 'right', extendSelection?: boolean): TextInputEditResult;
|
|
37
|
+
/**
|
|
38
|
+
* Compute caret geometry from measured text lines for a collapsed selection.
|
|
39
|
+
* Returns null when selection is expanded or text metrics are unavailable.
|
|
40
|
+
*/
|
|
41
|
+
export declare function getInputCaretGeometry(textNodes: TextNodeInfo[], selection: SelectionRange): CaretGeometry | null;
|
|
42
|
+
//# sourceMappingURL=text-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input.d.ts","sourceRoot":"","sources":["../src/text-input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,WAAW,cAAc;IAC7B,mDAAmD;IACnD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,oDAAoD;IACpD,SAAS,EAAE,cAAc,CAAA;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,SAAS,EAAE,cAAc,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAuCD,gDAAgD;AAChD,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAKvE;AAED,iDAAiD;AACjD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,CAiBxF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,SAAS,EAAE,cAAc,EACzB,YAAY,EAAE,MAAM,GACnB,mBAAmB,CAgCrB;AAED,8CAA8C;AAC9C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,MAAM,GACX,mBAAmB,CAErB;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,CAqCzE;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,mBAAmB,CAoCtE;AAED,yEAAyE;AACzE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,eAAe,UAAQ,GACtB,mBAAmB,CAiDrB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,YAAY,EAAE,EACzB,SAAS,EAAE,cAAc,GACxB,aAAa,GAAG,IAAI,CAmCtB"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
function clamp(n, min, max) {
|
|
2
|
+
return Math.min(max, Math.max(min, n));
|
|
3
|
+
}
|
|
4
|
+
function normalizeSelection(selection) {
|
|
5
|
+
const { anchorNode, anchorOffset, focusNode, focusOffset, } = selection;
|
|
6
|
+
if (anchorNode < focusNode ||
|
|
7
|
+
(anchorNode === focusNode && anchorOffset <= focusOffset)) {
|
|
8
|
+
return selection;
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
anchorNode: focusNode,
|
|
12
|
+
anchorOffset: focusOffset,
|
|
13
|
+
focusNode: anchorNode,
|
|
14
|
+
focusOffset: anchorOffset,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function clampSelection(nodes, selection) {
|
|
18
|
+
if (nodes.length === 0) {
|
|
19
|
+
return { anchorNode: 0, anchorOffset: 0, focusNode: 0, focusOffset: 0 };
|
|
20
|
+
}
|
|
21
|
+
const maxNode = nodes.length - 1;
|
|
22
|
+
const aNode = clamp(selection.anchorNode, 0, maxNode);
|
|
23
|
+
const fNode = clamp(selection.focusNode, 0, maxNode);
|
|
24
|
+
const aOffset = clamp(selection.anchorOffset, 0, nodes[aNode].length);
|
|
25
|
+
const fOffset = clamp(selection.focusOffset, 0, nodes[fNode].length);
|
|
26
|
+
return { anchorNode: aNode, anchorOffset: aOffset, focusNode: fNode, focusOffset: fOffset };
|
|
27
|
+
}
|
|
28
|
+
/** True when selection is a collapsed caret. */
|
|
29
|
+
export function isCollapsedSelection(selection) {
|
|
30
|
+
return (selection.anchorNode === selection.focusNode &&
|
|
31
|
+
selection.anchorOffset === selection.focusOffset);
|
|
32
|
+
}
|
|
33
|
+
/** Extract selected text from editable nodes. */
|
|
34
|
+
export function getInputSelectionText(nodes, selection) {
|
|
35
|
+
if (nodes.length === 0)
|
|
36
|
+
return '';
|
|
37
|
+
const s = normalizeSelection(clampSelection(nodes, selection));
|
|
38
|
+
const parts = [];
|
|
39
|
+
for (let i = s.anchorNode; i <= s.focusNode; i++) {
|
|
40
|
+
const text = nodes[i];
|
|
41
|
+
if (i === s.anchorNode && i === s.focusNode) {
|
|
42
|
+
parts.push(text.slice(s.anchorOffset, s.focusOffset));
|
|
43
|
+
}
|
|
44
|
+
else if (i === s.anchorNode) {
|
|
45
|
+
parts.push(text.slice(s.anchorOffset));
|
|
46
|
+
}
|
|
47
|
+
else if (i === s.focusNode) {
|
|
48
|
+
parts.push(text.slice(0, s.focusOffset));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
parts.push(text);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return parts.join('\n');
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Replace current selection with inserted text.
|
|
58
|
+
* For multi-line insertion, newlines create additional nodes.
|
|
59
|
+
*/
|
|
60
|
+
export function replaceInputSelection(nodes, selection, insertedText) {
|
|
61
|
+
const safeNodes = nodes.length > 0 ? [...nodes] : [''];
|
|
62
|
+
const s = normalizeSelection(clampSelection(safeNodes, selection));
|
|
63
|
+
const startText = safeNodes[s.anchorNode];
|
|
64
|
+
const endText = safeNodes[s.focusNode];
|
|
65
|
+
const before = startText.slice(0, s.anchorOffset);
|
|
66
|
+
const after = endText.slice(s.focusOffset);
|
|
67
|
+
const insertedParts = insertedText.split('\n');
|
|
68
|
+
const replacement = insertedParts.length === 1
|
|
69
|
+
? [`${before}${insertedParts[0]}${after}`]
|
|
70
|
+
: [
|
|
71
|
+
`${before}${insertedParts[0]}`,
|
|
72
|
+
...insertedParts.slice(1, insertedParts.length - 1),
|
|
73
|
+
`${insertedParts[insertedParts.length - 1]}${after}`,
|
|
74
|
+
];
|
|
75
|
+
safeNodes.splice(s.anchorNode, s.focusNode - s.anchorNode + 1, ...replacement);
|
|
76
|
+
const caretNode = s.anchorNode + replacement.length - 1;
|
|
77
|
+
const caretOffset = replacement[replacement.length - 1].length - after.length;
|
|
78
|
+
return {
|
|
79
|
+
nodes: safeNodes,
|
|
80
|
+
selection: {
|
|
81
|
+
anchorNode: caretNode,
|
|
82
|
+
anchorOffset: caretOffset,
|
|
83
|
+
focusNode: caretNode,
|
|
84
|
+
focusOffset: caretOffset,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Insert text at current selection/caret. */
|
|
89
|
+
export function insertInputText(state, text) {
|
|
90
|
+
return replaceInputSelection(state.nodes, state.selection, text);
|
|
91
|
+
}
|
|
92
|
+
/** Backspace behavior across node boundaries and active selections. */
|
|
93
|
+
export function backspaceInput(state) {
|
|
94
|
+
const nodes = state.nodes.length > 0 ? state.nodes : [''];
|
|
95
|
+
const selection = clampSelection(nodes, state.selection);
|
|
96
|
+
if (!isCollapsedSelection(selection)) {
|
|
97
|
+
return replaceInputSelection(nodes, selection, '');
|
|
98
|
+
}
|
|
99
|
+
if (selection.anchorOffset > 0) {
|
|
100
|
+
return replaceInputSelection(nodes, {
|
|
101
|
+
anchorNode: selection.anchorNode,
|
|
102
|
+
anchorOffset: selection.anchorOffset - 1,
|
|
103
|
+
focusNode: selection.focusNode,
|
|
104
|
+
focusOffset: selection.focusOffset,
|
|
105
|
+
}, '');
|
|
106
|
+
}
|
|
107
|
+
if (selection.anchorNode === 0)
|
|
108
|
+
return { nodes: [...nodes], selection };
|
|
109
|
+
const prevNode = selection.anchorNode - 1;
|
|
110
|
+
const merged = [...nodes];
|
|
111
|
+
const prevText = merged[prevNode];
|
|
112
|
+
const currText = merged[selection.anchorNode];
|
|
113
|
+
merged.splice(prevNode, 2, `${prevText}${currText}`);
|
|
114
|
+
const caretOffset = prevText.length;
|
|
115
|
+
return {
|
|
116
|
+
nodes: merged,
|
|
117
|
+
selection: {
|
|
118
|
+
anchorNode: prevNode,
|
|
119
|
+
anchorOffset: caretOffset,
|
|
120
|
+
focusNode: prevNode,
|
|
121
|
+
focusOffset: caretOffset,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/** Delete-forward behavior across node boundaries and active selections. */
|
|
126
|
+
export function deleteInput(state) {
|
|
127
|
+
const nodes = state.nodes.length > 0 ? state.nodes : [''];
|
|
128
|
+
const selection = clampSelection(nodes, state.selection);
|
|
129
|
+
if (!isCollapsedSelection(selection)) {
|
|
130
|
+
return replaceInputSelection(nodes, selection, '');
|
|
131
|
+
}
|
|
132
|
+
const node = nodes[selection.anchorNode];
|
|
133
|
+
if (selection.anchorOffset < node.length) {
|
|
134
|
+
return replaceInputSelection(nodes, {
|
|
135
|
+
anchorNode: selection.anchorNode,
|
|
136
|
+
anchorOffset: selection.anchorOffset,
|
|
137
|
+
focusNode: selection.focusNode,
|
|
138
|
+
focusOffset: selection.focusOffset + 1,
|
|
139
|
+
}, '');
|
|
140
|
+
}
|
|
141
|
+
if (selection.anchorNode >= nodes.length - 1)
|
|
142
|
+
return { nodes: [...nodes], selection };
|
|
143
|
+
const merged = [...nodes];
|
|
144
|
+
const currText = merged[selection.anchorNode];
|
|
145
|
+
const nextText = merged[selection.anchorNode + 1];
|
|
146
|
+
merged.splice(selection.anchorNode, 2, `${currText}${nextText}`);
|
|
147
|
+
return {
|
|
148
|
+
nodes: merged,
|
|
149
|
+
selection: {
|
|
150
|
+
anchorNode: selection.anchorNode,
|
|
151
|
+
anchorOffset: node.length,
|
|
152
|
+
focusNode: selection.anchorNode,
|
|
153
|
+
focusOffset: node.length,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/** Move caret by one character; optionally extend existing selection. */
|
|
158
|
+
export function moveInputCaret(state, direction, extendSelection = false) {
|
|
159
|
+
const nodes = state.nodes.length > 0 ? state.nodes : [''];
|
|
160
|
+
const selection = clampSelection(nodes, state.selection);
|
|
161
|
+
const collapsed = isCollapsedSelection(selection);
|
|
162
|
+
let nodeIndex = extendSelection ? selection.focusNode : selection.anchorNode;
|
|
163
|
+
let offset = extendSelection ? selection.focusOffset : selection.anchorOffset;
|
|
164
|
+
if (!collapsed && !extendSelection) {
|
|
165
|
+
const s = normalizeSelection(selection);
|
|
166
|
+
if (direction === 'left') {
|
|
167
|
+
nodeIndex = s.anchorNode;
|
|
168
|
+
offset = s.anchorOffset;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
nodeIndex = s.focusNode;
|
|
172
|
+
offset = s.focusOffset;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else if (direction === 'left') {
|
|
176
|
+
if (offset > 0) {
|
|
177
|
+
offset--;
|
|
178
|
+
}
|
|
179
|
+
else if (nodeIndex > 0) {
|
|
180
|
+
nodeIndex--;
|
|
181
|
+
offset = nodes[nodeIndex].length;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const text = nodes[nodeIndex];
|
|
186
|
+
if (offset < text.length) {
|
|
187
|
+
offset++;
|
|
188
|
+
}
|
|
189
|
+
else if (nodeIndex < nodes.length - 1) {
|
|
190
|
+
nodeIndex++;
|
|
191
|
+
offset = 0;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const nextSelection = extendSelection
|
|
195
|
+
? {
|
|
196
|
+
anchorNode: selection.anchorNode,
|
|
197
|
+
anchorOffset: selection.anchorOffset,
|
|
198
|
+
focusNode: nodeIndex,
|
|
199
|
+
focusOffset: offset,
|
|
200
|
+
}
|
|
201
|
+
: {
|
|
202
|
+
anchorNode: nodeIndex,
|
|
203
|
+
anchorOffset: offset,
|
|
204
|
+
focusNode: nodeIndex,
|
|
205
|
+
focusOffset: offset,
|
|
206
|
+
};
|
|
207
|
+
return { nodes: [...nodes], selection: nextSelection };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Compute caret geometry from measured text lines for a collapsed selection.
|
|
211
|
+
* Returns null when selection is expanded or text metrics are unavailable.
|
|
212
|
+
*/
|
|
213
|
+
export function getInputCaretGeometry(textNodes, selection) {
|
|
214
|
+
if (!isCollapsedSelection(selection))
|
|
215
|
+
return null;
|
|
216
|
+
const node = textNodes[selection.focusNode];
|
|
217
|
+
if (!node || node.lines.length === 0)
|
|
218
|
+
return null;
|
|
219
|
+
const maxOffset = node.element.props.text.length;
|
|
220
|
+
const targetOffset = clamp(selection.focusOffset, 0, maxOffset);
|
|
221
|
+
let traversed = 0;
|
|
222
|
+
for (const line of node.lines) {
|
|
223
|
+
const lineEnd = traversed + line.text.length;
|
|
224
|
+
const isLastLine = line === node.lines[node.lines.length - 1];
|
|
225
|
+
if (targetOffset <= lineEnd || isLastLine) {
|
|
226
|
+
const local = Math.max(0, Math.min(targetOffset - traversed, line.text.length));
|
|
227
|
+
let x = line.x;
|
|
228
|
+
if (local > 0 && line.charOffsets.length > 0) {
|
|
229
|
+
if (local < line.charOffsets.length) {
|
|
230
|
+
x += line.charOffsets[local] ?? 0;
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
const lastIndex = line.charOffsets.length - 1;
|
|
234
|
+
x += (line.charOffsets[lastIndex] ?? 0) + (line.charWidths[lastIndex] ?? 0);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
x,
|
|
239
|
+
y: line.y,
|
|
240
|
+
height: node.element.props.lineHeight,
|
|
241
|
+
nodeIndex: node.index,
|
|
242
|
+
offset: targetOffset,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
traversed = lineEnd;
|
|
246
|
+
}
|
|
247
|
+
return null;
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=text-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input.js","sourceRoot":"","sources":["../src/text-input.ts"],"names":[],"mappings":"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"}
|
package/dist/tree.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAe3C,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,UAAU,CAW3D"}
|
package/dist/tree.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
|
+
/** Style/visual props that must be stripped before passing to Yoga layout. */
|
|
2
|
+
function stripStyleProps(props) {
|
|
3
|
+
const { backgroundColor: _bg, color: _c, borderColor: _bc, borderRadius: _br, borderWidth: _bw, opacity: _o, cursor: _cur, zIndex: _z, overflow: _ov, scrollX: _sx, scrollY: _sy, boxShadow: _bs, gradient: _g, selectable: _sel,
|
|
4
|
+
// Image-only props
|
|
5
|
+
src: _src, alt: _alt, objectFit: _of, ...layoutProps } = props;
|
|
6
|
+
return layoutProps;
|
|
7
|
+
}
|
|
1
8
|
/** Convert a UIElement tree into a textura LayoutNode tree for layout computation. */
|
|
2
9
|
export function toLayoutTree(element) {
|
|
3
|
-
|
|
4
|
-
|
|
10
|
+
const layoutProps = stripStyleProps(element.props);
|
|
11
|
+
if (element.kind === 'text' || element.kind === 'image') {
|
|
5
12
|
return layoutProps;
|
|
6
13
|
}
|
|
7
|
-
const { backgroundColor: _bg, color: _c, borderColor: _bc, borderRadius: _br, opacity: _o, ...layoutProps } = element.props;
|
|
8
14
|
return {
|
|
9
15
|
...layoutProps,
|
|
10
16
|
children: element.children.map(toLayoutTree),
|
package/dist/tree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAGA,
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,SAAS,eAAe,CAAC,KAA8B;IACrD,MAAM,EACJ,eAAe,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EACtF,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAChF,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI;IAC9C,mBAAmB;IACnB,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EACpC,GAAG,WAAW,EACf,GAAG,KAAK,CAAA;IACT,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,OAAkB;IAC7C,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAA;IAE7E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxD,OAAO,WAAyB,CAAA;IAClC,CAAC;IAED,OAAO;QACL,GAAG,WAAW;QACd,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC;KAC/B,CAAA;AACjB,CAAC"}
|