@mdigital_ui/ui 0.2.9 → 0.3.0

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 (142) hide show
  1. package/dist/accordion/index.js +1 -1
  2. package/dist/avatar/index.js +1 -1
  3. package/dist/badge/index.js +1 -1
  4. package/dist/breadcrumbs/index.js +1 -1
  5. package/dist/button/index.js +1 -1
  6. package/dist/button-group/index.js +1 -1
  7. package/dist/card/index.js +2 -1
  8. package/dist/cascader/index.js +2 -1
  9. package/dist/checkbox/index.js +1 -1
  10. package/dist/checkbox-group/index.js +1 -1
  11. package/dist/{chunk-4LSKRZOT.js → chunk-2PNLIQYM.js} +21 -4
  12. package/dist/chunk-2PNLIQYM.js.map +1 -0
  13. package/dist/{chunk-43RDFTC5.js → chunk-4TQ4BZ3S.js} +6 -4
  14. package/dist/chunk-4TQ4BZ3S.js.map +1 -0
  15. package/dist/{chunk-IMGVPMHJ.js → chunk-5JOJBDET.js} +47 -40
  16. package/dist/chunk-5JOJBDET.js.map +1 -0
  17. package/dist/{chunk-W3ES3UPV.js → chunk-5VORB55Y.js} +19 -3
  18. package/dist/chunk-5VORB55Y.js.map +1 -0
  19. package/dist/{chunk-3UCZ4GMN.js → chunk-6HGUDHHE.js} +4 -2
  20. package/dist/chunk-6HGUDHHE.js.map +1 -0
  21. package/dist/chunk-6YVT3AL2.js +211 -0
  22. package/dist/chunk-6YVT3AL2.js.map +1 -0
  23. package/dist/{chunk-CPDVBHA3.js → chunk-7KA7JSRX.js} +133 -23
  24. package/dist/chunk-7KA7JSRX.js.map +1 -0
  25. package/dist/chunk-CO766H7F.js +348 -0
  26. package/dist/chunk-CO766H7F.js.map +1 -0
  27. package/dist/{chunk-JIREY2VB.js → chunk-DHXVNO75.js} +3 -3
  28. package/dist/{chunk-JIREY2VB.js.map → chunk-DHXVNO75.js.map} +1 -1
  29. package/dist/chunk-DRL4CJMI.js +147 -0
  30. package/dist/chunk-DRL4CJMI.js.map +1 -0
  31. package/dist/{chunk-YAAV7FQG.js → chunk-FJPMIXWU.js} +15 -4
  32. package/dist/chunk-FJPMIXWU.js.map +1 -0
  33. package/dist/{chunk-MXDTUN3V.js → chunk-FZLFCT6Q.js} +141 -106
  34. package/dist/chunk-FZLFCT6Q.js.map +1 -0
  35. package/dist/chunk-GGDDE7LC.js +303 -0
  36. package/dist/chunk-GGDDE7LC.js.map +1 -0
  37. package/dist/{chunk-MRFCITKK.js → chunk-GVEEUHM2.js} +20 -16
  38. package/dist/chunk-GVEEUHM2.js.map +1 -0
  39. package/dist/{chunk-RYKVZFGB.js → chunk-HLY4VDIX.js} +7 -7
  40. package/dist/chunk-HLY4VDIX.js.map +1 -0
  41. package/dist/{chunk-2OUGJBXK.js → chunk-IVOMN6DV.js} +60 -14
  42. package/dist/chunk-IVOMN6DV.js.map +1 -0
  43. package/dist/{chunk-REKWBXAQ.js → chunk-J6IJBRYT.js} +12 -11
  44. package/dist/chunk-J6IJBRYT.js.map +1 -0
  45. package/dist/{chunk-LMR7TKDJ.js → chunk-KPM72QBO.js} +27 -10
  46. package/dist/chunk-KPM72QBO.js.map +1 -0
  47. package/dist/{chunk-QF3NJUUG.js → chunk-L572AMB3.js} +53 -8
  48. package/dist/chunk-L572AMB3.js.map +1 -0
  49. package/dist/{chunk-UUP7YGOS.js → chunk-LX4FDH4J.js} +3 -3
  50. package/dist/chunk-LX4FDH4J.js.map +1 -0
  51. package/dist/chunk-OL2GU2O3.js +293 -0
  52. package/dist/chunk-OL2GU2O3.js.map +1 -0
  53. package/dist/{chunk-N32VWE6V.js → chunk-RLYGJN56.js} +64 -60
  54. package/dist/chunk-RLYGJN56.js.map +1 -0
  55. package/dist/{chunk-X5SCI7KH.js → chunk-RZVEKAFR.js} +18 -6
  56. package/dist/chunk-RZVEKAFR.js.map +1 -0
  57. package/dist/chunk-T4MGK3WE.js +143 -0
  58. package/dist/chunk-T4MGK3WE.js.map +1 -0
  59. package/dist/{chunk-YFK2DHCY.js → chunk-TBMY5EQC.js} +10 -6
  60. package/dist/chunk-TBMY5EQC.js.map +1 -0
  61. package/dist/{chunk-PXOHJJBE.js → chunk-UHVPOGNC.js} +44 -9
  62. package/dist/chunk-UHVPOGNC.js.map +1 -0
  63. package/dist/{chunk-CMGCJXE5.js → chunk-UTKVWE76.js} +15 -4
  64. package/dist/chunk-UTKVWE76.js.map +1 -0
  65. package/dist/chunk-XQJ6HZ4Q.js +310 -0
  66. package/dist/chunk-XQJ6HZ4Q.js.map +1 -0
  67. package/dist/chunk-YJOLLSHH.js +132 -0
  68. package/dist/chunk-YJOLLSHH.js.map +1 -0
  69. package/dist/chunk-YWGWFGCY.js +332 -0
  70. package/dist/chunk-YWGWFGCY.js.map +1 -0
  71. package/dist/{chunk-FIGSNRWY.js → chunk-ZFYEAPEL.js} +40 -13
  72. package/dist/chunk-ZFYEAPEL.js.map +1 -0
  73. package/dist/chunk-ZRSSFP52.js +345 -0
  74. package/dist/chunk-ZRSSFP52.js.map +1 -0
  75. package/dist/clipboard/index.js +2 -1
  76. package/dist/collapse/index.js +2 -1
  77. package/dist/command/index.js +1 -1
  78. package/dist/context-menu/index.js +1 -1
  79. package/dist/date-picker/index.js +1 -1
  80. package/dist/descriptions/index.js +1 -1
  81. package/dist/float-input/index.js +6 -0
  82. package/dist/form/index.js +4 -0
  83. package/dist/form/index.js.map +1 -0
  84. package/dist/index.js +38 -30
  85. package/dist/index.js.map +1 -1
  86. package/dist/link/index.js +4 -0
  87. package/dist/link/index.js.map +1 -0
  88. package/dist/menubar/index.js +6 -0
  89. package/dist/menubar/index.js.map +1 -0
  90. package/dist/navigation-menu/index.js +4 -0
  91. package/dist/navigation-menu/index.js.map +1 -0
  92. package/dist/number-input/index.js +6 -0
  93. package/dist/number-input/index.js.map +1 -0
  94. package/dist/pagination/index.js +1 -1
  95. package/dist/progress/index.js +1 -1
  96. package/dist/scroll-area/index.js +4 -0
  97. package/dist/scroll-area/index.js.map +1 -0
  98. package/dist/select/index.js +1 -1
  99. package/dist/slider/index.js +1 -1
  100. package/dist/table/index.js +4 -4
  101. package/dist/timeline/index.js +4 -0
  102. package/dist/timeline/index.js.map +1 -0
  103. package/dist/toast/index.js +5 -0
  104. package/dist/toast/index.js.map +1 -0
  105. package/dist/transfer/index.js +2 -2
  106. package/dist/upload/index.js +1 -1
  107. package/package.json +72 -14
  108. package/dist/chart/index.js +0 -4
  109. package/dist/chunk-2OUGJBXK.js.map +0 -1
  110. package/dist/chunk-3UCZ4GMN.js.map +0 -1
  111. package/dist/chunk-43RDFTC5.js.map +0 -1
  112. package/dist/chunk-4LSKRZOT.js.map +0 -1
  113. package/dist/chunk-C5YO5VZS.js +0 -448
  114. package/dist/chunk-C5YO5VZS.js.map +0 -1
  115. package/dist/chunk-CMGCJXE5.js.map +0 -1
  116. package/dist/chunk-CPDVBHA3.js.map +0 -1
  117. package/dist/chunk-FIGSNRWY.js.map +0 -1
  118. package/dist/chunk-H47C2ENJ.js +0 -215
  119. package/dist/chunk-H47C2ENJ.js.map +0 -1
  120. package/dist/chunk-IMGVPMHJ.js.map +0 -1
  121. package/dist/chunk-LMR7TKDJ.js.map +0 -1
  122. package/dist/chunk-MRFCITKK.js.map +0 -1
  123. package/dist/chunk-MXDTUN3V.js.map +0 -1
  124. package/dist/chunk-N32VWE6V.js.map +0 -1
  125. package/dist/chunk-PXOHJJBE.js.map +0 -1
  126. package/dist/chunk-QF3NJUUG.js.map +0 -1
  127. package/dist/chunk-REKWBXAQ.js.map +0 -1
  128. package/dist/chunk-RYKVZFGB.js.map +0 -1
  129. package/dist/chunk-UUP7YGOS.js.map +0 -1
  130. package/dist/chunk-W3ES3UPV.js.map +0 -1
  131. package/dist/chunk-X5SCI7KH.js.map +0 -1
  132. package/dist/chunk-YAAV7FQG.js.map +0 -1
  133. package/dist/chunk-YFK2DHCY.js.map +0 -1
  134. package/dist/index.d.ts +0 -5220
  135. package/dist/styles/base.css +0 -5906
  136. package/dist/styles/global.css +0 -6401
  137. package/dist/styles/themes/dark.css +0 -93
  138. package/dist/styles/themes/light.css +0 -89
  139. package/dist/styles/themes/presets/corporate.css +0 -126
  140. package/dist/styles/themes/presets/minimal.css +0 -126
  141. package/dist/styles/themes/presets/vibrant.css +0 -126
  142. /package/dist/{chart → float-input}/index.js.map +0 -0
