asterui 0.10.3 → 0.12.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 (317) hide show
  1. package/README.md +1 -100
  2. package/dist/components/Anchor.d.ts +45 -0
  3. package/dist/components/Diff.d.ts +12 -0
  4. package/dist/components/Kbd.d.ts +8 -0
  5. package/dist/components/Segmented.d.ts +37 -0
  6. package/dist/components/TextRotate.d.ts +13 -0
  7. package/dist/components/Tour.d.ts +61 -0
  8. package/dist/hooks/useClickOutside.d.ts +17 -0
  9. package/dist/hooks/useClipboard.d.ts +20 -0
  10. package/dist/hooks/useDebounce.d.ts +18 -0
  11. package/dist/hooks/useDisclosure.d.ts +20 -0
  12. package/dist/hooks/useHover.d.ts +18 -0
  13. package/dist/hooks/useKeyPress.d.ts +40 -0
  14. package/dist/hooks/useLocalStorage.d.ts +12 -0
  15. package/dist/hooks/usePrevious.d.ts +15 -0
  16. package/dist/hooks/useWindowSize.d.ts +21 -0
  17. package/dist/index.d.ts +26 -0
  18. package/dist/index.js +205 -174
  19. package/dist/index.js.map +1 -1
  20. package/dist/index10.js +92 -30
  21. package/dist/index10.js.map +1 -1
  22. package/dist/index100.js +12 -20
  23. package/dist/index100.js.map +1 -1
  24. package/dist/index101.js +29 -22
  25. package/dist/index101.js.map +1 -1
  26. package/dist/index102.js +17 -19
  27. package/dist/index102.js.map +1 -1
  28. package/dist/index103.js +10788 -95
  29. package/dist/index103.js.map +1 -1
  30. package/dist/index104.js +5 -360
  31. package/dist/index104.js.map +1 -1
  32. package/dist/index105.js +40 -23
  33. package/dist/index105.js.map +1 -1
  34. package/dist/index106.js +2 -73
  35. package/dist/index106.js.map +1 -1
  36. package/dist/index107.js +6 -15
  37. package/dist/index107.js.map +1 -1
  38. package/dist/index108.js +147 -61
  39. package/dist/index108.js.map +1 -1
  40. package/dist/index109.js +26 -140
  41. package/dist/index109.js.map +1 -1
  42. package/dist/index11.js +28 -263
  43. package/dist/index11.js.map +1 -1
  44. package/dist/index110.js +30 -2
  45. package/dist/index110.js.map +1 -1
  46. package/dist/index111.js +2 -56
  47. package/dist/index111.js.map +1 -1
  48. package/dist/index112.js +72 -2
  49. package/dist/index112.js.map +1 -1
  50. package/dist/index113.js +39 -2
  51. package/dist/index113.js.map +1 -1
  52. package/dist/index114.js +26 -2
  53. package/dist/index114.js.map +1 -1
  54. package/dist/index115.js +21 -2
  55. package/dist/index115.js.map +1 -1
  56. package/dist/index116.js +24 -2
  57. package/dist/index116.js.map +1 -1
  58. package/dist/index117.js +20 -2
  59. package/dist/index117.js.map +1 -1
  60. package/dist/index118.js +100 -2
  61. package/dist/index118.js.map +1 -1
  62. package/dist/index119.js +359 -31
  63. package/dist/index119.js.map +1 -1
  64. package/dist/index12.js +259 -89
  65. package/dist/index12.js.map +1 -1
  66. package/dist/index120.js +25 -2
  67. package/dist/index120.js.map +1 -1
  68. package/dist/index121.js +72 -7
  69. package/dist/index121.js.map +1 -1
  70. package/dist/index122.js +16 -2
  71. package/dist/index122.js.map +1 -1
  72. package/dist/index123.js +66 -2
  73. package/dist/index123.js.map +1 -1
  74. package/dist/index124.js +143 -20
  75. package/dist/index124.js.map +1 -1
  76. package/dist/index125.js +2 -2
  77. package/dist/index126.js +55 -23
  78. package/dist/index126.js.map +1 -1
  79. package/dist/index127.js +2 -71
  80. package/dist/index127.js.map +1 -1
  81. package/dist/index128.js +2 -21
  82. package/dist/index128.js.map +1 -1
  83. package/dist/index129.js +2 -34
  84. package/dist/index129.js.map +1 -1
  85. package/dist/index13.js +90 -153
  86. package/dist/index13.js.map +1 -1
  87. package/dist/index130.js +2 -70
  88. package/dist/index130.js.map +1 -1
  89. package/dist/index131.js +2 -2
  90. package/dist/index132.js +2 -2
  91. package/dist/index133.js +2 -22
  92. package/dist/index133.js.map +1 -1
  93. package/dist/index134.js +2 -2
  94. package/dist/index135.js +32 -2
  95. package/dist/index135.js.map +1 -1
  96. package/dist/index136.js +2 -2
  97. package/dist/index137.js +8 -2
  98. package/dist/index137.js.map +1 -1
  99. package/dist/index138.js +2 -4
  100. package/dist/index138.js.map +1 -1
  101. package/dist/index139.js +5 -0
  102. package/dist/index139.js.map +1 -0
  103. package/dist/index14.js +154 -146
  104. package/dist/index14.js.map +1 -1
  105. package/dist/index140.js +24 -0
  106. package/dist/index140.js.map +1 -0
  107. package/dist/index141.js +5 -0
  108. package/dist/index141.js.map +1 -0
  109. package/dist/index142.js +27 -0
  110. package/dist/index142.js.map +1 -0
  111. package/dist/index143.js +74 -0
  112. package/dist/index143.js.map +1 -0
  113. package/dist/index144.js +24 -0
  114. package/dist/index144.js.map +1 -0
  115. package/dist/index145.js +37 -0
  116. package/dist/index145.js.map +1 -0
  117. package/dist/index146.js +73 -0
  118. package/dist/index146.js.map +1 -0
  119. package/dist/index147.js +5 -0
  120. package/dist/index147.js.map +1 -0
  121. package/dist/index148.js +25 -0
  122. package/dist/index148.js.map +1 -0
  123. package/dist/index149.js +5 -0
  124. package/dist/index149.js.map +1 -0
  125. package/dist/index15.js +150 -5
  126. package/dist/index15.js.map +1 -1
  127. package/dist/index150.js +5 -0
  128. package/dist/index150.js.map +1 -0
  129. package/dist/index151.js +5 -0
  130. package/dist/index151.js.map +1 -0
  131. package/dist/index152.js +5 -0
  132. package/dist/index152.js.map +1 -0
  133. package/dist/index153.js +7 -0
  134. package/dist/index153.js.map +1 -0
  135. package/dist/index16.js +5 -71
  136. package/dist/index16.js.map +1 -1
  137. package/dist/index17.js +71 -17
  138. package/dist/index17.js.map +1 -1
  139. package/dist/index18.js +15 -96
  140. package/dist/index18.js.map +1 -1
  141. package/dist/index19.js +89 -105
  142. package/dist/index19.js.map +1 -1
  143. package/dist/index20.js +107 -177
  144. package/dist/index20.js.map +1 -1
  145. package/dist/index21.js +181 -107
  146. package/dist/index21.js.map +1 -1
  147. package/dist/index22.js +107 -29
  148. package/dist/index22.js.map +1 -1
  149. package/dist/index23.js +19 -41
  150. package/dist/index23.js.map +1 -1
  151. package/dist/index24.js +31 -11
  152. package/dist/index24.js.map +1 -1
  153. package/dist/index25.js +41 -33
  154. package/dist/index25.js.map +1 -1
  155. package/dist/index26.js +12 -63
  156. package/dist/index26.js.map +1 -1
  157. package/dist/index27.js +33 -80
  158. package/dist/index27.js.map +1 -1
  159. package/dist/index28.js +63 -18
  160. package/dist/index28.js.map +1 -1
  161. package/dist/index29.js +78 -159
  162. package/dist/index29.js.map +1 -1
  163. package/dist/index3.js +96 -27
  164. package/dist/index3.js.map +1 -1
  165. package/dist/index30.js +16 -1080
  166. package/dist/index30.js.map +1 -1
  167. package/dist/index31.js +159 -16
  168. package/dist/index31.js.map +1 -1
  169. package/dist/index32.js +1081 -121
  170. package/dist/index32.js.map +1 -1
  171. package/dist/index33.js +17 -39
  172. package/dist/index33.js.map +1 -1
  173. package/dist/index34.js +121 -190
  174. package/dist/index34.js.map +1 -1
  175. package/dist/index35.js +37 -94
  176. package/dist/index35.js.map +1 -1
  177. package/dist/index36.js +186 -157
  178. package/dist/index36.js.map +1 -1
  179. package/dist/index37.js +89 -138
  180. package/dist/index37.js.map +1 -1
  181. package/dist/index38.js +161 -14
  182. package/dist/index38.js.map +1 -1
  183. package/dist/index39.js +146 -21
  184. package/dist/index39.js.map +1 -1
  185. package/dist/index4.js +26 -99
  186. package/dist/index4.js.map +1 -1
  187. package/dist/index40.js +12 -116
  188. package/dist/index40.js.map +1 -1
  189. package/dist/index41.js +18 -13
  190. package/dist/index41.js.map +1 -1
  191. package/dist/index42.js +21 -35
  192. package/dist/index42.js.map +1 -1
  193. package/dist/index43.js +117 -114
  194. package/dist/index43.js.map +1 -1
  195. package/dist/index44.js +13 -176
  196. package/dist/index44.js.map +1 -1
  197. package/dist/index45.js +34 -146
  198. package/dist/index45.js.map +1 -1
  199. package/dist/index46.js +116 -12
  200. package/dist/index46.js.map +1 -1
  201. package/dist/index47.js +176 -22
  202. package/dist/index47.js.map +1 -1
  203. package/dist/index48.js +147 -14
  204. package/dist/index48.js.map +1 -1
  205. package/dist/index49.js +10 -5
  206. package/dist/index49.js.map +1 -1
  207. package/dist/index5.js +100 -60
  208. package/dist/index5.js.map +1 -1
  209. package/dist/index50.js +21 -265
  210. package/dist/index50.js.map +1 -1
  211. package/dist/index51.js +10 -13
  212. package/dist/index51.js.map +1 -1
  213. package/dist/index52.js +7 -122
  214. package/dist/index52.js.map +1 -1
  215. package/dist/index53.js +262 -106
  216. package/dist/index53.js.map +1 -1
  217. package/dist/index54.js +14 -167
  218. package/dist/index54.js.map +1 -1
  219. package/dist/index55.js +121 -31
  220. package/dist/index55.js.map +1 -1
  221. package/dist/index56.js +107 -119
  222. package/dist/index56.js.map +1 -1
  223. package/dist/index57.js +161 -77
  224. package/dist/index57.js.map +1 -1
  225. package/dist/index58.js +31 -19
  226. package/dist/index58.js.map +1 -1
  227. package/dist/index59.js +117 -69
  228. package/dist/index59.js.map +1 -1
  229. package/dist/index6.js +61 -130
  230. package/dist/index6.js.map +1 -1
  231. package/dist/index60.js +82 -53
  232. package/dist/index60.js.map +1 -1
  233. package/dist/index61.js +19 -44
  234. package/dist/index61.js.map +1 -1
  235. package/dist/index62.js +70 -48
  236. package/dist/index62.js.map +1 -1
  237. package/dist/index63.js +55 -60
  238. package/dist/index63.js.map +1 -1
  239. package/dist/index64.js +39 -101
  240. package/dist/index64.js.map +1 -1
  241. package/dist/index65.js +52 -41
  242. package/dist/index65.js.map +1 -1
  243. package/dist/index66.js +62 -21
  244. package/dist/index66.js.map +1 -1
  245. package/dist/index67.js +104 -43
  246. package/dist/index67.js.map +1 -1
  247. package/dist/index68.js +41 -134
  248. package/dist/index68.js.map +1 -1
  249. package/dist/index69.js +65 -49
  250. package/dist/index69.js.map +1 -1
  251. package/dist/index7.js +130 -11
  252. package/dist/index7.js.map +1 -1
  253. package/dist/index70.js +21 -22
  254. package/dist/index70.js.map +1 -1
  255. package/dist/index71.js +46 -22
  256. package/dist/index71.js.map +1 -1
  257. package/dist/index72.js +126 -321
  258. package/dist/index72.js.map +1 -1
  259. package/dist/index73.js +52 -56
  260. package/dist/index73.js.map +1 -1
  261. package/dist/index74.js +22 -40
  262. package/dist/index74.js.map +1 -1
  263. package/dist/index75.js +22 -95
  264. package/dist/index75.js.map +1 -1
  265. package/dist/index76.js +311 -112
  266. package/dist/index76.js.map +1 -1
  267. package/dist/index77.js +52 -157
  268. package/dist/index77.js.map +1 -1
  269. package/dist/index78.js +40 -65
  270. package/dist/index78.js.map +1 -1
  271. package/dist/index79.js +23 -35
  272. package/dist/index79.js.map +1 -1
  273. package/dist/index8.js +11 -70
  274. package/dist/index8.js.map +1 -1
  275. package/dist/index80.js +92 -31
  276. package/dist/index80.js.map +1 -1
  277. package/dist/index81.js +116 -196
  278. package/dist/index81.js.map +1 -1
  279. package/dist/index82.js +155 -207
  280. package/dist/index82.js.map +1 -1
  281. package/dist/index83.js +60 -290
  282. package/dist/index83.js.map +1 -1
  283. package/dist/index84.js +34 -177
  284. package/dist/index84.js.map +1 -1
  285. package/dist/index85.js +227 -251
  286. package/dist/index85.js.map +1 -1
  287. package/dist/index86.js +34 -14
  288. package/dist/index86.js.map +1 -1
  289. package/dist/index87.js +208 -31
  290. package/dist/index87.js.map +1 -1
  291. package/dist/index88.js +206 -10786
  292. package/dist/index88.js.map +1 -1
  293. package/dist/index89.js +295 -5
  294. package/dist/index89.js.map +1 -1
  295. package/dist/index9.js +69 -91
  296. package/dist/index9.js.map +1 -1
  297. package/dist/index90.js +172 -36
  298. package/dist/index90.js.map +1 -1
  299. package/dist/index91.js +258 -2
  300. package/dist/index91.js.map +1 -1
  301. package/dist/index92.js +13 -6
  302. package/dist/index92.js.map +1 -1
  303. package/dist/index93.js +32 -151
  304. package/dist/index93.js.map +1 -1
  305. package/dist/index94.js +5 -29
  306. package/dist/index94.js.map +1 -1
  307. package/dist/index95.js +12 -28
  308. package/dist/index95.js.map +1 -1
  309. package/dist/index96.js +46 -2
  310. package/dist/index96.js.map +1 -1
  311. package/dist/index97.js +12 -71
  312. package/dist/index97.js.map +1 -1
  313. package/dist/index98.js +13 -37
  314. package/dist/index98.js.map +1 -1
  315. package/dist/index99.js +7 -25
  316. package/dist/index99.js.map +1 -1
  317. package/package.json +1 -1
