asterui 0.12.18 → 0.12.20

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 (205) hide show
  1. package/dist/components/Code.d.ts +2 -0
  2. package/dist/components/CopyButton.d.ts +34 -0
  3. package/dist/components/Watermark.d.ts +40 -0
  4. package/dist/index.d.ts +4 -0
  5. package/dist/index.js +205 -201
  6. package/dist/index.js.map +1 -1
  7. package/dist/index10.js +91 -121
  8. package/dist/index10.js.map +1 -1
  9. package/dist/index100.js +5 -45
  10. package/dist/index100.js.map +1 -1
  11. package/dist/index101.js +13 -12
  12. package/dist/index101.js.map +1 -1
  13. package/dist/index102.js +44 -13
  14. package/dist/index102.js.map +1 -1
  15. package/dist/index103.js +12 -7
  16. package/dist/index103.js.map +1 -1
  17. package/dist/index104.js +13 -11
  18. package/dist/index104.js.map +1 -1
  19. package/dist/index105.js +7 -30
  20. package/dist/index105.js.map +1 -1
  21. package/dist/index106.js +11 -16
  22. package/dist/index106.js.map +1 -1
  23. package/dist/index107.js +34 -0
  24. package/dist/index107.js.map +1 -0
  25. package/dist/index108.js +21 -0
  26. package/dist/index108.js.map +1 -0
  27. package/dist/index11.js +123 -30
  28. package/dist/index11.js.map +1 -1
  29. package/dist/index12.js +28 -263
  30. package/dist/index12.js.map +1 -1
  31. package/dist/index13.js +257 -105
  32. package/dist/index13.js.map +1 -1
  33. package/dist/index14.js +108 -153
  34. package/dist/index14.js.map +1 -1
  35. package/dist/index15.js +154 -146
  36. package/dist/index15.js.map +1 -1
  37. package/dist/index16.js +150 -5
  38. package/dist/index16.js.map +1 -1
  39. package/dist/index17.js +5 -71
  40. package/dist/index17.js.map +1 -1
  41. package/dist/index18.js +70 -24
  42. package/dist/index18.js.map +1 -1
  43. package/dist/index19.js +23 -194
  44. package/dist/index19.js.map +1 -1
  45. package/dist/index20.js +188 -106
  46. package/dist/index20.js.map +1 -1
  47. package/dist/index21.js +107 -177
  48. package/dist/index21.js.map +1 -1
  49. package/dist/index22.js +181 -107
  50. package/dist/index22.js.map +1 -1
  51. package/dist/index23.js +110 -19
  52. package/dist/index23.js.map +1 -1
  53. package/dist/index24.js +17 -41
  54. package/dist/index24.js.map +1 -1
  55. package/dist/index25.js +43 -32
  56. package/dist/index25.js.map +1 -1
  57. package/dist/index26.js +30 -170
  58. package/dist/index26.js.map +1 -1
  59. package/dist/index27.js +171 -40
  60. package/dist/index27.js.map +1 -1
  61. package/dist/index28.js +41 -17
  62. package/dist/index28.js.map +1 -1
  63. package/dist/index29.js +17 -33
  64. package/dist/index29.js.map +1 -1
  65. package/dist/index30.js +33 -52
  66. package/dist/index30.js.map +1 -1
  67. package/dist/index31.js +50 -61
  68. package/dist/index31.js.map +1 -1
  69. package/dist/index32.js +60 -181
  70. package/dist/index32.js.map +1 -1
  71. package/dist/index33.js +184 -18
  72. package/dist/index33.js.map +1 -1
  73. package/dist/index34.js +15 -271
  74. package/dist/index34.js.map +1 -1
  75. package/dist/index35.js +270 -1083
  76. package/dist/index35.js.map +1 -1
  77. package/dist/index36.js +1086 -16
  78. package/dist/index36.js.map +1 -1
  79. package/dist/index37.js +17 -17
  80. package/dist/index37.js.map +1 -1
  81. package/dist/index38.js +15 -120
  82. package/dist/index38.js.map +1 -1
  83. package/dist/index39.js +119 -37
  84. package/dist/index39.js.map +1 -1
  85. package/dist/index40.js +40 -398
  86. package/dist/index40.js.map +1 -1
  87. package/dist/index41.js +390 -89
  88. package/dist/index41.js.map +1 -1
  89. package/dist/index42.js +91 -253
  90. package/dist/index42.js.map +1 -1
  91. package/dist/index43.js +249 -145
  92. package/dist/index43.js.map +1 -1
  93. package/dist/index44.js +155 -15
  94. package/dist/index44.js.map +1 -1
  95. package/dist/index45.js +15 -17
  96. package/dist/index45.js.map +1 -1
  97. package/dist/index46.js +16 -136
  98. package/dist/index46.js.map +1 -1
  99. package/dist/index47.js +134 -10
  100. package/dist/index47.js.map +1 -1
  101. package/dist/index48.js +13 -35
  102. package/dist/index48.js.map +1 -1
  103. package/dist/index49.js +35 -34
  104. package/dist/index49.js.map +1 -1
  105. package/dist/index50.js +34 -81
  106. package/dist/index50.js.map +1 -1
  107. package/dist/index51.js +71 -166
  108. package/dist/index51.js.map +1 -1
  109. package/dist/index52.js +167 -144
  110. package/dist/index52.js.map +1 -1
  111. package/dist/index53.js +152 -11
  112. package/dist/index53.js.map +1 -1
  113. package/dist/index54.js +10 -20
  114. package/dist/index54.js.map +1 -1
  115. package/dist/index55.js +55 -12
  116. package/dist/index55.js.map +1 -1
  117. package/dist/index56.js +14 -7
  118. package/dist/index56.js.map +1 -1
  119. package/dist/index57.js +6 -333
  120. package/dist/index57.js.map +1 -1
  121. package/dist/index58.js +334 -47
  122. package/dist/index58.js.map +1 -1
  123. package/dist/index59.js +47 -122
  124. package/dist/index59.js.map +1 -1
  125. package/dist/index60.js +120 -108
  126. package/dist/index60.js.map +1 -1
  127. package/dist/index61.js +107 -167
  128. package/dist/index61.js.map +1 -1
  129. package/dist/index62.js +167 -29
  130. package/dist/index62.js.map +1 -1
  131. package/dist/index63.js +30 -120
  132. package/dist/index63.js.map +1 -1
  133. package/dist/index64.js +116 -80
  134. package/dist/index64.js.map +1 -1
  135. package/dist/index65.js +85 -19
  136. package/dist/index65.js.map +1 -1
  137. package/dist/index66.js +19 -73
  138. package/dist/index66.js.map +1 -1
  139. package/dist/index67.js +71 -54
  140. package/dist/index67.js.map +1 -1
  141. package/dist/index68.js +56 -44
  142. package/dist/index68.js.map +1 -1
  143. package/dist/index69.js +42 -49
  144. package/dist/index69.js.map +1 -1
  145. package/dist/index70.js +50 -121
  146. package/dist/index70.js.map +1 -1
  147. package/dist/index71.js +118 -102
  148. package/dist/index71.js.map +1 -1
  149. package/dist/index72.js +105 -72
  150. package/dist/index72.js.map +1 -1
  151. package/dist/index73.js +73 -67
  152. package/dist/index73.js.map +1 -1
  153. package/dist/index74.js +66 -19
  154. package/dist/index74.js.map +1 -1
  155. package/dist/index75.js +18 -55
  156. package/dist/index75.js.map +1 -1
  157. package/dist/index76.js +55 -251
  158. package/dist/index76.js.map +1 -1
  159. package/dist/index77.js +254 -22
  160. package/dist/index77.js.map +1 -1
  161. package/dist/index78.js +22 -31
  162. package/dist/index78.js.map +1 -1
  163. package/dist/index79.js +30 -93
  164. package/dist/index79.js.map +1 -1
  165. package/dist/index80.js +89 -324
  166. package/dist/index80.js.map +1 -1
  167. package/dist/index81.js +322 -73
  168. package/dist/index81.js.map +1 -1
  169. package/dist/index82.js +79 -39
  170. package/dist/index82.js.map +1 -1
  171. package/dist/index83.js +40 -23
  172. package/dist/index83.js.map +1 -1
  173. package/dist/index84.js +21 -93
  174. package/dist/index84.js.map +1 -1
  175. package/dist/index85.js +87 -148
  176. package/dist/index85.js.map +1 -1
  177. package/dist/index86.js +147 -152
  178. package/dist/index86.js.map +1 -1
  179. package/dist/index87.js +159 -63
  180. package/dist/index87.js.map +1 -1
  181. package/dist/index88.js +65 -35
  182. package/dist/index88.js.map +1 -1
  183. package/dist/index89.js +35 -234
  184. package/dist/index89.js.map +1 -1
  185. package/dist/index90.js +231 -31
  186. package/dist/index90.js.map +1 -1
  187. package/dist/index91.js +34 -210
  188. package/dist/index91.js.map +1 -1
  189. package/dist/index92.js +195 -198
  190. package/dist/index92.js.map +1 -1
  191. package/dist/index93.js +159 -241
  192. package/dist/index93.js.map +1 -1
  193. package/dist/index94.js +283 -166
  194. package/dist/index94.js.map +1 -1
  195. package/dist/index95.js +173 -253
  196. package/dist/index95.js.map +1 -1
  197. package/dist/index96.js +258 -14
  198. package/dist/index96.js.map +1 -1
  199. package/dist/index97.js +124 -31
  200. package/dist/index97.js.map +1 -1
  201. package/dist/index98.js +13 -5
  202. package/dist/index98.js.map +1 -1
  203. package/dist/index99.js +31 -12
  204. package/dist/index99.js.map +1 -1
  205. package/package.json +1 -1
