@vertz/ui-primitives 0.2.14 → 0.2.16

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 (108) hide show
  1. package/dist/shared/chunk-0mcr52hc.js +78 -0
  2. package/dist/shared/chunk-2h5qpc00.js +98 -0
  3. package/dist/shared/chunk-31yptvbf.js +151 -0
  4. package/dist/shared/chunk-34yfm2b0.js +182 -0
  5. package/dist/shared/chunk-3pantb0p.js +108 -0
  6. package/dist/shared/chunk-3s6s6f06.js +61 -0
  7. package/dist/shared/chunk-48v8j0vh.js +267 -0
  8. package/dist/shared/chunk-6dmt4513.js +78 -0
  9. package/dist/shared/chunk-6pnjrst7.js +108 -0
  10. package/dist/shared/chunk-6sqwjfg8.js +169 -0
  11. package/dist/shared/chunk-8qfeqrrz.js +179 -0
  12. package/dist/shared/chunk-8y1jf6xr.js +17 -0
  13. package/dist/shared/chunk-9cqe2q6e.js +56 -0
  14. package/dist/shared/chunk-a6wp8c32.js +32 -0
  15. package/dist/shared/chunk-bcfzteh0.js +148 -0
  16. package/dist/shared/chunk-cr9sbwns.js +235 -0
  17. package/dist/shared/chunk-cvbf1js1.js +52 -0
  18. package/dist/shared/chunk-dkhst4wv.js +97 -0
  19. package/dist/shared/chunk-e2v1c9ex.js +62 -0
  20. package/dist/shared/chunk-e3aj5yw4.js +115 -0
  21. package/dist/shared/chunk-fv1y77tn.js +225 -0
  22. package/dist/shared/chunk-h42bk324.js +58 -0
  23. package/dist/shared/chunk-h9m9x5my.js +119 -0
  24. package/dist/shared/chunk-jctqs9m4.js +60 -0
  25. package/dist/shared/chunk-n92bvn5d.js +149 -0
  26. package/dist/shared/chunk-qpfqyrc5.js +19 -0
  27. package/dist/shared/chunk-qq0e0gym.js +73 -0
  28. package/dist/shared/chunk-t1vkvsz2.js +175 -0
  29. package/dist/shared/chunk-tk1k1bet.js +93 -0
  30. package/dist/shared/chunk-tvpgeswh.js +216 -0
  31. package/dist/shared/chunk-vcp10kne.js +175 -0
  32. package/dist/shared/chunk-ve006hmy.js +51 -0
  33. package/dist/shared/chunk-vq9tfzh8.js +30 -0
  34. package/dist/shared/chunk-vvjyx7fe.js +62 -0
  35. package/dist/shared/chunk-vx1ajy2z.js +115 -0
  36. package/dist/shared/chunk-w06tst6x.js +57 -0
  37. package/dist/shared/chunk-wnttq0gv.js +49 -0
  38. package/dist/shared/chunk-x6qzr3g6.js +100 -0
  39. package/dist/src/accordion/accordion.d.ts +23 -0
  40. package/dist/src/accordion/accordion.js +9 -0
  41. package/dist/src/alert-dialog/alert-dialog.d.ts +26 -0
  42. package/dist/src/alert-dialog/alert-dialog.js +9 -0
  43. package/dist/src/badge/badge.d.ts +10 -0
  44. package/dist/src/badge/badge.js +7 -0
  45. package/dist/src/button/button.d.ts +18 -0
  46. package/dist/src/button/button.js +8 -0
  47. package/dist/src/calendar/calendar.d.ts +40 -0
  48. package/dist/src/calendar/calendar.js +6 -0
  49. package/dist/src/carousel/carousel.d.ts +27 -0
  50. package/dist/src/carousel/carousel.js +8 -0
  51. package/dist/src/checkbox/checkbox.d.ts +20 -0
  52. package/dist/src/checkbox/checkbox.js +9 -0
  53. package/dist/src/collapsible/collapsible.d.ts +21 -0
  54. package/dist/src/collapsible/collapsible.js +8 -0
  55. package/dist/src/combobox/combobox.d.ts +23 -0
  56. package/dist/src/combobox/combobox.js +9 -0
  57. package/dist/src/command/command.d.ts +29 -0
  58. package/dist/src/command/command.js +9 -0
  59. package/dist/src/context-menu/context-menu.d.ts +39 -0
  60. package/dist/src/context-menu/context-menu.js +11 -0
  61. package/dist/src/date-picker/date-picker.d.ts +47 -0
  62. package/dist/src/date-picker/date-picker.js +14 -0
  63. package/dist/src/dialog/dialog.d.ts +24 -0
  64. package/dist/src/dialog/dialog.js +10 -0
  65. package/dist/src/dropdown-menu/dropdown-menu.d.ts +42 -0
  66. package/dist/src/dropdown-menu/dropdown-menu.js +12 -0
  67. package/dist/src/hover-card/hover-card.d.ts +33 -0
  68. package/dist/src/hover-card/hover-card.js +10 -0
  69. package/dist/src/index.js +136 -0
  70. package/dist/src/menu/menu.d.ts +39 -0
  71. package/dist/src/menu/menu.js +11 -0
  72. package/dist/src/menubar/menubar.d.ts +40 -0
  73. package/dist/src/menubar/menubar.js +12 -0
  74. package/dist/src/navigation-menu/navigation-menu.d.ts +25 -0
  75. package/dist/src/navigation-menu/navigation-menu.js +10 -0
  76. package/dist/src/popover/popover.d.ts +32 -0
  77. package/dist/src/popover/popover.js +12 -0
  78. package/dist/src/progress/progress.d.ts +20 -0
  79. package/dist/src/progress/progress.js +8 -0
  80. package/dist/src/radio/radio.d.ts +18 -0
  81. package/dist/src/radio/radio.js +10 -0
  82. package/dist/src/resizable-panel/resizable-panel.d.ts +24 -0
  83. package/dist/src/resizable-panel/resizable-panel.js +8 -0
  84. package/dist/src/scroll-area/scroll-area.d.ts +25 -0
  85. package/dist/src/scroll-area/scroll-area.js +6 -0
  86. package/dist/src/select/select.d.ts +41 -0
  87. package/dist/src/select/select.js +11 -0
  88. package/dist/src/sheet/sheet.d.ts +24 -0
  89. package/dist/src/sheet/sheet.js +10 -0
  90. package/dist/src/slider/slider.d.ts +24 -0
  91. package/dist/src/slider/slider.js +9 -0
  92. package/dist/src/switch/switch.d.ts +9 -0
  93. package/dist/src/switch/switch.js +8 -0
  94. package/dist/src/tabs/tabs.d.ts +23 -0
  95. package/dist/src/tabs/tabs.js +10 -0
  96. package/dist/src/toast/toast.d.ts +24 -0
  97. package/dist/src/toast/toast.js +8 -0
  98. package/dist/src/toggle/toggle.d.ts +9 -0
  99. package/dist/src/toggle/toggle.js +8 -0
  100. package/dist/src/toggle-group/toggle-group.d.ts +22 -0
  101. package/dist/src/toggle-group/toggle-group.js +9 -0
  102. package/dist/src/tooltip/tooltip.d.ts +32 -0
  103. package/dist/src/tooltip/tooltip.js +10 -0
  104. package/dist/src/utils.d.ts +176 -0
  105. package/dist/src/utils.js +72 -0
  106. package/package.json +12 -10
  107. package/dist/index.js +0 -3675
  108. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