@@ -0,0 +1,332 @@
1
+ import { cn } from './chunk-NGYLRX6F.js';
2
+ import { cva } from 'class-variance-authority';
3
+ import React from 'react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ var tableVariants = cva("w-full border-separate border-spacing-0", {
7
+ variants: {
8
+ bordered: {
9
+ true: "border border-border",
10
+ false: ""
11
+ },
12
+ rounded: {
13
+ true: "rounded-lg",
14
+ false: ""
15
+ }
16
+ },
17
+ compoundVariants: [
18
+ { bordered: true, rounded: true, class: "overflow-hidden" }
19
+ ],
20
+ defaultVariants: {
21
+ bordered: true,
22
+ rounded: true
23
+ }
24
+ });
25
+ var labelCellVariants = cva(
26
+ "font-semibold text-text-primary border-b border-r border-border",
27
+ {
28
+ variants: {
29
+ size: {
30
+ xs: "py-1 px-2 text-[10px]",
31
+ sm: "py-2 px-3 text-xs",
32
+ md: "py-3 px-4 text-sm",
33
+ lg: "py-4 px-5 text-base"
34
+ },
35
+ color: {
36
+ default: "bg-surface",
37
+ primary: "bg-primary/10",
38
+ secondary: "bg-secondary/10",
39
+ accent: "bg-accent/10",
40
+ success: "bg-success/10",
41
+ error: "bg-error/10",
42
+ warning: "bg-warning/10",
43
+ info: "bg-info/10"
44
+ }
45
+ },
46
+ defaultVariants: {
47
+ size: "md",
48
+ color: "default"
49
+ }
50
+ }
51
+ );
52
+ var valueCellVariants = cva(
53
+ "text-text-primary border-b border-r border-border bg-background",
54
+ {
55
+ variants: {
56
+ size: {
57
+ xs: "py-1 px-2 text-[10px]",
58
+ sm: "py-2 px-3 text-xs",
59
+ md: "py-3 px-4 text-sm",
60
+ lg: "py-4 px-5 text-base"
61
+ }
62
+ },
63
+ defaultVariants: {
64
+ size: "md"
65
+ }
66
+ }
67
+ );
68
+ var Descriptions = React.memo(
69
+ ({
70
+ items,
71
+ column = 3,
72
+ color = "default",
73
+ size = "md",
74
+ layout = "horizontal",
75
+ bordered = true,
76
+ rounded = true,
77
+ className,
78
+ classNames,
79
+ title,
80
+ extra,
81
+ ref,
82
+ ...props
83
+ }) => {
84
+ const rows = [];
85
+ let currentRow = [];
86
+ let currentSpan = 0;
87
+ items.forEach((item) => {
88
+ const itemSpan = item.span || 1;
89
+ if (currentSpan + itemSpan > column) {
90
+ rows.push(currentRow);
91
+ currentRow = [item];
92
+ currentSpan = itemSpan;
93
+ } else {
94
+ currentRow.push(item);
95
+ currentSpan += itemSpan;
96
+ }
97
+ });
98
+ if (currentRow.length > 0) {
99
+ rows.push(currentRow);
100
+ }
101
+ if (layout === "vertical") {
102
+ const tableContent = /* @__PURE__ */ jsx(
103
+ "table",
104
+ {
105
+ className: cn(tableVariants({ bordered, rounded })),
106
+ role: "presentation",
107
+ children: /* @__PURE__ */ jsx("tbody", { "data-slot": "body", className: classNames?.body, children: rows.map((row, rowIndex) => {
108
+ const isLastRow = rowIndex === rows.length - 1;
109
+ let colPosition = 0;
110
+ const itemsAtRightEdge = row.map((item) => {
111
+ const span = item.span || 1;
112
+ colPosition += span;
113
+ return colPosition >= column;
114
+ });
115
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
116
+ /* @__PURE__ */ jsx("tr", { className: cn("descriptions_item", classNames?.item), "data-slot": "item", children: row.map((item, itemIndex) => /* @__PURE__ */ jsx(
117
+ "th",
118
+ {
119
+ colSpan: item.span || 1,
120
+ className: cn(
121
+ "descriptions_label",
122
+ labelCellVariants({ size, color }),
123
+ itemsAtRightEdge[itemIndex] && "border-r-0",
124
+ classNames?.label
125
+ ),
126
+ "data-slot": "label",
127
+ children: item.label
128
+ },
129
+ `${item.key}-label`
130
+ )) }),
131
+ /* @__PURE__ */ jsx("tr", { className: cn("descriptions_item", classNames?.item), "data-slot": "item", children: row.map((item, itemIndex) => /* @__PURE__ */ jsx(
132
+ "td",
133
+ {
134
+ colSpan: item.span || 1,
135
+ className: cn(
136
+ "descriptions_content",
137
+ valueCellVariants({ size }),
138
+ itemsAtRightEdge[itemIndex] && "border-r-0",
139
+ isLastRow && "border-b-0",
140
+ classNames?.content
141
+ ),
142
+ "data-slot": "content",
143
+ children: item.children
144
+ },
145
+ `${item.key}-value`
146
+ )) })
147
+ ] }, rowIndex);
148
+ }) })
149
+ }
150
+ );
151
+ if (title || extra) {
152
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("descriptions_root", classNames?.root, className), "data-slot": "root", ...props, children: [
153
+ /* @__PURE__ */ jsxs("div", { className: cn("descriptions_title", "flex items-center justify-between mb-3", classNames?.title), "data-slot": "title", children: [
154
+ title && /* @__PURE__ */ jsx("div", { className: "text-base font-semibold text-text-primary", children: title }),
155
+ extra && /* @__PURE__ */ jsx("div", { className: cn("descriptions_extra", classNames?.extra), "data-slot": "extra", children: extra })
156
+ ] }),
157
+ tableContent
158
+ ] });
159
+ }
160
+ return /* @__PURE__ */ jsx(
161
+ "table",
162
+ {
163
+ ref,
164
+ className: cn("descriptions_root", tableVariants({ bordered, rounded }), classNames?.root, className),
165
+ "data-slot": "root",
166
+ role: "presentation",
167
+ ...props,
168
+ children: /* @__PURE__ */ jsx("tbody", { "data-slot": "body", className: classNames?.body, children: rows.map((row, rowIndex) => {
169
+ const isLastRow = rowIndex === rows.length - 1;
170
+ let colPosition = 0;
171
+ const itemsAtRightEdge = row.map((item) => {
172
+ const span = item.span || 1;
173
+ colPosition += span;
174
+ return colPosition >= column;
175
+ });
176
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
177
+ /* @__PURE__ */ jsx("tr", { className: cn("descriptions_item", classNames?.item), "data-slot": "item", children: row.map((item, itemIndex) => /* @__PURE__ */ jsx(
178
+ "th",
179
+ {
180
+ colSpan: item.span || 1,
181
+ className: cn(
182
+ "descriptions_label",
183
+ labelCellVariants({ size, color }),
184
+ itemsAtRightEdge[itemIndex] && "border-r-0",
185
+ classNames?.label
186
+ ),
187
+ "data-slot": "label",
188
+ children: item.label
189
+ },
190
+ `${item.key}-label`
191
+ )) }),
192
+ /* @__PURE__ */ jsx("tr", { className: cn("descriptions_item", classNames?.item), "data-slot": "item", children: row.map((item, itemIndex) => /* @__PURE__ */ jsx(
193
+ "td",
194
+ {
195
+ colSpan: item.span || 1,
196
+ className: cn(
197
+ "descriptions_content",
198
+ valueCellVariants({ size }),
199
+ itemsAtRightEdge[itemIndex] && "border-r-0",
200
+ isLastRow && "border-b-0",
201
+ classNames?.content
202
+ ),
203
+ "data-slot": "content",
204
+ children: item.children
205
+ },
206
+ `${item.key}-value`
207
+ )) })
208
+ ] }, rowIndex);
209
+ }) })
210
+ }
211
+ );
212
+ }
213
+ const horizontalTableContent = /* @__PURE__ */ jsx(
214
+ "table",
215
+ {
216
+ className: cn(tableVariants({ bordered, rounded })),
217
+ role: "presentation",
218
+ children: /* @__PURE__ */ jsx("tbody", { "data-slot": "body", className: classNames?.body, children: rows.map((row, rowIndex) => {
219
+ const isLastRow = rowIndex === rows.length - 1;
220
+ let colPosition = 0;
221
+ const valueAtRightEdge = row.map((item) => {
222
+ const span = item.span || 1;
223
+ colPosition += span * 2;
224
+ return colPosition >= column * 2;
225
+ });
226
+ return /* @__PURE__ */ jsx("tr", { className: cn("descriptions_item", classNames?.item), "data-slot": "item", children: row.map((item, itemIndex) => {
227
+ const itemSpan = item.span || 1;
228
+ const valueColSpan = itemSpan * 2 - 1;
229
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
230
+ /* @__PURE__ */ jsx(
231
+ "th",
232
+ {
233
+ className: cn(
234
+ "descriptions_label",
235
+ labelCellVariants({ size, color }),
236
+ isLastRow && "border-b-0",
237
+ classNames?.label
238
+ ),
239
+ "data-slot": "label",
240
+ children: item.label
241
+ }
242
+ ),
243
+ /* @__PURE__ */ jsx(
244
+ "td",
245
+ {
246
+ colSpan: valueColSpan,
247
+ className: cn(
248
+ "descriptions_content",
249
+ valueCellVariants({ size }),
250
+ valueAtRightEdge[itemIndex] && "border-r-0",
251
+ isLastRow && "border-b-0",
252
+ classNames?.content
253
+ ),
254
+ "data-slot": "content",
255
+ children: item.children
256
+ }
257
+ )
258
+ ] }, item.key);
259
+ }) }, rowIndex);
260
+ }) })
261
+ }
262
+ );
263
+ if (title || extra) {
264
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("descriptions_root", classNames?.root, className), "data-slot": "root", ...props, children: [
265
+ /* @__PURE__ */ jsxs("div", { className: cn("descriptions_title", "flex items-center justify-between mb-3", classNames?.title), "data-slot": "title", children: [
266
+ title && /* @__PURE__ */ jsx("div", { className: "text-base font-semibold text-text-primary", children: title }),
267
+ extra && /* @__PURE__ */ jsx("div", { className: cn("descriptions_extra", classNames?.extra), "data-slot": "extra", children: extra })
268
+ ] }),
269
+ horizontalTableContent
270
+ ] });
271
+ }
272
+ return /* @__PURE__ */ jsx(
273
+ "table",
274
+ {
275
+ ref,
276
+ className: cn("descriptions_root", tableVariants({ bordered, rounded }), classNames?.root, className),
277
+ "data-slot": "root",
278
+ role: "presentation",
279
+ ...props,
280
+ children: /* @__PURE__ */ jsx("tbody", { "data-slot": "body", className: classNames?.body, children: rows.map((row, rowIndex) => {
281
+ const isLastRow = rowIndex === rows.length - 1;
282
+ let colPosition = 0;
283
+ const valueAtRightEdge = row.map((item) => {
284
+ const span = item.span || 1;
285
+ colPosition += span * 2;
286
+ return colPosition >= column * 2;
287
+ });
288
+ return /* @__PURE__ */ jsx("tr", { className: cn("descriptions_item", classNames?.item), "data-slot": "item", children: row.map((item, itemIndex) => {
289
+ const itemSpan = item.span || 1;
290
+ const valueColSpan = itemSpan * 2 - 1;
291
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
292
+ /* @__PURE__ */ jsx(
293
+ "th",
294
+ {
295
+ className: cn(
296
+ "descriptions_label",
297
+ labelCellVariants({ size, color }),
298
+ isLastRow && "border-b-0",
299
+ classNames?.label
300
+ ),
301
+ "data-slot": "label",
302
+ children: item.label
303
+ }
304
+ ),
305
+ /* @__PURE__ */ jsx(
306
+ "td",
307
+ {
308
+ colSpan: valueColSpan,
309
+ className: cn(
310
+ "descriptions_content",
311
+ valueCellVariants({ size }),
312
+ valueAtRightEdge[itemIndex] && "border-r-0",
313
+ isLastRow && "border-b-0",
314
+ classNames?.content
315
+ ),
316
+ "data-slot": "content",
317
+ children: item.children
318
+ }
319
+ )
320
+ ] }, item.key);
321
+ }) }, rowIndex);
322
+ }) })
323
+ }
324
+ );
325
+ }
326
+ );
327
+ Descriptions.displayName = "Descriptions";
328
+ var descriptions_default = Descriptions;
329
+
330
+ export { descriptions_default };
331
+ //# sourceMappingURL=chunk-YWGWFGCY.js.map
332
+ //# sourceMappingURL=chunk-YWGWFGCY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/descriptions/index.tsx"],"names":[],"mappings":"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","file":"chunk-YWGWFGCY.js","sourcesContent":["import { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport type { DescriptionsItem, DescriptionsProps } from './types'\n\nconst tableVariants = cva('w-full border-separate border-spacing-0', {\n variants: {\n bordered: {\n true: 'border border-border',\n false: '',\n },\n rounded: {\n true: 'rounded-lg',\n false: '',\n },\n },\n compoundVariants: [\n { bordered: true, rounded: true, class: 'overflow-hidden' },\n ],\n defaultVariants: {\n bordered: true,\n rounded: true,\n },\n})\n\nconst labelCellVariants = cva(\n 'font-semibold text-text-primary border-b border-r border-border',\n {\n variants: {\n size: {\n xs: 'py-1 px-2 text-[10px]',\n sm: 'py-2 px-3 text-xs',\n md: 'py-3 px-4 text-sm',\n lg: 'py-4 px-5 text-base',\n },\n color: {\n default: 'bg-surface',\n primary: 'bg-primary/10',\n secondary: 'bg-secondary/10',\n accent: 'bg-accent/10',\n success: 'bg-success/10',\n error: 'bg-error/10',\n warning: 'bg-warning/10',\n info: 'bg-info/10',\n },\n },\n defaultVariants: {\n size: 'md',\n color: 'default',\n },\n },\n)\n\nconst valueCellVariants = cva(\n 'text-text-primary border-b border-r border-border bg-background',\n {\n variants: {\n size: {\n xs: 'py-1 px-2 text-[10px]',\n sm: 'py-2 px-3 text-xs',\n md: 'py-3 px-4 text-sm',\n lg: 'py-4 px-5 text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n)\n\nconst Descriptions = React.memo<DescriptionsProps>(\n ({\n items,\n column = 3,\n color = 'default',\n size = 'md',\n layout = 'horizontal',\n bordered = true,\n rounded = true,\n className,\n classNames,\n title,\n extra,\n ref,\n ...props\n }) => {\n // Split items into rows based on column count and span\n const rows: DescriptionsItem[][] = []\n let currentRow: DescriptionsItem[] = []\n let currentSpan = 0\n\n items.forEach((item) => {\n const itemSpan = item.span || 1\n\n if (currentSpan + itemSpan > column) {\n rows.push(currentRow)\n currentRow = [item]\n currentSpan = itemSpan\n } else {\n currentRow.push(item)\n currentSpan += itemSpan\n }\n })\n\n if (currentRow.length > 0) {\n rows.push(currentRow)\n }\n\n if (layout === 'vertical') {\n const tableContent = (\n <table\n className={cn(tableVariants({ bordered, rounded }))}\n role=\"presentation\"\n >\n <tbody data-slot=\"body\" className={classNames?.body}>\n {rows.map((row, rowIndex) => {\n const isLastRow = rowIndex === rows.length - 1\n\n // Calculate which items reach the right edge\n let colPosition = 0\n const itemsAtRightEdge = row.map((item) => {\n const span = item.span || 1\n colPosition += span\n return colPosition >= column\n })\n\n return (\n <React.Fragment key={rowIndex}>\n <tr className={cn('descriptions_item', classNames?.item)} data-slot='item'>\n {row.map((item, itemIndex) => (\n <th\n key={`${item.key}-label`}\n colSpan={item.span || 1}\n className={cn(\n 'descriptions_label',\n labelCellVariants({ size, color }),\n itemsAtRightEdge[itemIndex] && 'border-r-0',\n classNames?.label,\n )}\n data-slot='label'\n >\n {item.label}\n </th>\n ))}\n </tr>\n <tr className={cn('descriptions_item', classNames?.item)} data-slot='item'>\n {row.map((item, itemIndex) => (\n <td\n key={`${item.key}-value`}\n colSpan={item.span || 1}\n className={cn(\n 'descriptions_content',\n valueCellVariants({ size }),\n itemsAtRightEdge[itemIndex] && 'border-r-0',\n isLastRow && 'border-b-0',\n classNames?.content,\n )}\n data-slot='content'\n >\n {item.children}\n </td>\n ))}\n </tr>\n </React.Fragment>\n )\n })}\n </tbody>\n </table>\n )\n\n if (title || extra) {\n return (\n <div ref={ref} className={cn('descriptions_root', classNames?.root, className)} data-slot=\"root\" {...props}>\n <div className={cn('descriptions_title', 'flex items-center justify-between mb-3', classNames?.title)} data-slot=\"title\">\n {title && <div className=\"text-base font-semibold text-text-primary\">{title}</div>}\n {extra && <div className={cn('descriptions_extra', classNames?.extra)} data-slot=\"extra\">{extra}</div>}\n </div>\n {tableContent}\n </div>\n )\n }\n\n return (\n <table\n ref={ref as React.Ref<HTMLTableElement>}\n className={cn('descriptions_root', tableVariants({ bordered, rounded }), classNames?.root, className)}\n data-slot=\"root\"\n role=\"presentation\"\n {...props}\n >\n <tbody data-slot=\"body\" className={classNames?.body}>\n {rows.map((row, rowIndex) => {\n const isLastRow = rowIndex === rows.length - 1\n\n // Calculate which items reach the right edge\n let colPosition = 0\n const itemsAtRightEdge = row.map((item) => {\n const span = item.span || 1\n colPosition += span\n return colPosition >= column\n })\n\n return (\n <React.Fragment key={rowIndex}>\n <tr className={cn('descriptions_item', classNames?.item)} data-slot='item'>\n {row.map((item, itemIndex) => (\n <th\n key={`${item.key}-label`}\n colSpan={item.span || 1}\n className={cn(\n 'descriptions_label',\n labelCellVariants({ size, color }),\n itemsAtRightEdge[itemIndex] && 'border-r-0',\n classNames?.label,\n )}\n data-slot='label'\n >\n {item.label}\n </th>\n ))}\n </tr>\n <tr className={cn('descriptions_item', classNames?.item)} data-slot='item'>\n {row.map((item, itemIndex) => (\n <td\n key={`${item.key}-value`}\n colSpan={item.span || 1}\n className={cn(\n 'descriptions_content',\n valueCellVariants({ size }),\n itemsAtRightEdge[itemIndex] && 'border-r-0',\n isLastRow && 'border-b-0',\n classNames?.content,\n )}\n data-slot='content'\n >\n {item.children}\n </td>\n ))}\n </tr>\n </React.Fragment>\n )\n })}\n </tbody>\n </table>\n )\n }\n\n // Horizontal layout\n const horizontalTableContent = (\n <table\n className={cn(tableVariants({ bordered, rounded }))}\n role=\"presentation\"\n >\n <tbody data-slot=\"body\" className={classNames?.body}>\n {rows.map((row, rowIndex) => {\n const isLastRow = rowIndex === rows.length - 1\n\n // Calculate which value cells reach the right edge\n let colPosition = 0\n const valueAtRightEdge = row.map((item) => {\n const span = item.span || 1\n colPosition += span * 2 // Each item takes label + value columns\n return colPosition >= column * 2\n })\n\n return (\n <tr key={rowIndex} className={cn('descriptions_item', classNames?.item)} data-slot='item'>\n {row.map((item, itemIndex) => {\n const itemSpan = item.span || 1\n const valueColSpan = itemSpan * 2 - 1\n\n return (\n <React.Fragment key={item.key}>\n <th\n className={cn(\n 'descriptions_label',\n labelCellVariants({ size, color }),\n isLastRow && 'border-b-0',\n classNames?.label,\n )}\n data-slot='label'\n >\n {item.label}\n </th>\n <td\n colSpan={valueColSpan}\n className={cn(\n 'descriptions_content',\n valueCellVariants({ size }),\n valueAtRightEdge[itemIndex] && 'border-r-0',\n isLastRow && 'border-b-0',\n classNames?.content,\n )}\n data-slot='content'\n >\n {item.children}\n </td>\n </React.Fragment>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n )\n\n if (title || extra) {\n return (\n <div ref={ref} className={cn('descriptions_root', classNames?.root, className)} data-slot=\"root\" {...props}>\n <div className={cn('descriptions_title', 'flex items-center justify-between mb-3', classNames?.title)} data-slot=\"title\">\n {title && <div className=\"text-base font-semibold text-text-primary\">{title}</div>}\n {extra && <div className={cn('descriptions_extra', classNames?.extra)} data-slot=\"extra\">{extra}</div>}\n </div>\n {horizontalTableContent}\n </div>\n )\n }\n\n return (\n <table\n ref={ref as React.Ref<HTMLTableElement>}\n className={cn('descriptions_root', tableVariants({ bordered, rounded }), classNames?.root, className)}\n data-slot=\"root\"\n role=\"presentation\"\n {...props}\n >\n <tbody data-slot=\"body\" className={classNames?.body}>\n {rows.map((row, rowIndex) => {\n const isLastRow = rowIndex === rows.length - 1\n\n // Calculate which value cells reach the right edge\n let colPosition = 0\n const valueAtRightEdge = row.map((item) => {\n const span = item.span || 1\n colPosition += span * 2 // Each item takes label + value columns\n return colPosition >= column * 2\n })\n\n return (\n <tr key={rowIndex} className={cn('descriptions_item', classNames?.item)} data-slot='item'>\n {row.map((item, itemIndex) => {\n const itemSpan = item.span || 1\n const valueColSpan = itemSpan * 2 - 1\n\n return (\n <React.Fragment key={item.key}>\n <th\n className={cn(\n 'descriptions_label',\n labelCellVariants({ size, color }),\n isLastRow && 'border-b-0',\n classNames?.label,\n )}\n data-slot='label'\n >\n {item.label}\n </th>\n <td\n colSpan={valueColSpan}\n className={cn(\n 'descriptions_content',\n valueCellVariants({ size }),\n valueAtRightEdge[itemIndex] && 'border-r-0',\n isLastRow && 'border-b-0',\n classNames?.content,\n )}\n data-slot='content'\n >\n {item.children}\n </td>\n </React.Fragment>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n )\n },\n)\n\nDescriptions.displayName = 'Descriptions'\n\nexport type * from './types'\nexport default Descriptions\n"]}
@@ -4,7 +4,27 @@ import { ChevronRight } from 'lucide-react';
4
4
  import { useRef, useState, useCallback, useEffect } from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
