@hypen-space/web 0.4.46 → 0.4.82

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 (69) hide show
  1. package/README.md +4 -4
  2. package/dist/canvas/dirty.d.ts +40 -0
  3. package/dist/canvas/dirty.js +100 -0
  4. package/dist/canvas/dirty.js.map +1 -0
  5. package/dist/canvas/events.d.ts +5 -0
  6. package/dist/canvas/events.js +30 -3
  7. package/dist/canvas/events.js.map +1 -1
  8. package/dist/canvas/index.d.ts +5 -1
  9. package/dist/canvas/index.js +4 -0
  10. package/dist/canvas/index.js.map +1 -1
  11. package/dist/canvas/layout.d.ts +12 -2
  12. package/dist/canvas/layout.js +593 -63
  13. package/dist/canvas/layout.js.map +1 -1
  14. package/dist/canvas/paint.d.ts +2 -0
  15. package/dist/canvas/paint.js +88 -11
  16. package/dist/canvas/paint.js.map +1 -1
  17. package/dist/canvas/renderer.d.ts +16 -0
  18. package/dist/canvas/renderer.js +154 -15
  19. package/dist/canvas/renderer.js.map +1 -1
  20. package/dist/canvas/scroll.d.ts +82 -0
  21. package/dist/canvas/scroll.js +639 -0
  22. package/dist/canvas/scroll.js.map +1 -0
  23. package/dist/canvas/selection.d.ts +63 -0
  24. package/dist/canvas/selection.js +466 -0
  25. package/dist/canvas/selection.js.map +1 -0
  26. package/dist/canvas/text.d.ts +6 -3
  27. package/dist/canvas/text.js +82 -43
  28. package/dist/canvas/text.js.map +1 -1
  29. package/dist/canvas/types.d.ts +18 -0
  30. package/dist/canvas/utils.d.ts +8 -2
  31. package/dist/canvas/utils.js +42 -16
  32. package/dist/canvas/utils.js.map +1 -1
  33. package/dist/canvas/virtualize.d.ts +25 -0
  34. package/dist/canvas/virtualize.js +65 -0
  35. package/dist/canvas/virtualize.js.map +1 -0
  36. package/dist/dom/applicators/index.js +0 -1
  37. package/dist/dom/applicators/index.js.map +1 -1
  38. package/dist/dom/applicators/margin.js +58 -17
  39. package/dist/dom/applicators/margin.js.map +1 -1
  40. package/dist/dom/applicators/padding.js +42 -17
  41. package/dist/dom/applicators/padding.js.map +1 -1
  42. package/dist/dom/components/icon.d.ts +9 -0
  43. package/dist/dom/components/icon.js +67 -0
  44. package/dist/dom/components/icon.js.map +1 -0
  45. package/dist/dom/components/index.js +2 -0
  46. package/dist/dom/components/index.js.map +1 -1
  47. package/dist/dom/renderer.d.ts +19 -5
  48. package/dist/dom/renderer.js +147 -17
  49. package/dist/dom/renderer.js.map +1 -1
  50. package/package.json +4 -2
  51. package/src/canvas/QUICKSTART.md +5 -5
  52. package/src/canvas/dirty.ts +116 -0
  53. package/src/canvas/events.ts +34 -3
  54. package/src/canvas/index.ts +5 -0
  55. package/src/canvas/layout.ts +653 -100
  56. package/src/canvas/paint.ts +109 -11
  57. package/src/canvas/renderer.ts +189 -16
  58. package/src/canvas/scroll.ts +729 -0
  59. package/src/canvas/selection.ts +560 -0
  60. package/src/canvas/text.ts +97 -54
  61. package/src/canvas/types.ts +26 -0
  62. package/src/canvas/utils.ts +47 -17
  63. package/src/canvas/virtualize.ts +81 -0
  64. package/src/dom/applicators/index.ts +1 -1
  65. package/src/dom/applicators/margin.ts +57 -11
  66. package/src/dom/applicators/padding.ts +45 -11
  67. package/src/dom/components/icon.ts +84 -0
  68. package/src/dom/components/index.ts +2 -0
  69. package/src/dom/renderer.ts +155 -17
