@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.
Files changed (229) hide show
  1. package/README.md +20 -13
  2. package/dist/canvas/accessibility.d.ts +118 -11
  3. package/dist/canvas/accessibility.js +470 -108
  4. package/dist/canvas/accessibility.js.map +1 -1
  5. package/dist/canvas/dispatch.d.ts +24 -0
  6. package/dist/canvas/dispatch.js +62 -0
  7. package/dist/canvas/dispatch.js.map +1 -0
  8. package/dist/canvas/editing.d.ts +178 -0
  9. package/dist/canvas/editing.js +590 -0
  10. package/dist/canvas/editing.js.map +1 -0
  11. package/dist/canvas/events.d.ts +28 -23
  12. package/dist/canvas/events.js +90 -103
  13. package/dist/canvas/events.js.map +1 -1
  14. package/dist/canvas/focus.d.ts +78 -0
  15. package/dist/canvas/focus.js +182 -0
  16. package/dist/canvas/focus.js.map +1 -0
  17. package/dist/canvas/index.d.ts +3 -2
  18. package/dist/canvas/index.js +3 -2
  19. package/dist/canvas/index.js.map +1 -1
  20. package/dist/canvas/layout.js +68 -98
  21. package/dist/canvas/layout.js.map +1 -1
  22. package/dist/canvas/paint.d.ts +16 -3
  23. package/dist/canvas/paint.js +449 -110
  24. package/dist/canvas/paint.js.map +1 -1
  25. package/dist/canvas/renderer.d.ts +28 -4
  26. package/dist/canvas/renderer.js +201 -81
  27. package/dist/canvas/renderer.js.map +1 -1
  28. package/dist/canvas/selection.js +31 -177
  29. package/dist/canvas/selection.js.map +1 -1
  30. package/dist/canvas/text-geometry.d.ts +72 -0
  31. package/dist/canvas/text-geometry.js +244 -0
  32. package/dist/canvas/text-geometry.js.map +1 -0
  33. package/dist/canvas/text.js +44 -18
  34. package/dist/canvas/text.js.map +1 -1
  35. package/dist/canvas/types.d.ts +10 -1
  36. package/dist/canvas/utils.d.ts +0 -23
  37. package/dist/canvas/utils.js +3 -67
  38. package/dist/canvas/utils.js.map +1 -1
  39. package/dist/canvas/variants.d.ts +52 -0
  40. package/dist/canvas/variants.js +156 -0
  41. package/dist/canvas/variants.js.map +1 -0
  42. package/dist/dom/a11y-styles.d.ts +20 -0
  43. package/dist/dom/a11y-styles.js +61 -0
  44. package/dist/dom/a11y-styles.js.map +1 -0
  45. package/dist/dom/applicators/aria.d.ts +19 -0
  46. package/dist/dom/applicators/aria.js +36 -0
  47. package/dist/dom/applicators/aria.js.map +1 -0
  48. package/dist/dom/applicators/events.d.ts +7 -0
  49. package/dist/dom/applicators/events.js +36 -8
  50. package/dist/dom/applicators/events.js.map +1 -1
  51. package/dist/dom/applicators/font.d.ts +11 -6
  52. package/dist/dom/applicators/font.js +16 -27
  53. package/dist/dom/applicators/font.js.map +1 -1
  54. package/dist/dom/applicators/index.js +51 -45
  55. package/dist/dom/applicators/index.js.map +1 -1
  56. package/dist/dom/canvas/index.js +2 -2
  57. package/dist/dom/canvas/index.js.map +1 -1
  58. package/dist/dom/components/app.js +2 -2
  59. package/dist/dom/components/app.js.map +1 -1
  60. package/dist/dom/components/audio.js +2 -2
  61. package/dist/dom/components/audio.js.map +1 -1
  62. package/dist/dom/components/avatar.js +3 -4
  63. package/dist/dom/components/avatar.js.map +1 -1
  64. package/dist/dom/components/badge.js +3 -4
  65. package/dist/dom/components/badge.js.map +1 -1
  66. package/dist/dom/components/button.js +2 -2
  67. package/dist/dom/components/button.js.map +1 -1
  68. package/dist/dom/components/card.js +2 -2
  69. package/dist/dom/components/card.js.map +1 -1
  70. package/dist/dom/components/center.js +2 -2
  71. package/dist/dom/components/center.js.map +1 -1
  72. package/dist/dom/components/checkbox.js +4 -5
  73. package/dist/dom/components/checkbox.js.map +1 -1
  74. package/dist/dom/components/column.js +2 -2
  75. package/dist/dom/components/column.js.map +1 -1
  76. package/dist/dom/components/container.js +2 -2
  77. package/dist/dom/components/container.js.map +1 -1
  78. package/dist/dom/components/divider.js +2 -2
  79. package/dist/dom/components/divider.js.map +1 -1
  80. package/dist/dom/components/grid.js +10 -10
  81. package/dist/dom/components/grid.js.map +1 -1
  82. package/dist/dom/components/heading.js +4 -6
  83. package/dist/dom/components/heading.js.map +1 -1
  84. package/dist/dom/components/hypenapp.d.ts +25 -1
  85. package/dist/dom/components/hypenapp.js +215 -247
  86. package/dist/dom/components/hypenapp.js.map +1 -1
  87. package/dist/dom/components/icon.js +4 -5
  88. package/dist/dom/components/icon.js.map +1 -1
  89. package/dist/dom/components/image.js +2 -2
  90. package/dist/dom/components/image.js.map +1 -1
  91. package/dist/dom/components/index.d.ts +2 -2
  92. package/dist/dom/components/index.js +9 -2
  93. package/dist/dom/components/index.js.map +1 -1
  94. package/dist/dom/components/input.js +2 -2
  95. package/dist/dom/components/input.js.map +1 -1
  96. package/dist/dom/components/link.js +2 -2
  97. package/dist/dom/components/link.js.map +1 -1
  98. package/dist/dom/components/list.js +2 -2
  99. package/dist/dom/components/list.js.map +1 -1
  100. package/dist/dom/components/paragraph.js +3 -4
  101. package/dist/dom/components/paragraph.js.map +1 -1
  102. package/dist/dom/components/progressbar.js +3 -3
  103. package/dist/dom/components/progressbar.js.map +1 -1
  104. package/dist/dom/components/route.js +2 -2
  105. package/dist/dom/components/route.js.map +1 -1
  106. package/dist/dom/components/router.js +2 -2
  107. package/dist/dom/components/router.js.map +1 -1
  108. package/dist/dom/components/row.js +10 -10
  109. package/dist/dom/components/row.js.map +1 -1
  110. package/dist/dom/components/select.js +3 -4
  111. package/dist/dom/components/select.js.map +1 -1
  112. package/dist/dom/components/slider.js +2 -2
  113. package/dist/dom/components/slider.js.map +1 -1
  114. package/dist/dom/components/spacer.js +2 -2
  115. package/dist/dom/components/spacer.js.map +1 -1
  116. package/dist/dom/components/spinner.js +27 -13
  117. package/dist/dom/components/spinner.js.map +1 -1
  118. package/dist/dom/components/stack.js +10 -10
  119. package/dist/dom/components/stack.js.map +1 -1
  120. package/dist/dom/components/switch.js +5 -6
  121. package/dist/dom/components/switch.js.map +1 -1
  122. package/dist/dom/components/tabs.d.ts +27 -0
  123. package/dist/dom/components/tabs.js +69 -0
  124. package/dist/dom/components/tabs.js.map +1 -0
  125. package/dist/dom/components/text.js +4 -7
  126. package/dist/dom/components/text.js.map +1 -1
  127. package/dist/dom/components/textarea.js +2 -2
  128. package/dist/dom/components/textarea.js.map +1 -1
  129. package/dist/dom/components/video.js +2 -2
  130. package/dist/dom/components/video.js.map +1 -1
  131. package/dist/dom/components/visuallyhidden.d.ts +9 -0
  132. package/dist/dom/components/visuallyhidden.js +26 -0
  133. package/dist/dom/components/visuallyhidden.js.map +1 -0
  134. package/dist/dom/debug.js +6 -8
  135. package/dist/dom/debug.js.map +1 -1
  136. package/dist/dom/index.d.ts +0 -1
  137. package/dist/dom/index.js +0 -1
  138. package/dist/dom/index.js.map +1 -1
  139. package/dist/dom/operability.d.ts +100 -0
  140. package/dist/dom/operability.js +298 -0
  141. package/dist/dom/operability.js.map +1 -0
  142. package/dist/dom/renderer.d.ts +98 -5
  143. package/dist/dom/renderer.js +400 -66
  144. package/dist/dom/renderer.js.map +1 -1
  145. package/dist/dom/route-focus.d.ts +42 -0
  146. package/dist/dom/route-focus.js +88 -0
  147. package/dist/dom/route-focus.js.map +1 -0
  148. package/dist/dom/semantics.d.ts +35 -0
  149. package/dist/dom/semantics.js +184 -0
  150. package/dist/dom/semantics.js.map +1 -0
  151. package/dist/variants.d.ts +90 -0
  152. package/dist/variants.js +206 -0
  153. package/dist/variants.js.map +1 -0
  154. package/package.json +2 -2
  155. package/src/canvas/QUICKSTART.md +16 -11
  156. package/src/canvas/README.md +63 -34
  157. package/src/canvas/accessibility.ts +507 -115
  158. package/src/canvas/dispatch.ts +78 -0
  159. package/src/canvas/editing.ts +697 -0
  160. package/src/canvas/events.ts +104 -115
  161. package/src/canvas/focus.ts +216 -0
  162. package/src/canvas/index.ts +8 -9
  163. package/src/canvas/layout.ts +68 -103
  164. package/src/canvas/paint.ts +509 -109
  165. package/src/canvas/renderer.ts +239 -99
  166. package/src/canvas/selection.ts +52 -210
  167. package/src/canvas/text-geometry.ts +311 -0
  168. package/src/canvas/text.ts +45 -18
  169. package/src/canvas/types.ts +28 -1
  170. package/src/canvas/utils.ts +3 -69
  171. package/src/canvas/variants.ts +172 -0
  172. package/src/dom/README.md +8 -7
  173. package/src/dom/a11y-styles.ts +65 -0
  174. package/src/dom/applicators/aria.ts +41 -0
  175. package/src/dom/applicators/events.ts +39 -7
  176. package/src/dom/applicators/font.ts +16 -29
  177. package/src/dom/applicators/index.ts +61 -46
  178. package/src/dom/canvas/index.ts +2 -2
  179. package/src/dom/components/app.ts +2 -2
  180. package/src/dom/components/audio.ts +2 -2
  181. package/src/dom/components/avatar.ts +3 -4
  182. package/src/dom/components/badge.ts +3 -4
  183. package/src/dom/components/button.ts +2 -2
  184. package/src/dom/components/card.ts +2 -2
  185. package/src/dom/components/center.ts +2 -2
  186. package/src/dom/components/checkbox.ts +4 -5
  187. package/src/dom/components/column.ts +2 -2
  188. package/src/dom/components/container.ts +2 -2
  189. package/src/dom/components/divider.ts +2 -2
  190. package/src/dom/components/grid.ts +10 -10
  191. package/src/dom/components/heading.ts +4 -6
  192. package/src/dom/components/hypenapp.ts +246 -274
  193. package/src/dom/components/icon.ts +4 -5
  194. package/src/dom/components/image.ts +2 -2
  195. package/src/dom/components/index.ts +10 -3
  196. package/src/dom/components/input.ts +2 -2
  197. package/src/dom/components/link.ts +2 -2
  198. package/src/dom/components/list.ts +2 -2
  199. package/src/dom/components/paragraph.ts +3 -4
  200. package/src/dom/components/progressbar.ts +3 -3
  201. package/src/dom/components/route.ts +2 -2
  202. package/src/dom/components/router.ts +2 -2
  203. package/src/dom/components/row.ts +10 -10
  204. package/src/dom/components/select.ts +3 -4
  205. package/src/dom/components/slider.ts +2 -2
  206. package/src/dom/components/spacer.ts +2 -2
  207. package/src/dom/components/spinner.ts +34 -16
  208. package/src/dom/components/stack.ts +10 -10
  209. package/src/dom/components/switch.ts +5 -6
  210. package/src/dom/components/tabs.ts +76 -0
  211. package/src/dom/components/text.ts +4 -7
  212. package/src/dom/components/textarea.ts +2 -2
  213. package/src/dom/components/video.ts +2 -2
  214. package/src/dom/components/visuallyhidden.ts +30 -0
  215. package/src/dom/debug.ts +6 -8
  216. package/src/dom/index.ts +0 -8
  217. package/src/dom/operability.ts +312 -0
  218. package/src/dom/renderer.ts +457 -66
  219. package/src/dom/route-focus.ts +98 -0
  220. package/src/dom/semantics.ts +199 -0
  221. package/src/variants.ts +249 -0
  222. package/dist/canvas/input.d.ts +0 -76
  223. package/dist/canvas/input.js +0 -207
  224. package/dist/canvas/input.js.map +0 -1
  225. package/dist/client.d.ts +0 -36
  226. package/dist/client.js +0 -47
  227. package/dist/client.js.map +0 -1
  228. package/src/canvas/input.ts +0 -251
  229. package/src/client.ts +0 -88