7
- var ContextMenuSubMenu = ({ item, onClose, level, classNames }) => {
7
+ var contextMenuHoverColorClasses = {
8
+ default: "hover:bg-surface focus:bg-surface",
9
+ primary: "hover:bg-primary/10 hover:text-primary focus:bg-primary/10 focus:text-primary",
10
+ secondary: "hover:bg-secondary/10 hover:text-secondary focus:bg-secondary/10 focus:text-secondary",
11
+ accent: "hover:bg-accent/10 hover:text-accent focus:bg-accent/10 focus:text-accent",
12
+ success: "hover:bg-success/10 hover:text-success focus:bg-success/10 focus:text-success",
13
+ error: "hover:bg-error/10 hover:text-error focus:bg-error/10 focus:text-error",
14
+ warning: "hover:bg-warning/10 hover:text-warning focus:bg-warning/10 focus:text-warning",
15
+ info: "hover:bg-info/10 hover:text-info focus:bg-info/10 focus:text-info"
16
+ };
17
+ var contextMenuFocusedColorClasses = {
18
+ default: "bg-surface",
19
+ primary: "bg-primary/10 text-primary",
20
+ secondary: "bg-secondary/10 text-secondary",
21
+ accent: "bg-accent/10 text-accent",
22
+ success: "bg-success/10 text-success",
23
+ error: "bg-error/10 text-error",
24
+ warning: "bg-warning/10 text-warning",
25
+ info: "bg-info/10 text-info"
26
+ };
27
+ var ContextMenuSubMenu = ({ item, onClose, level, classNames, color = "default" }) => {
8
28
  const [isOpen, setIsOpen] = useState(false);
9
29
  const hoverTimeoutRef = useRef(void 0);
10
30
  const leaveTimeoutRef = useRef(void 0);
@@ -57,12 +77,13 @@ var ContextMenuSubMenu = ({ item, onClose, level, classNames }) => {
57
77
  "aria-expanded": isOpen,
58
78
  "aria-disabled": item.disabled,
59
79
  tabIndex: -1,
80
+ "data-slot": "submenu-trigger",
60
81
  children: /* @__PURE__ */ jsxs(
61
82
  "div",
62
83
  {
63
84
  className: cn(
64
85
  "contextMenu_item flex items-center justify-between gap-3 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1",
65
- item.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-surface focus:bg-surface focus:outline-none",
86
+ item.disabled ? "opacity-50 cursor-not-allowed" : cn(contextMenuHoverColorClasses[color], "focus:outline-none"),
66
87
  classNames?.item
67
88
  ),
68
89
  onClick: handleClick,
@@ -106,7 +127,6 @@ var ContextMenuSubMenu = ({ item, onClose, level, classNames }) => {
106
127
  onMouseEnter: handleMouseEnter,
107
128
  onMouseLeave: handleMouseLeave,
108
129
  className: cn(
109
- "contextMenu_submenu min-w-[180px] rounded-md border border-border bg-background shadow-lg py-1",
110
130
  "data-[state=open]:animate-in data-[state=closed]:animate-out",
111
131
  "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
112
132
  "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
@@ -117,7 +137,7 @@ var ContextMenuSubMenu = ({ item, onClose, level, classNames }) => {
117
137
  "z-[var(--z-popover)]",
118
138
  classNames?.submenu
119
139
  ),
120
- children: /* @__PURE__ */ jsx(ContextMenuContent, { items: item.children, onClose, level: level + 1, classNames })
140
+ children: /* @__PURE__ */ jsx(ContextMenuContent, { items: item.children, onClose, level: level + 1, classNames, color })
121
141
  }
122
142
  ) })
123
143
  ] });
