@mdigital_ui/ui 0.2.9 → 0.3.1

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 (143) hide show
  1. package/README.md +574 -994
  2. package/dist/accordion/index.js +1 -1
  3. package/dist/avatar/index.js +1 -1
  4. package/dist/badge/index.js +1 -1
  5. package/dist/breadcrumbs/index.js +1 -1
  6. package/dist/button/index.js +1 -1
  7. package/dist/button-group/index.js +1 -1
  8. package/dist/card/index.js +2 -1
  9. package/dist/cascader/index.js +2 -1
  10. package/dist/checkbox/index.js +1 -1
  11. package/dist/checkbox-group/index.js +1 -1
  12. package/dist/{chunk-4LSKRZOT.js → chunk-2PNLIQYM.js} +21 -4
  13. package/dist/chunk-2PNLIQYM.js.map +1 -0
  14. package/dist/{chunk-43RDFTC5.js → chunk-4TQ4BZ3S.js} +6 -4
  15. package/dist/chunk-4TQ4BZ3S.js.map +1 -0
  16. package/dist/{chunk-IMGVPMHJ.js → chunk-5JOJBDET.js} +47 -40
  17. package/dist/chunk-5JOJBDET.js.map +1 -0
  18. package/dist/{chunk-W3ES3UPV.js → chunk-5VORB55Y.js} +19 -3
  19. package/dist/chunk-5VORB55Y.js.map +1 -0
  20. package/dist/{chunk-3UCZ4GMN.js → chunk-6HGUDHHE.js} +4 -2
  21. package/dist/chunk-6HGUDHHE.js.map +1 -0
  22. package/dist/chunk-6YVT3AL2.js +211 -0
  23. package/dist/chunk-6YVT3AL2.js.map +1 -0
  24. package/dist/{chunk-CPDVBHA3.js → chunk-7KA7JSRX.js} +133 -23
  25. package/dist/chunk-7KA7JSRX.js.map +1 -0
  26. package/dist/chunk-CO766H7F.js +348 -0
  27. package/dist/chunk-CO766H7F.js.map +1 -0
  28. package/dist/{chunk-JIREY2VB.js → chunk-DHXVNO75.js} +3 -3
  29. package/dist/{chunk-JIREY2VB.js.map → chunk-DHXVNO75.js.map} +1 -1
  30. package/dist/chunk-DRL4CJMI.js +147 -0
  31. package/dist/chunk-DRL4CJMI.js.map +1 -0
  32. package/dist/{chunk-YAAV7FQG.js → chunk-FJPMIXWU.js} +15 -4
  33. package/dist/chunk-FJPMIXWU.js.map +1 -0
  34. package/dist/{chunk-MXDTUN3V.js → chunk-FZLFCT6Q.js} +141 -106
  35. package/dist/chunk-FZLFCT6Q.js.map +1 -0
  36. package/dist/chunk-GGDDE7LC.js +303 -0
  37. package/dist/chunk-GGDDE7LC.js.map +1 -0
  38. package/dist/{chunk-MRFCITKK.js → chunk-GVEEUHM2.js} +20 -16
  39. package/dist/chunk-GVEEUHM2.js.map +1 -0
  40. package/dist/{chunk-RYKVZFGB.js → chunk-HLY4VDIX.js} +7 -7
  41. package/dist/chunk-HLY4VDIX.js.map +1 -0
  42. package/dist/{chunk-2OUGJBXK.js → chunk-IVOMN6DV.js} +60 -14
  43. package/dist/chunk-IVOMN6DV.js.map +1 -0
  44. package/dist/{chunk-REKWBXAQ.js → chunk-J6IJBRYT.js} +12 -11
  45. package/dist/chunk-J6IJBRYT.js.map +1 -0
  46. package/dist/{chunk-LMR7TKDJ.js → chunk-KPM72QBO.js} +27 -10
  47. package/dist/chunk-KPM72QBO.js.map +1 -0
  48. package/dist/{chunk-QF3NJUUG.js → chunk-L572AMB3.js} +53 -8
  49. package/dist/chunk-L572AMB3.js.map +1 -0
  50. package/dist/{chunk-UUP7YGOS.js → chunk-LX4FDH4J.js} +3 -3
  51. package/dist/chunk-LX4FDH4J.js.map +1 -0
  52. package/dist/chunk-OL2GU2O3.js +293 -0
  53. package/dist/chunk-OL2GU2O3.js.map +1 -0
  54. package/dist/{chunk-N32VWE6V.js → chunk-RLYGJN56.js} +64 -60
  55. package/dist/chunk-RLYGJN56.js.map +1 -0
  56. package/dist/{chunk-X5SCI7KH.js → chunk-RZVEKAFR.js} +18 -6
  57. package/dist/chunk-RZVEKAFR.js.map +1 -0
  58. package/dist/chunk-T4MGK3WE.js +143 -0
  59. package/dist/chunk-T4MGK3WE.js.map +1 -0
  60. package/dist/{chunk-YFK2DHCY.js → chunk-TBMY5EQC.js} +10 -6
  61. package/dist/chunk-TBMY5EQC.js.map +1 -0
  62. package/dist/{chunk-PXOHJJBE.js → chunk-UHVPOGNC.js} +44 -9
  63. package/dist/chunk-UHVPOGNC.js.map +1 -0
  64. package/dist/{chunk-CMGCJXE5.js → chunk-UTKVWE76.js} +15 -4
  65. package/dist/chunk-UTKVWE76.js.map +1 -0
  66. package/dist/chunk-XQJ6HZ4Q.js +310 -0
  67. package/dist/chunk-XQJ6HZ4Q.js.map +1 -0
  68. package/dist/chunk-YJOLLSHH.js +132 -0
  69. package/dist/chunk-YJOLLSHH.js.map +1 -0
  70. package/dist/chunk-YWGWFGCY.js +332 -0
  71. package/dist/chunk-YWGWFGCY.js.map +1 -0
  72. package/dist/{chunk-FIGSNRWY.js → chunk-ZFYEAPEL.js} +40 -13
  73. package/dist/chunk-ZFYEAPEL.js.map +1 -0
  74. package/dist/chunk-ZRSSFP52.js +345 -0
  75. package/dist/chunk-ZRSSFP52.js.map +1 -0
  76. package/dist/clipboard/index.js +2 -1
  77. package/dist/collapse/index.js +2 -1
  78. package/dist/command/index.js +1 -1
  79. package/dist/context-menu/index.js +1 -1
  80. package/dist/date-picker/index.js +1 -1
  81. package/dist/descriptions/index.js +1 -1
  82. package/dist/float-input/index.js +6 -0
  83. package/dist/form/index.js +4 -0
  84. package/dist/form/index.js.map +1 -0
  85. package/dist/index.js +38 -30
  86. package/dist/index.js.map +1 -1
  87. package/dist/link/index.js +4 -0
  88. package/dist/link/index.js.map +1 -0
  89. package/dist/menubar/index.js +6 -0
  90. package/dist/menubar/index.js.map +1 -0
  91. package/dist/navigation-menu/index.js +4 -0
  92. package/dist/navigation-menu/index.js.map +1 -0
  93. package/dist/number-input/index.js +6 -0
  94. package/dist/number-input/index.js.map +1 -0
  95. package/dist/pagination/index.js +1 -1
  96. package/dist/progress/index.js +1 -1
  97. package/dist/scroll-area/index.js +4 -0
  98. package/dist/scroll-area/index.js.map +1 -0
  99. package/dist/select/index.js +1 -1
  100. package/dist/slider/index.js +1 -1
  101. package/dist/table/index.js +4 -4
  102. package/dist/timeline/index.js +4 -0
  103. package/dist/timeline/index.js.map +1 -0
  104. package/dist/toast/index.js +5 -0
  105. package/dist/toast/index.js.map +1 -0
  106. package/dist/transfer/index.js +2 -2
  107. package/dist/upload/index.js +1 -1
  108. package/package.json +72 -14
  109. package/dist/chart/index.js +0 -4
  110. package/dist/chunk-2OUGJBXK.js.map +0 -1
  111. package/dist/chunk-3UCZ4GMN.js.map +0 -1
  112. package/dist/chunk-43RDFTC5.js.map +0 -1
  113. package/dist/chunk-4LSKRZOT.js.map +0 -1
  114. package/dist/chunk-C5YO5VZS.js +0 -448
  115. package/dist/chunk-C5YO5VZS.js.map +0 -1
  116. package/dist/chunk-CMGCJXE5.js.map +0 -1
  117. package/dist/chunk-CPDVBHA3.js.map +0 -1
  118. package/dist/chunk-FIGSNRWY.js.map +0 -1
  119. package/dist/chunk-H47C2ENJ.js +0 -215
  120. package/dist/chunk-H47C2ENJ.js.map +0 -1
  121. package/dist/chunk-IMGVPMHJ.js.map +0 -1
  122. package/dist/chunk-LMR7TKDJ.js.map +0 -1
  123. package/dist/chunk-MRFCITKK.js.map +0 -1
  124. package/dist/chunk-MXDTUN3V.js.map +0 -1
  125. package/dist/chunk-N32VWE6V.js.map +0 -1
  126. package/dist/chunk-PXOHJJBE.js.map +0 -1
  127. package/dist/chunk-QF3NJUUG.js.map +0 -1
  128. package/dist/chunk-REKWBXAQ.js.map +0 -1
  129. package/dist/chunk-RYKVZFGB.js.map +0 -1
  130. package/dist/chunk-UUP7YGOS.js.map +0 -1
  131. package/dist/chunk-W3ES3UPV.js.map +0 -1
  132. package/dist/chunk-X5SCI7KH.js.map +0 -1
  133. package/dist/chunk-YAAV7FQG.js.map +0 -1
  134. package/dist/chunk-YFK2DHCY.js.map +0 -1
  135. package/dist/index.d.ts +0 -5220
  136. package/dist/styles/base.css +0 -5906
  137. package/dist/styles/global.css +0 -6401
  138. package/dist/styles/themes/dark.css +0 -93
  139. package/dist/styles/themes/light.css +0 -89
  140. package/dist/styles/themes/presets/corporate.css +0 -126
  141. package/dist/styles/themes/presets/minimal.css +0 -126
  142. package/dist/styles/themes/presets/vibrant.css +0 -126
  143. /package/dist/{chart → float-input}/index.js.map +0 -0