package/dist/index19.js CHANGED
@@ -1,199 +1,28 @@
1
- import { jsxs as b, Fragment as P, jsx as n } from "react/jsx-runtime";
2
- import T, { useState as g, useRef as C, useCallback as M, useEffect as N, createContext as W, useContext as z } from "react";
3
- import { createPortal as B } from "react-dom";
4
- const E = W(null), I = () => {
5
- const e = z(E);
6
- if (!e)
7
- throw new Error("ContextMenu compound components must be used within a ContextMenu");
8
- return e;
9
- }, A = ({
10
- itemKey: e,
11
- children: u,
12
- icon: l,
13
- disabled: s = !1,
14
- danger: d = !1,
15
- className: o = ""
16
- }) => {
17
- const { onSelect: h, onClose: t } = I();
18
- return /* @__PURE__ */ n("li", { className: o, children: /* @__PURE__ */ b(
19
- "button",
20
- {
21
- onClick: () => {
22
- s || (h(e), t());
23
- },
24
- disabled: s,
25
- className: `
26
- flex items-center gap-2 w-full px-4 py-2 text-left text-sm
27
- ${s ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
28
- ${d ? "text-error hover:bg-error/10" : ""}
29
- `,
30
- children: [
31
- l && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: l }),
32
- /* @__PURE__ */ n("span", { className: "flex-1", children: u })
33
- ]
34
- }
35
- ) });
36
- }, H = ({ className: e = "" }) => /* @__PURE__ */ n("li", { className: `divider my-1 ${e}` }), K = ({
37
- itemKey: e,
38
- label: u,
39
- icon: l,
40
- disabled: s = !1,
41
- children: d,
42
- className: o = ""
43
- }) => {
44
- const [h, t] = g(!1), a = C(null), c = () => {
45
- s || (a.current && clearTimeout(a.current), t(!0));
46
- }, m = () => {
47
- a.current = setTimeout(() => t(!1), 100);
48
- };
49
- return /* @__PURE__ */ b(
50
- "li",
51
- {
52
- onMouseEnter: c,
53
- onMouseLeave: m,
54
- className: `relative ${o}`,
55
- children: [
56
- /* @__PURE__ */ b(
57
- "button",
58
- {
59
- disabled: s,
60
- className: `
61
- flex items-center gap-2 w-full px-4 py-2 text-left text-sm
62
- ${s ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
63
- `,
64
- children: [
65
- l && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: l }),
66
- /* @__PURE__ */ n("span", { className: "flex-1", children: u }),
67
- /* @__PURE__ */ n("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ n("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
68
- ]
69
- }
70
- ),
71
- h && /* @__PURE__ */ n(
72
- "ul",
73
- {
74
- className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1",
75
- onMouseEnter: c,
76
- onMouseLeave: m,
77
- children: d
78
- }
79
- )
80
- ]
81
- }
82
- );
83
- }, L = ({ item: e, onSelect: u, onClose: l }) => {
84
- const [s, d] = g(!1), o = C(null);
85
- if (e.divider)
86
- return /* @__PURE__ */ n("li", { className: "divider my-1" });
87
- const h = () => {
88
- e.disabled || e.children && e.children.length > 0 || (u(e.key), l());
89
- }, t = e.children && e.children.length > 0, a = () => {
90
- t && (o.current && clearTimeout(o.current), d(!0));
91
- }, c = () => {
92
- t && (o.current = setTimeout(() => d(!1), 100));
93
- };
94
- return /* @__PURE__ */ b(
95
- "li",
96
- {
97
- onMouseEnter: a,
98
- onMouseLeave: c,
99
- className: "relative",
100
- children: [
101
- /* @__PURE__ */ b(
102
- "button",
103
- {
104
- onClick: h,
105
- disabled: e.disabled,
106
- className: `
107
- flex items-center gap-2 w-full px-4 py-2 text-left text-sm
108
- ${e.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
109
- ${e.danger ? "text-error hover:bg-error/10" : ""}
110
- `,
111
- children: [
112
- e.icon && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: e.icon }),
113
- /* @__PURE__ */ n("span", { className: "flex-1", children: e.label }),
114
- t && /* @__PURE__ */ n("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ n("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
115
- ]
116
- }
117
- ),
118
- t && s && /* @__PURE__ */ n(
119
- "ul",
120
- {
121
- className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1",
122
- onMouseEnter: a,
123
- onMouseLeave: c,
124
- children: e.children.map((m) => /* @__PURE__ */ n(L, { item: m, onSelect: u, onClose: l }, m.key))
125
- }
126
- )
127
- ]
128
- }
129
- );
130
- }, O = ({
1
+ import { jsx as n } from "react/jsx-runtime";
2
+ const o = {
3
+ sm: "max-w-screen-sm",
4
+ md: "max-w-screen-md",
5
+ lg: "max-w-screen-lg",
6
+ xl: "max-w-screen-xl",
7
+ "2xl": "max-w-screen-2xl",
8
+ full: "max-w-full"
9
+ }, c = ({
131
10
  children: e,
132
- items: u,
133
- onSelect: l,
134
- disabled: s = !1,
135
- className: d = ""
11
+ size: s = "xl",
12
+ centered: l = !0,
13
+ padding: x = !0,
14
+ className: m = "",
15
+ ...r
136
16
  }) => {
137
- const [o, h] = g(!1), [t, a] = g({ x: 0, y: 0 }), c = C(null), m = C(null), S = M(
138
- (r) => {
139
- if (s) return;
140
- r.preventDefault(), r.stopPropagation();
141
- let i = r.clientX, f = r.clientY;
142
- a({ x: i, y: f }), h(!0);
143
- },
144
- [s]
145
- ), x = M(() => {
146
- h(!1);
147
- }, []), y = M(
148
- (r) => {
149
- l?.(r);
150
- },
151
- [l]
152
- );
153
- N(() => {
154
- if (o && c.current) {
155
- const i = c.current.getBoundingClientRect(), f = window.innerWidth, p = window.innerHeight;
156
- let { x: v, y: w } = t;
157
- v + i.width > f && (v = f - i.width - 8), w + i.height > p && (w = p - i.height - 8), (v !== t.x || w !== t.y) && a({ x: v, y: w });
158
- }
159
- }, [o, t]), N(() => {
160
- if (!o) return;
161
- const r = (p) => {
162
- c.current && !c.current.contains(p.target) && x();
163
- }, i = (p) => {
164
- p.key === "Escape" && x();
165
- }, f = () => {
166
- x();
167
- };
168
- return document.addEventListener("mousedown", r), document.addEventListener("keydown", i), document.addEventListener("scroll", f, !0), () => {
169
- document.removeEventListener("mousedown", r), document.removeEventListener("keydown", i), document.removeEventListener("scroll", f, !0);
170
- };
171
- }, [o, x]);
172
- const k = T.Children.toArray(e), R = k[0], $ = k.slice(1), j = u && u.length > 0, D = {
173
- onSelect: y,
174
- onClose: x
175
- };
176
- return /* @__PURE__ */ b(P, { children: [
177
- /* @__PURE__ */ n("div", { ref: m, onContextMenu: S, className: "inline-block", children: R }),
178
- o && B(
179
- /* @__PURE__ */ n(E.Provider, { value: D, children: /* @__PURE__ */ n(
180
- "ul",
181
- {
182
- ref: c,
183
- className: `menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${d}`,
184
- style: { left: t.x, top: t.y },
185
- children: j ? u.map((r) => /* @__PURE__ */ n(L, { item: r, onSelect: y, onClose: x }, r.key)) : $
186
- }
187
- ) }),
188
- document.body
189
- )
190
- ] });
191
- }, Y = Object.assign(O, {
192
- Item: A,
193
- Divider: H,
194
- SubMenu: K
195
- });
17
+ const a = [
18
+ o[s],
19
+ l && "mx-auto",
20
+ x && "px-4 sm:px-6 lg:px-8",
21
+ m
22
+ ].filter(Boolean).join(" ");
23
+ return /* @__PURE__ */ n("div", { className: a, ...r, children: e });
24
+ };
196
25
  export {
197
- Y as ContextMenu
26
+ c as Container
198
27
  };
199
28
  //# sourceMappingURL=index19.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index19.js","sources":["../src/components/ContextMenu.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback, createContext, useContext } 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 (data-driven pattern) */\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\nexport interface ContextMenuItemProps {\n /** Unique key for the item */\n itemKey: string\n /** Item content */\n children: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Whether the item is disabled */\n disabled?: boolean\n /** Show as danger/destructive action */\n danger?: boolean\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface ContextMenuDividerProps {\n /** Additional CSS classes */\n className?: string\n}\n\nexport interface ContextMenuSubMenuProps {\n /** Unique key for the submenu */\n itemKey: string\n /** Submenu label */\n label: React.ReactNode\n /** Icon to display before label */\n icon?: React.ReactNode\n /** Whether the submenu is disabled */\n disabled?: boolean\n /** Submenu items */\n children: React.ReactNode\n /** Additional CSS classes */\n className?: string\n}\n\ninterface ContextMenuContextValue {\n onSelect: (key: string) => void\n onClose: () => void\n}\n\ninterface MenuPosition {\n x: number\n y: number\n}\n\nconst ContextMenuContext = createContext<ContextMenuContextValue | null>(null)\n\nconst useContextMenuContext = () => {\n const context = useContext(ContextMenuContext)\n if (!context) {\n throw new Error('ContextMenu compound components must be used within a ContextMenu')\n }\n return context\n}\n\n// Compound pattern components\nconst ContextMenuItemComponent: React.FC<ContextMenuItemProps> = ({\n itemKey,\n children,\n icon,\n disabled = false,\n danger = false,\n className = '',\n}) => {\n const { onSelect, onClose } = useContextMenuContext()\n\n const handleClick = () => {\n if (disabled) return\n onSelect(itemKey)\n onClose()\n }\n\n return (\n <li className={className}>\n <button\n onClick={handleClick}\n disabled={disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n ${danger ? 'text-error hover:bg-error/10' : ''}\n `}\n >\n {icon && <span className=\"w-4 h-4\">{icon}</span>}\n <span className=\"flex-1\">{children}</span>\n </button>\n </li>\n )\n}\n\nconst ContextMenuDividerComponent: React.FC<ContextMenuDividerProps> = ({ className = '' }) => {\n return <li className={`divider my-1 ${className}`}></li>\n}\n\nconst ContextMenuSubMenuComponent: React.FC<ContextMenuSubMenuProps> = ({\n itemKey: _itemKey,\n label,\n icon,\n disabled = false,\n children,\n className = '',\n}) => {\n const [showSubmenu, setShowSubmenu] = useState(false)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const handleMouseEnter = () => {\n if (disabled) return\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setShowSubmenu(true)\n }\n\n const handleMouseLeave = () => {\n timeoutRef.current = setTimeout(() => setShowSubmenu(false), 100)\n }\n\n return (\n <li\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`relative ${className}`}\n >\n <button\n disabled={disabled}\n className={`\n flex items-center gap-2 w-full px-4 py-2 text-left text-sm\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:bg-base-200'}\n `}\n >\n {icon && <span className=\"w-4 h-4\">{icon}</span>}\n <span className=\"flex-1\">{label}</span>\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 </button>\n {showSubmenu && (\n <ul\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n {children}\n </ul>\n )}\n </li>\n )\n}\n\n// Data-driven pattern internal component\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 timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(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 const handleMouseEnter = () => {\n if (!hasSubmenu) return\n if (timeoutRef.current) clearTimeout(timeoutRef.current)\n setShowSubmenu(true)\n }\n\n const handleMouseLeave = () => {\n if (!hasSubmenu) return\n timeoutRef.current = setTimeout(() => setShowSubmenu(false), 100)\n }\n\n return (\n <li\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\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\n className=\"menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\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\nconst ContextMenuRoot: 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 // Determine if using data-driven or compound pattern\n // Find menu content children (not the trigger element)\n const childArray = React.Children.toArray(children)\n const triggerChild = childArray[0]\n const menuChildren = childArray.slice(1)\n const useDataDriven = items && items.length > 0\n\n const contextValue: ContextMenuContextValue = {\n onSelect: handleSelect,\n onClose: handleClose,\n }\n\n return (\n <>\n <div ref={triggerRef} onContextMenu={handleContextMenu} className=\"inline-block\">\n {triggerChild}\n </div>\n {visible &&\n createPortal(\n <ContextMenuContext.Provider value={contextValue}>\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 {useDataDriven\n ? items!.map((item) => (\n <MenuItem key={item.key} item={item} onSelect={handleSelect} onClose={handleClose} />\n ))\n : menuChildren}\n </ul>\n </ContextMenuContext.Provider>,\n document.body\n )}\n </>\n )\n}\n\n// Assign compound components\nexport const ContextMenu = Object.assign(ContextMenuRoot, {\n Item: ContextMenuItemComponent,\n Divider: ContextMenuDividerComponent,\n SubMenu: ContextMenuSubMenuComponent,\n})\n"],"names":["ContextMenuContext","createContext","useContextMenuContext","context","useContext","ContextMenuItemComponent","itemKey","children","icon","disabled","danger","className","onSelect","onClose","jsx","jsxs","ContextMenuDividerComponent","ContextMenuSubMenuComponent","_itemKey","label","showSubmenu","setShowSubmenu","useState","timeoutRef","useRef","handleMouseEnter","handleMouseLeave","MenuItem","item","handleClick","hasSubmenu","child","ContextMenuRoot","items","visible","setVisible","position","setPosition","menuRef","triggerRef","handleContextMenu","useCallback","e","x","y","handleClose","handleSelect","key","useEffect","rect","viewportWidth","viewportHeight","handleClickOutside","handleEscape","handleScroll","childArray","React","triggerChild","menuChildren","useDataDriven","contextValue","Fragment","createPortal","ContextMenu"],"mappings":"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"}
1
+ {"version":3,"file":"index19.js","sources":["../src/components/Container.tsx"],"sourcesContent":["import React from 'react'\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Container content */\n children: React.ReactNode\n /** Max width size */\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'full'\n /** Center container horizontally */\n centered?: boolean\n /** Add horizontal padding */\n padding?: boolean\n}\n\nconst sizeClasses: Record<string, string> = {\n sm: 'max-w-screen-sm',\n md: 'max-w-screen-md',\n lg: 'max-w-screen-lg',\n xl: 'max-w-screen-xl',\n '2xl': 'max-w-screen-2xl',\n full: 'max-w-full',\n}\n\nexport const Container: React.FC<ContainerProps> = ({\n children,\n size = 'xl',\n centered = true,\n padding = true,\n className = '',\n ...rest\n}) => {\n const classes = [\n sizeClasses[size],\n centered && 'mx-auto',\n padding && 'px-4 sm:px-6 lg:px-8',\n className,\n ]\n .filter(Boolean)\n .join(' ')\n\n return <div className={classes} {...rest}>{children}</div>\n}\n"],"names":["sizeClasses","Container","children","size","centered","padding","className","rest","classes"],"mappings":";AAaA,MAAMA,IAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AACR,GAEaC,IAAsC,CAAC;AAAA,EAClD,UAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,UAAAC,IAAW;AAAA,EACX,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAU;AAAA,IACdR,EAAYG,CAAI;AAAA,IAChBC,KAAY;AAAA,IACZC,KAAW;AAAA,IACXC;AAAA,EAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,2BAAQ,OAAA,EAAI,WAAWE,GAAU,GAAGD,GAAO,UAAAL,GAAS;AACtD;"}
package/dist/index20.js CHANGED
@@ -1,117 +1,199 @@
1
- import { jsxs as c, jsx as t, Fragment as S } from "react/jsx-runtime";
2
- import { useState as D, useCallback as k, useEffect as I } from "react";
3
- const T = (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
- }, h = ({ value: s, label: e, size: r, showLabel: l, boxed: f }) => {
12
- const n = /* @__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 b, Fragment as P, jsx as n } from "react/jsx-runtime";
2
+ import T, { useState as g, useRef as C, useCallback as M, useEffect as N, createContext as W, useContext as z } from "react";
3
+ import { createPortal as B } from "react-dom";
4
+ const E = W(null), I = () => {
5
+ const e = z(E);
6
+ if (!e)
7
+ throw new Error("ContextMenu compound components must be used within a ContextMenu");
8
+ return e;
9
+ }, A = ({
10
+ itemKey: e,
11
+ children: u,
12
+ icon: l,
13
+ disabled: s = !1,
14
+ danger: d = !1,
15
+ className: o = ""
16
+ }) => {
17
+ const { onSelect: h, onClose: t } = I();
18
+ return /* @__PURE__ */ n("li", { className: o, children: /* @__PURE__ */ b(
19
+ "button",
20
20
  {
21
- style: { "--value": s, "--digits": 2 },
22
- "aria-live": "polite",
23
- "aria-label": String(s),
24
- children: String(s).padStart(2, "0")
21
+ onClick: () => {
22
+ s || (h(e), t());
23
+ },
24
+ disabled: s,
25
+ className: `
26
+ flex items-center gap-2 w-full px-4 py-2 text-left text-sm
27
+ ${s ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
28
+ ${d ? "text-error hover:bg-error/10" : ""}
29
+ `,
30
+ children: [
31
+ l && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: l }),
32
+ /* @__PURE__ */ n("span", { className: "flex-1", children: u })
33
+ ]
25
34
  }
26
35
  ) });
