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/index85.js CHANGED
@@ -1,261 +1,237 @@
1
- import { jsxs as p, jsx as t } from "react/jsx-runtime";
2
- import { useState as U, useRef as x } from "react";
3
- const K = ({
4
- action: N,
5
- accept: O,
6
- multiple: A = !1,
7
- maxCount: v,
8
- maxSize: b,
9
- listType: y = "text",
10
- fileList: L,
11
- defaultFileList: I = [],
12
- beforeUpload: D,
13
- onChange: m,
14
- onRemove: F,
15
- customRequest: k,
16
- showUploadList: B = !0,
17
- disabled: i = !1,
18
- children: R,
19
- className: T = "",
20
- ...W
21
- }) => {
22
- const [z, H] = U(I), [E, w] = U(!1), j = x(null), P = x(0), h = x(0), d = L !== void 0 ? L : z, S = () => (P.current += 1, `upload-${Date.now()}-${P.current}`), f = (e) => {
23
- L === void 0 && H(e);
24
- }, $ = (e) => {
25
- const r = {
26
- uid: S(),
27
- name: e.name,
28
- status: "uploading",
29
- percent: 0,
30
- originFileObj: e
31
- }, n = [...d, r];
32
- f(n), m?.({ file: r, fileList: n });
33
- const l = (o) => {
34
- const s = n.map(
35
- (a) => a.uid === r.uid ? { ...a, percent: o } : a
36
- );
37
- f(s), m?.({ file: { ...r, percent: o }, fileList: s });
38
- }, u = (o) => {
39
- const s = {
40
- ...r,
41
- status: "done",
42
- percent: 100,
43
- response: o
44
- }, a = n.map(
45
- (c) => c.uid === r.uid ? s : c
46
- );
47
- f(a), m?.({ file: s, fileList: a });
48
- }, g = (o) => {
49
- const s = {
50
- ...r,
51
- status: "error",
52
- error: o
53
- }, a = n.map(
54
- (c) => c.uid === r.uid ? s : c
55
- );
56
- f(a), m?.({ file: s, fileList: a });
1
+ import { jsxs as a, jsx as h } from "react/jsx-runtime";
2
+ import { useState as P, useRef as Z, useCallback as m, useEffect as g } from "react";
3
+ import { createPortal as I } from "react-dom";
4
+ const j = (t) => t ? typeof t == "function" ? t() : t.current : null, R = (t, f, e, i) => {
5
+ if (!t || f === "center")
6
+ return {
7
+ top: window.innerHeight / 2 - e.height / 2,
8
+ left: window.innerWidth / 2 - e.width / 2
57
9
  };
58
- if (k)
59
- k({
60
- file: e,
61
- onProgress: l,
62
- onSuccess: u,
63
- onError: g
64
- });
65
- else if (N) {
66
- const o = new FormData();
67
- o.append("file", e);
68
- const s = new XMLHttpRequest();
69
- s.upload.addEventListener("progress", (a) => {
70
- if (a.lengthComputable) {
71
- const c = Math.round(a.loaded / a.total * 100);
72
- l(c);
73
- }
74
- }), s.addEventListener("load", () => {
75
- s.status >= 200 && s.status < 300 ? u(s.response) : g(new Error(`Upload failed with status ${s.status}`));
76
- }), s.addEventListener("error", () => {
77
- g(new Error("Upload failed"));
78
- }), s.open("POST", N), s.send(o);
79
- } else
80
- u(null);
81
- }, C = async (e) => {
82
- if (i) return;
83
- const r = Array.from(e);
84
- if (v && d.length + r.length > v) {
85
- console.warn(`Cannot upload more than ${v} files`);
86
- return;
10
+ const o = window.scrollY, r = window.scrollX;
11
+ return {
12
+ top: {
13
+ top: t.top + o - e.height - i,
14
+ left: t.left + r + t.width / 2 - e.width / 2
15
+ },
16
+ topLeft: {
17
+ top: t.top + o - e.height - i,
18
+ left: t.left + r
19
+ },
20
+ topRight: {
21
+ top: t.top + o - e.height - i,
22
+ left: t.right + r - e.width
23
+ },
24
+ bottom: {
25
+ top: t.bottom + o + i,
26
+ left: t.left + r + t.width / 2 - e.width / 2
27
+ },
28
+ bottomLeft: {
29
+ top: t.bottom + o + i,
30
+ left: t.left + r
31
+ },
32
+ bottomRight: {
33
+ top: t.bottom + o + i,
34
+ left: t.right + r - e.width
35
+ },
36
+ left: {
37
+ top: t.top + o + t.height / 2 - e.height / 2,
38
+ left: t.left + r - e.width - i
39
+ },
40
+ leftTop: {
41
+ top: t.top + o,
42
+ left: t.left + r - e.width - i
43
+ },
44
+ leftBottom: {
45
+ top: t.bottom + o - e.height,
46
+ left: t.left + r - e.width - i
47
+ },
48
+ right: {
49
+ top: t.top + o + t.height / 2 - e.height / 2,
50
+ left: t.right + r + i
51
+ },
52
+ rightTop: {
53
+ top: t.top + o,
54
+ left: t.right + r + i
55
+ },
56
+ rightBottom: {
57
+ top: t.bottom + o - e.height,
58
+ left: t.right + r + i
59
+ },
60
+ center: {
61
+ top: window.innerHeight / 2 - e.height / 2,
62
+ left: window.innerWidth / 2 - e.width / 2
87
63
  }
88
- if (b) {
89
- const n = r.filter((l) => l.size > b);
90
- if (n.length > 0) {
91
- console.warn(
92
- `Files exceed maximum size of ${b} bytes:`,
93
- n.map((l) => l.name)
94
- );
95
- return;
96
- }
64
+ }[f];
65
+ }, nt = ({
66
+ open: t = !1,
67
+ onClose: f,
68
+ onFinish: e,
69
+ steps: i,
70
+ current: o,
71
+ onChange: r,
72
+ mask: p = !0,
73
+ type: D = "default",
74
+ gap: c = 8,
75
+ prevButtonText: F = "Previous",
76
+ nextButtonText: H = "Next",
77
+ finishButtonText: U = "Finish",
78
+ skipButtonText: W = "Skip",
79
+ showSkip: X = !0,
80
+ showIndicators: Y = !0,
81
+ closeOnMaskClick: A = !0,
82
+ closeOnEscape: E = !0,
83
+ scrollIntoView: S = !0,
84
+ zIndex: v = 1e3
85
+ }) => {
86
+ const [q, T] = P(0), [w, z] = P(null), [B, G] = P({ top: 0, left: 0 }), N = Z(null), b = o !== void 0, s = b ? o : q, l = i[s], u = Array.isArray(c) ? c[0] : c, C = Array.isArray(c) ? c[1] : c, y = m(() => {
87
+ if (!l) return;
88
+ const d = j(l.target)?.getBoundingClientRect() ?? null;
89
+ if (z(d), N.current) {
90
+ const M = N.current.getBoundingClientRect(), Q = l.placement ?? "bottom", V = R(d, Q, M, C + u);
91
+ G(V);
97
92
  }
98
- if (D) {
99
- const n = await Promise.all(
100
- r.map((u) => D(u, r))
101
- );
102
- r.filter((u, g) => n[g] !== !1).forEach($);
103
- } else
104
- r.forEach($);
105
- }, X = (e) => {
106
- e.target.files && C(e.target.files), e.target.value = "";
107
- }, _ = (e) => {
108
- e.preventDefault(), e.stopPropagation(), i || (h.current++, w(!0));
109
- }, q = (e) => {
110
- e.preventDefault(), e.stopPropagation(), i || (h.current--, h.current === 0 && w(!1));
111
- }, G = (e) => {
112
- e.preventDefault(), e.stopPropagation();
113
- }, J = (e) => {
114
- e.preventDefault(), e.stopPropagation(), h.current = 0, w(!1), !i && e.dataTransfer.files && C(e.dataTransfer.files);
115
- }, M = async (e) => {
116
- if (F && await F(e) === !1)
117
- return;
118
- const r = d.filter((n) => n.uid !== e.uid);
119
- f(r), m?.({ file: e, fileList: r });
120
- };
121
- return /* @__PURE__ */ p("div", { className: T, "data-state": E ? "dragging" : "idle", ...W, children: [
122
- /* @__PURE__ */ t(
123
- "div",
124
- {
125
- onDragEnter: _,
126
- onDragOver: G,
127
- onDragLeave: q,
128
- onDrop: J,
129
- onClick: () => !i && j.current?.click(),
130
- className: `
131
- border-2 border-dashed rounded-lg p-4 cursor-pointer transition-colors
132
- ${E ? "border-primary bg-primary/5" : "border-base-content/20"}
133
- ${i ? "opacity-50 cursor-not-allowed" : "hover:border-primary"}
134
- `,
135
- children: R || /* @__PURE__ */ p("div", { className: "flex flex-col items-center gap-2 py-4", children: [
136
- /* @__PURE__ */ t(
137
- "svg",
138
- {
139
- className: "w-12 h-12 text-base-content/40",
140
- fill: "none",
141
- viewBox: "0 0 24 24",
142
- stroke: "currentColor",
143
- children: /* @__PURE__ */ t(
144
- "path",
145
- {
146
- strokeLinecap: "round",
147
- strokeLinejoin: "round",
148
- strokeWidth: 2,
149
- d: "M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"
150
- }
151
- )
152
- }
153
- ),
154
- /* @__PURE__ */ p("div", { className: "text-sm text-center", children: [
155
- /* @__PURE__ */ t("span", { className: "font-semibold text-primary", children: "Click to upload" }),
156
- /* @__PURE__ */ t("span", { className: "text-base-content/60", children: " or drag and drop" })
157
- ] })
158
- ] })
159
- }
160
- ),
161
- /* @__PURE__ */ t(
162
- "input",
163
- {
164
- ref: j,
165
- type: "file",
166
- accept: O,
167
- multiple: A,
168
- onChange: X,
169
- disabled: i,
170
- className: "hidden"
171
- }
172
- ),
173
- !B || d.length === 0 ? null : y === "picture-card" ? /* @__PURE__ */ t("div", { className: "flex flex-wrap gap-2 mt-2", children: d.map((e) => /* @__PURE__ */ p(
174
- "div",
175
- {
176
- className: "relative w-24 h-24 border border-base-content/20 rounded-lg overflow-hidden",
177
- children: [
178
- e.status === "uploading" && /* @__PURE__ */ t("div", { className: "absolute inset-0 bg-base-300/80 flex items-center justify-center", children: /* @__PURE__ */ t("span", { className: "loading loading-spinner loading-sm" }) }),
179
- e.status === "done" && e.url && /* @__PURE__ */ t(
180
- "img",
181
- {
182
- src: e.url,
183
- alt: e.name,
184
- className: "w-full h-full object-cover"
185
- }
186
- ),
187
- e.status === "error" && /* @__PURE__ */ t("div", { className: "absolute inset-0 bg-error/10 flex items-center justify-center", children: /* @__PURE__ */ t(
188
- "svg",
189
- {
190
- className: "w-8 h-8 text-error",
191
- fill: "none",
192
- viewBox: "0 0 24 24",
193
- stroke: "currentColor",
194
- children: /* @__PURE__ */ t(
195
- "path",
93
+ }, [l, C, u]), k = m(
94
+ (n) => {
95
+ n < 0 || n >= i.length || (i[s]?.onClose?.(), b || T(n), r?.(n), i[n]?.onOpen?.());
96
+ },
97
+ [i, s, b, r]
98
+ ), x = m(() => {
99
+ k(s - 1);
100
+ }, [s, k]), L = m(() => {
101
+ s === i.length - 1 ? (e?.(), f?.()) : k(s + 1);
102
+ }, [s, i.length, k, e, f]), K = m(() => {
103
+ f?.();
104
+ }, [f]), O = m(() => {
105
+ A && f?.();
106
+ }, [A, f]);
107
+ if (g(() => {
108
+ t && !b && T(0);
109
+ }, [t, b]), g(() => {
110
+ t && (y(), S && l?.target && j(l.target)?.scrollIntoView({ behavior: "smooth", block: "center" }), s === 0 && l?.onOpen?.());
111
+ }, [t, s, l, S, y]), g(() => {
112
+ if (!t) return;
113
+ const n = () => y();
114
+ return window.addEventListener("resize", n), window.addEventListener("scroll", n, !0), requestAnimationFrame(y), () => {
115
+ window.removeEventListener("resize", n), window.removeEventListener("scroll", n, !0);
116
+ };
117
+ }, [t, y]), g(() => {
118
+ if (!t || !E) return;
119
+ const n = (d) => {
120
+ d.key === "Escape" ? f?.() : d.key === "ArrowRight" || d.key === "ArrowDown" ? L() : (d.key === "ArrowLeft" || d.key === "ArrowUp") && x();
121
+ };
122
+ return document.addEventListener("keydown", n), () => document.removeEventListener("keydown", n);
123
+ }, [t, E, f, L, x]), !t || !l) return null;
124
+ const _ = s === 0, $ = s === i.length - 1, J = /* @__PURE__ */ a(
125
+ "div",
126
+ {
127
+ className: "fixed inset-0",
128
+ style: { zIndex: v },
129
+ "data-testid": "tour",
130
+ role: "dialog",
131
+ "aria-modal": "true",
132
+ children: [
133
+ p && /* @__PURE__ */ a(
134
+ "svg",
135
+ {
136
+ className: "absolute inset-0 w-full h-full pointer-events-auto",
137
+ onClick: O,
138
+ style: { zIndex: v },
139
+ children: [
140
+ /* @__PURE__ */ h("defs", { children: /* @__PURE__ */ a("mask", { id: "tour-mask", children: [
141
+ /* @__PURE__ */ h("rect", { x: "0", y: "0", width: "100%", height: "100%", fill: "white" }),
142
+ w && /* @__PURE__ */ h(
143
+ "rect",
144
+ {
145
+ x: w.left - u,
146
+ y: w.top - u,
147
+ width: w.width + u * 2,
148
+ height: w.height + u * 2,
149
+ rx: u,
150
+ fill: "black"
151
+ }
152
+ )
153
+ ] }) }),
154
+ /* @__PURE__ */ h(
155
+ "rect",
196
156
  {
197
- strokeLinecap: "round",
198
- strokeLinejoin: "round",
199
- strokeWidth: 2,
200
- d: "M6 18L18 6M6 6l12 12"
157
+ x: "0",
158
+ y: "0",
159
+ width: "100%",
160
+ height: "100%",
161
+ fill: "rgba(0, 0, 0, 0.5)",
162
+ mask: "url(#tour-mask)"
201
163
  }
202
164
  )
203
- }
204
- ) }),
205
- /* @__PURE__ */ t(
206
- "button",
207
- {
208
- onClick: () => M(e),
209
- className: "absolute top-1 right-1 btn btn-xs btn-circle btn-error",
210
- type: "button",
211
- children: "✕"
212
- }
213
- )
214
- ]
215
- },
216
- e.uid
217
- )) }) : /* @__PURE__ */ t("div", { className: "mt-2 space-y-2", children: d.map((e) => /* @__PURE__ */ p(
218
- "div",
219
- {
220
- className: "flex items-center gap-2 p-2 border border-base-content/10 rounded-lg",
221
- children: [
222
- y === "picture" && e.url && /* @__PURE__ */ t(
223
- "img",
224
- {
225
- src: e.url,
226
- alt: e.name,
227
- className: "w-12 h-12 object-cover rounded"
228
- }
229
- ),
230
- /* @__PURE__ */ p("div", { className: "flex-1 min-w-0", children: [
231
- /* @__PURE__ */ t("div", { className: "truncate text-sm", children: e.name }),
232
- e.status === "uploading" && e.percent !== void 0 && /* @__PURE__ */ t("div", { className: "w-full bg-base-200 rounded-full h-1.5 mt-1", children: /* @__PURE__ */ t(
233
- "div",
234
- {
235
- className: "bg-primary h-1.5 rounded-full transition-all",
236
- style: { width: `${e.percent}%` }
237
- }
238
- ) }),
239
- e.status === "error" && /* @__PURE__ */ t("div", { className: "text-xs text-error mt-1", children: "Upload failed" })
240
- ] }),
241
- /* @__PURE__ */ t(
242
- "button",
243
- {
244
- onClick: () => M(e),
245
- className: "btn btn-xs btn-ghost btn-circle",
246
- type: "button",
247
- children: "✕"
248
- }
249
- )
250
- ]
251
- },
252
- e.uid
253
- )) })
254
- ] });
165
+ ]
166
+ }
167
+ ),
168
+ /* @__PURE__ */ a(
169
+ "div",
170
+ {
171
+ ref: N,
172
+ className: `absolute bg-base-100 rounded-lg shadow-xl border border-base-300 max-w-sm ${l.className ?? ""}`,
173
+ style: {
174
+ top: B.top,
175
+ left: B.left,
176
+ zIndex: v + 1
177
+ },
178
+ onClick: (n) => n.stopPropagation(),
179
+ "data-testid": "tour-popover",
180
+ children: [
181
+ l.cover && /* @__PURE__ */ h("div", { className: "rounded-t-lg overflow-hidden", children: l.cover }),
182
+ /* @__PURE__ */ a("div", { className: "p-4", children: [
183
+ /* @__PURE__ */ h("h3", { className: "font-semibold text-lg mb-1", children: l.title }),
184
+ l.description && /* @__PURE__ */ h("p", { className: "text-base-content/70 text-sm mb-4", children: l.description }),
185
+ Y && i.length > 1 && /* @__PURE__ */ h("div", { className: "flex gap-1 mb-4", children: i.map((n, d) => /* @__PURE__ */ h(
186
+ "button",
187
+ {
188
+ className: `w-2 h-2 rounded-full transition-colors ${d === s ? "bg-primary" : "bg-base-300 hover:bg-base-content/30"}`,
189
+ onClick: () => k(d),
190
+ "aria-label": `Go to step ${d + 1}`
191
+ },
192
+ d
193
+ )) }),
194
+ /* @__PURE__ */ a("div", { className: "flex items-center justify-between gap-2", children: [
195
+ /* @__PURE__ */ h("div", { children: X && !$ && /* @__PURE__ */ h(
196
+ "button",
197
+ {
198
+ className: "btn btn-ghost btn-sm",
199
+ onClick: K,
200
+ "data-testid": "tour-skip",
201
+ children: W
202
+ }
203
+ ) }),
204
+ /* @__PURE__ */ a("div", { className: "flex gap-2", children: [
205
+ !_ && /* @__PURE__ */ h(
206
+ "button",
207
+ {
208
+ className: "btn btn-ghost btn-sm",
209
+ onClick: x,
210
+ "data-testid": "tour-prev",
211
+ children: F
212
+ }
213
+ ),
214
+ /* @__PURE__ */ h(
215
+ "button",
216
+ {
217
+ className: `btn btn-sm ${D === "primary" ? "btn-primary" : ""}`,
218
+ onClick: L,
219
+ "data-testid": "tour-next",
220
+ children: $ ? U : H
221
+ }
222
+ )
223
+ ] })
224
+ ] })
225
+ ] })
226
+ ]
227
+ }
228
+ )
229
+ ]
230
+ }
231
+ );
232
+ return I(J, document.body);
255
233
  };
256
- K.displayName = "Upload";
257
234
  export {
258
- K as Upload,
259
- K as default
235
+ nt as Tour
260
236
  };
261
237
  //# sourceMappingURL=index85.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index85.js","sources":["../src/components/Upload.tsx"],"sourcesContent":["import React, { useState, useRef, DragEvent, ChangeEvent } from 'react'\n\nexport interface UploadFile {\n uid: string\n name: string\n status: 'uploading' | 'done' | 'error'\n percent?: number\n url?: string\n response?: any\n error?: any\n originFileObj?: File\n}\n\nexport interface UploadProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n action?: string\n accept?: string\n multiple?: boolean\n maxCount?: number\n maxSize?: number // in bytes\n listType?: 'text' | 'picture' | 'picture-card'\n fileList?: UploadFile[]\n defaultFileList?: UploadFile[]\n beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean>\n onChange?: (info: { file: UploadFile; fileList: UploadFile[] }) => void\n onRemove?: (file: UploadFile) => void | boolean | Promise<void | boolean>\n customRequest?: (options: {\n file: File\n onProgress: (percent: number) => void\n onSuccess: (response: any) => void\n onError: (error: any) => void\n }) => void\n showUploadList?: boolean\n disabled?: boolean\n children?: React.ReactNode\n}\n\nexport const Upload: React.FC<UploadProps> = ({\n action,\n accept,\n multiple = false,\n maxCount,\n maxSize,\n listType = 'text',\n fileList: controlledFileList,\n defaultFileList = [],\n beforeUpload,\n onChange,\n onRemove,\n customRequest,\n showUploadList = true,\n disabled = false,\n children,\n className = '',\n ...rest\n}) => {\n const [internalFileList, setInternalFileList] = useState<UploadFile[]>(defaultFileList)\n const [isDragging, setIsDragging] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const uidCounter = useRef(0)\n const dragCounter = useRef(0)\n\n const fileList = controlledFileList !== undefined ? controlledFileList : internalFileList\n\n const generateUid = () => {\n uidCounter.current += 1\n return `upload-${Date.now()}-${uidCounter.current}`\n }\n\n const updateFileList = (newFileList: UploadFile[]) => {\n if (controlledFileList === undefined) {\n setInternalFileList(newFileList)\n }\n }\n\n const uploadFile = (file: File) => {\n const uploadFile: UploadFile = {\n uid: generateUid(),\n name: file.name,\n status: 'uploading',\n percent: 0,\n originFileObj: file,\n }\n\n const newFileList = [...fileList, uploadFile]\n updateFileList(newFileList)\n onChange?.({ file: uploadFile, fileList: newFileList })\n\n const updateProgress = (percent: number) => {\n const updatedList = newFileList.map((f) =>\n f.uid === uploadFile.uid ? { ...f, percent } : f\n )\n updateFileList(updatedList)\n onChange?.({ file: { ...uploadFile, percent }, fileList: updatedList })\n }\n\n const onSuccess = (response: any) => {\n const successFile = {\n ...uploadFile,\n status: 'done' as const,\n percent: 100,\n response,\n }\n const updatedList = newFileList.map((f) =>\n f.uid === uploadFile.uid ? successFile : f\n )\n updateFileList(updatedList)\n onChange?.({ file: successFile, fileList: updatedList })\n }\n\n const onError = (error: any) => {\n const errorFile = {\n ...uploadFile,\n status: 'error' as const,\n error,\n }\n const updatedList = newFileList.map((f) =>\n f.uid === uploadFile.uid ? errorFile : f\n )\n updateFileList(updatedList)\n onChange?.({ file: errorFile, fileList: updatedList })\n }\n\n if (customRequest) {\n customRequest({\n file,\n onProgress: updateProgress,\n onSuccess,\n onError,\n })\n } else if (action) {\n const formData = new FormData()\n formData.append('file', file)\n\n const xhr = new XMLHttpRequest()\n\n xhr.upload.addEventListener('progress', (e) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100)\n updateProgress(percent)\n }\n })\n\n xhr.addEventListener('load', () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n onSuccess(xhr.response)\n } else {\n onError(new Error(`Upload failed with status ${xhr.status}`))\n }\n })\n\n xhr.addEventListener('error', () => {\n onError(new Error('Upload failed'))\n })\n\n xhr.open('POST', action)\n xhr.send(formData)\n } else {\n // No upload action, just mark as done\n onSuccess(null)\n }\n }\n\n const handleFiles = async (files: FileList | File[]) => {\n if (disabled) return\n\n const fileArray = Array.from(files)\n\n // Check maxCount\n if (maxCount && fileList.length + fileArray.length > maxCount) {\n console.warn(`Cannot upload more than ${maxCount} files`)\n return\n }\n\n // Check maxSize\n if (maxSize) {\n const oversizedFiles = fileArray.filter((file) => file.size > maxSize)\n if (oversizedFiles.length > 0) {\n console.warn(\n `Files exceed maximum size of ${maxSize} bytes:`,\n oversizedFiles.map((f) => f.name)\n )\n return\n }\n }\n\n // beforeUpload hook\n if (beforeUpload) {\n const results = await Promise.all(\n fileArray.map((file) => beforeUpload(file, fileArray))\n )\n const filteredFiles = fileArray.filter((_, index) => results[index] !== false)\n filteredFiles.forEach(uploadFile)\n } else {\n fileArray.forEach(uploadFile)\n }\n }\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n if (e.target.files) {\n handleFiles(e.target.files)\n }\n // Reset input value to allow uploading the same file again\n e.target.value = ''\n }\n\n const handleDragEnter = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!disabled) {\n dragCounter.current++\n setIsDragging(true)\n }\n }\n\n const handleDragLeave = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!disabled) {\n dragCounter.current--\n if (dragCounter.current === 0) {\n setIsDragging(false)\n }\n }\n }\n\n const handleDragOver = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n dragCounter.current = 0\n setIsDragging(false)\n\n if (disabled) return\n\n if (e.dataTransfer.files) {\n handleFiles(e.dataTransfer.files)\n }\n }\n\n const handleRemove = async (file: UploadFile) => {\n if (onRemove) {\n const result = await onRemove(file)\n if (result === false) return\n }\n\n const newFileList = fileList.filter((f) => f.uid !== file.uid)\n updateFileList(newFileList)\n onChange?.({ file, fileList: newFileList })\n }\n\n const renderFileList = () => {\n if (!showUploadList || fileList.length === 0) return null\n\n if (listType === 'picture-card') {\n return (\n <div className=\"flex flex-wrap gap-2 mt-2\">\n {fileList.map((file) => (\n <div\n key={file.uid}\n className=\"relative w-24 h-24 border border-base-content/20 rounded-lg overflow-hidden\"\n >\n {file.status === 'uploading' && (\n <div className=\"absolute inset-0 bg-base-300/80 flex items-center justify-center\">\n <span className=\"loading loading-spinner loading-sm\"></span>\n </div>\n )}\n {file.status === 'done' && file.url && (\n <img\n src={file.url}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n />\n )}\n {file.status === 'error' && (\n <div className=\"absolute inset-0 bg-error/10 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-error\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </div>\n )}\n <button\n onClick={() => handleRemove(file)}\n className=\"absolute top-1 right-1 btn btn-xs btn-circle btn-error\"\n type=\"button\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div className=\"mt-2 space-y-2\">\n {fileList.map((file) => (\n <div\n key={file.uid}\n className=\"flex items-center gap-2 p-2 border border-base-content/10 rounded-lg\"\n >\n {listType === 'picture' && file.url && (\n <img\n src={file.url}\n alt={file.name}\n className=\"w-12 h-12 object-cover rounded\"\n />\n )}\n <div className=\"flex-1 min-w-0\">\n <div className=\"truncate text-sm\">{file.name}</div>\n {file.status === 'uploading' && file.percent !== undefined && (\n <div className=\"w-full bg-base-200 rounded-full h-1.5 mt-1\">\n <div\n className=\"bg-primary h-1.5 rounded-full transition-all\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n )}\n {file.status === 'error' && (\n <div className=\"text-xs text-error mt-1\">Upload failed</div>\n )}\n </div>\n <button\n onClick={() => handleRemove(file)}\n className=\"btn btn-xs btn-ghost btn-circle\"\n type=\"button\"\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n )\n }\n\n return (\n <div className={className} data-state={isDragging ? 'dragging' : 'idle'} {...rest}>\n <div\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={() => !disabled && fileInputRef.current?.click()}\n className={`\n border-2 border-dashed rounded-lg p-4 cursor-pointer transition-colors\n ${isDragging ? 'border-primary bg-primary/5' : 'border-base-content/20'}\n ${disabled ? 'opacity-50 cursor-not-allowed' : 'hover:border-primary'}\n `}\n >\n {children || (\n <div className=\"flex flex-col items-center gap-2 py-4\">\n <svg\n className=\"w-12 h-12 text-base-content/40\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12\"\n />\n </svg>\n <div className=\"text-sm text-center\">\n <span className=\"font-semibold text-primary\">Click to upload</span>\n <span className=\"text-base-content/60\"> or drag and drop</span>\n </div>\n </div>\n )}\n </div>\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n onChange={handleChange}\n disabled={disabled}\n className=\"hidden\"\n />\n\n {renderFileList()}\n </div>\n )\n}\n\nUpload.displayName = 'Upload'\n\nexport default Upload\n"],"names":["Upload","action","accept","multiple","maxCount","maxSize","listType","controlledFileList","defaultFileList","beforeUpload","onChange","onRemove","customRequest","showUploadList","disabled","children","className","rest","internalFileList","setInternalFileList","useState","isDragging","setIsDragging","fileInputRef","useRef","uidCounter","dragCounter","fileList","generateUid","updateFileList","newFileList","uploadFile","file","updateProgress","percent","updatedList","f","onSuccess","response","successFile","onError","error","errorFile","formData","xhr","e","handleFiles","files","fileArray","oversizedFiles","results","_","index","handleChange","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleRemove","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index85.js","sources":["../src/components/Tour.tsx"],"sourcesContent":["import React, { useState, useEffect, useCallback, useRef } from 'react'\nimport { createPortal } from 'react-dom'\n\nexport type TourPlacement =\n | 'top'\n | 'topLeft'\n | 'topRight'\n | 'bottom'\n | 'bottomLeft'\n | 'bottomRight'\n | 'left'\n | 'leftTop'\n | 'leftBottom'\n | 'right'\n | 'rightTop'\n | 'rightBottom'\n | 'center'\n\nexport interface TourStepProps {\n /** Target element ref or function returning element */\n target?: React.RefObject<HTMLElement | null> | (() => HTMLElement | null) | null\n /** Step title */\n title: React.ReactNode\n /** Step description */\n description?: React.ReactNode\n /** Cover image or content above title */\n cover?: React.ReactNode\n /** Placement of popover relative to target */\n placement?: TourPlacement\n /** Custom class for this step's popover */\n className?: string\n /** Called when this step becomes active */\n onOpen?: () => void\n /** Called when leaving this step */\n onClose?: () => void\n}\n\nexport interface TourProps {\n /** Whether tour is visible */\n open?: boolean\n /** Callback when tour closes */\n onClose?: () => void\n /** Callback when tour finishes (last step completed) */\n onFinish?: () => void\n /** Tour steps */\n steps: TourStepProps[]\n /** Current step (controlled) */\n current?: number\n /** Callback when step changes */\n onChange?: (current: number) => void\n /** Show mask overlay */\n mask?: boolean\n /** Type affects styling */\n type?: 'default' | 'primary'\n /** Gap between highlight and target [radius, offset] or single number */\n gap?: number | [number, number]\n /** Text for prev button */\n prevButtonText?: React.ReactNode\n /** Text for next button */\n nextButtonText?: React.ReactNode\n /** Text for finish button */\n finishButtonText?: React.ReactNode\n /** Text for skip button */\n skipButtonText?: React.ReactNode\n /** Show skip button */\n showSkip?: boolean\n /** Show step indicators */\n showIndicators?: boolean\n /** Close on mask click */\n closeOnMaskClick?: boolean\n /** Close on escape key */\n closeOnEscape?: boolean\n /** Scroll target into view */\n scrollIntoView?: boolean\n /** Z-index for tour overlay */\n zIndex?: number\n}\n\nconst getTargetElement = (\n target: TourStepProps['target']\n): HTMLElement | null => {\n if (!target) return null\n if (typeof target === 'function') return target()\n return target.current\n}\n\nconst getPopoverPosition = (\n targetRect: DOMRect | null,\n placement: TourPlacement,\n popoverRect: DOMRect,\n gap: number\n): { top: number; left: number } => {\n if (!targetRect || placement === 'center') {\n return {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n }\n }\n\n const scrollY = window.scrollY\n const scrollX = window.scrollX\n\n const positions: Record<TourPlacement, { top: number; left: number }> = {\n top: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n topLeft: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.left + scrollX,\n },\n topRight: {\n top: targetRect.top + scrollY - popoverRect.height - gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n bottom: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX + targetRect.width / 2 - popoverRect.width / 2,\n },\n bottomLeft: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.left + scrollX,\n },\n bottomRight: {\n top: targetRect.bottom + scrollY + gap,\n left: targetRect.right + scrollX - popoverRect.width,\n },\n left: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftTop: {\n top: targetRect.top + scrollY,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n leftBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.left + scrollX - popoverRect.width - gap,\n },\n right: {\n top: targetRect.top + scrollY + targetRect.height / 2 - popoverRect.height / 2,\n left: targetRect.right + scrollX + gap,\n },\n rightTop: {\n top: targetRect.top + scrollY,\n left: targetRect.right + scrollX + gap,\n },\n rightBottom: {\n top: targetRect.bottom + scrollY - popoverRect.height,\n left: targetRect.right + scrollX + gap,\n },\n center: {\n top: window.innerHeight / 2 - popoverRect.height / 2,\n left: window.innerWidth / 2 - popoverRect.width / 2,\n },\n }\n\n return positions[placement]\n}\n\nexport const Tour: React.FC<TourProps> = ({\n open = false,\n onClose,\n onFinish,\n steps,\n current: controlledCurrent,\n onChange,\n mask = true,\n type = 'default',\n gap = 8,\n prevButtonText = 'Previous',\n nextButtonText = 'Next',\n finishButtonText = 'Finish',\n skipButtonText = 'Skip',\n showSkip = true,\n showIndicators = true,\n closeOnMaskClick = true,\n closeOnEscape = true,\n scrollIntoView = true,\n zIndex = 1000,\n}) => {\n const [internalCurrent, setInternalCurrent] = useState(0)\n const [targetRect, setTargetRect] = useState<DOMRect | null>(null)\n const [popoverPosition, setPopoverPosition] = useState({ top: 0, left: 0 })\n const popoverRef = useRef<HTMLDivElement>(null)\n\n const isControlled = controlledCurrent !== undefined\n const currentStep = isControlled ? controlledCurrent : internalCurrent\n const step = steps[currentStep]\n\n const gapRadius = Array.isArray(gap) ? gap[0] : gap\n const gapOffset = Array.isArray(gap) ? gap[1] : gap\n\n const updatePosition = useCallback(() => {\n if (!step) return\n\n const target = getTargetElement(step.target)\n const rect = target?.getBoundingClientRect() ?? null\n setTargetRect(rect)\n\n if (popoverRef.current) {\n const popoverRect = popoverRef.current.getBoundingClientRect()\n const placement = step.placement ?? 'bottom'\n const pos = getPopoverPosition(rect, placement, popoverRect, gapOffset + gapRadius)\n setPopoverPosition(pos)\n }\n }, [step, gapOffset, gapRadius])\n\n const goToStep = useCallback(\n (stepIndex: number) => {\n if (stepIndex < 0 || stepIndex >= steps.length) return\n\n // Call onClose for current step\n steps[currentStep]?.onClose?.()\n\n if (!isControlled) {\n setInternalCurrent(stepIndex)\n }\n onChange?.(stepIndex)\n\n // Call onOpen for new step\n steps[stepIndex]?.onOpen?.()\n },\n [steps, currentStep, isControlled, onChange]\n )\n\n const handlePrev = useCallback(() => {\n goToStep(currentStep - 1)\n }, [currentStep, goToStep])\n\n const handleNext = useCallback(() => {\n if (currentStep === steps.length - 1) {\n onFinish?.()\n onClose?.()\n } else {\n goToStep(currentStep + 1)\n }\n }, [currentStep, steps.length, goToStep, onFinish, onClose])\n\n const handleSkip = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const handleMaskClick = useCallback(() => {\n if (closeOnMaskClick) {\n onClose?.()\n }\n }, [closeOnMaskClick, onClose])\n\n // Reset to first step when opening\n useEffect(() => {\n if (open && !isControlled) {\n setInternalCurrent(0)\n }\n }, [open, isControlled])\n\n // Update position on step change or open\n useEffect(() => {\n if (!open) return\n\n updatePosition()\n\n // Scroll target into view\n if (scrollIntoView && step?.target) {\n const target = getTargetElement(step.target)\n target?.scrollIntoView({ behavior: 'smooth', block: 'center' })\n }\n\n // Call onOpen for first step\n if (currentStep === 0) {\n step?.onOpen?.()\n }\n }, [open, currentStep, step, scrollIntoView, updatePosition])\n\n // Update position on resize/scroll\n useEffect(() => {\n if (!open) return\n\n const handleUpdate = () => updatePosition()\n window.addEventListener('resize', handleUpdate)\n window.addEventListener('scroll', handleUpdate, true)\n\n // Initial position after popover renders\n requestAnimationFrame(updatePosition)\n\n return () => {\n window.removeEventListener('resize', handleUpdate)\n window.removeEventListener('scroll', handleUpdate, true)\n }\n }, [open, updatePosition])\n\n // Keyboard handling\n useEffect(() => {\n if (!open || !closeOnEscape) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.()\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowDown') {\n handleNext()\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') {\n handlePrev()\n }\n }\n\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [open, closeOnEscape, onClose, handleNext, handlePrev])\n\n if (!open || !step) return null\n\n const isFirstStep = currentStep === 0\n const isLastStep = currentStep === steps.length - 1\n\n const content = (\n <div\n className=\"fixed inset-0\"\n style={{ zIndex }}\n data-testid=\"tour\"\n role=\"dialog\"\n aria-modal=\"true\"\n >\n {/* Mask overlay with spotlight cutout */}\n {mask && (\n <svg\n className=\"absolute inset-0 w-full h-full pointer-events-auto\"\n onClick={handleMaskClick}\n style={{ zIndex }}\n >\n <defs>\n <mask id=\"tour-mask\">\n <rect x=\"0\" y=\"0\" width=\"100%\" height=\"100%\" fill=\"white\" />\n {targetRect && (\n <rect\n x={targetRect.left - gapRadius}\n y={targetRect.top - gapRadius}\n width={targetRect.width + gapRadius * 2}\n height={targetRect.height + gapRadius * 2}\n rx={gapRadius}\n fill=\"black\"\n />\n )}\n </mask>\n </defs>\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill=\"rgba(0, 0, 0, 0.5)\"\n mask=\"url(#tour-mask)\"\n />\n </svg>\n )}\n\n {/* Popover */}\n <div\n ref={popoverRef}\n className={`absolute bg-base-100 rounded-lg shadow-xl border border-base-300 max-w-sm ${step.className ?? ''}`}\n style={{\n top: popoverPosition.top,\n left: popoverPosition.left,\n zIndex: zIndex + 1,\n }}\n onClick={(e) => e.stopPropagation()}\n data-testid=\"tour-popover\"\n >\n {/* Cover */}\n {step.cover && (\n <div className=\"rounded-t-lg overflow-hidden\">{step.cover}</div>\n )}\n\n {/* Content */}\n <div className=\"p-4\">\n <h3 className=\"font-semibold text-lg mb-1\">{step.title}</h3>\n {step.description && (\n <p className=\"text-base-content/70 text-sm mb-4\">{step.description}</p>\n )}\n\n {/* Indicators */}\n {showIndicators && steps.length > 1 && (\n <div className=\"flex gap-1 mb-4\">\n {steps.map((_, index) => (\n <button\n key={index}\n className={`w-2 h-2 rounded-full transition-colors ${\n index === currentStep\n ? 'bg-primary'\n : 'bg-base-300 hover:bg-base-content/30'\n }`}\n onClick={() => goToStep(index)}\n aria-label={`Go to step ${index + 1}`}\n />\n ))}\n </div>\n )}\n\n {/* Navigation */}\n <div className=\"flex items-center justify-between gap-2\">\n <div>\n {showSkip && !isLastStep && (\n <button\n className=\"btn btn-ghost btn-sm\"\n onClick={handleSkip}\n data-testid=\"tour-skip\"\n >\n {skipButtonText}\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n {!isFirstStep && (\n <button\n className=\"btn btn-ghost btn-sm\"\n onClick={handlePrev}\n data-testid=\"tour-prev\"\n >\n {prevButtonText}\n </button>\n )}\n <button\n className={`btn btn-sm ${type === 'primary' ? 'btn-primary' : ''}`}\n onClick={handleNext}\n data-testid=\"tour-next\"\n >\n {isLastStep ? finishButtonText : nextButtonText}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n\n return createPortal(content, document.body)\n}\n"],"names":["getTargetElement","target","getPopoverPosition","targetRect","placement","popoverRect","gap","scrollY","scrollX","Tour","open","onClose","onFinish","steps","controlledCurrent","onChange","mask","type","prevButtonText","nextButtonText","finishButtonText","skipButtonText","showSkip","showIndicators","closeOnMaskClick","closeOnEscape","scrollIntoView","zIndex","internalCurrent","setInternalCurrent","useState","setTargetRect","popoverPosition","setPopoverPosition","popoverRef","useRef","isControlled","currentStep","step","gapRadius","gapOffset","updatePosition","useCallback","rect","pos","goToStep","stepIndex","handlePrev","handleNext","handleSkip","handleMaskClick","useEffect","handleUpdate","handleKeyDown","e","isFirstStep","isLastStep","content","jsxs","jsx","_","index","createPortal"],"mappings":"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"}