@@ -3,42 +3,52 @@
3
3
  *
4
4
  * Hit testing and event handling for canvas nodes
5
5
  */
6
- import type { VirtualNode } from "./types.js";
6
+ import type { VirtualNode, Point } from "./types.js";
7
+ import type { FocusManager } from "./focus.js";
7
8
  interface IEngine {
8
9
  dispatchAction(name: string, payload?: any): void;
9
10
  }
10
11
  /**
11
12
  * Canvas Event Manager
13
+ *
14
+ * Pointer-side interaction: hit testing, hover/pressed state, cursor, and
15
+ * click dispatch. Focus is NOT owned here — the pointer path funnels into
16
+ * the {@link FocusManager}, which treats real DOM focus on the
17
+ * accessibility-mirror (canvas fallback content) as the single source of
18
+ * truth. Keyboard events likewise arrive via the mirror (a canvas without
19
+ * tabindex never receives them), so this class attaches no key listeners.
12
20
  */
13
21
  export declare class CanvasEventManager {
14
22
  private canvas;
15
23
  private engine;
16
24
  private rootNode;
17
25
  private hoveredNode;
18
- private focusedNode;
19
26
  private mouseDownNode;
20
- private focusChangeHandler;
27
+ private focusManager;
28
+ private editablePointerHandler;
29
+ private scratchBounds;
21
30
  private boundOnMouseMove;
22
31
  private boundOnMouseDown;
23
32
  private boundOnMouseUp;
24
33
  private boundOnClick;
25
34
  private boundOnDoubleClick;
26
35
  private boundOnContextMenu;
27
- private boundOnKeyDown;
28
- private boundOnKeyUp;
29
36
  constructor(canvas: HTMLCanvasElement, engine: IEngine);
30
37
  /**
31
38
  * Set the root node for hit testing
32
39
  */
33
40
  setRootNode(node: VirtualNode | null): void;
34
41
  /**
35
- * Subscribe to focus changes. Used by the renderer to mount the
36
- * `InputOverlay` HTML element when an Input/Textarea gains focus and
37
- * unmount it when focus moves away. Without this hookup the canvas
38
- * Input painted as a pretty pill but a click on it did nothing — the
39
- * overlay was constructed but never invoked.
42
+ * Wire the focus manager the pointer path reports into. Clicking a
43
+ * focusable node focuses its mirror element; clicking anything else
44
+ * clears mirror focus.
45
+ */
46
+ setFocusManager(fm: FocusManager | null): void;
47
+ /**
48
+ * Called with (node, point) when a mousedown lands on a focusable node —
49
+ * the renderer maps the point to a caret position for editable nodes.
40
50
  */
41
- setFocusChangeHandler(fn: ((next: VirtualNode | null, prev: VirtualNode | null) => void) | null): void;
51
+ setEditablePointerHandler(fn: ((node: VirtualNode, point: Point) => void) | null): void;
42
52
  /**
43
53
  * Setup canvas event listeners
44
54
  */
@@ -63,6 +73,11 @@ export declare class CanvasEventManager {
63
73
  * checked first because they paint on top (see `paint.ts` overlay
64
74
  * ordering) — without this, a click on the Story's close-button overlay
65
75
  * lands on the underlying Image instead.
76
+ *
77
+ * `scrollX`/`scrollY` accumulate the ancestors' scroll offsets down the
78
+ * recursion (the translation paint applies) so no per-node ancestor walk
79
+ * is needed. Subtrees behind a clipping container are pruned when the
80
+ * point falls outside the container — nothing inside can be visible there.
66
81
  */
67
82
  private hitTestNode;
68
83
  /**
@@ -96,23 +111,13 @@ export declare class CanvasEventManager {
96
111
  * Handle context menu (right-click)
97
112
  */
98
113
  private onContextMenu;
99
- /**
100
- * Handle keyboard events
101
- */
102
- private onKeyDown;
103
- private onKeyUp;
104
- /**
105
- * Set focused node
106
- */
107
- private setFocus;
108
- /** Public for the renderer's overlay-blur path. */
109
- clearFocus(): void;
110
114
  /**
111
115
  * Update cursor based on node
112
116
  */
113
117
  private updateCursor;
114
118
  /**
115
- * Dispatch event to engine
119
+ * Dispatch event to engine (shared resolver — same payload shape as the
120
+ * mirror's keyboard/AT path).
116
121
  */
117
122
  private dispatchNodeEvent;
118
123
  /**
@@ -4,19 +4,28 @@
4
4
  * Hit testing and event handling for canvas nodes
5
5
  */
6
6
  import { isPointInRoundedRect } from "./utils.js";
7
- import { getScrollAwareBounds } from "./scroll.js";
8
- import { resolveEventAction } from "./props.js";
7
+ import { dispatchNodeEvent } from "./dispatch.js";
9
8
  /**
10
9
  * Canvas Event Manager
10
+ *
11
+ * Pointer-side interaction: hit testing, hover/pressed state, cursor, and
12
+ * click dispatch. Focus is NOT owned here — the pointer path funnels into
13
+ * the {@link FocusManager}, which treats real DOM focus on the
14
+ * accessibility-mirror (canvas fallback content) as the single source of
15
+ * truth. Keyboard events likewise arrive via the mirror (a canvas without
16
+ * tabindex never receives them), so this class attaches no key listeners.
11
17
  */
12
18
  export class CanvasEventManager {
13
19
  canvas;
14
20
  engine;
15
21
  rootNode = null;
16
22
  hoveredNode = null;
17
- focusedNode = null;
18
23
  mouseDownNode = null;
19
- focusChangeHandler = null;
24
+ focusManager = null;
25
+ editablePointerHandler = null;
26
+ // Reused for the per-node rounded-rect test so hit testing allocates
27
+ // nothing per visited node.
28
+ scratchBounds = { x: 0, y: 0, width: 0, height: 0 };
20
29
  // Bound handler references for cleanup
21
30
  boundOnMouseMove;
22
31
  boundOnMouseDown;
@@ -24,8 +33,6 @@ export class CanvasEventManager {
24
33
  boundOnClick;
25
34
  boundOnDoubleClick;
26
35
  boundOnContextMenu;
27
- boundOnKeyDown;
28
- boundOnKeyUp;
29
36
  constructor(canvas, engine) {
30
37
  this.canvas = canvas;
31
38
  this.engine = engine;
@@ -38,14 +45,19 @@ export class CanvasEventManager {
38
45
  this.rootNode = node;
39
46
  }
40
47
  /**
41
- * Subscribe to focus changes. Used by the renderer to mount the
42
- * `InputOverlay` HTML element when an Input/Textarea gains focus and
43
- * unmount it when focus moves away. Without this hookup the canvas
44
- * Input painted as a pretty pill but a click on it did nothing — the
45
- * overlay was constructed but never invoked.
48
+ * Wire the focus manager the pointer path reports into. Clicking a
49
+ * focusable node focuses its mirror element; clicking anything else
50
+ * clears mirror focus.
51
+ */
52
+ setFocusManager(fm) {
53
+ this.focusManager = fm;
54
+ }
55
+ /**
56
+ * Called with (node, point) when a mousedown lands on a focusable node —
57
+ * the renderer maps the point to a caret position for editable nodes.
46
58
  */
47
- setFocusChangeHandler(fn) {
48
- this.focusChangeHandler = fn;
59
+ setEditablePointerHandler(fn) {
60
+ this.editablePointerHandler = fn;
49
61
  }
50
62
  /**
51
63
  * Setup canvas event listeners
@@ -57,16 +69,12 @@ export class CanvasEventManager {
57
69
  this.boundOnClick = this.onClick.bind(this);
58
70
  this.boundOnDoubleClick = this.onDoubleClick.bind(this);
59
71
  this.boundOnContextMenu = this.onContextMenu.bind(this);
60
- this.boundOnKeyDown = this.onKeyDown.bind(this);
61
- this.boundOnKeyUp = this.onKeyUp.bind(this);
62
72
  this.canvas.addEventListener("mousemove", this.boundOnMouseMove);
63
73
  this.canvas.addEventListener("mousedown", this.boundOnMouseDown);
64
74
  this.canvas.addEventListener("mouseup", this.boundOnMouseUp);
65
75
  this.canvas.addEventListener("click", this.boundOnClick);
66
76
  this.canvas.addEventListener("dblclick", this.boundOnDoubleClick);
67
77
  this.canvas.addEventListener("contextmenu", this.boundOnContextMenu);
68
- this.canvas.addEventListener("keydown", this.boundOnKeyDown);
69
- this.canvas.addEventListener("keyup", this.boundOnKeyUp);
70
78
  }
71
79
  /**
72
80
  * Get canvas coordinates from mouse event.
@@ -98,20 +106,35 @@ export class CanvasEventManager {
98
106
  * checked first because they paint on top (see `paint.ts` overlay
99
107
  * ordering) — without this, a click on the Story's close-button overlay
100
108
  * lands on the underlying Image instead.
109
+ *
110
+ * `scrollX`/`scrollY` accumulate the ancestors' scroll offsets down the
111
+ * recursion (the translation paint applies) so no per-node ancestor walk
112
+ * is needed. Subtrees behind a clipping container are pruned when the
113
+ * point falls outside the container — nothing inside can be visible there.
101
114
  */
102
- hitTestNode(node, point) {
115
+ hitTestNode(node, point, scrollX = 0, scrollY = 0) {
103
116
  if (!node.visible || !node.layout)
104
117
  return null;
105
- const bounds = getScrollAwareBounds(node);
106
- if (!bounds)
107
- return null;
118
+ const layout = node.layout;
119
+ const x = layout.x - scrollX;
120
+ const y = layout.y - scrollY;
121
+ const inBounds = point.x >= x && point.x <= x + layout.width &&
122
+ point.y >= y && point.y <= y + layout.height;
123
+ if (!inBounds) {
124
+ const overflow = node.props.overflow;
125
+ if (overflow === "hidden" || overflow === "scroll" || overflow === "auto") {
126
+ return null;
127
+ }
128
+ }
129
+ const childScrollX = scrollX + (node.scrollState?.scrollX ?? 0);
130
+ const childScrollY = scrollY + (node.scrollState?.scrollY ?? 0);
108
131
  // Front-to-back order: absolute overlays (newest in paint stack)
109
132
  // first, then flow children in reverse paint order.
110
133
  for (let i = node.children.length - 1; i >= 0; i--) {
111
134
  const child = node.children[i];
112
135
  if (child.props.position !== "absolute")
113
136
  continue;
114
- const hit = this.hitTestNode(child, point);
137
+ const hit = this.hitTestNode(child, point, childScrollX, childScrollY);
115
138
  if (hit)
116
139
  return hit;
117
140
  }
@@ -119,14 +142,23 @@ export class CanvasEventManager {
119
142
  const child = node.children[i];
120
143
  if (child.props.position === "absolute")
121
144
  continue;
122
- const hit = this.hitTestNode(child, point);
145
+ const hit = this.hitTestNode(child, point, childScrollX, childScrollY);
123
146
  if (hit)
124
147
  return hit;
125
148
  }
126
149
  // Test this node
127
- const radius = node.layout.border.radius;
128
- if (isPointInRoundedRect(point, bounds, radius)) {
129
- return node;
150
+ if (inBounds) {
151
+ const radius = layout.border.radius;
152
+ if (radius <= 0)
153
+ return node;
154
+ const bounds = this.scratchBounds;
155
+ bounds.x = x;
156
+ bounds.y = y;
157
+ bounds.width = layout.width;
158
+ bounds.height = layout.height;
159
+ if (isPointInRoundedRect(point, bounds, radius)) {
160
+ return node;
161
+ }
130
162
  }
131
163
  return null;
132
164
  }
@@ -178,12 +210,24 @@ export class CanvasEventManager {
178
210
  * Handle mouse down
179
211
  */
180
212
  onMouseDown(e) {
213
+ // Suppress the browser's default mousedown focus action. The canvas
214
+ // itself isn't focusable, so the default would move focus to <body>
215
+ // AFTER this handler — undoing the mirror/proxy focus we set below and
216
+ // instantly ending any edit session. (Synthetic events have no default
217
+ // action, so this only bites with real pointers.)
218
+ e.preventDefault?.();
181
219
  const point = this.getCanvasCoordinates(e);
182
220
  // Same lift-to-clickable as hover so a click on a Button's Icon child
183
221
  // dispatches against the Button (where `onClick` actually lives).
184
222
  const hit = this.hitTest(point);
185
223
  const node = this.findClickableAncestor(hit) ?? hit;
186
224
  this.mouseDownNode = node;
225
+ // Track pressed (`:active`) state so paint-time `:active` variants resolve.
226
+ // Repaint so the active style appears immediately on press.
227
+ if (node) {
228
+ node.pressed = true;
229
+ this.requestRedraw();
230
+ }
187
231
  if (node && node.clickable) {
188
232
  this.dispatchNodeEvent(node, "mousedown", {
189
233
  button: e.button,
@@ -191,12 +235,17 @@ export class CanvasEventManager {
191
235
  clientY: e.clientY,
192
236
  });
193
237
  }
194
- // Update focus
238
+ // Focus routes through the mirror: focusing the node's fallback-content
239
+ // element makes document.activeElement the truth, and the FocusManager's
240
+ // focusin/focusout handlers update node state + repaint.
195
241
  if (node && node.focusable) {
196
- this.setFocus(node);
242
+ this.focusManager?.requestFocus(node);
243
+ // After focus (which starts an edit session for Input/Textarea), let
244
+ // the renderer place the caret at the clicked character.
245
+ this.editablePointerHandler?.(node, point);
197
246
  }
198
247
  else {
199
- this.setFocus(null);
248
+ this.focusManager?.requestFocus(null);
200
249
  }
201
250
  }
202
251
  /**
@@ -206,6 +255,12 @@ export class CanvasEventManager {
206
255
  const point = this.getCanvasCoordinates(e);
207
256
  const hit = this.hitTest(point);
208
257
  const node = this.findClickableAncestor(hit) ?? hit;
258
+ // Clear the pressed (`:active`) flag from the node that was pressed —
259
+ // release ends `:active` even if the pointer drifted off the node first.
260
+ if (this.mouseDownNode && this.mouseDownNode.pressed) {
261
+ this.mouseDownNode.pressed = false;
262
+ this.requestRedraw();
263
+ }
209
264
  if (node && node.clickable) {
210
265
  this.dispatchNodeEvent(node, "mouseup", {
211
266
  button: e.button,
@@ -267,55 +322,6 @@ export class CanvasEventManager {
267
322
  }
268
323
  }
269
324
  }
270
- /**
271
- * Handle keyboard events
272
- */
273
- onKeyDown(e) {
274
- if (this.focusedNode) {
275
- this.dispatchNodeEvent(this.focusedNode, "keydown", {
276
- key: e.key,
277
- code: e.code,
278
- ctrlKey: e.ctrlKey,
279
- shiftKey: e.shiftKey,
280
- altKey: e.altKey,
281
- });
282
- }
283
- }
284
- onKeyUp(e) {
285
- if (this.focusedNode) {
286
- this.dispatchNodeEvent(this.focusedNode, "keyup", {
287
- key: e.key,
288
- code: e.code,
289
- ctrlKey: e.ctrlKey,
290
- shiftKey: e.shiftKey,
291
- altKey: e.altKey,
292
- });
293
- }
294
- }
295
- /**
296
- * Set focused node
297
- */
298
- setFocus(node) {
299
- if (node === this.focusedNode)
300
- return;
301
- const prev = this.focusedNode;
302
- if (prev) {
303
- prev.focused = false;
304
- this.dispatchNodeEvent(prev, "blur", {});
305
- }
306
- this.focusedNode = node;
307
- if (node) {
308
- node.focused = true;
309
- this.dispatchNodeEvent(node, "focus", {});
310
- }
311
- if (this.focusChangeHandler)
312
- this.focusChangeHandler(node, prev);
313
- this.requestRedraw();
314
- }
315
- /** Public for the renderer's overlay-blur path. */
316
- clearFocus() {
317
- this.setFocus(null);
318
- }
319
325
  /**
320
326
  * Update cursor based on node
321
327
  */
@@ -337,30 +343,11 @@ export class CanvasEventManager {
337
343
  this.canvas.style.cursor = cursor;
338
344
  }
339
345
  /**
340
- * Dispatch event to engine
346
+ * Dispatch event to engine (shared resolver — same payload shape as the
347
+ * mirror's keyboard/AT path).
341
348
  */
342
349
  dispatchNodeEvent(node, eventType, data) {
343
- // Engine emits event applicators in camelCase (`onClick`, `onChange`). The
344
- // older flat form `onclick` is still accepted. After prop normalisation the
345
- // value is either a string (action name) or an object carrying an action
346
- // name at `"0"` plus an auxiliary payload (e.g. `{ "0": "@router.push",
347
- // to: "/notifications" }` for `@router.push(to: "/notifications")`).
348
- const camel = `on${eventType.charAt(0).toUpperCase()}${eventType.slice(1)}`;
349
- let spec = node.props[camel] ?? node.props[`on${eventType}`] ?? node.props[eventType];
350
- // Actionable components fall back to the bare `action` prop on click.
351
- if (spec == null && eventType === "click") {
352
- spec = node.props.action;
353
- }
354
- const resolved = resolveEventAction(spec);
355
- if (!resolved)
356
- return;
357
- this.engine.dispatchAction(resolved.actionName, {
358
- type: eventType,
359
- nodeId: node.id,
360
- timestamp: Date.now(),
361
- ...resolved.payload,
362
- ...data,
363
- });
350
+ dispatchNodeEvent(this.engine, node, eventType, data);
364
351
  }
365
352
  /**
366
353
  * Request redraw from renderer
@@ -380,12 +367,12 @@ export class CanvasEventManager {
380
367
  this.canvas.removeEventListener("click", this.boundOnClick);
381
368
  this.canvas.removeEventListener("dblclick", this.boundOnDoubleClick);
382
369
  this.canvas.removeEventListener("contextmenu", this.boundOnContextMenu);
383
- this.canvas.removeEventListener("keydown", this.boundOnKeyDown);
384
- this.canvas.removeEventListener("keyup", this.boundOnKeyUp);
370
+ if (this.mouseDownNode)
371
+ this.mouseDownNode.pressed = false;
385
372
  this.rootNode = null;
386
373
  this.hoveredNode = null;
387
- this.focusedNode = null;
388
374
  this.mouseDownNode = null;
375
+ this.focusManager = null;
389
376
  }
390
377
  }
391
378
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/canvas/events.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/canvas/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Focus Manager
3
+ *
4
+ * Real DOM focus on accessibility-mirror elements (canvas fallback content)
5
+ * is the single source of truth for canvas focus. Tab/Shift+Tab traverse
6
+ * the mirror natively; `focusin`/`focusout` translate DOM focus into
7
+ * `node.focused` + repaint; the pointer path (canvas hit-test) funnels into
8
+ * the same place by focusing the node's mirror element.
9
+ *
10
+ * Loop-free by construction: DOM focus events only ever *read* into node
11
+ * state — nothing in the sync path calls `.focus()` back.
12
+ *
13
+ * The mirror also carries keyboard/AT interaction back to the engine:
14
+ * Enter/Space on a mirror `<button>` produces a native `click` (dispatched
15
+ * to the node's action), and keydown/keyup on the focused element dispatch
16
+ * the node's `onKeyDown`/`onKeyUp` applicators — which the old
17
+ * canvas-attached listeners never could (a canvas without tabindex never
18
+ * receives key events).
19
+ */
20
+ import type { VirtualNode } from "./types.js";
21
+ import type { AccessibilityLayer } from "./accessibility.js";
22
+ import { type DispatchEngine } from "./dispatch.js";
23
+ export interface FocusManagerHooks {
24
+ getNode(id: string): VirtualNode | undefined;
25
+ /** Fired after node.focused flags are updated. Renderer repaints and
26
+ * (for editable nodes) starts/stops the text-edit controller. */
27
+ onFocusChange(next: VirtualNode | null, prev: VirtualNode | null): void;
28
+ /**
29
+ * Elements outside the mirror that still count as "the node is focused" —
30
+ * the text editor's hidden IME proxy. Focus moving there must not clear
31
+ * canvas focus.
32
+ */
33
+ isAuxFocusTarget?(element: unknown): boolean;
34
+ }
35
+ export declare class FocusManager {
36
+ private mirror;
37
+ private engine;
38
+ private hooks;
39
+ private focusedNode;
40
+ private boundFocusIn;
41
+ private boundFocusOut;
42
+ private boundClick;
43
+ private boundKeyDown;
44
+ private boundKeyUp;
45
+ constructor(mirror: AccessibilityLayer, engine: DispatchEngine, hooks: FocusManagerHooks);
46
+ /** Climb from an event target to the mirror element's virtual node. */
47
+ private resolveNode;
48
+ private onFocusIn;
49
+ private onFocusOut;
50
+ /** Update node.focused flags from the new DOM focus target. Idempotent. */
51
+ private syncFocus;
52
+ /**
53
+ * Focus a node from the canvas pointer path. Focuses the mirror element
54
+ * (so `document.activeElement` agrees) and syncs node state directly —
55
+ * in real browsers the element's focusin already did that synchronously
56
+ * and the second sync is a no-op; in environments without focus events
57
+ * the direct sync keeps behavior identical.
58
+ */
59
+ requestFocus(node: VirtualNode | null): void;
60
+ /** Pointer landed on nothing focusable: blur any mirror focus and clear. */
61
+ clearFocus(): void;
62
+ /**
63
+ * Clear focus if the focused node is `node` or one of its descendants —
64
+ * called before a subtree is removed/detached (the mirror element may
65
+ * leave the DOM without a browser blur when focus sits on the IME proxy).
66
+ */
67
+ clearIfWithin(node: VirtualNode): void;
68
+ getFocusedNode(): VirtualNode | null;
69
+ /**
70
+ * Native click on a mirror element — keyboard activation (Enter/Space on
71
+ * a real `<button>`) or an AT-initiated action. Pointer clicks never land
72
+ * here (fallback content has no rendered boxes), so this can't double-fire
73
+ * with the canvas hit-test click path.
74
+ */
75
+ private onMirrorClick;
76
+ private onMirrorKey;
77
+ destroy(): void;
78
+ }