@@ -131,6 +151,7 @@ var ContextMenuContent = ({
131
151
  classNames,
132
152
  style,
133
153
  setKeyUpHandlers,
154
+ color = "default",
134
155
  ...props
135
156
  }) => {
136
157
  const menuRef = useRef(null);
@@ -216,13 +237,14 @@ var ContextMenuContent = ({
216
237
  classNames?.divider
217
238
  ),
218
239
  role: "separator",
219
- "aria-orientation": "horizontal"
240
+ "aria-orientation": "horizontal",
241
+ "data-slot": "separator"
220
242
  },
221
243
  `separator-${index}`
222
244
  );
223
245
  }
224
246
  if (item.children) {
225
- return /* @__PURE__ */ jsx(ContextMenuSubMenu, { item, onClose, level, classNames }, item.key);
247
+ return /* @__PURE__ */ jsx(ContextMenuSubMenu, { item, onClose, level, classNames, color }, item.key);
226
248
  }
227
249
  const validItemIndex = validItems.findIndex((vi) => vi.key === item.key);
228
250
  const isFocused = validItemIndex === focusedIndex;
@@ -231,8 +253,8 @@ var ContextMenuContent = ({
231
253
  {
232
254
  className: cn(
233
255
  "contextMenu_item flex items-center justify-between gap-3 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1",
234
- item.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-surface focus:bg-surface focus:outline-none",
235
- isFocused && !item.disabled && "bg-surface",
256
+ item.disabled ? "opacity-50 cursor-not-allowed" : cn(contextMenuHoverColorClasses[color], "focus:outline-none"),
257
+ isFocused && !item.disabled && contextMenuFocusedColorClasses[color],
236
258
  classNames?.item
237
259
  ),
238
260
  onClick: () => {
@@ -244,6 +266,7 @@ var ContextMenuContent = ({
244
266
  role: "menuitem",
245
267
  tabIndex: -1,
246
268
  "aria-disabled": item.disabled,
269
+ "data-slot": "item",
247
270
  children: [
248
271
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-1", children: [
249
272
  item.icon && /* @__PURE__ */ jsx(
@@ -253,6 +276,7 @@ var ContextMenuContent = ({
253
276
  "contextMenu_itemIcon shrink-0 w-4 h-4",
254
277
  classNames?.itemIcon
255
278
  ),
279
+ "data-slot": "item-icon",
256
280
  children: item.icon
257
281
  }
258
282
  ),
@@ -263,11 +287,12 @@ var ContextMenuContent = ({
263
287
  "contextMenu_itemLabel",
264
288
  classNames?.itemLabel
265
289
  ),
290
+ "data-slot": "item-label",
266
291
  children: item.label
267
292
  }
268
293
  )
269
294
  ] }),
270
- item.shortcut && /* @__PURE__ */ jsx("span", { className: "text-xs text-text-secondary shrink-0", children: item.shortcut })
295
+ item.shortcut && /* @__PURE__ */ jsx("span", { className: "text-xs text-text-secondary shrink-0", "data-slot": "shortcut", children: item.shortcut })
271
296
  ]
272
297
  },
273
298
  item.key
@@ -284,7 +309,8 @@ var ContextMenu = ({
284
309
  classNames,
285
310
  disabled = false,
286
311
  onOpenChange,
287
- open: controlledOpen
312
+ open: controlledOpen,
313
+ color = "default"
288
314
  }) => {
289
315
  const [internalOpen, setInternalOpen] = useState(false);
290
316
  const [keyUpHandlers, setKeyUpHandlers] = useState({});
@@ -353,6 +379,7 @@ var ContextMenu = ({
353
379
  onContextMenu: handleContextMenu,
354
380
  className: cn("contextMenu_root inline-block", className, classNames?.root),
355
381
  role: "presentation",
382
+ "data-slot": "root",
356
383
  children
357
384
  }
358
385
  ),
@@ -369,7 +396,7 @@ var ContextMenu = ({
369
396
  onPointerDownOutside: handleClose,
370
397
  onInteractOutside: handleClose,
371
398
  className: "z-[var(--z-popover)]",
372
- children: /* @__PURE__ */ jsx(ContextMenuContent, { setKeyUpHandlers, items, onClose: handleClose, classNames })
399
+ children: /* @__PURE__ */ jsx(ContextMenuContent, { setKeyUpHandlers, items, onClose: handleClose, classNames, color })
373
400
  }
374
401
  ) })