@@ -0,0 +1,293 @@
1
+ import { Popover, PopoverTrigger, PopoverContent } from './chunk-WTGCXWNX.js';
2
+ import { cn } from './chunk-NGYLRX6F.js';
3
+ import { ChevronRight, Check, Circle } from 'lucide-react';
4
+ import React, { useState, useCallback, useEffect } from 'react';
5
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
6
+
7
+ var MenuItems = React.memo(({ items, classNames, onItemClick }) => {
8
+ const [activeSubmenu, setActiveSubmenu] = useState(null);
9
+ return /* @__PURE__ */ jsx(Fragment, { children: items.map((item, idx) => {
10
+ if (item.separator) {
11
+ return /* @__PURE__ */ jsx(
12
+ "div",
13
+ {
14
+ "data-slot": "separator",
15
+ className: cn("menubar_separator h-px bg-border my-1", classNames?.separator),
16
+ role: "separator"
17
+ },
18
+ item.key || `separator-${idx}`
19
+ );
20
+ }
21
+ if (item.type === "label") {
22
+ return /* @__PURE__ */ jsx(
23
+ "div",
24
+ {
25
+ "data-slot": "label",
26
+ className: cn(
27
+ "menubar_label px-3 py-1.5 text-xs font-semibold text-text-secondary",
28
+ classNames?.label
29
+ ),
30
+ role: "presentation",
31
+ children: item.label
32
+ },
33
+ item.key
34
+ );
35
+ }
36
+ const isCheckboxOrRadio = item.type === "checkbox" || item.type === "radio";
37
+ const hasChildren = item.children && item.children.length > 0;
38
+ if (hasChildren) {
39
+ return /* @__PURE__ */ jsxs(
40
+ Popover,
41
+ {
42
+ open: activeSubmenu === item.key,
43
+ onOpenChange: (open) => setActiveSubmenu(open ? item.key : null),
44
+ children: [
45
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(
46
+ "div",
47
+ {
48
+ "data-slot": "item",
49
+ className: cn(
50
+ "menubar_item relative flex items-center gap-2 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1",
51
+ item.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-surface focus:bg-surface focus:outline-none",
52
+ classNames?.item
53
+ ),
54
+ role: "menuitem",
55
+ "aria-disabled": item.disabled,
56
+ "aria-haspopup": "menu",
57
+ tabIndex: item.disabled ? -1 : 0,
58
+ onMouseEnter: () => !item.disabled && setActiveSubmenu(item.key),
59
+ onKeyDown: (e) => {
60
+ if (e.key === "ArrowRight") {
61
+ e.preventDefault();
62
+ if (!item.disabled) setActiveSubmenu(item.key);
63
+ } else if (e.key === "ArrowLeft") {
64
+ e.preventDefault();
65
+ setActiveSubmenu(null);
66
+ }
67
+ },
68
+ children: [
69
+ item.icon && /* @__PURE__ */ jsx("span", { className: "w-4 h-4 shrink-0", children: item.icon }),
70
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: item.label }),
71
+ /* @__PURE__ */ jsx(ChevronRight, { className: "w-4 h-4 ml-2 shrink-0" })
72
+ ]
73
+ }
74
+ ) }),
75
+ /* @__PURE__ */ jsx(
76
+ PopoverContent,
77
+ {
78
+ side: "right",
79
+ align: "start",
80
+ sideOffset: 4,
81
+ "data-slot": "submenu",
82
+ className: cn(
83
+ "menubar_submenu min-w-[200px] w-auto p-1 rounded-md",
84
+ classNames?.submenu
85
+ ),
86
+ onOpenAutoFocus: (e) => e.preventDefault(),
87
+ onCloseAutoFocus: (e) => e.preventDefault(),
88
+ children: /* @__PURE__ */ jsx(MenuItems, { items: item.children, classNames, onItemClick })
89
+ }
90
+ )
91
+ ]
92
+ },
93
+ item.key
94
+ );
95
+ }
96
+ return /* @__PURE__ */ jsxs(
97
+ "div",
98
+ {
99
+ "data-slot": "item",
100
+ className: cn(
101
+ "menubar_item relative flex items-center gap-2 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1",
102
+ item.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-surface focus:bg-surface focus:outline-none",
103
+ isCheckboxOrRadio && classNames?.checkboxItem,
104
+ item.type === "radio" && classNames?.radioItem,
105
+ classNames?.item
106
+ ),
107
+ role: item.type === "checkbox" ? "menuitemcheckbox" : item.type === "radio" ? "menuitemradio" : "menuitem",
108
+ "aria-disabled": item.disabled,
109
+ "aria-checked": isCheckboxOrRadio ? item.checked : void 0,
110
+ tabIndex: item.disabled ? -1 : 0,
111
+ onClick: () => !item.disabled && onItemClick(item),
112
+ onKeyDown: (e) => {
113
+ if (e.key === "Enter" || e.key === " ") {
114
+ e.preventDefault();
115
+ if (!item.disabled) onItemClick(item);
116
+ }
117
+ },
118
+ children: [
119
+ isCheckboxOrRadio && /* @__PURE__ */ jsx("span", { className: "w-4 h-4 shrink-0", children: item.checked && /* @__PURE__ */ jsxs(Fragment, { children: [
120
+ item.type === "checkbox" && /* @__PURE__ */ jsx(Check, { className: "w-4 h-4" }),
121
+ item.type === "radio" && /* @__PURE__ */ jsx(Circle, { className: "w-4 h-4 fill-current" })
122
+ ] }) }),
123
+ item.icon && !isCheckboxOrRadio && /* @__PURE__ */ jsx("span", { className: "w-4 h-4 shrink-0", children: item.icon }),
124
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: item.label }),
125
+ item.shortcut && /* @__PURE__ */ jsx(
126
+ "span",
127
+ {
128
+ "data-slot": "shortcut",
129
+ className: cn(
130
+ "menubar_shortcut text-xs text-text-secondary ml-auto",
131
+ classNames?.shortcut
132
+ ),
133
+ children: item.shortcut
134
+ }
135
+ )
136
+ ]
137
+ },
138
+ item.key
139
+ );
140
+ }) });
141
+ });
142
+ MenuItems.displayName = "MenuItems";
143
+ var Menubar = React.memo(({ menus, className, classNames, ref }) => {
144
+ const [activeMenu, setActiveMenu] = useState(null);
145
+ const [hoverMode, setHoverMode] = useState(false);
146
+ const handleMenuClick = useCallback((menuKey, disabled) => {
147
+ if (disabled) return;
148
+ setActiveMenu((prev) => prev === menuKey ? null : menuKey);
149
+ setHoverMode(true);
150
+ }, []);
151
+ const handleMenuHover = useCallback(
152
+ (menuKey, disabled) => {
153
+ if (disabled) return;
154
+ if (hoverMode && activeMenu !== null) {
155
+ setActiveMenu(menuKey);
156
+ }
157
+ },
158
+ [hoverMode, activeMenu]
159
+ );
160
+ const handleClose = useCallback(() => {
161
+ setActiveMenu(null);
162
+ setHoverMode(false);
163
+ }, []);
164
+ const handleItemClick = useCallback(
165
+ (item) => {
166
+ if (item.type === "checkbox") {
167
+ item.onCheckedChange?.(!item.checked);
168
+ } else if (item.type === "radio") {
169
+ item.onCheckedChange?.(true);
170
+ } else {
171
+ item.onClick?.();
172
+ }
173
+ handleClose();
174
+ },
175
+ [handleClose]
176
+ );
177
+ useEffect(() => {
178
+ if (!activeMenu) return;
179
+ const handleKeyDown = (e) => {
180
+ const currentIndex = menus.findIndex((m) => m.key === activeMenu);
181
+ if (e.key === "Escape") {
182
+ e.preventDefault();
183
+ handleClose();
184
+ } else if (e.key === "ArrowRight") {
185
+ const nextIndex = (currentIndex + 1) % menus.length;
186
+ const nextMenu = menus[nextIndex];
187
+ if (nextMenu && !nextMenu.disabled) {
188
+ e.preventDefault();
189
+ setActiveMenu(nextMenu.key);
190
+ }
191
+ } else if (e.key === "ArrowLeft") {
192
+ const prevIndex = currentIndex - 1 < 0 ? menus.length - 1 : currentIndex - 1;
193
+ const prevMenu = menus[prevIndex];
194
+ if (prevMenu && !prevMenu.disabled) {
195
+ e.preventDefault();
196
+ setActiveMenu(prevMenu.key);
197
+ }
198
+ }
199
+ };
200
+ document.addEventListener("keydown", handleKeyDown);
201
+ return () => document.removeEventListener("keydown", handleKeyDown);
202
+ }, [activeMenu, menus, handleClose]);
203
+ return /* @__PURE__ */ jsx(
204
+ "div",
205
+ {
206
+ ref,
207
+ "data-slot": "root",
208
+ className: cn(
209
+ "menubar_root flex items-center gap-1 px-2 py-1 bg-background border-b border-border",
210
+ className,
211
+ classNames?.root
212
+ ),
213
+ role: "menubar",
214
+ children: menus.map((menu) => /* @__PURE__ */ jsxs(
215
+ Popover,
216
+ {
217
+ open: activeMenu === menu.key,
218
+ onOpenChange: (open) => {
219
+ if (open) {
220
+ setActiveMenu(menu.key);
221
+ setHoverMode(true);
222
+ } else {
223
+ handleClose();
224
+ }
225
+ },
226
+ children: [
227
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
228
+ "button",
229
+ {
230
+ "data-slot": "trigger",
231
+ className: cn(
232
+ "menubar_trigger px-3 py-1.5 text-sm rounded-sm transition-colors",
233
+ menu.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-surface focus:bg-surface focus:outline-none",
234
+ activeMenu === menu.key && "bg-surface",
235
+ classNames?.trigger
236
+ ),
237
+ role: "menuitem",
238
+ "aria-haspopup": "menu",
239
+ "aria-expanded": activeMenu === menu.key,
240
+ "aria-disabled": menu.disabled,
241
+ onClick: () => handleMenuClick(menu.key, menu.disabled),
242
+ onMouseEnter: () => handleMenuHover(menu.key, menu.disabled),
243
+ onKeyDown: (e) => {
244
+ if (e.key === "Enter" || e.key === " ") {
245
+ e.preventDefault();
246
+ handleMenuClick(menu.key, menu.disabled);
247
+ }
248
+ },
249
+ children: menu.label
250
+ }
251
+ ) }),
252
+ /* @__PURE__ */ jsx(
253
+ PopoverContent,
254
+ {
255
+ side: "bottom",
256
+ align: "start",
257
+ sideOffset: 2,
258
+ "data-slot": "content",
259
+ className: cn(
260
+ "menubar_content min-w-[200px] w-auto p-1 rounded-md",
261
+ classNames?.content
262
+ ),
263
+ onOpenAutoFocus: (e) => e.preventDefault(),
264
+ onCloseAutoFocus: (e) => e.preventDefault(),
265
+ onPointerDownOutside: (e) => {
266
+ const target = e.target;
267
+ if (target.closest('[data-slot="root"]')) {
268
+ e.preventDefault();
269
+ }
270
+ },
271
+ children: /* @__PURE__ */ jsx(
272
+ MenuItems,
273
+ {
274
+ items: menu.items,
275
+ classNames,
276
+ onItemClick: handleItemClick
277
+ }
278
+ )
279
+ }
280
+ )
281
+ ]
282
+ },
283
+ menu.key
284
+ ))
285
+ }
286
+ );
287
+ });
288
+ Menubar.displayName = "Menubar";
289
+ var menubar_default = Menubar;
290
+
291
+ export { menubar_default };
292
+ //# sourceMappingURL=chunk-OL2GU2O3.js.map
293
+ //# sourceMappingURL=chunk-OL2GU2O3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/menubar/index.tsx"],"names":[],"mappings":"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","file":"chunk-OL2GU2O3.js","sourcesContent":["'use client'\n\nimport { ChevronRight, Check, Circle } from 'lucide-react'\nimport React, { useState, useCallback, useEffect } from 'react'\n\nimport { Popover, PopoverTrigger, PopoverContent } from '../popover'\nimport { cn } from '../utils'\nimport type { MenubarProps, MenubarItem } from './types'\n\ninterface MenuItemsProps {\n items: MenubarItem[]\n classNames?: MenubarProps['classNames']\n onItemClick: (item: MenubarItem) => void\n}\n\nconst MenuItems = React.memo<MenuItemsProps>(({ items, classNames, onItemClick }) => {\n const [activeSubmenu, setActiveSubmenu] = useState<string | null>(null)\n\n return (\n <>\n {items.map((item, idx) => {\n if (item.separator) {\n return (\n <div\n key={item.key || `separator-${idx}`}\n data-slot=\"separator\"\n className={cn('menubar_separator h-px bg-border my-1', classNames?.separator)}\n role=\"separator\"\n />\n )\n }\n\n if (item.type === 'label') {\n return (\n <div\n key={item.key}\n data-slot=\"label\"\n className={cn(\n 'menubar_label px-3 py-1.5 text-xs font-semibold text-text-secondary',\n classNames?.label,\n )}\n role=\"presentation\"\n >\n {item.label}\n </div>\n )\n }\n\n const isCheckboxOrRadio = item.type === 'checkbox' || item.type === 'radio'\n const hasChildren = item.children && item.children.length > 0\n\n if (hasChildren) {\n return (\n <Popover\n key={item.key}\n open={activeSubmenu === item.key}\n onOpenChange={(open) => setActiveSubmenu(open ? item.key : null)}\n >\n <PopoverTrigger asChild>\n <div\n data-slot=\"item\"\n className={cn(\n 'menubar_item relative flex items-center gap-2 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1',\n item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus:bg-surface focus:outline-none',\n classNames?.item,\n )}\n role=\"menuitem\"\n aria-disabled={item.disabled}\n aria-haspopup=\"menu\"\n tabIndex={item.disabled ? -1 : 0}\n onMouseEnter={() => !item.disabled && setActiveSubmenu(item.key)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight') {\n e.preventDefault()\n if (!item.disabled) setActiveSubmenu(item.key)\n } else if (e.key === 'ArrowLeft') {\n e.preventDefault()\n setActiveSubmenu(null)\n }\n }}\n >\n {item.icon && <span className=\"w-4 h-4 shrink-0\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n <ChevronRight className=\"w-4 h-4 ml-2 shrink-0\" />\n </div>\n </PopoverTrigger>\n <PopoverContent\n side=\"right\"\n align=\"start\"\n sideOffset={4}\n data-slot=\"submenu\"\n className={cn(\n 'menubar_submenu min-w-[200px] w-auto p-1 rounded-md',\n classNames?.submenu,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <MenuItems items={item.children!} classNames={classNames} onItemClick={onItemClick} />\n </PopoverContent>\n </Popover>\n )\n }\n\n return (\n <div\n key={item.key}\n data-slot=\"item\"\n className={cn(\n 'menubar_item relative flex items-center gap-2 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1',\n item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus:bg-surface focus:outline-none',\n isCheckboxOrRadio && classNames?.checkboxItem,\n item.type === 'radio' && classNames?.radioItem,\n classNames?.item,\n )}\n role={\n item.type === 'checkbox'\n ? 'menuitemcheckbox'\n : item.type === 'radio'\n ? 'menuitemradio'\n : 'menuitem'\n }\n aria-disabled={item.disabled}\n aria-checked={isCheckboxOrRadio ? item.checked : undefined}\n tabIndex={item.disabled ? -1 : 0}\n onClick={() => !item.disabled && onItemClick(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n if (!item.disabled) onItemClick(item)\n }\n }}\n >\n {isCheckboxOrRadio && (\n <span className=\"w-4 h-4 shrink-0\">\n {item.checked && (\n <>\n {item.type === 'checkbox' && <Check className=\"w-4 h-4\" />}\n {item.type === 'radio' && <Circle className=\"w-4 h-4 fill-current\" />}\n </>\n )}\n </span>\n )}\n {item.icon && !isCheckboxOrRadio && (\n <span className=\"w-4 h-4 shrink-0\">{item.icon}</span>\n )}\n <span className=\"flex-1\">{item.label}</span>\n {item.shortcut && (\n <span\n data-slot=\"shortcut\"\n className={cn(\n 'menubar_shortcut text-xs text-text-secondary ml-auto',\n classNames?.shortcut,\n )}\n >\n {item.shortcut}\n </span>\n )}\n </div>\n )\n })}\n </>\n )\n})\n\nMenuItems.displayName = 'MenuItems'\n\nconst Menubar = React.memo<MenubarProps>(({ menus, className, classNames, ref }) => {\n const [activeMenu, setActiveMenu] = useState<string | null>(null)\n const [hoverMode, setHoverMode] = useState(false)\n\n const handleMenuClick = useCallback((menuKey: string, disabled?: boolean) => {\n if (disabled) return\n setActiveMenu((prev) => (prev === menuKey ? null : menuKey))\n setHoverMode(true)\n }, [])\n\n const handleMenuHover = useCallback(\n (menuKey: string, disabled?: boolean) => {\n if (disabled) return\n if (hoverMode && activeMenu !== null) {\n setActiveMenu(menuKey)\n }\n },\n [hoverMode, activeMenu],\n )\n\n const handleClose = useCallback(() => {\n setActiveMenu(null)\n setHoverMode(false)\n }, [])\n\n const handleItemClick = useCallback(\n (item: MenubarItem) => {\n if (item.type === 'checkbox') {\n item.onCheckedChange?.(!item.checked)\n } else if (item.type === 'radio') {\n item.onCheckedChange?.(true)\n } else {\n item.onClick?.()\n }\n handleClose()\n },\n [handleClose],\n )\n\n // Keyboard navigation for switching between top-level menus\n useEffect(() => {\n if (!activeMenu) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const currentIndex = menus.findIndex((m) => m.key === activeMenu)\n\n if (e.key === 'Escape') {\n e.preventDefault()\n handleClose()\n } else if (e.key === 'ArrowRight') {\n const nextIndex = (currentIndex + 1) % menus.length\n const nextMenu = menus[nextIndex]\n if (nextMenu && !nextMenu.disabled) {\n e.preventDefault()\n setActiveMenu(nextMenu.key)\n }\n } else if (e.key === 'ArrowLeft') {\n const prevIndex = currentIndex - 1 < 0 ? menus.length - 1 : currentIndex - 1\n const prevMenu = menus[prevIndex]\n if (prevMenu && !prevMenu.disabled) {\n e.preventDefault()\n setActiveMenu(prevMenu.key)\n }\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [activeMenu, menus, handleClose])\n\n return (\n <div\n ref={ref}\n data-slot=\"root\"\n className={cn(\n 'menubar_root flex items-center gap-1 px-2 py-1 bg-background border-b border-border',\n className,\n classNames?.root,\n )}\n role=\"menubar\"\n >\n {menus.map((menu) => (\n <Popover\n key={menu.key}\n open={activeMenu === menu.key}\n onOpenChange={(open) => {\n if (open) {\n setActiveMenu(menu.key)\n setHoverMode(true)\n } else {\n handleClose()\n }\n }}\n >\n <PopoverTrigger asChild>\n <button\n data-slot=\"trigger\"\n className={cn(\n 'menubar_trigger px-3 py-1.5 text-sm rounded-sm transition-colors',\n menu.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'hover:bg-surface focus:bg-surface focus:outline-none',\n activeMenu === menu.key && 'bg-surface',\n classNames?.trigger,\n )}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={activeMenu === menu.key}\n aria-disabled={menu.disabled}\n onClick={() => handleMenuClick(menu.key, menu.disabled)}\n onMouseEnter={() => handleMenuHover(menu.key, menu.disabled)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleMenuClick(menu.key, menu.disabled)\n }\n }}\n >\n {menu.label}\n </button>\n </PopoverTrigger>\n <PopoverContent\n side=\"bottom\"\n align=\"start\"\n sideOffset={2}\n data-slot=\"content\"\n className={cn(\n 'menubar_content min-w-[200px] w-auto p-1 rounded-md',\n classNames?.content,\n )}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n onPointerDownOutside={(e) => {\n // Prevent Radix from closing when clicking another menu trigger\n const target = e.target as HTMLElement\n if (target.closest('[data-slot=\"root\"]')) {\n e.preventDefault()\n }\n }}\n >\n <MenuItems\n items={menu.items}\n classNames={classNames}\n onItemClick={handleItemClick}\n />\n </PopoverContent>\n </Popover>\n ))}\n </div>\n )\n})\n\nMenubar.displayName = 'Menubar'\n\nexport type * from './types'\nexport default Menubar\n"]}
@@ -1,7 +1,7 @@
1
- import { checkboxBorderColorClasses, checkedColorClasses, textColorClasses } from './chunk-LK4EPTNG.js';
1
+ import { checkboxBorderColorClasses, focusRingColorClasses, textColorClasses } from './chunk-LK4EPTNG.js';
2
2
  import { cn, iconSizes } from './chunk-NGYLRX6F.js';
