@vertz/ui-primitives 0.2.15 → 0.2.17

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 (109) hide show
  1. package/dist/shared/chunk-0mcr52hc.js +78 -0
  2. package/dist/shared/chunk-18y8gfk0.js +308 -0
  3. package/dist/shared/chunk-34yfm2b0.js +182 -0
  4. package/dist/shared/chunk-4085nbdq.js +196 -0
  5. package/dist/shared/chunk-4da5zksy.js +46 -0
  6. package/dist/shared/chunk-7ffg0caj.js +265 -0
  7. package/dist/shared/chunk-7kpsyjd7.js +61 -0
  8. package/dist/shared/chunk-7krvqrwq.js +177 -0
  9. package/dist/shared/chunk-8ak7vdk1.js +151 -0
  10. package/dist/shared/chunk-8nk0ya7a.js +163 -0
  11. package/dist/shared/chunk-8tvzqry6.js +218 -0
  12. package/dist/shared/chunk-8y1jf6xr.js +17 -0
  13. package/dist/shared/chunk-96d9nr7y.js +19 -0
  14. package/dist/shared/chunk-9hj9p7s2.js +95 -0
  15. package/dist/shared/chunk-a6wp8c32.js +32 -0
  16. package/dist/shared/chunk-avxcmmk6.js +178 -0
  17. package/dist/shared/chunk-bew4bjgf.js +165 -0
  18. package/dist/shared/chunk-dpsgb1xw.js +18 -0
  19. package/dist/shared/chunk-e2v1c9ex.js +62 -0
  20. package/dist/shared/chunk-g9qvd20g.js +133 -0
  21. package/dist/shared/chunk-gkddsbmh.js +73 -0
  22. package/dist/shared/chunk-gt0wth9h.js +128 -0
  23. package/dist/shared/chunk-hr9hx58m.js +71 -0
  24. package/dist/shared/chunk-j4cm8avr.js +175 -0
  25. package/dist/shared/chunk-jctqs9m4.js +60 -0
  26. package/dist/shared/chunk-jz0s6srh.js +161 -0
  27. package/dist/shared/chunk-kg27s15c.js +282 -0
  28. package/dist/shared/chunk-m1ptgp1s.js +142 -0
  29. package/dist/shared/chunk-n9nwx58j.js +60 -0
  30. package/dist/shared/chunk-ppcv3ehd.js +85 -0
  31. package/dist/shared/chunk-rnjm61t0.js +34 -0
  32. package/dist/shared/chunk-sqs8kyb2.js +288 -0
  33. package/dist/shared/chunk-t1vkvsz2.js +175 -0
  34. package/dist/shared/chunk-tfyg0qrp.js +117 -0
  35. package/dist/shared/chunk-ttsyf6ma.js +239 -0
  36. package/dist/shared/chunk-vvjyx7fe.js +62 -0
  37. package/dist/shared/chunk-x0we8gcy.js +219 -0
  38. package/dist/shared/chunk-x2hz98qn.js +108 -0
  39. package/dist/shared/chunk-yr9yzpvq.js +107 -0
  40. package/dist/src/accordion/accordion.d.ts +35 -0
  41. package/dist/src/accordion/accordion.js +10 -0
  42. package/dist/src/alert-dialog/alert-dialog.d.ts +26 -0
  43. package/dist/src/alert-dialog/alert-dialog.js +9 -0
  44. package/dist/src/badge/badge.d.ts +22 -0
  45. package/dist/src/badge/badge.js +8 -0
  46. package/dist/src/button/button.d.ts +20 -0
  47. package/dist/src/button/button.js +8 -0
  48. package/dist/src/calendar/calendar.d.ts +52 -0
  49. package/dist/src/calendar/calendar.js +7 -0
  50. package/dist/src/carousel/carousel.d.ts +39 -0
  51. package/dist/src/carousel/carousel.js +9 -0
  52. package/dist/src/checkbox/checkbox.d.ts +22 -0
  53. package/dist/src/checkbox/checkbox.js +9 -0
  54. package/dist/src/collapsible/collapsible.d.ts +33 -0
  55. package/dist/src/collapsible/collapsible.js +9 -0
  56. package/dist/src/combobox/combobox.d.ts +35 -0
  57. package/dist/src/combobox/combobox.js +10 -0
  58. package/dist/src/command/command.d.ts +41 -0
  59. package/dist/src/command/command.js +10 -0
  60. package/dist/src/context-menu/context-menu.d.ts +51 -0
  61. package/dist/src/context-menu/context-menu.js +12 -0
  62. package/dist/src/date-picker/date-picker.d.ts +47 -0
  63. package/dist/src/date-picker/date-picker.js +15 -0
  64. package/dist/src/dialog/dialog.d.ts +36 -0
  65. package/dist/src/dialog/dialog.js +11 -0
  66. package/dist/src/dropdown-menu/dropdown-menu.d.ts +54 -0
  67. package/dist/src/dropdown-menu/dropdown-menu.js +13 -0
  68. package/dist/src/hover-card/hover-card.d.ts +45 -0
  69. package/dist/src/hover-card/hover-card.js +11 -0
  70. package/dist/{index.d.ts → src/index.d.ts} +132 -140
  71. package/dist/src/index.js +137 -0
  72. package/dist/src/menu/menu.d.ts +51 -0
  73. package/dist/src/menu/menu.js +12 -0
  74. package/dist/src/menubar/menubar.d.ts +52 -0
  75. package/dist/src/menubar/menubar.js +13 -0
  76. package/dist/src/navigation-menu/navigation-menu.d.ts +37 -0
  77. package/dist/src/navigation-menu/navigation-menu.js +11 -0
  78. package/dist/src/popover/popover.d.ts +44 -0
  79. package/dist/src/popover/popover.js +13 -0
  80. package/dist/src/progress/progress.d.ts +32 -0
  81. package/dist/src/progress/progress.js +9 -0
  82. package/dist/src/radio/radio.d.ts +30 -0
  83. package/dist/src/radio/radio.js +11 -0
  84. package/dist/src/resizable-panel/resizable-panel.d.ts +36 -0
  85. package/dist/src/resizable-panel/resizable-panel.js +9 -0
  86. package/dist/src/scroll-area/scroll-area.d.ts +37 -0
  87. package/dist/src/scroll-area/scroll-area.js +7 -0
  88. package/dist/src/select/select.d.ts +53 -0
  89. package/dist/src/select/select.js +12 -0
  90. package/dist/src/sheet/sheet.d.ts +24 -0
  91. package/dist/src/sheet/sheet.js +10 -0
  92. package/dist/src/slider/slider.d.ts +36 -0
  93. package/dist/src/slider/slider.js +10 -0
  94. package/dist/src/switch/switch.d.ts +21 -0
  95. package/dist/src/switch/switch.js +9 -0
  96. package/dist/src/tabs/tabs.d.ts +35 -0
  97. package/dist/src/tabs/tabs.js +11 -0
  98. package/dist/src/toast/toast.d.ts +36 -0
  99. package/dist/src/toast/toast.js +9 -0
  100. package/dist/src/toggle/toggle.d.ts +21 -0
  101. package/dist/src/toggle/toggle.js +9 -0
  102. package/dist/src/toggle-group/toggle-group.d.ts +34 -0
  103. package/dist/src/toggle-group/toggle-group.js +10 -0
  104. package/dist/src/tooltip/tooltip.d.ts +44 -0
  105. package/dist/src/tooltip/tooltip.js +11 -0
  106. package/dist/src/utils.d.ts +176 -0
  107. package/dist/src/utils.js +72 -0
  108. package/package.json +12 -10
  109. package/dist/index.js +0 -3675