375
402
  ] });
@@ -378,5 +405,5 @@ ContextMenu.displayName = "ContextMenu";
378
405
  var context_menu_default = ContextMenu;
379
406
 
380
407
  export { ContextMenu, ContextMenuContent, context_menu_default };
381
- //# sourceMappingURL=chunk-FIGSNRWY.js.map
382
- //# sourceMappingURL=chunk-FIGSNRWY.js.map
408
+ //# sourceMappingURL=chunk-ZFYEAPEL.js.map
409
+ //# sourceMappingURL=chunk-ZFYEAPEL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context-menu/index.tsx"],"names":[],"mappings":"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","file":"chunk-ZFYEAPEL.js","sourcesContent":["'use client'\n\nimport * as PopoverPrimitive from '@radix-ui/react-popover';\nimport { ChevronRight } from 'lucide-react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { ComponentColor } from '../types';\nimport { cn } from '../utils';\nimport type { ContextMenuContentProps, ContextMenuProps, ContextMenuSubMenuProps } from './types';\n\nconst contextMenuHoverColorClasses: Record<ComponentColor, string> = {\n default: 'hover:bg-surface focus:bg-surface',\n primary: 'hover:bg-primary/10 hover:text-primary focus:bg-primary/10 focus:text-primary',\n secondary: 'hover:bg-secondary/10 hover:text-secondary focus:bg-secondary/10 focus:text-secondary',\n accent: 'hover:bg-accent/10 hover:text-accent focus:bg-accent/10 focus:text-accent',\n success: 'hover:bg-success/10 hover:text-success focus:bg-success/10 focus:text-success',\n error: 'hover:bg-error/10 hover:text-error focus:bg-error/10 focus:text-error',\n warning: 'hover:bg-warning/10 hover:text-warning focus:bg-warning/10 focus:text-warning',\n info: 'hover:bg-info/10 hover:text-info focus:bg-info/10 focus:text-info',\n}\n\nconst contextMenuFocusedColorClasses: Record<ComponentColor, string> = {\n default: 'bg-surface',\n primary: 'bg-primary/10 text-primary',\n secondary: 'bg-secondary/10 text-secondary',\n accent: 'bg-accent/10 text-accent',\n success: 'bg-success/10 text-success',\n error: 'bg-error/10 text-error',\n warning: 'bg-warning/10 text-warning',\n info: 'bg-info/10 text-info',\n}\n\n/**\n * Submenu component based on Popover\n */\nconst ContextMenuSubMenu = ({ item, onClose, level, classNames, color = 'default' }: ContextMenuSubMenuProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const hoverTimeoutRef = useRef<number | undefined>(undefined);\n const leaveTimeoutRef = useRef<number | undefined>(undefined);\n\n const handleMouseEnter = useCallback(() => {\n if (item.disabled) return;\n\n if (leaveTimeoutRef.current) {\n clearTimeout(leaveTimeoutRef.current);\n }\n\n hoverTimeoutRef.current = setTimeout(() => {\n setIsOpen(true);\n }, 200);\n }, [item.disabled]);\n\n const handleMouseLeave = useCallback(() => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n\n leaveTimeoutRef.current = setTimeout(() => {\n setIsOpen(false);\n }, 300);\n }, []);\n\n const handleClick = useCallback(\n (e: React.MouseEvent) => {\n if (!item.disabled && !item.children) {\n e.stopPropagation();\n item.onClick?.();\n onClose();\n }\n },\n [item, onClose]\n );\n\n useEffect(() => {\n return () => {\n if (hoverTimeoutRef.current) {\n clearTimeout(hoverTimeoutRef.current);\n }\n if (leaveTimeoutRef.current) {\n clearTimeout(leaveTimeoutRef.current);\n }\n };\n }, []);\n\n return (\n <PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div\n className='relative'\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n role='menuitem'\n aria-haspopup='true'\n aria-expanded={isOpen}\n aria-disabled={item.disabled}\n tabIndex={-1}\n data-slot='submenu-trigger'\n >\n <div\n className={cn(\n 'contextMenu_item flex items-center justify-between gap-3 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1',\n item.disabled ? 'opacity-50 cursor-not-allowed' : cn(contextMenuHoverColorClasses[color], 'focus:outline-none'),\n classNames?.item,\n )}\n onClick={handleClick}\n >\n <div className='flex items-center gap-2 flex-1'>\n {item.icon && (\n <span\n className={cn(\n 'contextMenu_itemIcon shrink-0 w-4 h-4',\n classNames?.itemIcon,\n )}\n >\n {item.icon}\n </span>\n )}\n <span\n className={cn(\n 'contextMenu_itemLabel',\n classNames?.itemLabel,\n )}\n >\n {item.label}\n </span>\n </div>\n {item.children && <ChevronRight className='w-4 h-4 text-text-secondary shrink-0' />}\n {item.shortcut && <span className='text-xs text-text-secondary shrink-0'>{item.shortcut}</span>}\n </div>\n </div>\n </PopoverPrimitive.Trigger>\n\n {item.children && (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side='right'\n align='start'\n sideOffset={8}\n alignOffset={-8}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out',\n 'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n 'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2',\n 'data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2',\n 'data-[side=top]:slide-in-from-bottom-2',\n 'z-[var(--z-popover)]',\n classNames?.submenu,\n )}\n >\n <ContextMenuContent items={item.children} onClose={onClose} level={level + 1} classNames={classNames} color={color} />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n )}\n </PopoverPrimitive.Root>\n );\n};\n\nContextMenuSubMenu.displayName = 'ContextMenuSubMenu';\n\n/**\n * Context menu content component\n */\nconst ContextMenuContent = ({\n items,\n onClose,\n level = 0,\n className,\n classNames,\n style,\n setKeyUpHandlers,\n color = 'default',\n ...props\n}: ContextMenuContentProps) => {\n const menuRef = useRef<HTMLDivElement>(null);\n const [focusedIndex, setFocusedIndex] = useState(0);\n\n const validItems = items.filter((item) => !item.separator && !item.disabled);\n\n // Store refs to avoid stale closures in key handlers\n const validItemsRef = useRef(validItems);\n const onCloseRef = useRef(onClose);\n validItemsRef.current = validItems;\n onCloseRef.current = onClose;\n\n const keyHandlers = useCallback(() => ({\n ArrowDown: () => {\n setFocusedIndex((prev) => {\n const nextIndex = prev + 1;\n return nextIndex >= validItemsRef.current.length ? 0 : nextIndex;\n });\n },\n ArrowUp: () => {\n setFocusedIndex((prev) => {\n const nextIndex = prev - 1;\n return nextIndex < 0 ? validItemsRef.current.length - 1 : nextIndex;\n });\n },\n Enter: () => {\n setFocusedIndex((currentIndex) => {\n if (currentIndex >= 0 && currentIndex < validItemsRef.current.length) {\n const item = validItemsRef.current[currentIndex];\n if (!item?.disabled && !item?.children) {\n item?.onClick?.();\n onCloseRef.current();\n }\n }\n return currentIndex;\n });\n },\n ' ': () => {\n setFocusedIndex((currentIndex) => {\n if (currentIndex >= 0 && currentIndex < validItemsRef.current.length) {\n const item = validItemsRef.current[currentIndex];\n if (!item?.disabled && !item?.children) {\n item?.onClick?.();\n onCloseRef.current();\n }\n }\n return currentIndex;\n });\n },\n Escape: () => {\n onCloseRef.current();\n },\n ArrowLeft: () => {\n if (level > 0) {\n onCloseRef.current();\n }\n },\n }), [level]);\n\n useEffect(() => {\n if (setKeyUpHandlers) {\n setKeyUpHandlers(keyHandlers());\n }\n }, [setKeyUpHandlers, keyHandlers]);\n\n return (\n <div\n ref={menuRef}\n className={cn(\n 'contextMenu_content min-w-[180px] rounded-md border border-border bg-background shadow-lg py-1',\n level === 0 && 'animate-in fade-in-0 zoom-in-95',\n className,\n classNames?.content,\n )}\n style={style}\n role='menu'\n aria-orientation='vertical'\n tabIndex={-1}\n {...props}\n >\n {items.map((item, index) => {\n if (item.separator) {\n return (\n <div\n key={`separator-${index}`}\n className={cn(\n 'contextMenu_divider h-px bg-border my-1',\n classNames?.divider,\n )}\n role='separator'\n aria-orientation='horizontal'\n data-slot='separator'\n />\n );\n }\n\n if (item.children) {\n return <ContextMenuSubMenu key={item.key} item={item} onClose={onClose} level={level} classNames={classNames} color={color} />;\n }\n\n const validItemIndex = validItems.findIndex((vi) => vi.key === item.key);\n const isFocused = validItemIndex === focusedIndex;\n\n return (\n <div\n key={item.key}\n className={cn(\n 'contextMenu_item flex items-center justify-between gap-3 px-3 py-2 text-sm cursor-pointer rounded-sm transition-colors mx-1',\n item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : cn(contextMenuHoverColorClasses[color], 'focus:outline-none'),\n isFocused && !item.disabled && contextMenuFocusedColorClasses[color],\n classNames?.item,\n )}\n onClick={() => {\n if (!item.disabled) {\n item.onClick?.();\n onClose();\n }\n }}\n role='menuitem'\n tabIndex={-1}\n aria-disabled={item.disabled}\n data-slot='item'\n >\n <div className='flex items-center gap-2 flex-1'>\n {item.icon && (\n <span\n className={cn(\n 'contextMenu_itemIcon shrink-0 w-4 h-4',\n classNames?.itemIcon,\n )}\n data-slot='item-icon'\n >\n {item.icon}\n </span>\n )}\n <span\n className={cn(\n 'contextMenu_itemLabel',\n classNames?.itemLabel,\n )}\n data-slot='item-label'\n >\n {item.label}\n </span>\n </div>\n {item.shortcut && <span className='text-xs text-text-secondary shrink-0' data-slot='shortcut'>{item.shortcut}</span>}\n </div>\n );\n })}\n </div>\n );\n};\n\nContextMenuContent.displayName = 'ContextMenuContent';\n\n/**\n * ContextMenu component based on Popover\n *\n * A context menu that opens on right-click.\n * Uses @radix-ui/react-popover for positioning and state management.\n * Supports nested submenus, separators, disabled items, and keyboard navigation.\n *\n * @example\n * ```tsx\n * import ContextMenu from '@mdigital_ui/ui/context-menu'\n * import { Copy, Paste, Trash } from 'lucide-react'\n *\n * function MyComponent() {\n * return (\n * <ContextMenu\n * items={[\n * {\n * key: 'copy',\n * label: 'Copy',\n * icon: <Copy />,\n * shortcut: 'Ctrl+C',\n * onClick: () => console.log('Copy'),\n * },\n * {\n * key: 'paste',\n * label: 'Paste',\n * icon: <Paste />,\n * shortcut: 'Ctrl+V',\n * onClick: () => console.log('Paste'),\n * },\n * { key: 'sep1', separator: true },\n * {\n * key: 'delete',\n * label: 'Delete',\n * icon: <Trash />,\n * onClick: () => console.log('Delete'),\n * },\n * ]}\n * >\n * <div className=\"p-4 border\">\n * Right click me!\n * </div>\n * </ContextMenu>\n * )\n * }\n * ```\n */\nconst ContextMenu = ({\n children,\n items,\n className,\n classNames,\n disabled = false,\n onOpenChange,\n open: controlledOpen,\n color = 'default',\n}: ContextMenuProps) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const [keyUpHandlers, setKeyUpHandlers] = useState<Record<string, () => void>>({});\n const [position, setPosition] = useState<DOMRect | null>(null);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const setOpen = useCallback(\n (open: boolean) => {\n if (!isControlled) {\n setInternalOpen(open);\n }\n onOpenChange?.(open);\n },\n [isControlled, onOpenChange]\n );\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n setPosition({\n width: 0,\n height: 0,\n x: e.clientX,\n y: e.clientY,\n top: e.clientY,\n left: e.clientX,\n right: e.clientX,\n bottom: e.clientY,\n toJSON: () => {},\n } as DOMRect);\n\n setOpen(true);\n },\n [disabled, setOpen]\n );\n\n const handleClose = useCallback(() => {\n setOpen(false);\n }, [setOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n const handler = keyUpHandlers[e.key];\n if (handler) {\n e.preventDefault();\n handler();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, keyUpHandlers]);\n\n return (\n <PopoverPrimitive.Root open={isOpen} onOpenChange={setOpen}>\n {position && (\n <PopoverPrimitive.Anchor\n virtualRef={{\n current: {\n getBoundingClientRect: () => position,\n },\n }}\n />\n )}\n <div\n onContextMenu={handleContextMenu}\n className={cn('contextMenu_root inline-block', className, classNames?.root)}\n role='presentation'\n data-slot='root'\n >\n {children}\n </div>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side='bottom'\n align='start'\n sideOffset={0}\n alignOffset={0}\n onOpenAutoFocus={(e: Event) => e.preventDefault()}\n onCloseAutoFocus={(e: Event) => e.preventDefault()}\n onEscapeKeyDown={handleClose}\n onPointerDownOutside={handleClose}\n onInteractOutside={handleClose}\n className='z-[var(--z-popover)]'\n >\n <ContextMenuContent setKeyUpHandlers={setKeyUpHandlers} items={items} onClose={handleClose} classNames={classNames} color={color} />\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n};\n\nContextMenu.displayName = 'ContextMenu';\n\nexport type * from './types';\nexport { ContextMenu, ContextMenuContent };\nexport default ContextMenu;\n"]}