@@ -0,0 +1,639 @@
1
+ /**
2
+ * Scroll Manager
3
+ *
4
+ * Handles touch gestures, wheel events, momentum scrolling, and
5
+ * scrollbar rendering for the canvas renderer. Nodes with
6
+ * overflow: "scroll" | "auto" become scrollable containers.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Constants
10
+ // ---------------------------------------------------------------------------
11
+ /** Friction coefficient for momentum deceleration (per ms) */
12
+ const FRICTION = 0.97;
13
+ /** Minimum velocity before stopping momentum (px/ms) */
14
+ const MIN_VELOCITY = 0.05;
15
+ /** Elastic overscroll damping factor */
16
+ const ELASTIC_DAMPING = 0.4;
17
+ /** Snap-back spring constant when released past bounds */
18
+ const SNAP_BACK_SPEED = 0.15;
19
+ /** Scrollbar thickness in CSS pixels */
20
+ const SCROLLBAR_SIZE = 6;
21
+ /** Scrollbar minimum thumb length */
22
+ const SCROLLBAR_MIN_THUMB = 24;
23
+ /** Scrollbar padding from edge */
24
+ const SCROLLBAR_PADDING = 2;
25
+ /** How quickly the scrollbar fades out (opacity per ms) */
26
+ const SCROLLBAR_FADE_RATE = 0.003;
27
+ /** Time after scroll stops before scrollbar starts fading (ms) */
28
+ const SCROLLBAR_LINGER = 800;
29
+ // ---------------------------------------------------------------------------
30
+ // ScrollState helpers
31
+ // ---------------------------------------------------------------------------
32
+ export function createScrollState() {
33
+ return {
34
+ scrollX: 0,
35
+ scrollY: 0,
36
+ velocityX: 0,
37
+ velocityY: 0,
38
+ scrollWidth: 0,
39
+ scrollHeight: 0,
40
+ touching: false,
41
+ lastTouchTime: 0,
42
+ scrollbarOpacity: 0,
43
+ };
44
+ }
45
+ /** Returns true if the node is configured as a scrollable container. */
46
+ export function isScrollable(node) {
47
+ const overflow = node.props.overflow;
48
+ return overflow === "scroll" || overflow === "auto";
49
+ }
50
+ /** Ensure a scroll state is attached; returns the (possibly new) state. */
51
+ function ensureScrollState(node) {
52
+ if (!node.scrollState)
53
+ node.scrollState = createScrollState();
54
+ return node.scrollState;
55
+ }
56
+ /** Maximum scroll offsets for a node (always ≥ 0). */
57
+ function maxScroll(node) {
58
+ const ss = node.scrollState;
59
+ if (!ss || !node.layout)
60
+ return { maxX: 0, maxY: 0 };
61
+ return {
62
+ maxX: Math.max(0, ss.scrollWidth - node.layout.contentWidth),
63
+ maxY: Math.max(0, ss.scrollHeight - node.layout.contentHeight),
64
+ };
65
+ }
66
+ /** Clamp scroll to valid range (with optional elastic overshoot). */
67
+ function clampScroll(value, max, elastic) {
68
+ if (!elastic)
69
+ return Math.max(0, Math.min(value, max));
70
+ // Allow overscroll with damping
71
+ if (value < 0)
72
+ return value * ELASTIC_DAMPING;
73
+ if (value > max)
74
+ return max + (value - max) * ELASTIC_DAMPING;
75
+ return value;
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // ScrollManager
79
+ // ---------------------------------------------------------------------------
80
+ export class ScrollManager {
81
+ canvas;
82
+ rootNode = null;
83
+ requestRedraw;
84
+ // Active touch tracking
85
+ activeNode = null;
86
+ lastPointerX = 0;
87
+ lastPointerY = 0;
88
+ lastPointerTime = 0;
89
+ // Momentum animation
90
+ momentumRaf = null;
91
+ lastMomentumTime = 0;
92
+ // Scrollbar fade timer
93
+ scrollbarFadeTimer = null;
94
+ scrollbarLastActivity = 0;
95
+ // Bound handlers
96
+ boundWheel;
97
+ boundTouchStart;
98
+ boundTouchMove;
99
+ boundTouchEnd;
100
+ boundPointerDown;
101
+ boundPointerMove;
102
+ boundPointerUp;
103
+ constructor(canvas, requestRedraw) {
104
+ this.canvas = canvas;
105
+ this.requestRedraw = requestRedraw;
106
+ this.setupEventListeners();
107
+ }
108
+ setRootNode(node) {
109
+ this.rootNode = node;
110
+ }
111
+ // -------------------------------------------------------------------------
112
+ // Event listeners
113
+ // -------------------------------------------------------------------------
114
+ setupEventListeners() {
115
+ this.boundWheel = this.onWheel.bind(this);
116
+ this.boundTouchStart = this.onTouchStart.bind(this);
117
+ this.boundTouchMove = this.onTouchMove.bind(this);
118
+ this.boundTouchEnd = this.onTouchEnd.bind(this);
119
+ this.boundPointerDown = this.onPointerDown.bind(this);
120
+ this.boundPointerMove = this.onPointerMove.bind(this);
121
+ this.boundPointerUp = this.onPointerUp.bind(this);
122
+ this.canvas.addEventListener("wheel", this.boundWheel, { passive: false });
123
+ this.canvas.addEventListener("touchstart", this.boundTouchStart, { passive: false });
124
+ this.canvas.addEventListener("touchmove", this.boundTouchMove, { passive: false });
125
+ this.canvas.addEventListener("touchend", this.boundTouchEnd);
126
+ this.canvas.addEventListener("pointerdown", this.boundPointerDown);
127
+ this.canvas.addEventListener("pointermove", this.boundPointerMove);
128
+ this.canvas.addEventListener("pointerup", this.boundPointerUp);
129
+ }
130
+ // -------------------------------------------------------------------------
131
+ // Coordinate helpers
132
+ // -------------------------------------------------------------------------
133
+ canvasPoint(clientX, clientY) {
134
+ const rect = this.canvas.getBoundingClientRect();
135
+ const scaleX = this.canvas.width / rect.width;
136
+ const scaleY = this.canvas.height / rect.height;
137
+ return {
138
+ x: (clientX - rect.left) * scaleX,
139
+ y: (clientY - rect.top) * scaleY,
140
+ };
141
+ }
142
+ /**
143
+ * Find the deepest scrollable ancestor at a canvas-space point,
144
+ * accounting for existing scroll offsets.
145
+ */
146
+ findScrollTarget(point) {
147
+ if (!this.rootNode)
148
+ return null;
149
+ return this.findScrollableAt(this.rootNode, point);
150
+ }
151
+ findScrollableAt(node, point) {
152
+ if (!node.visible || !node.layout)
153
+ return null;
154
+ const bounds = getScrollAwareBounds(node);
155
+ if (!bounds)
156
+ return null;
157
+ if (point.x < bounds.x || point.x > bounds.x + bounds.width ||
158
+ point.y < bounds.y || point.y > bounds.y + bounds.height) {
159
+ return null;
160
+ }
161
+ // Check children first (front-to-back)
162
+ for (let i = node.children.length - 1; i >= 0; i--) {
163
+ const found = this.findScrollableAt(node.children[i], point);
164
+ if (found)
165
+ return found;
166
+ }
167
+ if (isScrollable(node))
168
+ return node;
169
+ return null;
170
+ }
171
+ // -------------------------------------------------------------------------
172
+ // Wheel event
173
+ // -------------------------------------------------------------------------
174
+ /**
175
+ * Walk up from a node to find the nearest scrollable ancestor (excluding
176
+ * the node itself). Returns null if no scrollable ancestor exists.
177
+ */
178
+ findScrollableAncestor(node) {
179
+ let current = node.parent;
180
+ while (current) {
181
+ if (isScrollable(current))
182
+ return current;
183
+ current = current.parent;
184
+ }
185
+ return null;
186
+ }
187
+ /**
188
+ * Check whether a scrollable node can scroll further in the given delta
189
+ * direction. Returns true if there is remaining scroll range.
190
+ */
191
+ canScrollInDirection(node, dx, dy) {
192
+ const ss = node.scrollState;
193
+ if (!ss)
194
+ return false;
195
+ const { maxX, maxY } = maxScroll(node);
196
+ if (dy < 0 && ss.scrollY > 0)
197
+ return true;
198
+ if (dy > 0 && ss.scrollY < maxY)
199
+ return true;
200
+ if (dx < 0 && ss.scrollX > 0)
201
+ return true;
202
+ if (dx > 0 && ss.scrollX < maxX)
203
+ return true;
204
+ return false;
205
+ }
206
+ onWheel(e) {
207
+ const point = this.canvasPoint(e.clientX, e.clientY);
208
+ let target = this.findScrollTarget(point);
209
+ if (!target)
210
+ return;
211
+ let dx = e.deltaX;
212
+ let dy = e.deltaY;
213
+ // Normalise to pixels (deltaMode: 0=pixel, 1=line, 2=page)
214
+ if (e.deltaMode === 1) {
215
+ dx *= 20;
216
+ dy *= 20;
217
+ }
218
+ if (e.deltaMode === 2) {
219
+ dx *= 400;
220
+ dy *= 400;
221
+ }
222
+ // Bubble: if the deepest target can't scroll in the requested direction,
223
+ // walk up to find an ancestor that can.
224
+ while (target && !this.canScrollInDirection(target, dx, dy)) {
225
+ target = this.findScrollableAncestor(target);
226
+ }
227
+ if (!target)
228
+ return;
229
+ const ss = ensureScrollState(target);
230
+ const { maxX, maxY } = maxScroll(target);
231
+ const canScrollX = maxX > 0;
232
+ const canScrollY = maxY > 0;
233
+ if (!canScrollX && !canScrollY)
234
+ return;
235
+ if (canScrollY) {
236
+ const prev = ss.scrollY;
237
+ ss.scrollY = Math.max(0, Math.min(ss.scrollY + dy, maxY));
238
+ if (ss.scrollY !== prev)
239
+ e.preventDefault();
240
+ }
241
+ if (canScrollX) {
242
+ const prev = ss.scrollX;
243
+ ss.scrollX = Math.max(0, Math.min(ss.scrollX + dx, maxX));
244
+ if (ss.scrollX !== prev)
245
+ e.preventDefault();
246
+ }
247
+ // Stop any momentum
248
+ ss.velocityX = 0;
249
+ ss.velocityY = 0;
250
+ this.showScrollbar(ss);
251
+ this.requestRedraw();
252
+ }
253
+ // -------------------------------------------------------------------------
254
+ // Touch events
255
+ // -------------------------------------------------------------------------
256
+ onTouchStart(e) {
257
+ if (e.touches.length !== 1)
258
+ return;
259
+ const t = e.touches[0];
260
+ this.startDrag(t.clientX, t.clientY);
261
+ if (this.activeNode)
262
+ e.preventDefault();
263
+ }
264
+ onTouchMove(e) {
265
+ if (e.touches.length !== 1 || !this.activeNode)
266
+ return;
267
+ const t = e.touches[0];
268
+ this.moveDrag(t.clientX, t.clientY);
269
+ e.preventDefault();
270
+ }
271
+ onTouchEnd(_e) {
272
+ this.endDrag();
273
+ }
274
+ // -------------------------------------------------------------------------
275
+ // Pointer events (for mouse-drag scrolling on desktop)
276
+ // -------------------------------------------------------------------------
277
+ onPointerDown(e) {
278
+ // Only handle middle-button or touch pointer
279
+ if (e.pointerType === "touch")
280
+ return; // already handled by touch events
281
+ if (e.button !== 1)
282
+ return; // middle-click to scroll
283
+ this.startDrag(e.clientX, e.clientY);
284
+ if (this.activeNode) {
285
+ this.canvas.setPointerCapture(e.pointerId);
286
+ e.preventDefault();
287
+ }
288
+ }
289
+ onPointerMove(e) {
290
+ if (e.pointerType === "touch" || !this.activeNode)
291
+ return;
292
+ this.moveDrag(e.clientX, e.clientY);
293
+ }
294
+ onPointerUp(e) {
295
+ if (e.pointerType === "touch")
296
+ return;
297
+ this.endDrag();
298
+ }
299
+ // -------------------------------------------------------------------------
300
+ // Drag helpers (shared between touch and pointer)
301
+ // -------------------------------------------------------------------------
302
+ startDrag(clientX, clientY) {
303
+ this.stopMomentum();
304
+ const point = this.canvasPoint(clientX, clientY);
305
+ const target = this.findScrollTarget(point);
306
+ if (!target) {
307
+ this.activeNode = null;
308
+ return;
309
+ }
310
+ const ss = ensureScrollState(target);
311
+ ss.touching = true;
312
+ ss.velocityX = 0;
313
+ ss.velocityY = 0;
314
+ this.activeNode = target;
315
+ this.lastPointerX = clientX;
316
+ this.lastPointerY = clientY;
317
+ this.lastPointerTime = performance.now();
318
+ this.showScrollbar(ss);
319
+ }
320
+ moveDrag(clientX, clientY) {
321
+ const node = this.activeNode;
322
+ if (!node)
323
+ return;
324
+ const ss = ensureScrollState(node);
325
+ const { maxX, maxY } = maxScroll(node);
326
+ const now = performance.now();
327
+ const dt = now - this.lastPointerTime;
328
+ const rect = this.canvas.getBoundingClientRect();
329
+ const scaleX = this.canvas.width / rect.width;
330
+ const scaleY = this.canvas.height / rect.height;
331
+ const dx = -(clientX - this.lastPointerX) * scaleX;
332
+ const dy = -(clientY - this.lastPointerY) * scaleY;
333
+ ss.scrollX = clampScroll(ss.scrollX + dx, maxX, true);
334
+ ss.scrollY = clampScroll(ss.scrollY + dy, maxY, true);
335
+ // Track velocity (exponential moving average)
336
+ if (dt > 0) {
337
+ const alpha = 0.4;
338
+ ss.velocityX = alpha * (dx / dt) + (1 - alpha) * ss.velocityX;
339
+ ss.velocityY = alpha * (dy / dt) + (1 - alpha) * ss.velocityY;
340
+ }
341
+ this.lastPointerX = clientX;
342
+ this.lastPointerY = clientY;
343
+ this.lastPointerTime = now;
344
+ this.showScrollbar(ss);
345
+ this.requestRedraw();
346
+ }
347
+ endDrag() {
348
+ const node = this.activeNode;
349
+ if (!node)
350
+ return;
351
+ const ss = ensureScrollState(node);
352
+ ss.touching = false;
353
+ this.activeNode = null;
354
+ // If overscrolled, snap back. Otherwise start momentum.
355
+ const { maxX, maxY } = maxScroll(node);
356
+ const overscrolled = ss.scrollX < 0 || ss.scrollX > maxX ||
357
+ ss.scrollY < 0 || ss.scrollY > maxY;
358
+ if (overscrolled) {
359
+ this.startSnapBack(node);
360
+ }
361
+ else {
362
+ this.startMomentum(node);
363
+ }
364
+ }
365
+ // -------------------------------------------------------------------------
366
+ // Momentum animation
367
+ // -------------------------------------------------------------------------
368
+ startMomentum(node) {
369
+ this.stopMomentum();
370
+ const ss = node.scrollState;
371
+ if (!ss)
372
+ return;
373
+ const absVelocity = Math.abs(ss.velocityX) + Math.abs(ss.velocityY);
374
+ if (absVelocity < MIN_VELOCITY) {
375
+ this.beginScrollbarFade(ss);
376
+ return;
377
+ }
378
+ this.lastMomentumTime = performance.now();
379
+ const tick = () => {
380
+ const now = performance.now();
381
+ const dt = now - this.lastMomentumTime;
382
+ this.lastMomentumTime = now;
383
+ const { maxX, maxY } = maxScroll(node);
384
+ ss.scrollX += ss.velocityX * dt;
385
+ ss.scrollY += ss.velocityY * dt;
386
+ // Decelerate
387
+ const factor = Math.pow(FRICTION, dt);
388
+ ss.velocityX *= factor;
389
+ ss.velocityY *= factor;
390
+ // Clamp to bounds (hard stop at edges)
391
+ let stopped = false;
392
+ if (ss.scrollX < 0) {
393
+ ss.scrollX = 0;
394
+ ss.velocityX = 0;
395
+ stopped = true;
396
+ }
397
+ if (ss.scrollX > maxX) {
398
+ ss.scrollX = maxX;
399
+ ss.velocityX = 0;
400
+ stopped = true;
401
+ }
402
+ if (ss.scrollY < 0) {
403
+ ss.scrollY = 0;
404
+ ss.velocityY = 0;
405
+ stopped = true;
406
+ }
407
+ if (ss.scrollY > maxY) {
408
+ ss.scrollY = maxY;
409
+ ss.velocityY = 0;
410
+ stopped = true;
411
+ }
412
+ const v = Math.abs(ss.velocityX) + Math.abs(ss.velocityY);
413
+ this.requestRedraw();
414
+ if (v < MIN_VELOCITY || stopped) {
415
+ this.momentumRaf = null;
416
+ this.beginScrollbarFade(ss);
417
+ }
418
+ else {
419
+ this.momentumRaf = requestAnimationFrame(tick);
420
+ }
421
+ };
422
+ this.momentumRaf = requestAnimationFrame(tick);
423
+ }
424
+ startSnapBack(node) {
425
+ this.stopMomentum();
426
+ const ss = node.scrollState;
427
+ if (!ss)
428
+ return;
429
+ const tick = () => {
430
+ const { maxX, maxY } = maxScroll(node);
431
+ let targetX = ss.scrollX;
432
+ let targetY = ss.scrollY;
433
+ if (targetX < 0)
434
+ targetX = 0;
435
+ else if (targetX > maxX)
436
+ targetX = maxX;
437
+ if (targetY < 0)
438
+ targetY = 0;
439
+ else if (targetY > maxY)
440
+ targetY = maxY;
441
+ const dx = targetX - ss.scrollX;
442
+ const dy = targetY - ss.scrollY;
443
+ if (Math.abs(dx) < 0.5 && Math.abs(dy) < 0.5) {
444
+ ss.scrollX = targetX;
445
+ ss.scrollY = targetY;
446
+ this.momentumRaf = null;
447
+ this.beginScrollbarFade(ss);
448
+ this.requestRedraw();
449
+ return;
450
+ }
451
+ ss.scrollX += dx * SNAP_BACK_SPEED;
452
+ ss.scrollY += dy * SNAP_BACK_SPEED;
453
+ this.requestRedraw();
454
+ this.momentumRaf = requestAnimationFrame(tick);
455
+ };
456
+ this.momentumRaf = requestAnimationFrame(tick);
457
+ }
458
+ stopMomentum() {
459
+ if (this.momentumRaf !== null) {
460
+ cancelAnimationFrame(this.momentumRaf);
461
+ this.momentumRaf = null;
462
+ }
463
+ }
464
+ // -------------------------------------------------------------------------
465
+ // Scrollbar visibility
466
+ // -------------------------------------------------------------------------
467
+ showScrollbar(ss) {
468
+ ss.scrollbarOpacity = 1;
469
+ this.scrollbarLastActivity = performance.now();
470
+ if (this.scrollbarFadeTimer !== null) {
471
+ clearInterval(this.scrollbarFadeTimer);
472
+ this.scrollbarFadeTimer = null;
473
+ }
474
+ }
475
+ beginScrollbarFade(ss) {
476
+ if (this.scrollbarFadeTimer !== null)
477
+ return;
478
+ this.scrollbarLastActivity = performance.now();
479
+ this.scrollbarFadeTimer = setInterval(() => {
480
+ const elapsed = performance.now() - this.scrollbarLastActivity;
481
+ if (elapsed < SCROLLBAR_LINGER)
482
+ return;
483
+ ss.scrollbarOpacity -= SCROLLBAR_FADE_RATE * 16; // ~16ms per interval tick
484
+ if (ss.scrollbarOpacity <= 0) {
485
+ ss.scrollbarOpacity = 0;
486
+ clearInterval(this.scrollbarFadeTimer);
487
+ this.scrollbarFadeTimer = null;
488
+ }
489
+ this.requestRedraw();
490
+ }, 16);
491
+ }
492
+ // -------------------------------------------------------------------------
493
+ // Scrollbar painting (called from paint pipeline)
494
+ // -------------------------------------------------------------------------
495
+ /**
496
+ * Draw scrollbar indicators for a scrollable node.
497
+ * Call this after painting the node's children, while the clip is still active.
498
+ */
499
+ static paintScrollbars(ctx, node) {
500
+ const ss = node.scrollState;
501
+ if (!ss || ss.scrollbarOpacity <= 0)
502
+ return;
503
+ if (!node.layout)
504
+ return;
505
+ const layout = node.layout;
506
+ const x = layout.x;
507
+ const y = layout.y;
508
+ const w = layout.width;
509
+ const h = layout.height;
510
+ const alpha = ss.scrollbarOpacity * 0.5;
511
+ // Vertical scrollbar
512
+ if (ss.scrollHeight > layout.contentHeight) {
513
+ const trackHeight = h - SCROLLBAR_PADDING * 2;
514
+ const ratio = layout.contentHeight / ss.scrollHeight;
515
+ const thumbHeight = Math.max(SCROLLBAR_MIN_THUMB, trackHeight * ratio);
516
+ const { maxY } = { maxY: Math.max(0, ss.scrollHeight - layout.contentHeight) };
517
+ const scrollRatio = maxY > 0 ? ss.scrollY / maxY : 0;
518
+ const thumbY = SCROLLBAR_PADDING + scrollRatio * (trackHeight - thumbHeight);
519
+ ctx.save();
520
+ ctx.globalAlpha = alpha;
521
+ ctx.fillStyle = "#888";
522
+ drawPill(ctx, x + w - SCROLLBAR_SIZE - SCROLLBAR_PADDING, y + thumbY, SCROLLBAR_SIZE, thumbHeight);
523
+ ctx.fill();
524
+ ctx.restore();
525
+ }
526
+ // Horizontal scrollbar
527
+ if (ss.scrollWidth > layout.contentWidth) {
528
+ const trackWidth = w - SCROLLBAR_PADDING * 2;
529
+ const ratio = layout.contentWidth / ss.scrollWidth;
530
+ const thumbWidth = Math.max(SCROLLBAR_MIN_THUMB, trackWidth * ratio);
531
+ const { maxX } = { maxX: Math.max(0, ss.scrollWidth - layout.contentWidth) };
532
+ const scrollRatio = maxX > 0 ? ss.scrollX / maxX : 0;
533
+ const thumbX = SCROLLBAR_PADDING + scrollRatio * (trackWidth - thumbWidth);
534
+ ctx.save();
535
+ ctx.globalAlpha = alpha;
536
+ ctx.fillStyle = "#888";
537
+ drawPill(ctx, x + thumbX, y + h - SCROLLBAR_SIZE - SCROLLBAR_PADDING, thumbWidth, SCROLLBAR_SIZE);
538
+ ctx.fill();
539
+ ctx.restore();
540
+ }
541
+ }
542
+ // -------------------------------------------------------------------------
543
+ // Layout integration
544
+ // -------------------------------------------------------------------------
545
+ /**
546
+ * After layout is computed, calculate the total content size of
547
+ * scrollable containers so we know the max scroll range.
548
+ */
549
+ static updateScrollBounds(node) {
550
+ if (!node.layout)
551
+ return;
552
+ // Recurse first so children have their layouts
553
+ for (const child of node.children) {
554
+ ScrollManager.updateScrollBounds(child);
555
+ }
556
+ if (!isScrollable(node))
557
+ return;
558
+ const ss = ensureScrollState(node);
559
+ let maxRight = 0;
560
+ let maxBottom = 0;
561
+ for (const child of node.children) {
562
+ if (!child.layout)
563
+ continue;
564
+ // Child positions are absolute; make them relative to this container
565
+ const relX = child.layout.x - node.layout.x - node.layout.contentX;
566
+ const relY = child.layout.y - node.layout.y - node.layout.contentY;
567
+ maxRight = Math.max(maxRight, relX + child.layout.width + child.layout.margin.right);
568
+ maxBottom = Math.max(maxBottom, relY + child.layout.height + child.layout.margin.bottom);
569
+ }
570
+ ss.scrollWidth = maxRight;
571
+ ss.scrollHeight = maxBottom;
572
+ // Clamp current scroll to new bounds
573
+ const { maxX, maxY } = maxScroll(node);
574
+ ss.scrollX = Math.max(0, Math.min(ss.scrollX, maxX));
575
+ ss.scrollY = Math.max(0, Math.min(ss.scrollY, maxY));
576
+ }
577
+ // -------------------------------------------------------------------------
578
+ // Cleanup
579
+ // -------------------------------------------------------------------------
580
+ destroy() {
581
+ this.stopMomentum();
582
+ if (this.scrollbarFadeTimer !== null) {
583
+ clearInterval(this.scrollbarFadeTimer);
584
+ this.scrollbarFadeTimer = null;
585
+ }
586
+ this.canvas.removeEventListener("wheel", this.boundWheel);
587
+ this.canvas.removeEventListener("touchstart", this.boundTouchStart);
588
+ this.canvas.removeEventListener("touchmove", this.boundTouchMove);
589
+ this.canvas.removeEventListener("touchend", this.boundTouchEnd);
590
+ this.canvas.removeEventListener("pointerdown", this.boundPointerDown);
591
+ this.canvas.removeEventListener("pointermove", this.boundPointerMove);
592
+ this.canvas.removeEventListener("pointerup", this.boundPointerUp);
593
+ this.rootNode = null;
594
+ this.activeNode = null;
595
+ }
596
+ }
597
+ // ---------------------------------------------------------------------------
598
+ // Scroll-aware coordinate helpers (used by hit testing)
599
+ // ---------------------------------------------------------------------------
600
+ /**
601
+ * Get absolute bounds for a node, accounting for scroll offsets of all
602
+ * ancestors. This is the scroll-aware replacement for getAbsoluteBounds.
603
+ */
604
+ export function getScrollAwareBounds(node) {
605
+ if (!node.layout)
606
+ return null;
607
+ let x = node.layout.x;
608
+ let y = node.layout.y;
609
+ let current = node.parent;
610
+ while (current && current.layout) {
611
+ x += current.layout.contentX;
612
+ y += current.layout.contentY;
613
+ // Apply ancestor scroll offset
614
+ if (current.scrollState) {
615
+ x -= current.scrollState.scrollX;
616
+ y -= current.scrollState.scrollY;
617
+ }
618
+ current = current.parent;
619
+ }
620
+ return { x, y, width: node.layout.width, height: node.layout.height };
621
+ }
622
+ // ---------------------------------------------------------------------------
623
+ // Drawing helpers
624
+ // ---------------------------------------------------------------------------
625
+ function drawPill(ctx, x, y, w, h) {
626
+ const r = Math.min(w, h) / 2;
627
+ ctx.beginPath();
628
+ ctx.moveTo(x + r, y);
629
+ ctx.lineTo(x + w - r, y);
630
+ ctx.arcTo(x + w, y, x + w, y + r, r);
631
+ ctx.lineTo(x + w, y + h - r);
632
+ ctx.arcTo(x + w, y + h, x + w - r, y + h, r);
633
+ ctx.lineTo(x + r, y + h);
634
+ ctx.arcTo(x, y + h, x, y + h - r, r);
635
+ ctx.lineTo(x, y + r);
636
+ ctx.arcTo(x, y, x + r, y, r);
637
+ ctx.closePath();
638
+ }
639
+ //# sourceMappingURL=scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll.js","sourceRoot":"","sources":["../../src/canvas/scroll.ts"],"names":[],"mappings":"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"}