@furystack/shades 14.0.0 → 15.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/esm/compile-route.d.ts +5 -0
- package/esm/compile-route.d.ts.map +1 -1
- package/esm/compile-route.js +5 -0
- package/esm/compile-route.js.map +1 -1
- package/esm/component-factory.spec.d.ts.map +1 -1
- package/esm/component-factory.spec.js +2 -2
- package/esm/component-factory.spec.js.map +1 -1
- package/esm/components/nested-hooks.js +2 -2
- package/esm/components/nested-hooks.js.map +1 -1
- package/esm/components/nested-hooks.spec.js +14 -14
- package/esm/components/nested-hooks.spec.js.map +1 -1
- package/esm/components/nested-navigate.js +1 -1
- package/esm/components/nested-navigate.js.map +1 -1
- package/esm/components/nested-navigate.spec.js +16 -16
- package/esm/components/nested-navigate.spec.js.map +1 -1
- package/esm/components/nested-replace.js +1 -1
- package/esm/components/nested-replace.js.map +1 -1
- package/esm/components/nested-replace.spec.js +6 -6
- package/esm/components/nested-replace.spec.js.map +1 -1
- package/esm/components/nested-route-link.js +1 -1
- package/esm/components/nested-route-link.js.map +1 -1
- package/esm/components/nested-route-link.spec.js +8 -8
- package/esm/components/nested-route-link.spec.js.map +1 -1
- package/esm/components/nested-router.js +3 -3
- package/esm/components/nested-router.js.map +1 -1
- package/esm/components/nested-router.spec.js +24 -24
- package/esm/components/nested-router.spec.js.map +1 -1
- package/esm/css-generator.d.ts +9 -26
- package/esm/css-generator.d.ts.map +1 -1
- package/esm/css-generator.js +9 -26
- package/esm/css-generator.js.map +1 -1
- package/esm/css-generator.spec.js.map +1 -1
- package/esm/models/css-object.d.ts +3 -5
- package/esm/models/css-object.d.ts.map +1 -1
- package/esm/models/render-options.d.ts +16 -20
- package/esm/models/render-options.d.ts.map +1 -1
- package/esm/models/shade-component.d.ts +6 -4
- package/esm/models/shade-component.d.ts.map +1 -1
- package/esm/models/shade-component.js +3 -3
- package/esm/models/shade-component.js.map +1 -1
- package/esm/services/location-service.d.ts +39 -42
- package/esm/services/location-service.d.ts.map +1 -1
- package/esm/services/location-service.js +115 -134
- package/esm/services/location-service.js.map +1 -1
- package/esm/services/location-service.spec.js +32 -30
- package/esm/services/location-service.spec.js.map +1 -1
- package/esm/services/route-match-service.d.ts +3 -2
- package/esm/services/route-match-service.d.ts.map +1 -1
- package/esm/services/route-match-service.js +13 -22
- package/esm/services/route-match-service.js.map +1 -1
- package/esm/services/route-match-service.spec.js +40 -51
- package/esm/services/route-match-service.spec.js.map +1 -1
- package/esm/services/route-meta-utils.js.map +1 -1
- package/esm/services/route-meta-utils.spec.js +3 -3
- package/esm/services/route-meta-utils.spec.js.map +1 -1
- package/esm/services/screen-service.d.ts +13 -72
- package/esm/services/screen-service.d.ts.map +1 -1
- package/esm/services/screen-service.js +45 -137
- package/esm/services/screen-service.js.map +1 -1
- package/esm/services/screen-service.spec.js +19 -18
- package/esm/services/screen-service.spec.js.map +1 -1
- package/esm/services/spatial-navigation-service.d.ts +17 -39
- package/esm/services/spatial-navigation-service.d.ts.map +1 -1
- package/esm/services/spatial-navigation-service.js +280 -313
- package/esm/services/spatial-navigation-service.js.map +1 -1
- package/esm/services/spatial-navigation-service.spec.js +163 -158
- package/esm/services/spatial-navigation-service.spec.js.map +1 -1
- package/esm/shade-component.d.ts +14 -17
- package/esm/shade-component.d.ts.map +1 -1
- package/esm/shade-component.js +14 -17
- package/esm/shade-component.js.map +1 -1
- package/esm/shade.d.ts +18 -15
- package/esm/shade.d.ts.map +1 -1
- package/esm/shade.js +22 -32
- package/esm/shade.js.map +1 -1
- package/esm/style-manager.d.ts +8 -22
- package/esm/style-manager.d.ts.map +1 -1
- package/esm/style-manager.js +8 -22
- package/esm/style-manager.js.map +1 -1
- package/esm/styled-shade.d.ts +4 -7
- package/esm/styled-shade.d.ts.map +1 -1
- package/esm/styled-shade.js +4 -4
- package/esm/styled-shade.js.map +1 -1
- package/esm/view-transition.d.ts +10 -22
- package/esm/view-transition.d.ts.map +1 -1
- package/esm/view-transition.js +10 -22
- package/esm/view-transition.js.map +1 -1
- package/esm/vnode.js.map +1 -1
- package/esm/vnode.spec.js.map +1 -1
- package/package.json +9 -8
- package/src/compile-route.ts +5 -0
- package/src/component-factory.spec.tsx +3 -2
- package/src/components/nested-hooks.spec.ts +14 -14
- package/src/components/nested-hooks.ts +2 -2
- package/src/components/nested-navigate.spec.ts +17 -16
- package/src/components/nested-navigate.ts +1 -1
- package/src/components/nested-replace.spec.ts +7 -6
- package/src/components/nested-replace.ts +1 -1
- package/src/components/nested-route-link.spec.tsx +8 -8
- package/src/components/nested-route-link.tsx +1 -1
- package/src/components/nested-router.spec.tsx +24 -24
- package/src/components/nested-router.tsx +5 -5
- package/src/css-generator.spec.ts +1 -1
- package/src/css-generator.ts +9 -26
- package/src/models/css-object.ts +3 -5
- package/src/models/render-options.ts +17 -20
- package/src/models/shade-component.ts +6 -4
- package/src/services/location-service.spec.ts +35 -31
- package/src/services/location-service.tsx +156 -122
- package/src/services/route-match-service.spec.ts +41 -32
- package/src/services/route-match-service.ts +17 -8
- package/src/services/route-meta-utils.spec.ts +3 -3
- package/src/services/route-meta-utils.ts +1 -1
- package/src/services/screen-service.spec.ts +21 -20
- package/src/services/screen-service.ts +65 -110
- package/src/services/spatial-navigation-service.spec.ts +165 -160
- package/src/services/spatial-navigation-service.ts +299 -287
- package/src/shade-component.ts +14 -17
- package/src/shade.ts +31 -41
- package/src/style-manager.ts +9 -22
- package/src/styled-shade.ts +5 -8
- package/src/view-transition.ts +10 -22
- package/src/vnode.spec.ts +3 -3
- package/src/vnode.ts +2 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createInjector } from '@furystack/inject';
|
|
2
2
|
import { usingAsync } from '@furystack/utils';
|
|
3
3
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
4
|
import { ScreenService, ScreenSizes } from './screen-service.js';
|
|
@@ -11,15 +11,16 @@ describe('ScreenService', () => {
|
|
|
11
11
|
vi.restoreAllMocks();
|
|
12
12
|
});
|
|
13
13
|
it('Should be constructed', async () => {
|
|
14
|
-
await usingAsync(
|
|
15
|
-
const s = i.
|
|
16
|
-
expect(s).
|
|
14
|
+
await usingAsync(createInjector(), async (i) => {
|
|
15
|
+
const s = i.get(ScreenService);
|
|
16
|
+
expect(s).toBeDefined();
|
|
17
|
+
expect(s.breakpoints).toBeDefined();
|
|
17
18
|
});
|
|
18
19
|
});
|
|
19
20
|
describe('breakpoints', () => {
|
|
20
21
|
it('Should have correct breakpoint definitions', async () => {
|
|
21
|
-
await usingAsync(
|
|
22
|
-
const s = i.
|
|
22
|
+
await usingAsync(createInjector(), async (i) => {
|
|
23
|
+
const s = i.get(ScreenService);
|
|
23
24
|
expect(s.breakpoints.xs.minSize).toBe(0);
|
|
24
25
|
expect(s.breakpoints.sm.minSize).toBe(600);
|
|
25
26
|
expect(s.breakpoints.md.minSize).toBe(960);
|
|
@@ -30,8 +31,8 @@ describe('ScreenService', () => {
|
|
|
30
31
|
});
|
|
31
32
|
describe('screenSize.atLeast', () => {
|
|
32
33
|
it('Should have observable for each screen size', async () => {
|
|
33
|
-
await usingAsync(
|
|
34
|
-
const s = i.
|
|
34
|
+
await usingAsync(createInjector(), async (i) => {
|
|
35
|
+
const s = i.get(ScreenService);
|
|
35
36
|
for (const size of ScreenSizes) {
|
|
36
37
|
expect(s.screenSize.atLeast[size]).toBeDefined();
|
|
37
38
|
expect(typeof s.screenSize.atLeast[size].getValue()).toBe('boolean');
|
|
@@ -39,15 +40,15 @@ describe('ScreenService', () => {
|
|
|
39
40
|
});
|
|
40
41
|
});
|
|
41
42
|
it('Should return true for xs on any screen size', async () => {
|
|
42
|
-
await usingAsync(
|
|
43
|
-
const s = i.
|
|
43
|
+
await usingAsync(createInjector(), async (i) => {
|
|
44
|
+
const s = i.get(ScreenService);
|
|
44
45
|
// xs has minSize 0, so it should always be true
|
|
45
46
|
expect(s.screenSize.atLeast.xs.getValue()).toBe(true);
|
|
46
47
|
});
|
|
47
48
|
});
|
|
48
49
|
it('Should update screenSize observables on window resize', async () => {
|
|
49
|
-
await usingAsync(
|
|
50
|
-
const s = i.
|
|
50
|
+
await usingAsync(createInjector(), async (i) => {
|
|
51
|
+
const s = i.get(ScreenService);
|
|
51
52
|
// Mock window.innerWidth to simulate a large screen
|
|
52
53
|
vi.spyOn(window, 'innerWidth', 'get').mockReturnValue(1920);
|
|
53
54
|
// Trigger resize event
|
|
@@ -72,8 +73,8 @@ describe('ScreenService', () => {
|
|
|
72
73
|
});
|
|
73
74
|
describe('orientation', () => {
|
|
74
75
|
it('Should have an orientation observable', async () => {
|
|
75
|
-
await usingAsync(
|
|
76
|
-
const s = i.
|
|
76
|
+
await usingAsync(createInjector(), async (i) => {
|
|
77
|
+
const s = i.get(ScreenService);
|
|
77
78
|
const orientation = s.orientation.getValue();
|
|
78
79
|
expect(['landscape', 'portrait']).toContain(orientation);
|
|
79
80
|
});
|
|
@@ -82,10 +83,10 @@ describe('ScreenService', () => {
|
|
|
82
83
|
// Mock matchMedia before creating the service
|
|
83
84
|
const matchMediaMock = vi.fn();
|
|
84
85
|
window.matchMedia = matchMediaMock;
|
|
85
|
-
await usingAsync(
|
|
86
|
+
await usingAsync(createInjector(), async (i) => {
|
|
86
87
|
// Set initial orientation to landscape
|
|
87
88
|
matchMediaMock.mockReturnValue({ matches: true });
|
|
88
|
-
const s = i.
|
|
89
|
+
const s = i.get(ScreenService);
|
|
89
90
|
// Verify initial landscape
|
|
90
91
|
window.dispatchEvent(new Event('resize'));
|
|
91
92
|
expect(s.orientation.getValue()).toBe('landscape');
|
|
@@ -99,8 +100,8 @@ describe('ScreenService', () => {
|
|
|
99
100
|
describe('disposal', () => {
|
|
100
101
|
it('Should remove resize event listener on dispose', async () => {
|
|
101
102
|
const removeEventListenerSpy = vi.spyOn(window, 'removeEventListener');
|
|
102
|
-
await usingAsync(
|
|
103
|
-
i.
|
|
103
|
+
await usingAsync(createInjector(), async (i) => {
|
|
104
|
+
i.get(ScreenService);
|
|
104
105
|
});
|
|
105
106
|
expect(removeEventListenerSpy).toHaveBeenCalledWith('resize', expect.any(Function));
|
|
106
107
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen-service.spec.js","sourceRoot":"","sources":["../../src/services/screen-service.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"screen-service.spec.js","sourceRoot":"","sources":["../../src/services/screen-service.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Injector, Token } from '@furystack/inject';
|
|
2
2
|
import { ObservableValue } from '@furystack/utils';
|
|
3
3
|
/**
|
|
4
4
|
* Direction for spatial navigation movement.
|
|
@@ -19,6 +19,11 @@ export type SpatialNavigationOptions = {
|
|
|
19
19
|
/** Whether Escape moves focus to parent section. Default: false */
|
|
20
20
|
escapeGoesToParentSection?: boolean;
|
|
21
21
|
};
|
|
22
|
+
/**
|
|
23
|
+
* Configuration token for {@link SpatialNavigationService}. Override via
|
|
24
|
+
* {@link configureSpatialNavigation} before the service is first resolved.
|
|
25
|
+
*/
|
|
26
|
+
export declare const SpatialNavigationSettings: Token<SpatialNavigationOptions, 'singleton'>;
|
|
22
27
|
/**
|
|
23
28
|
* Service for D-pad / arrow-key spatial navigation across interactive elements.
|
|
24
29
|
*
|
|
@@ -29,60 +34,33 @@ export type SpatialNavigationOptions = {
|
|
|
29
34
|
* @example
|
|
30
35
|
* ```typescript
|
|
31
36
|
* // Opt in to spatial navigation
|
|
32
|
-
* const spatialNav = injector.
|
|
37
|
+
* const spatialNav = injector.get(SpatialNavigationService)
|
|
33
38
|
*
|
|
34
39
|
* // Disable during video playback
|
|
35
40
|
* spatialNav.enabled.setValue(false)
|
|
36
|
-
*
|
|
37
|
-
* // Re-enable
|
|
38
|
-
* spatialNav.enabled.setValue(true)
|
|
39
41
|
* ```
|
|
40
42
|
*/
|
|
41
|
-
export
|
|
42
|
-
/** Toggle spatial navigation on/off at runtime */
|
|
43
|
+
export interface SpatialNavigationService {
|
|
43
44
|
readonly enabled: ObservableValue<boolean>;
|
|
44
|
-
/** The currently active section name (from data-nav-section), or null if none */
|
|
45
45
|
readonly activeSection: ObservableValue<string | null>;
|
|
46
|
-
/**
|
|
47
|
-
private readonly focusMemory;
|
|
48
|
-
private readonly focusTrapStack;
|
|
49
|
-
private readonly focusableSelector;
|
|
50
|
-
private readonly crossSectionNavigation;
|
|
51
|
-
private readonly backspaceGoesBack;
|
|
52
|
-
private readonly escapeGoesToParentSection;
|
|
53
|
-
constructor(options?: SpatialNavigationOptions);
|
|
54
|
-
[Symbol.dispose](): void;
|
|
55
|
-
/**
|
|
56
|
-
* Push a focus trap onto the stack. While the trap is active, cross-section
|
|
57
|
-
* navigation is blocked and `activeSection` is locked to `sectionName`.
|
|
58
|
-
* Supports nesting — only the topmost trap is enforced.
|
|
59
|
-
*/
|
|
46
|
+
/** Push a focus trap onto the stack. Nesting is supported — only the topmost trap is enforced. */
|
|
60
47
|
pushFocusTrap(sectionName: string): void;
|
|
61
|
-
/**
|
|
62
|
-
* Remove a focus trap from the stack. If other traps remain, the topmost
|
|
63
|
-
* one becomes active. Otherwise `activeSection` reverts to `previousSection`.
|
|
64
|
-
*/
|
|
48
|
+
/** Remove a focus trap from the stack. */
|
|
65
49
|
popFocusTrap(sectionName: string, previousSection?: string | null): void;
|
|
66
|
-
private get activeTrap();
|
|
67
50
|
/** Programmatically move focus in a direction */
|
|
68
51
|
moveFocus(direction: SpatialDirection): void;
|
|
69
52
|
/** Programmatically activate (click) the currently focused element */
|
|
70
53
|
activateFocused(): void;
|
|
71
|
-
private handleKeyDown;
|
|
72
|
-
private focusFirstElement;
|
|
73
|
-
private findContainingSection;
|
|
74
|
-
private isVisibleInScrollContainers;
|
|
75
|
-
private getFocusableCandidates;
|
|
76
|
-
private findNearestInDirection;
|
|
77
|
-
private navigateCrossSection;
|
|
78
|
-
private storeFocusMemory;
|
|
79
|
-
private moveToParentSection;
|
|
80
54
|
}
|
|
55
|
+
export declare const SpatialNavigationService: Token<SpatialNavigationService, 'singleton'>;
|
|
81
56
|
/**
|
|
82
57
|
* Configures spatial navigation options before the service is first instantiated.
|
|
83
|
-
*
|
|
84
|
-
* @
|
|
85
|
-
*
|
|
58
|
+
* Rebinds {@link SpatialNavigationSettings} and invalidates the cached
|
|
59
|
+
* {@link SpatialNavigationService}. Must be called **before** the service is
|
|
60
|
+
* first resolved — calling afterwards drops the cached instance without
|
|
61
|
+
* disposing it (listeners leak until the injector is disposed).
|
|
62
|
+
* @param injector The root injector.
|
|
63
|
+
* @param options Configuration options for spatial navigation.
|
|
86
64
|
*/
|
|
87
65
|
export declare const configureSpatialNavigation: (injector: Injector, options: SpatialNavigationOptions) => void;
|
|
88
66
|
//# sourceMappingURL=spatial-navigation-service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatial-navigation-service.d.ts","sourceRoot":"","sources":["../../src/services/spatial-navigation-service.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"spatial-navigation-service.d.ts","sourceRoot":"","sources":["../../src/services/spatial-navigation-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE/D;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,+DAA+D;IAC/D,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAChC,yCAAyC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,mEAAmE;IACnE,yBAAyB,CAAC,EAAE,OAAO,CAAA;CACpC,CAAA;AAoND;;;GAGG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,wBAAwB,EAAE,WAAW,CAIjF,CAAA;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAC1C,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACtD,kGAAkG;IAClG,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,0CAA0C;IAC1C,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;IACxE,iDAAiD;IACjD,SAAS,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAA;IAC5C,sEAAsE;IACtE,eAAe,IAAI,IAAI,CAAA;CACxB;AAED,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,wBAAwB,EAAE,WAAW,CA+ThF,CAAA;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,QAAQ,EAAE,SAAS,wBAAwB,KAAG,IAIlG,CAAA"}
|