@@ -0,0 +1,78 @@
1
+ // src/utils/floating.ts
2
+ import { autoUpdate, computePosition, flip, offset, shift } from "@floating-ui/dom";
3
+ function createFloatingPosition(reference, floating, options = {}) {
4
+ const {
5
+ placement = "bottom-start",
6
+ strategy = "fixed",
7
+ offset: offsetValue = 4,
8
+ flip: enableFlip = true,
9
+ shift: enableShift = true,
10
+ middleware: extraMiddleware = [],
11
+ matchReferenceWidth = false,
12
+ portal = false
13
+ } = options;
14
+ if (portal && floating.parentElement !== document.body) {
15
+ document.body.appendChild(floating);
16
+ }
17
+ const mw = [];
18
+ mw.push(offset(offsetValue));
19
+ if (enableFlip)
20
+ mw.push(flip());
21
+ if (enableShift)
22
+ mw.push(shift());
23
+ if (matchReferenceWidth) {
24
+ mw.push({
25
+ name: "matchReferenceWidth",
26
+ fn({ rects }) {
27
+ floating.style.minWidth = `${rects.reference.width}px`;
28
+ return {};
29
+ }
30
+ });
31
+ }
32
+ mw.push(...extraMiddleware);
33
+ function updatePosition() {
34
+ computePosition(reference, floating, {
35
+ placement,
36
+ strategy,
37
+ middleware: mw
38
+ }).then((result) => {
39
+ floating.style.position = result.strategy;
40
+ floating.style.left = `${result.x}px`;
41
+ floating.style.top = `${result.y}px`;
42
+ const [side = "bottom", align = "center"] = result.placement.split("-");
43
+ floating.setAttribute("data-side", side);
44
+ floating.setAttribute("data-align", align);
45
+ });
46
+ }
47
+ const cleanupAutoUpdate = autoUpdate(reference, floating, updatePosition, {
48
+ animationFrame: true
49
+ });
50
+ return {
51
+ cleanup: cleanupAutoUpdate,
52
+ update() {
53
+ updatePosition();
54
+ return Promise.resolve();
55
+ }
56
+ };
57
+ }
58
+ function virtualElement(x, y) {
59
+ return {
60
+ getBoundingClientRect() {
61
+ return {
62
+ x,
63
+ y,
64
+ top: y,
65
+ left: x,
66
+ bottom: y,
67
+ right: x,
68
+ width: 0,
69
+ height: 0,
70
+ toJSON() {
71
+ return this;
72
+ }
73
+ };
74
+ }
75
+ };
76
+ }
77
+
78
+ export { createFloatingPosition, virtualElement };
@@ -0,0 +1,98 @@
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
+ uniqueId
14
+ } from "./chunk-8y1jf6xr.js";
15
+
16
+ // src/tabs/tabs.ts
17
+ import { signal } from "@vertz/ui";
18
+ var Tabs = {
19
+ Root(options = {}) {
20
+ const { defaultValue = "", orientation = "horizontal", onValueChange } = options;
21
+ const state = { value: signal(defaultValue) };
22
+ const triggers = [];
23
+ const panels = [];
24
+ const tabValues = [];
25
+ const root = document.createElement("div");
26
+ const list = document.createElement("div");
27
+ list.setAttribute("role", "tablist");
28
+ if (orientation === "vertical") {
29
+ list.setAttribute("aria-orientation", "vertical");
30
+ }
31
+ root.appendChild(list);
32
+ function selectTab(value) {
33
+ state.value.value = value;
34
+ for (let i = 0;i < tabValues.length; i++) {
35
+ const isActive = tabValues[i] === value;
36
+ const trig = triggers[i];
37
+ const panel = panels[i];
38
+ if (!trig || !panel)
39
+ continue;
40
+ setSelected(trig, isActive);
41
+ setDataState(trig, isActive ? "active" : "inactive");
42
+ trig.setAttribute("tabindex", isActive ? "0" : "-1");
43
+ setHidden(panel, !isActive);
44
+ setDataState(panel, isActive ? "active" : "inactive");
45
+ }
46
+ onValueChange?.(value);
47
+ }
48
+ list.addEventListener("keydown", (event) => {
49
+ const result = handleListNavigation(event, triggers, {
50
+ orientation
51
+ });
52
+ if (result) {
53
+ const idx = triggers.indexOf(result);
54
+ if (idx >= 0) {
55
+ const val = tabValues[idx];
56
+ if (val !== undefined)
57
+ selectTab(val);
58
+ }
59
+ }
60
+ });
61
+ function Tab(value, label) {
62
+ const baseId = uniqueId("tab");
63
+ const triggerId = `${baseId}-trigger`;
64
+ const panelId = `${baseId}-panel`;
65
+ const isActive = value === state.value.peek();
66
+ const trig = document.createElement("button");
67
+ trig.setAttribute("type", "button");
68
+ trig.setAttribute("role", "tab");
69
+ trig.id = triggerId;
70
+ trig.setAttribute("aria-controls", panelId);
71
+ trig.setAttribute("data-value", value);
72
+ trig.textContent = label ?? value;
73
+ setSelected(trig, isActive);
74
+ setDataState(trig, isActive ? "active" : "inactive");
75
+ const panel = document.createElement("div");
76
+ panel.setAttribute("role", "tabpanel");
77
+ panel.id = panelId;
78
+ panel.setAttribute("aria-labelledby", triggerId);
79
+ panel.setAttribute("tabindex", "0");
80
+ setHidden(panel, !isActive);
81
+ setDataState(panel, isActive ? "active" : "inactive");
82
+ trig.addEventListener("click", () => {
83
+ selectTab(value);
84
+ trig.focus();
85
+ });
86
+ triggers.push(trig);
87
+ panels.push(panel);
88
+ tabValues.push(value);
89
+ list.appendChild(trig);
90
+ root.appendChild(panel);
91
+ setRovingTabindex(triggers, triggers.findIndex((t) => tabValues[triggers.indexOf(t)] === state.value.peek()));
92
+ return { trigger: trig, panel };
93
+ }
94
+ return { root, list, state, Tab };
95
+ }
96
+ };
97
+
98
+ export { Tabs };
@@ -0,0 +1,151 @@
1
+ import {
2
+ createFloatingPosition
3
+ } from "./chunk-0mcr52hc.js";
4
+ import {
5
+ Keys,
6
+ isKey
7
+ } from "./chunk-jctqs9m4.js";
8
+ import {
9
+ setDataState,
10
+ setExpanded,
11
+ setHidden,
12
+ setHiddenAnimated
13
+ } from "./chunk-vvjyx7fe.js";
14
+ import {
15
+ uniqueId
16
+ } from "./chunk-8y1jf6xr.js";
17
+
18
+ // src/hover-card/hover-card.ts
19
+ import { signal } from "@vertz/ui";
20
+ var HoverCard = {
21
+ Root(options = {}) {
22
+ const { openDelay = 700, closeDelay = 300, onOpenChange, positioning } = options;
23
+ const contentId = uniqueId("hovercard");
24
+ const state = { open: signal(false) };
25
+ let openTimeout = null;
26
+ let closeTimeout = null;
27
+ let floatingCleanup = null;
28
+ const trigger = document.createElement("span");
29
+ trigger.setAttribute("aria-haspopup", "dialog");
30
+ trigger.setAttribute("aria-expanded", "false");
31
+ const content = document.createElement("div");
32
+ content.setAttribute("role", "dialog");
33
+ content.id = contentId;
34
+ setHidden(content, true);
35
+ setDataState(content, "closed");
36
+ function cancelTimers() {
37
+ if (openTimeout) {
38
+ clearTimeout(openTimeout);
39
+ openTimeout = null;
40
+ }
41
+ if (closeTimeout) {
42
+ clearTimeout(closeTimeout);
43
+ closeTimeout = null;
44
+ }
45
+ }
46
+ function show() {
47
+ cancelTimers();
48
+ if (state.open.peek())
49
+ return;
50
+ openTimeout = setTimeout(() => {
51
+ state.open.value = true;
52
+ setExpanded(trigger, true);
53
+ setHidden(content, false);
54
+ setDataState(content, "open");
55
+ if (positioning) {
56
+ const effectivePlacement = positioning.placement ?? "bottom";
57
+ const result = createFloatingPosition(trigger, content, {
58
+ ...positioning,
59
+ placement: effectivePlacement
60
+ });
61
+ floatingCleanup = result.cleanup;
62
+ }
63
+ onOpenChange?.(true);
64
+ openTimeout = null;
65
+ }, openDelay);
66
+ }
67
+ function hide() {
68
+ cancelTimers();
69
+ if (!state.open.peek())
70
+ return;
71
+ closeTimeout = setTimeout(() => {
72
+ state.open.value = false;
73
+ setExpanded(trigger, false);
74
+ setDataState(content, "closed");
75
+ setHiddenAnimated(content, true);
76
+ floatingCleanup?.();
77
+ floatingCleanup = null;
78
+ onOpenChange?.(false);
79
+ closeTimeout = null;
80
+ }, closeDelay);
81
+ }
82
+ trigger.addEventListener("mouseenter", show);
83
+ trigger.addEventListener("mouseleave", hide);
84
+ trigger.addEventListener("focus", () => {
85
+ cancelTimers();
86
+ state.open.value = true;
87
+ setExpanded(trigger, true);
88
+ setHidden(content, false);
89
+ setDataState(content, "open");
90
+ if (positioning) {
91
+ floatingCleanup?.();
92
+ const effectivePlacement = positioning.placement ?? "bottom";
93
+ const result = createFloatingPosition(trigger, content, {
94
+ ...positioning,
95
+ placement: effectivePlacement
96
+ });
97
+ floatingCleanup = result.cleanup;
98
+ }
99
+ onOpenChange?.(true);
100
+ });
101
+ trigger.addEventListener("blur", (event) => {
102
+ const related = event.relatedTarget;
103
+ if (related && (trigger.contains(related) || content.contains(related)))
104
+ return;
105
+ hide();
106
+ });
107
+ content.addEventListener("mouseenter", () => {
108
+ if (closeTimeout) {
109
+ clearTimeout(closeTimeout);
110
+ closeTimeout = null;
111
+ }
112
+ });
113
+ content.addEventListener("mouseleave", hide);
114
+ content.addEventListener("focusin", () => {
115
+ if (closeTimeout) {
116
+ clearTimeout(closeTimeout);
117
+ closeTimeout = null;
118
+ }
119
+ });
120
+ content.addEventListener("focusout", (event) => {
121
+ const related = event.relatedTarget;
122
+ if (related && (trigger.contains(related) || content.contains(related)))
123
+ return;
124
+ hide();
125
+ });
126
+ function hideImmediate() {
127
+ cancelTimers();
128
+ state.open.value = false;
129
+ setExpanded(trigger, false);
130
+ setDataState(content, "closed");
131
+ setHiddenAnimated(content, true);
132
+ floatingCleanup?.();
133
+ floatingCleanup = null;
134
+ onOpenChange?.(false);
135
+ }
136
+ content.addEventListener("keydown", (event) => {
137
+ if (isKey(event, Keys.Escape)) {
138
+ hideImmediate();
139
+ trigger.focus();
140
+ }
141
+ });
142
+ trigger.addEventListener("keydown", (event) => {
143
+ if (isKey(event, Keys.Escape) && state.open.peek()) {
144
+ hideImmediate();
145
+ }
146
+ });
147
+ return { trigger, content, state };
148
+ }
149
+ };
150
+
151
+ export { HoverCard };
@@ -0,0 +1,182 @@
1
+ import {
2
+ saveFocus,
3
+ trapFocus
4
+ } from "./chunk-e2v1c9ex.js";
5
+ import {
6
+ setDataState,
7
+ setExpanded,
8
+ setHidden,
9
+ setHiddenAnimated
10
+ } from "./chunk-vvjyx7fe.js";
11
+ import {
12
+ linkedIds
13
+ } from "./chunk-8y1jf6xr.js";
14
+
15
+ // src/alert-dialog/alert-dialog.tsx
16
+ import { __element, __on } from "@vertz/ui/internals";
17
+ import { signal } from "@vertz/ui";
18
+ function AlertDialogRoot(options = {}) {
19
+ const { defaultOpen = false, onOpenChange, onAction } = options;
20
+ const ids = linkedIds("alertdialog");
21
+ const titleId = `${ids.contentId}-title`;
22
+ const descriptionId = `${ids.contentId}-description`;
23
+ const state = { open: signal(defaultOpen) };
24
+ let restoreFocus = null;
25
+ let removeTrap = null;
26
+ function show() {
27
+ state.open.value = true;
28
+ setExpanded(trigger, true);
29
+ setHidden(overlay, false);
30
+ setHidden(content, false);
31
+ setDataState(trigger, "open");
32
+ setDataState(overlay, "open");
33
+ setDataState(content, "open");
34
+ restoreFocus = saveFocus();
35
+ removeTrap = trapFocus(content);
36
+ queueMicrotask(() => cancel.focus());
37
+ onOpenChange?.(true);
38
+ }
39
+ function hide() {
40
+ state.open.value = false;
41
+ setExpanded(trigger, false);
42
+ setDataState(trigger, "closed");
43
+ setDataState(overlay, "closed");
44
+ setDataState(content, "closed");
45
+ setHiddenAnimated(overlay, true);
46
+ setHiddenAnimated(content, true);
47
+ removeTrap?.();
48
+ removeTrap = null;
49
+ restoreFocus?.();
50
+ restoreFocus = null;
51
+ onOpenChange?.(false);
52
+ }
53
+ const trigger = (() => {
54
+ const __el0 = __element("button");
55
+ __el0.setAttribute("type", "button");
56
+ {
57
+ const __v = ids.triggerId;
58
+ if (__v != null && __v !== false)
59
+ __el0.setAttribute("id", __v === true ? "" : __v);
60
+ }
61
+ {
62
+ const __v = ids.contentId;
63
+ if (__v != null && __v !== false)
64
+ __el0.setAttribute("aria-controls", __v === true ? "" : __v);
65
+ }
66
+ {
67
+ const __v = defaultOpen ? "true" : "false";
68
+ if (__v != null && __v !== false)
69
+ __el0.setAttribute("aria-expanded", __v === true ? "" : __v);
70
+ }
71
+ {
72
+ const __v = defaultOpen ? "open" : "closed";
73
+ if (__v != null && __v !== false)
74
+ __el0.setAttribute("data-state", __v === true ? "" : __v);
75
+ }
76
+ __on(__el0, "click", () => {
77
+ if (!state.open.peek())
78
+ show();
79
+ });
80
+ return __el0;
81
+ })();
82
+ const overlay = (() => {
83
+ const __el1 = __element("div");
84
+ __el1.setAttribute("data-alertdialog-overlay", "");
85
+ {
86
+ const __v = defaultOpen ? "false" : "true";
87
+ if (__v != null && __v !== false)
88
+ __el1.setAttribute("aria-hidden", __v === true ? "" : __v);
89
+ }
90
+ {
91
+ const __v = defaultOpen ? "open" : "closed";
92
+ if (__v != null && __v !== false)
93
+ __el1.setAttribute("data-state", __v === true ? "" : __v);
94
+ }
95
+ {
96
+ const __v = defaultOpen ? "" : "display: none";
97
+ if (__v != null && __v !== false)
98
+ __el1.setAttribute("style", __v === true ? "" : __v);
99
+ }
100
+ return __el1;
101
+ })();
102
+ const content = (() => {
103
+ const __el2 = __element("div");
104
+ __el2.setAttribute("role", "alertdialog");
105
+ {
106
+ const __v = ids.contentId;
107
+ if (__v != null && __v !== false)
108
+ __el2.setAttribute("id", __v === true ? "" : __v);
109
+ }
110
+ __el2.setAttribute("aria-modal", "true");
111
+ {
112
+ const __v = titleId;
113
+ if (__v != null && __v !== false)
114
+ __el2.setAttribute("aria-labelledby", __v === true ? "" : __v);
115
+ }
116
+ {
117
+ const __v = descriptionId;
118
+ if (__v != null && __v !== false)
119
+ __el2.setAttribute("aria-describedby", __v === true ? "" : __v);
120
+ }
121
+ {
122
+ const __v = defaultOpen ? "false" : "true";
123
+ if (__v != null && __v !== false)
124
+ __el2.setAttribute("aria-hidden", __v === true ? "" : __v);
125
+ }
126
+ {
127
+ const __v = defaultOpen ? "open" : "closed";
128
+ if (__v != null && __v !== false)
129
+ __el2.setAttribute("data-state", __v === true ? "" : __v);
130
+ }
131
+ {
132
+ const __v = defaultOpen ? "" : "display: none";
133
+ if (__v != null && __v !== false)
134
+ __el2.setAttribute("style", __v === true ? "" : __v);
135
+ }
136
+ return __el2;
137
+ })();
138
+ const title = (() => {
139
+ const __el3 = __element("h2");
140
+ {
141
+ const __v = titleId;
142
+ if (__v != null && __v !== false)
143
+ __el3.setAttribute("id", __v === true ? "" : __v);
144
+ }
145
+ return __el3;
146
+ })();
147
+ const description = (() => {
148
+ const __el4 = __element("p");
149
+ {
150
+ const __v = descriptionId;
151
+ if (__v != null && __v !== false)
152
+ __el4.setAttribute("id", __v === true ? "" : __v);
153
+ }
154
+ return __el4;
155
+ })();
156
+ const cancel = (() => {
157
+ const __el5 = __element("button");
158
+ __el5.setAttribute("type", "button");
159
+ __on(__el5, "click", () => hide());
160
+ return __el5;
161
+ })();
162
+ const action = (() => {
163
+ const __el6 = __element("button");
164
+ __el6.setAttribute("type", "button");
165
+ __on(__el6, "click", () => {
166
+ onAction?.();
167
+ hide();
168
+ });
169
+ return __el6;
170
+ })();
171
+ if (defaultOpen) {
172
+ restoreFocus = saveFocus();
173
+ removeTrap = trapFocus(content);
174
+ queueMicrotask(() => cancel.focus());
175
+ }
176
+ return { trigger, overlay, content, title, description, cancel, action, state, show, hide };
177
+ }
178
+ var AlertDialog = {
179
+ Root: AlertDialogRoot
180
+ };
181
+
182
+ export { AlertDialog };
@@ -0,0 +1,108 @@
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
+ linkedIds
19
+ } from "./chunk-8y1jf6xr.js";
20
+
21
+ // src/dialog/dialog.ts
22
+ import { signal } from "@vertz/ui";
23
+ var Dialog = {
24
+ Root(options = {}) {
25
+ const { modal = true, defaultOpen = false, onOpenChange } = options;
26
+ const ids = linkedIds("dialog");
27
+ const titleId = `${ids.contentId}-title`;
28
+ const state = { open: signal(defaultOpen) };
29
+ let restoreFocus = null;
30
+ let removeTrap = null;
31
+ const trigger = document.createElement("button");
32
+ trigger.setAttribute("type", "button");
33
+ trigger.id = ids.triggerId;
34
+ trigger.setAttribute("aria-controls", ids.contentId);
35
+ setExpanded(trigger, defaultOpen);
36
+ setDataState(trigger, defaultOpen ? "open" : "closed");
37
+ const overlay = document.createElement("div");
38
+ overlay.setAttribute("data-dialog-overlay", "");
39
+ setHidden(overlay, !defaultOpen);
40
+ setDataState(overlay, defaultOpen ? "open" : "closed");
41
+ const content = document.createElement("div");
42
+ content.setAttribute("role", "dialog");
43
+ content.id = ids.contentId;
44
+ if (modal) {
45
+ content.setAttribute("aria-modal", "true");
46
+ }
47
+ setLabelledBy(content, titleId);
48
+ setHidden(content, !defaultOpen);
49
+ setDataState(content, defaultOpen ? "open" : "closed");
50
+ const title = document.createElement("h2");
51
+ title.id = titleId;
52
+ const close = document.createElement("button");
53
+ close.setAttribute("type", "button");
54
+ close.setAttribute("aria-label", "Close");
55
+ function openDialog() {
56
+ state.open.value = true;
57
+ setExpanded(trigger, true);
58
+ setHidden(overlay, false);
59
+ setHidden(content, false);
60
+ setDataState(trigger, "open");
61
+ setDataState(overlay, "open");
62
+ setDataState(content, "open");
63
+ restoreFocus = saveFocus();
64
+ if (modal) {
65
+ removeTrap = trapFocus(content);
66
+ }
67
+ queueMicrotask(() => focusFirst(content));
68
+ onOpenChange?.(true);
69
+ }
70
+ function closeDialog() {
71
+ state.open.value = false;
72
+ setExpanded(trigger, false);
73
+ setDataState(trigger, "closed");
74
+ setDataState(overlay, "closed");
75
+ setDataState(content, "closed");
76
+ setHiddenAnimated(overlay, true);
77
+ setHiddenAnimated(content, true);
78
+ removeTrap?.();
79
+ removeTrap = null;
80
+ restoreFocus?.();
81
+ restoreFocus = null;
82
+ onOpenChange?.(false);
83
+ }
84
+ trigger.addEventListener("click", () => {
85
+ if (state.open.peek()) {
86
+ closeDialog();
87
+ } else {
88
+ openDialog();
89
+ }
90
+ });
91
+ close.addEventListener("click", () => {
92
+ closeDialog();
93
+ });
94
+ overlay.addEventListener("click", () => {
95
+ closeDialog();
96
+ });
97
+ content.addEventListener("keydown", (event) => {
98
+ if (isKey(event, Keys.Escape)) {
99
+ event.preventDefault();
100
+ event.stopPropagation();
101
+ closeDialog();
102
+ }
103
+ });
104
+ return { trigger, overlay, content, title, close, state, show: openDialog, hide: closeDialog };
105
+ }
106
+ };
107
+
108
+ export { Dialog };
@@ -0,0 +1,61 @@
1
+ import {
2
+ setDataState,
3
+ setExpanded,
4
+ setHidden,
5
+ setHiddenAnimated
6
+ } from "./chunk-vvjyx7fe.js";
7
+ import {
8
+ linkedIds
9
+ } from "./chunk-8y1jf6xr.js";
10
+
11
+ // src/collapsible/collapsible.ts
12
+ import { signal } from "@vertz/ui";
13
+ var Collapsible = {
14
+ Root(options = {}) {
15
+ const { defaultOpen = false, disabled = false, onOpenChange } = options;
16
+ const ids = linkedIds("collapsible");
17
+ const state = {
18
+ open: signal(defaultOpen),
19
+ disabled: signal(disabled)
20
+ };
21
+ const root = document.createElement("div");
22
+ const trigger = document.createElement("button");
23
+ trigger.setAttribute("type", "button");
24
+ trigger.id = ids.triggerId;
25
+ trigger.setAttribute("aria-controls", ids.contentId);
26
+ setExpanded(trigger, defaultOpen);
27
+ setDataState(trigger, defaultOpen ? "open" : "closed");
28
+ if (disabled) {
29
+ trigger.disabled = true;
30
+ trigger.setAttribute("aria-disabled", "true");
31
+ }
32
+ const content = document.createElement("div");
33
+ content.id = ids.contentId;
34
+ setHidden(content, !defaultOpen);
35
+ setDataState(content, defaultOpen ? "open" : "closed");
36
+ function toggle() {
37
+ if (state.disabled.peek())
38
+ return;
39
+ const next = !state.open.peek();
40
+ state.open.value = next;
41
+ if (next) {
42
+ setHidden(content, false);
43
+ }
44
+ const height = content.scrollHeight;
45
+ content.style.setProperty("--collapsible-content-height", `${height}px`);
46
+ setExpanded(trigger, next);
47
+ setDataState(trigger, next ? "open" : "closed");
48
+ setDataState(content, next ? "open" : "closed");
49
+ if (!next) {
50
+ setHiddenAnimated(content, true);
51
+ }
52
+ onOpenChange?.(next);
53
+ }
54
+ trigger.addEventListener("click", toggle);
55
+ root.appendChild(trigger);
56
+ root.appendChild(content);
57
+ return { root, trigger, content, state };
58
+ }
59
+ };
60
+
61
+ export { Collapsible };