@hypen-space/web 0.4.980 → 0.5.3
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 +20 -13
- package/dist/canvas/accessibility.d.ts +118 -11
- package/dist/canvas/accessibility.js +470 -108
- package/dist/canvas/accessibility.js.map +1 -1
- package/dist/canvas/dispatch.d.ts +24 -0
- package/dist/canvas/dispatch.js +62 -0
- package/dist/canvas/dispatch.js.map +1 -0
- package/dist/canvas/editing.d.ts +178 -0
- package/dist/canvas/editing.js +590 -0
- package/dist/canvas/editing.js.map +1 -0
- package/dist/canvas/events.d.ts +28 -23
- package/dist/canvas/events.js +90 -103
- package/dist/canvas/events.js.map +1 -1
- package/dist/canvas/focus.d.ts +78 -0
- package/dist/canvas/focus.js +182 -0
- package/dist/canvas/focus.js.map +1 -0
- package/dist/canvas/index.d.ts +3 -2
- package/dist/canvas/index.js +3 -2
- package/dist/canvas/index.js.map +1 -1
- package/dist/canvas/layout.js +68 -98
- package/dist/canvas/layout.js.map +1 -1
- package/dist/canvas/paint.d.ts +16 -3
- package/dist/canvas/paint.js +449 -110
- package/dist/canvas/paint.js.map +1 -1
- package/dist/canvas/renderer.d.ts +28 -4
- package/dist/canvas/renderer.js +201 -81
- package/dist/canvas/renderer.js.map +1 -1
- package/dist/canvas/selection.js +31 -177
- package/dist/canvas/selection.js.map +1 -1
- package/dist/canvas/text-geometry.d.ts +72 -0
- package/dist/canvas/text-geometry.js +244 -0
- package/dist/canvas/text-geometry.js.map +1 -0
- package/dist/canvas/text.js +44 -18
- package/dist/canvas/text.js.map +1 -1
- package/dist/canvas/types.d.ts +10 -1
- package/dist/canvas/utils.d.ts +0 -23
- package/dist/canvas/utils.js +3 -67
- package/dist/canvas/utils.js.map +1 -1
- package/dist/canvas/variants.d.ts +52 -0
- package/dist/canvas/variants.js +156 -0
- package/dist/canvas/variants.js.map +1 -0
- package/dist/dom/a11y-styles.d.ts +20 -0
- package/dist/dom/a11y-styles.js +61 -0
- package/dist/dom/a11y-styles.js.map +1 -0
- package/dist/dom/applicators/aria.d.ts +19 -0
- package/dist/dom/applicators/aria.js +36 -0
- package/dist/dom/applicators/aria.js.map +1 -0
- package/dist/dom/applicators/events.d.ts +7 -0
- package/dist/dom/applicators/events.js +36 -8
- package/dist/dom/applicators/events.js.map +1 -1
- package/dist/dom/applicators/font.d.ts +11 -6
- package/dist/dom/applicators/font.js +16 -27
- package/dist/dom/applicators/font.js.map +1 -1
- package/dist/dom/applicators/index.js +51 -45
- package/dist/dom/applicators/index.js.map +1 -1
- package/dist/dom/canvas/index.js +2 -2
- package/dist/dom/canvas/index.js.map +1 -1
- package/dist/dom/components/app.js +2 -2
- package/dist/dom/components/app.js.map +1 -1
- package/dist/dom/components/audio.js +2 -2
- package/dist/dom/components/audio.js.map +1 -1
- package/dist/dom/components/avatar.js +3 -4
- package/dist/dom/components/avatar.js.map +1 -1
- package/dist/dom/components/badge.js +3 -4
- package/dist/dom/components/badge.js.map +1 -1
- package/dist/dom/components/button.js +2 -2
- package/dist/dom/components/button.js.map +1 -1
- package/dist/dom/components/card.js +2 -2
- package/dist/dom/components/card.js.map +1 -1
- package/dist/dom/components/center.js +2 -2
- package/dist/dom/components/center.js.map +1 -1
- package/dist/dom/components/checkbox.js +4 -5
- package/dist/dom/components/checkbox.js.map +1 -1
- package/dist/dom/components/column.js +2 -2
- package/dist/dom/components/column.js.map +1 -1
- package/dist/dom/components/container.js +2 -2
- package/dist/dom/components/container.js.map +1 -1
- package/dist/dom/components/divider.js +2 -2
- package/dist/dom/components/divider.js.map +1 -1
- package/dist/dom/components/grid.js +10 -10
- package/dist/dom/components/grid.js.map +1 -1
- package/dist/dom/components/heading.js +4 -6
- package/dist/dom/components/heading.js.map +1 -1
- package/dist/dom/components/hypenapp.d.ts +25 -1
- package/dist/dom/components/hypenapp.js +215 -247
- package/dist/dom/components/hypenapp.js.map +1 -1
- package/dist/dom/components/icon.js +4 -5
- package/dist/dom/components/icon.js.map +1 -1
- package/dist/dom/components/image.js +2 -2
- package/dist/dom/components/image.js.map +1 -1
- package/dist/dom/components/index.d.ts +2 -2
- package/dist/dom/components/index.js +9 -2
- package/dist/dom/components/index.js.map +1 -1
- package/dist/dom/components/input.js +2 -2
- package/dist/dom/components/input.js.map +1 -1
- package/dist/dom/components/link.js +2 -2
- package/dist/dom/components/link.js.map +1 -1
- package/dist/dom/components/list.js +2 -2
- package/dist/dom/components/list.js.map +1 -1
- package/dist/dom/components/paragraph.js +3 -4
- package/dist/dom/components/paragraph.js.map +1 -1
- package/dist/dom/components/progressbar.js +3 -3
- package/dist/dom/components/progressbar.js.map +1 -1
- package/dist/dom/components/route.js +2 -2
- package/dist/dom/components/route.js.map +1 -1
- package/dist/dom/components/router.js +2 -2
- package/dist/dom/components/router.js.map +1 -1
- package/dist/dom/components/row.js +10 -10
- package/dist/dom/components/row.js.map +1 -1
- package/dist/dom/components/select.js +3 -4
- package/dist/dom/components/select.js.map +1 -1
- package/dist/dom/components/slider.js +2 -2
- package/dist/dom/components/slider.js.map +1 -1
- package/dist/dom/components/spacer.js +2 -2
- package/dist/dom/components/spacer.js.map +1 -1
- package/dist/dom/components/spinner.js +27 -13
- package/dist/dom/components/spinner.js.map +1 -1
- package/dist/dom/components/stack.js +10 -10
- package/dist/dom/components/stack.js.map +1 -1
- package/dist/dom/components/switch.js +5 -6
- package/dist/dom/components/switch.js.map +1 -1
- package/dist/dom/components/tabs.d.ts +27 -0
- package/dist/dom/components/tabs.js +69 -0
- package/dist/dom/components/tabs.js.map +1 -0
- package/dist/dom/components/text.js +4 -7
- package/dist/dom/components/text.js.map +1 -1
- package/dist/dom/components/textarea.js +2 -2
- package/dist/dom/components/textarea.js.map +1 -1
- package/dist/dom/components/video.js +2 -2
- package/dist/dom/components/video.js.map +1 -1
- package/dist/dom/components/visuallyhidden.d.ts +9 -0
- package/dist/dom/components/visuallyhidden.js +26 -0
- package/dist/dom/components/visuallyhidden.js.map +1 -0
- package/dist/dom/debug.js +6 -8
- package/dist/dom/debug.js.map +1 -1
- package/dist/dom/index.d.ts +0 -1
- package/dist/dom/index.js +0 -1
- package/dist/dom/index.js.map +1 -1
- package/dist/dom/operability.d.ts +100 -0
- package/dist/dom/operability.js +298 -0
- package/dist/dom/operability.js.map +1 -0
- package/dist/dom/renderer.d.ts +98 -5
- package/dist/dom/renderer.js +400 -66
- package/dist/dom/renderer.js.map +1 -1
- package/dist/dom/route-focus.d.ts +42 -0
- package/dist/dom/route-focus.js +88 -0
- package/dist/dom/route-focus.js.map +1 -0
- package/dist/dom/semantics.d.ts +35 -0
- package/dist/dom/semantics.js +184 -0
- package/dist/dom/semantics.js.map +1 -0
- package/dist/variants.d.ts +90 -0
- package/dist/variants.js +206 -0
- package/dist/variants.js.map +1 -0
- package/package.json +2 -2
- package/src/canvas/QUICKSTART.md +16 -11
- package/src/canvas/README.md +63 -34
- package/src/canvas/accessibility.ts +507 -115
- package/src/canvas/dispatch.ts +78 -0
- package/src/canvas/editing.ts +697 -0
- package/src/canvas/events.ts +104 -115
- package/src/canvas/focus.ts +216 -0
- package/src/canvas/index.ts +8 -9
- package/src/canvas/layout.ts +68 -103
- package/src/canvas/paint.ts +509 -109
- package/src/canvas/renderer.ts +239 -99
- package/src/canvas/selection.ts +52 -210
- package/src/canvas/text-geometry.ts +311 -0
- package/src/canvas/text.ts +45 -18
- package/src/canvas/types.ts +28 -1
- package/src/canvas/utils.ts +3 -69
- package/src/canvas/variants.ts +172 -0
- package/src/dom/README.md +8 -7
- package/src/dom/a11y-styles.ts +65 -0
- package/src/dom/applicators/aria.ts +41 -0
- package/src/dom/applicators/events.ts +39 -7
- package/src/dom/applicators/font.ts +16 -29
- package/src/dom/applicators/index.ts +61 -46
- package/src/dom/canvas/index.ts +2 -2
- package/src/dom/components/app.ts +2 -2
- package/src/dom/components/audio.ts +2 -2
- package/src/dom/components/avatar.ts +3 -4
- package/src/dom/components/badge.ts +3 -4
- package/src/dom/components/button.ts +2 -2
- package/src/dom/components/card.ts +2 -2
- package/src/dom/components/center.ts +2 -2
- package/src/dom/components/checkbox.ts +4 -5
- package/src/dom/components/column.ts +2 -2
- package/src/dom/components/container.ts +2 -2
- package/src/dom/components/divider.ts +2 -2
- package/src/dom/components/grid.ts +10 -10
- package/src/dom/components/heading.ts +4 -6
- package/src/dom/components/hypenapp.ts +246 -274
- package/src/dom/components/icon.ts +4 -5
- package/src/dom/components/image.ts +2 -2
- package/src/dom/components/index.ts +10 -3
- package/src/dom/components/input.ts +2 -2
- package/src/dom/components/link.ts +2 -2
- package/src/dom/components/list.ts +2 -2
- package/src/dom/components/paragraph.ts +3 -4
- package/src/dom/components/progressbar.ts +3 -3
- package/src/dom/components/route.ts +2 -2
- package/src/dom/components/router.ts +2 -2
- package/src/dom/components/row.ts +10 -10
- package/src/dom/components/select.ts +3 -4
- package/src/dom/components/slider.ts +2 -2
- package/src/dom/components/spacer.ts +2 -2
- package/src/dom/components/spinner.ts +34 -16
- package/src/dom/components/stack.ts +10 -10
- package/src/dom/components/switch.ts +5 -6
- package/src/dom/components/tabs.ts +76 -0
- package/src/dom/components/text.ts +4 -7
- package/src/dom/components/textarea.ts +2 -2
- package/src/dom/components/video.ts +2 -2
- package/src/dom/components/visuallyhidden.ts +30 -0
- package/src/dom/debug.ts +6 -8
- package/src/dom/index.ts +0 -8
- package/src/dom/operability.ts +312 -0
- package/src/dom/renderer.ts +457 -66
- package/src/dom/route-focus.ts +98 -0
- package/src/dom/semantics.ts +199 -0
- package/src/variants.ts +249 -0
- package/dist/canvas/input.d.ts +0 -76
- package/dist/canvas/input.js +0 -207
- package/dist/canvas/input.js.map +0 -1
- package/dist/client.d.ts +0 -36
- package/dist/client.js +0 -47
- package/dist/client.js.map +0 -1
- package/src/canvas/input.ts +0 -251
- package/src/client.ts +0 -88
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native Canvas Text Editing
|
|
3
|
+
*
|
|
4
|
+
* Text, caret, and selection are painted on the canvas; the browser does
|
|
5
|
+
* the actual editing (typing, caret movement, word-jumps, select-all,
|
|
6
|
+
* clipboard, undo, IME composition) in a single hidden **proxy textarea**
|
|
7
|
+
* positioned at the caret — the Monaco/xterm.js approach. This controller
|
|
8
|
+
* reads `value`/`selectionStart`/`selectionEnd` from the proxy after each
|
|
9
|
+
* event and the canvas paints the result. No visible DOM overlay.
|
|
10
|
+
*
|
|
11
|
+
* Why a proxy and not the accessibility-mirror input itself: the proxy is
|
|
12
|
+
* per-session and positioned at the caret, which (a) puts the IME candidate
|
|
13
|
+
* window next to the painted text regardless of where the mirror element
|
|
14
|
+
* sits, and (b) gives screen readers a FRESH focus target per field so
|
|
15
|
+
* every field is announced (AT stays silent when focus "returns" to an
|
|
16
|
+
* element it already announced). Focus and accessibility live on the
|
|
17
|
+
* mirror; the keystroke stream lives on the proxy.
|
|
18
|
+
*
|
|
19
|
+
* Positioning the proxy at the caret makes the IME candidate window
|
|
20
|
+
* appear next to the painted text.
|
|
21
|
+
*
|
|
22
|
+
* Data flow for one keystroke:
|
|
23
|
+
* focusin on mirror input → beginEditing → proxy seeded + focused
|
|
24
|
+
* key → proxy (native edit) → "input" event
|
|
25
|
+
* → EditState {value, selStart, selEnd} read from the proxy
|
|
26
|
+
* → node.props.value = value (local echo so the next paint is current)
|
|
27
|
+
* → engine.dispatchAction("__hypen_bind", {path, value}) (two-way bind)
|
|
28
|
+
* → scheduleRedraw + caret blink reset
|
|
29
|
+
* engine echoes SetProp("value") → onEngineValueEcho → same value → no-op
|
|
30
|
+
* (a *different* echo, e.g. engine-side formatting, rewrites the proxy
|
|
31
|
+
* and clamps the selection).
|
|
32
|
+
*/
|
|
33
|
+
import { getScrollAwareBounds } from "./scroll.js";
|
|
34
|
+
import { cssLengthToPx } from "./utils.js";
|
|
35
|
+
import { nodeTextGeometry, offsetToCaretRect, pointToOffset, } from "./text-geometry.js";
|
|
36
|
+
/** Margin kept between the caret and the content edge when auto-scrolling. */
|
|
37
|
+
const CARET_SCROLL_MARGIN = 4;
|
|
38
|
+
export function isEditableNode(node) {
|
|
39
|
+
if (!node)
|
|
40
|
+
return false;
|
|
41
|
+
const t = node.type.toLowerCase();
|
|
42
|
+
return t === "input" || t === "textarea";
|
|
43
|
+
}
|
|
44
|
+
/** Whether an element lives inside the accessibility mirror. */
|
|
45
|
+
function isInMirror(el) {
|
|
46
|
+
let current = el;
|
|
47
|
+
while (current) {
|
|
48
|
+
if (current.getAttribute?.("data-hypen-id"))
|
|
49
|
+
return true;
|
|
50
|
+
current = current.parentNode;
|
|
51
|
+
}
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
export class TextEditController {
|
|
55
|
+
canvas;
|
|
56
|
+
engine;
|
|
57
|
+
hooks;
|
|
58
|
+
state = null;
|
|
59
|
+
bindPath = null;
|
|
60
|
+
proxy = null;
|
|
61
|
+
/** Blink period; tests may set 0 to disable the timer. */
|
|
62
|
+
blinkIntervalMs = 530;
|
|
63
|
+
blinkTimer = null;
|
|
64
|
+
// Drag-selection tracking (canvas mousemove while button held on the node)
|
|
65
|
+
dragAnchor = null;
|
|
66
|
+
boundInput = () => this.onInput();
|
|
67
|
+
boundSelect = () => this.onSelectionMaybeChanged();
|
|
68
|
+
boundKeyUp = () => this.onSelectionMaybeChanged();
|
|
69
|
+
boundKeyDown = (e) => this.onKeyDown(e);
|
|
70
|
+
boundCompStart = () => this.onCompositionStart();
|
|
71
|
+
boundCompUpdate = (e) => this.onCompositionUpdate(e);
|
|
72
|
+
boundCompEnd = () => this.onCompositionEnd();
|
|
73
|
+
boundSelectionChange = () => this.onDocumentSelectionChange();
|
|
74
|
+
boundBlur = (e) => this.onProxyBlur(e);
|
|
75
|
+
boundDragMove = (e) => this.onDragMove(e);
|
|
76
|
+
boundDragEnd = () => this.onDragEnd();
|
|
77
|
+
constructor(canvas, engine, hooks) {
|
|
78
|
+
this.canvas = canvas;
|
|
79
|
+
this.engine = engine;
|
|
80
|
+
this.hooks = hooks;
|
|
81
|
+
}
|
|
82
|
+
// -------------------------------------------------------------------------
|
|
83
|
+
// Session lifecycle
|
|
84
|
+
// -------------------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* The hidden keystroke/IME target. A FRESH element per edit session:
|
|
87
|
+
* screen readers key announcements off focus moving to a *new* node — a
|
|
88
|
+
* reused proxy reads as "focus returned to the element I already
|
|
89
|
+
* announced" and stays silent, so tabbing between fields would speak the
|
|
90
|
+
* first field's label and then nothing. Kept OUT of the tab order
|
|
91
|
+
* (tabindex=-1) — Tab reaches inputs through their mirror elements;
|
|
92
|
+
* `beginEditing` hands focus here from there.
|
|
93
|
+
*/
|
|
94
|
+
createProxy(node) {
|
|
95
|
+
if (typeof document === "undefined")
|
|
96
|
+
return null;
|
|
97
|
+
const proxy = document.createElement("textarea");
|
|
98
|
+
proxy.setAttribute("tabindex", "-1");
|
|
99
|
+
proxy.setAttribute("autocorrect", "off");
|
|
100
|
+
proxy.setAttribute("autocapitalize", "off");
|
|
101
|
+
proxy.setAttribute("spellcheck", "false");
|
|
102
|
+
proxy.setAttribute("data-hypen-ime-proxy", "");
|
|
103
|
+
Object.assign(proxy.style, {
|
|
104
|
+
position: "absolute",
|
|
105
|
+
width: "1px",
|
|
106
|
+
height: "16px",
|
|
107
|
+
padding: "0",
|
|
108
|
+
border: "0",
|
|
109
|
+
outline: "none",
|
|
110
|
+
margin: "0",
|
|
111
|
+
opacity: "0",
|
|
112
|
+
background: "transparent",
|
|
113
|
+
color: "transparent",
|
|
114
|
+
resize: "none",
|
|
115
|
+
overflow: "hidden",
|
|
116
|
+
zIndex: "1000",
|
|
117
|
+
// Never intercept pointer events meant for the canvas underneath.
|
|
118
|
+
pointerEvents: "none",
|
|
119
|
+
});
|
|
120
|
+
// Announce like the field it stands in for: label, hint, multiline-ness.
|
|
121
|
+
const isSingleLine = node.type.toLowerCase() === "input";
|
|
122
|
+
proxy.setAttribute("aria-multiline", isSingleLine ? "false" : "true");
|
|
123
|
+
const label = node.semantics?.name || node.props.placeholder || node.props["aria-label"];
|
|
124
|
+
if (label)
|
|
125
|
+
proxy.setAttribute("aria-label", String(label));
|
|
126
|
+
if (node.props.placeholder != null) {
|
|
127
|
+
proxy.placeholder = String(node.props.placeholder);
|
|
128
|
+
}
|
|
129
|
+
// IME metrics and iOS zoom guard: candidate windows size off the
|
|
130
|
+
// focused element's font; iOS Safari zooms inputs under 16px.
|
|
131
|
+
const fontSize = Math.max(16, cssLengthToPx(node.props.fontSize) ?? 16);
|
|
132
|
+
proxy.style.font = `${fontSize}px ${node.props.fontFamily || "system-ui, sans-serif"}`;
|
|
133
|
+
const host = this.canvas.parentElement ||
|
|
134
|
+
(typeof document !== "undefined" ? document.body : null);
|
|
135
|
+
host?.appendChild?.(proxy);
|
|
136
|
+
return proxy;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Start editing a node. `mirrorElement` is the node's fallback-content
|
|
140
|
+
* element (focus/AT anchor); keystrokes flow through the hidden proxy.
|
|
141
|
+
* Idempotent for the same node.
|
|
142
|
+
*/
|
|
143
|
+
beginEditing(node, mirrorElement) {
|
|
144
|
+
if (this.state?.node === node)
|
|
145
|
+
return;
|
|
146
|
+
this.endEditing();
|
|
147
|
+
const element = this.createProxy(node);
|
|
148
|
+
if (!element)
|
|
149
|
+
return;
|
|
150
|
+
this.proxy = element;
|
|
151
|
+
this.bindPath = typeof node.props.bind === "string" ? node.props.bind : null;
|
|
152
|
+
// Seed the proxy from the node; caret at the end (the pointer path
|
|
153
|
+
// refines it via placeCaretFromPoint right after).
|
|
154
|
+
const value = String(node.props.value ?? "");
|
|
155
|
+
element.value = value;
|
|
156
|
+
element.setSelectionRange?.(value.length, value.length);
|
|
157
|
+
this.state = {
|
|
158
|
+
node,
|
|
159
|
+
element,
|
|
160
|
+
mirrorElement,
|
|
161
|
+
value,
|
|
162
|
+
selStart: element.selectionStart ?? value.length,
|
|
163
|
+
selEnd: element.selectionEnd ?? value.length,
|
|
164
|
+
compStart: null,
|
|
165
|
+
compEnd: null,
|
|
166
|
+
composing: false,
|
|
167
|
+
scrollX: 0,
|
|
168
|
+
caretVisible: true,
|
|
169
|
+
};
|
|
170
|
+
element.addEventListener("input", this.boundInput);
|
|
171
|
+
element.addEventListener("select", this.boundSelect);
|
|
172
|
+
element.addEventListener("keyup", this.boundKeyUp);
|
|
173
|
+
element.addEventListener("keydown", this.boundKeyDown);
|
|
174
|
+
element.addEventListener("compositionstart", this.boundCompStart);
|
|
175
|
+
element.addEventListener("compositionupdate", this.boundCompUpdate);
|
|
176
|
+
element.addEventListener("compositionend", this.boundCompEnd);
|
|
177
|
+
element.addEventListener("blur", this.boundBlur);
|
|
178
|
+
// Belt-and-braces caret tracking: `select`/`keyup` miss some caret-only
|
|
179
|
+
// movements in some engines; document selectionchange covers them.
|
|
180
|
+
if (typeof document !== "undefined") {
|
|
181
|
+
document.addEventListener?.("selectionchange", this.boundSelectionChange);
|
|
182
|
+
}
|
|
183
|
+
this.ensureCaretVisible();
|
|
184
|
+
this.syncProxyPosition();
|
|
185
|
+
element.focus?.({ preventScroll: true });
|
|
186
|
+
this.startBlink();
|
|
187
|
+
this.hooks.markDirty(node);
|
|
188
|
+
this.hooks.scheduleRedraw();
|
|
189
|
+
}
|
|
190
|
+
/** Stop editing (focus left the node, Enter/Escape, teardown). */
|
|
191
|
+
endEditing() {
|
|
192
|
+
const state = this.state;
|
|
193
|
+
if (!state)
|
|
194
|
+
return;
|
|
195
|
+
const { element, node } = state;
|
|
196
|
+
element.removeEventListener("input", this.boundInput);
|
|
197
|
+
element.removeEventListener("select", this.boundSelect);
|
|
198
|
+
element.removeEventListener("keyup", this.boundKeyUp);
|
|
199
|
+
element.removeEventListener("keydown", this.boundKeyDown);
|
|
200
|
+
element.removeEventListener("compositionstart", this.boundCompStart);
|
|
201
|
+
element.removeEventListener("compositionupdate", this.boundCompUpdate);
|
|
202
|
+
element.removeEventListener("compositionend", this.boundCompEnd);
|
|
203
|
+
element.removeEventListener("blur", this.boundBlur);
|
|
204
|
+
if (typeof document !== "undefined") {
|
|
205
|
+
document.removeEventListener?.("selectionchange", this.boundSelectionChange);
|
|
206
|
+
}
|
|
207
|
+
// A composition cut short by blur/navigation still owes the engine its
|
|
208
|
+
// final value.
|
|
209
|
+
if (state.composing) {
|
|
210
|
+
this.dispatchBind(state.value);
|
|
211
|
+
}
|
|
212
|
+
this.stopBlink();
|
|
213
|
+
this.onDragEnd();
|
|
214
|
+
this.state = null;
|
|
215
|
+
this.bindPath = null;
|
|
216
|
+
// If the session ends while the proxy still holds focus (detach,
|
|
217
|
+
// remove, clear), release it. Listener is already removed, so this
|
|
218
|
+
// can't re-enter.
|
|
219
|
+
if (typeof document !== "undefined" && document.activeElement === element) {
|
|
220
|
+
element.blur?.();
|
|
221
|
+
}
|
|
222
|
+
// The proxy is per-session (fresh element per field so AT announces
|
|
223
|
+
// each one) — remove it from the DOM entirely.
|
|
224
|
+
element.remove?.();
|
|
225
|
+
this.proxy = null;
|
|
226
|
+
this.hooks.markDirty(node);
|
|
227
|
+
this.hooks.scheduleRedraw();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Focus left the proxy. Movement back into the mirror (Tab transit, or a
|
|
231
|
+
* click that focuses another node) is handled by the FocusManager's own
|
|
232
|
+
* focusin — only a true departure ends the session here.
|
|
233
|
+
*/
|
|
234
|
+
onProxyBlur(e) {
|
|
235
|
+
if (!this.state)
|
|
236
|
+
return;
|
|
237
|
+
const next = e.relatedTarget;
|
|
238
|
+
if (next && this.state.mirrorElement.parentNode && isInMirror(next))
|
|
239
|
+
return;
|
|
240
|
+
this.endEditing();
|
|
241
|
+
this.hooks.onEditBlur();
|
|
242
|
+
}
|
|
243
|
+
/** True while `element` is this controller's proxy (focus bookkeeping). */
|
|
244
|
+
isProxyElement(element) {
|
|
245
|
+
return this.proxy !== null && element === this.proxy;
|
|
246
|
+
}
|
|
247
|
+
/** The hidden proxy textarea (test/diagnostic access). */
|
|
248
|
+
getProxyElement() {
|
|
249
|
+
return this.proxy;
|
|
250
|
+
}
|
|
251
|
+
isActive() {
|
|
252
|
+
return this.state !== null;
|
|
253
|
+
}
|
|
254
|
+
/** Editing state for a node, or null — read by paintInput each frame. */
|
|
255
|
+
getStateFor(node) {
|
|
256
|
+
return this.state?.node === node ? this.state : null;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* End the session if the edited node is `node` or a descendant of it —
|
|
260
|
+
* called by the renderer before remove/detach unlinks a subtree (in a
|
|
261
|
+
* real browser removing a focused element blurs it, but the renderer
|
|
262
|
+
* can't rely on that in every host environment).
|
|
263
|
+
*/
|
|
264
|
+
endIfWithin(node) {
|
|
265
|
+
let current = this.state?.node ?? null;
|
|
266
|
+
while (current) {
|
|
267
|
+
if (current === node) {
|
|
268
|
+
this.endEditing();
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
current = current.parent;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
destroy() {
|
|
275
|
+
this.endEditing();
|
|
276
|
+
}
|
|
277
|
+
// -------------------------------------------------------------------------
|
|
278
|
+
// Element events → state → engine
|
|
279
|
+
// -------------------------------------------------------------------------
|
|
280
|
+
syncFromElement() {
|
|
281
|
+
const state = this.state;
|
|
282
|
+
if (!state)
|
|
283
|
+
return false;
|
|
284
|
+
const { element } = state;
|
|
285
|
+
const value = String(element.value ?? "");
|
|
286
|
+
const selStart = element.selectionStart ?? value.length;
|
|
287
|
+
const selEnd = element.selectionEnd ?? value.length;
|
|
288
|
+
const changed = value !== state.value || selStart !== state.selStart || selEnd !== state.selEnd;
|
|
289
|
+
state.value = value;
|
|
290
|
+
state.selStart = selStart;
|
|
291
|
+
state.selEnd = selEnd;
|
|
292
|
+
return changed;
|
|
293
|
+
}
|
|
294
|
+
onInput() {
|
|
295
|
+
const state = this.state;
|
|
296
|
+
if (!state)
|
|
297
|
+
return;
|
|
298
|
+
this.syncFromElement();
|
|
299
|
+
// Local echo: the next paint shows the typed text before the engine
|
|
300
|
+
// round-trips it via SetProp.
|
|
301
|
+
state.node.props.value = state.value;
|
|
302
|
+
// Two-way binding — suppressed during IME composition (intermediate
|
|
303
|
+
// composition strings aren't values); compositionend flushes the final.
|
|
304
|
+
if (!state.composing) {
|
|
305
|
+
this.dispatchBind(state.value);
|
|
306
|
+
}
|
|
307
|
+
this.afterEditActivity();
|
|
308
|
+
}
|
|
309
|
+
onSelectionMaybeChanged() {
|
|
310
|
+
if (!this.state)
|
|
311
|
+
return;
|
|
312
|
+
if (this.syncFromElement()) {
|
|
313
|
+
this.afterEditActivity();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
onDocumentSelectionChange() {
|
|
317
|
+
const state = this.state;
|
|
318
|
+
if (!state)
|
|
319
|
+
return;
|
|
320
|
+
if (typeof document === "undefined" || document.activeElement !== state.element)
|
|
321
|
+
return;
|
|
322
|
+
this.onSelectionMaybeChanged();
|
|
323
|
+
}
|
|
324
|
+
onKeyDown(e) {
|
|
325
|
+
const state = this.state;
|
|
326
|
+
if (!state)
|
|
327
|
+
return;
|
|
328
|
+
const isSingleLine = state.node.type.toLowerCase() === "input";
|
|
329
|
+
// Enter submits single-line inputs (blur commits), Escape cancels focus.
|
|
330
|
+
// The proxy's blur handler ends the session, matching the old overlay.
|
|
331
|
+
if ((e.key === "Enter" && isSingleLine && !state.composing) || e.key === "Escape") {
|
|
332
|
+
e.preventDefault();
|
|
333
|
+
state.element.blur?.();
|
|
334
|
+
return;
|
|
335
|
+
}
|
|
336
|
+
// Tab transit: hand focus back to the node's mirror element WITHOUT
|
|
337
|
+
// preventDefault — the browser's default sequential navigation then
|
|
338
|
+
// proceeds from the mirror, landing on the next/previous mirror element
|
|
339
|
+
// (or out of the canvas) in natural order. If the destination is
|
|
340
|
+
// another Input, its focusin starts the next edit session.
|
|
341
|
+
if (e.key === "Tab" && !state.composing) {
|
|
342
|
+
state.mirrorElement.focus?.({ preventScroll: true });
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
onCompositionStart() {
|
|
346
|
+
const state = this.state;
|
|
347
|
+
if (!state)
|
|
348
|
+
return;
|
|
349
|
+
state.composing = true;
|
|
350
|
+
state.compStart = state.selStart;
|
|
351
|
+
state.compEnd = state.selStart;
|
|
352
|
+
}
|
|
353
|
+
onCompositionUpdate(e) {
|
|
354
|
+
const state = this.state;
|
|
355
|
+
if (!state || state.compStart === null)
|
|
356
|
+
return;
|
|
357
|
+
state.compEnd = state.compStart + (e.data?.length ?? 0);
|
|
358
|
+
this.afterEditActivity();
|
|
359
|
+
}
|
|
360
|
+
onCompositionEnd() {
|
|
361
|
+
const state = this.state;
|
|
362
|
+
if (!state)
|
|
363
|
+
return;
|
|
364
|
+
state.composing = false;
|
|
365
|
+
state.compStart = null;
|
|
366
|
+
state.compEnd = null;
|
|
367
|
+
// Browsers disagree on input-vs-compositionend ordering; syncing and
|
|
368
|
+
// dispatching here covers both (the same-value no-op makes double
|
|
369
|
+
// dispatch harmless).
|
|
370
|
+
this.syncFromElement();
|
|
371
|
+
state.node.props.value = state.value;
|
|
372
|
+
this.dispatchBind(state.value);
|
|
373
|
+
this.afterEditActivity();
|
|
374
|
+
}
|
|
375
|
+
dispatchBind(value) {
|
|
376
|
+
if (!this.bindPath)
|
|
377
|
+
return;
|
|
378
|
+
this.engine.dispatchAction("__hypen_bind", { path: this.bindPath, value });
|
|
379
|
+
}
|
|
380
|
+
/** Common tail for anything that edited or moved the caret. */
|
|
381
|
+
afterEditActivity() {
|
|
382
|
+
const state = this.state;
|
|
383
|
+
if (!state)
|
|
384
|
+
return;
|
|
385
|
+
this.ensureCaretVisible();
|
|
386
|
+
this.syncProxyPosition();
|
|
387
|
+
state.caretVisible = true;
|
|
388
|
+
this.restartBlink();
|
|
389
|
+
this.hooks.markDirty(state.node);
|
|
390
|
+
this.hooks.scheduleRedraw();
|
|
391
|
+
}
|
|
392
|
+
// -------------------------------------------------------------------------
|
|
393
|
+
// Engine echo
|
|
394
|
+
// -------------------------------------------------------------------------
|
|
395
|
+
/**
|
|
396
|
+
* The engine confirmed/rewrote the value via SetProp. Our own echo
|
|
397
|
+
* round-tripping (same value) must NOT touch the element — writing
|
|
398
|
+
* `element.value` collapses the caret. A genuinely different value
|
|
399
|
+
* (engine-side formatting) rewrites the element and clamps the selection.
|
|
400
|
+
*/
|
|
401
|
+
onEngineValueEcho(node) {
|
|
402
|
+
const state = this.state;
|
|
403
|
+
if (!state || state.node !== node)
|
|
404
|
+
return;
|
|
405
|
+
const value = String(node.props.value ?? "");
|
|
406
|
+
if (value === state.value)
|
|
407
|
+
return;
|
|
408
|
+
const { element } = state;
|
|
409
|
+
element.value = value;
|
|
410
|
+
const sel = Math.min(state.selEnd, value.length);
|
|
411
|
+
element.setSelectionRange?.(sel, sel);
|
|
412
|
+
this.syncFromElement();
|
|
413
|
+
this.afterEditActivity();
|
|
414
|
+
}
|
|
415
|
+
// -------------------------------------------------------------------------
|
|
416
|
+
// Pointer path — caret placement and drag selection on the canvas
|
|
417
|
+
// -------------------------------------------------------------------------
|
|
418
|
+
/**
|
|
419
|
+
* Map a canvas mousedown on the edited node to a caret position, and arm
|
|
420
|
+
* drag-selection until mouseup.
|
|
421
|
+
*/
|
|
422
|
+
placeCaretFromPoint(node, point) {
|
|
423
|
+
const state = this.state;
|
|
424
|
+
if (!state || state.node !== node)
|
|
425
|
+
return;
|
|
426
|
+
const offset = this.offsetFromPoint(point);
|
|
427
|
+
if (offset === null)
|
|
428
|
+
return;
|
|
429
|
+
state.element.setSelectionRange?.(offset, offset);
|
|
430
|
+
this.dragAnchor = offset;
|
|
431
|
+
this.canvas.addEventListener("mousemove", this.boundDragMove);
|
|
432
|
+
(typeof window !== "undefined" ? window : this.canvas).addEventListener("mouseup", this.boundDragEnd);
|
|
433
|
+
this.syncFromElement();
|
|
434
|
+
this.afterEditActivity();
|
|
435
|
+
}
|
|
436
|
+
onDragMove(e) {
|
|
437
|
+
const state = this.state;
|
|
438
|
+
if (!state || this.dragAnchor === null)
|
|
439
|
+
return;
|
|
440
|
+
const rect = this.canvas.getBoundingClientRect();
|
|
441
|
+
const offset = this.offsetFromPoint({
|
|
442
|
+
x: e.clientX - rect.left,
|
|
443
|
+
y: e.clientY - rect.top,
|
|
444
|
+
});
|
|
445
|
+
if (offset === null)
|
|
446
|
+
return;
|
|
447
|
+
state.element.setSelectionRange?.(Math.min(this.dragAnchor, offset), Math.max(this.dragAnchor, offset), offset < this.dragAnchor ? "backward" : "forward");
|
|
448
|
+
if (this.syncFromElement()) {
|
|
449
|
+
this.afterEditActivity();
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
onDragEnd() {
|
|
453
|
+
if (this.dragAnchor === null)
|
|
454
|
+
return;
|
|
455
|
+
this.dragAnchor = null;
|
|
456
|
+
this.canvas.removeEventListener("mousemove", this.boundDragMove);
|
|
457
|
+
(typeof window !== "undefined" ? window : this.canvas).removeEventListener("mouseup", this.boundDragEnd);
|
|
458
|
+
}
|
|
459
|
+
/** Canvas-space point → character offset in the edited node's value. */
|
|
460
|
+
offsetFromPoint(point) {
|
|
461
|
+
const state = this.state;
|
|
462
|
+
if (!state)
|
|
463
|
+
return null;
|
|
464
|
+
const ctx = this.canvas.getContext("2d");
|
|
465
|
+
const bounds = getScrollAwareBounds(state.node);
|
|
466
|
+
const layout = state.node.layout;
|
|
467
|
+
if (!ctx || !bounds || !layout)
|
|
468
|
+
return null;
|
|
469
|
+
const g = this.geometry(bounds.x + layout.contentX - state.scrollX, bounds.y + layout.contentY);
|
|
470
|
+
return pointToOffset(ctx, g, point);
|
|
471
|
+
}
|
|
472
|
+
// -------------------------------------------------------------------------
|
|
473
|
+
// Geometry (shared with paintInput via getStateFor + text-geometry)
|
|
474
|
+
// -------------------------------------------------------------------------
|
|
475
|
+
/**
|
|
476
|
+
* TextGeometry for the edited value at a given content origin. Single-line
|
|
477
|
+
* inputs don't wrap and are middle-aligned; textareas wrap at content
|
|
478
|
+
* width and are top-aligned — both matching how paintInput draws them.
|
|
479
|
+
*/
|
|
480
|
+
geometry(contentX, contentY) {
|
|
481
|
+
const state = this.state;
|
|
482
|
+
const isSingleLine = state.node.type.toLowerCase() === "input";
|
|
483
|
+
const g = nodeTextGeometry(state.node, state.value, contentX, contentY, {
|
|
484
|
+
verticalAlign: isSingleLine ? "middle" : "top",
|
|
485
|
+
wrap: !isSingleLine,
|
|
486
|
+
});
|
|
487
|
+
// Inputs always paint left-aligned (paintInput parity).
|
|
488
|
+
g.textAlign = "left";
|
|
489
|
+
return g;
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Position the proxy at the caret in page coordinates so the IME
|
|
493
|
+
* candidate window opens next to the painted text. Called on every edit
|
|
494
|
+
* activity and by the renderer after each frame (layout/scroll changes).
|
|
495
|
+
*/
|
|
496
|
+
syncProxyPosition() {
|
|
497
|
+
const state = this.state;
|
|
498
|
+
if (!state)
|
|
499
|
+
return;
|
|
500
|
+
const el = state.element;
|
|
501
|
+
if (!el.style)
|
|
502
|
+
return;
|
|
503
|
+
const canvasBounds = this.canvas.getBoundingClientRect?.();
|
|
504
|
+
if (!canvasBounds)
|
|
505
|
+
return;
|
|
506
|
+
const ctx = this.canvas.getContext("2d");
|
|
507
|
+
const bounds = getScrollAwareBounds(state.node);
|
|
508
|
+
const layout = state.node.layout;
|
|
509
|
+
let x = canvasBounds.left;
|
|
510
|
+
let y = canvasBounds.top;
|
|
511
|
+
let h = 16;
|
|
512
|
+
if (ctx && bounds && layout) {
|
|
513
|
+
const g = this.geometry(bounds.x + layout.contentX - state.scrollX, bounds.y + layout.contentY);
|
|
514
|
+
const caret = offsetToCaretRect(ctx, g, state.selEnd);
|
|
515
|
+
x += caret.x;
|
|
516
|
+
y += caret.y;
|
|
517
|
+
h = caret.height;
|
|
518
|
+
}
|
|
519
|
+
// Same page-coordinate math the old overlay used: canvas rect is
|
|
520
|
+
// viewport-relative, absolute positioning is document-relative.
|
|
521
|
+
const sx = typeof window !== "undefined" ? window.scrollX : 0;
|
|
522
|
+
const sy = typeof window !== "undefined" ? window.scrollY : 0;
|
|
523
|
+
Object.assign(el.style, {
|
|
524
|
+
left: `${x + sx}px`,
|
|
525
|
+
top: `${y + sy}px`,
|
|
526
|
+
height: `${h}px`,
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Keep the caret inside the visible content box of single-line inputs by
|
|
531
|
+
* panning `scrollX` (textareas wrap instead).
|
|
532
|
+
*/
|
|
533
|
+
ensureCaretVisible() {
|
|
534
|
+
const state = this.state;
|
|
535
|
+
if (!state)
|
|
536
|
+
return;
|
|
537
|
+
if (state.node.type.toLowerCase() !== "input")
|
|
538
|
+
return;
|
|
539
|
+
const ctx = this.canvas.getContext("2d");
|
|
540
|
+
const layout = state.node.layout;
|
|
541
|
+
if (!ctx || !layout)
|
|
542
|
+
return;
|
|
543
|
+
// Content-space geometry (origin 0) — caretX is the caret's distance
|
|
544
|
+
// from the content-box left edge before scrolling.
|
|
545
|
+
const g = this.geometry(0, 0);
|
|
546
|
+
const caretX = offsetToCaretRect(ctx, g, state.selEnd).x;
|
|
547
|
+
const visible = layout.contentWidth;
|
|
548
|
+
if (caretX - state.scrollX > visible - CARET_SCROLL_MARGIN) {
|
|
549
|
+
state.scrollX = caretX - visible + CARET_SCROLL_MARGIN;
|
|
550
|
+
}
|
|
551
|
+
else if (caretX - state.scrollX < CARET_SCROLL_MARGIN) {
|
|
552
|
+
state.scrollX = Math.max(0, caretX - CARET_SCROLL_MARGIN);
|
|
553
|
+
}
|
|
554
|
+
if (state.scrollX < 0)
|
|
555
|
+
state.scrollX = 0;
|
|
556
|
+
}
|
|
557
|
+
// -------------------------------------------------------------------------
|
|
558
|
+
// Caret blink
|
|
559
|
+
// -------------------------------------------------------------------------
|
|
560
|
+
startBlink() {
|
|
561
|
+
if (this.blinkIntervalMs <= 0)
|
|
562
|
+
return;
|
|
563
|
+
this.blinkTimer = setInterval(() => {
|
|
564
|
+
const state = this.state;
|
|
565
|
+
if (!state)
|
|
566
|
+
return;
|
|
567
|
+
state.caretVisible = !state.caretVisible;
|
|
568
|
+
this.hooks.markDirty(state.node);
|
|
569
|
+
this.hooks.scheduleRedraw();
|
|
570
|
+
}, this.blinkIntervalMs);
|
|
571
|
+
}
|
|
572
|
+
stopBlink() {
|
|
573
|
+
if (this.blinkTimer !== null) {
|
|
574
|
+
clearInterval(this.blinkTimer);
|
|
575
|
+
this.blinkTimer = null;
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
restartBlink() {
|
|
579
|
+
this.stopBlink();
|
|
580
|
+
this.startBlink();
|
|
581
|
+
}
|
|
582
|
+
/** Test hook: advance one blink phase without timers. */
|
|
583
|
+
tickBlink() {
|
|
584
|
+
const state = this.state;
|
|
585
|
+
if (!state)
|
|
586
|
+
return;
|
|
587
|
+
state.caretVisible = !state.caretVisible;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=editing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editing.js","sourceRoot":"","sources":["../../src/canvas/editing.ts"],"names":[],"mappings":"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"}
|