@@ -0,0 +1,239 @@
1
+ import {
2
+ Keys,
3
+ isKey
4
+ } from "./chunk-jctqs9m4.js";
5
+ import {
6
+ setHidden
7
+ } from "./chunk-vvjyx7fe.js";
8
+ import {
9
+ applyAttrs
10
+ } from "./chunk-dpsgb1xw.js";
11
+ import {
12
+ uniqueId
13
+ } from "./chunk-8y1jf6xr.js";
14
+
15
+ // src/command/command.tsx
16
+ import { __element, __enterChildren, __exitChildren, __insert, __on } from "@vertz/ui/internals";
17
+ import { signal } from "@vertz/ui";
18
+ function CommandRoot(options = {}) {
19
+ const { filter: customFilter, onSelect, onInputChange, placeholder, ...attrs } = options;
20
+ const listId = uniqueId("command-list");
21
+ const state = {
22
+ inputValue: signal(""),
23
+ activeIndex: signal(0)
24
+ };
25
+ const allItems = [];
26
+ const groups = new Map;
27
+ const defaultFilter = (value, search) => {
28
+ return value.toLowerCase().includes(search.toLowerCase());
29
+ };
30
+ const filterFn = customFilter ?? defaultFilter;
31
+ function getVisibleItems() {
32
+ return allItems.filter((item) => item.getAttribute("aria-hidden") !== "true");
33
+ }
34
+ function updateActiveItem() {
35
+ const visible = getVisibleItems();
36
+ const activeIdx = state.activeIndex.peek();
37
+ for (const item of allItems) {
38
+ item.setAttribute("aria-selected", "false");
39
+ }
40
+ if (visible.length > 0 && activeIdx >= 0 && activeIdx < visible.length) {
41
+ visible[activeIdx]?.setAttribute("aria-selected", "true");
42
+ }
43
+ }
44
+ function runFilter() {
45
+ const search = state.inputValue.peek();
46
+ let visibleCount = 0;
47
+ for (const item of allItems) {
48
+ const value = item.getAttribute("data-value") ?? "";
49
+ const text = item.textContent ?? "";
50
+ const keywords = item.getAttribute("data-keywords") ?? "";
51
+ const searchable = `${value} ${text} ${keywords}`;
52
+ const matches = search === "" || filterFn(searchable, search);
53
+ setHidden(item, !matches);
54
+ if (matches)
55
+ visibleCount++;
56
+ }
57
+ for (const [groupEl, group] of groups) {
58
+ const hasVisible = group.items.some((item) => item.getAttribute("aria-hidden") !== "true");
59
+ setHidden(group.heading, !hasVisible);
60
+ if (!hasVisible) {
61
+ groupEl.style.display = "none";
62
+ } else {
63
+ groupEl.style.display = "";
64
+ }
65
+ }
66
+ setHidden(empty, visibleCount > 0);
67
+ state.activeIndex.value = 0;
68
+ updateActiveItem();
69
+ }
70
+ const input = (() => {
71
+ const __el0 = __element("input");
72
+ __el0.setAttribute("type", "text");
73
+ __el0.setAttribute("role", "combobox");
74
+ __el0.setAttribute("aria-autocomplete", "list");
75
+ __el0.setAttribute("aria-expanded", "true");
76
+ {
77
+ const __v = listId;
78
+ if (__v != null && __v !== false)
79
+ __el0.setAttribute("aria-controls", __v === true ? "" : __v);
80
+ }
81
+ {
82
+ const __v = placeholder;
83
+ if (__v != null && __v !== false)
84
+ __el0.setAttribute("placeholder", __v === true ? "" : __v);
85
+ }
86
+ __on(__el0, "input", () => {
87
+ state.inputValue.value = input.value;
88
+ onInputChange?.(input.value);
89
+ runFilter();
90
+ });
91
+ __on(__el0, "keydown", (event) => {
92
+ const visible = getVisibleItems();
93
+ if (isKey(event, Keys.ArrowDown)) {
94
+ event.preventDefault();
95
+ const next = Math.min(state.activeIndex.peek() + 1, visible.length - 1);
96
+ state.activeIndex.value = next;
97
+ updateActiveItem();
98
+ return;
99
+ }
100
+ if (isKey(event, Keys.ArrowUp)) {
101
+ event.preventDefault();
102
+ const prev = Math.max(state.activeIndex.peek() - 1, 0);
103
+ state.activeIndex.value = prev;
104
+ updateActiveItem();
105
+ return;
106
+ }
107
+ if (isKey(event, Keys.Enter)) {
108
+ event.preventDefault();
109
+ const active = visible[state.activeIndex.peek()];
110
+ if (active) {
111
+ const val = active.getAttribute("data-value");
112
+ if (val !== null) {
113
+ onSelect?.(val);
114
+ }
115
+ }
116
+ return;
117
+ }
118
+ if (isKey(event, Keys.Escape)) {
119
+ event.preventDefault();
120
+ input.value = "";
121
+ state.inputValue.value = "";
122
+ onInputChange?.("");
123
+ runFilter();
124
+ }
125
+ });
126
+ return __el0;
127
+ })();
128
+ const list = (() => {
129
+ const __el1 = __element("div");
130
+ __el1.setAttribute("role", "listbox");
131
+ {
132
+ const __v = listId;
133
+ if (__v != null && __v !== false)
134
+ __el1.setAttribute("id", __v === true ? "" : __v);
135
+ }
136
+ return __el1;
137
+ })();
138
+ const empty = (() => {
139
+ const __el2 = __element("div");
140
+ __el2.setAttribute("aria-hidden", "true");
141
+ __el2.setAttribute("style", "display: none");
142
+ return __el2;
143
+ })();
144
+ const root = (() => {
145
+ const __el3 = __element("div");
146
+ __enterChildren(__el3);
147
+ __insert(__el3, input);
148
+ __insert(__el3, list);
149
+ __insert(__el3, empty);
150
+ __exitChildren();
151
+ return __el3;
152
+ })();
153
+ applyAttrs(root, attrs);
154
+ function createItem(value, label, keywords, parent) {
155
+ const item = (() => {
156
+ const __el4 = __element("div");
157
+ __el4.setAttribute("role", "option");
158
+ {
159
+ const __v = value;
160
+ if (__v != null && __v !== false)
161
+ __el4.setAttribute("data-value", __v === true ? "" : __v);
162
+ }
163
+ __el4.setAttribute("aria-selected", "false");
164
+ {
165
+ const __v = keywords && keywords.length > 0 ? keywords.join(" ") : undefined;
166
+ if (__v != null && __v !== false)
167
+ __el4.setAttribute("data-keywords", __v === true ? "" : __v);
168
+ }
169
+ __on(__el4, "click", () => {
170
+ onSelect?.(value);
171
+ });
172
+ __enterChildren(__el4);
173
+ __insert(__el4, label ?? value);
174
+ __exitChildren();
175
+ return __el4;
176
+ })();
177
+ allItems.push(item);
178
+ (parent ?? list).appendChild(item);
179
+ updateActiveItem();
180
+ return item;
181
+ }
182
+ function Item(value, label, keywords) {
183
+ return createItem(value, label, keywords);
184
+ }
185
+ function Group(label) {
186
+ const headingId = uniqueId("command-group");
187
+ const heading = (() => {
188
+ const __el5 = __element("div");
189
+ {
190
+ const __v = headingId;
191
+ if (__v != null && __v !== false)
192
+ __el5.setAttribute("id", __v === true ? "" : __v);
193
+ }
194
+ __enterChildren(__el5);
195
+ __insert(__el5, label);
196
+ __exitChildren();
197
+ return __el5;
198
+ })();
199
+ const el = (() => {
200
+ const __el6 = __element("div");
201
+ __el6.setAttribute("role", "group");
202
+ {
203
+ const __v = headingId;
204
+ if (__v != null && __v !== false)
205
+ __el6.setAttribute("aria-labelledby", __v === true ? "" : __v);
206
+ }
207
+ __enterChildren(__el6);
208
+ __insert(__el6, heading);
209
+ __exitChildren();
210
+ return __el6;
211
+ })();
212
+ const groupItems = [];
213
+ groups.set(el, { heading, items: groupItems });
214
+ list.appendChild(el);
215
+ return {
216
+ el,
217
+ Item: (value, itemLabel, keywords) => {
218
+ const item = createItem(value, itemLabel, keywords, el);
219
+ groupItems.push(item);
220
+ return item;
221
+ }
222
+ };
223
+ }
224
+ function Separator() {
225
+ const hr = (() => {
226
+ const __el7 = __element("hr");
227
+ __el7.setAttribute("role", "separator");
228
+ return __el7;
229
+ })();
230
+ list.appendChild(hr);
231
+ return hr;
232
+ }
233
+ return { root, input, list, empty, state, Item, Group, Separator };
234
+ }
235
+ var Command = {
236
+ Root: CommandRoot
237
+ };
238
+
239
+ export { Command };
@@ -0,0 +1,62 @@
1
+ // src/utils/aria.ts
2
+ import { onAnimationsComplete } from "@vertz/ui/internals";
3
+ var hideGeneration = new WeakMap;
4
+ function setExpanded(el, expanded) {
5
+ el.setAttribute("aria-expanded", String(expanded));
6
+ }
7
+ function toggleExpanded(el) {
8
+ const current = el.getAttribute("aria-expanded") === "true";
9
+ const next = !current;
10
+ setExpanded(el, next);
11
+ return next;
12
+ }
13
+ function setSelected(el, selected) {
14
+ el.setAttribute("aria-selected", String(selected));
15
+ }
16
+ function setHidden(el, hidden) {
17
+ el.setAttribute("aria-hidden", String(hidden));
18
+ el.style.display = hidden ? "none" : "";
19
+ }
20
+ function setHiddenAnimated(el, hidden) {
21
+ const gen = (hideGeneration.get(el) ?? 0) + 1;
22
+ hideGeneration.set(el, gen);
23
+ if (!hidden) {
24
+ el.setAttribute("aria-hidden", "false");
25
+ el.style.display = "";
26
+ return;
27
+ }
28
+ el.setAttribute("aria-hidden", "true");
29
+ onAnimationsComplete(el, () => {
30
+ if (hideGeneration.get(el) === gen) {
31
+ el.style.display = "none";
32
+ }
33
+ });
34
+ }
35
+ function setChecked(el, checked) {
36
+ el.setAttribute("aria-checked", String(checked));
37
+ }
38
+ function setDisabled(el, disabled) {
39
+ el.setAttribute("aria-disabled", String(disabled));
40
+ }
41
+ function setDataState(el, state) {
42
+ el.setAttribute("data-state", state);
43
+ }
44
+ function setControls(trigger, contentId) {
45
+ trigger.setAttribute("aria-controls", contentId);
46
+ }
47
+ function setLabelledBy(el, labelId) {
48
+ el.setAttribute("aria-labelledby", labelId);
49
+ }
50
+ function setDescribedBy(el, descriptionId) {
51
+ el.setAttribute("aria-describedby", descriptionId);
52
+ }
53
+ function setPressed(el, pressed) {
54
+ el.setAttribute("aria-pressed", String(pressed));
55
+ }
56
+ function setValueRange(el, now, min, max) {
57
+ el.setAttribute("aria-valuenow", String(now));
58
+ el.setAttribute("aria-valuemin", String(min));
59
+ el.setAttribute("aria-valuemax", String(max));
60
+ }
61
+
62
+ export { setExpanded, toggleExpanded, setSelected, setHidden, setHiddenAnimated, setChecked, setDisabled, setDataState, setControls, setLabelledBy, setDescribedBy, setPressed, setValueRange };
@@ -0,0 +1,219 @@
1
+ import {
2
+ createDismiss
3
+ } from "./chunk-a6wp8c32.js";
4
+ import {
5
+ createFloatingPosition,
6
+ virtualElement
7
+ } from "./chunk-0mcr52hc.js";
8
+ import {
9
+ Keys,
10
+ handleListNavigation,
11
+ isKey
12
+ } from "./chunk-jctqs9m4.js";
13
+ import {
14
+ setDataState,
15
+ setHidden,
16
+ setHiddenAnimated
17
+ } from "./chunk-vvjyx7fe.js";
18
+ import {
19
+ applyAttrs
20
+ } from "./chunk-dpsgb1xw.js";
21
+ import {
22
+ uniqueId
23
+ } from "./chunk-8y1jf6xr.js";
24
+
25
+ // src/context-menu/context-menu.tsx
26
+ import { __element, __enterChildren, __exitChildren, __insert, __on } from "@vertz/ui/internals";
27
+ import { signal } from "@vertz/ui";
28
+ function ContextMenuRoot(options = {}) {
29
+ const { onSelect, positioning, ...attrs } = options;
30
+ const state = {
31
+ open: signal(false),
32
+ activeIndex: signal(-1)
33
+ };
34
+ const items = [];
35
+ let floatingCleanup = null;
36
+ let dismissCleanup = null;
37
+ function handleClickOutside(event) {
38
+ const target = event.target;
39
+ if (!trigger.contains(target) && !content.contains(target)) {
40
+ close();
41
+ }
42
+ }
43
+ function updateActiveItem(index) {
44
+ for (let i = 0;i < items.length; i++) {
45
+ items[i]?.setAttribute("tabindex", i === index ? "0" : "-1");
46
+ }
47
+ }
48
+ function openMenu(x, y) {
49
+ state.open.value = true;
50
+ setHidden(content, false);
51
+ setDataState(content, "open");
52
+ if (positioning) {
53
+ const result = createFloatingPosition(virtualElement(x, y), content, {
54
+ strategy: "fixed",
55
+ ...positioning
56
+ });
57
+ floatingCleanup = result.cleanup;
58
+ dismissCleanup = createDismiss({
59
+ onDismiss: close,
60
+ insideElements: [trigger, content],
61
+ escapeKey: false
62
+ });
63
+ } else {
64
+ content.style.left = `${x}px`;
65
+ content.style.top = `${y}px`;
66
+ document.addEventListener("mousedown", handleClickOutside);
67
+ }
68
+ state.activeIndex.value = 0;
69
+ updateActiveItem(0);
70
+ items[0]?.focus();
71
+ }
72
+ function close() {
73
+ state.open.value = false;
74
+ setDataState(content, "closed");
75
+ setHiddenAnimated(content, true);
76
+ if (positioning) {
77
+ floatingCleanup?.();
78
+ floatingCleanup = null;
79
+ dismissCleanup?.();
80
+ dismissCleanup = null;
81
+ } else {
82
+ document.removeEventListener("mousedown", handleClickOutside);
83
+ }
84
+ }
85
+ const trigger = (() => {
86
+ const __el0 = __element("div");
87
+ __on(__el0, "contextmenu", (event) => {
88
+ event.preventDefault();
89
+ if (state.open.peek()) {
90
+ close();
91
+ }
92
+ openMenu(event.clientX, event.clientY);
93
+ });
94
+ return __el0;
95
+ })();
96
+ const contentId = uniqueId("ctx-menu");
97
+ const content = (() => {
98
+ const __el1 = __element("div");
99
+ __el1.setAttribute("role", "menu");
100
+ {
101
+ const __v = contentId;
102
+ if (__v != null && __v !== false)
103
+ __el1.setAttribute("id", __v === true ? "" : __v);
104
+ }
105
+ __el1.setAttribute("style", "position: fixed; display: none;");
106
+ __el1.setAttribute("aria-hidden", "true");
107
+ __el1.setAttribute("data-state", "closed");
108
+ __on(__el1, "keydown", (event) => {
109
+ if (isKey(event, Keys.Escape)) {
110
+ event.preventDefault();
111
+ close();
112
+ return;
113
+ }
114
+ if (isKey(event, Keys.Enter, Keys.Space)) {
115
+ event.preventDefault();
116
+ const active = items[state.activeIndex.peek()];
117
+ if (active) {
118
+ const val = active.getAttribute("data-value");
119
+ if (val !== null) {
120
+ onSelect?.(val);
121
+ close();
122
+ }
123
+ }
124
+ return;
125
+ }
126
+ const result = handleListNavigation(event, items, { orientation: "vertical" });
127
+ if (result) {
128
+ const idx = items.indexOf(result);
129
+ if (idx >= 0) {
130
+ state.activeIndex.value = idx;
131
+ updateActiveItem(idx);
132
+ }
133
+ return;
134
+ }
135
+ if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {
136
+ const char = event.key.toLowerCase();
137
+ const match = items.find((item) => item.textContent?.toLowerCase().startsWith(char));
138
+ if (match) {
139
+ const idx = items.indexOf(match);
140
+ state.activeIndex.value = idx;
141
+ updateActiveItem(idx);
142
+ match.focus();
143
+ }
144
+ }
145
+ });
146
+ return __el1;
147
+ })();
148
+ function createItem(value, label, parent) {
149
+ const item = (() => {
150
+ const __el2 = __element("div");
151
+ __el2.setAttribute("role", "menuitem");
152
+ {
153
+ const __v = value;
154
+ if (__v != null && __v !== false)
155
+ __el2.setAttribute("data-value", __v === true ? "" : __v);
156
+ }
157
+ __el2.setAttribute("tabindex", "-1");
158
+ __on(__el2, "click", () => {
159
+ onSelect?.(value);
160
+ close();
161
+ });
162
+ __enterChildren(__el2);
163
+ __insert(__el2, label ?? value);
164
+ __exitChildren();
165
+ return __el2;
166
+ })();
167
+ items.push(item);
168
+ (parent ?? content).appendChild(item);
169
+ return item;
170
+ }
171
+ function Item(value, label) {
172
+ return createItem(value, label);
173
+ }
174
+ function Group(label) {
175
+ const el = (() => {
176
+ const __el3 = __element("div");
177
+ __el3.setAttribute("role", "group");
178
+ {
179
+ const __v = label;
180
+ if (__v != null && __v !== false)
181
+ __el3.setAttribute("aria-label", __v === true ? "" : __v);
182
+ }
183
+ return __el3;
184
+ })();
185
+ content.appendChild(el);
186
+ return {
187
+ el,
188
+ Item: (value, itemLabel) => createItem(value, itemLabel, el)
189
+ };
190
+ }
191
+ function Separator() {
192
+ const hr = (() => {
193
+ const __el4 = __element("hr");
194
+ __el4.setAttribute("role", "separator");
195
+ return __el4;
196
+ })();
197
+ content.appendChild(hr);
198
+ return hr;
199
+ }
200
+ function Label(text) {
201
+ const el = (() => {
202
+ const __el5 = __element("div");
203
+ __el5.setAttribute("role", "none");
204
+ __enterChildren(__el5);
205
+ __insert(__el5, text);
206
+ __exitChildren();
207
+ return __el5;
208
+ })();
209
+ content.appendChild(el);
210
+ return el;
211
+ }
212
+ applyAttrs(trigger, attrs);
213
+ return { trigger, content, state, Item, Group, Separator, Label };
214
+ }
215
+ var ContextMenu = {
216
+ Root: ContextMenuRoot
217
+ };
218
+
219
+ export { ContextMenu };
@@ -0,0 +1,108 @@
1
+ import {
2
+ Calendar
3
+ } from "./chunk-18y8gfk0.js";
4
+ import {
5
+ Popover
6
+ } from "./chunk-m1ptgp1s.js";
7
+
8
+ // src/date-picker/date-picker.ts
9
+ import { signal } from "@vertz/ui";
10
+ function defaultFormatDate(date) {
11
+ return date.toLocaleDateString();
12
+ }
13
+ function formatRangeDisplay(value, fmt) {
14
+ return `${fmt(value.from)} – ${fmt(value.to)}`;
15
+ }
16
+ var DatePicker = {
17
+ Root(options = {}) {
18
+ const {
19
+ mode = "single",
20
+ defaultValue = null,
21
+ minDate,
22
+ maxDate,
23
+ disabled,
24
+ formatDate = defaultFormatDate,
25
+ placeholder = "Pick a date",
26
+ onValueChange,
27
+ onOpenChange
28
+ } = options;
29
+ const defaultMonth = options.defaultMonth ?? (defaultValue instanceof Date ? defaultValue : defaultValue && ("from" in defaultValue) ? defaultValue.from : new Date);
30
+ const calendarMode = mode === "range" ? "range" : "single";
31
+ const calendarDefaultValue = defaultValue instanceof Date ? defaultValue : defaultValue && ("from" in defaultValue) ? defaultValue : undefined;
32
+ const popover = Popover.Root({
33
+ onOpenChange(open) {
34
+ state.open.value = open;
35
+ onOpenChange?.(open);
36
+ }
37
+ });
38
+ const calendarResult = Calendar.Root({
39
+ mode: calendarMode,
40
+ defaultValue: calendarDefaultValue,
41
+ defaultMonth,
42
+ minDate,
43
+ maxDate,
44
+ disabled,
45
+ onValueChange(value) {
46
+ if (mode === "single" && value instanceof Date) {
47
+ state.value.value = value;
48
+ updateTriggerText();
49
+ onValueChange?.(value);
50
+ hide();
51
+ } else if (mode === "range" && value && "from" in value) {
52
+ const range = value;
53
+ state.value.value = range;
54
+ updateTriggerText();
55
+ onValueChange?.(range);
56
+ if (range.from && range.to && range.from.getTime() !== range.to.getTime()) {
57
+ hide();
58
+ }
59
+ }
60
+ }
61
+ });
62
+ popover.content.appendChild(calendarResult.root);
63
+ const state = {
64
+ open: signal(false),
65
+ value: signal(defaultValue),
66
+ displayMonth: calendarResult.state.displayMonth
67
+ };
68
+ function updateTriggerText() {
69
+ const val = state.value.peek();
70
+ if (val === null) {
71
+ popover.trigger.textContent = placeholder;
72
+ popover.trigger.setAttribute("data-placeholder", "true");
73
+ } else if (val instanceof Date) {
74
+ popover.trigger.textContent = formatDate(val);
75
+ popover.trigger.removeAttribute("data-placeholder");
76
+ } else if ("from" in val) {
77
+ popover.trigger.textContent = formatRangeDisplay(val, formatDate);
78
+ popover.trigger.removeAttribute("data-placeholder");
79
+ }
80
+ }
81
+ function show() {
82
+ popover.trigger.click();
83
+ }
84
+ function hide() {
85
+ if (state.open.peek()) {
86
+ popover.trigger.click();
87
+ }
88
+ }
89
+ updateTriggerText();
90
+ return {
91
+ trigger: popover.trigger,
92
+ content: popover.content,
93
+ calendar: {
94
+ root: calendarResult.root,
95
+ header: calendarResult.header,
96
+ title: calendarResult.title,
97
+ prevButton: calendarResult.prevButton,
98
+ nextButton: calendarResult.nextButton,
99
+ grid: calendarResult.grid
100
+ },
101
+ state,
102
+ show,
103
+ hide
104
+ };
105
+ }
106
+ };
107
+
108
+ export { DatePicker };