package/dist/index18.js CHANGED
@@ -1,101 +1,20 @@
1
- import { jsxs as g, Fragment as M, jsx as r } from "react/jsx-runtime";
2
- import { useState as v, useRef as y, useCallback as w, useEffect as k } from "react";
3
- import { createPortal as S } from "react-dom";
4
- const C = ({ item: e, onSelect: h, onClose: c }) => {
5
- const [f, m] = v(!1), s = y(null);
6
- if (e.divider)
7
- return /* @__PURE__ */ r("li", { className: "divider my-1" });
8
- const b = () => {
9
- e.disabled || e.children && e.children.length > 0 || (h(e.key), c());
10
- }, t = e.children && e.children.length > 0;
11
- return /* @__PURE__ */ g(
12
- "li",
13
- {
14
- ref: s,
15
- onMouseEnter: () => t && m(!0),
16
- onMouseLeave: () => t && m(!1),
17
- className: "relative",
18
- children: [
19
- /* @__PURE__ */ g(
20
- "button",
21
- {
22
- onClick: b,
23
- disabled: e.disabled,
24
- className: `
25
- flex items-center gap-2 w-full px-4 py-2 text-left text-sm
26
- ${e.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
27
- ${e.danger ? "text-error hover:bg-error/10" : ""}
28
- `,
29
- children: [
30
- e.icon && /* @__PURE__ */ r("span", { className: "w-4 h-4", children: e.icon }),
31
- /* @__PURE__ */ r("span", { className: "flex-1", children: e.label }),
32
- t && /* @__PURE__ */ r("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
33
- ]
34
- }
35
- ),
36
- t && f && /* @__PURE__ */ r("ul", { className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50", children: e.children.map((d) => /* @__PURE__ */ r(C, { item: d, onSelect: h, onClose: c }, d.key)) })
37
- ]
38
- }
39
- );
40
- }, R = ({
41
- children: e,
42
- items: h,
43
- onSelect: c,
44
- disabled: f = !1,
45
- className: m = ""
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ const n = ({
3
+ children: s,
4
+ size: l = "lg",
5
+ className: x = "",
6
+ ...a
46
7
  }) => {
47
- const [s, b] = v(!1), [t, d] = v({ x: 0, y: 0 }), a = y(null), E = y(null), N = w(
48
- (n) => {
49
- if (f) return;
50
- n.preventDefault(), n.stopPropagation();
51
- let o = n.clientX, l = n.clientY;
52
- d({ x: o, y: l }), b(!0);
53
- },
54
- [f]
55
- ), u = w(() => {
56
- b(!1);
57
- }, []), L = w(
58
- (n) => {
59
- c?.(n);
60
- },
61
- [c]
62
- );
63
- return k(() => {
64
- if (s && a.current) {
65
- const o = a.current.getBoundingClientRect(), l = window.innerWidth, i = window.innerHeight;
66
- let { x: p, y: x } = t;
67
- p + o.width > l && (p = l - o.width - 8), x + o.height > i && (x = i - o.height - 8), (p !== t.x || x !== t.y) && d({ x: p, y: x });
68
- }
69
- }, [s, t]), k(() => {
70
- if (!s) return;
71
- const n = (i) => {
72
- a.current && !a.current.contains(i.target) && u();
73
- }, o = (i) => {
74
- i.key === "Escape" && u();
75
- }, l = () => {
76
- u();
77
- };
78
- return document.addEventListener("mousedown", n), document.addEventListener("keydown", o), document.addEventListener("scroll", l, !0), () => {
79
- document.removeEventListener("mousedown", n), document.removeEventListener("keydown", o), document.removeEventListener("scroll", l, !0);
80
- };
81
- }, [s, u]), /* @__PURE__ */ g(M, { children: [
82
- /* @__PURE__ */ r("div", { ref: E, onContextMenu: N, className: "inline-block", children: e }),
83
- s && S(
84
- /* @__PURE__ */ r(
85
- "ul",
86
- {
87
- ref: a,
88
- className: `menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${m}`,
89
- style: { left: t.x, top: t.y },
90
- children: h.map((n) => /* @__PURE__ */ r(C, { item: n, onSelect: L, onClose: u }, n.key))
91
- }
92
- ),
93
- document.body
94
- )
95
- ] });
8
+ const m = ["mx-auto px-4 sm:px-6 lg:px-8", {
9
+ sm: "max-w-2xl",
10
+ md: "max-w-4xl",
11
+ lg: "max-w-6xl",
12
+ xl: "max-w-7xl",
13
+ full: "max-w-full"
14
+ }[l], x].filter(Boolean).join(" ");
15
+ return /* @__PURE__ */ e("div", { className: m, ...a, children: s });
96
16
  };
97
- R.displayName = "ContextMenu";
98
17
  export {
99
- R as ContextMenu
18
+ n as Container
100
19
  };
101
20
  //# sourceMappingURL=index18.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index18.js","sources":["../src/components/ContextMenu.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface ContextMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n children?: ContextMenuItem[]\n}\n\nexport interface ContextMenuProps {\n /** Element that triggers the context menu on right-click */\n children: React.ReactNode\n /** Menu items */\n items: ContextMenuItem[]\n /** Callback when an item is selected */\n onSelect?: (key: string) => void\n /** Whether the context menu is disabled */\n disabled?: boolean\n /** Additional CSS classes for the menu */\n className?: string\n}\n\ninterface MenuPosition {\n x: number\n y: number\n}\n\nconst MenuItem: React.FC<{\n item: ContextMenuItem\n onSelect: (key: string) => void\n onClose: () => void\n}> = ({ item, onSelect, onClose }) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const itemRef = useRef<HTMLLIElement>(null)\n\n if (item.divider) {\n return <li className=\"divider my-1\"></li>\n }\n\n const handleClick = () => {\n if (item.disabled) return\n if (item.children && item.children.length > 0) return\n onSelect(item.key)\n onClose()\n }\n\n const hasSubmenu = item.children && item.children.length > 0\n\n return (\n <li\n ref={itemRef}\n onMouseEnter={() => hasSubmenu && setShowSubmenu(true)}\n onMouseLeave={() => hasSubmenu && setShowSubmenu(false)}\n className=\"relative\"\n >\n <button\n onClick={handleClick}\n disabled={item.disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${item.danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {item.icon && <span className=\"w-4 h-4\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n {hasSubmenu && (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n {hasSubmenu && showSubmenu && (\n <ul className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50\">\n {item.children!.map((child) => (\n <MenuItem key={child.key} item={child} onSelect={onSelect} onClose={onClose} />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n children,\n items,\n onSelect,\n disabled = false,\n className = '',\n}) => {\n const [visible, setVisible] = useState(false)\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 })\n const menuRef = useRef<HTMLUListElement>(null)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return\n e.preventDefault()\n e.stopPropagation()\n\n // Calculate position, ensuring menu stays within viewport\n let x = e.clientX\n let y = e.clientY\n\n // We'll adjust after render when we know menu dimensions\n setPosition({ x, y })\n setVisible(true)\n },\n [disabled]\n )\n\n const handleClose = useCallback(() => {\n setVisible(false)\n }, [])\n\n const handleSelect = useCallback(\n (key: string) => {\n onSelect?.(key)\n },\n [onSelect]\n )\n\n // Adjust position after menu renders to keep it in viewport\n useEffect(() => {\n if (visible && menuRef.current) {\n const menu = menuRef.current\n const rect = menu.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let { x, y } = position\n\n if (x + rect.width > viewportWidth) {\n x = viewportWidth - rect.width - 8\n }\n if (y + rect.height > viewportHeight) {\n y = viewportHeight - rect.height - 8\n }\n\n if (x !== position.x || y !== position.y) {\n setPosition({ x, y })\n }\n }\n }, [visible, position])\n\n // Close on click outside or escape\n useEffect(() => {\n if (!visible) return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n handleClose()\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose()\n }\n }\n\n const handleScroll = () => {\n handleClose()\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n document.addEventListener('scroll', handleScroll, true)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }, [visible, handleClose])\n\n return (\n <>\n <div ref={triggerRef} onContextMenu={handleContextMenu} className=\"inline-block\">\n {children}\n </div>\n {visible &&\n createPortal(\n <ul\n ref={menuRef}\n className={`menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${className}`}\n style={{ left: position.x, top: position.y }}\n >\n {items.map((item) => (\n <MenuItem key={item.key} item={item} onSelect={handleSelect} onClose={handleClose} />\n ))}\n </ul>,\n document.body\n )}\n </>\n )\n}\n\nContextMenu.displayName = 'ContextMenu'\n"],"names":["MenuItem","item","onSelect","onClose","showSubmenu","setShowSubmenu","useState","itemRef","useRef","jsx","handleClick","hasSubmenu","jsxs","child","ContextMenu","children","items","disabled","className","visible","setVisible","position","setPosition","menuRef","triggerRef","handleContextMenu","useCallback","e","x","y","handleClose","handleSelect","key","useEffect","rect","viewportWidth","viewportHeight","handleClickOutside","handleEscape","handleScroll","Fragment","createPortal"],"mappings":"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"}
1
+ {"version":3,"file":"index18.js","sources":["../src/components/Container.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'\n}\n\nexport const Container: React.FC<ContainerProps> = ({\n children,\n size = 'lg',\n className = '',\n ...rest\n}) => {\n const sizeClasses = {\n sm: 'max-w-2xl',\n md: 'max-w-4xl',\n lg: 'max-w-6xl',\n xl: 'max-w-7xl',\n full: 'max-w-full',\n }\n\n const classes = ['mx-auto px-4 sm:px-6 lg:px-8', sizeClasses[size], className]\n .filter(Boolean)\n .join(' ')\n\n return <div className={classes} {...rest}>{children}</div>\n}\n"],"names":["Container","children","size","className","rest","classes"],"mappings":";AAOO,MAAMA,IAAsC,CAAC;AAAA,EAClD,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AASJ,QAAMC,IAAU,CAAC,gCARG;AAAA,IAClB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,EAAA,EAGqDH,CAAI,GAAGC,CAAS,EAC1E,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BAAQ,OAAA,EAAI,WAAWE,GAAU,GAAGD,GAAO,UAAAH,GAAS;AACtD;"}
package/dist/index19.js CHANGED
@@ -1,117 +1,101 @@
1
- import { jsxs as l, jsx as t, Fragment as N } from "react/jsx-runtime";
2
- import { useState as C, useCallback as j, useEffect as k } from "react";
3
- const D = (s) => {
4
- const e = s - Date.now();
5
- return e <= 0 ? { days: 0, hours: 0, minutes: 0, seconds: 0 } : {
6
- days: Math.floor(e / (1e3 * 60 * 60 * 24)),
7
- hours: Math.floor(e / (1e3 * 60 * 60) % 24),
8
- minutes: Math.floor(e / 1e3 / 60 % 60),
9
- seconds: Math.floor(e / 1e3 % 60)
10
- };
11
- }, x = ({ value: s, label: e, size: r, showLabel: o, boxed: f }) => {
12
- const a = /* @__PURE__ */ t("span", { className: `countdown font-mono ${{
13
- xs: "text-lg",
14
- sm: "text-2xl",
15
- md: "text-4xl",
16
- lg: "text-5xl",
17
- xl: "text-6xl"
18
- }[r || "md"]}`, children: /* @__PURE__ */ t(
19
- "span",
1
+ import { jsxs as g, Fragment as M, jsx as r } from "react/jsx-runtime";
2
+ import { useState as v, useRef as y, useCallback as w, useEffect as k } from "react";
3
+ import { createPortal as S } from "react-dom";
4
+ const C = ({ item: e, onSelect: h, onClose: c }) => {
5
+ const [f, m] = v(!1), s = y(null);
6
+ if (e.divider)
7
+ return /* @__PURE__ */ r("li", { className: "divider my-1" });
8
+ const b = () => {
9
+ e.disabled || e.children && e.children.length > 0 || (h(e.key), c());
10
+ }, t = e.children && e.children.length > 0;
11
+ return /* @__PURE__ */ g(
12
+ "li",
20
13
  {
21
- style: { "--value": s },
22
- "aria-live": "polite",
23
- "aria-label": String(s),
24
- children: String(s).padStart(2, "0")
14
+ ref: s,
15
+ onMouseEnter: () => t && m(!0),
16
+ onMouseLeave: () => t && m(!1),
17
+ className: "relative",
18
+ children: [
19
+ /* @__PURE__ */ g(
20
+ "button",
21
+ {
22
+ onClick: b,
23
+ disabled: e.disabled,
24
+ className: `
25
+ flex items-center gap-2 w-full px-4 py-2 text-left text-sm
26
+ ${e.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
27
+ ${e.danger ? "text-error hover:bg-error/10" : ""}
28
+ `,
29
+ children: [
30
+ e.icon && /* @__PURE__ */ r("span", { className: "w-4 h-4", children: e.icon }),
31
+ /* @__PURE__ */ r("span", { className: "flex-1", children: e.label }),
32
+ t && /* @__PURE__ */ r("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
33
+ ]
34
+ }
35
+ ),
36
+ t && f && /* @__PURE__ */ r("ul", { className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50", children: e.children.map((d) => /* @__PURE__ */ r(C, { item: d, onSelect: h, onClose: c }, d.key)) })
37
+ ]
25
38
  }
26
- ) });
27
- return f ? /* @__PURE__ */ l("div", { className: "flex flex-col items-center bg-neutral text-neutral-content rounded-box p-2", children: [
28
- a,
29
- o && e && /* @__PURE__ */ t("span", { className: "text-xs mt-1", children: e })
30
- ] }) : /* @__PURE__ */ l("div", { className: "flex flex-col items-center", children: [
31
- a,
32
- o && e && /* @__PURE__ */ t("span", { className: "text-xs text-base-content/70 mt-1", children: e })
33
- ] });
34
- }, I = ({
35
- value: s,
36
- format: e = "HH:MM:SS",
37
- onFinish: r,
38
- onChange: o,
39
- className: f = "",
40
- size: n = "md",
41
- showLabels: a = !1,
42
- labels: i = {},
43
- boxed: c = !1
39
+ );
40
+ }, R = ({
41
+ children: e,
42
+ items: h,
43
+ onSelect: c,
44
+ disabled: f = !1,
45
+ className: m = ""
44
46
  }) => {
45
- const d = s instanceof Date ? s.getTime() : s, [m, L] = C(() => D(d)), [M, T] = C(!1), u = {
46
- days: i.days || "days",
47
- hours: i.hours || "hours",
48
- minutes: i.minutes || "min",
49
- seconds: i.seconds || "sec"
50
- }, p = j(() => {
51
- const y = D(d);
52
- L(y);
53
- const v = d - Date.now();
54
- o?.(Math.max(0, v)), v <= 0 && !M && (T(!0), r?.());
55
- }, [d, o, r, M]);
56
- k(() => {
57
- const y = setInterval(p, 1e3);
58
- return p(), () => clearInterval(y);
59
- }, [p]);
60
- const H = e.includes("D"), S = e.includes("H"), w = e.includes("M"), h = e.includes("S"), g = n === "lg" || n === "xl" ? "text-3xl" : n === "md" ? "text-2xl" : "text-xl";
61
- return /* @__PURE__ */ l("div", { className: `flex gap-2 items-center ${f}`, children: [
62
- H && /* @__PURE__ */ l(N, { children: [
63
- /* @__PURE__ */ t(
64
- x,
65
- {
66
- value: m.days,
67
- label: u.days,
68
- size: n,
69
- showLabel: a,
70
- boxed: c
71
- }
72
- ),
73
- (S || w || h) && !c && /* @__PURE__ */ t("span", { className: g, children: ":" })
74
- ] }),
75
- S && /* @__PURE__ */ l(N, { children: [
76
- /* @__PURE__ */ t(
77
- x,
78
- {
79
- value: m.hours,
80
- label: u.hours,
81
- size: n,
82
- showLabel: a,
83
- boxed: c
84
- }
85
- ),
86
- (w || h) && !c && /* @__PURE__ */ t("span", { className: g, children: ":" })
87
- ] }),
88
- w && /* @__PURE__ */ l(N, { children: [
89
- /* @__PURE__ */ t(
90
- x,
47
+ const [s, b] = v(!1), [t, d] = v({ x: 0, y: 0 }), a = y(null), E = y(null), N = w(
48
+ (n) => {
49
+ if (f) return;
50
+ n.preventDefault(), n.stopPropagation();
51
+ let o = n.clientX, l = n.clientY;
52
+ d({ x: o, y: l }), b(!0);
53
+ },
54
+ [f]
55
+ ), u = w(() => {
56
+ b(!1);
57
+ }, []), L = w(
58
+ (n) => {
59
+ c?.(n);
60
+ },
61
+ [c]
62
+ );
63
+ return k(() => {
64
+ if (s && a.current) {
65
+ const o = a.current.getBoundingClientRect(), l = window.innerWidth, i = window.innerHeight;
66
+ let { x: p, y: x } = t;
67
+ p + o.width > l && (p = l - o.width - 8), x + o.height > i && (x = i - o.height - 8), (p !== t.x || x !== t.y) && d({ x: p, y: x });
68
+ }
69
+ }, [s, t]), k(() => {
70
+ if (!s) return;
71
+ const n = (i) => {
72
+ a.current && !a.current.contains(i.target) && u();
73
+ }, o = (i) => {
74
+ i.key === "Escape" && u();
75
+ }, l = () => {
76
+ u();
77
+ };
78
+ return document.addEventListener("mousedown", n), document.addEventListener("keydown", o), document.addEventListener("scroll", l, !0), () => {
79
+ document.removeEventListener("mousedown", n), document.removeEventListener("keydown", o), document.removeEventListener("scroll", l, !0);
80
+ };
81
+ }, [s, u]), /* @__PURE__ */ g(M, { children: [
82
+ /* @__PURE__ */ r("div", { ref: E, onContextMenu: N, className: "inline-block", children: e }),
83
+ s && S(
84
+ /* @__PURE__ */ r(
85
+ "ul",
91
86
  {
92
- value: m.minutes,
93
- label: u.minutes,
94
- size: n,
95
- showLabel: a,
96
- boxed: c
87
+ ref: a,
88
+ className: `menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${m}`,
89
+ style: { left: t.x, top: t.y },
90
+ children: h.map((n) => /* @__PURE__ */ r(C, { item: n, onSelect: L, onClose: u }, n.key))
97
91
  }
98
92
  ),
99
- h && !c && /* @__PURE__ */ t("span", { className: g, children: ":" })
100
- ] }),
101
- h && /* @__PURE__ */ t(
102
- x,
103
- {
104
- value: m.seconds,
105
- label: u.seconds,
106
- size: n,
107
- showLabel: a,
108
- boxed: c
109
- }
93
+ document.body
110
94
  )
111
95
  ] });
112
96
  };
113
- I.displayName = "Countdown";
97
+ R.displayName = "ContextMenu";
114
98
  export {
115
- I as Countdown
99
+ R as ContextMenu
116
100
  };
117
101
  //# sourceMappingURL=index19.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index19.js","sources":["../src/components/Countdown.tsx"],"sourcesContent":["import React, { useEffect, useState, useCallback } from 'react'\n\nexport interface CountdownProps {\n /** Target timestamp in milliseconds or Date object */\n value: number | Date\n /** Format string: 'D' days, 'H' hours, 'M' minutes, 'S' seconds */\n format?: string\n /** Callback when countdown reaches zero */\n onFinish?: () => void\n /** Callback on each tick with remaining time */\n onChange?: (value: number) => void\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n /** Show labels under each unit */\n showLabels?: boolean\n /** Custom labels */\n labels?: {\n days?: string\n hours?: string\n minutes?: string\n seconds?: string\n }\n /** Show box style around each unit */\n boxed?: boolean\n}\n\ninterface TimeLeft {\n days: number\n hours: number\n minutes: number\n seconds: number\n}\n\nconst calculateTimeLeft = (targetTime: number): TimeLeft => {\n const difference = targetTime - Date.now()\n\n if (difference <= 0) {\n return { days: 0, hours: 0, minutes: 0, seconds: 0 }\n }\n\n return {\n days: Math.floor(difference / (1000 * 60 * 60 * 24)),\n hours: Math.floor((difference / (1000 * 60 * 60)) % 24),\n minutes: Math.floor((difference / 1000 / 60) % 60),\n seconds: Math.floor((difference / 1000) % 60),\n }\n}\n\nconst CountdownUnit: React.FC<{\n value: number\n label?: string\n size?: CountdownProps['size']\n showLabel?: boolean\n boxed?: boolean\n}> = ({ value, label, size, showLabel, boxed }) => {\n const sizeClasses = {\n xs: 'text-lg',\n sm: 'text-2xl',\n md: 'text-4xl',\n lg: 'text-5xl',\n xl: 'text-6xl',\n }\n\n const content = (\n <span className={`countdown font-mono ${sizeClasses[size || 'md']}`}>\n <span\n style={{ '--value': value } as React.CSSProperties}\n aria-live=\"polite\"\n aria-label={String(value)}\n >\n {String(value).padStart(2, '0')}\n </span>\n </span>\n )\n\n if (boxed) {\n return (\n <div className=\"flex flex-col items-center bg-neutral text-neutral-content rounded-box p-2\">\n {content}\n {showLabel && label && <span className=\"text-xs mt-1\">{label}</span>}\n </div>\n )\n }\n\n return (\n <div className=\"flex flex-col items-center\">\n {content}\n {showLabel && label && (\n <span className=\"text-xs text-base-content/70 mt-1\">{label}</span>\n )}\n </div>\n )\n}\n\nexport const Countdown: React.FC<CountdownProps> = ({\n value,\n format = 'HH:MM:SS',\n onFinish,\n onChange,\n className = '',\n size = 'md',\n showLabels = false,\n labels = {},\n boxed = false,\n}) => {\n const targetTime = value instanceof Date ? value.getTime() : value\n const [timeLeft, setTimeLeft] = useState<TimeLeft>(() => calculateTimeLeft(targetTime))\n const [finished, setFinished] = useState(false)\n\n const defaultLabels = {\n days: labels.days || 'days',\n hours: labels.hours || 'hours',\n minutes: labels.minutes || 'min',\n seconds: labels.seconds || 'sec',\n }\n\n const tick = useCallback(() => {\n const newTimeLeft = calculateTimeLeft(targetTime)\n setTimeLeft(newTimeLeft)\n\n const remaining = targetTime - Date.now()\n onChange?.(Math.max(0, remaining))\n\n if (remaining <= 0 && !finished) {\n setFinished(true)\n onFinish?.()\n }\n }, [targetTime, onChange, onFinish, finished])\n\n useEffect(() => {\n const timer = setInterval(tick, 1000)\n tick() // Initial tick\n\n return () => clearInterval(timer)\n }, [tick])\n\n const showDays = format.includes('D')\n const showHours = format.includes('H')\n const showMinutes = format.includes('M')\n const showSeconds = format.includes('S')\n\n const separatorSize = size === 'lg' || size === 'xl' ? 'text-3xl' : size === 'md' ? 'text-2xl' : 'text-xl'\n\n return (\n <div className={`flex gap-2 items-center ${className}`}>\n {showDays && (\n <>\n <CountdownUnit\n value={timeLeft.days}\n label={defaultLabels.days}\n size={size}\n showLabel={showLabels}\n boxed={boxed}\n />\n {(showHours || showMinutes || showSeconds) && !boxed && (\n <span className={separatorSize}>:</span>\n )}\n </>\n )}\n {showHours && (\n <>\n <CountdownUnit\n value={timeLeft.hours}\n label={defaultLabels.hours}\n size={size}\n showLabel={showLabels}\n boxed={boxed}\n />\n {(showMinutes || showSeconds) && !boxed && (\n <span className={separatorSize}>:</span>\n )}\n </>\n )}\n {showMinutes && (\n <>\n <CountdownUnit\n value={timeLeft.minutes}\n label={defaultLabels.minutes}\n size={size}\n showLabel={showLabels}\n boxed={boxed}\n />\n {showSeconds && !boxed && <span className={separatorSize}>:</span>}\n </>\n )}\n {showSeconds && (\n <CountdownUnit\n value={timeLeft.seconds}\n label={defaultLabels.seconds}\n size={size}\n showLabel={showLabels}\n boxed={boxed}\n />\n )}\n </div>\n )\n}\n\nCountdown.displayName = 'Countdown'\n"],"names":["calculateTimeLeft","targetTime","difference","CountdownUnit","value","label","size","showLabel","boxed","content","jsx","jsxs","Countdown","format","onFinish","onChange","className","showLabels","labels","timeLeft","setTimeLeft","useState","finished","setFinished","defaultLabels","tick","useCallback","newTimeLeft","remaining","useEffect","timer","showDays","showHours","showMinutes","showSeconds","separatorSize","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"index19.js","sources":["../src/components/ContextMenu.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport interface ContextMenuItem {\n key: string\n label: React.ReactNode\n icon?: React.ReactNode\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n children?: ContextMenuItem[]\n}\n\nexport interface ContextMenuProps {\n /** Element that triggers the context menu on right-click */\n children: React.ReactNode\n /** Menu items */\n items: ContextMenuItem[]\n /** Callback when an item is selected */\n onSelect?: (key: string) => void\n /** Whether the context menu is disabled */\n disabled?: boolean\n /** Additional CSS classes for the menu */\n className?: string\n}\n\ninterface MenuPosition {\n x: number\n y: number\n}\n\nconst MenuItem: React.FC<{\n item: ContextMenuItem\n onSelect: (key: string) => void\n onClose: () => void\n}> = ({ item, onSelect, onClose }) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const itemRef = useRef<HTMLLIElement>(null)\n\n if (item.divider) {\n return <li className=\"divider my-1\"></li>\n }\n\n const handleClick = () => {\n if (item.disabled) return\n if (item.children && item.children.length > 0) return\n onSelect(item.key)\n onClose()\n }\n\n const hasSubmenu = item.children && item.children.length > 0\n\n return (\n <li\n ref={itemRef}\n onMouseEnter={() => hasSubmenu && setShowSubmenu(true)}\n onMouseLeave={() => hasSubmenu && setShowSubmenu(false)}\n className=\"relative\"\n >\n <button\n onClick={handleClick}\n disabled={item.disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${item.disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${item.danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {item.icon && <span className=\"w-4 h-4\">{item.icon}</span>}\n <span className=\"flex-1\">{item.label}</span>\n {hasSubmenu && (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )}\n </button>\n {hasSubmenu && showSubmenu && (\n <ul className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50\">\n {item.children!.map((child) => (\n <MenuItem key={child.key} item={child} onSelect={onSelect} onClose={onClose} />\n ))}\n </ul>\n )}\n </li>\n )\n}\n\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n children,\n items,\n onSelect,\n disabled = false,\n className = '',\n}) => {\n const [visible, setVisible] = useState(false)\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 })\n const menuRef = useRef<HTMLUListElement>(null)\n const triggerRef = useRef<HTMLDivElement>(null)\n\n const handleContextMenu = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return\n e.preventDefault()\n e.stopPropagation()\n\n // Calculate position, ensuring menu stays within viewport\n let x = e.clientX\n let y = e.clientY\n\n // We'll adjust after render when we know menu dimensions\n setPosition({ x, y })\n setVisible(true)\n },\n [disabled]\n )\n\n const handleClose = useCallback(() => {\n setVisible(false)\n }, [])\n\n const handleSelect = useCallback(\n (key: string) => {\n onSelect?.(key)\n },\n [onSelect]\n )\n\n // Adjust position after menu renders to keep it in viewport\n useEffect(() => {\n if (visible && menuRef.current) {\n const menu = menuRef.current\n const rect = menu.getBoundingClientRect()\n const viewportWidth = window.innerWidth\n const viewportHeight = window.innerHeight\n\n let { x, y } = position\n\n if (x + rect.width > viewportWidth) {\n x = viewportWidth - rect.width - 8\n }\n if (y + rect.height > viewportHeight) {\n y = viewportHeight - rect.height - 8\n }\n\n if (x !== position.x || y !== position.y) {\n setPosition({ x, y })\n }\n }\n }, [visible, position])\n\n // Close on click outside or escape\n useEffect(() => {\n if (!visible) return\n\n const handleClickOutside = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n handleClose()\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose()\n }\n }\n\n const handleScroll = () => {\n handleClose()\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n document.addEventListener('scroll', handleScroll, true)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n document.removeEventListener('scroll', handleScroll, true)\n }\n }, [visible, handleClose])\n\n return (\n <>\n <div ref={triggerRef} onContextMenu={handleContextMenu} className=\"inline-block\">\n {children}\n </div>\n {visible &&\n createPortal(\n <ul\n ref={menuRef}\n className={`menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${className}`}\n style={{ left: position.x, top: position.y }}\n >\n {items.map((item) => (\n <MenuItem key={item.key} item={item} onSelect={handleSelect} onClose={handleClose} />\n ))}\n </ul>,\n document.body\n )}\n </>\n )\n}\n\nContextMenu.displayName = 'ContextMenu'\n"],"names":["MenuItem","item","onSelect","onClose","showSubmenu","setShowSubmenu","useState","itemRef","useRef","jsx","handleClick","hasSubmenu","jsxs","child","ContextMenu","children","items","disabled","className","visible","setVisible","position","setPosition","menuRef","triggerRef","handleContextMenu","useCallback","e","x","y","handleClose","handleSelect","key","useEffect","rect","viewportWidth","viewportHeight","handleClickOutside","handleEscape","handleScroll","Fragment","createPortal"],"mappings":"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"}