27
- return f ? /* @__PURE__ */ c("div", { className: "flex flex-col items-center bg-neutral text-neutral-content rounded-box p-2", children: [
28
- n,
29
- l && e && /* @__PURE__ */ t("span", { className: "text-xs mt-1", children: e })
30
- ] }) : l ? /* @__PURE__ */ c("div", { className: "flex flex-col items-center", children: [
31
- n,
32
- e && /* @__PURE__ */ t("span", { className: "text-xs text-base-content/70", children: e })
33
- ] }) : n;
34
- }, $ = ({
35
- value: s,
36
- format: e = "HH:MM:SS",
37
- onFinish: r,
38
- onChange: l,
39
- className: f = "",
40
- size: a = "md",
41
- showLabels: n = !1,
42
- labels: i = {},
43
- boxed: o = !1
36
+ }, H = ({ className: e = "" }) => /* @__PURE__ */ n("li", { className: `divider my-1 ${e}` }), K = ({
37
+ itemKey: e,
38
+ label: u,
39
+ icon: l,
40
+ disabled: s = !1,
41
+ children: d,
42
+ className: o = ""
44
43
  }) => {
45
- const d = s instanceof Date ? s.getTime() : s, [u, H] = D(() => T(d)), [M, L] = D(!1), m = {
46
- days: i.days || "days",
47
- hours: i.hours || "hours",
48
- minutes: i.minutes || "min",
49
- seconds: i.seconds || "sec"
50
- }, p = k(() => {
51
- const N = T(d);
52
- H(N);
53
- const C = d - Date.now();
54
- l?.(Math.max(0, C)), C <= 0 && !M && (L(!0), r?.());
55
- }, [d, l, r, M]);
56
- I(() => {
57
- const N = setInterval(p, 1e3);
58
- return p(), () => clearInterval(N);
59
- }, [p]);
60
- const j = e.includes("D"), v = e.includes("H"), g = e.includes("M"), x = e.includes("S"), w = a === "lg" || a === "xl" ? "text-3xl" : a === "md" ? "text-2xl" : "text-xl", y = !n && !o;
61
- return /* @__PURE__ */ c("div", { className: `flex gap-4 items-center ${f}`, children: [
62
- j && /* @__PURE__ */ c(S, { children: [
63
- /* @__PURE__ */ t(
64
- h,
65
- {
66
- value: u.days,
67
- label: m.days,
68
- size: a,
69
- showLabel: n,
70
- boxed: o
71
- }
72
- ),
73
- y && (v || g || x) && /* @__PURE__ */ t("span", { className: w, children: ":" })
74
- ] }),
75
- v && /* @__PURE__ */ c(S, { children: [
76
- /* @__PURE__ */ t(
77
- h,
78
- {
79
- value: u.hours,
80
- label: m.hours,
81
- size: a,
82
- showLabel: n,
83
- boxed: o
84
- }
85
- ),
86
- y && (g || x) && /* @__PURE__ */ t("span", { className: w, children: ":" })
87
- ] }),
88
- g && /* @__PURE__ */ c(S, { children: [
89
- /* @__PURE__ */ t(
90
- h,
44
+ const [h, t] = g(!1), a = C(null), c = () => {
45
+ s || (a.current && clearTimeout(a.current), t(!0));
46
+ }, m = () => {
47
+ a.current = setTimeout(() => t(!1), 100);
48
+ };
49
+ return /* @__PURE__ */ b(
50
+ "li",
51
+ {
52
+ onMouseEnter: c,
53
+ onMouseLeave: m,
54
+ className: `relative ${o}`,
55
+ children: [
56
+ /* @__PURE__ */ b(
57
+ "button",
58
+ {
59
+ disabled: s,
60
+ className: `
61
+ flex items-center gap-2 w-full px-4 py-2 text-left text-sm
62
+ ${s ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
63
+ `,
64
+ children: [
65
+ l && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: l }),
66
+ /* @__PURE__ */ n("span", { className: "flex-1", children: u }),
67
+ /* @__PURE__ */ n("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ n("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
68
+ ]
69
+ }
70
+ ),
71
+ h && /* @__PURE__ */ n(
72
+ "ul",
73
+ {
74
+ className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1",
75
+ onMouseEnter: c,
76
+ onMouseLeave: m,
77
+ children: d
78
+ }
79
+ )
80
+ ]
81
+ }
82
+ );
83
+ }, L = ({ item: e, onSelect: u, onClose: l }) => {
84
+ const [s, d] = g(!1), o = C(null);
85
+ if (e.divider)
86
+ return /* @__PURE__ */ n("li", { className: "divider my-1" });
87
+ const h = () => {
88
+ e.disabled || e.children && e.children.length > 0 || (u(e.key), l());
89
+ }, t = e.children && e.children.length > 0, a = () => {
90
+ t && (o.current && clearTimeout(o.current), d(!0));
91
+ }, c = () => {
92
+ t && (o.current = setTimeout(() => d(!1), 100));
93
+ };
94
+ return /* @__PURE__ */ b(
95
+ "li",
96
+ {
97
+ onMouseEnter: a,
98
+ onMouseLeave: c,
99
+ className: "relative",
100
+ children: [
101
+ /* @__PURE__ */ b(
102
+ "button",
103
+ {
104
+ onClick: h,
105
+ disabled: e.disabled,
106
+ className: `
107
+ flex items-center gap-2 w-full px-4 py-2 text-left text-sm
108
+ ${e.disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-base-200"}
109
+ ${e.danger ? "text-error hover:bg-error/10" : ""}
110
+ `,
111
+ children: [
112
+ e.icon && /* @__PURE__ */ n("span", { className: "w-4 h-4", children: e.icon }),
113
+ /* @__PURE__ */ n("span", { className: "flex-1", children: e.label }),
114
+ t && /* @__PURE__ */ n("svg", { className: "w-4 h-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: /* @__PURE__ */ n("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M9 5l7 7-7 7" }) })
115
+ ]
116
+ }
117
+ ),
118
+ t && s && /* @__PURE__ */ n(
119
+ "ul",
120
+ {
121
+ className: "menu bg-base-100 rounded-box shadow-lg border border-base-300 absolute left-full top-0 min-w-[160px] z-50 p-1",
122
+ onMouseEnter: a,
123
+ onMouseLeave: c,
124
+ children: e.children.map((m) => /* @__PURE__ */ n(L, { item: m, onSelect: u, onClose: l }, m.key))
125
+ }
126
+ )
127
+ ]
128
+ }
129
+ );
130
+ }, O = ({
131
+ children: e,
132
+ items: u,
133
+ onSelect: l,
134
+ disabled: s = !1,
135
+ className: d = ""
136
+ }) => {
137
+ const [o, h] = g(!1), [t, a] = g({ x: 0, y: 0 }), c = C(null), m = C(null), S = M(
138
+ (r) => {
139
+ if (s) return;
140
+ r.preventDefault(), r.stopPropagation();
141
+ let i = r.clientX, f = r.clientY;
142
+ a({ x: i, y: f }), h(!0);
143
+ },
144
+ [s]
145
+ ), x = M(() => {
146
+ h(!1);
147
+ }, []), y = M(
148
+ (r) => {
149
+ l?.(r);
150
+ },
151
+ [l]
152
+ );
153
+ N(() => {
154
+ if (o && c.current) {
155
+ const i = c.current.getBoundingClientRect(), f = window.innerWidth, p = window.innerHeight;
156
+ let { x: v, y: w } = t;
157
+ v + i.width > f && (v = f - i.width - 8), w + i.height > p && (w = p - i.height - 8), (v !== t.x || w !== t.y) && a({ x: v, y: w });
158
+ }
159
+ }, [o, t]), N(() => {
160
+ if (!o) return;
161
+ const r = (p) => {
162
+ c.current && !c.current.contains(p.target) && x();
163
+ }, i = (p) => {
164
+ p.key === "Escape" && x();
165
+ }, f = () => {
166
+ x();
167
+ };
168
+ return document.addEventListener("mousedown", r), document.addEventListener("keydown", i), document.addEventListener("scroll", f, !0), () => {
169
+ document.removeEventListener("mousedown", r), document.removeEventListener("keydown", i), document.removeEventListener("scroll", f, !0);
170
+ };
171
+ }, [o, x]);
172
+ const k = T.Children.toArray(e), R = k[0], $ = k.slice(1), j = u && u.length > 0, D = {
173
+ onSelect: y,
174
+ onClose: x
175
+ };
176
+ return /* @__PURE__ */ b(P, { children: [
177
+ /* @__PURE__ */ n("div", { ref: m, onContextMenu: S, className: "inline-block", children: R }),
178
+ o && B(
179
+ /* @__PURE__ */ n(E.Provider, { value: D, children: /* @__PURE__ */ n(
180
+ "ul",
91
181
  {
92
- value: u.minutes,
93
- label: m.minutes,
94
- size: a,
95
- showLabel: n,
96
- boxed: o
182
+ ref: c,
183
+ className: `menu bg-base-100 rounded-box shadow-lg border border-base-300 min-w-[160px] p-1 fixed z-[9999] ${d}`,
184
+ style: { left: t.x, top: t.y },
185
+ children: j ? u.map((r) => /* @__PURE__ */ n(L, { item: r, onSelect: y, onClose: x }, r.key)) : $
97
186
  }
98
- ),
99
- y && x && /* @__PURE__ */ t("span", { className: w, children: ":" })
100
- ] }),
101
- x && /* @__PURE__ */ t(
102
- h,
103
- {
104
- value: u.seconds,
105
- label: m.seconds,
106
- size: a,
107
- showLabel: n,
108
- boxed: o
109
- }
187
+ ) }),
188
+ document.body
110
189
  )
111
190
  ] });
112
- };
113
- $.displayName = "Countdown";
191
+ }, Y = Object.assign(O, {
192
+ Item: A,
193
+ Divider: H,
194
+ SubMenu: K
195
+ });
114
196
  export {
115
- $ as Countdown
197
+ Y as ContextMenu
116
198
  };
117
199
  //# sourceMappingURL=index20.js.map