@vertz/ui-primitives 0.2.16 → 0.2.18

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 (117) hide show
  1. package/dist/shared/chunk-18y8gfk0.js +308 -0
  2. package/dist/shared/chunk-4085nbdq.js +196 -0
  3. package/dist/shared/chunk-4da5zksy.js +46 -0
  4. package/dist/shared/chunk-7ffg0caj.js +265 -0
  5. package/dist/shared/{chunk-w06tst6x.js → chunk-7kpsyjd7.js} +9 -5
  6. package/dist/shared/chunk-7krvqrwq.js +177 -0
  7. package/dist/shared/chunk-8ak7vdk1.js +151 -0
  8. package/dist/shared/chunk-8nk0ya7a.js +163 -0
  9. package/dist/shared/chunk-8tvzqry6.js +218 -0
  10. package/dist/shared/{chunk-qpfqyrc5.js → chunk-96d9nr7y.js} +1 -1
  11. package/dist/shared/chunk-9hj9p7s2.js +95 -0
  12. package/dist/shared/chunk-avxcmmk6.js +178 -0
  13. package/dist/shared/chunk-bew4bjgf.js +165 -0
  14. package/dist/shared/chunk-dpsgb1xw.js +18 -0
  15. package/dist/shared/chunk-g9qvd20g.js +133 -0
  16. package/dist/shared/chunk-gkddsbmh.js +73 -0
  17. package/dist/shared/chunk-gt0wth9h.js +128 -0
  18. package/dist/shared/chunk-hr9hx58m.js +71 -0
  19. package/dist/shared/{chunk-n92bvn5d.js → chunk-j4cm8avr.js} +85 -59
  20. package/dist/shared/chunk-jz0s6srh.js +161 -0
  21. package/dist/shared/chunk-kg27s15c.js +282 -0
  22. package/dist/shared/chunk-m1ptgp1s.js +142 -0
  23. package/dist/shared/{chunk-9cqe2q6e.js → chunk-n9nwx58j.js} +9 -5
  24. package/dist/shared/chunk-ppcv3ehd.js +85 -0
  25. package/dist/shared/{chunk-vq9tfzh8.js → chunk-rnjm61t0.js} +5 -1
  26. package/dist/shared/chunk-sqs8kyb2.js +288 -0
  27. package/dist/shared/chunk-tfyg0qrp.js +117 -0
  28. package/dist/shared/chunk-ttsyf6ma.js +239 -0
  29. package/dist/shared/chunk-x0we8gcy.js +219 -0
  30. package/dist/shared/{chunk-6pnjrst7.js → chunk-x2hz98qn.js} +2 -2
  31. package/dist/shared/chunk-yr9yzpvq.js +107 -0
  32. package/dist/src/accordion/accordion.d.ts +14 -2
  33. package/dist/src/accordion/accordion.js +2 -1
  34. package/dist/src/badge/badge.d.ts +13 -1
  35. package/dist/src/badge/badge.js +2 -1
  36. package/dist/src/button/button.d.ts +16 -14
  37. package/dist/src/button/button.js +2 -2
  38. package/dist/src/calendar/calendar.d.ts +14 -2
  39. package/dist/src/calendar/calendar.js +2 -1
  40. package/dist/src/carousel/carousel.d.ts +14 -2
  41. package/dist/src/carousel/carousel.js +2 -1
  42. package/dist/src/checkbox/checkbox.d.ts +15 -13
  43. package/dist/src/checkbox/checkbox.js +2 -2
  44. package/dist/src/collapsible/collapsible.d.ts +14 -2
  45. package/dist/src/collapsible/collapsible.js +2 -1
  46. package/dist/src/combobox/combobox.d.ts +14 -2
  47. package/dist/src/combobox/combobox.js +2 -1
  48. package/dist/src/command/command.d.ts +14 -2
  49. package/dist/src/command/command.js +2 -1
  50. package/dist/src/context-menu/context-menu.d.ts +14 -2
  51. package/dist/src/context-menu/context-menu.js +2 -1
  52. package/dist/src/date-picker/date-picker.js +4 -3
  53. package/dist/src/dialog/dialog.d.ts +14 -2
  54. package/dist/src/dialog/dialog.js +2 -1
  55. package/dist/src/dropdown-menu/dropdown-menu.d.ts +13 -1
  56. package/dist/src/dropdown-menu/dropdown-menu.js +3 -2
  57. package/dist/src/hover-card/hover-card.d.ts +14 -2
  58. package/dist/src/hover-card/hover-card.js +2 -1
  59. package/dist/src/index.d.ts +132 -140
  60. package/dist/src/index.js +31 -30
  61. package/dist/src/menu/menu.d.ts +14 -2
  62. package/dist/src/menu/menu.js +2 -1
  63. package/dist/src/menubar/menubar.d.ts +14 -2
  64. package/dist/src/menubar/menubar.js +2 -1
  65. package/dist/src/navigation-menu/navigation-menu.d.ts +14 -2
  66. package/dist/src/navigation-menu/navigation-menu.js +2 -1
  67. package/dist/src/popover/popover.d.ts +14 -2
  68. package/dist/src/popover/popover.js +2 -1
  69. package/dist/src/progress/progress.d.ts +14 -2
  70. package/dist/src/progress/progress.js +2 -1
  71. package/dist/src/radio/radio.d.ts +14 -2
  72. package/dist/src/radio/radio.js +2 -1
  73. package/dist/src/resizable-panel/resizable-panel.d.ts +14 -2
  74. package/dist/src/resizable-panel/resizable-panel.js +2 -1
  75. package/dist/src/scroll-area/scroll-area.d.ts +14 -2
  76. package/dist/src/scroll-area/scroll-area.js +2 -1
  77. package/dist/src/select/select.d.ts +14 -2
  78. package/dist/src/select/select.js +2 -1
  79. package/dist/src/slider/slider.d.ts +14 -2
  80. package/dist/src/slider/slider.js +2 -1
  81. package/dist/src/switch/switch.d.ts +13 -1
  82. package/dist/src/switch/switch.js +2 -1
  83. package/dist/src/tabs/tabs.d.ts +14 -2
  84. package/dist/src/tabs/tabs.js +2 -1
  85. package/dist/src/toast/toast.d.ts +14 -2
  86. package/dist/src/toast/toast.js +2 -1
  87. package/dist/src/toggle/toggle.d.ts +13 -1
  88. package/dist/src/toggle/toggle.js +2 -1
  89. package/dist/src/toggle-group/toggle-group.d.ts +14 -2
  90. package/dist/src/toggle-group/toggle-group.js +2 -1
  91. package/dist/src/tooltip/tooltip.d.ts +14 -2
  92. package/dist/src/tooltip/tooltip.js +2 -1
  93. package/package.json +3 -3
  94. package/dist/shared/chunk-2h5qpc00.js +0 -98
  95. package/dist/shared/chunk-31yptvbf.js +0 -151
  96. package/dist/shared/chunk-3pantb0p.js +0 -108
  97. package/dist/shared/chunk-3s6s6f06.js +0 -61
  98. package/dist/shared/chunk-48v8j0vh.js +0 -267
  99. package/dist/shared/chunk-6dmt4513.js +0 -78
  100. package/dist/shared/chunk-6sqwjfg8.js +0 -169
  101. package/dist/shared/chunk-8qfeqrrz.js +0 -179
  102. package/dist/shared/chunk-bcfzteh0.js +0 -148
  103. package/dist/shared/chunk-cr9sbwns.js +0 -235
  104. package/dist/shared/chunk-cvbf1js1.js +0 -52
  105. package/dist/shared/chunk-dkhst4wv.js +0 -97
  106. package/dist/shared/chunk-e3aj5yw4.js +0 -115
  107. package/dist/shared/chunk-fv1y77tn.js +0 -225
  108. package/dist/shared/chunk-h42bk324.js +0 -58
  109. package/dist/shared/chunk-h9m9x5my.js +0 -119
  110. package/dist/shared/chunk-qq0e0gym.js +0 -73
  111. package/dist/shared/chunk-tk1k1bet.js +0 -93
  112. package/dist/shared/chunk-tvpgeswh.js +0 -216
  113. package/dist/shared/chunk-vcp10kne.js +0 -175
  114. package/dist/shared/chunk-ve006hmy.js +0 -51
  115. package/dist/shared/chunk-vx1ajy2z.js +0 -115
  116. package/dist/shared/chunk-wnttq0gv.js +0 -49
  117. package/dist/shared/chunk-x6qzr3g6.js +0 -100