3
3
  import { cva } from 'class-variance-authority';
4
- import { Check } from 'lucide-react';
4
+ import { Minus, Check } from 'lucide-react';
5
5
  import React, { useState, useId, useCallback, useEffect } from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
 
@@ -19,7 +19,7 @@ function useMergeRefs(...refs) {
19
19
  }, []);
20
20
  }
21
21
  var checkboxVariants = cva(
22
- "appearance-none rounded border bg-background cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed outline-none",
22
+ "appearance-none rounded border bg-background cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-background",
23
23
  {
24
24
  variants: {
25
25
  color: checkboxBorderColorClasses,
@@ -52,7 +52,6 @@ var Checkbox = React.memo(
52
52
  checked,
53
53
  defaultChecked,
54
54
  ref,
55
- labelClassName,
56
55
  classNames,
57
56
  ...props
58
57
  }) => {
@@ -66,21 +65,23 @@ var Checkbox = React.memo(
66
65
  const mergedRef = useMergeRefs(ref, internalRef);
67
66
  const isControlled = checked !== void 0;
68
67
  const currentChecked = isControlled ? checked : internalChecked;
68
+ const onChangeRef = React.useRef(props.onChange);
69
+ onChangeRef.current = props.onChange;
69
70
  const onChange = useCallback(
70
71
  (event) => {
71
72
  if (!isControlled) {
72
73
  setInternalChecked(event.target.checked);
73
74
  }
74
- props.onChange?.(event);
75
+ onChangeRef.current?.(event);
75
76
  },
76
- [isControlled, props.onChange]
77
+ [isControlled]
77
78
  );
78
79
  useEffect(() => {
79
80
  if (internalRef.current) {
80
81
  internalRef.current.indeterminate = indeterminate;
81
82
  }
82
83
  }, [indeterminate]);
83
- const checkboxElement = /* @__PURE__ */ jsxs("div", { className: "relative inline-flex", children: [
84
+ const checkboxElement = /* @__PURE__ */ jsxs("div", { className: "relative inline-flex", "data-slot": "wrapper", children: [
84
85
  /* @__PURE__ */ jsx(
85
86
  "input",
86
87
  {
@@ -89,6 +90,7 @@ var Checkbox = React.memo(
89
90
  className: cn(
90
91
  "checkbox_checkbox",
91
92
  checkboxVariants({ color, size, error: !!error }),
93
+ focusRingColorClasses[color],
92
94
  className,
93
95
  classNames?.checkbox
94
96
  ),
@@ -97,10 +99,11 @@ var Checkbox = React.memo(
97
99
  "aria-describedby": hasHelperText ? helperId : void 0,
98
100
  ...props,
99
101
  onChange,
100
- checked: currentChecked
102
+ checked: currentChecked,
103
+ "data-slot": "checkbox"
101
104
  }
102
105
  ),
103
- currentChecked && /* @__PURE__ */ jsx(
106
+ (currentChecked || indeterminate) && /* @__PURE__ */ jsx(
104
107
  "div",
105
108
  {
106
109
  className: cn(
@@ -108,65 +111,66 @@ var Checkbox = React.memo(
108
111
  "absolute inset-0 flex items-center justify-center pointer-events-none",
109
112
  classNames?.indicator
110
113
  ),
111
- children: indeterminate ? /* @__PURE__ */ jsx(
112
- "div",
113
- {
114
- className: cn(
115
- "w-[70%] h-[70%] rounded-xs border-2 border-background flex items-center justify-center",
116
- checkedColorClasses[color]
117
- )
118
- }
119
- ) : /* @__PURE__ */ jsx(Check, { className: cn(iconSizes[size], textColorClasses[color]) })
114
+ "data-slot": "indicator",
115
+ children: indeterminate ? /* @__PURE__ */ jsx(Minus, { className: cn(iconSizes[size], textColorClasses[color]), strokeWidth: 3 }) : /* @__PURE__ */ jsx(Check, { className: cn(iconSizes[size], textColorClasses[color]) })
120
116
  }
121
117
  )
122
118
  ] });
123
119
  if (!label && !helperText && !error) return checkboxElement;
124
- return /* @__PURE__ */ jsxs("div", { className: cn("checkbox_root", "w-full", classNames?.root), children: [
125
- /* @__PURE__ */ jsxs(
126
- "label",
127
- {
128
- className: cn(
129
- "flex items-center gap-2",
130
- !props.disabled && "cursor-pointer"
131
- ),
132
- children: [
133
- checkboxElement,
134
- label && /* @__PURE__ */ jsx(
135
- "span",
136
- {
137
- className: cn(
138
- "checkbox_label",
139
- "text-sm text-text-primary select-none",
140
- error && "text-error",
141
- props.disabled && "opacity-50",
142
- labelClassName,
143
- classNames?.label
144
- ),
145
- children: label
146
- }
147
- )
148
- ]
149
- }
150
- ),
151
- (helperText || error) && /* @__PURE__ */ jsx(
152
- "p",
153
- {
154
- id: helperId,
155
- className: cn(
156
- "checkbox_description",
157
- "mt-1 ml-0 text-xs",
158
- error ? "text-error" : "text-text-secondary",
159
- classNames?.description
120
+ return /* @__PURE__ */ jsxs(
121
+ "div",
122
+ {
123
+ className: cn("checkbox_root", "w-full", classNames?.root),
124
+ "data-slot": "root",
125
+ children: [
126
+ /* @__PURE__ */ jsxs(
127
+ "label",
128
+ {
129
+ className: cn(
130
+ "flex items-center gap-2",
131
+ !props.disabled && "cursor-pointer"
132
+ ),
133
+ children: [
134
+ checkboxElement,
135
+ label && /* @__PURE__ */ jsx(
136
+ "span",
137
+ {
138
+ className: cn(
139
+ "checkbox_label",
140
+ "text-sm text-text-primary select-none",
141
+ error && "text-error",
142
+ props.disabled && "opacity-50",
143
+ classNames?.label
144
+ ),
145
+ "data-slot": "label",
146
+ children: label
147
+ }
148
+ )
149
+ ]
150
+ }
160
151
  ),
161
- children: typeof error === "string" ? error : helperText
162
- }
163
- )
164
- ] });
152
+ (helperText || error) && /* @__PURE__ */ jsx(
153
+ "p",
154
+ {
155
+ id: helperId,
156
+ className: cn(
157
+ "checkbox_description",
158
+ "mt-1 ml-0 text-xs",
159
+ error ? "text-error" : "text-text-secondary",
160
+ classNames?.description
161
+ ),
162
+ "data-slot": "description",
163
+ children: typeof error === "string" ? error : helperText
164
+ }
165
+ )
166
+ ]
167
+ }
168
+ );
165
169
  }
166
170
  );
167
171
  Checkbox.displayName = "Checkbox";
168
172
  var checkbox_default = Checkbox;
169
173
 
170
174
  export { checkbox_default };
171
- //# sourceMappingURL=chunk-N32VWE6V.js.map
172
- //# sourceMappingURL=chunk-N32VWE6V.js.map
175
+ //# sourceMappingURL=chunk-RLYGJN56.js.map
176
+ //# sourceMappingURL=chunk-RLYGJN56.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/checkbox/index.tsx"],"names":[],"mappings":"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","file":"chunk-RLYGJN56.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport { Check, Minus } from \"lucide-react\";\nimport React, { useState, useCallback, useEffect, useId } from \"react\";\n\nimport { cn, iconSizes } from \"../utils\";\nimport {\n checkboxBorderColorClasses,\n focusRingColorClasses,\n textColorClasses,\n} from \"../variants\";\nimport type { CheckboxProps } from \"./types\";\n\n/**\n * Merges multiple refs into a single callback ref.\n * Handles both callback refs and RefObject refs safely.\n */\nfunction useMergeRefs<T>(\n ...refs: (React.Ref<T> | undefined)[]\n): React.RefCallback<T> {\n // Store refs in a ref to avoid dependency array issues\n const refsRef = React.useRef(refs);\n refsRef.current = refs;\n\n return useCallback((instance: T | null) => {\n refsRef.current.forEach((ref) => {\n if (typeof ref === \"function\") {\n ref(instance);\n } else if (ref && typeof ref === \"object\") {\n (ref as React.MutableRefObject<T | null>).current = instance;\n }\n });\n }, []);\n}\n\nconst checkboxVariants = cva(\n \"appearance-none rounded border bg-background cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-background\",\n {\n variants: {\n color: checkboxBorderColorClasses,\n size: {\n xs: \"w-(--checkbox-size-xs) h-(--checkbox-size-xs)\",\n sm: \"w-(--checkbox-size-sm) h-(--checkbox-size-sm)\",\n md: \"w-(--checkbox-size-md) h-(--checkbox-size-md)\",\n lg: \"w-(--checkbox-size-lg) h-(--checkbox-size-lg)\",\n },\n error: {\n true: \"border-error checked:border-error\",\n false: \"\",\n },\n },\n defaultVariants: {\n color: \"primary\",\n size: \"md\",\n },\n },\n);\n\nconst Checkbox = React.memo<CheckboxProps>(\n ({\n color = \"primary\",\n size = \"md\",\n label,\n helperText,\n error,\n indeterminate = false,\n className,\n checked,\n defaultChecked,\n ref,\n classNames,\n ...props\n }) => {\n const [internalChecked, setInternalChecked] = useState(\n defaultChecked ?? false,\n );\n const internalRef = React.useRef<HTMLInputElement>(null);\n\n // Generate unique ID for accessibility\n const uniqueId = useId();\n const helperId = `checkbox-helper-${uniqueId}`;\n const hasHelperText = !!(helperText || error);\n\n // Safely merge refs - handles both callback refs and RefObject refs\n const mergedRef = useMergeRefs(ref, internalRef);\n\n // Determine if controlled\n const isControlled = checked !== undefined;\n const currentChecked = isControlled ? checked : internalChecked;\n\n const onChangeRef = React.useRef(props.onChange);\n onChangeRef.current = props.onChange;\n\n const onChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!isControlled) {\n setInternalChecked(event.target.checked);\n }\n onChangeRef.current?.(event);\n },\n [isControlled],\n );\n\n useEffect(() => {\n if (internalRef.current) {\n internalRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n const checkboxElement = (\n <div className=\"relative inline-flex\" data-slot=\"wrapper\">\n <input\n ref={mergedRef}\n type=\"checkbox\"\n className={cn(\n \"checkbox_checkbox\",\n checkboxVariants({ color, size, error: !!error }),\n focusRingColorClasses[color],\n className,\n classNames?.checkbox,\n )}\n aria-checked={indeterminate ? \"mixed\" : currentChecked}\n aria-invalid={!!error || undefined}\n aria-describedby={hasHelperText ? helperId : undefined}\n {...props}\n onChange={onChange}\n checked={currentChecked}\n data-slot=\"checkbox\"\n />\n {(currentChecked || indeterminate) && (\n <div\n className={cn(\n \"checkbox_indicator\",\n \"absolute inset-0 flex items-center justify-center pointer-events-none\",\n classNames?.indicator,\n )}\n data-slot=\"indicator\"\n >\n {indeterminate ? (\n <Minus className={cn(iconSizes[size], textColorClasses[color])} strokeWidth={3} />\n ) : (\n <Check className={cn(iconSizes[size], textColorClasses[color])} />\n )}\n </div>\n )}\n </div>\n );\n\n if (!label && !helperText && !error) return checkboxElement;\n\n return (\n <div\n className={cn(\"checkbox_root\", \"w-full\", classNames?.root)}\n data-slot=\"root\"\n >\n <label\n className={cn(\n \"flex items-center gap-2\",\n !props.disabled && \"cursor-pointer\",\n )}\n >\n {checkboxElement}\n {label && (\n <span\n className={cn(\n \"checkbox_label\",\n \"text-sm text-text-primary select-none\",\n error && \"text-error\",\n props.disabled && \"opacity-50\",\n classNames?.label,\n )}\n data-slot=\"label\"\n >\n {label}\n </span>\n )}\n </label>\n {(helperText || error) && (\n <p\n id={helperId}\n className={cn(\n \"checkbox_description\",\n \"mt-1 ml-0 text-xs\",\n error ? \"text-error\" : \"text-text-secondary\",\n classNames?.description,\n )}\n data-slot=\"description\"\n >\n {typeof error === \"string\" ? error : helperText}\n </p>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = \"Checkbox\";\n\nexport type * from \"./types\";\nexport default Checkbox;\n"]}
@@ -381,10 +381,22 @@ var Pagination = React.memo(
381
381
  disabled,
382
382
  onKeyDown: (e) => {
383
383
  if (e.key === "Enter") {
384
- const value = parseInt(e.target.value);
385
- if (value >= 1 && value <= totalPages) {
386
- handlePageChange(value);
387
- e.target.value = "";
384
+ const inputEl = e.target;
385
+ const value = parseInt(inputEl.value);
386
+ if (!isNaN(value)) {
387
+ const clampedValue = Math.max(1, Math.min(totalPages, value));
388
+ handlePageChange(clampedValue);
389
+ inputEl.value = "";
390
+ }
391
+ }
392
+ },
393
+ onBlur: (e) => {
394
+ const inputEl = e.target;
395
+ const value = parseInt(inputEl.value);
396
+ if (!isNaN(value) && inputEl.value !== "") {
397
+ const clampedValue = Math.max(1, Math.min(totalPages, value));
398
+ if (clampedValue !== value) {
399
+ inputEl.value = String(clampedValue);
388
400
  }
389
401
  }
390
402
  },
@@ -405,5 +417,5 @@ Pagination.displayName = "Pagination";
405
417
  var pagination_default = Pagination;
406
418
 
407
419
  export { pagination_default };
408
- //# sourceMappingURL=chunk-X5SCI7KH.js.map
409
- //# sourceMappingURL=chunk-X5SCI7KH.js.map
420
+ //# sourceMappingURL=chunk-RZVEKAFR.js.map
421
+ //# sourceMappingURL=chunk-RZVEKAFR.js.map