@spectral_labs/ui 1.5.1 → 1.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/context-menu/components/context-menu-content.svelte +8 -7
- package/dist/components/context-menu/components/context-menu-content.svelte.d.ts.map +1 -1
- package/dist/components/context-menu/components/context-menu-root.svelte +9 -7
- package/dist/components/context-menu/components/context-menu-root.svelte.d.ts.map +1 -1
- package/dist/components/context-menu/index.d.ts +3 -0
- package/dist/components/context-menu/index.d.ts.map +1 -1
- package/dist/components/context-menu/index.js +2 -0
- package/dist/components/dropdown-menu/__tests__/DropdownMenuRadioTest.svelte +90 -0
- package/dist/components/dropdown-menu/__tests__/DropdownMenuTest.svelte +22 -1
- package/dist/components/dropdown-menu/__tests__/dropdown-menu-radio-group.test.svelte.js +306 -0
- package/dist/components/dropdown-menu/__tests__/dropdown-menu.test.svelte.js +438 -1
- package/dist/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte +10 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-checkbox-item.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/components/dropdown-menu-content.svelte +8 -7
- package/dist/components/dropdown-menu/components/dropdown-menu-content.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/components/dropdown-menu-item.svelte +8 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-item.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/components/dropdown-menu-radio-group.svelte +45 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-radio-group.svelte.d.ts +5 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-radio-group.svelte.d.ts.map +1 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-radio-item.svelte +143 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-radio-item.svelte.d.ts +5 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-radio-item.svelte.d.ts.map +1 -0
- package/dist/components/dropdown-menu/components/dropdown-menu-root.svelte +9 -7
- package/dist/components/dropdown-menu/components/dropdown-menu-root.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/components/dropdown-menu-sub-content.svelte +94 -4
- package/dist/components/dropdown-menu/components/dropdown-menu-sub-content.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/components/dropdown-menu-sub-trigger.svelte +32 -7
- package/dist/components/dropdown-menu/components/dropdown-menu-sub-trigger.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/components/dropdown-menu-sub.svelte +180 -6
- package/dist/components/dropdown-menu/components/dropdown-menu-sub.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.svelte.d.ts +48 -2
- package/dist/components/dropdown-menu/dropdown-menu.svelte.d.ts.map +1 -1
- package/dist/components/dropdown-menu/dropdown-menu.svelte.js +16 -0
- package/dist/components/dropdown-menu/index.d.ts +3 -1
- package/dist/components/dropdown-menu/index.d.ts.map +1 -1
- package/dist/components/dropdown-menu/index.js +2 -0
- package/dist/components/dropdown-menu/types.d.ts +37 -1
- package/dist/components/dropdown-menu/types.d.ts.map +1 -1
- package/dist/components/menubar/__tests__/menubar.test.svelte.js +95 -0
- package/dist/components/menubar/components/menubar-content.svelte +8 -7
- package/dist/components/menubar/components/menubar-content.svelte.d.ts.map +1 -1
- package/dist/components/menubar/components/menubar-menu.svelte +8 -6
- package/dist/components/menubar/components/menubar-menu.svelte.d.ts.map +1 -1
- package/dist/components/menubar/index.d.ts +3 -1
- package/dist/components/menubar/index.d.ts.map +1 -1
- package/dist/components/menubar/index.js +2 -0
- package/dist/internal/escape-layer/__tests__/escape-layer.test.js +29 -0
- package/dist/internal/escape-layer/escape-layer.svelte.d.ts +5 -1
- package/dist/internal/escape-layer/escape-layer.svelte.d.ts.map +1 -1
- package/dist/internal/escape-layer/escape-layer.svelte.js +20 -13
- package/dist/internal/menu-context/index.d.ts +2 -2
- package/dist/internal/menu-context/index.d.ts.map +1 -1
- package/dist/internal/menu-context/index.js +1 -1
- package/dist/internal/menu-context/menu-context.svelte.d.ts +64 -2
- package/dist/internal/menu-context/menu-context.svelte.d.ts.map +1 -1
- package/dist/internal/menu-context/menu-context.svelte.js +59 -0
- package/dist/internal/roving-focus/roving-focus.svelte.d.ts.map +1 -1
- package/dist/internal/roving-focus/roving-focus.svelte.js +2 -1
- package/dist/internal/roving-focus/types.d.ts +6 -0
- package/dist/internal/roving-focus/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,67 @@
|
|
|
1
1
|
import { getContext, setContext } from 'svelte';
|
|
2
|
+
import { SvelteSet } from 'svelte/reactivity';
|
|
2
3
|
const MENU_KEY = Symbol('sp-menu');
|
|
4
|
+
/**
|
|
5
|
+
* Builds a `MenuContext` with a per-menu submenu registry.
|
|
6
|
+
* SSR-safe: no DOM access happens here — only event handlers touch the DOM.
|
|
7
|
+
*/
|
|
8
|
+
export function createMenuContext(options) {
|
|
9
|
+
const subs = new SvelteSet();
|
|
10
|
+
return {
|
|
11
|
+
close: options.close,
|
|
12
|
+
registerSub(sub) {
|
|
13
|
+
subs.add(sub);
|
|
14
|
+
return () => {
|
|
15
|
+
subs.delete(sub);
|
|
16
|
+
};
|
|
17
|
+
},
|
|
18
|
+
onItemEnter(event) {
|
|
19
|
+
if (subs.size === 0)
|
|
20
|
+
return;
|
|
21
|
+
const point = { x: event.clientX, y: event.clientY };
|
|
22
|
+
for (const sub of subs) {
|
|
23
|
+
if (sub.ownsTarget(event.target))
|
|
24
|
+
continue;
|
|
25
|
+
if (sub.isPointerInGrace(point))
|
|
26
|
+
continue;
|
|
27
|
+
sub.closeSub();
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
closeOtherSubs(keep) {
|
|
31
|
+
for (const sub of subs) {
|
|
32
|
+
if (sub !== keep)
|
|
33
|
+
sub.closeSub();
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
3
38
|
export function setMenuContext(ctx) {
|
|
4
39
|
setContext(MENU_KEY, ctx);
|
|
5
40
|
}
|
|
6
41
|
export function getMenuContext() {
|
|
7
42
|
return getContext(MENU_KEY);
|
|
8
43
|
}
|
|
44
|
+
/** Class hook of the inline submenu content (shared by every menu family). */
|
|
45
|
+
export const MENU_SUB_CONTENT_SELECTOR = '.sp-dropdown-menu-sub-content';
|
|
46
|
+
/**
|
|
47
|
+
* Whether `candidate` belongs to `container`'s own menu level.
|
|
48
|
+
*
|
|
49
|
+
* Submenu content renders INLINE inside the parent menu content (no portal),
|
|
50
|
+
* so a naive `querySelectorAll('[data-roving-focus-item]')` on the parent
|
|
51
|
+
* leaks the submenu's items into the parent's roving/typeahead collections.
|
|
52
|
+
* A candidate is "own level" when its closest sub-content ancestor is either
|
|
53
|
+
* absent, the container itself (items directly inside a sub-content), or
|
|
54
|
+
* outside the container.
|
|
55
|
+
*/
|
|
56
|
+
export function isOwnLevelMenuItem(container, candidate) {
|
|
57
|
+
const subAncestor = candidate.closest(MENU_SUB_CONTENT_SELECTOR);
|
|
58
|
+
return subAncestor === null || subAncestor === container || !container.contains(subAncestor);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Returns the enabled roving candidates that belong to `container`'s own
|
|
62
|
+
* menu level (excluding rows nested in an open submenu). Used for roving
|
|
63
|
+
* focus, typeahead and open-autofocus in every menu content.
|
|
64
|
+
*/
|
|
65
|
+
export function getOwnLevelMenuItems(container) {
|
|
66
|
+
return Array.from(container.querySelectorAll('[data-roving-focus-item]:not([data-disabled])')).filter((el) => isOwnLevelMenuItem(container, el));
|
|
67
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roving-focus.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/internal/roving-focus/roving-focus.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAKlD;;;;;GAKG;AACH,qBAAa,gBAAgB;;gBAGf,KAAK,EAAE,gBAAgB;IAInC;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"roving-focus.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/internal/roving-focus/roving-focus.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAKlD;;;;;GAKG;AACH,qBAAa,gBAAgB;;gBAGf,KAAK,EAAE,gBAAgB;IAInC;;;OAGG;IACH,aAAa,CAAC,SAAS,EAAE,WAAW,GAAG,WAAW,EAAE;IAOpD;;;;;;;OAOG;IACH,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IA2DjE;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;CAOpE"}
|
|
@@ -17,8 +17,9 @@ export class RovingFocusGroup {
|
|
|
17
17
|
*/
|
|
18
18
|
getCandidates(container) {
|
|
19
19
|
const selector = this.#props.candidateSelector ?? DEFAULT_CANDIDATE_SELECTOR;
|
|
20
|
+
const filter = this.#props.candidateFilter;
|
|
20
21
|
const all = Array.from(container.querySelectorAll(selector));
|
|
21
|
-
return all.filter((el) => !el.hasAttribute('data-disabled'));
|
|
22
|
+
return all.filter((el) => !el.hasAttribute('data-disabled') && (filter?.(el) ?? true));
|
|
22
23
|
}
|
|
23
24
|
/**
|
|
24
25
|
* Handles keyboard navigation within the roving focus group.
|
|
@@ -8,5 +8,11 @@ export interface RovingFocusProps {
|
|
|
8
8
|
loop?: boolean;
|
|
9
9
|
/** CSS selector or data attribute for candidate elements. */
|
|
10
10
|
candidateSelector?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Optional predicate applied on top of `candidateSelector`.
|
|
13
|
+
* Return `false` to exclude a matched element from the collection
|
|
14
|
+
* (e.g. menu contents exclude rows nested in an open submenu).
|
|
15
|
+
*/
|
|
16
|
+
candidateFilter?: (candidate: HTMLElement) => boolean;
|
|
11
17
|
}
|
|
12
18
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/internal/roving-focus/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,WAAW,EAAE,WAAW,CAAA;IACxB,sBAAsB;IACtB,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,mCAAmC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/internal/roving-focus/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/D,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,WAAW,EAAE,WAAW,CAAA;IACxB,sBAAsB;IACtB,GAAG,CAAC,EAAE,SAAS,CAAA;IACf,mCAAmC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B;;;;OAIG;IACH,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,CAAA;CACtD"}
|