@@ -1,148 +0,0 @@
1
- import {
2
- Keys,
3
- isKey
4
- } from "./chunk-jctqs9m4.js";
5
- import {
6
- setDataState,
7
- setExpanded,
8
- setHidden,
9
- setHiddenAnimated,
10
- setSelected
11
- } from "./chunk-vvjyx7fe.js";
12
- import {
13
- linkedIds
14
- } from "./chunk-8y1jf6xr.js";
15
-
16
- // src/combobox/combobox.ts
17
- import { signal } from "@vertz/ui";
18
- var Combobox = {
19
- Root(options = {}) {
20
- const { defaultValue = "", onValueChange, onInputChange } = options;
21
- const ids = linkedIds("combobox");
22
- const state = {
23
- open: signal(false),
24
- value: signal(defaultValue),
25
- inputValue: signal(defaultValue),
26
- activeIndex: signal(-1)
27
- };
28
- const optionElements = [];
29
- const input = document.createElement("input");
30
- input.setAttribute("type", "text");
31
- input.setAttribute("role", "combobox");
32
- input.setAttribute("aria-autocomplete", "list");
33
- input.setAttribute("aria-controls", ids.contentId);
34
- input.setAttribute("aria-haspopup", "listbox");
35
- input.id = ids.triggerId;
36
- input.value = defaultValue;
37
- setExpanded(input, false);
38
- const listbox = document.createElement("div");
39
- listbox.setAttribute("role", "listbox");
40
- listbox.id = ids.contentId;
41
- setHidden(listbox, true);
42
- setDataState(listbox, "closed");
43
- function open() {
44
- state.open.value = true;
45
- setExpanded(input, true);
46
- setHidden(listbox, false);
47
- setDataState(listbox, "open");
48
- }
49
- function close() {
50
- state.open.value = false;
51
- state.activeIndex.value = -1;
52
- setExpanded(input, false);
53
- setDataState(listbox, "closed");
54
- setHiddenAnimated(listbox, true);
55
- updateActiveDescendant(-1);
56
- }
57
- function selectOption(value) {
58
- state.value.value = value;
59
- state.inputValue.value = value;
60
- input.value = value;
61
- for (const opt of optionElements) {
62
- const isActive = opt.getAttribute("data-value") === value;
63
- setSelected(opt, isActive);
64
- setDataState(opt, isActive ? "active" : "inactive");
65
- }
66
- onValueChange?.(value);
67
- close();
68
- input.focus();
69
- }
70
- function updateActiveDescendant(index) {
71
- const opt = optionElements[index];
72
- if (index >= 0 && opt) {
73
- input.setAttribute("aria-activedescendant", opt.id);
74
- for (let i = 0;i < optionElements.length; i++) {
75
- const el = optionElements[i];
76
- if (el)
77
- setDataState(el, i === index ? "active" : "inactive");
78
- }
79
- } else {
80
- input.removeAttribute("aria-activedescendant");
81
- }
82
- }
83
- input.addEventListener("input", () => {
84
- state.inputValue.value = input.value;
85
- onInputChange?.(input.value);
86
- if (!state.open.peek())
87
- open();
88
- });
89
- input.addEventListener("focus", () => {
90
- if (!state.open.peek() && input.value.length > 0)
91
- open();
92
- });
93
- input.addEventListener("keydown", (event) => {
94
- if (isKey(event, Keys.Escape)) {
95
- event.preventDefault();
96
- close();
97
- return;
98
- }
99
- if (isKey(event, Keys.ArrowDown)) {
100
- event.preventDefault();
101
- if (!state.open.peek()) {
102
- open();
103
- }
104
- const next = Math.min(state.activeIndex.peek() + 1, optionElements.length - 1);
105
- state.activeIndex.value = next;
106
- updateActiveDescendant(next);
107
- return;
108
- }
109
- if (isKey(event, Keys.ArrowUp)) {
110
- event.preventDefault();
111
- const prev = Math.max(state.activeIndex.peek() - 1, 0);
112
- state.activeIndex.value = prev;
113
- updateActiveDescendant(prev);
114
- return;
115
- }
116
- if (isKey(event, Keys.Enter)) {
117
- event.preventDefault();
118
- const idx = state.activeIndex.peek();
119
- if (idx >= 0 && idx < optionElements.length) {
120
- const val = optionElements[idx]?.getAttribute("data-value");
121
- if (val != null)
122
- selectOption(val);
123
- }
124
- return;
125
- }
126
- });
127
- function Option(value, label) {
128
- const opt = document.createElement("div");
129
- const optId = `${ids.contentId}-opt-${optionElements.length}`;
130
- opt.setAttribute("role", "option");
131
- opt.id = optId;
132
- opt.setAttribute("data-value", value);
133
- opt.textContent = label ?? value;
134
- const isSelected = value === defaultValue;
135
- setSelected(opt, isSelected);
136
- setDataState(opt, isSelected ? "active" : "inactive");
137
- opt.addEventListener("click", () => {
138
- selectOption(value);
139
- });
140
- optionElements.push(opt);
141
- listbox.appendChild(opt);
142
- return opt;
143
- }
144
- return { input, listbox, state, Option };
145
- }
146
- };
147
-
148
- export { Combobox };
@@ -1,235 +0,0 @@
1
- import {
2
- createDismiss
3
- } from "./chunk-a6wp8c32.js";
4
- import {
5
- setRovingTabindex
6
- } from "./chunk-e2v1c9ex.js";
7
- import {
8
- createFloatingPosition
9
- } from "./chunk-0mcr52hc.js";
10
- import {
11
- Keys,
12
- handleListNavigation,
13
- isKey
14
- } from "./chunk-jctqs9m4.js";
15
- import {
16
- setDataState,
17
- setExpanded,
18
- setHidden,
19
- setHiddenAnimated
20
- } from "./chunk-vvjyx7fe.js";
21
- import {
22
- linkedIds
23
- } from "./chunk-8y1jf6xr.js";
24
-
25
- // src/menubar/menubar.ts
26
- import { signal } from "@vertz/ui";
27
- var Menubar = {
28
- Root(options = {}) {
29
- const { onSelect, positioning } = options;
30
- const state = { activeMenu: signal(null) };
31
- const triggers = [];
32
- const menus = new Map;
33
- let floatingCleanup = null;
34
- let dismissCleanup = null;
35
- const root = document.createElement("div");
36
- root.setAttribute("role", "menubar");
37
- function closeAll() {
38
- for (const [, menu] of menus) {
39
- setExpanded(menu.trigger, false);
40
- setDataState(menu.trigger, "closed");
41
- setDataState(menu.content, "closed");
42
- setHiddenAnimated(menu.content, true);
43
- }
44
- state.activeMenu.value = null;
45
- if (positioning) {
46
- floatingCleanup?.();
47
- floatingCleanup = null;
48
- dismissCleanup?.();
49
- dismissCleanup = null;
50
- } else {
51
- document.removeEventListener("mousedown", handleClickOutside);
52
- }
53
- }
54
- function openMenu(value) {
55
- const current = state.activeMenu.peek();
56
- if (current && current !== value) {
57
- const prev = menus.get(current);
58
- if (prev) {
59
- setExpanded(prev.trigger, false);
60
- setDataState(prev.trigger, "closed");
61
- setDataState(prev.content, "closed");
62
- setHiddenAnimated(prev.content, true);
63
- }
64
- if (positioning) {
65
- floatingCleanup?.();
66
- floatingCleanup = null;
67
- }
68
- }
69
- const menu = menus.get(value);
70
- if (!menu)
71
- return;
72
- state.activeMenu.value = value;
73
- setExpanded(menu.trigger, true);
74
- setHidden(menu.content, false);
75
- setDataState(menu.trigger, "open");
76
- setDataState(menu.content, "open");
77
- if (positioning) {
78
- const result = createFloatingPosition(menu.trigger, menu.content, positioning);
79
- floatingCleanup = result.cleanup;
80
- if (!dismissCleanup) {
81
- dismissCleanup = createDismiss({
82
- onDismiss: closeAll,
83
- insideElements: [root],
84
- escapeKey: false
85
- });
86
- }
87
- } else {
88
- document.addEventListener("mousedown", handleClickOutside);
89
- }
90
- const firstItem = menu.items[0];
91
- if (firstItem) {
92
- firstItem.setAttribute("tabindex", "0");
93
- firstItem.focus();
94
- }
95
- }
96
- function handleClickOutside(event) {
97
- const target = event.target;
98
- if (!root.contains(target)) {
99
- closeAll();
100
- }
101
- }
102
- root.addEventListener("keydown", (event) => {
103
- if (isKey(event, Keys.ArrowLeft, Keys.ArrowRight, Keys.Home, Keys.End)) {
104
- const focused = document.activeElement;
105
- const triggerIndex = triggers.indexOf(focused);
106
- if (triggerIndex >= 0) {
107
- const result = handleListNavigation(event, triggers, { orientation: "horizontal" });
108
- if (result && state.activeMenu.peek()) {
109
- const newTrigger = result;
110
- const menuValue = newTrigger.getAttribute("data-value");
111
- if (menuValue)
112
- openMenu(menuValue);
113
- }
114
- }
115
- }
116
- });
117
- function Menu(value, label) {
118
- const ids = linkedIds("menubar-menu");
119
- const items = [];
120
- const trigger = document.createElement("button");
121
- trigger.setAttribute("type", "button");
122
- trigger.setAttribute("role", "menuitem");
123
- trigger.id = ids.triggerId;
124
- trigger.setAttribute("aria-controls", ids.contentId);
125
- trigger.setAttribute("aria-haspopup", "menu");
126
- trigger.setAttribute("data-value", value);
127
- trigger.textContent = label ?? value;
128
- setExpanded(trigger, false);
129
- setDataState(trigger, "closed");
130
- setRovingTabindex(triggers.concat(trigger), triggers.length);
131
- const content = document.createElement("div");
132
- content.setAttribute("role", "menu");
133
- content.id = ids.contentId;
134
- setHidden(content, true);
135
- setDataState(content, "closed");
136
- trigger.addEventListener("click", () => {
137
- if (state.activeMenu.peek() === value) {
138
- closeAll();
139
- } else {
140
- openMenu(value);
141
- }
142
- });
143
- trigger.addEventListener("keydown", (event) => {
144
- if (isKey(event, Keys.ArrowDown, Keys.Enter, Keys.Space)) {
145
- event.preventDefault();
146
- openMenu(value);
147
- }
148
- });
149
- content.addEventListener("keydown", (event) => {
150
- if (isKey(event, Keys.Escape)) {
151
- event.preventDefault();
152
- event.stopPropagation();
153
- closeAll();
154
- trigger.focus();
155
- return;
156
- }
157
- if (isKey(event, Keys.Enter, Keys.Space)) {
158
- event.preventDefault();
159
- const active = document.activeElement;
160
- const activeItem = items.find((item) => item === active);
161
- if (activeItem) {
162
- const val = activeItem.getAttribute("data-value");
163
- if (val !== null) {
164
- onSelect?.(val);
165
- closeAll();
166
- trigger.focus();
167
- }
168
- }
169
- return;
170
- }
171
- if (isKey(event, Keys.ArrowLeft, Keys.ArrowRight)) {
172
- event.preventDefault();
173
- const triggerIdx = triggers.indexOf(trigger);
174
- let nextIdx;
175
- if (isKey(event, Keys.ArrowRight)) {
176
- nextIdx = (triggerIdx + 1) % triggers.length;
177
- } else {
178
- nextIdx = (triggerIdx - 1 + triggers.length) % triggers.length;
179
- }
180
- const nextTrigger = triggers[nextIdx];
181
- if (nextTrigger) {
182
- nextTrigger.focus();
183
- const nextValue = nextTrigger.getAttribute("data-value");
184
- if (nextValue)
185
- openMenu(nextValue);
186
- }
187
- return;
188
- }
189
- handleListNavigation(event, items, { orientation: "vertical" });
190
- });
191
- function createItem(val, itemLabel, parent) {
192
- const item = document.createElement("div");
193
- item.setAttribute("role", "menuitem");
194
- item.setAttribute("data-value", val);
195
- item.setAttribute("tabindex", "-1");
196
- item.textContent = itemLabel ?? val;
197
- item.addEventListener("click", () => {
198
- onSelect?.(val);
199
- closeAll();
200
- trigger.focus();
201
- });
202
- items.push(item);
203
- (parent ?? content).appendChild(item);
204
- return item;
205
- }
206
- function Item(val, itemLabel) {
207
- return createItem(val, itemLabel);
208
- }
209
- function Group(groupLabel) {
210
- const el = document.createElement("div");
211
- el.setAttribute("role", "group");
212
- el.setAttribute("aria-label", groupLabel);
213
- content.appendChild(el);
214
- return {
215
- el,
216
- Item: (val, l) => createItem(val, l, el)
217
- };
218
- }
219
- function Separator() {
220
- const hr = document.createElement("hr");
221
- hr.setAttribute("role", "separator");
222
- content.appendChild(hr);
223
- return hr;
224
- }
225
- triggers.push(trigger);
226
- setRovingTabindex(triggers, 0);
227
- menus.set(value, { trigger, content, items });
228
- root.appendChild(trigger);
229
- return { trigger, content, Item, Group, Separator };
230
- }
231
- return { root, state, Menu };
232
- }
233
- };
234
-
235
- export { Menubar };
@@ -1,52 +0,0 @@
1
- import {
2
- setDataState
3
- } from "./chunk-vvjyx7fe.js";
4
- import {
5
- uniqueId
6
- } from "./chunk-8y1jf6xr.js";
7
-
8
- // src/toast/toast.ts
9
- import { signal } from "@vertz/ui";
10
- var Toast = {
11
- Root(options = {}) {
12
- const { duration = 5000, politeness = "polite" } = options;
13
- const state = { messages: signal([]) };
14
- const region = document.createElement("div");
15
- region.setAttribute("role", "status");
16
- region.setAttribute("aria-live", politeness);
17
- region.setAttribute("aria-atomic", "false");
18
- setDataState(region, "empty");
19
- function announce(content) {
20
- const id = uniqueId("toast");
21
- const el = document.createElement("div");
22
- el.setAttribute("role", "status");
23
- el.setAttribute("data-toast-id", id);
24
- el.textContent = content;
25
- setDataState(el, "open");
26
- const msg = { id, content, el };
27
- const messages = [...state.messages.peek(), msg];
28
- state.messages.value = messages;
29
- region.appendChild(el);
30
- setDataState(region, "active");
31
- if (duration > 0) {
32
- setTimeout(() => dismiss(id), duration);
33
- }
34
- return msg;
35
- }
36
- function dismiss(id) {
37
- const messages = state.messages.peek().filter((m) => m.id !== id);
38
- state.messages.value = messages;
39
- const el = region.querySelector(`[data-toast-id="${id}"]`);
40
- if (el) {
41
- setDataState(el, "closed");
42
- el.remove();
43
- }
44
- if (messages.length === 0) {
45
- setDataState(region, "empty");
46
- }
47
- }
48
- return { region, state, announce, dismiss };
49
- }
50
- };
51
-
52
- export { Toast };
@@ -1,97 +0,0 @@
1
- import {
2
- createDismiss
3
- } from "./chunk-a6wp8c32.js";
4
- import {
5
- focusFirst,
6
- saveFocus
7
- } from "./chunk-e2v1c9ex.js";
8
- import {
9
- createFloatingPosition
10
- } from "./chunk-0mcr52hc.js";
11
- import {
12
- Keys,
13
- isKey
14
- } from "./chunk-jctqs9m4.js";
15
- import {
16
- setDataState,
17
- setExpanded,
18
- setHidden,
19
- setHiddenAnimated
20
- } from "./chunk-vvjyx7fe.js";
21
- import {
22
- linkedIds
23
- } from "./chunk-8y1jf6xr.js";
24
-
25
- // src/popover/popover.ts
26
- import { signal } from "@vertz/ui";
27
- var Popover = {
28
- Root(options = {}) {
29
- const { defaultOpen = false, onOpenChange, positioning } = options;
30
- const ids = linkedIds("popover");
31
- const state = { open: signal(defaultOpen) };
32
- let restoreFocus = null;
33
- let floatingCleanup = null;
34
- let dismissCleanup = null;
35
- const trigger = document.createElement("button");
36
- trigger.setAttribute("type", "button");
37
- trigger.id = ids.triggerId;
38
- trigger.setAttribute("aria-controls", ids.contentId);
39
- trigger.setAttribute("aria-haspopup", "dialog");
40
- setExpanded(trigger, defaultOpen);
41
- setDataState(trigger, defaultOpen ? "open" : "closed");
42
- const content = document.createElement("div");
43
- content.setAttribute("role", "dialog");
44
- content.id = ids.contentId;
45
- setHidden(content, !defaultOpen);
46
- setDataState(content, defaultOpen ? "open" : "closed");
47
- function open() {
48
- state.open.value = true;
49
- setExpanded(trigger, true);
50
- setHidden(content, false);
51
- setDataState(trigger, "open");
52
- setDataState(content, "open");
53
- restoreFocus = saveFocus();
54
- queueMicrotask(() => focusFirst(content));
55
- if (positioning) {
56
- const result = createFloatingPosition(trigger, content, positioning);
57
- floatingCleanup = result.cleanup;
58
- dismissCleanup = createDismiss({
59
- onDismiss: close,
60
- insideElements: [trigger, content],
61
- escapeKey: false
62
- });
63
- }
64
- onOpenChange?.(true);
65
- }
66
- function close() {
67
- state.open.value = false;
68
- setExpanded(trigger, false);
69
- setDataState(trigger, "closed");
70
- setDataState(content, "closed");
71
- setHiddenAnimated(content, true);
72
- floatingCleanup?.();
73
- floatingCleanup = null;
74
- dismissCleanup?.();
75
- dismissCleanup = null;
76
- restoreFocus?.();
77
- restoreFocus = null;
78
- onOpenChange?.(false);
79
- }
80
- trigger.addEventListener("click", () => {
81
- if (state.open.peek()) {
82
- close();
83
- } else {
84
- open();
85
- }
86
- });
87
- content.addEventListener("keydown", (event) => {
88
- if (isKey(event, Keys.Escape)) {
89
- event.preventDefault();
90
- close();
91
- }
92
- });
93
- return { trigger, content, state };
94
- }
95
- };
96
-
97
- export { Popover };
@@ -1,115 +0,0 @@
1
- import {
2
- Keys,
3
- handleListNavigation,
4
- isKey
5
- } from "./chunk-jctqs9m4.js";
6
- import {
7
- setDataState,
8
- setExpanded,
9
- setHidden,
10
- setHiddenAnimated
11
- } from "./chunk-vvjyx7fe.js";
12
- import {
13
- uniqueId
14
- } from "./chunk-8y1jf6xr.js";
15
-
16
- // src/accordion/accordion.ts
17
- import { signal } from "@vertz/ui";
18
- var Accordion = {
19
- Root(options = {}) {
20
- const { multiple = false, defaultValue = [], onValueChange } = options;
21
- const state = { value: signal([...defaultValue]) };
22
- const triggers = [];
23
- const itemMap = new Map;
24
- const root = document.createElement("div");
25
- root.setAttribute("data-orientation", "vertical");
26
- function updateItemState(val, open) {
27
- const entry = itemMap.get(val);
28
- if (!entry)
29
- return;
30
- const { trigger: t, content: c } = entry;
31
- if (open) {
32
- setHidden(c, false);
33
- }
34
- const height = c.scrollHeight;
35
- c.style.setProperty("--accordion-content-height", `${height}px`);
36
- setExpanded(t, open);
37
- setDataState(t, open ? "open" : "closed");
38
- setDataState(c, open ? "open" : "closed");
39
- if (!open) {
40
- setHiddenAnimated(c, true);
41
- }
42
- }
43
- function toggleItem(value) {
44
- const prev = [...state.value.peek()];
45
- const current = [...prev];
46
- const idx = current.indexOf(value);
47
- if (idx >= 0) {
48
- current.splice(idx, 1);
49
- } else {
50
- if (multiple) {
51
- current.push(value);
52
- } else {
53
- current.length = 0;
54
- current.push(value);
55
- }
56
- }
57
- state.value.value = current;
58
- onValueChange?.(current);
59
- for (const v of prev) {
60
- if (!current.includes(v)) {
61
- updateItemState(v, false);
62
- }
63
- }
64
- for (const v of current) {
65
- if (!prev.includes(v)) {
66
- updateItemState(v, true);
67
- }
68
- }
69
- }
70
- root.addEventListener("keydown", (event) => {
71
- if (isKey(event, Keys.ArrowUp, Keys.ArrowDown, Keys.Home, Keys.End)) {
72
- handleListNavigation(event, triggers, { orientation: "vertical" });
73
- }
74
- });
75
- function Item(value) {
76
- const baseId = uniqueId("accordion");
77
- const triggerId = `${baseId}-trigger`;
78
- const contentId = `${baseId}-content`;
79
- const isOpen = state.value.peek().includes(value);
80
- const item = document.createElement("div");
81
- item.setAttribute("data-value", value);
82
- const trigger = document.createElement("button");
83
- trigger.setAttribute("type", "button");
84
- trigger.id = triggerId;
85
- trigger.setAttribute("aria-controls", contentId);
86
- trigger.setAttribute("data-value", value);
87
- setExpanded(trigger, isOpen);
88
- setDataState(trigger, isOpen ? "open" : "closed");
89
- const content = document.createElement("div");
90
- content.setAttribute("role", "region");
91
- content.id = contentId;
92
- content.setAttribute("aria-labelledby", triggerId);
93
- setHidden(content, !isOpen);
94
- setDataState(content, isOpen ? "open" : "closed");
95
- trigger.addEventListener("click", () => {
96
- toggleItem(value);
97
- });
98
- itemMap.set(value, { trigger, content });
99
- triggers.push(trigger);
100
- item.appendChild(trigger);
101
- item.appendChild(content);
102
- root.appendChild(item);
103
- if (isOpen) {
104
- requestAnimationFrame(() => {
105
- const height = content.scrollHeight;
106
- content.style.setProperty("--accordion-content-height", `${height}px`);
107
- });
108
- }
109
- return { item, trigger, content };
110
- }
111
- return { root, state, Item };
112
- }
113
- };
114
-
115
- export { Accordion };