@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,177 @@
1
+ import {
2
+ focusFirst,
3
+ saveFocus,
4
+ trapFocus
5
+ } from "./chunk-e2v1c9ex.js";
6
+ import {
7
+ Keys,
8
+ isKey
9
+ } from "./chunk-jctqs9m4.js";
10
+ import {
11
+ setDataState,
12
+ setExpanded,
13
+ setHidden,
14
+ setHiddenAnimated,
15
+ setLabelledBy
16
+ } from "./chunk-vvjyx7fe.js";
17
+ import {
18
+ applyAttrs
19
+ } from "./chunk-dpsgb1xw.js";
20
+ import {
21
+ linkedIds
22
+ } from "./chunk-8y1jf6xr.js";
23
+
24
+ // src/dialog/dialog.tsx
25
+ import { __element, __on } from "@vertz/ui/internals";
26
+ import { signal } from "@vertz/ui";
27
+ function DialogRoot(options = {}) {
28
+ const { modal = true, defaultOpen = false, onOpenChange, ...attrs } = options;
29
+ const ids = linkedIds("dialog");
30
+ const titleId = `${ids.contentId}-title`;
31
+ const state = { open: signal(defaultOpen) };
32
+ let restoreFocus = null;
33
+ let removeTrap = null;
34
+ function openDialog() {
35
+ state.open.value = true;
36
+ setExpanded(trigger, true);
37
+ setHidden(overlay, false);
38
+ setHidden(content, false);
39
+ setDataState(trigger, "open");
40
+ setDataState(overlay, "open");
41
+ setDataState(content, "open");
42
+ restoreFocus = saveFocus();
43
+ if (modal) {
44
+ removeTrap = trapFocus(content);
45
+ }
46
+ queueMicrotask(() => focusFirst(content));
47
+ onOpenChange?.(true);
48
+ }
49
+ function closeDialog() {
50
+ state.open.value = false;
51
+ setExpanded(trigger, false);
52
+ setDataState(trigger, "closed");
53
+ setDataState(overlay, "closed");
54
+ setDataState(content, "closed");
55
+ setHiddenAnimated(overlay, true);
56
+ setHiddenAnimated(content, true);
57
+ removeTrap?.();
58
+ removeTrap = null;
59
+ restoreFocus?.();
60
+ restoreFocus = null;
61
+ onOpenChange?.(false);
62
+ }
63
+ const trigger = (() => {
64
+ const __el0 = __element("button");
65
+ __el0.setAttribute("type", "button");
66
+ {
67
+ const __v = ids.triggerId;
68
+ if (__v != null && __v !== false)
69
+ __el0.setAttribute("id", __v === true ? "" : __v);
70
+ }
71
+ {
72
+ const __v = ids.contentId;
73
+ if (__v != null && __v !== false)
74
+ __el0.setAttribute("aria-controls", __v === true ? "" : __v);
75
+ }
76
+ {
77
+ const __v = defaultOpen ? "true" : "false";
78
+ if (__v != null && __v !== false)
79
+ __el0.setAttribute("aria-expanded", __v === true ? "" : __v);
80
+ }
81
+ {
82
+ const __v = defaultOpen ? "open" : "closed";
83
+ if (__v != null && __v !== false)
84
+ __el0.setAttribute("data-state", __v === true ? "" : __v);
85
+ }
86
+ __on(__el0, "click", () => {
87
+ if (state.open.peek()) {
88
+ closeDialog();
89
+ } else {
90
+ openDialog();
91
+ }
92
+ });
93
+ return __el0;
94
+ })();
95
+ const overlay = (() => {
96
+ const __el1 = __element("div");
97
+ __el1.setAttribute("data-dialog-overlay", "");
98
+ {
99
+ const __v = defaultOpen ? "false" : "true";
100
+ if (__v != null && __v !== false)
101
+ __el1.setAttribute("aria-hidden", __v === true ? "" : __v);
102
+ }
103
+ {
104
+ const __v = defaultOpen ? "open" : "closed";
105
+ if (__v != null && __v !== false)
106
+ __el1.setAttribute("data-state", __v === true ? "" : __v);
107
+ }
108
+ {
109
+ const __v = defaultOpen ? "" : "display: none";
110
+ if (__v != null && __v !== false)
111
+ __el1.setAttribute("style", __v === true ? "" : __v);
112
+ }
113
+ __on(__el1, "click", () => closeDialog());
114
+ return __el1;
115
+ })();
116
+ const content = (() => {
117
+ const __el2 = __element("div");
118
+ __el2.setAttribute("role", "dialog");
119
+ {
120
+ const __v = ids.contentId;
121
+ if (__v != null && __v !== false)
122
+ __el2.setAttribute("id", __v === true ? "" : __v);
123
+ }
124
+ {
125
+ const __v = modal ? "true" : undefined;
126
+ if (__v != null && __v !== false)
127
+ __el2.setAttribute("aria-modal", __v === true ? "" : __v);
128
+ }
129
+ {
130
+ const __v = defaultOpen ? "false" : "true";
131
+ if (__v != null && __v !== false)
132
+ __el2.setAttribute("aria-hidden", __v === true ? "" : __v);
133
+ }
134
+ {
135
+ const __v = defaultOpen ? "open" : "closed";
136
+ if (__v != null && __v !== false)
137
+ __el2.setAttribute("data-state", __v === true ? "" : __v);
138
+ }
139
+ {
140
+ const __v = defaultOpen ? "" : "display: none";
141
+ if (__v != null && __v !== false)
142
+ __el2.setAttribute("style", __v === true ? "" : __v);
143
+ }
144
+ __on(__el2, "keydown", (event) => {
145
+ if (isKey(event, Keys.Escape)) {
146
+ event.preventDefault();
147
+ event.stopPropagation();
148
+ closeDialog();
149
+ }
150
+ });
151
+ return __el2;
152
+ })();
153
+ setLabelledBy(content, titleId);
154
+ const title = (() => {
155
+ const __el3 = __element("h2");
156
+ {
157
+ const __v = titleId;
158
+ if (__v != null && __v !== false)
159
+ __el3.setAttribute("id", __v === true ? "" : __v);
160
+ }
161
+ return __el3;
162
+ })();
163
+ const close = (() => {
164
+ const __el4 = __element("button");
165
+ __el4.setAttribute("type", "button");
166
+ __el4.setAttribute("aria-label", "Close");
167
+ __on(__el4, "click", () => closeDialog());
168
+ return __el4;
169
+ })();
170
+ applyAttrs(content, attrs);
171
+ return { trigger, overlay, content, title, close, state, show: openDialog, hide: closeDialog };
172
+ }
173
+ var Dialog = {
174
+ Root: DialogRoot
175
+ };
176
+
177
+ export { Dialog };
@@ -0,0 +1,151 @@
1
+ import {
2
+ Keys,
3
+ isKey
4
+ } from "./chunk-jctqs9m4.js";
5
+ import {
6
+ setDataState,
7
+ setValueRange
8
+ } from "./chunk-vvjyx7fe.js";
9
+ import {
10
+ applyAttrs
11
+ } from "./chunk-dpsgb1xw.js";
12
+ import {
13
+ uniqueId
14
+ } from "./chunk-8y1jf6xr.js";
15
+
16
+ // src/slider/slider.tsx
17
+ import { __element, __enterChildren, __exitChildren, __insert, __on } from "@vertz/ui/internals";
18
+ import { signal } from "@vertz/ui";
19
+ function SliderRoot(options = {}) {
20
+ const {
21
+ defaultValue = 0,
22
+ min = 0,
23
+ max = 100,
24
+ step = 1,
25
+ disabled = false,
26
+ onValueChange,
27
+ ...attrs
28
+ } = options;
29
+ const state = {
30
+ value: signal(defaultValue),
31
+ disabled: signal(disabled)
32
+ };
33
+ function clamp(val) {
34
+ return Math.min(max, Math.max(min, val));
35
+ }
36
+ function updatePosition(pct2) {
37
+ thumb.style.left = `${pct2}%`;
38
+ fill.style.width = `${pct2}%`;
39
+ }
40
+ function setValue(val) {
41
+ if (state.disabled.peek())
42
+ return;
43
+ const clamped = clamp(val);
44
+ state.value.value = clamped;
45
+ setValueRange(thumb, clamped, min, max);
46
+ const pct2 = (clamped - min) / (max - min) * 100;
47
+ updatePosition(pct2);
48
+ setDataState(root, "active");
49
+ onValueChange?.(clamped);
50
+ }
51
+ function valueFromPointer(event) {
52
+ const rect = track.getBoundingClientRect();
53
+ const pct2 = Math.max(0, Math.min(1, (event.clientX - rect.left) / rect.width));
54
+ const raw = min + pct2 * (max - min);
55
+ return Math.round(raw / step) * step;
56
+ }
57
+ const fill = (() => {
58
+ const __el0 = __element("div");
59
+ __el0.setAttribute("data-part", "fill");
60
+ __el0.setAttribute("style", "position: absolute; height: 100%; border-radius: inherit;");
61
+ return __el0;
62
+ })();
63
+ const thumb = (() => {
64
+ const __el1 = __element("div");
65
+ __el1.setAttribute("role", "slider");
66
+ {
67
+ const __v = disabled ? "-1" : "0";
68
+ if (__v != null && __v !== false)
69
+ __el1.setAttribute("tabindex", __v === true ? "" : __v);
70
+ }
71
+ __el1.setAttribute("data-part", "thumb");
72
+ {
73
+ const __v = disabled ? "true" : undefined;
74
+ if (__v != null && __v !== false)
75
+ __el1.setAttribute("aria-disabled", __v === true ? "" : __v);
76
+ }
77
+ __el1.setAttribute("style", "position: absolute; transform: translate(-50%, -50%);");
78
+ __on(__el1, "keydown", (event) => {
79
+ if (state.disabled.peek())
80
+ return;
81
+ const current = state.value.peek();
82
+ if (isKey(event, Keys.ArrowRight, Keys.ArrowUp)) {
83
+ event.preventDefault();
84
+ setValue(current + step);
85
+ } else if (isKey(event, Keys.ArrowLeft, Keys.ArrowDown)) {
86
+ event.preventDefault();
87
+ setValue(current - step);
88
+ } else if (isKey(event, Keys.Home)) {
89
+ event.preventDefault();
90
+ setValue(min);
91
+ } else if (isKey(event, Keys.End)) {
92
+ event.preventDefault();
93
+ setValue(max);
94
+ }
95
+ });
96
+ return __el1;
97
+ })();
98
+ setValueRange(thumb, defaultValue, min, max);
99
+ const track = (() => {
100
+ const __el2 = __element("div");
101
+ __el2.setAttribute("data-part", "track");
102
+ __el2.setAttribute("style", "position: relative;");
103
+ __enterChildren(__el2);
104
+ __insert(__el2, fill);
105
+ __insert(__el2, thumb);
106
+ __exitChildren();
107
+ return __el2;
108
+ })();
109
+ const root = (() => {
110
+ const __el3 = __element("div");
111
+ {
112
+ const __v = uniqueId("slider");
113
+ if (__v != null && __v !== false)
114
+ __el3.setAttribute("id", __v === true ? "" : __v);
115
+ }
116
+ {
117
+ const __v = disabled ? "disabled" : "active";
118
+ if (__v != null && __v !== false)
119
+ __el3.setAttribute("data-state", __v === true ? "" : __v);
120
+ }
121
+ __on(__el3, "pointerdown", (event) => {
122
+ if (state.disabled.peek())
123
+ return;
124
+ event.preventDefault();
125
+ setValue(valueFromPointer(event));
126
+ thumb.focus();
127
+ function onMove(e) {
128
+ setValue(valueFromPointer(e));
129
+ }
130
+ function onUp() {
131
+ document.removeEventListener("pointermove", onMove);
132
+ document.removeEventListener("pointerup", onUp);
133
+ }
134
+ document.addEventListener("pointermove", onMove);
135
+ document.addEventListener("pointerup", onUp);
136
+ });
137
+ __enterChildren(__el3);
138
+ __insert(__el3, track);
139
+ __exitChildren();
140
+ return __el3;
141
+ })();
142
+ const pct = (defaultValue - min) / (max - min) * 100;
143
+ updatePosition(pct);
144
+ applyAttrs(root, attrs);
145
+ return { root, thumb, track, state };
146
+ }
147
+ var Slider = {
148
+ Root: SliderRoot
149
+ };
150
+
151
+ export { Slider };
@@ -0,0 +1,163 @@
1
+ import {
2
+ setRovingTabindex
3
+ } from "./chunk-e2v1c9ex.js";
4
+ import {
5
+ handleListNavigation
6
+ } from "./chunk-jctqs9m4.js";
7
+ import {
8
+ setDataState,
9
+ setHidden,
10
+ setSelected
11
+ } from "./chunk-vvjyx7fe.js";
12
+ import {
13
+ applyAttrs
14
+ } from "./chunk-dpsgb1xw.js";
15
+ import {
16
+ uniqueId
17
+ } from "./chunk-8y1jf6xr.js";
18
+
19
+ // src/tabs/tabs.tsx
20
+ import { __element, __enterChildren, __exitChildren, __insert, __on } from "@vertz/ui/internals";
21
+ import { signal } from "@vertz/ui";
22
+ function TabsRoot(options = {}) {
23
+ const { defaultValue = "", orientation = "horizontal", onValueChange, ...attrs } = options;
24
+ const state = { value: signal(defaultValue) };
25
+ const triggers = [];
26
+ const panels = [];
27
+ const tabValues = [];
28
+ function selectTab(value) {
29
+ state.value.value = value;
30
+ for (let i = 0;i < tabValues.length; i++) {
31
+ const isActive = tabValues[i] === value;
32
+ const trig = triggers[i];
33
+ const panel = panels[i];
34
+ if (!trig || !panel)
35
+ continue;
36
+ setSelected(trig, isActive);
37
+ setDataState(trig, isActive ? "active" : "inactive");
38
+ trig.setAttribute("tabindex", isActive ? "0" : "-1");
39
+ setHidden(panel, !isActive);
40
+ setDataState(panel, isActive ? "active" : "inactive");
41
+ }
42
+ onValueChange?.(value);
43
+ }
44
+ const list = (() => {
45
+ const __el0 = __element("div");
46
+ __el0.setAttribute("role", "tablist");
47
+ {
48
+ const __v = orientation === "vertical" ? "vertical" : undefined;
49
+ if (__v != null && __v !== false)
50
+ __el0.setAttribute("aria-orientation", __v === true ? "" : __v);
51
+ }
52
+ __on(__el0, "keydown", (event) => {
53
+ const result = handleListNavigation(event, triggers, {
54
+ orientation
55
+ });
56
+ if (result) {
57
+ const idx = triggers.indexOf(result);
58
+ if (idx >= 0) {
59
+ const val = tabValues[idx];
60
+ if (val !== undefined)
61
+ selectTab(val);
62
+ }
63
+ }
64
+ });
65
+ return __el0;
66
+ })();
67
+ const root = (() => {
68
+ const __el1 = __element("div");
69
+ __enterChildren(__el1);
70
+ __insert(__el1, list);
71
+ __exitChildren();
72
+ return __el1;
73
+ })();
74
+ function Tab(value, label) {
75
+ const baseId = uniqueId("tab");
76
+ const triggerId = `${baseId}-trigger`;
77
+ const panelId = `${baseId}-panel`;
78
+ const isActive = value === state.value.peek();
79
+ const trig = (() => {
80
+ const __el2 = __element("button");
81
+ __el2.setAttribute("type", "button");
82
+ __el2.setAttribute("role", "tab");
83
+ {
84
+ const __v = triggerId;
85
+ if (__v != null && __v !== false)
86
+ __el2.setAttribute("id", __v === true ? "" : __v);
87
+ }
88
+ {
89
+ const __v = panelId;
90
+ if (__v != null && __v !== false)
91
+ __el2.setAttribute("aria-controls", __v === true ? "" : __v);
92
+ }
93
+ {
94
+ const __v = value;
95
+ if (__v != null && __v !== false)
96
+ __el2.setAttribute("data-value", __v === true ? "" : __v);
97
+ }
98
+ {
99
+ const __v = isActive ? "true" : "false";
100
+ if (__v != null && __v !== false)
101
+ __el2.setAttribute("aria-selected", __v === true ? "" : __v);
102
+ }
103
+ {
104
+ const __v = isActive ? "active" : "inactive";
105
+ if (__v != null && __v !== false)
106
+ __el2.setAttribute("data-state", __v === true ? "" : __v);
107
+ }
108
+ __on(__el2, "click", () => {
109
+ selectTab(value);
110
+ trig.focus();
111
+ });
112
+ __enterChildren(__el2);
113
+ __insert(__el2, label ?? value);
114
+ __exitChildren();
115
+ return __el2;
116
+ })();
117
+ const panel = (() => {
118
+ const __el3 = __element("div");
119
+ __el3.setAttribute("role", "tabpanel");
120
+ {
121
+ const __v = panelId;
122
+ if (__v != null && __v !== false)
123
+ __el3.setAttribute("id", __v === true ? "" : __v);
124
+ }
125
+ {
126
+ const __v = triggerId;
127
+ if (__v != null && __v !== false)
128
+ __el3.setAttribute("aria-labelledby", __v === true ? "" : __v);
129
+ }
130
+ __el3.setAttribute("tabindex", "0");
131
+ {
132
+ const __v = isActive ? "false" : "true";
133
+ if (__v != null && __v !== false)
134
+ __el3.setAttribute("aria-hidden", __v === true ? "" : __v);
135
+ }
136
+ {
137
+ const __v = isActive ? "active" : "inactive";
138
+ if (__v != null && __v !== false)
139
+ __el3.setAttribute("data-state", __v === true ? "" : __v);
140
+ }
141
+ {
142
+ const __v = isActive ? "" : "display: none";
143
+ if (__v != null && __v !== false)
144
+ __el3.setAttribute("style", __v === true ? "" : __v);
145
+ }
146
+ return __el3;
147
+ })();
148
+ triggers.push(trig);
149
+ panels.push(panel);
150
+ tabValues.push(value);
151
+ list.appendChild(trig);
152
+ root.appendChild(panel);
153
+ setRovingTabindex(triggers, triggers.findIndex((t) => tabValues[triggers.indexOf(t)] === state.value.peek()));
154
+ return { trigger: trig, panel };
155
+ }
156
+ applyAttrs(root, attrs);
157
+ return { root, list, state, Tab };
158
+ }
159
+ var Tabs = {
160
+ Root: TabsRoot
161
+ };
162
+
163
+ export { Tabs };
@@ -0,0 +1,218 @@
1
+ import {
2
+ focusFirst,
3
+ setRovingTabindex
4
+ } from "./chunk-e2v1c9ex.js";
5
+ import {
6
+ Keys,
7
+ handleListNavigation,
8
+ isKey
9
+ } from "./chunk-jctqs9m4.js";
10
+ import {
11
+ setDataState,
12
+ setExpanded,
13
+ setHidden,
14
+ setHiddenAnimated
15
+ } from "./chunk-vvjyx7fe.js";
16
+ import {
17
+ applyAttrs
18
+ } from "./chunk-dpsgb1xw.js";
19
+ import {
20
+ linkedIds
21
+ } from "./chunk-8y1jf6xr.js";
22
+
23
+ // src/navigation-menu/navigation-menu.tsx
24
+ import { __element, __enterChildren, __exitChildren, __insert, __on } from "@vertz/ui/internals";
25
+ import { signal } from "@vertz/ui";
26
+ function NavigationMenuRoot(options = {}) {
27
+ const { orientation = "horizontal", delayOpen = 200, delayClose = 300, ...attrs } = options;
28
+ const state = { activeItem: signal(null) };
29
+ const triggers = [];
30
+ const items = new Map;
31
+ const openTimeout = signal(null, "openTimeout");
32
+ const closeTimeout = signal(null, "closeTimeout");
33
+ function cancelTimers() {
34
+ if (openTimeout.value) {
35
+ clearTimeout(openTimeout.value);
36
+ openTimeout.value = null;
37
+ }
38
+ if (closeTimeout.value) {
39
+ clearTimeout(closeTimeout.value);
40
+ closeTimeout.value = null;
41
+ }
42
+ }
43
+ function openItem(value) {
44
+ cancelTimers();
45
+ const current = state.activeItem.peek();
46
+ if (current && current !== value) {
47
+ const prev = items.get(current);
48
+ if (prev) {
49
+ setExpanded(prev.trigger, false);
50
+ setDataState(prev.trigger, "closed");
51
+ setDataState(prev.content, "closed");
52
+ setHiddenAnimated(prev.content, true);
53
+ }
54
+ }
55
+ const item = items.get(value);
56
+ if (!item)
57
+ return;
58
+ state.activeItem.value = value;
59
+ setExpanded(item.trigger, true);
60
+ setHidden(item.content, false);
61
+ setDataState(item.trigger, "open");
62
+ setDataState(item.content, "open");
63
+ }
64
+ function closeAll() {
65
+ cancelTimers();
66
+ const current = state.activeItem.peek();
67
+ if (current) {
68
+ const item = items.get(current);
69
+ if (item) {
70
+ setExpanded(item.trigger, false);
71
+ setDataState(item.trigger, "closed");
72
+ setDataState(item.content, "closed");
73
+ setHiddenAnimated(item.content, true);
74
+ }
75
+ }
76
+ state.activeItem.value = null;
77
+ }
78
+ const list = (() => {
79
+ const __el0 = __element("div");
80
+ __on(__el0, "keydown", (event) => {
81
+ if (isKey(event, Keys.ArrowLeft, Keys.ArrowRight, Keys.Home, Keys.End)) {
82
+ handleListNavigation(event, triggers, {
83
+ orientation: orientation === "horizontal" ? "horizontal" : "vertical"
84
+ });
85
+ }
86
+ });
87
+ return __el0;
88
+ })();
89
+ const viewport = (() => {
90
+ const __el1 = __element("div");
91
+ return __el1;
92
+ })();
93
+ const root = (() => {
94
+ const __el2 = __element("nav");
95
+ __enterChildren(__el2);
96
+ __insert(__el2, list);
97
+ __insert(__el2, viewport);
98
+ __exitChildren();
99
+ return __el2;
100
+ })();
101
+ function Item(value, label) {
102
+ const ids = linkedIds("nav-menu");
103
+ const trigger = (() => {
104
+ const __el3 = __element("button");
105
+ __el3.setAttribute("type", "button");
106
+ {
107
+ const __v = ids.triggerId;
108
+ if (__v != null && __v !== false)
109
+ __el3.setAttribute("id", __v === true ? "" : __v);
110
+ }
111
+ {
112
+ const __v = ids.contentId;
113
+ if (__v != null && __v !== false)
114
+ __el3.setAttribute("aria-controls", __v === true ? "" : __v);
115
+ }
116
+ {
117
+ const __v = value;
118
+ if (__v != null && __v !== false)
119
+ __el3.setAttribute("data-value", __v === true ? "" : __v);
120
+ }
121
+ __el3.setAttribute("aria-expanded", "false");
122
+ __el3.setAttribute("data-state", "closed");
123
+ __on(__el3, "click", () => {
124
+ if (state.activeItem.peek() === value) {
125
+ closeAll();
126
+ } else {
127
+ openItem(value);
128
+ }
129
+ });
130
+ __on(__el3, "mouseenter", () => {
131
+ cancelTimers();
132
+ openTimeout.value = setTimeout(() => {
133
+ openItem(value);
134
+ openTimeout.value = null;
135
+ }, delayOpen);
136
+ });
137
+ __on(__el3, "mouseleave", () => {
138
+ cancelTimers();
139
+ closeTimeout.value = setTimeout(() => {
140
+ closeAll();
141
+ closeTimeout.value = null;
142
+ }, delayClose);
143
+ });
144
+ __on(__el3, "keydown", (event) => {
145
+ if (isKey(event, Keys.Enter, Keys.Space)) {
146
+ event.preventDefault();
147
+ openItem(value);
148
+ queueMicrotask(() => focusFirst(content));
149
+ }
150
+ if (isKey(event, Keys.Escape)) {
151
+ event.preventDefault();
152
+ closeAll();
153
+ }
154
+ });
155
+ __enterChildren(__el3);
156
+ __insert(__el3, label ?? value);
157
+ __exitChildren();
158
+ return __el3;
159
+ })();
160
+ const content = (() => {
161
+ const __el4 = __element("div");
162
+ {
163
+ const __v = ids.contentId;
164
+ if (__v != null && __v !== false)
165
+ __el4.setAttribute("id", __v === true ? "" : __v);
166
+ }
167
+ __el4.setAttribute("aria-hidden", "true");
168
+ __el4.setAttribute("data-state", "closed");
169
+ __el4.setAttribute("style", "display: none");
170
+ __on(__el4, "mouseenter", () => cancelTimers());
171
+ __on(__el4, "mouseleave", () => {
172
+ cancelTimers();
173
+ closeTimeout.value = setTimeout(() => {
174
+ closeAll();
175
+ closeTimeout.value = null;
176
+ }, delayClose);
177
+ });
178
+ __on(__el4, "keydown", (event) => {
179
+ if (isKey(event, Keys.Escape)) {
180
+ event.preventDefault();
181
+ event.stopPropagation();
182
+ closeAll();
183
+ trigger.focus();
184
+ }
185
+ });
186
+ return __el4;
187
+ })();
188
+ triggers.push(trigger);
189
+ setRovingTabindex(triggers, 0);
190
+ items.set(value, { trigger, content });
191
+ list.appendChild(trigger);
192
+ viewport.appendChild(content);
193
+ return { trigger, content };
194
+ }
195
+ function Link(href, label) {
196
+ const a = (() => {
197
+ const __el5 = __element("a");
198
+ {
199
+ const __v = href;
200
+ if (__v != null && __v !== false)
201
+ __el5.setAttribute("href", __v === true ? "" : __v);
202
+ }
203
+ __enterChildren(__el5);
204
+ __insert(__el5, label);
205
+ __exitChildren();
206
+ return __el5;
207
+ })();
208
+ list.appendChild(a);
209
+ return a;
210
+ }
211
+ applyAttrs(root, attrs);
212
+ return { root, list, viewport, state, Item, Link };
213
+ }
214
+ var NavigationMenu = {
215
+ Root: NavigationMenuRoot
216
+ };
217
+
218
+ export { NavigationMenu };