@furystack/shades 13.0.0 → 13.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,523 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Injectable } from '@furystack/inject';
11
+ import { ObservableValue } from '@furystack/utils';
12
+ const DEFAULT_FOCUSABLE_SELECTOR = [
13
+ '[tabindex]:not([tabindex="-1"])',
14
+ '[data-spatial-nav-target]',
15
+ 'a[href]',
16
+ 'button:not([disabled])',
17
+ 'input:not([disabled])',
18
+ 'select:not([disabled])',
19
+ 'textarea:not([disabled])',
20
+ ].join(', ');
21
+ const INPUT_PASSTHROUGH_TAGS = new Set(['TEXTAREA', 'SELECT']);
22
+ /**
23
+ * Input types treated as "text-like" for Enter suppression and Escape blur.
24
+ * `number` is included here even though it also appears in
25
+ * INPUT_VERTICAL_ONLY_PASSTHROUGH_TYPES — the overlap is intentional:
26
+ * isTextInput gates Enter suppression and Escape-blur behavior, while
27
+ * the vertical-only set gates which arrow keys pass through.
28
+ */
29
+ const INPUT_PASSTHROUGH_TYPES = new Set([
30
+ 'text',
31
+ 'password',
32
+ 'email',
33
+ 'number',
34
+ 'search',
35
+ 'tel',
36
+ 'url',
37
+ 'date',
38
+ 'datetime-local',
39
+ 'month',
40
+ 'time',
41
+ 'week',
42
+ ]);
43
+ /**
44
+ * Input types that always pass through all arrow keys because they use
45
+ * arrows for built-in value manipulation (radio group cycling).
46
+ */
47
+ const INPUT_FULL_ARROW_PASSTHROUGH_TYPES = new Set(['radio']);
48
+ /**
49
+ * Input types where only Up/Down arrows should pass through when
50
+ * selectionStart is unavailable (e.g. number inputs use Up/Down
51
+ * for increment/decrement but Left/Right have no useful behavior).
52
+ */
53
+ const INPUT_VERTICAL_ONLY_PASSTHROUGH_TYPES = new Set(['number']);
54
+ /**
55
+ * Input types where only Left/Right arrows should pass through
56
+ * (e.g. horizontal range sliders use Left/Right to adjust value
57
+ * but Up/Down can be used for spatial navigation).
58
+ */
59
+ const INPUT_HORIZONTAL_ONLY_PASSTHROUGH_TYPES = new Set(['range']);
60
+ const getElementCenter = (rect) => ({
61
+ x: rect.left + rect.width / 2,
62
+ y: rect.top + rect.height / 2,
63
+ });
64
+ const PERPENDICULAR_WEIGHT = 3;
65
+ /**
66
+ * Weighted distance that penalizes perpendicular displacement.
67
+ * For horizontal navigation (left/right), vertical offset is weighted 3x.
68
+ * For vertical navigation (up/down), horizontal offset is weighted 3x.
69
+ * This ensures elements aligned on the movement axis are strongly preferred.
70
+ */
71
+ const spatialDistance = (a, b, direction) => {
72
+ const dx = Math.abs(a.x - b.x);
73
+ const dy = Math.abs(a.y - b.y);
74
+ const isHorizontal = direction === 'left' || direction === 'right';
75
+ const primary = isHorizontal ? dx : dy;
76
+ const perpendicular = isHorizontal ? dy : dx;
77
+ return Math.sqrt(primary ** 2 + (perpendicular * PERPENDICULAR_WEIGHT) ** 2);
78
+ };
79
+ const isInDirection = (current, candidate, direction) => {
80
+ const currentCenter = getElementCenter(current);
81
+ const candidateCenter = getElementCenter(candidate);
82
+ switch (direction) {
83
+ case 'right':
84
+ return candidateCenter.x > currentCenter.x;
85
+ case 'left':
86
+ return candidateCenter.x < currentCenter.x;
87
+ case 'down':
88
+ return candidateCenter.y > currentCenter.y;
89
+ case 'up':
90
+ return candidateCenter.y < currentCenter.y;
91
+ default:
92
+ return false;
93
+ }
94
+ };
95
+ /**
96
+ * Walks up the DOM checking the `contentEditable` property rather than
97
+ * using `.closest('[contenteditable="true"]')` — the attribute selector
98
+ * is unreliable in jsdom when contentEditable is set via the IDL property.
99
+ */
100
+ const isInsideContentEditable = (element) => {
101
+ let current = element;
102
+ while (current) {
103
+ if (current.contentEditable === 'true')
104
+ return true;
105
+ current = current.parentElement;
106
+ }
107
+ return false;
108
+ };
109
+ const isTextInput = (element) => {
110
+ if (INPUT_PASSTHROUGH_TAGS.has(element.tagName)) {
111
+ return true;
112
+ }
113
+ if (element.tagName === 'INPUT') {
114
+ const type = element.type?.toLowerCase() || 'text';
115
+ return INPUT_PASSTHROUGH_TYPES.has(type);
116
+ }
117
+ if (isInsideContentEditable(element)) {
118
+ return true;
119
+ }
120
+ return false;
121
+ };
122
+ const isInsidePassthrough = (element) => {
123
+ return !!element.closest('[data-spatial-nav-passthrough]');
124
+ };
125
+ const escapeCssString = (value) => typeof CSS !== 'undefined' && CSS.escape ? CSS.escape(value) : value.replace(/[^\w-]/g, (ch) => `\\${ch}`);
126
+ const ARROW_KEYS = new Set(['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']);
127
+ /**
128
+ * Returns true when the focused element is an input-like control that
129
+ * passes through arrow keys internally, meaning the user cannot escape
130
+ * it via arrow keys alone (e.g. range, radio, date, time, textarea).
131
+ * In these cases Escape should blur the element to resume spatial navigation.
132
+ */
133
+ const shouldEscapeBlurElement = (element) => {
134
+ if (isTextInput(element))
135
+ return true;
136
+ if (element.tagName === 'INPUT') {
137
+ const type = element.type?.toLowerCase() || 'text';
138
+ if (INPUT_FULL_ARROW_PASSTHROUGH_TYPES.has(type))
139
+ return true;
140
+ if (INPUT_HORIZONTAL_ONLY_PASSTHROUGH_TYPES.has(type))
141
+ return true;
142
+ }
143
+ return false;
144
+ };
145
+ /**
146
+ * Determines whether an arrow key should be passed through to an input element.
147
+ * Returns false (allowing spatial nav to take over) when the key press would
148
+ * have no useful effect within the field:
149
+ * - For text-like inputs: at cursor boundaries (start/end of text)
150
+ * - For radio inputs: always pass through (built-in arrow key behavior)
151
+ * - For range inputs: pass through Left/Right (slider adjustment), intercept Up/Down
152
+ * - For number inputs: pass through Up/Down (increment/decrement), intercept Left/Right
153
+ * - For date/time inputs: always pass through (internal segment navigation)
154
+ */
155
+ const shouldPassthroughArrowKeys = (element, key) => {
156
+ if (!ARROW_KEYS.has(key))
157
+ return false;
158
+ if (element.tagName === 'INPUT') {
159
+ const type = element.type?.toLowerCase() || 'text';
160
+ if (INPUT_FULL_ARROW_PASSTHROUGH_TYPES.has(type))
161
+ return true;
162
+ if (INPUT_HORIZONTAL_ONLY_PASSTHROUGH_TYPES.has(type)) {
163
+ return key === 'ArrowLeft' || key === 'ArrowRight';
164
+ }
165
+ }
166
+ if (!isTextInput(element))
167
+ return false;
168
+ // Textareas are multi-line editing areas; arrow keys always serve
169
+ // editing purposes. Users exit via Tab or Escape.
170
+ if (element.tagName === 'TEXTAREA')
171
+ return true;
172
+ const el = element;
173
+ if (typeof el.selectionStart !== 'number' || typeof el.selectionEnd !== 'number') {
174
+ if (element.tagName === 'INPUT') {
175
+ const type = element.type?.toLowerCase() || 'text';
176
+ if (INPUT_VERTICAL_ONLY_PASSTHROUGH_TYPES.has(type)) {
177
+ return key === 'ArrowUp' || key === 'ArrowDown';
178
+ }
179
+ }
180
+ return true;
181
+ }
182
+ const hasSelection = el.selectionStart !== el.selectionEnd;
183
+ if (hasSelection)
184
+ return true;
185
+ const cursor = el.selectionStart;
186
+ const length = el.value?.length ?? 0;
187
+ if (key === 'ArrowUp' || key === 'ArrowLeft') {
188
+ return cursor > 0;
189
+ }
190
+ if (key === 'ArrowDown' || key === 'ArrowRight') {
191
+ return cursor < length;
192
+ }
193
+ return false;
194
+ };
195
+ /**
196
+ * Service for D-pad / arrow-key spatial navigation across interactive elements.
197
+ *
198
+ * Intercepts arrow key events and moves focus spatially based on element geometry.
199
+ * Supports section boundaries via `data-nav-section` attributes and optional
200
+ * cross-section navigation.
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * // Opt in to spatial navigation
205
+ * const spatialNav = injector.getInstance(SpatialNavigationService)
206
+ *
207
+ * // Disable during video playback
208
+ * spatialNav.enabled.setValue(false)
209
+ *
210
+ * // Re-enable
211
+ * spatialNav.enabled.setValue(true)
212
+ * ```
213
+ */
214
+ let SpatialNavigationService = class SpatialNavigationService {
215
+ /** Toggle spatial navigation on/off at runtime */
216
+ enabled;
217
+ /** The currently active section name (from data-nav-section), or null if none */
218
+ activeSection = new ObservableValue(null);
219
+ /** Remembered last-focused element per section for focus restoration */
220
+ focusMemory = new Map();
221
+ focusTrapStack = [];
222
+ focusableSelector;
223
+ crossSectionNavigation;
224
+ backspaceGoesBack;
225
+ escapeGoesToParentSection;
226
+ constructor(options = {}) {
227
+ this.enabled = new ObservableValue(options.initiallyEnabled ?? true);
228
+ this.focusableSelector = options.focusableSelector ?? DEFAULT_FOCUSABLE_SELECTOR;
229
+ this.crossSectionNavigation = options.crossSectionNavigation ?? true;
230
+ this.backspaceGoesBack = options.backspaceGoesBack ?? false;
231
+ this.escapeGoesToParentSection = options.escapeGoesToParentSection ?? false;
232
+ window.addEventListener('keydown', this.handleKeyDown);
233
+ }
234
+ [Symbol.dispose]() {
235
+ window.removeEventListener('keydown', this.handleKeyDown);
236
+ this.enabled[Symbol.dispose]();
237
+ this.activeSection[Symbol.dispose]();
238
+ this.focusMemory.clear();
239
+ this.focusTrapStack.length = 0;
240
+ }
241
+ /**
242
+ * Push a focus trap onto the stack. While the trap is active, cross-section
243
+ * navigation is blocked and `activeSection` is locked to `sectionName`.
244
+ * Supports nesting — only the topmost trap is enforced.
245
+ */
246
+ pushFocusTrap(sectionName) {
247
+ this.focusTrapStack.push(sectionName);
248
+ this.activeSection.setValue(sectionName);
249
+ }
250
+ /**
251
+ * Remove a focus trap from the stack. If other traps remain, the topmost
252
+ * one becomes active. Otherwise `activeSection` reverts to `previousSection`.
253
+ */
254
+ popFocusTrap(sectionName, previousSection) {
255
+ const idx = this.focusTrapStack.lastIndexOf(sectionName);
256
+ if (idx !== -1) {
257
+ this.focusTrapStack.splice(idx, 1);
258
+ }
259
+ const top = this.focusTrapStack[this.focusTrapStack.length - 1];
260
+ this.activeSection.setValue(top ?? previousSection ?? null);
261
+ }
262
+ get activeTrap() {
263
+ return this.focusTrapStack[this.focusTrapStack.length - 1] ?? null;
264
+ }
265
+ /** Programmatically move focus in a direction */
266
+ moveFocus(direction) {
267
+ const activeElement = document.activeElement;
268
+ if (!activeElement || activeElement === document.body) {
269
+ this.focusFirstElement();
270
+ return;
271
+ }
272
+ const currentSection = this.findContainingSection(activeElement);
273
+ const currentSectionName = currentSection?.getAttribute('data-nav-section') ?? null;
274
+ this.activeSection.setValue(currentSectionName);
275
+ const searchRoot = currentSection ?? document;
276
+ const candidates = this.getFocusableCandidates(searchRoot, activeElement);
277
+ const currentRect = activeElement.getBoundingClientRect();
278
+ let target = this.findNearestInDirection(currentRect, candidates, direction);
279
+ if (!target) {
280
+ const relaxedCandidates = this.getFocusableCandidates(searchRoot, activeElement, {
281
+ skipScrollVisibility: true,
282
+ });
283
+ target = this.findNearestInDirection(currentRect, relaxedCandidates, direction);
284
+ }
285
+ if (target) {
286
+ this.storeFocusMemory(currentSectionName, activeElement);
287
+ target.focus();
288
+ target.scrollIntoView({ block: 'nearest', inline: 'nearest' });
289
+ const targetSection = this.findContainingSection(target);
290
+ this.activeSection.setValue(targetSection?.getAttribute('data-nav-section') ?? null);
291
+ return;
292
+ }
293
+ if (this.crossSectionNavigation && currentSection && !this.activeTrap) {
294
+ this.navigateCrossSection(activeElement, currentSection, direction);
295
+ }
296
+ }
297
+ /** Programmatically activate (click) the currently focused element */
298
+ activateFocused() {
299
+ const { activeElement } = document;
300
+ if (activeElement && activeElement !== document.body) {
301
+ ;
302
+ activeElement.click();
303
+ }
304
+ }
305
+ handleKeyDown = (ev) => {
306
+ if (!this.enabled.getValue())
307
+ return;
308
+ if (ev.defaultPrevented)
309
+ return;
310
+ const { activeElement } = document;
311
+ if (activeElement && isInsidePassthrough(activeElement))
312
+ return;
313
+ if (activeElement && shouldPassthroughArrowKeys(activeElement, ev.key)) {
314
+ return;
315
+ }
316
+ switch (ev.key) {
317
+ case 'ArrowUp':
318
+ ev.preventDefault();
319
+ this.moveFocus('up');
320
+ break;
321
+ case 'ArrowDown':
322
+ ev.preventDefault();
323
+ this.moveFocus('down');
324
+ break;
325
+ case 'ArrowLeft':
326
+ ev.preventDefault();
327
+ this.moveFocus('left');
328
+ break;
329
+ case 'ArrowRight':
330
+ ev.preventDefault();
331
+ this.moveFocus('right');
332
+ break;
333
+ case 'Enter':
334
+ if (activeElement && isTextInput(activeElement))
335
+ break;
336
+ ev.preventDefault();
337
+ this.activateFocused();
338
+ break;
339
+ case 'Backspace':
340
+ if (this.backspaceGoesBack && !(activeElement && isTextInput(activeElement))) {
341
+ ev.preventDefault();
342
+ history.back();
343
+ }
344
+ break;
345
+ case 'Escape':
346
+ if (activeElement && activeElement !== document.body && shouldEscapeBlurElement(activeElement)) {
347
+ ev.preventDefault();
348
+ activeElement.blur();
349
+ break;
350
+ }
351
+ if (this.escapeGoesToParentSection) {
352
+ this.moveToParentSection();
353
+ }
354
+ break;
355
+ default:
356
+ break;
357
+ }
358
+ };
359
+ focusFirstElement() {
360
+ const trap = this.activeTrap;
361
+ if (trap) {
362
+ const trapSection = document.querySelector(`[data-nav-section="${escapeCssString(trap)}"]`);
363
+ if (trapSection) {
364
+ const firstFocusable = trapSection.querySelector(this.focusableSelector);
365
+ if (firstFocusable) {
366
+ ;
367
+ firstFocusable.focus();
368
+ this.activeSection.setValue(trap);
369
+ return;
370
+ }
371
+ }
372
+ }
373
+ const sections = document.querySelectorAll('[data-nav-section]');
374
+ if (sections.length > 0) {
375
+ const firstFocusable = sections[0].querySelector(this.focusableSelector);
376
+ if (firstFocusable) {
377
+ ;
378
+ firstFocusable.focus();
379
+ this.activeSection.setValue(sections[0].getAttribute('data-nav-section'));
380
+ return;
381
+ }
382
+ }
383
+ const firstFocusable = document.querySelector(this.focusableSelector);
384
+ if (firstFocusable) {
385
+ ;
386
+ firstFocusable.focus();
387
+ }
388
+ }
389
+ findContainingSection(element) {
390
+ return element.closest('[data-nav-section]');
391
+ }
392
+ isVisibleInScrollContainers(el, rect) {
393
+ const centerX = rect.left + rect.width / 2;
394
+ const centerY = rect.top + rect.height / 2;
395
+ const hasOverflow = (val) => val !== '' && val !== 'visible';
396
+ let ancestor = el.parentElement;
397
+ while (ancestor) {
398
+ const style = getComputedStyle(ancestor);
399
+ if (hasOverflow(style.overflow) || hasOverflow(style.overflowX) || hasOverflow(style.overflowY)) {
400
+ const containerRect = ancestor.getBoundingClientRect();
401
+ if (centerX < containerRect.left ||
402
+ centerX > containerRect.right ||
403
+ centerY < containerRect.top ||
404
+ centerY > containerRect.bottom) {
405
+ return false;
406
+ }
407
+ }
408
+ ancestor = ancestor.parentElement;
409
+ }
410
+ return true;
411
+ }
412
+ getFocusableCandidates(root, exclude, options) {
413
+ return Array.from(root.querySelectorAll(this.focusableSelector)).filter((el) => {
414
+ if (el === exclude)
415
+ return false;
416
+ if (!el.hasAttribute('data-spatial-nav-target') && el.closest('[data-spatial-nav-target]'))
417
+ return false;
418
+ const rect = el.getBoundingClientRect();
419
+ if (rect.width <= 0 || rect.height <= 0)
420
+ return false;
421
+ if (options?.skipScrollVisibility)
422
+ return true;
423
+ return this.isVisibleInScrollContainers(el, rect);
424
+ });
425
+ }
426
+ findNearestInDirection(currentRect, candidates, direction) {
427
+ const currentCenter = getElementCenter(currentRect);
428
+ let nearest = null;
429
+ let nearestDistance = Infinity;
430
+ for (const candidate of candidates) {
431
+ const candidateRect = candidate.getBoundingClientRect();
432
+ if (!isInDirection(currentRect, candidateRect, direction))
433
+ continue;
434
+ const candidateCenter = getElementCenter(candidateRect);
435
+ const distance = spatialDistance(currentCenter, candidateCenter, direction);
436
+ if (distance < nearestDistance) {
437
+ nearestDistance = distance;
438
+ nearest = candidate;
439
+ }
440
+ }
441
+ return nearest;
442
+ }
443
+ navigateCrossSection(activeElement, currentSection, direction) {
444
+ const currentSectionName = currentSection.getAttribute('data-nav-section');
445
+ const allFocusable = Array.from(document.querySelectorAll(this.focusableSelector)).filter((el) => {
446
+ if (el === activeElement)
447
+ return false;
448
+ if (currentSection.contains(el))
449
+ return false;
450
+ if (!el.hasAttribute('data-spatial-nav-target') && el.closest('[data-spatial-nav-target]'))
451
+ return false;
452
+ const rect = el.getBoundingClientRect();
453
+ return rect.width > 0 && rect.height > 0 && this.isVisibleInScrollContainers(el, rect);
454
+ });
455
+ const currentRect = activeElement.getBoundingClientRect();
456
+ const nearest = this.findNearestInDirection(currentRect, allFocusable, direction);
457
+ if (nearest) {
458
+ this.storeFocusMemory(currentSectionName, activeElement);
459
+ const targetSection = this.findContainingSection(nearest);
460
+ const targetSectionName = targetSection?.getAttribute('data-nav-section') ?? null;
461
+ const remembered = targetSectionName ? this.focusMemory.get(targetSectionName)?.deref() : null;
462
+ if (remembered &&
463
+ remembered !== activeElement &&
464
+ targetSection?.contains(remembered) &&
465
+ remembered.matches(this.focusableSelector)) {
466
+ const rememberedRect = remembered.getBoundingClientRect();
467
+ if (rememberedRect.width > 0 &&
468
+ rememberedRect.height > 0 &&
469
+ this.isVisibleInScrollContainers(remembered, rememberedRect)) {
470
+ ;
471
+ remembered.focus();
472
+ remembered.scrollIntoView({ block: 'nearest', inline: 'nearest' });
473
+ this.activeSection.setValue(targetSectionName);
474
+ return;
475
+ }
476
+ }
477
+ nearest.focus();
478
+ nearest.scrollIntoView({ block: 'nearest', inline: 'nearest' });
479
+ this.activeSection.setValue(targetSectionName);
480
+ }
481
+ }
482
+ storeFocusMemory(sectionName, element) {
483
+ if (sectionName) {
484
+ this.focusMemory.set(sectionName, new WeakRef(element));
485
+ }
486
+ }
487
+ moveToParentSection() {
488
+ const { activeElement } = document;
489
+ if (!activeElement || activeElement === document.body)
490
+ return;
491
+ const currentSection = this.findContainingSection(activeElement);
492
+ if (!currentSection)
493
+ return;
494
+ const parentSection = currentSection.parentElement?.closest('[data-nav-section]');
495
+ if (!parentSection)
496
+ return;
497
+ const firstFocusable = parentSection.querySelector(this.focusableSelector);
498
+ if (firstFocusable) {
499
+ ;
500
+ firstFocusable.focus();
501
+ this.activeSection.setValue(parentSection.getAttribute('data-nav-section'));
502
+ }
503
+ }
504
+ };
505
+ SpatialNavigationService = __decorate([
506
+ Injectable({ lifetime: 'singleton' }),
507
+ __metadata("design:paramtypes", [Object])
508
+ ], SpatialNavigationService);
509
+ export { SpatialNavigationService };
510
+ /**
511
+ * Configures spatial navigation options before the service is first instantiated.
512
+ * Must be called **before** `SpatialNavigationService` is first resolved from the injector.
513
+ * @param injector The root injector
514
+ * @param options Configuration options for spatial navigation
515
+ */
516
+ export const configureSpatialNavigation = (injector, options) => {
517
+ if (injector.cachedSingletons.has(SpatialNavigationService)) {
518
+ throw new Error('configureSpatialNavigation must be called before the SpatialNavigationService is instantiated');
519
+ }
520
+ const service = new SpatialNavigationService(options);
521
+ injector.setExplicitInstance(service, SpatialNavigationService);
522
+ };
523
+ //# sourceMappingURL=spatial-navigation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-navigation-service.js","sourceRoot":"","sources":["../../src/services/spatial-navigation-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spatial-navigation-service.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-navigation-service.spec.d.ts","sourceRoot":"","sources":["../../src/services/spatial-navigation-service.spec.ts"],"names":[],"mappings":""}