@vertz/ui-primitives 0.2.15 → 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,119 @@
1
+ // src/scroll-area/scroll-area.ts
2
+ import { signal } from "@vertz/ui";
3
+ var ScrollArea = {
4
+ Root(options = {}) {
5
+ const { orientation = "vertical" } = options;
6
+ const state = {
7
+ scrollTop: signal(0),
8
+ scrollLeft: signal(0)
9
+ };
10
+ const root = document.createElement("div");
11
+ root.style.position = "relative";
12
+ root.style.overflow = "hidden";
13
+ const viewport = document.createElement("div");
14
+ viewport.style.overflow = "scroll";
15
+ viewport.style.scrollbarWidth = "none";
16
+ const content = document.createElement("div");
17
+ const scrollbarY = document.createElement("div");
18
+ scrollbarY.setAttribute("aria-hidden", "true");
19
+ scrollbarY.setAttribute("data-orientation", "vertical");
20
+ const thumbY = document.createElement("div");
21
+ scrollbarY.appendChild(thumbY);
22
+ const scrollbarX = document.createElement("div");
23
+ scrollbarX.setAttribute("aria-hidden", "true");
24
+ scrollbarX.setAttribute("data-orientation", "horizontal");
25
+ const thumbX = document.createElement("div");
26
+ scrollbarX.appendChild(thumbX);
27
+ function syncThumbY() {
28
+ const { scrollTop, scrollHeight, clientHeight } = viewport;
29
+ if (scrollHeight <= clientHeight) {
30
+ thumbY.style.height = "0";
31
+ return;
32
+ }
33
+ const ratio = clientHeight / scrollHeight;
34
+ thumbY.style.height = `${ratio * 100}%`;
35
+ const scrollRatio = scrollTop / (scrollHeight - clientHeight);
36
+ thumbY.style.transform = `translateY(${scrollRatio * (1 / ratio - 1) * 100}%)`;
37
+ state.scrollTop.value = scrollTop;
38
+ }
39
+ function syncThumbX() {
40
+ const { scrollLeft, scrollWidth, clientWidth } = viewport;
41
+ if (scrollWidth <= clientWidth) {
42
+ thumbX.style.width = "0";
43
+ return;
44
+ }
45
+ const ratio = clientWidth / scrollWidth;
46
+ thumbX.style.width = `${ratio * 100}%`;
47
+ const scrollRatio = scrollLeft / (scrollWidth - clientWidth);
48
+ thumbX.style.transform = `translateX(${scrollRatio * (1 / ratio - 1) * 100}%)`;
49
+ state.scrollLeft.value = scrollLeft;
50
+ }
51
+ viewport.addEventListener("scroll", () => {
52
+ if (orientation === "vertical" || orientation === "both")
53
+ syncThumbY();
54
+ if (orientation === "horizontal" || orientation === "both")
55
+ syncThumbX();
56
+ });
57
+ let isDraggingY = false;
58
+ let startY = 0;
59
+ let startScrollTop = 0;
60
+ thumbY.addEventListener("pointerdown", (e) => {
61
+ isDraggingY = true;
62
+ startY = e.clientY;
63
+ startScrollTop = viewport.scrollTop;
64
+ thumbY.setPointerCapture(e.pointerId);
65
+ e.preventDefault();
66
+ });
67
+ thumbY.addEventListener("pointermove", (e) => {
68
+ if (!isDraggingY)
69
+ return;
70
+ const delta = e.clientY - startY;
71
+ const scrollbarHeight = scrollbarY.clientHeight;
72
+ const scrollRange = viewport.scrollHeight - viewport.clientHeight;
73
+ if (scrollbarHeight > 0) {
74
+ viewport.scrollTop = startScrollTop + delta / scrollbarHeight * scrollRange;
75
+ }
76
+ });
77
+ thumbY.addEventListener("pointerup", (e) => {
78
+ isDraggingY = false;
79
+ thumbY.releasePointerCapture(e.pointerId);
80
+ });
81
+ let isDraggingX = false;
82
+ let startX = 0;
83
+ let startScrollLeft = 0;
84
+ thumbX.addEventListener("pointerdown", (e) => {
85
+ isDraggingX = true;
86
+ startX = e.clientX;
87
+ startScrollLeft = viewport.scrollLeft;
88
+ thumbX.setPointerCapture(e.pointerId);
89
+ e.preventDefault();
90
+ });
91
+ thumbX.addEventListener("pointermove", (e) => {
92
+ if (!isDraggingX)
93
+ return;
94
+ const delta = e.clientX - startX;
95
+ const scrollbarWidth = scrollbarX.clientWidth;
96
+ const scrollRange = viewport.scrollWidth - viewport.clientWidth;
97
+ if (scrollbarWidth > 0) {
98
+ viewport.scrollLeft = startScrollLeft + delta / scrollbarWidth * scrollRange;
99
+ }
100
+ });
101
+ thumbX.addEventListener("pointerup", (e) => {
102
+ isDraggingX = false;
103
+ thumbX.releasePointerCapture(e.pointerId);
104
+ });
105
+ function update() {
106
+ syncThumbY();
107
+ syncThumbX();
108
+ }
109
+ viewport.appendChild(content);
110
+ root.appendChild(viewport);
111
+ if (orientation === "vertical" || orientation === "both")
112
+ root.appendChild(scrollbarY);
113
+ if (orientation === "horizontal" || orientation === "both")
114
+ root.appendChild(scrollbarX);
115
+ return { root, viewport, content, scrollbarY, thumbY, scrollbarX, thumbX, state, update };
116
+ }
117
+ };
118
+
119
+ export { ScrollArea };
@@ -0,0 +1,60 @@
1
+ // src/utils/keyboard.ts
2
+ var Keys = {
3
+ Enter: "Enter",
4
+ Space: " ",
5
+ Escape: "Escape",
6
+ ArrowUp: "ArrowUp",
7
+ ArrowDown: "ArrowDown",
8
+ ArrowLeft: "ArrowLeft",
9
+ ArrowRight: "ArrowRight",
10
+ Home: "Home",
11
+ End: "End",
12
+ Tab: "Tab"
13
+ };
14
+ function isKey(event, ...keys) {
15
+ return keys.includes(event.key);
16
+ }
17
+ function handleListNavigation(event, items, options = {}) {
18
+ const { orientation = "vertical", loop = true } = options;
19
+ if (items.length === 0)
20
+ return null;
21
+ const prevKey = orientation === "vertical" ? Keys.ArrowUp : Keys.ArrowLeft;
22
+ const nextKey = orientation === "vertical" ? Keys.ArrowDown : Keys.ArrowRight;
23
+ const currentIndex = items.indexOf(document.activeElement);
24
+ let nextIndex = -1;
25
+ if (isKey(event, prevKey)) {
26
+ event.preventDefault();
27
+ if (currentIndex <= 0) {
28
+ nextIndex = loop ? items.length - 1 : 0;
29
+ } else {
30
+ nextIndex = currentIndex - 1;
31
+ }
32
+ } else if (isKey(event, nextKey)) {
33
+ event.preventDefault();
34
+ if (currentIndex >= items.length - 1) {
35
+ nextIndex = loop ? 0 : items.length - 1;
36
+ } else {
37
+ nextIndex = currentIndex + 1;
38
+ }
39
+ } else if (isKey(event, Keys.Home)) {
40
+ event.preventDefault();
41
+ nextIndex = 0;
42
+ } else if (isKey(event, Keys.End)) {
43
+ event.preventDefault();
44
+ nextIndex = items.length - 1;
45
+ }
46
+ const target = items[nextIndex];
47
+ if (target) {
48
+ target.focus();
49
+ return target;
50
+ }
51
+ return null;
52
+ }
53
+ function handleActivation(event, handler) {
54
+ if (isKey(event, Keys.Enter, Keys.Space)) {
55
+ event.preventDefault();
56
+ handler();
57
+ }
58
+ }
59
+
60
+ export { Keys, isKey, handleListNavigation, handleActivation };
@@ -0,0 +1,149 @@
1
+ import {
2
+ Keys,
3
+ isKey
4
+ } from "./chunk-jctqs9m4.js";
5
+ import {
6
+ setDataState,
7
+ setValueRange
8
+ } from "./chunk-vvjyx7fe.js";
9
+
10
+ // src/resizable-panel/resizable-panel.ts
11
+ import { signal } from "@vertz/ui";
12
+ var ResizablePanel = {
13
+ Root(options = {}) {
14
+ const { orientation = "horizontal", onResize } = options;
15
+ const state = { sizes: signal([]) };
16
+ const panels = [];
17
+ const handles = [];
18
+ const root = document.createElement("div");
19
+ root.style.display = "flex";
20
+ root.style.flexDirection = orientation === "horizontal" ? "row" : "column";
21
+ root.setAttribute("data-orientation", orientation);
22
+ function updateSizes(newSizes) {
23
+ state.sizes.value = [...newSizes];
24
+ for (let i = 0;i < panels.length; i++) {
25
+ const panel = panels[i];
26
+ if (!panel)
27
+ continue;
28
+ const size = newSizes[i] ?? 0;
29
+ panel.el.style.flex = `0 0 ${size}%`;
30
+ }
31
+ for (let i = 0;i < handles.length; i++) {
32
+ const handle = handles[i];
33
+ const leftPanel = panels[i];
34
+ if (handle && leftPanel) {
35
+ const size = newSizes[i] ?? 0;
36
+ setValueRange(handle, Math.round(size), Math.round(leftPanel.minSize), Math.round(leftPanel.maxSize));
37
+ }
38
+ }
39
+ onResize?.(newSizes);
40
+ }
41
+ function Panel(panelOptions = {}) {
42
+ const { defaultSize, minSize = 0, maxSize = 100 } = panelOptions;
43
+ const el = document.createElement("div");
44
+ el.setAttribute("data-panel", "");
45
+ panels.push({ el, minSize, maxSize });
46
+ const sizes = state.sizes.peek();
47
+ if (defaultSize != null) {
48
+ sizes.push(defaultSize);
49
+ } else {
50
+ const equalSize = 100 / panels.length;
51
+ sizes.length = 0;
52
+ for (let i = 0;i < panels.length; i++) {
53
+ sizes.push(equalSize);
54
+ }
55
+ }
56
+ updateSizes(sizes);
57
+ root.appendChild(el);
58
+ return el;
59
+ }
60
+ function Handle() {
61
+ const handleIndex = handles.length;
62
+ const handle = document.createElement("div");
63
+ handle.setAttribute("role", "separator");
64
+ handle.setAttribute("tabindex", "0");
65
+ handle.setAttribute("data-orientation", orientation);
66
+ setDataState(handle, "idle");
67
+ handles.push(handle);
68
+ const STEP = 5;
69
+ handle.addEventListener("keydown", (event) => {
70
+ const sizes = [...state.sizes.peek()];
71
+ const leftIdx = handleIndex;
72
+ const rightIdx = handleIndex + 1;
73
+ const leftPanel = panels[leftIdx];
74
+ const rightPanel = panels[rightIdx];
75
+ if (!leftPanel || !rightPanel)
76
+ return;
77
+ let leftSize = sizes[leftIdx] ?? 0;
78
+ let rightSize = sizes[rightIdx] ?? 0;
79
+ const growKey = orientation === "horizontal" ? Keys.ArrowRight : Keys.ArrowDown;
80
+ const shrinkKey = orientation === "horizontal" ? Keys.ArrowLeft : Keys.ArrowUp;
81
+ if (isKey(event, growKey)) {
82
+ event.preventDefault();
83
+ const delta = Math.min(STEP, rightSize - rightPanel.minSize, leftPanel.maxSize - leftSize);
84
+ leftSize += delta;
85
+ rightSize -= delta;
86
+ } else if (isKey(event, shrinkKey)) {
87
+ event.preventDefault();
88
+ const delta = Math.min(STEP, leftSize - leftPanel.minSize, rightPanel.maxSize - rightSize);
89
+ leftSize -= delta;
90
+ rightSize += delta;
91
+ } else if (isKey(event, Keys.Home)) {
92
+ event.preventDefault();
93
+ const delta = leftSize - leftPanel.minSize;
94
+ leftSize -= delta;
95
+ rightSize += delta;
96
+ } else if (isKey(event, Keys.End)) {
97
+ event.preventDefault();
98
+ const delta = rightSize - rightPanel.minSize;
99
+ leftSize += delta;
100
+ rightSize -= delta;
101
+ } else {
102
+ return;
103
+ }
104
+ sizes[leftIdx] = leftSize;
105
+ sizes[rightIdx] = rightSize;
106
+ updateSizes(sizes);
107
+ });
108
+ handle.addEventListener("pointerdown", (event) => {
109
+ event.preventDefault();
110
+ handle.setPointerCapture(event.pointerId);
111
+ setDataState(handle, "dragging");
112
+ const startPos = orientation === "horizontal" ? event.clientX : event.clientY;
113
+ const rootSize = orientation === "horizontal" ? root.offsetWidth : root.offsetHeight;
114
+ const startSizes = [...state.sizes.peek()];
115
+ function onMove(e) {
116
+ const currentPos = orientation === "horizontal" ? e.clientX : e.clientY;
117
+ const delta = (currentPos - startPos) / rootSize * 100;
118
+ const sizes = [...startSizes];
119
+ const leftIdx = handleIndex;
120
+ const rightIdx = handleIndex + 1;
121
+ const leftPanel = panels[leftIdx];
122
+ const rightPanel = panels[rightIdx];
123
+ if (!leftPanel || !rightPanel)
124
+ return;
125
+ let newLeft = (startSizes[leftIdx] ?? 0) + delta;
126
+ let newRight = (startSizes[rightIdx] ?? 0) - delta;
127
+ newLeft = Math.max(leftPanel.minSize, Math.min(leftPanel.maxSize, newLeft));
128
+ newRight = Math.max(rightPanel.minSize, Math.min(rightPanel.maxSize, newRight));
129
+ sizes[leftIdx] = newLeft;
130
+ sizes[rightIdx] = newRight;
131
+ updateSizes(sizes);
132
+ }
133
+ function onUp(e) {
134
+ handle.releasePointerCapture(e.pointerId);
135
+ setDataState(handle, "idle");
136
+ handle.removeEventListener("pointermove", onMove);
137
+ handle.removeEventListener("pointerup", onUp);
138
+ }
139
+ handle.addEventListener("pointermove", onMove);
140
+ handle.addEventListener("pointerup", onUp);
141
+ });
142
+ root.appendChild(handle);
143
+ return handle;
144
+ }
145
+ return { root, state, Panel, Handle };
146
+ }
147
+ };
148
+
149
+ export { ResizablePanel };
@@ -0,0 +1,19 @@
1
+ import {
2
+ Menu
3
+ } from "./chunk-tvpgeswh.js";
4
+
5
+ // src/dropdown-menu/dropdown-menu.ts
6
+ var DropdownMenu = {
7
+ Root(options = {}) {
8
+ const { positioning, ...rest } = options;
9
+ return Menu.Root({
10
+ ...rest,
11
+ positioning: {
12
+ placement: "bottom-start",
13
+ ...positioning
14
+ }
15
+ });
16
+ }
17
+ };
18
+
19
+ export { DropdownMenu };
@@ -0,0 +1,73 @@
1
+ import {
2
+ setRovingTabindex
3
+ } from "./chunk-e2v1c9ex.js";
4
+ import {
5
+ handleListNavigation
6
+ } from "./chunk-jctqs9m4.js";
7
+ import {
8
+ setChecked,
9
+ setDataState
10
+ } from "./chunk-vvjyx7fe.js";
11
+ import {
12
+ uniqueId
13
+ } from "./chunk-8y1jf6xr.js";
14
+
15
+ // src/radio/radio.ts
16
+ import { signal } from "@vertz/ui";
17
+ var Radio = {
18
+ Root(options = {}) {
19
+ const { defaultValue = "", onValueChange } = options;
20
+ const state = { value: signal(defaultValue) };
21
+ const items = [];
22
+ const itemValues = [];
23
+ const root = document.createElement("div");
24
+ root.setAttribute("role", "radiogroup");
25
+ root.id = uniqueId("radiogroup");
26
+ function selectItem(value) {
27
+ state.value.value = value;
28
+ for (let i = 0;i < items.length; i++) {
29
+ const item = items[i];
30
+ if (!item)
31
+ continue;
32
+ const isActive = itemValues[i] === value;
33
+ setChecked(item, isActive);
34
+ setDataState(item, isActive ? "checked" : "unchecked");
35
+ }
36
+ setRovingTabindex(items, itemValues.indexOf(value));
37
+ onValueChange?.(value);
38
+ }
39
+ root.addEventListener("keydown", (event) => {
40
+ const result = handleListNavigation(event, items, { orientation: "vertical" });
41
+ if (result) {
42
+ const idx = items.indexOf(result);
43
+ if (idx >= 0) {
44
+ const val = itemValues[idx];
45
+ if (val !== undefined)
46
+ selectItem(val);
47
+ }
48
+ }
49
+ });
50
+ function Item(value, label) {
51
+ const item = document.createElement("div");
52
+ item.setAttribute("role", "radio");
53
+ item.id = uniqueId("radio");
54
+ item.setAttribute("data-value", value);
55
+ item.textContent = label ?? value;
56
+ const isActive = value === state.value.peek();
57
+ setChecked(item, isActive);
58
+ setDataState(item, isActive ? "checked" : "unchecked");
59
+ item.addEventListener("click", () => {
60
+ selectItem(value);
61
+ item.focus();
62
+ });
63
+ items.push(item);
64
+ itemValues.push(value);
65
+ root.appendChild(item);
66
+ setRovingTabindex(items, itemValues.indexOf(state.value.peek()));
67
+ return item;
68
+ }
69
+ return { root, state, Item };
70
+ }
71
+ };
72
+
73
+ export { Radio };
@@ -0,0 +1,175 @@
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
+ } from "./chunk-vvjyx7fe.js";
16
+ import {
17
+ linkedIds
18
+ } from "./chunk-8y1jf6xr.js";
19
+
20
+ // src/sheet/sheet.tsx
21
+ import { __element, __on } from "@vertz/ui/internals";
22
+ import { signal } from "@vertz/ui";
23
+ function SheetRoot(options = {}) {
24
+ const { side = "right", defaultOpen = false, onOpenChange } = options;
25
+ const ids = linkedIds("sheet");
26
+ const state = { open: signal(defaultOpen) };
27
+ let restoreFocus = null;
28
+ let removeTrap = null;
29
+ function show() {
30
+ state.open.value = true;
31
+ setExpanded(trigger, true);
32
+ setHidden(overlay, false);
33
+ setHidden(content, false);
34
+ setDataState(trigger, "open");
35
+ setDataState(overlay, "open");
36
+ setDataState(content, "open");
37
+ restoreFocus = saveFocus();
38
+ removeTrap = trapFocus(content);
39
+ queueMicrotask(() => focusFirst(content));
40
+ onOpenChange?.(true);
41
+ }
42
+ function hide() {
43
+ state.open.value = false;
44
+ setExpanded(trigger, false);
45
+ setDataState(trigger, "closed");
46
+ setDataState(overlay, "closed");
47
+ setDataState(content, "closed");
48
+ setHiddenAnimated(overlay, true);
49
+ setHiddenAnimated(content, true);
50
+ removeTrap?.();
51
+ removeTrap = null;
52
+ restoreFocus?.();
53
+ restoreFocus = null;
54
+ onOpenChange?.(false);
55
+ }
56
+ const SWIPE_THRESHOLD = 50;
57
+ let startX = 0;
58
+ let startY = 0;
59
+ function handlePointerDown(e) {
60
+ startX = e.clientX;
61
+ startY = e.clientY;
62
+ }
63
+ function handlePointerUp(e) {
64
+ if (!state.open.peek())
65
+ return;
66
+ const deltaX = e.clientX - startX;
67
+ const deltaY = e.clientY - startY;
68
+ const shouldDismiss = side === "right" && deltaX >= SWIPE_THRESHOLD || side === "left" && deltaX <= -SWIPE_THRESHOLD || side === "bottom" && deltaY >= SWIPE_THRESHOLD || side === "top" && deltaY <= -SWIPE_THRESHOLD;
69
+ if (shouldDismiss) {
70
+ hide();
71
+ }
72
+ }
73
+ const trigger = (() => {
74
+ const __el0 = __element("button");
75
+ __el0.setAttribute("type", "button");
76
+ {
77
+ const __v = ids.triggerId;
78
+ if (__v != null && __v !== false)
79
+ __el0.setAttribute("id", __v === true ? "" : __v);
80
+ }
81
+ {
82
+ const __v = ids.contentId;
83
+ if (__v != null && __v !== false)
84
+ __el0.setAttribute("aria-controls", __v === true ? "" : __v);
85
+ }
86
+ {
87
+ const __v = defaultOpen ? "true" : "false";
88
+ if (__v != null && __v !== false)
89
+ __el0.setAttribute("aria-expanded", __v === true ? "" : __v);
90
+ }
91
+ {
92
+ const __v = defaultOpen ? "open" : "closed";
93
+ if (__v != null && __v !== false)
94
+ __el0.setAttribute("data-state", __v === true ? "" : __v);
95
+ }
96
+ __on(__el0, "click", () => {
97
+ state.open.peek() ? hide() : show();
98
+ });
99
+ return __el0;
100
+ })();
101
+ const overlay = (() => {
102
+ const __el1 = __element("div");
103
+ __el1.setAttribute("data-sheet-overlay", "");
104
+ {
105
+ const __v = defaultOpen ? "false" : "true";
106
+ if (__v != null && __v !== false)
107
+ __el1.setAttribute("aria-hidden", __v === true ? "" : __v);
108
+ }
109
+ {
110
+ const __v = defaultOpen ? "open" : "closed";
111
+ if (__v != null && __v !== false)
112
+ __el1.setAttribute("data-state", __v === true ? "" : __v);
113
+ }
114
+ {
115
+ const __v = defaultOpen ? "" : "display: none";
116
+ if (__v != null && __v !== false)
117
+ __el1.setAttribute("style", __v === true ? "" : __v);
118
+ }
119
+ __on(__el1, "click", () => hide());
120
+ return __el1;
121
+ })();
122
+ const content = (() => {
123
+ const __el2 = __element("div");
124
+ __el2.setAttribute("role", "dialog");
125
+ __el2.setAttribute("aria-modal", "true");
126
+ {
127
+ const __v = ids.contentId;
128
+ if (__v != null && __v !== false)
129
+ __el2.setAttribute("id", __v === true ? "" : __v);
130
+ }
131
+ {
132
+ const __v = side;
133
+ if (__v != null && __v !== false)
134
+ __el2.setAttribute("data-side", __v === true ? "" : __v);
135
+ }
136
+ {
137
+ const __v = defaultOpen ? "false" : "true";
138
+ if (__v != null && __v !== false)
139
+ __el2.setAttribute("aria-hidden", __v === true ? "" : __v);
140
+ }
141
+ {
142
+ const __v = defaultOpen ? "open" : "closed";
143
+ if (__v != null && __v !== false)
144
+ __el2.setAttribute("data-state", __v === true ? "" : __v);
145
+ }
146
+ {
147
+ const __v = defaultOpen ? "" : "display: none";
148
+ if (__v != null && __v !== false)
149
+ __el2.setAttribute("style", __v === true ? "" : __v);
150
+ }
151
+ __on(__el2, "keydown", (event) => {
152
+ if (isKey(event, Keys.Escape)) {
153
+ event.preventDefault();
154
+ event.stopPropagation();
155
+ hide();
156
+ }
157
+ });
158
+ __on(__el2, "pointerdown", handlePointerDown);
159
+ __on(__el2, "pointerup", handlePointerUp);
160
+ return __el2;
161
+ })();
162
+ const close = (() => {
163
+ const __el3 = __element("button");
164
+ __el3.setAttribute("type", "button");
165
+ __el3.setAttribute("aria-label", "Close");
166
+ __on(__el3, "click", () => hide());
167
+ return __el3;
168
+ })();
169
+ return { trigger, overlay, content, close, state, show, hide };
170
+ }
171
+ var Sheet = {
172
+ Root: SheetRoot
173
+ };
174
+
175
+ export { Sheet };
@@ -0,0 +1,93 @@
1
+ import {
2
+ setRovingTabindex
3
+ } from "./chunk-e2v1c9ex.js";
4
+ import {
5
+ Keys,
6
+ handleListNavigation,
7
+ isKey
8
+ } from "./chunk-jctqs9m4.js";
9
+ import {
10
+ setDataState,
11
+ setPressed
12
+ } from "./chunk-vvjyx7fe.js";
13
+
14
+ // src/toggle-group/toggle-group.ts
15
+ import { signal } from "@vertz/ui";
16
+ var ToggleGroup = {
17
+ Root(options = {}) {
18
+ const {
19
+ type = "single",
20
+ defaultValue = [],
21
+ orientation = "horizontal",
22
+ disabled = false,
23
+ onValueChange
24
+ } = options;
25
+ const state = {
26
+ value: signal([...defaultValue]),
27
+ disabled: signal(disabled)
28
+ };
29
+ const items = [];
30
+ const root = document.createElement("div");
31
+ root.setAttribute("role", "group");
32
+ root.setAttribute("data-orientation", orientation);
33
+ function toggleValue(itemValue) {
34
+ if (state.disabled.peek())
35
+ return;
36
+ const current = [...state.value.peek()];
37
+ const idx = current.indexOf(itemValue);
38
+ if (type === "single") {
39
+ if (idx >= 0) {
40
+ current.length = 0;
41
+ } else {
42
+ current.length = 0;
43
+ current.push(itemValue);
44
+ }
45
+ } else {
46
+ if (idx >= 0) {
47
+ current.splice(idx, 1);
48
+ } else {
49
+ current.push(itemValue);
50
+ }
51
+ }
52
+ state.value.value = current;
53
+ onValueChange?.(current);
54
+ for (const item of items) {
55
+ const val = item.getAttribute("data-value") ?? "";
56
+ const isOn = current.includes(val);
57
+ setPressed(item, isOn);
58
+ setDataState(item, isOn ? "on" : "off");
59
+ }
60
+ }
61
+ root.addEventListener("keydown", (event) => {
62
+ if (isKey(event, Keys.ArrowLeft, Keys.ArrowRight, Keys.ArrowUp, Keys.ArrowDown, Keys.Home, Keys.End)) {
63
+ const result = handleListNavigation(event, items, { orientation });
64
+ if (result) {
65
+ const idx = items.indexOf(result);
66
+ if (idx >= 0) {
67
+ setRovingTabindex(items, idx);
68
+ }
69
+ }
70
+ }
71
+ });
72
+ function Item(value) {
73
+ const item = document.createElement("button");
74
+ item.setAttribute("type", "button");
75
+ item.setAttribute("data-value", value);
76
+ const isOn = state.value.peek().includes(value);
77
+ setPressed(item, isOn);
78
+ setDataState(item, isOn ? "on" : "off");
79
+ if (state.disabled.peek()) {
80
+ item.disabled = true;
81
+ item.setAttribute("aria-disabled", "true");
82
+ }
83
+ item.addEventListener("click", () => toggleValue(value));
84
+ items.push(item);
85
+ setRovingTabindex(items, 0);
86
+ root.appendChild(item);
87
+ return item;
88
+ }
89
+ return { root, state, Item };
90
+ }
91
+ };
92
+
93
+ export { ToggleGroup };