@tokis/core 1.0.1 → 1.1.0
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/README.md +5 -5
- package/dist/__tests__/accordion.test.d.ts +2 -0
- package/dist/__tests__/accordion.test.d.ts.map +1 -0
- package/dist/__tests__/accordion.test.js +127 -0
- package/dist/__tests__/accordion.test.js.map +1 -0
- package/dist/__tests__/create-machine.test.d.ts +2 -0
- package/dist/__tests__/create-machine.test.d.ts.map +1 -0
- package/dist/__tests__/create-machine.test.js +79 -0
- package/dist/__tests__/create-machine.test.js.map +1 -0
- package/dist/__tests__/dialog.test.d.ts +2 -0
- package/dist/__tests__/dialog.test.d.ts.map +1 -0
- package/dist/__tests__/dialog.test.js +74 -0
- package/dist/__tests__/dialog.test.js.map +1 -0
- package/dist/__tests__/menu.test.d.ts +2 -0
- package/dist/__tests__/menu.test.d.ts.map +1 -0
- package/dist/__tests__/menu.test.js +177 -0
- package/dist/__tests__/menu.test.js.map +1 -0
- package/dist/__tests__/tabs.test.d.ts +2 -0
- package/dist/__tests__/tabs.test.d.ts.map +1 -0
- package/dist/__tests__/tabs.test.js +147 -0
- package/dist/__tests__/tabs.test.js.map +1 -0
- package/dist/cjs/__tests__/accordion.test.js +128 -0
- package/dist/cjs/__tests__/create-machine.test.js +80 -0
- package/dist/cjs/__tests__/dialog.test.js +75 -0
- package/dist/cjs/__tests__/menu.test.js +178 -0
- package/dist/cjs/__tests__/tabs.test.js +148 -0
- package/dist/cjs/index.js +9 -0
- package/dist/cjs/primitives/accordion/accordion.machine.js +109 -0
- package/dist/cjs/primitives/accordion/accordion.types.js +6 -0
- package/dist/cjs/primitives/accordion/index.js +18 -0
- package/dist/cjs/primitives/dialog/dialog.machine.js +62 -0
- package/dist/cjs/primitives/dialog/dialog.types.js +6 -0
- package/dist/cjs/primitives/dialog/index.js +18 -0
- package/dist/cjs/primitives/menu/index.js +18 -0
- package/dist/cjs/primitives/menu/menu.machine.js +135 -0
- package/dist/cjs/primitives/menu/menu.types.js +6 -0
- package/dist/cjs/primitives/popover/index.js +18 -0
- package/dist/cjs/primitives/popover/popover.machine.js +87 -0
- package/dist/cjs/primitives/popover/popover.types.js +7 -0
- package/dist/cjs/primitives/tabs/index.js +18 -0
- package/dist/cjs/primitives/tabs/tabs.machine.js +124 -0
- package/dist/cjs/primitives/tabs/tabs.types.js +6 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/primitives/accordion/accordion.machine.d.ts +22 -0
- package/dist/primitives/accordion/accordion.machine.d.ts.map +1 -0
- package/dist/primitives/accordion/accordion.machine.js +103 -0
- package/dist/primitives/accordion/accordion.machine.js.map +1 -0
- package/dist/primitives/accordion/accordion.types.d.ts +28 -0
- package/dist/primitives/accordion/accordion.types.d.ts.map +1 -0
- package/dist/primitives/accordion/accordion.types.js +6 -0
- package/dist/primitives/accordion/accordion.types.js.map +1 -0
- package/dist/primitives/accordion/index.d.ts +3 -0
- package/dist/primitives/accordion/index.d.ts.map +1 -0
- package/dist/primitives/accordion/index.js +3 -0
- package/dist/primitives/accordion/index.js.map +1 -0
- package/dist/primitives/dialog/dialog.machine.d.ts +23 -0
- package/dist/primitives/dialog/dialog.machine.d.ts.map +1 -0
- package/dist/primitives/dialog/dialog.machine.js +58 -0
- package/dist/primitives/dialog/dialog.machine.js.map +1 -0
- package/dist/primitives/dialog/dialog.types.d.ts +25 -0
- package/dist/primitives/dialog/dialog.types.d.ts.map +1 -0
- package/dist/primitives/dialog/dialog.types.js +6 -0
- package/dist/primitives/dialog/dialog.types.js.map +1 -0
- package/dist/primitives/dialog/index.d.ts +3 -0
- package/dist/primitives/dialog/index.d.ts.map +1 -0
- package/dist/primitives/dialog/index.js +3 -0
- package/dist/primitives/dialog/index.js.map +1 -0
- package/dist/primitives/menu/index.d.ts +3 -0
- package/dist/primitives/menu/index.d.ts.map +1 -0
- package/dist/primitives/menu/index.js +3 -0
- package/dist/primitives/menu/index.js.map +1 -0
- package/dist/primitives/menu/menu.machine.d.ts +25 -0
- package/dist/primitives/menu/menu.machine.d.ts.map +1 -0
- package/dist/primitives/menu/menu.machine.js +129 -0
- package/dist/primitives/menu/menu.machine.js.map +1 -0
- package/dist/primitives/menu/menu.types.d.ts +30 -0
- package/dist/primitives/menu/menu.types.d.ts.map +1 -0
- package/dist/primitives/menu/menu.types.js +6 -0
- package/dist/primitives/menu/menu.types.js.map +1 -0
- package/dist/primitives/popover/index.d.ts +3 -0
- package/dist/primitives/popover/index.d.ts.map +1 -0
- package/dist/primitives/popover/index.js +3 -0
- package/dist/primitives/popover/index.js.map +1 -0
- package/dist/primitives/popover/popover.machine.d.ts +30 -0
- package/dist/primitives/popover/popover.machine.d.ts.map +1 -0
- package/dist/primitives/popover/popover.machine.js +80 -0
- package/dist/primitives/popover/popover.machine.js.map +1 -0
- package/dist/primitives/popover/popover.types.d.ts +34 -0
- package/dist/primitives/popover/popover.types.d.ts.map +1 -0
- package/dist/primitives/popover/popover.types.js +7 -0
- package/dist/primitives/popover/popover.types.js.map +1 -0
- package/dist/primitives/tabs/index.d.ts +3 -0
- package/dist/primitives/tabs/index.d.ts.map +1 -0
- package/dist/primitives/tabs/index.js +3 -0
- package/dist/primitives/tabs/index.js.map +1 -0
- package/dist/primitives/tabs/tabs.machine.d.ts +25 -0
- package/dist/primitives/tabs/tabs.machine.d.ts.map +1 -0
- package/dist/primitives/tabs/tabs.machine.js +117 -0
- package/dist/primitives/tabs/tabs.machine.js.map +1 -0
- package/dist/primitives/tabs/tabs.types.d.ts +34 -0
- package/dist/primitives/tabs/tabs.types.d.ts.map +1 -0
- package/dist/primitives/tabs/tabs.types.js +6 -0
- package/dist/primitives/tabs/tabs.types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./tabs.machine"), exports);
|
|
18
|
+
__exportStar(require("./tabs.types"), exports);
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tabsMachine = void 0;
|
|
4
|
+
exports.getNextTabId = getNextTabId;
|
|
5
|
+
exports.getPrevTabId = getPrevTabId;
|
|
6
|
+
exports.reduceTabsContext = reduceTabsContext;
|
|
7
|
+
exports.getTabAriaProps = getTabAriaProps;
|
|
8
|
+
exports.getTabPanelAriaProps = getTabPanelAriaProps;
|
|
9
|
+
const create_machine_js_1 = require("../../state/create-machine");
|
|
10
|
+
/**
|
|
11
|
+
* Tabs state machine.
|
|
12
|
+
*
|
|
13
|
+
* The macro-state is always 'idle' — active/focused tab is tracked via context.
|
|
14
|
+
* Pure helper functions below handle context transitions and are designed to
|
|
15
|
+
* work with `useState` / `useReducer` in framework adapters.
|
|
16
|
+
*/
|
|
17
|
+
exports.tabsMachine = (0, create_machine_js_1.createMachine)({
|
|
18
|
+
id: 'tabs',
|
|
19
|
+
initial: 'idle',
|
|
20
|
+
context: {
|
|
21
|
+
tabIds: [],
|
|
22
|
+
activeTabId: '',
|
|
23
|
+
focusedTabId: '',
|
|
24
|
+
activationMode: 'automatic',
|
|
25
|
+
orientation: 'horizontal',
|
|
26
|
+
loop: true,
|
|
27
|
+
},
|
|
28
|
+
states: {
|
|
29
|
+
// All events stay in idle; context manipulation is done via helpers below.
|
|
30
|
+
idle: {},
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
// ─── Pure context helpers ──────────────────────────────────────────────────
|
|
34
|
+
/** Returns the next tab id in the ordered list, with optional looping. */
|
|
35
|
+
function getNextTabId(ctx) {
|
|
36
|
+
const { tabIds, focusedTabId, loop } = ctx;
|
|
37
|
+
const idx = tabIds.indexOf(focusedTabId);
|
|
38
|
+
if (idx === -1)
|
|
39
|
+
return tabIds[0] ?? focusedTabId;
|
|
40
|
+
const next = idx + 1;
|
|
41
|
+
if (next >= tabIds.length)
|
|
42
|
+
return loop ? (tabIds[0] ?? focusedTabId) : (tabIds[tabIds.length - 1] ?? focusedTabId);
|
|
43
|
+
return tabIds[next] ?? focusedTabId;
|
|
44
|
+
}
|
|
45
|
+
/** Returns the previous tab id in the ordered list, with optional looping. */
|
|
46
|
+
function getPrevTabId(ctx) {
|
|
47
|
+
const { tabIds, focusedTabId, loop } = ctx;
|
|
48
|
+
const idx = tabIds.indexOf(focusedTabId);
|
|
49
|
+
if (idx === -1)
|
|
50
|
+
return tabIds[tabIds.length - 1] ?? focusedTabId;
|
|
51
|
+
const prev = idx - 1;
|
|
52
|
+
if (prev < 0)
|
|
53
|
+
return loop ? (tabIds[tabIds.length - 1] ?? focusedTabId) : (tabIds[0] ?? focusedTabId);
|
|
54
|
+
return tabIds[prev] ?? focusedTabId;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Reduces a tabs event into a new partial context.
|
|
58
|
+
* Framework adapters call this and merge the result into their state.
|
|
59
|
+
*/
|
|
60
|
+
function reduceTabsContext(ctx, event, payload) {
|
|
61
|
+
switch (event) {
|
|
62
|
+
case 'SELECT_TAB': {
|
|
63
|
+
const id = payload?.tabId ?? ctx.focusedTabId;
|
|
64
|
+
return { activeTabId: id, focusedTabId: id };
|
|
65
|
+
}
|
|
66
|
+
case 'FOCUS_TAB': {
|
|
67
|
+
const id = payload?.tabId ?? ctx.focusedTabId;
|
|
68
|
+
const changes = { focusedTabId: id };
|
|
69
|
+
if (ctx.activationMode === 'automatic')
|
|
70
|
+
changes.activeTabId = id;
|
|
71
|
+
return changes;
|
|
72
|
+
}
|
|
73
|
+
case 'NEXT_TAB': {
|
|
74
|
+
const id = getNextTabId(ctx);
|
|
75
|
+
const changes = { focusedTabId: id };
|
|
76
|
+
if (ctx.activationMode === 'automatic')
|
|
77
|
+
changes.activeTabId = id;
|
|
78
|
+
return changes;
|
|
79
|
+
}
|
|
80
|
+
case 'PREV_TAB': {
|
|
81
|
+
const id = getPrevTabId(ctx);
|
|
82
|
+
const changes = { focusedTabId: id };
|
|
83
|
+
if (ctx.activationMode === 'automatic')
|
|
84
|
+
changes.activeTabId = id;
|
|
85
|
+
return changes;
|
|
86
|
+
}
|
|
87
|
+
case 'FIRST_TAB': {
|
|
88
|
+
const id = ctx.tabIds[0] ?? ctx.focusedTabId;
|
|
89
|
+
const changes = { focusedTabId: id };
|
|
90
|
+
if (ctx.activationMode === 'automatic')
|
|
91
|
+
changes.activeTabId = id;
|
|
92
|
+
return changes;
|
|
93
|
+
}
|
|
94
|
+
case 'LAST_TAB': {
|
|
95
|
+
const id = ctx.tabIds[ctx.tabIds.length - 1] ?? ctx.focusedTabId;
|
|
96
|
+
const changes = { focusedTabId: id };
|
|
97
|
+
if (ctx.activationMode === 'automatic')
|
|
98
|
+
changes.activeTabId = id;
|
|
99
|
+
return changes;
|
|
100
|
+
}
|
|
101
|
+
default:
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/** Returns the ARIA attributes for a tab element. */
|
|
106
|
+
function getTabAriaProps(ctx, tabId, panelId) {
|
|
107
|
+
return {
|
|
108
|
+
role: 'tab',
|
|
109
|
+
id: tabId,
|
|
110
|
+
'aria-controls': panelId,
|
|
111
|
+
'aria-selected': ctx.activeTabId === tabId,
|
|
112
|
+
tabIndex: ctx.activeTabId === tabId ? 0 : -1,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/** Returns the ARIA attributes for a tab panel element. */
|
|
116
|
+
function getTabPanelAriaProps(ctx, panelId, tabId) {
|
|
117
|
+
return {
|
|
118
|
+
role: 'tabpanel',
|
|
119
|
+
id: panelId,
|
|
120
|
+
'aria-labelledby': tabId,
|
|
121
|
+
tabIndex: 0,
|
|
122
|
+
hidden: ctx.activeTabId !== tabId,
|
|
123
|
+
};
|
|
124
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
export * from './primitives/button/index.js';
|
|
2
|
+
export * from './primitives/dialog/index.js';
|
|
3
|
+
export * from './primitives/tabs/index.js';
|
|
4
|
+
export * from './primitives/accordion/index.js';
|
|
5
|
+
export * from './primitives/menu/index.js';
|
|
6
|
+
export * from './primitives/popover/index.js';
|
|
2
7
|
export * from './focus/focus-trap.js';
|
|
3
8
|
export * from './focus/roving-tabindex.js';
|
|
4
9
|
export * from './focus/use-focus-visible.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAG9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
+
// Primitives — headless state machines per component
|
|
1
2
|
export * from './primitives/button/index.js';
|
|
3
|
+
export * from './primitives/dialog/index.js';
|
|
4
|
+
export * from './primitives/tabs/index.js';
|
|
5
|
+
export * from './primitives/accordion/index.js';
|
|
6
|
+
export * from './primitives/menu/index.js';
|
|
7
|
+
export * from './primitives/popover/index.js';
|
|
8
|
+
// Focus management
|
|
2
9
|
export * from './focus/focus-trap.js';
|
|
3
10
|
export * from './focus/roving-tabindex.js';
|
|
4
11
|
export * from './focus/use-focus-visible.js';
|
|
12
|
+
// Accessibility helpers
|
|
5
13
|
export * from './a11y/aria-helpers.js';
|
|
6
14
|
export * from './a11y/id-generator.js';
|
|
15
|
+
// State utilities
|
|
7
16
|
export * from './state/controllable-state.js';
|
|
8
17
|
export * from './state/create-machine.js';
|
|
9
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAE9C,mBAAmB;AACnB,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAE7C,wBAAwB;AACxB,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AAEvC,kBAAkB;AAClB,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AccordionContext, AccordionEventType } from './accordion.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Accordion state machine.
|
|
4
|
+
*
|
|
5
|
+
* Like tabs, the macro-state is always 'idle'. Open/closed state per item
|
|
6
|
+
* lives in context.openItemIds. Use `reduceAccordionContext` in adapters.
|
|
7
|
+
*/
|
|
8
|
+
export declare const accordionMachine: import("../../state/create-machine.js").MachineInstance<"idle", AccordionEventType, AccordionContext>;
|
|
9
|
+
/**
|
|
10
|
+
* Reduces an accordion event into a new openItemIds set.
|
|
11
|
+
* Returns the full updated context for easy spreading.
|
|
12
|
+
*/
|
|
13
|
+
export declare function reduceAccordionContext(ctx: AccordionContext, event: AccordionEventType, payload?: {
|
|
14
|
+
itemId?: string;
|
|
15
|
+
}): Partial<AccordionContext>;
|
|
16
|
+
/** Returns whether a specific item is currently open. */
|
|
17
|
+
export declare function isAccordionItemOpen(ctx: AccordionContext, itemId: string): boolean;
|
|
18
|
+
/** Returns ARIA attributes for an accordion trigger button. */
|
|
19
|
+
export declare function getAccordionTriggerAriaProps(ctx: AccordionContext, itemId: string, panelId: string): Record<string, string | boolean>;
|
|
20
|
+
/** Returns ARIA attributes for an accordion panel. */
|
|
21
|
+
export declare function getAccordionPanelAriaProps(ctx: AccordionContext, panelId: string, triggerId: string): Record<string, string | boolean>;
|
|
22
|
+
//# sourceMappingURL=accordion.machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.machine.d.ts","sourceRoot":"","sources":["../../../src/primitives/accordion/accordion.machine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAkB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAEjG;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,uGAY3B,CAAC;AAIH;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,gBAAgB,EACrB,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAmD3B;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAElF;AAED,+DAA+D;AAC/D,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAOlC;AAED,sDAAsD;AACtD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,gBAAgB,EACrB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAOlC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { createMachine } from '../../state/create-machine.js';
|
|
2
|
+
/**
|
|
3
|
+
* Accordion state machine.
|
|
4
|
+
*
|
|
5
|
+
* Like tabs, the macro-state is always 'idle'. Open/closed state per item
|
|
6
|
+
* lives in context.openItemIds. Use `reduceAccordionContext` in adapters.
|
|
7
|
+
*/
|
|
8
|
+
export const accordionMachine = createMachine({
|
|
9
|
+
id: 'accordion',
|
|
10
|
+
initial: 'idle',
|
|
11
|
+
context: {
|
|
12
|
+
itemIds: [],
|
|
13
|
+
openItemIds: new Set(),
|
|
14
|
+
multiple: false,
|
|
15
|
+
collapsible: true,
|
|
16
|
+
},
|
|
17
|
+
states: {
|
|
18
|
+
idle: {},
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
// ─── Pure context helpers ──────────────────────────────────────────────────
|
|
22
|
+
/**
|
|
23
|
+
* Reduces an accordion event into a new openItemIds set.
|
|
24
|
+
* Returns the full updated context for easy spreading.
|
|
25
|
+
*/
|
|
26
|
+
export function reduceAccordionContext(ctx, event, payload) {
|
|
27
|
+
const open = new Set(ctx.openItemIds);
|
|
28
|
+
switch (event) {
|
|
29
|
+
case 'TOGGLE_ITEM': {
|
|
30
|
+
const id = payload?.itemId;
|
|
31
|
+
if (!id)
|
|
32
|
+
return {};
|
|
33
|
+
if (open.has(id)) {
|
|
34
|
+
// Prevent closing the last item when collapsible=false
|
|
35
|
+
if (!ctx.collapsible && open.size === 1)
|
|
36
|
+
return {};
|
|
37
|
+
open.delete(id);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
if (!ctx.multiple)
|
|
41
|
+
open.clear(); // exclusive mode
|
|
42
|
+
open.add(id);
|
|
43
|
+
}
|
|
44
|
+
return { openItemIds: open };
|
|
45
|
+
}
|
|
46
|
+
case 'OPEN_ITEM': {
|
|
47
|
+
const id = payload?.itemId;
|
|
48
|
+
if (!id)
|
|
49
|
+
return {};
|
|
50
|
+
if (!ctx.multiple) {
|
|
51
|
+
const next = new Set();
|
|
52
|
+
next.add(id);
|
|
53
|
+
return { openItemIds: next };
|
|
54
|
+
}
|
|
55
|
+
open.add(id);
|
|
56
|
+
return { openItemIds: open };
|
|
57
|
+
}
|
|
58
|
+
case 'CLOSE_ITEM': {
|
|
59
|
+
const id = payload?.itemId;
|
|
60
|
+
if (!id)
|
|
61
|
+
return {};
|
|
62
|
+
if (!ctx.collapsible && open.size === 1 && open.has(id))
|
|
63
|
+
return {};
|
|
64
|
+
open.delete(id);
|
|
65
|
+
return { openItemIds: open };
|
|
66
|
+
}
|
|
67
|
+
case 'OPEN_ALL': {
|
|
68
|
+
if (!ctx.multiple)
|
|
69
|
+
return {}; // no-op for exclusive mode
|
|
70
|
+
return { openItemIds: new Set(ctx.itemIds) };
|
|
71
|
+
}
|
|
72
|
+
case 'CLOSE_ALL': {
|
|
73
|
+
if (!ctx.collapsible)
|
|
74
|
+
return {}; // no-op: cannot close when not collapsible
|
|
75
|
+
return { openItemIds: new Set() };
|
|
76
|
+
}
|
|
77
|
+
default:
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Returns whether a specific item is currently open. */
|
|
82
|
+
export function isAccordionItemOpen(ctx, itemId) {
|
|
83
|
+
return ctx.openItemIds.has(itemId);
|
|
84
|
+
}
|
|
85
|
+
/** Returns ARIA attributes for an accordion trigger button. */
|
|
86
|
+
export function getAccordionTriggerAriaProps(ctx, itemId, panelId) {
|
|
87
|
+
const expanded = isAccordionItemOpen(ctx, itemId);
|
|
88
|
+
return {
|
|
89
|
+
role: 'button',
|
|
90
|
+
'aria-expanded': expanded,
|
|
91
|
+
'aria-controls': panelId,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** Returns ARIA attributes for an accordion panel. */
|
|
95
|
+
export function getAccordionPanelAriaProps(ctx, panelId, triggerId) {
|
|
96
|
+
return {
|
|
97
|
+
role: 'region',
|
|
98
|
+
id: panelId,
|
|
99
|
+
'aria-labelledby': triggerId,
|
|
100
|
+
hidden: !isAccordionItemOpen(ctx, triggerId.replace('-trigger', '')),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=accordion.machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.machine.js","sourceRoot":"","sources":["../../../src/primitives/accordion/accordion.machine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accordion state machine types.
|
|
3
|
+
* Implements the WAI-ARIA Accordion pattern (role="button" triggers on headings).
|
|
4
|
+
*/
|
|
5
|
+
export type AccordionState = 'idle';
|
|
6
|
+
export type AccordionEventType = 'TOGGLE_ITEM' | 'OPEN_ITEM' | 'CLOSE_ITEM' | 'OPEN_ALL' | 'CLOSE_ALL';
|
|
7
|
+
export interface AccordionEvent {
|
|
8
|
+
type: AccordionEventType;
|
|
9
|
+
/** Item id for TOGGLE_ITEM / OPEN_ITEM / CLOSE_ITEM */
|
|
10
|
+
itemId?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface AccordionContext {
|
|
13
|
+
/** Ordered list of all accordion item ids */
|
|
14
|
+
itemIds: string[];
|
|
15
|
+
/** Set of currently open item ids */
|
|
16
|
+
openItemIds: Set<string>;
|
|
17
|
+
/**
|
|
18
|
+
* When false only one panel may be open at a time (exclusive accordion).
|
|
19
|
+
* When true multiple panels may be open simultaneously.
|
|
20
|
+
*/
|
|
21
|
+
multiple: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* When true the last open panel cannot be closed (always one open).
|
|
24
|
+
* Only meaningful when multiple=false.
|
|
25
|
+
*/
|
|
26
|
+
collapsible: boolean;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=accordion.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.types.d.ts","sourceRoot":"","sources":["../../../src/primitives/accordion/accordion.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,kBAAkB,GAC1B,aAAa,GACb,WAAW,GACX,YAAY,GACZ,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,6CAA6C;IAC7C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,qCAAqC;IACrC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,EAAE,OAAO,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.types.js","sourceRoot":"","sources":["../../../src/primitives/accordion/accordion.types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/accordion/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/primitives/accordion/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { DialogContext, DialogState, DialogEventType } from './dialog.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Dialog state machine.
|
|
4
|
+
*
|
|
5
|
+
* Transition table:
|
|
6
|
+
*
|
|
7
|
+
* closed + OPEN → opening (animated) | open (no animation)
|
|
8
|
+
* opening + ANIMATION_END → open
|
|
9
|
+
* open + CLOSE → closing (animated) | closed (no animation)
|
|
10
|
+
* open + TOGGLE → closing (animated) | closed (no animation)
|
|
11
|
+
* closing + ANIMATION_END → closed
|
|
12
|
+
* closed + TOGGLE → opening (animated) | open (no animation)
|
|
13
|
+
*
|
|
14
|
+
* When `animated` is false the intermediate opening/closing states are
|
|
15
|
+
* skipped — callers simply never fire ANIMATION_END and can treat
|
|
16
|
+
* open/closed as the only two live states.
|
|
17
|
+
*/
|
|
18
|
+
export declare const dialogMachine: import("../../state/create-machine.js").MachineInstance<DialogState, DialogEventType, DialogContext>;
|
|
19
|
+
/** Derive if the dialog DOM node should be mounted (present in the DOM) */
|
|
20
|
+
export declare function isDialogMounted(state: DialogState): boolean;
|
|
21
|
+
/** Derive aria-expanded / open prop */
|
|
22
|
+
export declare function isDialogOpen(state: DialogState): boolean;
|
|
23
|
+
//# sourceMappingURL=dialog.machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.machine.d.ts","sourceRoot":"","sources":["../../../src/primitives/dialog/dialog.machine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAErF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,aAAa,sGA+BxB,CAAC;AAEH,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAExD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { createMachine } from '../../state/create-machine.js';
|
|
2
|
+
/**
|
|
3
|
+
* Dialog state machine.
|
|
4
|
+
*
|
|
5
|
+
* Transition table:
|
|
6
|
+
*
|
|
7
|
+
* closed + OPEN → opening (animated) | open (no animation)
|
|
8
|
+
* opening + ANIMATION_END → open
|
|
9
|
+
* open + CLOSE → closing (animated) | closed (no animation)
|
|
10
|
+
* open + TOGGLE → closing (animated) | closed (no animation)
|
|
11
|
+
* closing + ANIMATION_END → closed
|
|
12
|
+
* closed + TOGGLE → opening (animated) | open (no animation)
|
|
13
|
+
*
|
|
14
|
+
* When `animated` is false the intermediate opening/closing states are
|
|
15
|
+
* skipped — callers simply never fire ANIMATION_END and can treat
|
|
16
|
+
* open/closed as the only two live states.
|
|
17
|
+
*/
|
|
18
|
+
export const dialogMachine = createMachine({
|
|
19
|
+
id: 'dialog',
|
|
20
|
+
initial: 'closed',
|
|
21
|
+
context: {
|
|
22
|
+
id: 'dialog',
|
|
23
|
+
modal: true,
|
|
24
|
+
closeOnOverlayClick: true,
|
|
25
|
+
closeOnEscape: true,
|
|
26
|
+
animated: true,
|
|
27
|
+
},
|
|
28
|
+
states: {
|
|
29
|
+
closed: {
|
|
30
|
+
OPEN: 'opening',
|
|
31
|
+
TOGGLE: 'opening',
|
|
32
|
+
},
|
|
33
|
+
opening: {
|
|
34
|
+
ANIMATION_END: 'open',
|
|
35
|
+
// Immediately cancel if closed before animation completes
|
|
36
|
+
CLOSE: 'closed',
|
|
37
|
+
},
|
|
38
|
+
open: {
|
|
39
|
+
CLOSE: 'closing',
|
|
40
|
+
TOGGLE: 'closing',
|
|
41
|
+
},
|
|
42
|
+
closing: {
|
|
43
|
+
ANIMATION_END: 'closed',
|
|
44
|
+
// Re-open before close animation completes
|
|
45
|
+
OPEN: 'opening',
|
|
46
|
+
TOGGLE: 'opening',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
/** Derive if the dialog DOM node should be mounted (present in the DOM) */
|
|
51
|
+
export function isDialogMounted(state) {
|
|
52
|
+
return state === 'open' || state === 'opening' || state === 'closing';
|
|
53
|
+
}
|
|
54
|
+
/** Derive aria-expanded / open prop */
|
|
55
|
+
export function isDialogOpen(state) {
|
|
56
|
+
return state === 'open' || state === 'opening';
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=dialog.machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.machine.js","sourceRoot":"","sources":["../../../src/primitives/dialog/dialog.machine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAA8C;IACtF,EAAE,EAAE,QAAQ;IACZ,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE;QACP,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,IAAI;QACX,mBAAmB,EAAE,IAAI;QACzB,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,IAAI;KACf;IACD,MAAM,EAAE;QACN,MAAM,EAAE;YACN,IAAI,EAAI,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB;QACD,OAAO,EAAE;YACP,aAAa,EAAE,MAAM;YACrB,0DAA0D;YAC1D,KAAK,EAAE,QAAQ;SAChB;QACD,IAAI,EAAE;YACJ,KAAK,EAAG,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB;QACD,OAAO,EAAE;YACP,aAAa,EAAE,QAAQ;YACvB,2CAA2C;YAC3C,IAAI,EAAI,SAAS;YACjB,MAAM,EAAE,SAAS;SAClB;KACF;CACF,CAAC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,UAAU,eAAe,CAAC,KAAkB;IAChD,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,CAAC;AACxE,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,YAAY,CAAC,KAAkB;IAC7C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialog state machine types.
|
|
3
|
+
* Drives all dialog/modal variants: Dialog, AlertDialog, Drawer, Sheet.
|
|
4
|
+
*/
|
|
5
|
+
export type DialogState = 'closed' | 'opening' | 'open' | 'closing';
|
|
6
|
+
export type DialogEventType = 'OPEN' | 'CLOSE' | 'TOGGLE' | 'ANIMATION_END';
|
|
7
|
+
export interface DialogEvent {
|
|
8
|
+
type: DialogEventType;
|
|
9
|
+
}
|
|
10
|
+
export interface DialogContext {
|
|
11
|
+
/** Unique id used to wire aria-labelledby / aria-describedby */
|
|
12
|
+
id: string;
|
|
13
|
+
/** If true, focus is trapped and background is inert (modal dialog). */
|
|
14
|
+
modal: boolean;
|
|
15
|
+
/** Close on backdrop/overlay click. */
|
|
16
|
+
closeOnOverlayClick: boolean;
|
|
17
|
+
/** Close when Escape key is pressed. */
|
|
18
|
+
closeOnEscape: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Whether to use CSS animation transitions (opening/closing states).
|
|
21
|
+
* Set to false to skip the intermediate states.
|
|
22
|
+
*/
|
|
23
|
+
animated: boolean;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=dialog.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.types.d.ts","sourceRoot":"","sources":["../../../src/primitives/dialog/dialog.types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpE,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,eAAe,CAAC;AAEpB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,KAAK,EAAE,OAAO,CAAC;IACf,uCAAuC;IACvC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,wCAAwC;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialog.types.js","sourceRoot":"","sources":["../../../src/primitives/dialog/dialog.types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/dialog/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/primitives/dialog/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/menu/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/primitives/menu/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { MenuContext, MenuState, MenuEventType, MenuItemDescriptor } from './menu.types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Menu state machine.
|
|
4
|
+
*
|
|
5
|
+
* Transition table:
|
|
6
|
+
* closed + OPEN → open
|
|
7
|
+
* closed + TOGGLE → open
|
|
8
|
+
* open + CLOSE → closed
|
|
9
|
+
* open + TOGGLE → closed
|
|
10
|
+
* open + SELECT_ITEM → closed
|
|
11
|
+
* (all other events keep current state, context mutated via helpers)
|
|
12
|
+
*/
|
|
13
|
+
export declare const menuMachine: import("../../state/create-machine.js").MachineInstance<MenuState, MenuEventType, MenuContext>;
|
|
14
|
+
/** Handles navigation and search events, returning updated context fields. */
|
|
15
|
+
export declare function reduceMenuContext(ctx: MenuContext, event: MenuEventType, payload?: {
|
|
16
|
+
itemId?: string;
|
|
17
|
+
char?: string;
|
|
18
|
+
}): Partial<MenuContext>;
|
|
19
|
+
/** ARIA attributes for the menu trigger button. */
|
|
20
|
+
export declare function getMenuTriggerAriaProps(state: MenuState, ctx: MenuContext, menuId: string): Record<string, string | boolean>;
|
|
21
|
+
/** ARIA attributes for the menu container (ul element). */
|
|
22
|
+
export declare function getMenuAriaProps(ctx: MenuContext, menuId: string): Record<string, string>;
|
|
23
|
+
/** ARIA attributes for a single menu item. */
|
|
24
|
+
export declare function getMenuItemAriaProps(ctx: MenuContext, item: MenuItemDescriptor): Record<string, string | boolean | number>;
|
|
25
|
+
//# sourceMappingURL=menu.machine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu.machine.d.ts","sourceRoot":"","sources":["../../../src/primitives/menu/menu.machine.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEjG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,gGAqBtB,CAAC;AAaH,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,aAAa,EACpB,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,WAAW,CAAC,CAmEtB;AAED,mDAAmD;AACnD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAOlC;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,WAAW,EAChB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMxB;AAED,8CAA8C;AAC9C,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,kBAAkB,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAO3C"}
|