sa2kit 3.0.0 → 3.2.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 (980) hide show
  1. package/README.md +5 -5
  2. package/dist/AliyunOSSProvider-7IOT5U6M.js +15 -0
  3. package/dist/AliyunOSSProvider-7IOT5U6M.js.map +1 -0
  4. package/dist/AliyunOSSProvider-ZXZM7OQA.mjs +6 -0
  5. package/dist/AliyunOSSProvider-ZXZM7OQA.mjs.map +1 -0
  6. package/dist/LocalStorageProvider-KJKRCKBS.js +15 -0
  7. package/dist/LocalStorageProvider-KJKRCKBS.js.map +1 -0
  8. package/dist/LocalStorageProvider-O22465NY.mjs +6 -0
  9. package/dist/LocalStorageProvider-O22465NY.mjs.map +1 -0
  10. package/dist/chunk-2234T4A6.js +303 -0
  11. package/dist/chunk-2234T4A6.js.map +1 -0
  12. package/dist/chunk-36KGNXKW.js +16 -0
  13. package/dist/chunk-36KGNXKW.js.map +1 -0
  14. package/dist/chunk-375C7WL7.js +2695 -0
  15. package/dist/chunk-375C7WL7.js.map +1 -0
  16. package/dist/chunk-3J24Z4MB.js +991 -0
  17. package/dist/chunk-3J24Z4MB.js.map +1 -0
  18. package/dist/chunk-3QCATFQV.js +43 -0
  19. package/dist/chunk-3QCATFQV.js.map +1 -0
  20. package/dist/chunk-3R6JHA6D.js +120 -0
  21. package/dist/chunk-3R6JHA6D.js.map +1 -0
  22. package/dist/chunk-4OXKHV7J.js +43 -0
  23. package/dist/chunk-4OXKHV7J.js.map +1 -0
  24. package/dist/chunk-4PJM4752.js +4 -0
  25. package/dist/chunk-4PJM4752.js.map +1 -0
  26. package/dist/chunk-65JRVC3F.mjs +54 -0
  27. package/dist/chunk-65JRVC3F.mjs.map +1 -0
  28. package/dist/chunk-6HL54I2B.js +336 -0
  29. package/dist/chunk-6HL54I2B.js.map +1 -0
  30. package/dist/chunk-6V2MIQPF.mjs +77 -0
  31. package/dist/chunk-6V2MIQPF.mjs.map +1 -0
  32. package/dist/chunk-6YLCRWKM.mjs +8 -0
  33. package/dist/chunk-6YLCRWKM.mjs.map +1 -0
  34. package/dist/chunk-7CRU2Y5X.mjs +152 -0
  35. package/dist/chunk-7CRU2Y5X.mjs.map +1 -0
  36. package/dist/chunk-7PMT4L4I.js +324 -0
  37. package/dist/chunk-7PMT4L4I.js.map +1 -0
  38. package/dist/chunk-7VVZHFEM.js +88 -0
  39. package/dist/chunk-7VVZHFEM.js.map +1 -0
  40. package/dist/chunk-AWHGIKTQ.js +56 -0
  41. package/dist/chunk-AWHGIKTQ.js.map +1 -0
  42. package/dist/chunk-B3GYF6TY.js +37 -0
  43. package/dist/chunk-B3GYF6TY.js.map +1 -0
  44. package/dist/chunk-BDBJFOXM.mjs +14 -0
  45. package/dist/chunk-BDBJFOXM.mjs.map +1 -0
  46. package/dist/chunk-BTW3SWQN.mjs +25 -0
  47. package/dist/chunk-BTW3SWQN.mjs.map +1 -0
  48. package/dist/chunk-CHYSSZ4E.mjs +734 -0
  49. package/dist/chunk-CHYSSZ4E.mjs.map +1 -0
  50. package/dist/chunk-DO6QYAZV.mjs +298 -0
  51. package/dist/chunk-DO6QYAZV.mjs.map +1 -0
  52. package/dist/chunk-DTR53LQO.mjs +781 -0
  53. package/dist/chunk-DTR53LQO.mjs.map +1 -0
  54. package/dist/chunk-EI2S4XDG.mjs +89 -0
  55. package/dist/chunk-EI2S4XDG.mjs.map +1 -0
  56. package/dist/chunk-EOZHUI46.js +93 -0
  57. package/dist/chunk-EOZHUI46.js.map +1 -0
  58. package/dist/chunk-F2BZIU67.js +184 -0
  59. package/dist/chunk-F2BZIU67.js.map +1 -0
  60. package/dist/chunk-F2TEJSCP.js +756 -0
  61. package/dist/chunk-F2TEJSCP.js.map +1 -0
  62. package/dist/chunk-FCLS5R24.js +148 -0
  63. package/dist/chunk-FCLS5R24.js.map +1 -0
  64. package/dist/chunk-FUA6ZGMI.mjs +376 -0
  65. package/dist/chunk-FUA6ZGMI.mjs.map +1 -0
  66. package/dist/chunk-FY2X3LYR.mjs +3 -0
  67. package/dist/chunk-FY2X3LYR.mjs.map +1 -0
  68. package/dist/chunk-GS4SAW25.mjs +116 -0
  69. package/dist/chunk-GS4SAW25.mjs.map +1 -0
  70. package/dist/chunk-H56ICWUO.js +321 -0
  71. package/dist/chunk-H56ICWUO.js.map +1 -0
  72. package/dist/chunk-HG34SGMN.mjs +546 -0
  73. package/dist/chunk-HG34SGMN.mjs.map +1 -0
  74. package/dist/chunk-HL4H2HF6.js +279 -0
  75. package/dist/chunk-HL4H2HF6.js.map +1 -0
  76. package/dist/chunk-IJIQUMAK.mjs +272 -0
  77. package/dist/chunk-IJIQUMAK.mjs.map +1 -0
  78. package/dist/chunk-KEZFTDZT.mjs +559 -0
  79. package/dist/chunk-KEZFTDZT.mjs.map +1 -0
  80. package/dist/chunk-KHOVC2KL.js +144 -0
  81. package/dist/chunk-KHOVC2KL.js.map +1 -0
  82. package/dist/chunk-KRBSTLKC.js +6154 -0
  83. package/dist/chunk-KRBSTLKC.js.map +1 -0
  84. package/dist/chunk-KVYHCGRY.js +2011 -0
  85. package/dist/chunk-KVYHCGRY.js.map +1 -0
  86. package/dist/chunk-LZ5YTMMP.mjs +41 -0
  87. package/dist/chunk-LZ5YTMMP.mjs.map +1 -0
  88. package/dist/chunk-MJ6XJGAL.js +1551 -0
  89. package/dist/chunk-MJ6XJGAL.js.map +1 -0
  90. package/dist/chunk-MKLXCV4Z.mjs +1510 -0
  91. package/dist/chunk-MKLXCV4Z.mjs.map +1 -0
  92. package/dist/chunk-MMDSZIXD.mjs +286 -0
  93. package/dist/chunk-MMDSZIXD.mjs.map +1 -0
  94. package/dist/chunk-N2O3OX5Y.mjs +243 -0
  95. package/dist/chunk-N2O3OX5Y.mjs.map +1 -0
  96. package/dist/chunk-O6NNSPWD.mjs +35 -0
  97. package/dist/chunk-O6NNSPWD.mjs.map +1 -0
  98. package/dist/chunk-OIRZXSYM.js +80 -0
  99. package/dist/chunk-OIRZXSYM.js.map +1 -0
  100. package/dist/chunk-P7JQRNBJ.mjs +76 -0
  101. package/dist/chunk-P7JQRNBJ.mjs.map +1 -0
  102. package/dist/chunk-PA4ELVGI.js +20 -0
  103. package/dist/chunk-PA4ELVGI.js.map +1 -0
  104. package/dist/chunk-PLIG5257.mjs +2613 -0
  105. package/dist/chunk-PLIG5257.mjs.map +1 -0
  106. package/dist/chunk-QIF4MG5V.mjs +283 -0
  107. package/dist/chunk-QIF4MG5V.mjs.map +1 -0
  108. package/dist/chunk-RHECN4E2.mjs +6077 -0
  109. package/dist/chunk-RHECN4E2.mjs.map +1 -0
  110. package/dist/chunk-RHHTZTIN.mjs +314 -0
  111. package/dist/chunk-RHHTZTIN.mjs.map +1 -0
  112. package/dist/chunk-RRQ2X26Z.js +106 -0
  113. package/dist/chunk-RRQ2X26Z.js.map +1 -0
  114. package/dist/chunk-RST2T54Y.js +836 -0
  115. package/dist/chunk-RST2T54Y.js.map +1 -0
  116. package/dist/chunk-RVNQI6BI.js +249 -0
  117. package/dist/chunk-RVNQI6BI.js.map +1 -0
  118. package/dist/chunk-S3K4LTRI.mjs +226 -0
  119. package/dist/chunk-S3K4LTRI.mjs.map +1 -0
  120. package/dist/chunk-SWZ5XNF6.js +158 -0
  121. package/dist/chunk-SWZ5XNF6.js.map +1 -0
  122. package/dist/chunk-TNJ6LYX7.mjs +18 -0
  123. package/dist/chunk-TNJ6LYX7.mjs.map +1 -0
  124. package/dist/chunk-U7HNBCBS.js +207 -0
  125. package/dist/chunk-U7HNBCBS.js.map +1 -0
  126. package/dist/chunk-UJS3YSD3.mjs +37 -0
  127. package/dist/chunk-UJS3YSD3.mjs.map +1 -0
  128. package/dist/chunk-UJUWDF7M.mjs +336 -0
  129. package/dist/chunk-UJUWDF7M.mjs.map +1 -0
  130. package/dist/chunk-UR5NENGE.js +78 -0
  131. package/dist/chunk-UR5NENGE.js.map +1 -0
  132. package/dist/chunk-V7HGBDCB.mjs +135 -0
  133. package/dist/chunk-V7HGBDCB.mjs.map +1 -0
  134. package/dist/chunk-V7RLIZMN.js +90 -0
  135. package/dist/chunk-V7RLIZMN.js.map +1 -0
  136. package/dist/chunk-VCKXK6V5.js +345 -0
  137. package/dist/chunk-VCKXK6V5.js.map +1 -0
  138. package/dist/chunk-VIEXDTNF.mjs +100 -0
  139. package/dist/chunk-VIEXDTNF.mjs.map +1 -0
  140. package/dist/chunk-VN2DULIA.js +579 -0
  141. package/dist/chunk-VN2DULIA.js.map +1 -0
  142. package/dist/chunk-VNWMRUY6.js +168 -0
  143. package/dist/chunk-VNWMRUY6.js.map +1 -0
  144. package/dist/chunk-VYK4M2D6.mjs +177 -0
  145. package/dist/chunk-VYK4M2D6.mjs.map +1 -0
  146. package/dist/chunk-WB4H6ZUW.mjs +86 -0
  147. package/dist/chunk-WB4H6ZUW.mjs.map +1 -0
  148. package/dist/chunk-WM3AEJ2E.mjs +981 -0
  149. package/dist/chunk-WM3AEJ2E.mjs.map +1 -0
  150. package/dist/chunk-X5GINUGI.mjs +162 -0
  151. package/dist/chunk-X5GINUGI.mjs.map +1 -0
  152. package/dist/chunk-XB7GUEHZ.mjs +82 -0
  153. package/dist/chunk-XB7GUEHZ.mjs.map +1 -0
  154. package/dist/chunk-XE5RGZ3B.js +242 -0
  155. package/dist/chunk-XE5RGZ3B.js.map +1 -0
  156. package/dist/chunk-XNTIMVSL.mjs +193 -0
  157. package/dist/chunk-XNTIMVSL.mjs.map +1 -0
  158. package/dist/chunk-Y7WHUKJF.js +387 -0
  159. package/dist/chunk-Y7WHUKJF.js.map +1 -0
  160. package/dist/chunk-YIRPPMCN.mjs +1916 -0
  161. package/dist/chunk-YIRPPMCN.mjs.map +1 -0
  162. package/dist/chunk-YTGUIRRH.js +10 -0
  163. package/dist/chunk-YTGUIRRH.js.map +1 -0
  164. package/dist/chunk-Z2SNB5LJ.js +28 -0
  165. package/dist/chunk-Z2SNB5LJ.js.map +1 -0
  166. package/dist/chunk-ZOP7YIVX.js +552 -0
  167. package/dist/chunk-ZOP7YIVX.js.map +1 -0
  168. package/dist/chunk-ZUZLWHH5.mjs +146 -0
  169. package/dist/chunk-ZUZLWHH5.mjs.map +1 -0
  170. package/dist/common/ai/llm/core/index.d.mts +70 -0
  171. package/dist/common/ai/llm/core/index.d.ts +70 -0
  172. package/dist/common/ai/llm/core/index.js +54 -0
  173. package/dist/common/ai/llm/core/index.mjs +5 -0
  174. package/dist/common/ai/llm/electron/index.d.mts +6 -0
  175. package/dist/common/ai/llm/electron/index.d.ts +6 -0
  176. package/dist/common/ai/llm/electron/index.js +67 -0
  177. package/dist/common/ai/llm/electron/index.mjs +10 -0
  178. package/dist/common/ai/llm/index.d.mts +3 -0
  179. package/dist/common/ai/llm/index.d.ts +3 -0
  180. package/dist/common/ai/llm/index.js +54 -0
  181. package/dist/common/ai/llm/index.mjs +5 -0
  182. package/dist/common/ai/llm/miniapp/index.d.mts +6 -0
  183. package/dist/common/ai/llm/miniapp/index.d.ts +6 -0
  184. package/dist/common/ai/llm/miniapp/index.js +59 -0
  185. package/dist/common/ai/llm/miniapp/index.mjs +6 -0
  186. package/dist/common/ai/llm/rn/index.d.mts +6 -0
  187. package/dist/common/ai/llm/rn/index.d.ts +6 -0
  188. package/dist/common/ai/llm/rn/index.js +59 -0
  189. package/dist/common/ai/llm/rn/index.mjs +6 -0
  190. package/dist/common/ai/llm/ui/electron/index.d.mts +5 -0
  191. package/dist/common/ai/llm/ui/electron/index.d.ts +5 -0
  192. package/dist/common/ai/llm/ui/electron/index.js +22 -0
  193. package/dist/common/ai/llm/ui/electron/index.mjs +9 -0
  194. package/dist/common/ai/llm/ui/miniapp/index.d.mts +9 -0
  195. package/dist/common/ai/llm/ui/miniapp/index.d.ts +9 -0
  196. package/dist/common/ai/llm/ui/miniapp/index.js +14 -0
  197. package/dist/common/ai/llm/ui/miniapp/index.mjs +5 -0
  198. package/dist/common/ai/llm/ui/rn/index.d.mts +9 -0
  199. package/dist/common/ai/llm/ui/rn/index.d.ts +9 -0
  200. package/dist/common/ai/llm/ui/rn/index.js +14 -0
  201. package/dist/common/ai/llm/ui/rn/index.mjs +5 -0
  202. package/dist/common/ai/llm/ui/web/index.d.mts +15 -0
  203. package/dist/common/ai/llm/ui/web/index.d.ts +15 -0
  204. package/dist/common/ai/llm/ui/web/index.js +21 -0
  205. package/dist/common/ai/llm/ui/web/index.mjs +8 -0
  206. package/dist/common/ai/llm/web/index.d.mts +6 -0
  207. package/dist/common/ai/llm/web/index.d.ts +6 -0
  208. package/dist/common/ai/llm/web/index.js +66 -0
  209. package/dist/common/ai/llm/web/index.mjs +9 -0
  210. package/dist/common/analytics/index.d.mts +2 -0
  211. package/dist/common/analytics/index.d.ts +2 -0
  212. package/dist/common/analytics/index.js +314 -0
  213. package/dist/common/analytics/index.mjs +5 -0
  214. package/dist/common/analytics/server/index.js +529 -0
  215. package/dist/common/analytics/server/index.js.map +1 -0
  216. package/dist/common/analytics/server/index.mjs +525 -0
  217. package/dist/common/analytics/server/index.mjs.map +1 -0
  218. package/dist/common/api/index.d.mts +3 -0
  219. package/dist/common/api/index.d.ts +3 -0
  220. package/dist/common/api/index.js +21 -0
  221. package/dist/common/api/index.mjs +4 -0
  222. package/dist/common/auth/client/index.d.mts +1 -31
  223. package/dist/common/auth/client/index.d.ts +1 -31
  224. package/dist/common/auth/client/index.js +2 -15
  225. package/dist/common/auth/client/index.mjs +1 -2
  226. package/dist/common/auth/components/index.d.mts +5 -239
  227. package/dist/common/auth/components/index.d.ts +5 -239
  228. package/dist/common/auth/components/index.js +878 -49
  229. package/dist/common/auth/components/index.js.map +1 -1
  230. package/dist/common/auth/components/index.mjs +871 -5
  231. package/dist/common/auth/components/index.mjs.map +1 -1
  232. package/dist/common/auth/hooks/index.d.mts +2 -29
  233. package/dist/common/auth/hooks/index.d.ts +2 -29
  234. package/dist/common/auth/hooks/index.js +2 -11
  235. package/dist/common/auth/hooks/index.mjs +1 -2
  236. package/dist/common/auth/index.d.mts +5 -9
  237. package/dist/common/auth/index.d.ts +5 -9
  238. package/dist/common/auth/index.js +5 -26
  239. package/dist/common/auth/index.mjs +3 -4
  240. package/dist/common/auth/rn/index.d.mts +1 -17
  241. package/dist/common/auth/rn/index.d.ts +1 -17
  242. package/dist/common/auth/rn/index.js +2 -34
  243. package/dist/common/auth/rn/index.js.map +1 -1
  244. package/dist/common/auth/rn/index.mjs +2 -31
  245. package/dist/common/auth/rn/index.mjs.map +1 -1
  246. package/dist/common/auth/server/index.d.mts +81 -2
  247. package/dist/common/auth/server/index.d.ts +81 -2
  248. package/dist/common/auth/server/index.js +128 -37
  249. package/dist/common/auth/server/index.js.map +1 -1
  250. package/dist/common/auth/server/index.mjs +124 -1
  251. package/dist/common/auth/server/index.mjs.map +1 -1
  252. package/dist/common/auth/services/index.js +12 -9
  253. package/dist/common/auth/services/index.js.map +1 -1
  254. package/dist/common/auth/services/index.mjs +10 -1
  255. package/dist/common/auth/services/index.mjs.map +1 -1
  256. package/dist/common/components/index.d.mts +4 -0
  257. package/dist/common/components/index.d.ts +4 -0
  258. package/dist/common/components/index.js +414 -0
  259. package/dist/common/components/index.mjs +9 -0
  260. package/dist/common/config/index.d.mts +1 -0
  261. package/dist/common/config/index.d.ts +1 -0
  262. package/dist/common/config/index.js +21 -0
  263. package/dist/common/config/index.mjs +4 -0
  264. package/dist/common/config/server/index.js +1177 -0
  265. package/dist/common/config/server/index.js.map +1 -0
  266. package/dist/common/config/server/index.mjs +1138 -0
  267. package/dist/common/config/server/index.mjs.map +1 -0
  268. package/dist/common/export/index.d.mts +2 -2
  269. package/dist/common/export/index.d.ts +2 -2
  270. package/dist/common/export/index.js +67 -67
  271. package/dist/common/export/index.mjs +3 -3
  272. package/dist/common/export/server/index.d.mts +2 -2
  273. package/dist/common/export/server/index.d.ts +2 -2
  274. package/dist/common/export/server/index.js +76 -48
  275. package/dist/common/export/server/index.mjs +3 -3
  276. package/dist/common/file/index.d.mts +2 -2
  277. package/dist/common/file/index.d.ts +2 -2
  278. package/dist/common/file/index.js +27 -27
  279. package/dist/common/file/index.mjs +5 -5
  280. package/dist/common/file/server/index.d.mts +2 -2
  281. package/dist/common/file/server/index.d.ts +2 -2
  282. package/dist/common/file/server/index.js +58 -50
  283. package/dist/common/file/server/index.mjs +8 -8
  284. package/dist/common/i18n/index.d.mts +2 -0
  285. package/dist/common/i18n/index.d.ts +2 -0
  286. package/dist/common/i18n/index.js +73 -0
  287. package/dist/common/i18n/index.mjs +4 -0
  288. package/dist/common/imageCrop/index.d.mts +2 -0
  289. package/dist/common/imageCrop/index.d.ts +2 -0
  290. package/dist/common/imageCrop/index.js +61 -0
  291. package/dist/common/imageCrop/index.mjs +4 -0
  292. package/dist/common/index.d.mts +17 -20
  293. package/dist/common/index.d.ts +17 -20
  294. package/dist/common/index.js +76 -70
  295. package/dist/common/index.mjs +27 -29
  296. package/dist/common/logger/index.d.mts +1 -1
  297. package/dist/common/logger/index.d.ts +1 -1
  298. package/dist/common/logger/index.js +6 -7
  299. package/dist/common/logger/index.mjs +1 -2
  300. package/dist/common/ossFile/index.d.mts +61 -0
  301. package/dist/common/ossFile/index.d.ts +61 -0
  302. package/dist/common/ossFile/index.js +96 -0
  303. package/dist/common/ossFile/index.mjs +7 -0
  304. package/dist/common/ossFile/server/index.d.mts +94 -0
  305. package/dist/common/ossFile/server/index.d.ts +94 -0
  306. package/dist/common/ossFile/server/index.js +221 -0
  307. package/dist/common/ossFile/server/index.mjs +12 -0
  308. package/dist/common/platform/index.js +8 -8
  309. package/dist/common/platform/index.mjs +4 -4
  310. package/dist/common/request/index.d.mts +1 -1
  311. package/dist/common/request/index.d.ts +1 -1
  312. package/dist/common/request/index.js +5 -7
  313. package/dist/common/request/index.mjs +2 -4
  314. package/dist/common/storage/index.d.mts +1 -1
  315. package/dist/common/storage/index.d.ts +1 -1
  316. package/dist/common/storage/index.js +17 -17
  317. package/dist/common/storage/index.mjs +5 -5
  318. package/dist/common/universalExport/index.d.mts +232 -0
  319. package/dist/common/universalExport/index.d.ts +232 -0
  320. package/dist/common/universalExport/index.js +178 -0
  321. package/dist/common/universalExport/index.mjs +5 -0
  322. package/dist/common/universalExport/server/index.d.mts +1189 -0
  323. package/dist/common/universalExport/server/index.d.ts +1189 -0
  324. package/dist/common/universalExport/server/index.js +151 -0
  325. package/dist/common/universalExport/server/index.mjs +6 -0
  326. package/dist/common/universalFile/index.d.mts +409 -0
  327. package/dist/common/universalFile/index.d.ts +409 -0
  328. package/dist/common/universalFile/index.js +1742 -0
  329. package/dist/common/universalFile/index.js.map +1 -0
  330. package/dist/common/universalFile/index.mjs +1497 -0
  331. package/dist/common/universalFile/index.mjs.map +1 -0
  332. package/dist/common/universalFile/server/index.d.mts +1064 -0
  333. package/dist/common/universalFile/server/index.d.ts +1064 -0
  334. package/dist/common/universalFile/server/index.js +311 -0
  335. package/dist/common/universalFile/server/index.mjs +10 -0
  336. package/dist/common/utils/index.d.mts +1 -1
  337. package/dist/common/utils/index.d.ts +1 -1
  338. package/dist/common/utils/index.js +11 -12
  339. package/dist/common/utils/index.mjs +2 -3
  340. package/dist/index-BRLygK4h.d.ts +67 -0
  341. package/dist/index-BWNK5mH2.d.ts +76 -0
  342. package/dist/index-Bd7cKF1j.d.mts +50 -0
  343. package/dist/index-BiCK6gg6.d.mts +210 -0
  344. package/dist/index-BiCK6gg6.d.ts +210 -0
  345. package/dist/index-C-P2yBTH.d.mts +76 -0
  346. package/dist/index-CT4K2z-O.d.ts +81 -0
  347. package/dist/index-D6RJTGce.d.mts +81 -0
  348. package/dist/index-DA7L9JlE.d.mts +159 -0
  349. package/dist/index-DRQxtCDw.d.ts +50 -0
  350. package/dist/index-DXVph21C.d.mts +201 -0
  351. package/dist/index-DXVph21C.d.ts +201 -0
  352. package/dist/index-DzyK789B.d.mts +67 -0
  353. package/dist/index-FVJZCEtm.d.mts +145 -0
  354. package/dist/index-FVJZCEtm.d.ts +145 -0
  355. package/dist/index-nD9vPCZT.d.ts +159 -0
  356. package/dist/index-nOmIv2BG.d.mts +559 -0
  357. package/dist/index-nOmIv2BG.d.ts +559 -0
  358. package/dist/path-Bzc7hj1N.d.ts +45 -0
  359. package/dist/path-DN_65vhO.d.mts +45 -0
  360. package/dist/utils-Dm3O1rAa.d.mts +366 -0
  361. package/dist/utils-Dm3O1rAa.d.ts +366 -0
  362. package/package.json +293 -348
  363. package/dist/AliyunOSSProvider-4GRL2FJB.js +0 -15
  364. package/dist/AliyunOSSProvider-4GRL2FJB.js.map +0 -1
  365. package/dist/AliyunOSSProvider-QNVFIZ7Q.mjs +0 -6
  366. package/dist/AliyunOSSProvider-QNVFIZ7Q.mjs.map +0 -1
  367. package/dist/CollisionBalls-BpHufX3H.d.mts +0 -41
  368. package/dist/CollisionBalls-BpHufX3H.d.ts +0 -41
  369. package/dist/ConfigService-BxK06xP6.d.mts +0 -262
  370. package/dist/ConfigService-BxK06xP6.d.ts +0 -262
  371. package/dist/LocalStorageProvider-J5RHV37G.mjs +0 -6
  372. package/dist/LocalStorageProvider-J5RHV37G.mjs.map +0 -1
  373. package/dist/LocalStorageProvider-PFA2DMIJ.js +0 -15
  374. package/dist/LocalStorageProvider-PFA2DMIJ.js.map +0 -1
  375. package/dist/UniversalFileService-CC4d3wkc.d.ts +0 -139
  376. package/dist/UniversalFileService-CzAE_G4V.d.mts +0 -139
  377. package/dist/ai/llm/core/index.d.mts +0 -70
  378. package/dist/ai/llm/core/index.d.ts +0 -70
  379. package/dist/ai/llm/core/index.js +0 -54
  380. package/dist/ai/llm/core/index.mjs +0 -5
  381. package/dist/ai/llm/electron/index.d.mts +0 -6
  382. package/dist/ai/llm/electron/index.d.ts +0 -6
  383. package/dist/ai/llm/electron/index.js +0 -66
  384. package/dist/ai/llm/electron/index.mjs +0 -9
  385. package/dist/ai/llm/index.d.mts +0 -3
  386. package/dist/ai/llm/index.d.ts +0 -3
  387. package/dist/ai/llm/index.js +0 -54
  388. package/dist/ai/llm/index.mjs +0 -5
  389. package/dist/ai/llm/miniapp/index.d.mts +0 -6
  390. package/dist/ai/llm/miniapp/index.d.ts +0 -6
  391. package/dist/ai/llm/miniapp/index.js +0 -59
  392. package/dist/ai/llm/miniapp/index.mjs +0 -6
  393. package/dist/ai/llm/rn/index.d.mts +0 -6
  394. package/dist/ai/llm/rn/index.d.ts +0 -6
  395. package/dist/ai/llm/rn/index.js +0 -59
  396. package/dist/ai/llm/rn/index.mjs +0 -6
  397. package/dist/ai/llm/ui/electron/index.d.mts +0 -5
  398. package/dist/ai/llm/ui/electron/index.d.ts +0 -5
  399. package/dist/ai/llm/ui/electron/index.js +0 -21
  400. package/dist/ai/llm/ui/electron/index.mjs +0 -8
  401. package/dist/ai/llm/ui/miniapp/index.d.mts +0 -9
  402. package/dist/ai/llm/ui/miniapp/index.d.ts +0 -9
  403. package/dist/ai/llm/ui/miniapp/index.js +0 -14
  404. package/dist/ai/llm/ui/miniapp/index.mjs +0 -5
  405. package/dist/ai/llm/ui/rn/index.d.mts +0 -9
  406. package/dist/ai/llm/ui/rn/index.d.ts +0 -9
  407. package/dist/ai/llm/ui/rn/index.js +0 -14
  408. package/dist/ai/llm/ui/rn/index.mjs +0 -5
  409. package/dist/ai/llm/ui/web/index.d.mts +0 -15
  410. package/dist/ai/llm/ui/web/index.d.ts +0 -15
  411. package/dist/ai/llm/ui/web/index.js +0 -20
  412. package/dist/ai/llm/ui/web/index.mjs +0 -7
  413. package/dist/ai/llm/web/index.d.mts +0 -6
  414. package/dist/ai/llm/web/index.d.ts +0 -6
  415. package/dist/ai/llm/web/index.js +0 -65
  416. package/dist/ai/llm/web/index.mjs +0 -8
  417. package/dist/analytics/index.d.mts +0 -2
  418. package/dist/analytics/index.d.ts +0 -2
  419. package/dist/analytics/index.js +0 -314
  420. package/dist/analytics/index.mjs +0 -5
  421. package/dist/analytics/server/index.js +0 -529
  422. package/dist/analytics/server/index.js.map +0 -1
  423. package/dist/analytics/server/index.mjs +0 -525
  424. package/dist/analytics/server/index.mjs.map +0 -1
  425. package/dist/api/index.d.mts +0 -3
  426. package/dist/api/index.d.ts +0 -3
  427. package/dist/api/index.js +0 -21
  428. package/dist/api/index.mjs +0 -4
  429. package/dist/audioDetection/index.d.mts +0 -449
  430. package/dist/audioDetection/index.d.ts +0 -449
  431. package/dist/audioDetection/index.js +0 -1244
  432. package/dist/audioDetection/index.js.map +0 -1
  433. package/dist/audioDetection/index.mjs +0 -1227
  434. package/dist/audioDetection/index.mjs.map +0 -1
  435. package/dist/auth/client/index.d.mts +0 -13
  436. package/dist/auth/client/index.d.ts +0 -13
  437. package/dist/auth/client/index.js +0 -26
  438. package/dist/auth/client/index.mjs +0 -5
  439. package/dist/auth/components/index.d.mts +0 -10
  440. package/dist/auth/components/index.d.ts +0 -10
  441. package/dist/auth/components/index.js +0 -70
  442. package/dist/auth/components/index.mjs +0 -9
  443. package/dist/auth/hooks/index.d.mts +0 -13
  444. package/dist/auth/hooks/index.d.ts +0 -13
  445. package/dist/auth/hooks/index.js +0 -28
  446. package/dist/auth/hooks/index.mjs +0 -7
  447. package/dist/auth/index.d.mts +0 -21
  448. package/dist/auth/index.d.ts +0 -21
  449. package/dist/auth/index.js +0 -112
  450. package/dist/auth/index.mjs +0 -11
  451. package/dist/auth/rn/index.d.mts +0 -3133
  452. package/dist/auth/rn/index.d.ts +0 -3133
  453. package/dist/auth/rn/index.js +0 -684
  454. package/dist/auth/rn/index.js.map +0 -1
  455. package/dist/auth/rn/index.mjs +0 -663
  456. package/dist/auth/rn/index.mjs.map +0 -1
  457. package/dist/auth/schema/index.d.mts +0 -4
  458. package/dist/auth/schema/index.d.ts +0 -4
  459. package/dist/auth/schema/index.js +0 -49
  460. package/dist/auth/schema/index.mjs +0 -4
  461. package/dist/auth/services/index.d.mts +0 -1
  462. package/dist/auth/services/index.d.ts +0 -1
  463. package/dist/auth/services/index.js +0 -17
  464. package/dist/auth/services/index.mjs +0 -4
  465. package/dist/base-api-client-BpmcQt4Q.d.ts +0 -103
  466. package/dist/base-api-client-CFIhZK4C.d.mts +0 -277
  467. package/dist/base-api-client-CFIhZK4C.d.ts +0 -277
  468. package/dist/base-api-client-DXLsq2yz.d.mts +0 -103
  469. package/dist/boothVaultService-Cn4WPhjg.d.mts +0 -83
  470. package/dist/boothVaultService-Cn4WPhjg.d.ts +0 -83
  471. package/dist/business/index.d.mts +0 -2
  472. package/dist/business/index.d.ts +0 -2
  473. package/dist/business/index.js +0 -581
  474. package/dist/business/index.js.map +0 -1
  475. package/dist/business/index.mjs +0 -575
  476. package/dist/business/index.mjs.map +0 -1
  477. package/dist/calendar/index.d.mts +0 -1325
  478. package/dist/calendar/index.d.ts +0 -1325
  479. package/dist/calendar/index.js +0 -5964
  480. package/dist/calendar/index.js.map +0 -1
  481. package/dist/calendar/index.mjs +0 -5878
  482. package/dist/calendar/index.mjs.map +0 -1
  483. package/dist/calendar/routes/index.d.mts +0 -191
  484. package/dist/calendar/routes/index.d.ts +0 -191
  485. package/dist/calendar/routes/index.js +0 -844
  486. package/dist/calendar/routes/index.js.map +0 -1
  487. package/dist/calendar/routes/index.mjs +0 -826
  488. package/dist/calendar/routes/index.mjs.map +0 -1
  489. package/dist/chunk-25OFOKNF.js +0 -171
  490. package/dist/chunk-25OFOKNF.js.map +0 -1
  491. package/dist/chunk-2Y7BKFKZ.js +0 -37
  492. package/dist/chunk-2Y7BKFKZ.js.map +0 -1
  493. package/dist/chunk-3DXPQ4YV.mjs +0 -165
  494. package/dist/chunk-3DXPQ4YV.mjs.map +0 -1
  495. package/dist/chunk-3FRAIS4T.mjs +0 -35
  496. package/dist/chunk-3FRAIS4T.mjs.map +0 -1
  497. package/dist/chunk-3NHAT7D4.mjs +0 -361
  498. package/dist/chunk-3NHAT7D4.mjs.map +0 -1
  499. package/dist/chunk-3Z43XGA4.mjs +0 -54
  500. package/dist/chunk-3Z43XGA4.mjs.map +0 -1
  501. package/dist/chunk-4FDUURSD.js +0 -22
  502. package/dist/chunk-4FDUURSD.js.map +0 -1
  503. package/dist/chunk-4WBCWJSN.js +0 -836
  504. package/dist/chunk-4WBCWJSN.js.map +0 -1
  505. package/dist/chunk-5GBDDXYL.mjs +0 -23
  506. package/dist/chunk-5GBDDXYL.mjs.map +0 -1
  507. package/dist/chunk-5USIS3UM.js +0 -4
  508. package/dist/chunk-5USIS3UM.js.map +0 -1
  509. package/dist/chunk-7E3J7VAD.mjs +0 -3
  510. package/dist/chunk-7E3J7VAD.mjs.map +0 -1
  511. package/dist/chunk-ACUFEDVQ.js +0 -345
  512. package/dist/chunk-ACUFEDVQ.js.map +0 -1
  513. package/dist/chunk-AQPU2AXH.js +0 -756
  514. package/dist/chunk-AQPU2AXH.js.map +0 -1
  515. package/dist/chunk-ATUCZXJY.js +0 -80
  516. package/dist/chunk-ATUCZXJY.js.map +0 -1
  517. package/dist/chunk-B3CZ3HXJ.mjs +0 -126
  518. package/dist/chunk-B3CZ3HXJ.mjs.map +0 -1
  519. package/dist/chunk-BCE6RUZV.js +0 -2695
  520. package/dist/chunk-BCE6RUZV.js.map +0 -1
  521. package/dist/chunk-BIHYZA67.mjs +0 -2613
  522. package/dist/chunk-BIHYZA67.mjs.map +0 -1
  523. package/dist/chunk-C6KV7VTZ.mjs +0 -152
  524. package/dist/chunk-C6KV7VTZ.mjs.map +0 -1
  525. package/dist/chunk-CAYOQDBR.js +0 -78
  526. package/dist/chunk-CAYOQDBR.js.map +0 -1
  527. package/dist/chunk-CIVO4R6N.mjs +0 -37
  528. package/dist/chunk-CIVO4R6N.mjs.map +0 -1
  529. package/dist/chunk-CX2GHCAI.mjs +0 -217
  530. package/dist/chunk-CX2GHCAI.mjs.map +0 -1
  531. package/dist/chunk-DIF5VRL3.mjs +0 -73
  532. package/dist/chunk-DIF5VRL3.mjs.map +0 -1
  533. package/dist/chunk-FCEBAWN6.js +0 -18
  534. package/dist/chunk-FCEBAWN6.js.map +0 -1
  535. package/dist/chunk-FHIE5MTC.mjs +0 -541
  536. package/dist/chunk-FHIE5MTC.mjs.map +0 -1
  537. package/dist/chunk-FHLTPXAR.js +0 -56
  538. package/dist/chunk-FHLTPXAR.js.map +0 -1
  539. package/dist/chunk-FIUBFREP.mjs +0 -298
  540. package/dist/chunk-FIUBFREP.mjs.map +0 -1
  541. package/dist/chunk-FOQEQWX5.js +0 -4
  542. package/dist/chunk-FOQEQWX5.js.map +0 -1
  543. package/dist/chunk-FXQOXLDE.js +0 -120
  544. package/dist/chunk-FXQOXLDE.js.map +0 -1
  545. package/dist/chunk-G4NFB2QA.mjs +0 -212
  546. package/dist/chunk-G4NFB2QA.mjs.map +0 -1
  547. package/dist/chunk-G5HJGXGC.mjs +0 -39
  548. package/dist/chunk-G5HJGXGC.mjs.map +0 -1
  549. package/dist/chunk-G6HXNQ2U.mjs +0 -336
  550. package/dist/chunk-G6HXNQ2U.mjs.map +0 -1
  551. package/dist/chunk-G6NSKJMH.js +0 -106
  552. package/dist/chunk-G6NSKJMH.js.map +0 -1
  553. package/dist/chunk-G7UBMCUT.mjs +0 -41
  554. package/dist/chunk-G7UBMCUT.mjs.map +0 -1
  555. package/dist/chunk-GQZHGSRR.js +0 -44
  556. package/dist/chunk-GQZHGSRR.js.map +0 -1
  557. package/dist/chunk-GS7XLKET.js +0 -41
  558. package/dist/chunk-GS7XLKET.js.map +0 -1
  559. package/dist/chunk-GWNBVGDT.mjs +0 -1232
  560. package/dist/chunk-GWNBVGDT.mjs.map +0 -1
  561. package/dist/chunk-HDMIOOZY.mjs +0 -546
  562. package/dist/chunk-HDMIOOZY.mjs.map +0 -1
  563. package/dist/chunk-HJ6MH7J7.js +0 -552
  564. package/dist/chunk-HJ6MH7J7.js.map +0 -1
  565. package/dist/chunk-HJZHQW5R.mjs +0 -146
  566. package/dist/chunk-HJZHQW5R.mjs.map +0 -1
  567. package/dist/chunk-I5ZPEDNR.mjs +0 -734
  568. package/dist/chunk-I5ZPEDNR.mjs.map +0 -1
  569. package/dist/chunk-IBWDBBX5.mjs +0 -16
  570. package/dist/chunk-IBWDBBX5.mjs.map +0 -1
  571. package/dist/chunk-J77KR2EV.mjs +0 -193
  572. package/dist/chunk-J77KR2EV.mjs.map +0 -1
  573. package/dist/chunk-KH6RQ4J5.js +0 -28
  574. package/dist/chunk-KH6RQ4J5.js.map +0 -1
  575. package/dist/chunk-KQ643L7Z.js +0 -144
  576. package/dist/chunk-KQ643L7Z.js.map +0 -1
  577. package/dist/chunk-LFB5EIIM.mjs +0 -31
  578. package/dist/chunk-LFB5EIIM.mjs.map +0 -1
  579. package/dist/chunk-LHJKLUM7.mjs +0 -18
  580. package/dist/chunk-LHJKLUM7.mjs.map +0 -1
  581. package/dist/chunk-MBANGIG3.mjs +0 -781
  582. package/dist/chunk-MBANGIG3.mjs.map +0 -1
  583. package/dist/chunk-MWSAH7ZG.mjs +0 -42
  584. package/dist/chunk-MWSAH7ZG.mjs.map +0 -1
  585. package/dist/chunk-MZOGYD4N.mjs +0 -186
  586. package/dist/chunk-MZOGYD4N.mjs.map +0 -1
  587. package/dist/chunk-NCRP2YHY.mjs +0 -1598
  588. package/dist/chunk-NCRP2YHY.mjs.map +0 -1
  589. package/dist/chunk-NDGHXVGS.js +0 -25
  590. package/dist/chunk-NDGHXVGS.js.map +0 -1
  591. package/dist/chunk-NDPO5OMC.js +0 -563
  592. package/dist/chunk-NDPO5OMC.js.map +0 -1
  593. package/dist/chunk-PBI7FKMB.js +0 -43
  594. package/dist/chunk-PBI7FKMB.js.map +0 -1
  595. package/dist/chunk-Q5EDCKQA.js +0 -336
  596. package/dist/chunk-Q5EDCKQA.js.map +0 -1
  597. package/dist/chunk-Q5VFBPMG.mjs +0 -76
  598. package/dist/chunk-Q5VFBPMG.mjs.map +0 -1
  599. package/dist/chunk-QDUBO567.js +0 -1148
  600. package/dist/chunk-QDUBO567.js.map +0 -1
  601. package/dist/chunk-QP5N3ER6.js +0 -18
  602. package/dist/chunk-QP5N3ER6.js.map +0 -1
  603. package/dist/chunk-QXAOXBVB.mjs +0 -135
  604. package/dist/chunk-QXAOXBVB.mjs.map +0 -1
  605. package/dist/chunk-R2DXTE2L.js +0 -249
  606. package/dist/chunk-R2DXTE2L.js.map +0 -1
  607. package/dist/chunk-RJP2BRJD.mjs +0 -6077
  608. package/dist/chunk-RJP2BRJD.mjs.map +0 -1
  609. package/dist/chunk-RTD2WHQQ.mjs +0 -16
  610. package/dist/chunk-RTD2WHQQ.mjs.map +0 -1
  611. package/dist/chunk-RWCD2CAD.mjs +0 -1132
  612. package/dist/chunk-RWCD2CAD.mjs.map +0 -1
  613. package/dist/chunk-S37OK2QG.js +0 -216
  614. package/dist/chunk-S37OK2QG.js.map +0 -1
  615. package/dist/chunk-S3PUP7N4.js +0 -20
  616. package/dist/chunk-S3PUP7N4.js.map +0 -1
  617. package/dist/chunk-S6YSGVWD.js +0 -224
  618. package/dist/chunk-S6YSGVWD.js.map +0 -1
  619. package/dist/chunk-S732H246.js +0 -6154
  620. package/dist/chunk-S732H246.js.map +0 -1
  621. package/dist/chunk-SFDJNKWC.js +0 -22
  622. package/dist/chunk-SFDJNKWC.js.map +0 -1
  623. package/dist/chunk-SKFEJPMJ.mjs +0 -226
  624. package/dist/chunk-SKFEJPMJ.mjs.map +0 -1
  625. package/dist/chunk-SLKOEYFH.js +0 -303
  626. package/dist/chunk-SLKOEYFH.js.map +0 -1
  627. package/dist/chunk-TC5YU6A4.mjs +0 -243
  628. package/dist/chunk-TC5YU6A4.mjs.map +0 -1
  629. package/dist/chunk-TXMX6PZR.js +0 -190
  630. package/dist/chunk-TXMX6PZR.js.map +0 -1
  631. package/dist/chunk-UCOE6SET.js +0 -148
  632. package/dist/chunk-UCOE6SET.js.map +0 -1
  633. package/dist/chunk-UIYKZ73N.js +0 -36
  634. package/dist/chunk-UIYKZ73N.js.map +0 -1
  635. package/dist/chunk-V7EVKD5G.mjs +0 -116
  636. package/dist/chunk-V7EVKD5G.mjs.map +0 -1
  637. package/dist/chunk-VHN7PF5I.js +0 -20
  638. package/dist/chunk-VHN7PF5I.js.map +0 -1
  639. package/dist/chunk-VMTEDX5H.js +0 -1275
  640. package/dist/chunk-VMTEDX5H.js.map +0 -1
  641. package/dist/chunk-VRN76M56.mjs +0 -3
  642. package/dist/chunk-VRN76M56.mjs.map +0 -1
  643. package/dist/chunk-VXFUXZN5.mjs +0 -20
  644. package/dist/chunk-VXFUXZN5.mjs.map +0 -1
  645. package/dist/chunk-WEEXCPSE.mjs +0 -86
  646. package/dist/chunk-WEEXCPSE.mjs.map +0 -1
  647. package/dist/chunk-WW4GE6CZ.js +0 -1647
  648. package/dist/chunk-WW4GE6CZ.js.map +0 -1
  649. package/dist/chunk-WZDTNDYR.js +0 -207
  650. package/dist/chunk-WZDTNDYR.js.map +0 -1
  651. package/dist/chunk-XBZIS3MV.mjs +0 -13
  652. package/dist/chunk-XBZIS3MV.mjs.map +0 -1
  653. package/dist/chunk-XFOZ56FB.mjs +0 -20
  654. package/dist/chunk-XFOZ56FB.mjs.map +0 -1
  655. package/dist/chunk-XJ7ZAGC5.js +0 -88
  656. package/dist/chunk-XJ7ZAGC5.js.map +0 -1
  657. package/dist/chunk-XUS5ACKR.mjs +0 -100
  658. package/dist/chunk-XUS5ACKR.mjs.map +0 -1
  659. package/dist/chunk-YOTQG4NP.mjs +0 -314
  660. package/dist/chunk-YOTQG4NP.mjs.map +0 -1
  661. package/dist/chunk-Z23HAXHL.js +0 -136
  662. package/dist/chunk-Z23HAXHL.js.map +0 -1
  663. package/dist/chunk-ZGVB35L2.mjs +0 -25
  664. package/dist/chunk-ZGVB35L2.mjs.map +0 -1
  665. package/dist/chunk-ZLYPALF3.js +0 -242
  666. package/dist/chunk-ZLYPALF3.js.map +0 -1
  667. package/dist/chunk-ZM2SZJTZ.js +0 -158
  668. package/dist/chunk-ZM2SZJTZ.js.map +0 -1
  669. package/dist/chunk-ZRAW3HXA.js +0 -43
  670. package/dist/chunk-ZRAW3HXA.js.map +0 -1
  671. package/dist/chunk-ZWQJSZEY.js +0 -371
  672. package/dist/chunk-ZWQJSZEY.js.map +0 -1
  673. package/dist/components/index.d.mts +0 -405
  674. package/dist/components/index.d.ts +0 -405
  675. package/dist/components/index.js +0 -2516
  676. package/dist/components/index.js.map +0 -1
  677. package/dist/components/index.mjs +0 -2396
  678. package/dist/components/index.mjs.map +0 -1
  679. package/dist/config/index.d.mts +0 -1
  680. package/dist/config/index.d.ts +0 -1
  681. package/dist/config/index.js +0 -21
  682. package/dist/config/index.mjs +0 -4
  683. package/dist/config/server/index.js +0 -1177
  684. package/dist/config/server/index.js.map +0 -1
  685. package/dist/config/server/index.mjs +0 -1138
  686. package/dist/config/server/index.mjs.map +0 -1
  687. package/dist/drizzle-schema-BNhqj2AZ.d.mts +0 -1114
  688. package/dist/drizzle-schema-BNhqj2AZ.d.ts +0 -1114
  689. package/dist/festivalCard/index.d.mts +0 -76
  690. package/dist/festivalCard/index.d.ts +0 -76
  691. package/dist/festivalCard/index.js +0 -1492
  692. package/dist/festivalCard/index.js.map +0 -1
  693. package/dist/festivalCard/index.mjs +0 -1475
  694. package/dist/festivalCard/index.mjs.map +0 -1
  695. package/dist/festivalCard/routes/index.d.mts +0 -42
  696. package/dist/festivalCard/routes/index.d.ts +0 -42
  697. package/dist/festivalCard/routes/index.js +0 -361
  698. package/dist/festivalCard/routes/index.js.map +0 -1
  699. package/dist/festivalCard/routes/index.mjs +0 -356
  700. package/dist/festivalCard/routes/index.mjs.map +0 -1
  701. package/dist/festivalCard/server/index.d.mts +0 -120
  702. package/dist/festivalCard/server/index.d.ts +0 -120
  703. package/dist/festivalCard/server/index.js +0 -272
  704. package/dist/festivalCard/server/index.js.map +0 -1
  705. package/dist/festivalCard/server/index.mjs +0 -265
  706. package/dist/festivalCard/server/index.mjs.map +0 -1
  707. package/dist/festivalCardService-B3GsnNpV.d.ts +0 -13
  708. package/dist/festivalCardService-CWhrLNE9.d.mts +0 -13
  709. package/dist/i18n/index.d.mts +0 -2
  710. package/dist/i18n/index.d.ts +0 -2
  711. package/dist/i18n/index.js +0 -73
  712. package/dist/i18n/index.mjs +0 -4
  713. package/dist/imageCrop/index.d.mts +0 -165
  714. package/dist/imageCrop/index.d.ts +0 -165
  715. package/dist/imageCrop/index.js +0 -560
  716. package/dist/imageCrop/index.js.map +0 -1
  717. package/dist/imageCrop/index.mjs +0 -541
  718. package/dist/imageCrop/index.mjs.map +0 -1
  719. package/dist/index-2G9Dxjvt.d.ts +0 -81
  720. package/dist/index-BcjDRcKp.d.mts +0 -40
  721. package/dist/index-Bjem5rWn.d.mts +0 -17
  722. package/dist/index-BlpXrrTy.d.ts +0 -40
  723. package/dist/index-C5U-2hJq.d.ts +0 -23
  724. package/dist/index-CYuUB8aF.d.mts +0 -67
  725. package/dist/index-CifSBBP2.d.ts +0 -17
  726. package/dist/index-D0K4ehme.d.mts +0 -20
  727. package/dist/index-DLnfKN-a.d.mts +0 -23
  728. package/dist/index-DSel44Ke.d.mts +0 -93
  729. package/dist/index-DSel44Ke.d.ts +0 -93
  730. package/dist/index-DZ5iJtNO.d.mts +0 -102
  731. package/dist/index-DZ5iJtNO.d.ts +0 -102
  732. package/dist/index-Da7qdkgW.d.ts +0 -20
  733. package/dist/index-DrPcMJPc.d.mts +0 -250
  734. package/dist/index-DrPcMJPc.d.ts +0 -250
  735. package/dist/index-WrR57hKT.d.ts +0 -67
  736. package/dist/index-oLUvfqT8.d.ts +0 -20
  737. package/dist/index-pe38RDgC.d.mts +0 -20
  738. package/dist/index-qcOvRVuN.d.mts +0 -81
  739. package/dist/index.d.mts +0 -11590
  740. package/dist/index.d.ts +0 -11590
  741. package/dist/index.js +0 -17679
  742. package/dist/index.js.map +0 -1
  743. package/dist/index.mjs +0 -17403
  744. package/dist/index.mjs.map +0 -1
  745. package/dist/logger/index.d.mts +0 -125
  746. package/dist/logger/index.d.ts +0 -125
  747. package/dist/logger/index.js +0 -29
  748. package/dist/logger/index.mjs +0 -4
  749. package/dist/mikuContest/ui/web/index.d.mts +0 -2
  750. package/dist/mikuContest/ui/web/index.d.ts +0 -2
  751. package/dist/mikuContest/ui/web/index.js +0 -353
  752. package/dist/mikuContest/ui/web/index.js.map +0 -1
  753. package/dist/mikuContest/ui/web/index.mjs +0 -343
  754. package/dist/mikuContest/ui/web/index.mjs.map +0 -1
  755. package/dist/mikuFireworks3D/index.d.mts +0 -268
  756. package/dist/mikuFireworks3D/index.d.ts +0 -268
  757. package/dist/mikuFireworks3D/index.js +0 -1267
  758. package/dist/mikuFireworks3D/index.js.map +0 -1
  759. package/dist/mikuFireworks3D/index.mjs +0 -1228
  760. package/dist/mikuFireworks3D/index.mjs.map +0 -1
  761. package/dist/mikuFusionGame/index.d.mts +0 -117
  762. package/dist/mikuFusionGame/index.d.ts +0 -117
  763. package/dist/mikuFusionGame/index.js +0 -1208
  764. package/dist/mikuFusionGame/index.js.map +0 -1
  765. package/dist/mikuFusionGame/index.mjs +0 -1195
  766. package/dist/mikuFusionGame/index.mjs.map +0 -1
  767. package/dist/mmd/admin/index.d.mts +0 -487
  768. package/dist/mmd/admin/index.d.ts +0 -487
  769. package/dist/mmd/admin/index.js +0 -1058
  770. package/dist/mmd/admin/index.js.map +0 -1
  771. package/dist/mmd/admin/index.mjs +0 -1027
  772. package/dist/mmd/admin/index.mjs.map +0 -1
  773. package/dist/mmd/index.d.mts +0 -2467
  774. package/dist/mmd/index.d.ts +0 -2467
  775. package/dist/mmd/index.js +0 -10119
  776. package/dist/mmd/index.js.map +0 -1
  777. package/dist/mmd/index.mjs +0 -10028
  778. package/dist/mmd/index.mjs.map +0 -1
  779. package/dist/mmd/server/index.d.mts +0 -139
  780. package/dist/mmd/server/index.d.ts +0 -139
  781. package/dist/mmd/server/index.js +0 -424
  782. package/dist/mmd/server/index.js.map +0 -1
  783. package/dist/mmd/server/index.mjs +0 -404
  784. package/dist/mmd/server/index.mjs.map +0 -1
  785. package/dist/music/index.d.mts +0 -74
  786. package/dist/music/index.d.ts +0 -74
  787. package/dist/music/index.js +0 -830
  788. package/dist/music/index.js.map +0 -1
  789. package/dist/music/index.mjs +0 -809
  790. package/dist/music/index.mjs.map +0 -1
  791. package/dist/music/server/index.d.mts +0 -1
  792. package/dist/music/server/index.d.ts +0 -1
  793. package/dist/music/server/index.js +0 -194
  794. package/dist/music/server/index.js.map +0 -1
  795. package/dist/music/server/index.mjs +0 -182
  796. package/dist/music/server/index.mjs.map +0 -1
  797. package/dist/navigation/index.d.mts +0 -93
  798. package/dist/navigation/index.d.ts +0 -93
  799. package/dist/navigation/index.js +0 -453
  800. package/dist/navigation/index.js.map +0 -1
  801. package/dist/navigation/index.mjs +0 -443
  802. package/dist/navigation/index.mjs.map +0 -1
  803. package/dist/ossFile/index.d.mts +0 -61
  804. package/dist/ossFile/index.d.ts +0 -61
  805. package/dist/ossFile/index.js +0 -96
  806. package/dist/ossFile/index.js.map +0 -1
  807. package/dist/ossFile/index.mjs +0 -7
  808. package/dist/ossFile/index.mjs.map +0 -1
  809. package/dist/ossFile/server/index.d.mts +0 -94
  810. package/dist/ossFile/server/index.d.ts +0 -94
  811. package/dist/ossFile/server/index.js +0 -213
  812. package/dist/ossFile/server/index.js.map +0 -1
  813. package/dist/ossFile/server/index.mjs +0 -12
  814. package/dist/ossFile/server/index.mjs.map +0 -1
  815. package/dist/path-DkaHQSyW.d.mts +0 -41
  816. package/dist/path-qjVnH8qU.d.ts +0 -41
  817. package/dist/portfolio/index.d.mts +0 -66
  818. package/dist/portfolio/index.d.ts +0 -66
  819. package/dist/portfolio/index.js +0 -736
  820. package/dist/portfolio/index.js.map +0 -1
  821. package/dist/portfolio/index.mjs +0 -724
  822. package/dist/portfolio/index.mjs.map +0 -1
  823. package/dist/qqbot/server/index.d.mts +0 -216
  824. package/dist/qqbot/server/index.d.ts +0 -216
  825. package/dist/qqbot/server/index.js +0 -394
  826. package/dist/qqbot/server/index.js.map +0 -1
  827. package/dist/qqbot/server/index.mjs +0 -385
  828. package/dist/qqbot/server/index.mjs.map +0 -1
  829. package/dist/qqbot/ui/web/index.d.mts +0 -10
  830. package/dist/qqbot/ui/web/index.d.ts +0 -10
  831. package/dist/qqbot/ui/web/index.js +0 -105
  832. package/dist/qqbot/ui/web/index.js.map +0 -1
  833. package/dist/qqbot/ui/web/index.mjs +0 -99
  834. package/dist/qqbot/ui/web/index.mjs.map +0 -1
  835. package/dist/request/index.d.mts +0 -59
  836. package/dist/request/index.d.ts +0 -59
  837. package/dist/request/index.js +0 -23
  838. package/dist/request/index.js.map +0 -1
  839. package/dist/request/index.mjs +0 -6
  840. package/dist/request/index.mjs.map +0 -1
  841. package/dist/screenReceiver/index.d.mts +0 -86
  842. package/dist/screenReceiver/index.d.ts +0 -86
  843. package/dist/screenReceiver/index.js +0 -281
  844. package/dist/screenReceiver/index.js.map +0 -1
  845. package/dist/screenReceiver/index.mjs +0 -273
  846. package/dist/screenReceiver/index.mjs.map +0 -1
  847. package/dist/session-BCXvGCnm.d.mts +0 -81
  848. package/dist/session-BCXvGCnm.d.ts +0 -81
  849. package/dist/storage/index.d.mts +0 -136
  850. package/dist/storage/index.d.ts +0 -136
  851. package/dist/storage/index.js +0 -48
  852. package/dist/storage/index.js.map +0 -1
  853. package/dist/storage/index.mjs +0 -7
  854. package/dist/storage/index.mjs.map +0 -1
  855. package/dist/testYourself/admin/index.d.mts +0 -58
  856. package/dist/testYourself/admin/index.d.ts +0 -58
  857. package/dist/testYourself/admin/index.js +0 -1009
  858. package/dist/testYourself/admin/index.js.map +0 -1
  859. package/dist/testYourself/admin/index.mjs +0 -1002
  860. package/dist/testYourself/admin/index.mjs.map +0 -1
  861. package/dist/testYourself/index.d.mts +0 -53
  862. package/dist/testYourself/index.d.ts +0 -53
  863. package/dist/testYourself/index.js +0 -2551
  864. package/dist/testYourself/index.js.map +0 -1
  865. package/dist/testYourself/index.mjs +0 -2531
  866. package/dist/testYourself/index.mjs.map +0 -1
  867. package/dist/testYourself/server/index.d.mts +0 -1029
  868. package/dist/testYourself/server/index.d.ts +0 -1029
  869. package/dist/testYourself/server/index.js +0 -825
  870. package/dist/testYourself/server/index.js.map +0 -1
  871. package/dist/testYourself/server/index.mjs +0 -816
  872. package/dist/testYourself/server/index.mjs.map +0 -1
  873. package/dist/types-3ujSNAXb.d.mts +0 -286
  874. package/dist/types-3ujSNAXb.d.ts +0 -286
  875. package/dist/types-B6B210gX.d.mts +0 -270
  876. package/dist/types-B6B210gX.d.ts +0 -270
  877. package/dist/types-Bdnte5EN.d.mts +0 -292
  878. package/dist/types-C_W_CoUD.d.ts +0 -99
  879. package/dist/types-Cs0CLvrH.d.mts +0 -70
  880. package/dist/types-Cs0CLvrH.d.ts +0 -70
  881. package/dist/types-DCRvasyH.d.mts +0 -99
  882. package/dist/types-HorDyIRv.d.mts +0 -303
  883. package/dist/types-HorDyIRv.d.ts +0 -303
  884. package/dist/types-_rFX1atk.d.ts +0 -292
  885. package/dist/types.legacy-J-j-_ig_.d.mts +0 -25
  886. package/dist/types.legacy-J-j-_ig_.d.ts +0 -25
  887. package/dist/universalExport/index.d.mts +0 -312
  888. package/dist/universalExport/index.d.ts +0 -312
  889. package/dist/universalExport/index.js +0 -178
  890. package/dist/universalExport/index.js.map +0 -1
  891. package/dist/universalExport/index.mjs +0 -5
  892. package/dist/universalExport/index.mjs.map +0 -1
  893. package/dist/universalExport/server/index.d.mts +0 -1270
  894. package/dist/universalExport/server/index.d.ts +0 -1270
  895. package/dist/universalExport/server/index.js +0 -123
  896. package/dist/universalExport/server/index.js.map +0 -1
  897. package/dist/universalExport/server/index.mjs +0 -6
  898. package/dist/universalExport/server/index.mjs.map +0 -1
  899. package/dist/universalFile/index.d.mts +0 -409
  900. package/dist/universalFile/index.d.ts +0 -409
  901. package/dist/universalFile/index.js +0 -1742
  902. package/dist/universalFile/index.js.map +0 -1
  903. package/dist/universalFile/index.mjs +0 -1497
  904. package/dist/universalFile/index.mjs.map +0 -1
  905. package/dist/universalFile/server/index.d.mts +0 -1064
  906. package/dist/universalFile/server/index.d.ts +0 -1064
  907. package/dist/universalFile/server/index.js +0 -311
  908. package/dist/universalFile/server/index.js.map +0 -1
  909. package/dist/universalFile/server/index.mjs +0 -10
  910. package/dist/universalFile/server/index.mjs.map +0 -1
  911. package/dist/utils/index.d.mts +0 -192
  912. package/dist/utils/index.d.ts +0 -192
  913. package/dist/utils/index.js +0 -46
  914. package/dist/utils/index.js.map +0 -1
  915. package/dist/utils/index.mjs +0 -5
  916. package/dist/utils/index.mjs.map +0 -1
  917. package/dist/vocaloidBooth/index.d.mts +0 -64
  918. package/dist/vocaloidBooth/index.d.ts +0 -64
  919. package/dist/vocaloidBooth/index.js +0 -376
  920. package/dist/vocaloidBooth/index.js.map +0 -1
  921. package/dist/vocaloidBooth/index.mjs +0 -362
  922. package/dist/vocaloidBooth/index.mjs.map +0 -1
  923. package/dist/vocaloidBooth/server/index.d.mts +0 -111
  924. package/dist/vocaloidBooth/server/index.d.ts +0 -111
  925. package/dist/vocaloidBooth/server/index.js +0 -247
  926. package/dist/vocaloidBooth/server/index.js.map +0 -1
  927. package/dist/vocaloidBooth/server/index.mjs +0 -237
  928. package/dist/vocaloidBooth/server/index.mjs.map +0 -1
  929. package/dist/vocaloidBooth/web/index.d.mts +0 -3
  930. package/dist/vocaloidBooth/web/index.d.ts +0 -3
  931. package/dist/vocaloidBooth/web/index.js +0 -376
  932. package/dist/vocaloidBooth/web/index.js.map +0 -1
  933. package/dist/vocaloidBooth/web/index.mjs +0 -362
  934. package/dist/vocaloidBooth/web/index.mjs.map +0 -1
  935. /package/dist/{ai → common/ai}/llm/core/index.js.map +0 -0
  936. /package/dist/{ai → common/ai}/llm/core/index.mjs.map +0 -0
  937. /package/dist/{ai → common/ai}/llm/electron/index.js.map +0 -0
  938. /package/dist/{ai → common/ai}/llm/electron/index.mjs.map +0 -0
  939. /package/dist/{ai → common/ai}/llm/index.js.map +0 -0
  940. /package/dist/{ai → common/ai}/llm/index.mjs.map +0 -0
  941. /package/dist/{ai → common/ai}/llm/miniapp/index.js.map +0 -0
  942. /package/dist/{ai → common/ai}/llm/miniapp/index.mjs.map +0 -0
  943. /package/dist/{ai → common/ai}/llm/rn/index.js.map +0 -0
  944. /package/dist/{ai → common/ai}/llm/rn/index.mjs.map +0 -0
  945. /package/dist/{ai → common/ai}/llm/ui/electron/index.js.map +0 -0
  946. /package/dist/{ai → common/ai}/llm/ui/electron/index.mjs.map +0 -0
  947. /package/dist/{ai → common/ai}/llm/ui/miniapp/index.js.map +0 -0
  948. /package/dist/{ai → common/ai}/llm/ui/miniapp/index.mjs.map +0 -0
  949. /package/dist/{ai → common/ai}/llm/ui/rn/index.js.map +0 -0
  950. /package/dist/{ai → common/ai}/llm/ui/rn/index.mjs.map +0 -0
  951. /package/dist/{ai → common/ai}/llm/ui/web/index.js.map +0 -0
  952. /package/dist/{ai → common/ai}/llm/ui/web/index.mjs.map +0 -0
  953. /package/dist/{ai → common/ai}/llm/web/index.js.map +0 -0
  954. /package/dist/{ai → common/ai}/llm/web/index.mjs.map +0 -0
  955. /package/dist/{analytics → common/analytics}/index.js.map +0 -0
  956. /package/dist/{analytics → common/analytics}/index.mjs.map +0 -0
  957. /package/dist/{analytics → common/analytics}/server/index.d.mts +0 -0
  958. /package/dist/{analytics → common/analytics}/server/index.d.ts +0 -0
  959. /package/dist/{api → common/api}/index.js.map +0 -0
  960. /package/dist/{api → common/api}/index.mjs.map +0 -0
  961. /package/dist/{auth/client → common/components}/index.js.map +0 -0
  962. /package/dist/{auth/client → common/components}/index.mjs.map +0 -0
  963. /package/dist/{auth/components → common/config}/index.js.map +0 -0
  964. /package/dist/{auth/components → common/config}/index.mjs.map +0 -0
  965. /package/dist/{config → common/config}/server/index.d.mts +0 -0
  966. /package/dist/{config → common/config}/server/index.d.ts +0 -0
  967. /package/dist/{auth/hooks → common/i18n}/index.js.map +0 -0
  968. /package/dist/{auth/hooks → common/i18n}/index.mjs.map +0 -0
  969. /package/dist/{auth → common/imageCrop}/index.js.map +0 -0
  970. /package/dist/{auth → common/imageCrop}/index.mjs.map +0 -0
  971. /package/dist/{auth/schema → common/ossFile}/index.js.map +0 -0
  972. /package/dist/{auth/schema → common/ossFile}/index.mjs.map +0 -0
  973. /package/dist/{auth/services → common/ossFile/server}/index.js.map +0 -0
  974. /package/dist/{auth/services → common/ossFile/server}/index.mjs.map +0 -0
  975. /package/dist/{config → common/universalExport}/index.js.map +0 -0
  976. /package/dist/{config → common/universalExport}/index.mjs.map +0 -0
  977. /package/dist/{i18n → common/universalExport/server}/index.js.map +0 -0
  978. /package/dist/{i18n → common/universalExport/server}/index.mjs.map +0 -0
  979. /package/dist/{logger → common/universalFile/server}/index.js.map +0 -0
  980. /package/dist/{logger → common/universalFile/server}/index.mjs.map +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/logger/types.ts","../src/logger/console-adapter.ts","../src/logger/Logger.ts","../src/ai/ocr/hooks/useOCR.ts","../src/ai/ocr/components/OCRScanner.tsx","../src/ai/background-removal/hooks/useBackgroundRemoval.ts","../src/ai/background-removal/components/BackgroundRemover.tsx","../src/ai/sentiment-analysis/hooks/useSentimentAnalysis.ts","../src/ai/sentiment-analysis/components/SentimentAnalyzer.tsx","../src/ai/text-generation/hooks/useTextGeneration.ts","../src/ai/text-generation/components/SmartAssistant.tsx","../src/ai/llm/client/request.ts","../src/ai/llm/providers/openai-compatible.ts","../src/ai/llm/client/createAiClient.ts","../src/ai/llm/prompt/variables.ts","../src/ai/llm/prompt/template.ts","../src/ai/llm/client/createChatSession.ts","../src/ai/llm/hooks/useAiChat.ts","../src/ai/llm/skills/registry.ts","../src/utils/time.ts","../src/utils/japanese.ts","../src/utils/validators.ts","../src/utils/file.ts","../src/utils/array.ts","../src/utils/string.ts","../src/utils/debug.ts","../src/utils/error.ts","../src/utils/cn.ts","../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Badge.tsx","../src/components/Input.tsx","../src/components/Label.tsx","../src/components/internal/ui-core.tsx","../src/components/Tabs.tsx","../src/components/Dialog.tsx","../src/components/AlertDialog.tsx","../src/components/DropdownMenu.tsx","../src/components/Popover.tsx","../src/components/Progress.tsx","../src/components/ScrollArea.tsx","../src/components/Select.tsx","../src/components/Separator.tsx","../src/components/Sheet.tsx","../src/components/Textarea.tsx","../src/components/Tooltip.tsx","../src/components/Avatar.tsx","../src/components/Grid.tsx","../src/components/SearchBox.tsx","../src/components/Timeline.tsx","../src/components/CollisionBalls.tsx","../src/components/GenericOrderManager.tsx","../src/components/BackButton.tsx","../src/components/FilterButtonGroup.tsx","../src/components/SearchResultHint.tsx","../src/components/PopWindow.tsx","../src/components/ImageMappingPanel.tsx","../src/storage/hooks/useStorage.ts","../src/storage/adapters/web-adapter.ts","../src/storage/hooks/useLocalStorage.ts","../src/components/LocalImageMappingPanel.tsx","../src/business/index.ts","../src/business/bubbleShooter/index.ts","../src/business/bubbleShooter/logic/game.ts","../src/business/bubbleShooter/ui/web/index.ts","../src/business/bubbleShooter/ui/web/components/BubbleShooterBoard.tsx","../src/business/bubbleShooter/ui/web/pages/BubbleShooterGamePage.tsx","../src/common/index.ts","../src/common/logger/index.ts","../src/common/utils/index.ts","../src/common/storage/index.ts","../src/storage/adapters/react-native-adapter.ts","../src/storage/adapters/miniapp-adapter.ts","../src/storage/adapters/electron-adapter.ts","../src/storage/hooks/useAsyncStorage.ts","../src/storage/hooks/useTaroStorage.ts","../src/storage/hooks/useElectronStorage.ts","../src/common/request/index.ts","../src/request/adapters/web-adapter.ts","../src/request/adapters/miniapp-adapter.ts","../src/request/adapters/react-native-adapter.ts","../src/common/file/index.ts","../src/universalFile/constants.ts","../src/universalFile/utils.ts","../src/universalFile/client.ts","../src/ossFile/shared/ossConfig.ts","../src/ossFile/shared/path.ts","../src/ossFile/shared/httpClient.ts","../src/ossFile/client.ts","../src/common/export/index.ts","../src/universalExport/types.ts","../src/universalExport/constants.ts","../src/universalExport/utils.ts","../src/universalExport/client.ts","../src/universalExport/components/ExportConfigEditor.tsx","../src/universalExport/components/UniversalExportButton.tsx","../src/common/auth/index.ts","../src/common/auth/client/create-auth-client.ts","../src/common/auth/client/types.ts","../src/common/auth/client/base-api-client.ts","../src/common/auth/hooks/useSession.ts","../src/common/auth/hooks/useAuth.ts","../src/common/platform/index.ts","../src/common/platform/adapters/web.ts","../src/common/platform/adapters/taro.ts","../src/common/platform/adapters/electron.ts","../src/common/platform/adapters/node-hono.ts","../src/i18n/index.ts","../src/i18n/i18n.ts","../src/i18n/hooks.ts","../src/i18n/locales/zh-CN.ts","../src/i18n/locales/en-US.ts","../src/i18n/adapters/web.ts","../src/i18n/adapters/mobile.ts","../src/i18n/adapters/miniapp.ts","../src/i18n/adapters/desktop.ts","../src/i18n/components/LanguageSwitcher.tsx","../src/analytics/index.ts","../src/analytics/types.ts","../src/analytics/core/EventQueue.ts","../src/analytics/core/Uploader.ts","../src/analytics/core/Analytics.ts","../src/analytics/registry.ts","../src/analytics/client/presets.ts","../src/analytics/client/singleton.ts","../src/analytics/utils/helpers.ts","../src/analytics/utils/decorators.ts","../src/analytics/utils/hooks.ts","../src/analytics/adapters/web.ts","../src/analytics/adapters/mobile.ts","../src/analytics/adapters/miniapp.ts","../src/analytics/adapters/desktop.ts","../src/analytics/components/StatCard.tsx","../src/analytics/components/EventList.tsx","../src/analytics/components/FilterPanel.tsx","../src/analytics/components/Charts.tsx","../src/analytics/components/AnalyticsDashboard.tsx","../src/config/index.ts","../src/config/hooks/useConfigs.ts","../src/api/index.ts","../src/api/types.ts","../src/api/BaseApiClient.ts","../src/profile/ProfileModal.tsx","../src/profile/internal/BadgeList.tsx","../src/profile/internal/Stat.tsx","../src/profile/internal/StatList.tsx","../src/profile/ProfileButton.tsx","../src/profile/AutoOpenModal.tsx","../src/profile/EnhancedAvatar.tsx","../src/portfolio/About.tsx","../src/portfolio/AboutWithDefaults.tsx","../src/portfolio/Contact.tsx","../src/portfolio/Home.tsx","../src/portfolio/ExperimentCard.tsx","../src/portfolio/ProjectCarousel.tsx","../src/navigation/NavigationItem.tsx","../src/navigation/Navigation.tsx","../src/navigation/NavigationToggle.tsx","../src/navigation/FloatingMenu.tsx","../src/navigation/FloatingMenuExample.tsx","../src/testField/utils/index.ts","../src/testField/components/CategoryFilter.tsx","../src/testField/components/CompletionFilter.tsx","../src/testField/components/PageHeader.tsx","../src/testField/components/ExperimentGrid.tsx","../src/testField/components/EmptyState.tsx","../src/testField/components/SortControl.tsx","../src/testField/components/SortModeToggle.tsx","../src/testField/components/SortableExperimentItem.tsx","../src/testField/components/DraggableExperimentGrid.tsx","../src/common/auth/schema/enums.ts","../src/common/auth/schema/user.ts","../src/common/auth/schema/session.ts","../src/common/auth/schema/account.ts","../src/common/auth/schema/verification.ts","../src/common/auth/schema/relations.ts","../src/testField/components/PermissionGuard.tsx","../src/testField/components/UserInfoBar.tsx","../src/mikuFireworks3D/components/DanmakuPanel.tsx","../src/mikuFireworks3D/components/FireworksCanvas.tsx","../src/mikuFireworks3D/constants.ts","../src/mikuFireworks3D/components/FireworksControlPanel.tsx","../src/mikuFireworks3D/hooks/useDanmakuController.ts","../src/mikuFireworks3D/utils/textureFactory.ts","../src/mikuFireworks3D/utils/colorPalettes.ts","../src/mikuFireworks3D/utils/avatarSprite.ts","../src/mikuFireworks3D/engine/patterns/avatar.ts","../src/mikuFireworks3D/engine/patterns/miku.ts","../src/mikuFireworks3D/engine/patterns/normal.ts","../src/mikuFireworks3D/engine/emitters.ts","../src/mikuFireworks3D/engine/particlePool.ts","../src/mikuFireworks3D/engine/postfx.ts","../src/mikuFireworks3D/engine/FireworksEngine.ts","../src/mikuFireworks3D/hooks/useFireworksEngine.ts","../src/mikuFireworks3D/client/WebSocketTransport.ts","../src/mikuFireworks3D/hooks/useFireworksRealtime.ts","../src/mikuFireworks3D/components/MikuFireworks3D.tsx","../src/screenReceiver/useScreenReceiver.ts","../src/screenReceiver/signalUrl.ts","../src/screenReceiver/ScreenReceiverPanel.tsx","../src/festivalCard/core/defaults.ts","../src/festivalCard/core/normalize.ts","../src/festivalCard/hooks/useFestivalCardConfig.ts","../src/festivalCard/components/FestivalCardPageRenderer.tsx","../src/festivalCard/components/FestivalCardBook3D.tsx","../src/festivalCard/components/FestivalCardConfigEditor.tsx","../src/festivalCard/components/FestivalCardStudio.tsx","../src/festivalCard/components/FestivalCardConfigPage.tsx","../src/festivalCard/components/FestivalCardManagedPage.tsx","../src/festivalCard/server/db.ts","../src/festivalCard/services/festivalCardService.ts","../src/vocaloidBooth/core/code.ts","../src/vocaloidBooth/core/boothVaultService.ts","../src/vocaloidBooth/core/config.ts","../src/vocaloidBooth/components/BoothUploadPanel.tsx","../src/vocaloidBooth/components/BoothRedeemPanel.tsx","../src/vocaloidBooth/components/BoothSuccessCard.tsx","../src/vocaloidBooth/components/BoothConfigPage.tsx","../src/mikuContest/logic/shared/defaults.ts","../src/mikuContest/logic/shared/validators.ts","../src/mikuContest/logic/shared/voting.ts","../src/mikuContest/server/service.ts","../src/mikuContest/server/persistence/drizzle-schema.ts","../src/mikuContest/server/persistence/drizzle-state-service.ts","../src/mikuContest/server/persistence/drizzle-adapter.ts","../src/mikuContest/server/persistence/service.ts","../src/mikuContest/server/db.ts","../src/mikuContest/logic/hooks/useMikuContest.ts","../src/mikuContest/service/api/client.ts","../src/mikuContest/service/web/index.ts","../src/mikuContest/service/web/client.ts","../src/mikuContest/service/miniapp/index.ts","../src/mikuContest/service/miniapp/client.ts","../src/mikuContest/routes/index.ts","../src/mikuContest/ui/web/index.ts","../src/mikuContest/ui/web/components/MikuContestDashboard.tsx","../src/mikuContest/ui/web/pages/MikuContestAudiencePage.tsx","../src/mikuContest/ui/web/pages/MikuContestArtistPage.tsx","../src/mikuContest/ui/web/pages/MikuContestAdminPage.tsx","../src/mikuContest/ui/web/pages/MikuContestPage.tsx","../src/mikuContest/ui/miniapp/index.ts","../src/mikuContest/ui/miniapp/components/MikuContestMiniappHome.tsx","../src/mikuContest/ui/miniapp/pages/MikuContestMiniappPage.tsx"],"names":["LogLevel","timestamp","useState","useRef","React","useCallback","useEffect","clsx","Loader2","X","text","Send","errorMessage","buildBaseMessages","React6","React7","cva","React8","React9","React10","React11","React12","React13","React14","React15","React16","React17","React18","React19","Check","React20","React21","React22","React23","React24","draggedBall","width","height","mousePos","ChevronUp","ChevronDown","randomId","API_BASE_PATH","API_ENDPOINTS","DEFAULT_MAX_FILE_SIZE","ERROR_CODES","formatErrorMessage","FileText","config","t","Save","Download","Settings","user","getNestedValue","useMemo","AsyncStorage","Taro","EventType","EventPriority","getAnalyticsInstance","formatTimestamp","error","BaseApiClient","Timeline","CollisionBalls","createPortal","pgTable","sql","User","THREE","pickRandomColor","loadImage","parseListResponse","parseConfigResponse","web_exports","miniapp_exports"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * 日志级别\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n NONE = 4, // 禁用所有日志\n}\n\n/**\n * 日志条目\n */\nexport interface LogEntry {\n level: LogLevel;\n message: string;\n timestamp: Date;\n data?: any;\n context?: string;\n error?: Error;\n}\n\n/**\n * 日志适配器接口\n * 不同平台实现不同的日志输出方式\n */\nexport interface LoggerAdapter {\n /**\n * 输出日志\n */\n log(entry: LogEntry): void;\n\n /**\n * 批量输出日志(可选)\n */\n logBatch?(entries: LogEntry[]): void;\n}\n\n/**\n * 日志配置\n */\nexport interface LoggerConfig {\n /**\n * 最小日志级别\n * 只有大于等于此级别的日志才会输出\n */\n minLevel: LogLevel;\n\n /**\n * 是否启用时间戳\n */\n enableTimestamp?: boolean;\n\n /**\n * 是否启用上下文(模块名)\n */\n enableContext?: boolean;\n\n /**\n * 环境(development/production)\n */\n environment?: 'development' | 'production';\n\n /**\n * 自定义适配器\n */\n adapter?: LoggerAdapter;\n}\n\n","import type { LoggerAdapter, LogEntry, LogLevel } from './types';\n\n/**\n * 控制台日志适配器\n * 使用 console.info/warn/error 输出日志\n */\nexport class ConsoleLoggerAdapter implements LoggerAdapter {\n private readonly colors = {\n DEBUG: '\\x1b[36m', // Cyan\n INFO: '\\x1b[32m', // Green\n WARN: '\\x1b[33m', // Yellow\n ERROR: '\\x1b[31m', // Red\n RESET: '\\x1b[0m',\n };\n\n log(entry: LogEntry): void {\n const { level, message, timestamp, data, context, error } = entry;\n\n // 构建日志消息\n let logMessage = '';\n\n // 添加时间戳\n if (timestamp) {\n logMessage += '[' + (this.formatTimestamp(timestamp)) + '] ';\n }\n\n // 添加日志级别\n const levelName = this.getLevelName(level);\n logMessage += (levelName) + ': ';\n\n // 添加上下文\n if (context) {\n logMessage += '[' + (context) + '] ';\n }\n\n // 添加消息\n logMessage += message;\n\n // 根据日志级别选择输出方式\n switch (level) {\n case 0: // DEBUG\n console.debug(this.colorize(logMessage, 'DEBUG'), data || '');\n break;\n case 1: // INFO\n console.info(this.colorize(logMessage, 'INFO'), data || '');\n break;\n case 2: // WARN\n console.warn(this.colorize(logMessage, 'WARN'), data || '');\n break;\n case 3: // ERROR\n console.error(this.colorize(logMessage, 'ERROR'), data || '');\n if (error) {\n console.error(error);\n }\n break;\n }\n }\n\n private formatTimestamp(date: Date): string {\n return date.toISOString();\n }\n\n private getLevelName(level: LogLevel): string {\n const names = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE'];\n return names[level] || 'UNKNOWN';\n }\n\n private colorize(message: string, level: keyof typeof this.colors): string {\n // 只在支持颜色的环境中使用颜色\n if (typeof process !== 'undefined' && process.stdout?.isTTY) {\n return (this.colors[level]) + (message) + (this.colors.RESET);\n }\n return message;\n }\n}\n\n","import type { LogLevel, LogEntry, LoggerConfig, LoggerAdapter } from './types';\nimport { ConsoleLoggerAdapter } from './console-adapter';\n\n/**\n * 统一日志管理类\n */\nexport class Logger {\n private config: Required<LoggerConfig>;\n private adapter: LoggerAdapter;\n private context?: string;\n\n constructor(config?: Partial<LoggerConfig>, context?: string) {\n const isProduction =\n typeof process !== 'undefined' ? process.env.NODE_ENV === 'production' : false;\n\n this.config = {\n minLevel: config?.minLevel ?? (isProduction ? 1 : 0), // INFO in prod, DEBUG in dev\n enableTimestamp: config?.enableTimestamp ?? true,\n enableContext: config?.enableContext ?? true,\n environment: config?.environment ?? (isProduction ? 'production' : 'development'),\n adapter: config?.adapter ?? new ConsoleLoggerAdapter(),\n };\n this.adapter = this.config.adapter;\n this.context = context;\n }\n\n /**\n * 创建带上下文的子 Logger\n */\n createChild(context: string): Logger {\n return new Logger(this.config, context);\n }\n\n /**\n * 调试日志\n */\n debug(message: string, data?: any): void {\n this.log(0, message, data); // LogLevel.DEBUG\n }\n\n /**\n * 信息日志\n */\n info(message: string, data?: any): void {\n this.log(1, message, data); // LogLevel.INFO\n }\n\n /**\n * 警告日志\n */\n warn(message: string, data?: any): void {\n this.log(2, message, data); // LogLevel.WARN\n }\n\n /**\n * 错误日志\n */\n error(message: string, error?: Error | any): void {\n this.log(\n 3, // LogLevel.ERROR\n message,\n error instanceof Error ? undefined : error,\n error instanceof Error ? error : undefined\n );\n }\n\n /**\n * 核心日志方法\n */\n private log(level: LogLevel, message: string, data?: any, error?: Error): void {\n // 检查日志级别\n if (level < this.config.minLevel) {\n return;\n }\n\n // 检查动态调试配置(仅在浏览器环境)\n if (typeof window !== 'undefined' && typeof localStorage !== 'undefined') {\n const loggerDebug = localStorage.getItem('logger-debug');\n // 如果明确设置为 false,则不输出(但 Error 级别始终输出)\n if (loggerDebug === 'false' && level < 3) {\n // level < ERROR\n return;\n }\n }\n\n const entry: LogEntry = {\n level,\n message,\n timestamp: this.config.enableTimestamp ? new Date() : (undefined as any),\n data,\n context: this.config.enableContext ? this.context : undefined,\n error,\n };\n\n this.adapter.log(entry);\n }\n\n /**\n * 设置日志级别\n */\n setLevel(level: LogLevel): void {\n this.config.minLevel = level;\n }\n\n /**\n * 获取当前日志级别\n */\n getLevel(): LogLevel {\n return this.config.minLevel;\n }\n}\n\n/**\n * 默认全局 Logger 实例\n */\nexport const logger = new Logger();\n\n/**\n * 创建带上下文的 Logger\n */\nexport function createLogger(context: string, config?: Partial<LoggerConfig>): Logger {\n return new Logger(config, context);\n}\n\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { createWorker, Worker } from 'tesseract.js';\nimport { OCRResult, OCROptions, OCRState } from '../types';\n\nexport const useOCR = (options: OCROptions = {}) => {\n const [state, setState] = useState<OCRState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const workerRef = useRef<Worker | null>(null);\n\n const cleanup = useCallback(async () => {\n if (workerRef.current) {\n await workerRef.current.terminate();\n workerRef.current = null;\n }\n }, []);\n\n const recognize = useCallback(\n async (image: string | File | Blob | HTMLImageElement | HTMLCanvasElement) => {\n setState((prev) => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const worker = await createWorker(options.language || 'eng', 1, {\n logger: (m) => {\n if (m.status === 'recognizing text') {\n setState((prev) => ({\n ...prev,\n status: 'recognizing',\n progress: m.progress,\n }));\n }\n options.logger?.(m);\n },\n });\n\n workerRef.current = worker;\n\n const { data } = await worker.recognize(image);\n\n // In some versions of tesseract.js, words and lines are not directly on data\n // We extract them from blocks if needed\n const words = (data as any).words || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines.flatMap(l => l.words))) || [];\n const lines = (data as any).lines || data.blocks?.flatMap(b => b.paragraphs.flatMap(p => p.lines)) || [];\n\n const result: OCRResult = {\n text: data.text,\n confidence: data.confidence,\n words: words.map((w: any) => ({\n text: w.text,\n confidence: w.confidence,\n bbox: w.bbox,\n })),\n lines: lines.map((l: any) => l.text),\n };\n\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n result,\n }));\n\n await worker.terminate();\n workerRef.current = null;\n\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setState((prev) => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error,\n }));\n throw error;\n }\n },\n [options]\n );\n\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup]);\n\n return {\n ...state,\n recognize,\n cleanup,\n };\n};\n\n\n\n\n\n\n\n\n\n","import React, { useState, useRef } from 'react';\nimport { useOCR } from '../hooks/useOCR';\nimport { Loader2, Upload, FileText, Image as ImageIcon, X } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface OCRScannerProps {\n onResult?: (text: string) => void;\n className?: string;\n language?: string;\n}\n\nexport const OCRScanner: React.FC<OCRScannerProps> = ({\n onResult,\n className = '',\n language = 'eng',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { recognize, isProcessing, progress, status, result, error } = useOCR({\n language,\n });\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Create preview\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const ocrResult = await recognize(file);\n onResult?.(ocrResult.text);\n } catch (err) {\n console.error('OCR Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n \n const file = e.dataTransfer.files?.[0];\n if (file && file.type.startsWith('image/')) {\n const mockEvent = { target: { files: [file] } } as unknown as React.ChangeEvent<HTMLInputElement>;\n handleFileChange(mockEvent);\n }\n };\n\n return (\n <div \n className={clsx('p-6 border-2 border-dashed rounded-xl transition-all', isProcessing ? 'border-blue-400 bg-blue-50/10' : 'border-gray-200 hover:border-blue-400', className)}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-blue-50 rounded-full text-blue-500\">\n <Upload size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">点击或拖拽图片进行 OCR 识别</p>\n <p className=\"text-sm text-gray-500\">支持 JPG, PNG, WebP</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"relative group rounded-lg overflow-hidden border border-gray-200\">\n <img \n src={imagePreview} \n alt=\"Preview\" \n className={clsx('max-h-64 mx-auto object-contain transition-opacity', isProcessing ? 'opacity-50' : 'opacity-100')}\n />\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"absolute top-2 right-2 p-1 bg-white/80 rounded-full hover:bg-white text-gray-600 shadow-sm\"\n >\n <X size={18} />\n </button>\n )}\n \n {isProcessing && (\n <div className=\"absolute inset-0 flex flex-col items-center justify-center bg-black/5\">\n <Loader2 className=\"animate-spin text-blue-500 mb-2\" size={32} />\n <div className=\"w-48 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-blue-500 h-full transition-all duration-300\"\n style={{ width: (progress * 100) + '%' }}\n />\n </div>\n <p className=\"text-xs font-medium text-blue-600 mt-2\">\n {status === 'initializing' ? '正在加载引擎...' : '识别中 ' + (Math.round(progress * 100)) + '%'}\n </p>\n </div>\n )}\n </div>\n\n {result && !isProcessing && (\n <div className=\"bg-gray-50 p-4 rounded-lg border border-gray-100 animate-in fade-in slide-in-from-bottom-2\">\n <div className=\"flex items-center gap-2 mb-2 text-gray-600 font-medium\">\n <FileText size={18} />\n <span>识别结果 (置信度: {Math.round(result.confidence)}%)</span>\n </div>\n <pre className=\"text-sm text-gray-800 whitespace-pre-wrap font-sans\">\n {result.text}\n </pre>\n </div>\n )}\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 识别失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useEffect } from 'react';\nimport { BackgroundRemovalOptions, BackgroundRemovalState } from '../types';\n\nexport const useBackgroundRemoval = (options: BackgroundRemovalOptions = {}) => {\n const [state, setState] = useState<BackgroundRemovalState>({\n isProcessing: false,\n progress: 0,\n status: 'idle',\n error: null,\n resultBlob: null,\n resultUrl: null,\n });\n\n const remove = useCallback(async (image: string | File | Blob | HTMLImageElement | URL) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n progress: 0,\n status: 'initializing',\n }));\n\n try {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n let backgroundRemoval;\n\n try {\n // 环境盾牌:防止库初始化时 Object.keys(null) 崩溃\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' } },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n \n backgroundRemoval = await import('@imgly/background-removal');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', {\n value: originalProcess,\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n }\n\n const { removeBackground } = backgroundRemoval;\n\n const config: any = {\n progress: (status: string, progress: number) => {\n setState(prev => ({\n ...prev,\n status,\n progress,\n }));\n options.progress?.(status, progress);\n },\n model: options.model || 'small',\n publicPath: options.publicPath,\n fetchArgs: options.fetchArgs,\n };\n\n const blob = await removeBackground(image, config);\n const url = URL.createObjectURL(blob);\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n progress: 1,\n status: 'completed',\n resultBlob: blob,\n resultUrl: url,\n }));\n\n return { blob, url };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Background Removal Error:', msg);\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'error',\n error: new Error(msg),\n }));\n throw err;\n }\n }, [options]);\n\n const cleanup = useCallback(() => {\n if (state.resultUrl) {\n URL.revokeObjectURL(state.resultUrl);\n }\n }, [state.resultUrl]);\n\n useEffect(() => {\n return () => cleanup();\n }, [cleanup]);\n\n return {\n ...state,\n remove,\n cleanup,\n };\n};\n","import React, { useState, useRef } from 'react';\nimport { useBackgroundRemoval } from '../hooks/useBackgroundRemoval';\nimport { Loader2, Upload, Download, Image as ImageIcon, X, Eraser } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface BackgroundRemoverProps {\n onResult?: (blob: Blob, url: string) => void;\n className?: string;\n}\n\nexport const BackgroundRemover: React.FC<BackgroundRemoverProps> = ({\n onResult,\n className = '',\n}) => {\n const [imagePreview, setImagePreview] = useState<string | null>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n \n const { remove, isProcessing, progress, status, resultUrl, error } = useBackgroundRemoval();\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = (event) => {\n setImagePreview(event.target?.result as string);\n };\n reader.readAsDataURL(file);\n\n try {\n const { blob, url } = await remove(file);\n onResult?.(blob, url);\n } catch (err) {\n console.error('Background Removal Error:', err);\n }\n };\n\n const reset = () => {\n setImagePreview(null);\n if (fileInputRef.current) fileInputRef.current.value = '';\n };\n\n const downloadResult = () => {\n if (!resultUrl) return;\n const a = document.createElement('a');\n a.href = resultUrl;\n a.download = 'removed_background.png';\n a.click();\n };\n\n return (\n <div className={clsx('p-6 border-2 border-dashed rounded-xl transition-all', isProcessing ? 'border-purple-400 bg-purple-50/10' : 'border-gray-200 hover:border-purple-400', className)}>\n {!imagePreview ? (\n <div \n className=\"flex flex-col items-center justify-center cursor-pointer space-y-4\"\n onClick={() => fileInputRef.current?.click()}\n >\n <div className=\"p-4 bg-purple-50 rounded-full text-purple-500\">\n <Eraser size={32} />\n </div>\n <div className=\"text-center\">\n <p className=\"text-lg font-medium text-gray-700\">上传图片移除背景</p>\n <p className=\"text-sm text-gray-500\">建议使用主体明确的图片</p>\n </div>\n </div>\n ) : (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">原图</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-gray-50\">\n <img src={imagePreview} alt=\"Original\" className=\"max-h-64 mx-auto object-contain\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <p className=\"text-xs font-medium text-gray-500 uppercase tracking-wider\">处理结果</p>\n <div className=\"relative rounded-lg overflow-hidden border border-gray-200 bg-grid-slate-100 bg-[size:20px_20px]\">\n {resultUrl ? (\n <img src={resultUrl} alt=\"Result\" className=\"max-h-64 mx-auto object-contain animate-in fade-in zoom-in-95 duration-500\" />\n ) : (\n <div className=\"h-64 flex flex-col items-center justify-center text-gray-400\">\n {isProcessing ? (\n <>\n <Loader2 className=\"animate-spin text-purple-500 mb-2\" size={32} />\n <div className=\"w-32 bg-gray-200 rounded-full h-1.5 overflow-hidden\">\n <div \n className=\"bg-purple-500 h-full transition-all duration-300\"\n style={{ width: (progress * 100) + '%' }}\n />\n </div>\n <p className=\"text-[10px] mt-2 font-mono uppercase\">{status.replace(/-/g, ' ')}</p>\n </>\n ) : (\n <span className=\"text-sm italic\">等待处理...</span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n\n <div className=\"flex justify-between items-center pt-2\">\n {!isProcessing && (\n <button \n onClick={reset}\n className=\"flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-600 hover:text-gray-900 transition-colors\"\n >\n <X size={16} />\n 重新开始\n </button>\n )}\n \n {resultUrl && !isProcessing && (\n <button \n onClick={downloadResult}\n className=\"flex items-center gap-2 px-6 py-2 bg-purple-600 hover:bg-purple-700 text-white rounded-lg shadow-sm transition-all\"\n >\n <Download size={16} />\n 下载 PNG\n </button>\n )}\n </div>\n\n {error && (\n <div className=\"p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 处理失败: {error.message}\n </div>\n )}\n </div>\n )}\n\n <input\n type=\"file\"\n ref={fileInputRef}\n className=\"hidden\"\n accept=\"image/*\"\n onChange={handleFileChange}\n disabled={isProcessing}\n />\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { SentimentResult, SentimentOptions, SentimentState } from '../types';\n\nexport const useSentimentAnalysis = (options: SentimentOptions = {}) => {\n const [state, setState] = useState<SentimentState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const analyze = useCallback(async (text: string) => {\n setState(prev => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'loading model',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0) },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const defaultModel = 'Xenova/distilbert-base-multilingual-cased-sentiments-student';\n \n pipelineRef.current = await pipeline('sentiment-analysis', options.model || defaultModel);\n }\n\n setState(prev => ({ ...prev, status: 'analyzing' }));\n \n const output = await pipelineRef.current(text);\n const resultData = output[0];\n\n const label = resultData.label.toLowerCase();\n let sentiment: 'positive' | 'negative' | 'neutral' = 'neutral';\n \n // 增强逻辑:针对中文常见消极词汇进行本地加权\n const negativeKeywords = ['累', '惨', '绝望', '难受', '伤心', '差', '坏', '糟', '不行'];\n const hasNegativeKeyword = negativeKeywords.some(k => text.includes(k));\n\n if (label.includes('positive') && !hasNegativeKeyword) {\n sentiment = 'positive';\n } else if (label.includes('negative') || label.includes('0') || hasNegativeKeyword) {\n sentiment = 'negative';\n }\n\n const result: SentimentResult = {\n label: resultData.label,\n score: resultData.score,\n sentiment,\n };\n\n setState(prev => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('AI Sentiment Error:', msg);\n setState(prev => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model]);\n\n return { ...state, analyze };\n};\n\n\n\n\n\n\n\n\n\n","import React, { useState } from 'react';\nimport { useSentimentAnalysis } from '../hooks/useSentimentAnalysis';\nimport { MessageSquare, Send, Loader2, Smile, Frown, Meh } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface SentimentAnalyzerProps {\n onResult?: (result: any) => void;\n className?: string;\n placeholder?: string;\n}\n\nexport const SentimentAnalyzer: React.FC<SentimentAnalyzerProps> = ({\n onResult,\n className = '',\n placeholder = '输入一段中文或英文,分析其情感倾向...',\n}) => {\n const [text, setText] = useState('');\n const { analyze, isProcessing, status, result, error } = useSentimentAnalysis();\n\n const handleAnalyze = async () => {\n if (!text.trim() || isProcessing) return;\n try {\n const res = await analyze(text);\n onResult?.(res);\n } catch (err) {\n console.error('Sentiment Analysis Error:', err);\n }\n };\n\n const getSentimentIcon = () => {\n if (!result) return null;\n switch (result.sentiment) {\n case 'positive': return <Smile className=\"text-green-500\" size={24} />;\n case 'negative': return <Frown className=\"text-red-500\" size={24} />;\n default: return <Meh className=\"text-yellow-500\" size={24} />;\n }\n };\n\n const getSentimentColor = () => {\n if (!result) return '';\n switch (result.sentiment) {\n case 'positive': return 'bg-green-50 border-green-200 text-green-700';\n case 'negative': return 'bg-red-50 border-red-200 text-red-700';\n default: return 'bg-yellow-50 border-yellow-200 text-yellow-700';\n }\n };\n\n return (\n <div className={clsx('p-6 border rounded-xl bg-white dark:bg-gray-800 shadow-sm', className)}>\n <div className=\"flex items-center gap-2 mb-4 text-gray-700 dark:text-gray-300 font-medium\">\n <MessageSquare size={20} />\n <span>文本情感分析</span>\n </div>\n\n <div className=\"relative\">\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n placeholder={placeholder}\n className=\"w-full h-32 p-4 bg-gray-50 dark:bg-gray-900 border border-gray-200 dark:border-gray-700 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all outline-none resize-none text-gray-800 dark:text-gray-200\"\n disabled={isProcessing}\n />\n <button\n onClick={handleAnalyze}\n disabled={!text.trim() || isProcessing}\n className=\"absolute bottom-3 right-3 p-2 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-md transition-colors shadow-sm\"\n >\n {isProcessing ? <Loader2 className=\"animate-spin\" size={18} /> : <Send size={18} />}\n </button>\n </div>\n\n {isProcessing && (\n <div className=\"mt-4 flex items-center gap-2 text-sm text-blue-600 animate-pulse\">\n <Loader2 size={14} className=\"animate-spin\" />\n <span>正在分析 (首次运行将加载模型资源)...</span>\n </div>\n )}\n\n {result && !isProcessing && (\n <div className={clsx('mt-4 p-4 border rounded-lg flex items-center gap-4 animate-in fade-in slide-in-from-top-2', getSentimentColor())}>\n <div className=\"p-2 bg-white rounded-full shadow-sm\">\n {getSentimentIcon()}\n </div>\n <div>\n <p className=\"font-bold text-lg capitalize\">{result.sentiment}</p>\n <p className=\"text-sm opacity-80\">\n 置信度: {(result.score * 100).toFixed(1)}% ({result.label})\n </p>\n </div>\n </div>\n )}\n\n {error && (\n <div className=\"mt-4 p-3 bg-red-50 text-red-600 text-sm rounded-lg border border-red-100\">\n 分析失败: {error.message}\n </div>\n )}\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import { useState, useCallback, useRef } from 'react';\nimport { TextGenerationOptions, TextGenerationState } from '../types';\n\nexport const useTextGeneration = (options: TextGenerationOptions = {}) => {\n const [state, setState] = useState<TextGenerationState>({\n isProcessing: false,\n status: 'idle',\n error: null,\n result: null,\n });\n\n const pipelineRef = useRef<any | null>(null);\n\n const generate = useCallback(async (prompt: string) => {\n console.log('[AI] Generating for prompt:', prompt);\n \n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: true,\n error: null,\n status: 'initializing',\n }));\n\n try {\n if (!pipelineRef.current) {\n const originalKeys = Object.keys;\n const win = (typeof window !== 'undefined' ? window : globalThis) as any;\n const originalProcess = win.process;\n\n let transformers;\n try {\n (Object as any).keys = function(obj: any) {\n if (obj === null || obj === undefined) return [];\n return originalKeys.call(Object, obj);\n };\n if (typeof window !== 'undefined') {\n try {\n Object.defineProperty(win, 'process', {\n value: { env: {}, versions: {}, release: { name: 'node' }, nextTick: (cb: any) => setTimeout(cb, 0), cwd: () => '/', browser: true },\n configurable: true,\n writable: true\n });\n } catch (e) {}\n }\n transformers = await import('@xenova/transformers');\n } finally {\n Object.keys = originalKeys;\n if (typeof window !== 'undefined' && originalProcess) {\n try {\n Object.defineProperty(win, 'process', { value: originalProcess, configurable: true, writable: true });\n } catch (e) {}\n }\n }\n\n const { pipeline, env } = transformers;\n env.allowLocalModels = false;\n if (env.backends?.onnx) {\n env.backends.onnx.wasm.proxy = true;\n }\n\n const modelName = options.model || 'Xenova/LaMini-Flan-T5-77M';\n pipelineRef.current = await pipeline('text2text-generation', modelName, {\n progress_callback: (info: any) => {\n if (info.status === 'progress') {\n setState((prev: TextGenerationState) => ({ ...prev, status: 'loading model: ' + (Math.round(info.progress)) + '%' }));\n }\n }\n });\n }\n\n setState((prev: TextGenerationState) => ({ ...prev, status: 'thinking' }));\n \n // 优化生成参数,使其对小模型更友好\n const output = await pipelineRef.current(prompt, {\n max_new_tokens: options.max_new_tokens || 64,\n temperature: options.temperature || 0.5, // 稍微提高温度\n do_sample: true, // 开启采样,避免空输出\n top_k: 50,\n repetition_penalty: 1.1,\n });\n\n const result = output[0].generated_text || '';\n console.log('[AI] Raw result:', result);\n\n setState((prev: TextGenerationState) => ({\n ...prev,\n isProcessing: false,\n status: 'completed',\n result,\n }));\n\n return result;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n console.error('[AI] Error:', err);\n setState((prev: TextGenerationState) => ({ ...prev, isProcessing: false, status: 'error', error: new Error(msg) }));\n throw err;\n }\n }, [options.model, options.max_new_tokens, options.temperature]);\n\n return { ...state, generate };\n};\n\n\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useTextGeneration } from '../hooks/useTextGeneration';\nimport { Bot, User, Send, Loader2 } from 'lucide-react';\nimport { clsx } from 'clsx';\n\ninterface SmartAssistantProps {\n className?: string;\n}\n\nexport const SmartAssistant: React.FC<SmartAssistantProps> = ({ className = '' }) => {\n const [input, setInput] = useState('');\n const [chatHistory, setChatHistory] = useState<Array<{ role: 'user' | 'assistant', content: string }>>([]);\n const scrollRef = useRef<HTMLDivElement>(null);\n \n const { generate, isProcessing: isGenerating, status: genStatus } = useTextGeneration();\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scrollRef.current.scrollHeight;\n }\n }, [chatHistory, isGenerating]);\n\n const handleSend = async () => {\n if (!input.trim() || isGenerating) return;\n\n const userMessage = input.trim();\n setInput('');\n setChatHistory(prev => [...prev, { role: 'user', content: userMessage }]);\n\n // --- 1. 本地硬规则匹配 (意图识别) ---\n // 对于 77M 模型,某些固定回复由逻辑生成效果更好\n let finalContent = '';\n const lowerMessage = userMessage.toLowerCase();\n \n if (lowerMessage.includes('你好') || lowerMessage.includes('hello') || lowerMessage.includes('hi')) {\n finalContent = '你好呀!我是 sa2kit 的本地 AI 助手,很高兴能和你聊天。😊';\n } else if (lowerMessage.includes('谁') || lowerMessage.includes('who are you')) {\n finalContent = '我是一个完全运行在你浏览器本地的小型 AI 模型,我不需要服务器,非常保护你的隐私。';\n } else if (lowerMessage.includes('天气')) {\n finalContent = '虽然我看不见外面的阳光,但听你的语气,今天一定是个适合出门的好天气!☀️';\n } else if (lowerMessage.includes('累') || lowerMessage.includes('难过') || lowerMessage.includes('绝望')) {\n finalContent = '听起来你现在心情不太好... 抱抱你,我会一直在这里陪你聊天的。❤️';\n }\n\n // 如果命中了硬规则,直接显示并返回,不再调用模型\n if (finalContent) {\n // 模拟一点点思考时间,体验更自然\n setTimeout(() => {\n setChatHistory(prev => [...prev, { role: 'assistant', content: finalContent }]);\n }, 500);\n return;\n }\n\n // --- 2. 调用模型生成 (针对非固定意图) ---\n const prompt = `对话。\n人说:\"${userMessage}\"\nAI回应:\"`;\n\n try {\n const response = await generate(prompt);\n \n // 深度清理模型输出\n let modelOutput = response\n .replace(/^AI回应:|^AI:|^Assistant:|^回答:|^答:|^Answer:/i, '')\n .replace(/[. ]*Positive[. ]*|[. ]*Negative[. ]*|[. ]*Neutral[. ]*/gi, '') // 拦截情绪单词\n .replace(/^[\"'“]|[\"'”]$/g, '') // 去掉引号\n .trim();\n\n // --- 3. 结果质量检查 (Recovery) ---\n // 如果模型返回包含大量英文、或者是废话、或者太短\n const isEnglishTrash = /[a-zA-Z]{5,}/.test(modelOutput) && !/[一-龥]/.test(modelOutput);\n const isTooShort = modelOutput.length < 1;\n\n if (isEnglishTrash || isTooShort) {\n console.warn('[AI] Model failure, triggering smart recovery. Raw was:', response);\n modelOutput = '嗯嗯,我正在听。关于“' + userMessage.slice(0, 6) + '...”,你还有什么想分享的吗?';\n }\n\n setChatHistory(prev => [...prev, { role: 'assistant', content: modelOutput }]);\n } catch (err) {\n setChatHistory(prev => [...prev, { role: 'assistant', content: '(本地模型思考过度,暂时休息中...)' }]);\n }\n };\n\n return (\n <div className={clsx('flex flex-col h-[500px] bg-white dark:bg-gray-800 rounded-xl shadow-inner border border-gray-100 dark:border-gray-700 overflow-hidden', className)}>\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto p-4 space-y-4 bg-gray-50/50 dark:bg-gray-900/50\">\n {chatHistory.length === 0 && (\n <div className=\"h-full flex flex-col items-center justify-center text-gray-400 space-y-2\">\n <Bot size={48} className=\"opacity-20\" />\n <p className=\"text-sm italic text-center px-8 text-gray-400 font-sans\">\n 你好!我是 100% 本地运行的 AI。<br/>\n 你可以和我聊聊天,我会尝试理解你的意思。\n </p>\n </div>\n )}\n {chatHistory.map((msg, i) => (\n <div key={i} className={clsx('flex', msg.role === 'user' ? 'justify-end' : 'justify-start', 'animate-in fade-in slide-in-from-bottom-2')}>\n <div className={clsx('flex gap-3 max-w-[85%]', msg.role === 'user' ? 'flex-row-reverse' : '')}>\n <div className={clsx('p-2 rounded-lg h-fit', msg.role === 'user' ? 'bg-blue-100 text-blue-600' : 'bg-white dark:bg-gray-700 shadow-sm border border-gray-100 dark:border-gray-600 text-gray-400')}>\n {msg.role === 'user' ? <User size={18} /> : <Bot size={18} />}\n </div>\n <div className={clsx('p-3 rounded-2xl shadow-sm text-sm', msg.role === 'user' \n ? 'bg-blue-600 text-white rounded-tr-none' \n : 'bg-white dark:bg-gray-700 text-gray-800 dark:text-gray-200 rounded-tl-none border border-gray-100 dark:border-gray-600 leading-relaxed')}>\n {msg.content}\n </div>\n </div>\n </div>\n ))}\n {isGenerating && (\n <div className=\"flex justify-start\">\n <div className=\"flex gap-3 items-center bg-white dark:bg-gray-700 p-3 rounded-2xl rounded-tl-none border border-gray-100 dark:border-gray-600\">\n <Loader2 className=\"animate-spin text-blue-500\" size={16} />\n <div className=\"flex flex-col\">\n <span className=\"text-xs text-gray-500 font-medium\">思考中...</span>\n <span className=\"text-[10px] text-blue-400 font-mono tracking-tighter\">{genStatus}</span>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"p-4 bg-white dark:bg-gray-800 border-t border-gray-100 dark:border-gray-700\">\n <div className=\"relative flex items-center gap-2\">\n <input\n type=\"text\"\n value={input}\n onChange={(e) => setInput(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSend()}\n placeholder=\"输入文字...\"\n className=\"flex-1 bg-gray-50 dark:bg-gray-900 border-none rounded-full px-5 py-3 pr-12 text-sm focus:ring-2 focus:ring-blue-500 outline-none dark:text-white text-gray-800\"\n disabled={isGenerating}\n />\n <button\n onClick={handleSend}\n disabled={!input.trim() || isGenerating}\n className=\"absolute right-1 p-2.5 bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 text-white rounded-full transition-all shadow-md active:scale-95 flex items-center justify-center\"\n >\n <Send size={18} />\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n\n\n\n\n\n\n\n\n","import type { RequestAdapter } from '../../../request';\n\nexport type JsonRequestOptions = {\n url: string;\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n headers?: Record<string, string>;\n body?: any;\n timeoutMs?: number;\n requestAdapter?: RequestAdapter;\n};\n\nexport const requestJson = async <T>(options: JsonRequestOptions): Promise<T> => {\n const { url, method = 'POST', headers = {}, body, timeoutMs, requestAdapter } = options;\n\n if (requestAdapter) {\n return requestAdapter.request<T>({\n url,\n method,\n headers,\n body,\n });\n }\n\n const controller = timeoutMs ? new AbortController() : undefined;\n const timeoutId = timeoutMs\n ? setTimeout(() => {\n controller?.abort();\n }, timeoutMs)\n : undefined;\n\n try {\n const response = await fetch(url, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller?.signal,\n });\n\n const text = await response.text();\n let data: any = null;\n\n if (text) {\n try {\n data = JSON.parse(text);\n } catch {\n data = text;\n }\n }\n\n if (!response.ok) {\n const errorMessage =\n data?.error?.message ||\n data?.error ||\n data?.message ||\n `Request failed with status ${response.status}`;\n const error = new Error(errorMessage);\n (error as any).status = response.status;\n (error as any).data = data;\n throw error;\n }\n\n return data as T;\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n};\n","import type {\n AiChatRequest,\n AiChatResponse,\n AiMessage,\n AiToolCall,\n AiUsage,\n ResolvedAiClientConfig,\n} from '../types';\nimport type { AiProvider } from './types';\nimport { requestJson } from '../client/request';\n\nexport const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';\nexport const DEFAULT_OPENAI_MODEL = 'gpt-3.5-turbo';\n\ntype OpenAIToolCall = {\n id?: string;\n type?: string;\n function?: {\n name?: string;\n arguments?: string;\n };\n};\n\ntype OpenAIMessage = {\n role?: string;\n content?: string | null;\n tool_calls?: OpenAIToolCall[];\n};\n\ntype OpenAIChatResponse = {\n id: string;\n choices?: Array<{\n message?: OpenAIMessage;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n};\n\nconst joinUrl = (base: string, path: string): string => {\n const trimmedBase = base.replace(/\\/+$/, '');\n const trimmedPath = path.replace(/^\\/+/, '');\n return `${trimmedBase}/${trimmedPath}`;\n};\n\nconst normalizeToolCalls = (toolCalls?: OpenAIToolCall[]): AiToolCall[] | undefined => {\n if (!toolCalls || !toolCalls.length) {\n return undefined;\n }\n\n return toolCalls.map((call, index) => ({\n id: call?.id ?? String(index),\n type: 'function',\n function: {\n name: call?.function?.name ?? '',\n arguments: call?.function?.arguments ?? '',\n },\n }));\n};\n\nconst normalizeUsage = (usage?: OpenAIChatResponse['usage']): AiUsage | undefined => {\n if (!usage) {\n return undefined;\n }\n\n return {\n promptTokens: usage.prompt_tokens,\n completionTokens: usage.completion_tokens,\n totalTokens: usage.total_tokens,\n };\n};\n\nconst mapMessage = (message: AiMessage): Record<string, any> => {\n const mapped: Record<string, any> = {\n role: message.role,\n content: message.content,\n };\n\n if (message.name) {\n mapped.name = message.name;\n }\n if (message.toolCallId) {\n mapped.tool_call_id = message.toolCallId;\n }\n if (message.toolCalls?.length) {\n mapped.tool_calls = message.toolCalls.map((call) => ({\n id: call.id,\n type: call.type,\n function: {\n name: call.function.name,\n arguments: call.function.arguments,\n },\n }));\n }\n\n return mapped;\n};\n\nexport const createOpenAICompatibleProvider = (): AiProvider => {\n return {\n id: 'openai-compatible',\n sendChat: async (request: AiChatRequest, config: ResolvedAiClientConfig): Promise<AiChatResponse> => {\n if (request.stream) {\n throw new Error('Streaming is not supported in sendChat. Use streamChat when available.');\n }\n\n const model = request.model ?? config.model ?? DEFAULT_OPENAI_MODEL;\n if (!model) {\n throw new Error('Model is required for chat completion requests.');\n }\n\n const payload: Record<string, any> = {\n model,\n messages: request.messages.map(mapMessage),\n };\n\n if (request.temperature !== undefined) {\n payload.temperature = request.temperature;\n }\n if (request.maxTokens !== undefined) {\n payload.max_tokens = request.maxTokens;\n }\n if (request.topP !== undefined) {\n payload.top_p = request.topP;\n }\n if (request.stop !== undefined) {\n payload.stop = request.stop;\n }\n if (request.tools) {\n payload.tools = request.tools;\n }\n if (request.toolChoice) {\n payload.tool_choice = request.toolChoice;\n }\n\n const url = joinUrl(config.baseUrl || DEFAULT_OPENAI_BASE_URL, 'chat/completions');\n const response = await requestJson<OpenAIChatResponse>({\n url,\n method: 'POST',\n headers: config.headers,\n body: payload,\n timeoutMs: config.timeoutMs,\n requestAdapter: config.requestAdapter,\n });\n\n const firstMessage = response.choices?.[0]?.message;\n const toolCalls = normalizeToolCalls(firstMessage?.tool_calls);\n const content = firstMessage?.content ?? '';\n const assistantMessage: AiMessage = {\n role: 'assistant',\n content,\n toolCalls,\n };\n\n return {\n id: response.id ?? '',\n content,\n message: assistantMessage,\n usage: normalizeUsage(response.usage),\n toolCalls,\n raw: response,\n };\n },\n };\n};\n","import type {\n AiChatRequest,\n AiChatRequestOptions,\n AiChatResponse,\n AiClient,\n AiClientConfig,\n AiMessage,\n ResolvedAiClientConfig,\n} from '../types';\nimport type { AiProvider } from '../providers/types';\nimport { createOpenAICompatibleProvider } from '../providers/openai-compatible';\n\nconst DEFAULT_TIMEOUT_MS = 60_000;\n\nconst resolveApiKey = async (config: AiClientConfig): Promise<string | undefined> => {\n if (config.apiKey) {\n return config.apiKey;\n }\n if (config.getApiKey) {\n return await config.getApiKey();\n }\n return undefined;\n};\n\nconst hasAuthorizationHeader = (headers: Record<string, string>): boolean => {\n return Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');\n};\n\nconst resolveHeaders = async (config: AiClientConfig): Promise<Record<string, string>> => {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers ?? {}),\n };\n\n if (!hasAuthorizationHeader(headers)) {\n const apiKey = await resolveApiKey(config);\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n }\n\n return headers;\n};\n\nconst resolveClientConfig = async (config: AiClientConfig): Promise<ResolvedAiClientConfig> => {\n const headers = await resolveHeaders(config);\n\n return {\n ...config,\n baseUrl: config.baseUrl ?? 'https://api.openai.com/v1',\n headers,\n timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n };\n};\n\nconst resolveProvider = (provider?: AiProvider): AiProvider => {\n return provider ?? createOpenAICompatibleProvider();\n};\n\nexport const createAiClient = (config: AiClientConfig): AiClient => {\n const provider = resolveProvider(config.provider);\n\n const sendChat = async (request: AiChatRequest): Promise<AiChatResponse> => {\n const resolvedConfig = await resolveClientConfig(config);\n config.logger?.debug?.('ai.sendChat', {\n model: request.model ?? resolvedConfig.model,\n messageCount: request.messages.length,\n });\n try {\n return await provider.sendChat(request, resolvedConfig);\n } catch (error) {\n config.logger?.error?.('ai.sendChat.error', error);\n throw error;\n }\n };\n\n type SendMessageOptions = AiChatRequestOptions & { systemPrompt?: string };\n\n const sendMessage = async (\n content: string,\n options?: SendMessageOptions\n ): Promise<AiChatResponse> => {\n const resolvedOptions: SendMessageOptions = options ?? {};\n const { systemPrompt, ...requestOptions } = resolvedOptions;\n\n const messages: AiMessage[] = [];\n if (systemPrompt) {\n messages.push({ role: 'system', content: systemPrompt });\n }\n messages.push({ role: 'user', content });\n\n return sendChat({\n messages,\n ...requestOptions,\n });\n };\n\n return {\n sendChat,\n sendMessage,\n };\n};\n","export type PromptVariableValue = string | number | boolean | null | undefined;\n\nexport type PromptVariables = Record<string, PromptVariableValue>;\n\nexport const normalizePromptVariables = (\n variables: PromptVariables = {}\n): Record<string, string> => {\n const normalized: Record<string, string> = {};\n\n Object.entries(variables).forEach(([key, value]) => {\n if (value === null || value === undefined) {\n normalized[key] = '';\n } else {\n normalized[key] = String(value);\n }\n });\n\n return normalized;\n};\n","import { normalizePromptVariables, PromptVariables } from './variables';\n\nexport interface PromptTemplateOptions {\n missingValue?: string;\n preserveUnknown?: boolean;\n}\n\nexport const applyPromptTemplate = (\n template: string,\n variables: PromptVariables = {},\n options: PromptTemplateOptions = {}\n): string => {\n if (!template) {\n return '';\n }\n\n const resolved = normalizePromptVariables(variables);\n const missingValue = options.missingValue ?? '';\n\n return template.replace(/\\{\\{\\s*([a-zA-Z0-9_.-]+)\\s*\\}\\}/g, (_match, key: string) => {\n if (Object.prototype.hasOwnProperty.call(resolved, key)) {\n return resolved[key] ?? '';\n }\n\n return options.preserveUnknown ? `{{${key}}}` : missingValue;\n });\n};\n","import { applyPromptTemplate } from '../prompt/template';\nimport type { AiChatInputOptions, AiChatResponse, AiChatSession, AiChatSessionOptions, AiMessage } from '../types';\n\nconst buildBaseMessages = (systemPrompt?: string, initialMessages?: AiMessage[]): AiMessage[] => {\n const baseMessages: AiMessage[] = [];\n if (systemPrompt) {\n baseMessages.push({ role: 'system', content: systemPrompt });\n }\n if (initialMessages?.length) {\n baseMessages.push(...initialMessages);\n }\n return baseMessages;\n};\n\nexport const createChatSession = (options: AiChatSessionOptions): AiChatSession => {\n let systemPrompt = options.systemPrompt;\n let messages = buildBaseMessages(systemPrompt, options.initialMessages);\n\n const reset = () => {\n messages = buildBaseMessages(systemPrompt, options.initialMessages);\n };\n\n const setSystemPrompt = (prompt?: string) => {\n systemPrompt = prompt;\n reset();\n };\n\n const sendMessage = async (\n input: string,\n requestOptions: AiChatInputOptions = {}\n ): Promise<AiChatResponse> => {\n const { template, variables, ...chatOptions } = requestOptions;\n const activeTemplate = template ?? options.template;\n const mergedVariables = { input, ...(variables ?? {}) };\n const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;\n\n const userMessage: AiMessage = { role: 'user', content };\n const nextMessages = [...messages, userMessage];\n\n const response = await options.client.sendChat({\n messages: nextMessages,\n ...chatOptions,\n });\n\n const assistantMessage: AiMessage =\n response.message ?? {\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n };\n\n messages = [...nextMessages, assistantMessage];\n\n return response;\n };\n\n return {\n getMessages: () => messages,\n setSystemPrompt,\n reset,\n sendMessage,\n };\n};\n","import { useCallback, useRef, useState } from 'react';\nimport { applyPromptTemplate } from '../prompt/template';\nimport type {\n AiChatInputOptions,\n AiChatResponse,\n AiChatStatus,\n AiClient,\n AiMessage,\n} from '../types';\n\nexport interface UseAiChatOptions {\n client: AiClient;\n systemPrompt?: string;\n template?: string;\n initialMessages?: AiMessage[];\n}\n\nconst buildBaseMessages = (systemPrompt?: string, initialMessages?: AiMessage[]): AiMessage[] => {\n const baseMessages: AiMessage[] = [];\n if (systemPrompt) {\n baseMessages.push({ role: 'system', content: systemPrompt });\n }\n if (initialMessages?.length) {\n baseMessages.push(...initialMessages);\n }\n return baseMessages;\n};\n\nexport const useAiChat = (options: UseAiChatOptions) => {\n const systemPromptRef = useRef(options.systemPrompt);\n const templateRef = useRef(options.template);\n const [messages, setMessages] = useState<AiMessage[]>(() =>\n buildBaseMessages(systemPromptRef.current, options.initialMessages)\n );\n const messagesRef = useRef(messages);\n const [status, setStatus] = useState<AiChatStatus>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [lastResponse, setLastResponse] = useState<AiChatResponse | null>(null);\n\n const syncMessages = (nextMessages: AiMessage[]) => {\n messagesRef.current = nextMessages;\n setMessages(nextMessages);\n };\n\n const reset = useCallback(() => {\n syncMessages(buildBaseMessages(systemPromptRef.current, options.initialMessages));\n setStatus('idle');\n setError(null);\n setLastResponse(null);\n }, [options.initialMessages]);\n\n const setSystemPrompt = useCallback(\n (prompt?: string) => {\n systemPromptRef.current = prompt;\n reset();\n },\n [reset]\n );\n\n const sendMessage = useCallback(\n async (input: string, requestOptions: AiChatInputOptions = {}) => {\n const { template, variables, ...chatOptions } = requestOptions;\n const activeTemplate = template ?? templateRef.current;\n const mergedVariables = { input, ...(variables ?? {}) };\n const content = activeTemplate ? applyPromptTemplate(activeTemplate, mergedVariables) : input;\n\n const userMessage: AiMessage = { role: 'user', content };\n const nextMessages = [...messagesRef.current, userMessage];\n syncMessages(nextMessages);\n setStatus('loading');\n setError(null);\n\n try {\n const response = await options.client.sendChat({\n messages: nextMessages,\n ...chatOptions,\n });\n\n const assistantMessage: AiMessage =\n response.message ?? {\n role: 'assistant',\n content: response.content,\n toolCalls: response.toolCalls,\n };\n const updatedMessages = [...nextMessages, assistantMessage];\n syncMessages(updatedMessages);\n setStatus('success');\n setLastResponse(response);\n return response;\n } catch (err) {\n const nextError = err instanceof Error ? err : new Error(String(err));\n setStatus('error');\n setError(nextError);\n throw nextError;\n }\n },\n [options.client]\n );\n\n return {\n status,\n isLoading: status === 'loading',\n error,\n messages,\n lastResponse,\n sendMessage,\n reset,\n setSystemPrompt,\n };\n};\n","import type { AiToolDefinition } from '../types';\nimport type { SkillDefinition, SkillExecutionContext, SkillRegistry } from './types';\n\nexport const skillToToolDefinition = (skill: SkillDefinition): AiToolDefinition => {\n const toolDefinition: AiToolDefinition = {\n type: 'function',\n function: {\n name: skill.name,\n description: skill.description,\n },\n };\n\n if (skill.inputSchema) {\n toolDefinition.function.parameters = skill.inputSchema;\n }\n\n return toolDefinition;\n};\n\nexport class InMemorySkillRegistry implements SkillRegistry {\n private skills = new Map<string, SkillDefinition>();\n\n constructor(initialSkills?: SkillDefinition[]) {\n initialSkills?.forEach((skill) => {\n this.skills.set(skill.name, skill);\n });\n }\n\n registerSkill(skill: SkillDefinition): void {\n this.skills.set(skill.name, skill);\n }\n\n unregisterSkill(name: string): boolean {\n return this.skills.delete(name);\n }\n\n getSkill(name: string): SkillDefinition | undefined {\n return this.skills.get(name);\n }\n\n listSkills(): SkillDefinition[] {\n return Array.from(this.skills.values());\n }\n\n async executeSkill(name: string, input: any, context?: SkillExecutionContext): Promise<any> {\n const skill = this.skills.get(name);\n if (!skill) {\n throw new Error(`Skill not found: ${name}`);\n }\n return await skill.execute(input, context);\n }\n\n toToolDefinitions(): AiToolDefinition[] {\n return this.listSkills().map(skillToToolDefinition);\n }\n}\n\nexport const createSkillRegistry = (initialSkills?: SkillDefinition[]): InMemorySkillRegistry => {\n return new InMemorySkillRegistry(initialSkills);\n};\n","/**\n * 时间格式化工具\n */\n\nexport const formatTime = {\n /**\n * 将秒数转换为 MM:SS 格式\n */\n toMinutesSeconds(seconds: number): string {\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n return minutes + ':' + remainingSeconds.toString().padStart(2, '0');\n },\n\n /**\n * 将秒数转换为 HH:MM:SS 格式\n */\n toHoursMinutesSeconds(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const remainingSeconds = Math.floor(seconds % 60);\n\n if (hours > 0) {\n return hours + ':' + minutes.toString().padStart(2, '0') + ':' + remainingSeconds.toString().padStart(2, '0');\n }\n return minutes + ':' + remainingSeconds.toString().padStart(2, '0');\n },\n\n /**\n * 格式化日期为用户友好的格式\n */\n formatDate(date: string | Date, locale = 'zh-CN'): string {\n const d = new Date(date);\n const now = new Date();\n const diffMs = now.getTime() - d.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) {\n return locale === 'zh-CN' ? '今天' : 'Today';\n } else if (diffDays === 1) {\n return locale === 'zh-CN' ? '昨天' : 'Yesterday';\n } else if (diffDays < 7) {\n return locale === 'zh-CN' ? diffDays + '天前' : diffDays + ' days ago';\n } else {\n return d.toLocaleDateString(locale);\n }\n },\n};\n\n","/**\n * 日语文本处理工具\n */\n\nexport const japaneseUtils = {\n /**\n * 提取文本中的汉字\n */\n extractKanji(text: string): string[] {\n return text.match(/[\\u4E00-\\u9FAF]/g) || [];\n },\n\n /**\n * 提取文本中的假名\n */\n extractKana(text: string): string[] {\n return text.match(/[\\u3040-\\u309F\\u30A0-\\u30FF]/g) || [];\n },\n\n /**\n * 清理文本,移除特殊字符但保留日语字符\n */\n cleanText(text: string): string {\n return text.replace(/[^\\u3040-\\u309F\\u30A0-\\u30FF\\u4E00-\\u9FAF\\w\\s]/g, '');\n },\n};\n","/**\n * 验证工具\n */\n\nexport const validators = {\n /**\n * 验证邮箱格式\n */\n isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n },\n\n /**\n * 验证密码强度\n */\n isValidPassword(password: string): {\n isValid: boolean;\n errors: string[];\n } {\n const errors: string[] = [];\n\n if (password.length < 6) {\n errors.push('Password must be at least 6 characters');\n }\n\n if (password.length > 50) {\n errors.push('Password must not exceed 50 characters');\n }\n\n if (!/[a-zA-Z]/.test(password)) {\n errors.push('Password must contain at least one letter');\n }\n\n if (!/[0-9]/.test(password)) {\n errors.push('Password must contain at least one number');\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n },\n\n /**\n * 验证用户名格式\n */\n isValidUsername(username: string): boolean {\n const usernameRegex = /^[a-zA-Z0-9_]{3,20}$/;\n return usernameRegex.test(username);\n },\n\n /**\n * 验证文件大小\n */\n isValidFileSize(size: number, maxSize: number): boolean {\n return size > 0 && size <= maxSize;\n },\n\n /**\n * 验证文件类型\n */\n isValidFileType(type: string, supportedTypes: string[]): boolean {\n return supportedTypes.includes(type);\n },\n\n /**\n * 验证 URL 格式\n */\n isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n },\n};\n\n","/**\n * 文件处理工具\n */\n\nexport const fileUtils = {\n /**\n * 格式化文件大小\n */\n formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n },\n\n /**\n * 获取文件扩展名\n */\n getFileExtension(filename: string): string {\n return filename.slice(((filename.lastIndexOf('.') - 1) >>> 0) + 2);\n },\n\n /**\n * 生成唯一文件名\n */\n generateUniqueFileName(originalName: string): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n const extension = this.getFileExtension(originalName);\n const baseName = originalName.replace('.' + (extension), '');\n return extension ? (baseName) + '_' + (timestamp) + '_' + (random) + '.' + (extension) : (baseName) + '_' + (timestamp) + '_' + (random);\n },\n\n /**\n * 验证文件名是否有效\n */\n isValidFilename(filename: string): boolean {\n // 不允许包含特殊字符\n const invalidChars = /[<>:\"/\\\\|?*\\x00-\\x1F]/g;\n return !invalidChars.test(filename) && filename.length > 0 && filename.length <= 255;\n },\n};\n\n","/**\n * 数组和对象工具\n */\n\nexport const arrayUtils = {\n /**\n * 数组去重\n */\n unique<T>(array: T[]): T[] {\n return [...new Set(array)];\n },\n\n /**\n * 数组分组\n */\n groupBy<T>(array: T[], key: keyof T): Record<string, T[]> {\n return array.reduce(\n (groups, item) => {\n const groupKey = String(item[key]);\n const group = groups[groupKey] || [];\n group.push(item);\n groups[groupKey] = group;\n return groups;\n },\n {} as Record<string, T[]>\n );\n },\n\n /**\n * 数组分页\n */\n paginate<T>(\n array: T[],\n page: number,\n limit: number\n ): {\n data: T[];\n total: number;\n page: number;\n pages: number;\n hasNext: boolean;\n hasPrev: boolean;\n } {\n const total = array.length;\n const pages = Math.ceil(total / limit);\n const start = (page - 1) * limit;\n const end = start + limit;\n const data = array.slice(start, end);\n\n return {\n data,\n total,\n page,\n pages,\n hasNext: page < pages,\n hasPrev: page > 1,\n };\n },\n\n /**\n * 数组随机排序\n */\n shuffle<T>(array: T[]): T[] {\n const shuffled = [...array];\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [shuffled[i], shuffled[j]] = [shuffled[j]!, shuffled[i]!];\n }\n return shuffled;\n },\n};\n\n","/**\n * 字符串工具\n */\n\nexport const stringUtils = {\n /**\n * 截断文本\n */\n truncate(text: string, length: number, suffix = '...'): string {\n if (text.length <= length) return text;\n return text.substring(0, length - suffix.length) + suffix;\n },\n\n /**\n * 首字母大写\n */\n capitalize(text: string): string {\n if (!text) return '';\n return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n },\n\n /**\n * 驼峰转下划线\n */\n camelToSnake(text: string): string {\n return text.replace(/[A-Z]/g, (letter) => '_' + (letter.toLowerCase()));\n },\n\n /**\n * 下划线转驼峰\n */\n snakeToCamel(text: string): string {\n return text.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n },\n\n /**\n * 生成随机字符串\n */\n generateRandom(length: number): string {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n },\n};\n\n","/**\n * 调试工具\n */\n\nimport { logger } from '../logger';\nimport { fileUtils } from './file';\n\nexport const debugUtils = {\n /**\n * 安全的 JSON 序列化\n */\n safeStringify(obj: any): string {\n try {\n return JSON.stringify(obj, null, 2);\n } catch (error) {\n return '[Circular Reference or Invalid JSON: ' + (error) + ']';\n }\n },\n\n /**\n * 性能计时器\n */\n createTimer(label?: string) {\n const start = typeof performance !== 'undefined' ? performance.now() : Date.now();\n return {\n end: () => {\n const end = typeof performance !== 'undefined' ? performance.now() : Date.now();\n const duration = end - start;\n const message = (label || 'Timer') + ': ' + (duration.toFixed(2)) + 'ms';\n logger.info(message);\n return duration;\n },\n };\n },\n\n /**\n * 内存使用情况(仅在 Node.js 环境)\n */\n getMemoryUsage(): Record<string, string> | null {\n if (typeof process !== 'undefined' && process.memoryUsage) {\n const usage = process.memoryUsage();\n return {\n rss: fileUtils.formatFileSize(usage.rss),\n heapTotal: fileUtils.formatFileSize(usage.heapTotal),\n heapUsed: fileUtils.formatFileSize(usage.heapUsed),\n external: fileUtils.formatFileSize(usage.external),\n };\n }\n return null;\n },\n};\n\n","/**\n * 错误处理工具\n */\n\nexport const errorUtils = {\n /**\n * 创建标准化的错误对象\n */\n createError(\n code: string,\n message: string,\n details?: any\n ): Error & { code: string; details?: any } {\n const error = new Error(message) as Error & { code: string; details?: any };\n error.code = code;\n if (details) {\n error.details = details;\n }\n return error;\n },\n\n /**\n * 安全的错误信息提取\n */\n extractErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n return 'Unknown error';\n },\n\n /**\n * 错误重试机制\n */\n async retry<T>(fn: () => Promise<T>, maxAttempts = 3, delay = 1000): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt === maxAttempts) {\n throw lastError;\n }\n\n // 指数退避延迟\n await new Promise((resolve) => setTimeout(resolve, delay * Math.pow(2, attempt - 1)));\n }\n }\n\n throw lastError!;\n },\n};\n\n","import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\n","import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, children, ...props }, ref) => {\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as { className?: string }\n return React.cloneElement(children, {\n ...(props as object),\n className: cn(buttonVariants({ variant, size, className }), childProps.className),\n })\n }\n\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-xl border bg-card text-card-foreground shadow\",\n className\n )}\n {...(props as any)}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...(props as any)}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...(props as any)}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...(props as any)} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...(props as any)}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...(props as any)} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n \"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-base shadow-sm transition-colors file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...(props as any)}\n />\n )\n }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n HTMLLabelElement,\n React.LabelHTMLAttributes<HTMLLabelElement> & VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <label\n ref={ref}\n className={cn(labelVariants(), className)}\n {...(props as any)}\n />\n))\nLabel.displayName = \"Label\"\n\nexport { Label }\n","\"use client\";\n\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}) {\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const state = isControlled ? (value as T) : internal;\n\n const setState = React.useCallback(\n (next: T) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n return [state, setState] as const;\n}\n\nexport function Portal({\n children,\n container,\n}: {\n children: React.ReactNode;\n container?: Element | null;\n}) {\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) return null;\n return createPortal(children, container ?? document.body);\n}\n\nexport function useOnClickOutside(\n refs: Array<React.RefObject<HTMLElement | null>>,\n handler: (event: MouseEvent | TouchEvent) => void,\n enabled: boolean\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n const clickedInside = refs.some((ref) => {\n const el = ref.current;\n return el && el.contains(target);\n });\n if (!clickedInside) {\n handler(event);\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [refs, handler, enabled]);\n}\n\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | undefined>\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(value);\n } else {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { useControllableState } from \"./internal/ui-core\"\n\ninterface TabsContextValue {\n value: string\n setValue: (next: string) => void\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\ninterface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n}\n\nconst Tabs = ({\n value,\n defaultValue = \"\",\n onValueChange,\n className,\n ...props\n}: TabsProps) => {\n const [current, setCurrent] = useControllableState({\n value,\n defaultValue,\n onChange: onValueChange,\n })\n\n return (\n <TabsContext.Provider value={{ value: current, setValue: setCurrent }}>\n <div className={className} {...(props as any)} />\n </TabsContext.Provider>\n )\n}\n\nconst TabsList = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"inline-flex h-9 items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground\",\n className\n )}\n {...(props as any)}\n />\n))\nTabsList.displayName = \"TabsList\"\n\ninterface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nconst TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n ({ className, value, onClick, ...props }, ref) => {\n const ctx = React.useContext(TabsContext)\n const active = ctx?.value === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n data-state={active ? \"active\" : \"inactive\"}\n className={cn(\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\",\n active && \"bg-background text-foreground shadow\",\n className\n )}\n onClick={(e) => {\n ctx?.setValue(value)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n }\n)\nTabsTrigger.displayName = \"TabsTrigger\"\n\ninterface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n forceMount?: boolean\n}\n\nconst TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n ({ className, value, forceMount = false, ...props }, ref) => {\n const ctx = React.useContext(TabsContext)\n const active = ctx?.value === value\n if (!active && !forceMount) return null\n\n return (\n <div\n ref={ref}\n data-state={active ? \"active\" : \"inactive\"}\n hidden={!active && forceMount}\n className={cn(\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className\n )}\n {...(props as any)}\n />\n )\n }\n)\nTabsContent.displayName = \"TabsContent\"\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DialogContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\ninterface DialogProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Dialog = ({ open, defaultOpen = false, onOpenChange, children }: DialogProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DialogContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DialogContext.Provider>\n )\n}\n\ninterface TriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, TriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(true)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nDialogTrigger.displayName = \"DialogTrigger\"\n\nconst DialogPortal = ({ children }: { children: React.ReactNode }) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return <Portal>{children}</Portal>\n}\n\nconst DialogClose = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n ctx?.setOpen(false)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nDialogClose.displayName = \"DialogClose\"\n\nconst DialogOverlay = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return (\n <div\n ref={ref}\n className={cn(\"fixed inset-0 z-[9999] bg-black/80\", className)}\n {...(props as any)}\n />\n )\n})\nDialogOverlay.displayName = \"DialogOverlay\"\n\nexport interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n onPointerDownOutside?: (event: PointerEvent) => void\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n showCloseButton?: boolean\n overlayClassName?: string\n}\n\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n ({ className, children, onPointerDownOutside, onEscapeKeyDown, showCloseButton = true, overlayClassName, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n const open = !!ctx?.open\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n (evt) => {\n onPointerDownOutside?.(evt as PointerEvent)\n if (!(evt as Event).defaultPrevented) {\n ctx?.setOpen(false)\n }\n },\n open\n )\n\n React.useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return\n onEscapeKeyDown?.(e)\n if (!e.defaultPrevented) {\n ctx?.setOpen(false)\n }\n }\n document.addEventListener(\"keydown\", onKey)\n return () => document.removeEventListener(\"keydown\", onKey)\n }, [ctx, onEscapeKeyDown, open])\n\n if (!ctx || !open) return null\n\n return (\n <DialogPortal>\n <DialogOverlay className={overlayClassName} />\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[10000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg\",\n className\n )}\n {...(props as any)}\n >\n {children}\n {showCloseButton ? (\n <DialogClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n ) : null}\n </div>\n </DialogPortal>\n )\n }\n)\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...(props as any)}\n />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { buttonVariants } from \"./Button\"\nimport {\n Dialog as AlertDialog,\n DialogPortal as AlertDialogPortal,\n DialogOverlay as AlertDialogOverlay,\n DialogTrigger as AlertDialogTrigger,\n DialogContent as AlertDialogContentBase,\n DialogHeader as AlertDialogHeader,\n DialogFooter as AlertDialogFooter,\n DialogTitle as AlertDialogTitle,\n DialogDescription as AlertDialogDescription,\n DialogClose,\n} from \"./Dialog\"\n\nconst AlertDialogContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<typeof AlertDialogContentBase>\n>(({ className, ...props }, ref) => (\n <AlertDialogContentBase\n ref={ref}\n className={cn(\"z-[9999]\", className)}\n {...(props as any)}\n />\n))\nAlertDialogContent.displayName = \"AlertDialogContent\"\n\nconst AlertDialogAction = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, ...props }, ref) => (\n <DialogClose\n ref={ref}\n className={cn(buttonVariants(), className)}\n {...(props as any)}\n />\n))\nAlertDialogAction.displayName = \"AlertDialogAction\"\n\nconst AlertDialogCancel = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, ...props }, ref) => (\n <DialogClose\n ref={ref}\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className\n )}\n {...(props as any)}\n />\n))\nAlertDialogCancel.displayName = \"AlertDialogCancel\"\n\nexport {\n AlertDialog,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogTrigger,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DropdownMenuContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DropdownMenuContext = React.createContext<DropdownMenuContextValue | null>(null)\nconst DropdownMenuRadioGroupContext = React.createContext<{\n value?: string\n onValueChange?: (value: string) => void\n} | null>(null)\n\ninterface DropdownMenuProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst DropdownMenu = ({ open, defaultOpen = false, onOpenChange, children }: DropdownMenuProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DropdownMenuContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DropdownMenuContext.Provider>\n )\n}\n\nconst DropdownMenuTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { asChild?: boolean; children: React.ReactNode }\n>(({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n})\nDropdownMenuTrigger.displayName = \"DropdownMenuTrigger\"\n\nconst DropdownMenuGroup = ({ children }: { children: React.ReactNode }) => <>{children}</>\nconst DropdownMenuPortal = ({ children }: { children: React.ReactNode }) => <Portal>{children}</Portal>\nconst DropdownMenuSub = ({ children }: { children: React.ReactNode }) => <>{children}</>\n\nconst DropdownMenuContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { sideOffset?: number }\n>(({ className, sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({ top: rect.bottom + sideOffset, left: rect.left })\n }, [trigger, sideOffset])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <DropdownMenuPortal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n className\n )}\n style={{ position: \"fixed\", top: pos.top, left: pos.left, ...style }}\n {...(props as any)}\n />\n </DropdownMenuPortal>\n )\n})\nDropdownMenuContent.displayName = \"DropdownMenuContent\"\n\ntype SelectEventLike = Event & { preventDefault: () => void; defaultPrevented: boolean }\n\nconst DropdownMenuItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n inset?: boolean\n onSelect?: (event: SelectEventLike) => void\n }\n>(({ className, inset, onSelect, onClick, ...props }, ref) => {\n const ctx = React.useContext(DropdownMenuContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n inset && \"pl-8\",\n className\n )}\n onClick={(e) => {\n onSelect?.(e.nativeEvent as SelectEventLike)\n onClick?.(e)\n if (!e.isDefaultPrevented()) {\n ctx?.setOpen(false)\n }\n }}\n {...(props as any)}\n />\n )\n})\nDropdownMenuItem.displayName = \"DropdownMenuItem\"\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & {\n checked?: boolean\n onCheckedChange?: (checked: boolean) => void\n }\n>(({ className, children, checked = false, onCheckedChange, onClick, ...props }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n onCheckedChange?.(!checked)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {checked ? <Check className=\"h-4 w-4\" /> : null}\n </span>\n {children}\n </button>\n))\nDropdownMenuCheckboxItem.displayName = \"DropdownMenuCheckboxItem\"\n\nconst DropdownMenuRadioGroup = ({\n value,\n onValueChange,\n children,\n}: {\n value?: string\n onValueChange?: (value: string) => void\n children: React.ReactNode\n}) => (\n <DropdownMenuRadioGroupContext.Provider value={{ value, onValueChange }}>\n {children}\n </DropdownMenuRadioGroupContext.Provider>\n)\n\nconst DropdownMenuRadioItem = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string }\n>(({ className, children, value, onClick, ...props }, ref) => {\n const radioCtx = React.useContext(DropdownMenuRadioGroupContext)\n const menuCtx = React.useContext(DropdownMenuContext)\n const checked = radioCtx?.value === value\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n radioCtx?.onValueChange?.(value)\n onClick?.(e)\n menuCtx?.setOpen(false)\n }}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n {checked ? <Circle className=\"h-2 w-2 fill-current\" /> : null}\n </span>\n {children}\n </button>\n )\n})\nDropdownMenuRadioItem.displayName = \"DropdownMenuRadioItem\"\n\nconst DropdownMenuLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", inset && \"pl-8\", className)}\n {...(props as any)}\n />\n))\nDropdownMenuLabel.displayName = \"DropdownMenuLabel\"\n\nconst DropdownMenuSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nDropdownMenuSeparator.displayName = \"DropdownMenuSeparator\"\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...(props as any)}\n />\n)\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { inset?: boolean }\n>(({ className, inset, children, ...props }, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"flex w-full cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none hover:bg-accent\",\n inset && \"pl-8\",\n className\n )}\n {...(props as any)}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </button>\n))\nDropdownMenuSubTrigger.displayName = \"DropdownMenuSubTrigger\"\n\nconst DropdownMenuSubContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg\",\n className\n )}\n {...(props as any)}\n />\n))\nDropdownMenuSubContent.displayName = \"DropdownMenuSubContent\"\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface PopoverContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n anchorRef: React.RefObject<HTMLSpanElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst PopoverContext = React.createContext<PopoverContextValue | null>(null)\n\ninterface PopoverProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Popover = ({ open, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const anchorRef = React.useRef<HTMLSpanElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <PopoverContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, anchorRef, contentRef }}>\n {children}\n </PopoverContext.Provider>\n )\n}\n\ninterface PopoverTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst PopoverTrigger = React.forwardRef<HTMLButtonElement, PopoverTriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nPopoverTrigger.displayName = \"PopoverTrigger\"\n\nconst PopoverAnchor = React.forwardRef<HTMLSpanElement, React.HTMLAttributes<HTMLSpanElement>>(\n ({ ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n if (!ctx) return null\n\n return (\n <span ref={mergeRefs(ctx.anchorRef, ref)} {...(props as any)} />\n )\n }\n)\nPopoverAnchor.displayName = \"PopoverAnchor\"\n\ninterface PopoverContentProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: \"start\" | \"center\" | \"end\"\n sideOffset?: number\n}\n\nconst PopoverContent = React.forwardRef<HTMLDivElement, PopoverContentProps>(\n ({ className, align = \"center\", sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(PopoverContext)\n const [position, setPosition] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const anchor = ctx?.anchorRef.current ?? ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!anchor) return\n const rect = anchor.getBoundingClientRect()\n let left = rect.left + rect.width / 2\n if (align === \"start\") left = rect.left\n if (align === \"end\") left = rect.right\n setPosition({ top: rect.bottom + sideOffset, left })\n }, [anchor, align, sideOffset])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open) return null\n\n return (\n <Portal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n className\n )}\n style={{\n position: \"fixed\",\n top: position.top,\n left: position.left,\n transform: align === \"center\" ? \"translateX(-50%)\" : align === \"end\" ? \"translateX(-100%)\" : undefined,\n ...style,\n }}\n {...(props as any)}\n />\n </Portal>\n )\n }\n)\nPopoverContent.displayName = \"PopoverContent\"\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n}\n\nconst Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n ({ className, value = 0, max = 100, ...props }, ref) => {\n const safeMax = max <= 0 ? 100 : max\n const safeValue = Math.max(0, Math.min(value, safeMax))\n const percent = (safeValue / safeMax) * 100\n\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={safeMax}\n aria-valuenow={safeValue}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className\n )}\n {...(props as any)}\n >\n <div\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - percent}%)` }}\n />\n </div>\n )\n }\n)\nProgress.displayName = \"Progress\"\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst ScrollArea = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"relative overflow-auto\", className)}\n {...(props as any)}\n >\n {children}\n </div>\n))\nScrollArea.displayName = \"ScrollArea\"\n\ninterface ScrollBarProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"vertical\" | \"horizontal\"\n}\n\nconst ScrollBar = React.forwardRef<HTMLDivElement, ScrollBarProps>(\n ({ className, orientation = \"vertical\", ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"pointer-events-none absolute\",\n orientation === \"vertical\"\n ? \"right-0 top-0 h-full w-2.5\"\n : \"bottom-0 left-0 h-2.5 w-full\",\n className\n )}\n {...(props as any)}\n />\n )\n)\nScrollBar.displayName = \"ScrollBar\"\n\nexport { ScrollArea, ScrollBar }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface SelectContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n value?: string\n setValue: (value: string) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n itemsRef: React.MutableRefObject<Map<string, React.ReactNode>>\n}\n\nconst SelectContext = React.createContext<SelectContextValue | null>(null)\nconst SelectGroupContext = React.createContext<boolean>(false)\n\ninterface SelectProps {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n disabled?: boolean\n children: React.ReactNode\n}\n\nconst Select = ({\n value,\n defaultValue,\n onValueChange,\n open,\n defaultOpen = false,\n onOpenChange,\n disabled = false,\n children,\n}: SelectProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const [currentValue, setCurrentValue] = useControllableState<string | undefined>({\n value,\n defaultValue,\n onChange: (next) => {\n if (next !== undefined) {\n onValueChange?.(next)\n }\n },\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n const itemsRef = React.useRef<Map<string, React.ReactNode>>(new Map())\n\n return (\n <SelectContext.Provider\n value={{\n open: disabled ? false : isOpen,\n setOpen: disabled ? () => undefined : setIsOpen,\n value: currentValue,\n setValue: (next) => {\n if (disabled) return\n setCurrentValue(next)\n setIsOpen(false)\n },\n triggerRef,\n contentRef,\n itemsRef,\n }}\n >\n {children}\n </SelectContext.Provider>\n )\n}\n\nconst SelectGroup = ({ children }: { children: React.ReactNode }) => (\n <SelectGroupContext.Provider value={true}>{children}</SelectGroupContext.Provider>\n)\n\nconst SelectValue = ({\n placeholder,\n children,\n}: {\n placeholder?: React.ReactNode\n children?: React.ReactNode\n}) => {\n const ctx = React.useContext(SelectContext)\n if (!ctx) return null\n if (children) return <>{children}</>\n if (ctx.value && ctx.itemsRef.current.has(ctx.value)) {\n return <>{ctx.itemsRef.current.get(ctx.value)}</>\n }\n return <span className=\"text-muted-foreground\">{placeholder}</span>\n}\n\nconst SelectTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ className, children, onClick, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n if (!ctx) return null\n\n return (\n <button\n ref={mergeRefs(ctx.triggerRef, ref)}\n type=\"button\"\n className={cn(\n \"flex h-9 w-full items-center justify-between whitespace-nowrap rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm ring-offset-background focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n onClick={(e) => {\n ctx.setOpen(!ctx.open)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span>{children}</span>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </button>\n )\n})\nSelectTrigger.displayName = \"SelectTrigger\"\n\nconst SelectScrollUpButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...(props as any)}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </div>\n))\nSelectScrollUpButton.displayName = \"SelectScrollUpButton\"\n\nconst SelectScrollDownButton = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...(props as any)}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </div>\n))\nSelectScrollDownButton.displayName = \"SelectScrollDownButton\"\n\nconst SelectContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & {\n position?: \"item-aligned\" | \"popper\"\n }\n>(({ className, children, style, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0, width: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({ top: rect.bottom + 4, left: rect.left, width: rect.width })\n }, [trigger])\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n () => ctx?.setOpen(false),\n open\n )\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <Portal>\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"relative z-50 max-h-80 overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md\",\n className\n )}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n minWidth: Math.max(pos.width, 128),\n ...style,\n }}\n {...(props as any)}\n >\n <div className=\"p-1\">{children}</div>\n </div>\n </Portal>\n )\n})\nSelectContent.displayName = \"SelectContent\"\n\nconst SelectLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...(props as any)}\n />\n))\nSelectLabel.displayName = \"SelectLabel\"\n\ninterface SelectItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nconst SelectItem = React.forwardRef<HTMLButtonElement, SelectItemProps>(\n ({ className, children, value, onClick, ...props }, ref) => {\n const ctx = React.useContext(SelectContext)\n\n React.useEffect(() => {\n if (!ctx) return\n ctx.itemsRef.current.set(value, children)\n return () => {\n ctx.itemsRef.current.delete(value)\n }\n }, [ctx, value, children])\n\n if (!ctx) return null\n\n const selected = ctx.value === value\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-2 pr-8 text-sm outline-none hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\",\n className\n )}\n onClick={(e) => {\n ctx.setValue(value)\n onClick?.(e)\n }}\n {...(props as any)}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n {selected ? <Check className=\"h-4 w-4\" /> : null}\n </span>\n <span>{children}</span>\n </button>\n )\n }\n)\nSelectItem.displayName = \"SelectItem\"\n\nconst SelectSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nSelectSeparator.displayName = \"SelectSeparator\"\n\nexport {\n Select,\n SelectGroup,\n SelectValue,\n SelectTrigger,\n SelectContent,\n SelectLabel,\n SelectItem,\n SelectSeparator,\n SelectScrollUpButton,\n SelectScrollDownButton,\n}\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nexport interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: \"horizontal\" | \"vertical\"\n decorative?: boolean\n}\n\nconst Separator = React.forwardRef<HTMLDivElement, SeparatorProps>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <div\n ref={ref}\n role={decorative ? undefined : \"separator\"}\n aria-orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...(props as any)}\n />\n )\n)\nSeparator.displayName = \"Separator\"\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport {\n Dialog as Sheet,\n DialogTrigger as SheetTrigger,\n DialogClose as SheetClose,\n DialogPortal as SheetPortal,\n DialogOverlay as SheetOverlay,\n DialogContent as BaseDialogContent,\n} from \"./Dialog\"\n\nconst sheetVariants = cva(\n \"fixed z-[10000] gap-4 bg-background p-6 shadow-lg transition ease-in-out translate-x-0 translate-y-0\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 left-0 border-b\",\n bottom: \"inset-x-0 bottom-0 left-0 border-t\",\n left: \"inset-y-0 left-0 top-0 h-full w-3/4 border-r sm:max-w-sm\",\n right: \"inset-y-0 right-0 top-0 h-full w-3/4 border-l sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends Omit<React.ComponentPropsWithoutRef<typeof BaseDialogContent>, \"children\">,\n VariantProps<typeof sheetVariants> {\n children?: React.ReactNode\n}\n\nconst SheetContent = React.forwardRef<HTMLDivElement, SheetContentProps>(\n ({ side = \"right\", className, children, ...props }, ref) => (\n <BaseDialogContent\n ref={ref}\n className={cn(\n \"max-w-none rounded-none\",\n sheetVariants({ side }),\n className\n )}\n showCloseButton={false}\n {...(props as any)}\n >\n <SheetClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetClose>\n {children}\n </BaseDialogContent>\n )\n)\nSheetContent.displayName = \"SheetContent\"\n\nconst SheetHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-2 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetTitle.displayName = \"SheetTitle\"\n\nconst SheetDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetDescription.displayName = \"SheetDescription\"\n\nexport {\n Sheet,\n SheetPortal,\n SheetOverlay,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst Textarea = React.forwardRef<\n HTMLTextAreaElement,\n React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n \"flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n className\n )}\n ref={ref}\n {...(props as any)}\n />\n )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal } from \"./internal/ui-core\"\n\nconst TooltipConfigContext = React.createContext<{ delayDuration: number }>({\n delayDuration: 200,\n})\n\ninterface TooltipContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLSpanElement>\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null)\n\nconst TooltipProvider = ({\n children,\n delayDuration = 200,\n}: {\n children: React.ReactNode\n delayDuration?: number\n}) => {\n return (\n <TooltipConfigContext.Provider value={{ delayDuration }}>\n {children}\n </TooltipConfigContext.Provider>\n )\n}\n\nconst Tooltip = ({ children }: { children: React.ReactNode }) => {\n const [open, setOpen] = React.useState(false)\n const triggerRef = React.useRef<HTMLSpanElement>(null)\n return (\n <TooltipContext.Provider value={{ open, setOpen, triggerRef }}>\n {children}\n </TooltipContext.Provider>\n )\n}\n\nconst TooltipTrigger = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement> & { asChild?: boolean; children: React.ReactNode }\n>(({ children, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const cfg = React.useContext(TooltipConfigContext)\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n if (!ctx) return null\n\n const setRef = mergeRefs(ctx.triggerRef, ref)\n\n const openWithDelay = () => {\n if (timer.current) clearTimeout(timer.current)\n timer.current = setTimeout(() => ctx.setOpen(true), cfg.delayDuration)\n }\n\n const closeNow = () => {\n if (timer.current) clearTimeout(timer.current)\n ctx.setOpen(false)\n }\n\n const shared = {\n onMouseEnter: openWithDelay,\n onMouseLeave: closeNow,\n onFocus: openWithDelay,\n onBlur: closeNow,\n ...props,\n }\n\n return (\n <span ref={setRef} {...(shared as any)}>\n {children}\n </span>\n )\n})\nTooltipTrigger.displayName = \"TooltipTrigger\"\n\nconst TooltipContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & { sideOffset?: number }\n>(({ className, sideOffset = 4, style, ...props }, ref) => {\n const ctx = React.useContext(TooltipContext)\n const [pos, setPos] = React.useState({ top: 0, left: 0 })\n const open = !!ctx?.open\n const trigger = ctx?.triggerRef.current ?? null\n\n React.useLayoutEffect(() => {\n if (!trigger) return\n const rect = trigger.getBoundingClientRect()\n setPos({\n top: rect.top - sideOffset,\n left: rect.left + rect.width / 2,\n })\n }, [trigger, sideOffset])\n\n if (!ctx || !open || !trigger) return null\n\n return (\n <Portal>\n <div\n ref={ref}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground\",\n className\n )}\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n transform: \"translate(-50%, -100%)\",\n ...style,\n }}\n {...(props as any)}\n />\n </Portal>\n )\n})\nTooltipContent.displayName = \"TooltipContent\"\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\ntype AvatarStatus = \"idle\" | \"loaded\" | \"error\"\n\nconst AvatarContext = React.createContext<{\n status: AvatarStatus\n setStatus: (next: AvatarStatus) => void\n} | null>(null)\n\nconst Avatar = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const [status, setStatus] = React.useState<AvatarStatus>(\"idle\")\n\n return (\n <AvatarContext.Provider value={{ status, setStatus }}>\n <span\n ref={ref}\n className={cn(\n \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n className\n )}\n {...(props as any)}\n />\n </AvatarContext.Provider>\n )\n})\nAvatar.displayName = \"Avatar\"\n\nconst AvatarImage = React.forwardRef<\n HTMLImageElement,\n React.ImgHTMLAttributes<HTMLImageElement>\n>(({ className, onLoad, onError, ...props }, ref) => {\n const ctx = React.useContext(AvatarContext)\n\n return (\n <img\n ref={ref}\n className={cn(\n \"aspect-square h-full w-full\",\n ctx?.status === \"error\" ? \"hidden\" : undefined,\n className\n )}\n onLoad={(e) => {\n ctx?.setStatus(\"loaded\")\n onLoad?.(e)\n }}\n onError={(e) => {\n ctx?.setStatus(\"error\")\n onError?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nAvatarImage.displayName = \"AvatarImage\"\n\nconst AvatarFallback = React.forwardRef<\n HTMLSpanElement,\n React.HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(AvatarContext)\n const show = ctx?.status !== \"loaded\"\n\n if (!show) return null\n\n return (\n <span\n ref={ref}\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n className\n )}\n {...(props as any)}\n />\n )\n})\nAvatarFallback.displayName = \"AvatarFallback\"\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import React from 'react';\nimport { clsx } from 'clsx';\n\n// ==================== 公共类型定义 ====================\n\n/** 基础网格项接口 */\nexport interface GridItem {\n id: string;\n [key: string]: any; // 允许额外的属性\n }\n \n /** 网格列数配置 */\n export interface GridColumns {\n /** 小屏幕列数 (640px+) */\n sm?: number;\n /** 中等屏幕列数 (768px+) */\n md?: number;\n /** 大屏幕列数 (1024px+) */\n lg?: number;\n /** 超大屏幕列数 (1280px+) */\n xl?: number;\n }\n \n /** 网格间距类型 */\n export type GridGap = 'sm' | 'md' | 'lg' | 'xl';\n \n // ==================== 公共工具函数 ====================\n \n /** 构建网格列数类名 */\n export function buildGridColsClasses(columns: GridColumns): string {\n return [\n 'grid-cols-1', // 默认单列\n columns.sm ? 'sm:grid-cols-' + (columns.sm) : '',\n columns.md ? 'md:grid-cols-' + (columns.md) : 'md:grid-cols-2',\n columns.lg ? 'lg:grid-cols-' + (columns.lg) : 'lg:grid-cols-3',\n columns.xl ? 'xl:grid-cols-' + (columns.xl) : ''\n ].filter(Boolean).join(' ');\n }\n \n /** 获取间距类名 */\n export function getGapClassName(gap: GridGap): string {\n const gapClasses: Record<GridGap, string> = {\n sm: 'gap-3',\n md: 'gap-6',\n lg: 'gap-8',\n xl: 'gap-10'\n };\n return gapClasses[gap];\n }\n \n // ==================== 通用网格组件 ====================\n \n /** 通用网格组件 Props */\n export interface GridProps<T extends GridItem> {\n /** 数据项数组 */\n items: T[];\n /** 渲染函数 */\n renderItem: (item: T, index: number) => React.ReactNode;\n /** 网格列数配置 */\n columns?: GridColumns;\n /** 间距配置 */\n gap?: GridGap;\n /** 额外的容器类名 */\n className?: string;\n /** 容器样式 */\n style?: React.CSSProperties;\n }\n \n /** 通用网格组件 */\n export function Grid<T extends GridItem>({\n items,\n renderItem,\n columns = { md: 2, lg: 3 },\n gap = 'md',\n className = '',\n style\n }: GridProps<T>) {\n const gridColsClasses = buildGridColsClasses(columns);\n const gapClass = getGapClassName(gap);\n \n return (\n <div \n className={clsx('grid', gridColsClasses, gapClass, className)}\n style={style}\n >\n {items.map((item, index) => (\n <div key={item.id}>\n {renderItem(item, index)}\n </div>\n ))}\n </div>\n );\n }","import React from 'react';\nimport { clsx } from 'clsx';\n\ninterface SearchBoxProps {\n searchQuery: string;\n onSearchChange: (query: string) => void;\n placeholder?: string;\n size?: 'small' | 'medium' | 'large';\n}\n\nexport const SearchBox: React.FC<SearchBoxProps> = ({ \n searchQuery, \n onSearchChange, \n placeholder = \"搜索实验项目的标题、描述或标签...\",\n size = 'large'\n}) => {\n // 根据尺寸获取样式\n const getSizeStyles = () => {\n switch (size) {\n case 'small':\n return {\n container: 'h-10',\n input: 'pl-10 pr-10 text-sm',\n icon: 'w-4 h-4',\n iconPosition: 'left-3',\n clearButton: 'right-2 w-6 h-6',\n clearIcon: 'w-3 h-3'\n };\n case 'medium':\n return {\n container: 'h-12',\n input: 'pl-12 pr-12 text-base',\n icon: 'w-5 h-5',\n iconPosition: 'left-3',\n clearButton: 'right-3 w-7 h-7',\n clearIcon: 'w-4 h-4'\n };\n case 'large':\n default:\n return {\n container: 'h-16',\n input: 'pl-6 pr-16 text-lg',\n icon: 'w-6 h-6',\n iconPosition: 'left-6',\n clearButton: 'right-4 w-8 h-8',\n clearIcon: 'w-4 h-4'\n };\n }\n };\n\n const styles = getSizeStyles();\n const isLarge = size === 'large';\n\n return (\n <div className=\"relative group w-full\">\n {/* 搜索输入框 */}\n <input\n type=\"text\"\n placeholder={placeholder}\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n className={clsx(\n 'w-full',\n styles.container,\n styles.input,\n isLarge ? 'border-2 border-gray-200 rounded-2xl shadow-lg' : 'border border-gray-300 rounded-lg shadow-sm',\n 'bg-white focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 hover:border-gray-400',\n isLarge ? 'hover:shadow-xl' : 'hover:shadow-md',\n 'transition-all duration-300 ease-out text-gray-800 placeholder-gray-500',\n isLarge ? 'font-medium' : 'font-normal'\n )}\n />\n\n {/* 清除按钮 */}\n {searchQuery && (\n <button\n onClick={() => onSearchChange('')}\n className={clsx(\n 'absolute top-1/2',\n styles.clearButton,\n 'transform -translate-y-1/2 z-10 group/clear'\n )}\n >\n <div className={clsx(\n styles.clearButton,\n 'flex items-center justify-center rounded-full bg-gray-100 hover:bg-gray-200 transition-all duration-200 group-hover/clear:scale-105'\n )}>\n <svg \n className={clsx(styles.clearIcon, 'text-gray-500 group-hover/clear:text-gray-700')}\n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\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 </button>\n )}\n </div>\n );\n}","'use client';\n\nimport React from 'react';\n\n// Timeline相关的类型定义\nexport interface TimelineItem {\n date: string;\n title: string;\n description: string;\n}\n\nexport interface TimelineConfig {\n items: TimelineItem[];\n}\n\ninterface TimelineProps {\n items?: TimelineItem[];\n}\n\nexport const Timeline: React.FC<TimelineProps> = ({ items = [] }) => {\n if (!items || items.length === 0) {\n return null;\n }\n\n return (\n <div className=\"relative\">\n {/* 时间线 */}\n <div className=\"absolute left-4 top-0 bottom-0 w-0.5 bg-gray-200\"></div>\n \n {/* 时间线项目 */}\n {items.map((item, index) => (\n <div key={index} className=\"relative pl-12 pb-8\">\n {/* 时间点 */}\n <div className=\"absolute left-0 w-8 h-8 rounded-full bg-blue-500 border-4 border-white shadow-md flex items-center justify-center\">\n <div className=\"w-2 h-2 rounded-full bg-white\"></div>\n </div>\n \n {/* 内容 */}\n <div className=\"bg-white rounded-lg p-4 shadow-md\">\n <div className=\"text-sm text-gray-500 mb-2\">{item.date}</div>\n <h4 className=\"text-lg font-semibold mb-2\">{item.title}</h4>\n <p className=\"text-gray-600\">{item.description}</p>\n </div>\n </div>\n ))}\n </div>\n );\n};\n\nexport default Timeline;\n","'use client';\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { clsx } from 'clsx';\n\n// CollisionBalls相关的类型定义\nexport interface Ball {\n x: number;\n y: number;\n vx: number;\n vy: number;\n radius: number;\n color: string;\n text?: string;\n isDragging?: boolean;\n}\n\nexport interface CollisionBallsConfig {\n balls: {\n id: string;\n label: string;\n color: string;\n size: number;\n }[];\n width: number;\n height: number;\n}\n\ninterface CollisionBallsProps {\n collisionBallsConfig: CollisionBallsConfig;\n}\n\nexport const CollisionBalls: React.FC<CollisionBallsProps> = ({\n collisionBallsConfig: {\n balls,\n width,\n height\n },\n}) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const ballsRef = useRef<Ball[]>([]);\n const [isShaking, setIsShaking] = useState(false);\n const [draggedBall, setDraggedBall] = useState<Ball | null>(null);\n const [mousePos, setMousePos] = useState({ x: 0, y: 0 });\n const animationRef = useRef<number | null>(null);\n\n // 更新canvas尺寸\n const updateCanvasSize = () => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n if (!container || !canvas) {\n console.error('Container or canvas not found');\n return;\n }\n\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n \n console.log('Container size:', { containerWidth, containerHeight });\n \n // 设置canvas的实际尺寸\n canvas.width = containerWidth;\n canvas.height = containerHeight;\n \n // 设置canvas的显示尺寸\n canvas.style.width = (containerWidth) + 'px';\n canvas.style.height = (containerHeight) + 'px';\n \n console.log('Canvas size updated:', {\n width: canvas.width,\n height: canvas.height,\n containerWidth,\n containerHeight\n });\n };\n\n // 初始化小球\n const initBalls = () => {\n const canvas = canvasRef.current;\n if (!canvas) {\n console.error('Canvas not found during ball initialization');\n return [];\n }\n\n console.log('Initializing balls with canvas size:', {\n width: canvas.width,\n height: canvas.height\n });\n\n return balls.map((ballConfig) => ({\n x: Math.random() * (canvas.width - 100) + 50,\n y: Math.random() * (canvas.height - 100) + 50,\n vx: (Math.random() - 0.5) * 4,\n vy: (Math.random() - 0.5) * 4,\n radius: ballConfig.size,\n color: ballConfig.color,\n text: ballConfig.label,\n isDragging: false\n }));\n };\n\n // 添加resize监听\n useEffect(() => {\n const handleResize = () => {\n console.log('Window resized');\n updateCanvasSize();\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', handleResize);\n // 初始设置尺寸\n updateCanvasSize();\n }\n\n return () => {\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', handleResize);\n }\n };\n }, []);\n\n // 动画循环\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n console.error('Canvas element not found');\n return;\n }\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n console.error('Failed to get canvas context');\n return;\n }\n\n console.log('Starting animation setup...');\n \n // 确保canvas尺寸已更新\n updateCanvasSize();\n \n // 初始化小球\n ballsRef.current = initBalls();\n console.log('Balls initialized:', ballsRef.current);\n\n let lastTime = performance.now();\n let frameCount = 0;\n\n const animate = (currentTime: number) => {\n try {\n // 计算帧率\n frameCount++;\n if (currentTime - lastTime >= 1000) {\n console.log('FPS: ' + (frameCount));\n frameCount = 0;\n lastTime = currentTime;\n }\n\n // 清除画布\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // 更新和绘制每个小球\n ballsRef.current.forEach((ball) => {\n if (!ball.isDragging) {\n updatePosition(ball, canvas.width, canvas.height);\n }\n\n for (let i = 0; i < ballsRef.current.length; i++) {\n for (let j = i + 1; j < ballsRef.current.length; j++) {\n const ball1 = ballsRef.current[i];\n const ball2 = ballsRef.current[j];\n if (ball1 && ball2) {\n checkCollision(ball1, ball2);\n }\n }\n }\n\n draw(ctx, ball);\n });\n\n // 继续动画循环\n animationRef.current = requestAnimationFrame(animate);\n } catch (error) {\n console.error('Animation error:', error);\n }\n };\n\n // 启动动画\n console.log('Starting animation loop...');\n animationRef.current = requestAnimationFrame(animate);\n\n // 清理函数\n return () => {\n console.log('Cleaning up animation...');\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n animationRef.current = null;\n }\n };\n }, []);\n\n const shake = () => {\n setIsShaking(true);\n ballsRef.current.forEach((ball) => {\n ball.vx = (Math.random() - 0.5) * 10;\n ball.vy = (Math.random() - 0.5) * 10;\n });\n setTimeout(() => setIsShaking(false), 200);\n };\n\n const slowdown = () => {\n setIsShaking(true);\n ballsRef.current.forEach((ball) => {\n ball.vx = ball.vx * 0.5;\n ball.vy = ball.vy * 0.5;\n });\n setTimeout(() => setIsShaking(false), 200);\n };\n\n const checkCollision = (ball1: Ball, ball2: Ball) => {\n const dx = ball2.x - ball1.x;\n const dy = ball2.y - ball1.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance < ball1.radius + ball2.radius) {\n const angle = Math.atan2(dy, dx);\n const overlap = (ball1.radius + ball2.radius - distance) / 2;\n\n if (ball1.isDragging || ball2.isDragging) {\n const draggedBall = ball1.isDragging ? ball1 : ball2;\n const otherBall = ball1.isDragging ? ball2 : ball1;\n\n otherBall.x += (draggedBall === ball1 ? 1 : -1) * overlap * Math.cos(angle);\n otherBall.y += (draggedBall === ball1 ? 1 : -1) * overlap * Math.sin(angle);\n\n const pushForce = 2;\n otherBall.vx = (draggedBall === ball1 ? -1 : 1) * Math.cos(angle) * pushForce;\n otherBall.vy = (draggedBall === ball1 ? -1 : 1) * Math.sin(angle) * pushForce;\n\n return;\n }\n\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n\n const vx1 = ball1.vx * cos + ball1.vy * sin;\n const vy1 = ball1.vy * cos - ball1.vx * sin;\n const vx2 = ball2.vx * cos + ball2.vy * sin;\n const vy2 = ball2.vy * cos - ball2.vx * sin;\n\n const newVx1 = vx2;\n const newVx2 = vx1;\n\n ball1.vx = newVx1 * cos - vy1 * sin;\n ball1.vy = vy1 * cos + newVx1 * sin;\n ball2.vx = newVx2 * cos - vy2 * sin;\n ball2.vy = vy2 * cos + newVx2 * sin;\n\n ball1.x -= overlap * Math.cos(angle);\n ball1.y -= overlap * Math.sin(angle);\n ball2.x += overlap * Math.cos(angle);\n ball2.y += overlap * Math.sin(angle);\n }\n };\n\n const updatePosition = (ball: Ball, width: number, height: number) => {\n const handleBoundaryCollision = (\n velocity: number,\n position: number,\n boundary: number,\n radius: number,\n ): [number, number] => {\n let newVelocity = velocity;\n let newPosition = position;\n\n if (position - radius < 0) {\n newPosition = radius;\n newVelocity = Math.abs(velocity);\n } else if (position + radius > boundary) {\n newPosition = boundary - radius;\n newVelocity = -Math.abs(velocity);\n }\n\n return [newVelocity, newPosition];\n };\n\n const [newVx, newX] = handleBoundaryCollision(\n ball.vx,\n ball.x,\n width,\n ball.radius,\n );\n const [newVy, newY] = handleBoundaryCollision(\n ball.vy,\n ball.y,\n height,\n ball.radius,\n );\n\n ball.vx = newVx;\n ball.vy = newVy;\n ball.x = newX;\n ball.y = newY;\n };\n\n const draw = (ctx: CanvasRenderingContext2D, ball: Ball) => {\n ctx.beginPath();\n ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2);\n ctx.fillStyle = ball.color;\n ctx.fill();\n ctx.closePath();\n\n if (ball.text) {\n ctx.font = \"14px Arial\";\n ctx.fillStyle = \"#fff\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n ctx.fillText(ball.text, ball.x, ball.y);\n }\n };\n\n const handleMouseDown = (event: React.MouseEvent<HTMLCanvasElement>) => {\n const mousePos = getMousePos(event);\n const ball = ballsRef.current.find((b) => {\n const dx = b.x - mousePos.x;\n const dy = b.y - mousePos.y;\n return Math.sqrt(dx * dx + dy * dy) < b.radius;\n });\n\n if (ball) {\n ball.isDragging = true;\n setDraggedBall(ball);\n }\n };\n\n const handleMouseMove = (event: React.MouseEvent<HTMLCanvasElement>) => {\n const mousePos = getMousePos(event);\n setMousePos(mousePos);\n\n if (draggedBall) {\n draggedBall.x = mousePos.x;\n draggedBall.y = mousePos.y;\n draggedBall.vx = 0;\n draggedBall.vy = 0;\n }\n };\n\n const handleMouseUp = () => {\n if (draggedBall) {\n draggedBall.isDragging = false;\n setDraggedBall(null);\n }\n };\n\n const getMousePos = (event: React.MouseEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas) return { x: 0, y: 0 };\n\n const rect = canvas.getBoundingClientRect();\n const scaleX = canvas.width / rect.width;\n const scaleY = canvas.height / rect.height;\n \n return {\n x: (event.clientX - rect.left) * scaleX,\n y: (event.clientY - rect.top) * scaleY\n };\n };\n\n return (\n <div style={{ width: '100%', height: '100%', position: 'relative', backgroundColor: '#f9fafb', borderRadius: '0.5rem' }}>\n <div ref={containerRef} style={{ width: '100%', height: '100%', position: 'absolute', top: 0, left: 0 }}>\n <canvas\n ref={canvasRef}\n style={{ \n width: '100%', \n height: '100%',\n display: 'block' // 确保canvas正确显示\n }}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n />\n </div>\n <div className=\"absolute bottom-4 right-4 flex gap-2\">\n <button\n onClick={shake}\n className={clsx('px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors', isShaking ? \"animate-pulse\" : \"\")}\n >\n 摇一摇\n </button>\n <button\n onClick={slowdown}\n className={clsx('px-4 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600 transition-colors', isShaking ? \"animate-pulse\" : \"\")}\n >\n 减速\n </button>\n </div>\n </div>\n );\n};\n\nexport default CollisionBalls;\n","'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { \n ChevronUp, \n ChevronDown, \n GripVertical, \n Save,\n RotateCcw,\n AlertCircle\n} from 'lucide-react';\nimport { cn } from '../utils';\n\nexport interface OrderableItem {\n id: number;\n [key: string]: any;\n}\n\nexport interface OrderManagerOperations<T extends OrderableItem> {\n loadItems: () => Promise<T[]>;\n moveItemUp: (id: number) => Promise<void>;\n moveItemDown: (id: number) => Promise<void>;\n updateItemOrder: (orders: { id: number; order: number }[]) => Promise<void>;\n}\n\nexport interface GenericOrderManagerProps<T extends OrderableItem> {\n operations: OrderManagerOperations<T>;\n renderItem: (item: T, index: number, isFirst: boolean, isLast: boolean) => React.ReactNode;\n className?: string;\n title?: string;\n description?: string;\n onOrderChanged?: () => void;\n emptyMessage?: string;\n loadingMessage?: string;\n}\n\nexport function GenericOrderManager<T extends OrderableItem>({\n operations,\n renderItem,\n className = '',\n title = '顺序管理',\n description = '拖拽或使用按钮调整显示顺序',\n onOrderChanged,\n emptyMessage = '暂无数据',\n loadingMessage = '加载数据...'\n}: GenericOrderManagerProps<T>) {\n const [items, setItems] = useState<T[]>([]);\n const [originalOrder, setOriginalOrder] = useState<T[]>([]);\n const [loading, setLoading] = useState(true);\n const [saving, setSaving] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [hasChanges, setHasChanges] = useState(false);\n const [draggedItem, setDraggedItem] = useState<number | null>(null);\n\n // 加载数据\n const loadItems = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n \n const data = await operations.loadItems();\n \n setItems(data);\n setOriginalOrder([...data]);\n setHasChanges(false);\n } catch (err) {\n console.error('❌ [通用排序] 加载数据错误:', err);\n setError(err instanceof Error ? err.message : '加载数据失败');\n } finally {\n setLoading(false);\n }\n }, [operations]);\n\n useEffect(() => {\n loadItems();\n }, [loadItems]);\n\n // 检查是否有变更\n useEffect(() => {\n const hasOrderChanged = items.some((item, index) => \n originalOrder[index]?.id !== item.id\n );\n setHasChanges(hasOrderChanged);\n }, [items, originalOrder]);\n\n // 上移项目\n const handleMoveUp = async (itemId: number) => {\n try {\n setError(null);\n \n const currentIndex = items.findIndex(item => item.id === itemId);\n if (currentIndex === -1) {\n setError('项目不存在');\n return;\n }\n if (currentIndex === 0) {\n setError('项目已经在最前面,无法上移');\n return;\n }\n \n await operations.moveItemUp(itemId);\n await loadItems();\n onOrderChanged?.();\n \n } catch (err) {\n console.error('❌ [通用排序] 上移项目错误:', err);\n setError(err instanceof Error ? err.message : '上移失败');\n }\n };\n\n // 下移项目\n const handleMoveDown = async (itemId: number) => {\n try {\n setError(null);\n \n const currentIndex = items.findIndex(item => item.id === itemId);\n if (currentIndex === -1) {\n setError('项目不存在');\n return;\n }\n if (currentIndex === items.length - 1) {\n setError('项目已经在最后面,无法下移');\n return;\n }\n \n await operations.moveItemDown(itemId);\n await loadItems();\n onOrderChanged?.();\n \n } catch (err) {\n console.error('❌ [通用排序] 下移项目错误:', err);\n setError(err instanceof Error ? err.message : '下移失败');\n }\n };\n\n // 拖拽开始\n const handleDragStart = (e: React.DragEvent, index: number) => {\n setDraggedItem(index);\n e.dataTransfer.effectAllowed = 'move';\n };\n\n // 拖拽悬停\n const handleDragOver = (e: React.DragEvent, _index: number) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n };\n\n // 拖拽放置\n const handleDrop = async (e: React.DragEvent, dropIndex: number) => {\n e.preventDefault();\n \n if (draggedItem === null || draggedItem === dropIndex) {\n setDraggedItem(null);\n return;\n }\n\n try {\n setError(null);\n \n const newItems = [...items];\n const draggedItemData = newItems[draggedItem];\n if (!draggedItemData) return;\n \n newItems.splice(draggedItem, 1);\n newItems.splice(dropIndex, 0, draggedItemData);\n \n const itemOrders = newItems.map((item, index) => ({\n id: item.id,\n order: index,\n }));\n \n await operations.updateItemOrder(itemOrders);\n await loadItems();\n onOrderChanged?.();\n \n } catch (err) {\n console.error('❌ [通用排序] 拖拽排序错误:', err);\n setError(err instanceof Error ? err.message : '排序失败');\n } finally {\n setDraggedItem(null);\n }\n };\n\n // 保存新顺序\n const handleSaveOrder = async () => {\n try {\n setSaving(true);\n setError(null);\n \n const itemOrders = items.map((item, index) => ({\n id: item.id,\n order: index,\n }));\n\n await operations.updateItemOrder(itemOrders);\n \n setOriginalOrder([...items]);\n setHasChanges(false);\n onOrderChanged?.();\n } catch (err) {\n console.error('❌ [通用排序] 保存顺序错误:', err);\n setError(err instanceof Error ? err.message : '保存失败');\n await loadItems();\n } finally {\n setSaving(false);\n }\n };\n\n // 重置顺序\n const handleResetOrder = () => {\n setItems([...originalOrder]);\n };\n\n if (loading) {\n return (\n <div className={cn(\"flex flex-col items-center justify-center p-12 text-gray-500\", className)}>\n <div className=\"w-6 h-6 border-2 border-gray-200 border-t-blue-500 rounded-full animate-spin mb-2\" />\n <span>{loadingMessage}</span>\n </div>\n );\n }\n\n return (\n <div className={cn(\"bg-white rounded-xl p-6 shadow-md border-2 border-gray-100\", className)}>\n <div className=\"flex items-center justify-between mb-4 pb-3 border-b border-gray-100 sm:flex-row flex-col sm:items-center items-start gap-4\">\n <h3 className=\"m-0 text-gray-900 text-lg font-semibold\">{title}</h3>\n <div className=\"flex gap-3 w-full sm:w-auto\">\n {hasChanges && (\n <>\n <button\n onClick={handleResetOrder}\n className=\"flex items-center gap-2 bg-amber-500 hover:bg-amber-600 text-white px-4 py-2 rounded-lg font-medium transition-colors\"\n title=\"重置为原始顺序\"\n >\n <RotateCcw size={16} />\n 重置\n </button>\n <button\n onClick={handleSaveOrder}\n disabled={saving}\n className=\"flex items-center gap-2 bg-blue-500 hover:bg-blue-600 disabled:opacity-50 disabled:cursor-not-allowed text-white px-4 py-2 rounded-lg font-medium transition-colors\"\n title=\"保存新顺序\"\n >\n <Save size={16} />\n {saving ? '保存中...' : '保存顺序'}\n </button>\n </>\n )}\n </div>\n </div>\n\n {error && (\n <div className=\"flex items-center gap-2 bg-red-50 text-red-600 p-3 rounded-lg mb-4 border border-red-200\">\n <AlertCircle size={16} />\n <span>{error}</span>\n </div>\n )}\n\n <div className=\"bg-slate-50 border border-slate-200 rounded-lg p-4 mb-6\">\n <p className=\"m-0 mb-2 color-slate-500 text-sm\">{description}</p>\n <ul className=\"m-0 pl-6 color-slate-500 text-sm list-disc\">\n <li className=\"mb-1\">使用拖拽:点击并拖动 <GripVertical size={14} className=\"inline-block align-middle text-gray-500\" /> 图标</li>\n <li className=\"mb-1\">使用按钮:点击 <ChevronUp size={14} className=\"inline-block align-middle text-gray-500\" /> 或 <ChevronDown size={14} className=\"inline-block align-middle text-gray-500\" /> 按钮</li>\n <li>完成调整后,点击\"保存顺序\"按钮保存更改</li>\n </ul>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n {items.map((item, index) => (\n <div\n key={item.id}\n className={cn(\n \"flex items-center gap-3 p-4 bg-gray-50 border-2 border-gray-200 rounded-lg transition-all hover:border-gray-300 hover:shadow-sm\",\n draggedItem === index && \"opacity-50 rotate-2 border-blue-500\"\n )}\n draggable\n onDragStart={(e) => handleDragStart(e, index)}\n onDragOver={(e) => handleDragOver(e, index)}\n onDrop={(e) => handleDrop(e, index)}\n >\n <div className=\"flex items-center cursor-grab active:cursor-grabbing text-gray-400 p-1 rounded hover:text-gray-500 hover:bg-gray-100 transition-colors\">\n <GripVertical size={20} />\n </div>\n \n <div className=\"flex-1 min-w-0\">\n {renderItem(item, index, index === 0, index === items.length - 1)}\n </div>\n\n <div className=\"flex items-center mx-3\">\n <span className=\"flex items-center justify-center w-8 h-8 bg-blue-500 text-white text-sm font-semibold rounded-full sm:w-8 sm:h-8 w-7 h-7 sm:text-sm text-xs\">\n #{index + 1}\n </span>\n </div>\n\n <div className=\"flex flex-col gap-1 sm:flex-col flex-row\">\n <button\n onClick={() => handleMoveUp(item.id)}\n disabled={index === 0}\n className=\"flex items-center justify-center w-8 h-8 p-0 border border-gray-300 bg-white text-gray-500 rounded cursor-pointer transition-all hover:bg-gray-100 hover:border-gray-400 hover:text-gray-700 disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-gray-50 sm:w-8 sm:h-8 w-7 h-7\"\n title=\"上移\"\n >\n <ChevronUp size={18} />\n </button>\n <button\n onClick={() => handleMoveDown(item.id)}\n disabled={index === items.length - 1}\n className=\"flex items-center justify-center w-8 h-8 p-0 border border-gray-300 bg-white text-gray-500 rounded cursor-pointer transition-all hover:bg-gray-100 hover:border-gray-400 hover:text-gray-700 disabled:opacity-40 disabled:cursor-not-allowed disabled:bg-gray-50 sm:w-8 sm:h-8 w-7 h-7\"\n title=\"下移\"\n >\n <ChevronDown size={18} />\n </button>\n </div>\n </div>\n ))}\n </div>\n\n {items.length === 0 && (\n <div className=\"text-center p-12 text-gray-400 italic\">\n <p className=\"m-0\">{emptyMessage}</p>\n </div>\n )}\n </div>\n );\n}\n\n","'use client';\n\nimport React from 'react';\nimport { useRouter } from 'next/navigation';\nimport { cn } from '../utils';\n\nexport interface BackButtonProps {\n href?: string;\n className?: string;\n}\n\nexport const BackButton: React.FC<BackButtonProps> = ({ href, className = '' }) => {\n const router = useRouter();\n\n const handleClick = () => {\n if (href) {\n router.push(href);\n } else {\n router.back();\n }\n };\n\n return (\n <button\n onClick={handleClick}\n className={cn(\n \"inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 transition-colors\",\n className\n )}\n >\n <svg\n className=\"w-5 h-5 mr-2\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 19l-7-7m0 0l7-7m-7 7h18\"\n />\n </svg>\n 返回\n </button>\n );\n};\n\nexport default BackButton;\n\n","'use client';\n\nimport React from 'react';\nimport { cn } from '../utils';\n\nexport interface FilterOption<T> {\n value: T;\n label: string;\n icon: string;\n activeColor: {\n bg: string;\n shadow: string;\n };\n count?: number;\n showCount?: boolean;\n}\n\nexport interface FilterButtonGroupProps<T> {\n label: string;\n value: T;\n options: FilterOption<T>[];\n onChange: (value: T) => void;\n className?: string;\n}\n\n// 辅助函数:将 Tailwind 背景色类名转换为实际颜色值\nfunction getColorValue(bgClass: string): string {\n const colorMap: Record<string, string> = {\n 'bg-blue-500': '#3b82f6',\n 'bg-green-500': '#10b981',\n 'bg-red-500': '#ef4444',\n 'bg-purple-500': '#8b5cf6',\n 'bg-slate-500': '#64748b',\n 'bg-emerald-500': '#10b981',\n 'bg-orange-500': '#f97316',\n };\n return colorMap[bgClass] || '#3b82f6'; // 默认蓝色\n}\n\nexport function FilterButtonGroup<T extends string>({ \n label, \n value, \n options, \n onChange,\n className\n}: FilterButtonGroupProps<T>) {\n return (\n <div className={cn(\"space-y-4\", className)}>\n <h3 className=\"text-lg font-semibold text-gray-800\">\n {label}\n </h3>\n\n <div className=\"flex gap-3\">\n {options.map((option) => {\n const isActive = value === option.value;\n \n return (\n <button\n key={option.value}\n onClick={() => onChange(option.value)}\n style={isActive ? { backgroundColor: getColorValue(option.activeColor.bg) } : undefined}\n className={cn(\n \"flex-1 h-12 rounded-lg font-medium text-sm transition-all duration-200 ease-out focus:outline-none focus:ring-2 focus:ring-opacity-50 border\",\n isActive\n ? \"text-white border-transparent shadow-md focus:ring-white\"\n : \"bg-white text-gray-700 border-gray-200 shadow-sm hover:bg-gray-50 hover:border-gray-300 hover:shadow focus:ring-blue-300\"\n )}\n >\n <div className=\"flex items-center justify-center space-x-2\">\n <span className=\"text-lg\">{option.icon}</span>\n <span>{option.label}</span>\n {option.showCount && option.count !== undefined && (\n <span className={cn(\n \"text-xs font-semibold px-2 py-0.5 rounded-full min-w-[1.25rem] text-center\",\n isActive ? \"bg-white/20 text-white\" : \"bg-gray-100 text-gray-600\"\n )}>\n {option.count}\n </span>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\n","'use client';\n\nimport React from 'react';\nimport { cn } from '../utils';\n\nexport interface SearchResultHintProps {\n searchQuery: string;\n resultCount: number;\n className?: string;\n}\n\nexport function SearchResultHint({ searchQuery, resultCount, className }: SearchResultHintProps) {\n if (!searchQuery) return null;\n\n return (\n <div className={cn(\"mb-6 p-4 bg-blue-50 border border-blue-200 rounded-lg\", className)}>\n <p className=\"text-sm text-blue-700\">\n 搜索 \"<span className=\"font-medium\">{searchQuery}</span>\" \n 找到 {resultCount} 个结果\n </p>\n </div>\n );\n}\n\nexport default SearchResultHint;\n\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from './Dialog';\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from './AlertDialog';\nimport { cn } from '@/utils';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n width?: number | string;\n height?: number | string;\n className?: string;\n maskClosable?: boolean;\n children: React.ReactNode;\n zIndex?: number;\n overlayClassName?: string;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n width,\n height,\n className,\n maskClosable = true,\n children,\n zIndex = 50,\n overlayClassName,\n}) => {\n const contentZIndex = Math.max(zIndex, 10000);\n\n return (\n <Dialog open={isOpen} onOpenChange={(open) => {\n if (!open) {\n if (maskClosable) {\n onClose();\n } else {\n // If maskClosable is false, we don't allow closing via backdrop/ESC\n }\n }\n }}>\n <DialogContent \n className={cn(\"sm:max-w-[425px]\", className)}\n overlayClassName={overlayClassName}\n onPointerDownOutside={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n onEscapeKeyDown={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n style={{\n zIndex: contentZIndex,\n ...(width ? { maxWidth: typeof width === 'number' ? `${width}px` : width } : undefined),\n ...(height ? { height: typeof height === 'number' ? `${height}px` : height } : undefined),\n }}\n >\n {title ? (\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n </DialogHeader>\n ) : (\n // 无障碍性:始终需要 DialogTitle,使用 sr-only 对视觉隐藏但对屏幕阅读器可见\n <DialogTitle className=\"sr-only\">弹窗</DialogTitle>\n )}\n <div className=\"py-4\">\n {children}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport interface ConfirmModalProps {\n isOpen: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title?: string;\n message: string;\n confirmText?: string;\n cancelText?: string;\n isLoading?: boolean;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n title = \"确认操作\",\n message,\n confirmText = \"确认\",\n cancelText = \"取消\",\n isLoading = false,\n}) => {\n return (\n <AlertDialog open={isOpen} onOpenChange={(open) => !open && onClose()}>\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n <AlertDialogDescription>{message}</AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={isLoading}>{cancelText}</AlertDialogCancel>\n <AlertDialogAction \n onClick={(e) => {\n e.preventDefault();\n onConfirm();\n }}\n disabled={isLoading}\n className=\"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n >\n {isLoading ? \"处理中...\" : confirmText}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n};\n","import React from 'react';\nimport { cn } from '../utils';\n\nexport interface ImageMappingItem {\n id: string;\n label: string;\n}\n\nexport type ImageMappingValue = Record<string, string>;\n\nexport interface ImageMappingPanelProps {\n title: string;\n items: ImageMappingItem[];\n value: ImageMappingValue;\n onChange: (next: ImageMappingValue) => void;\n className?: string;\n uploadLabel?: string;\n clearLabel?: string;\n}\n\nexport function ImageMappingPanel({\n title,\n items,\n value,\n onChange,\n className,\n uploadLabel = '上传图片',\n clearLabel = '清除',\n}: ImageMappingPanelProps) {\n const handleFileChange = (id: string, file?: File) => {\n if (!file) {\n return;\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n const base64 = typeof reader.result === 'string' ? reader.result : '';\n if (!base64) {\n return;\n }\n onChange({\n ...value,\n [id]: base64,\n });\n };\n reader.readAsDataURL(file);\n };\n\n const handleRemove = (id: string) => {\n const next = { ...value };\n delete next[id];\n onChange(next);\n };\n\n return (\n <details className={cn('rounded-lg border border-slate-200 bg-white/80 p-3', className)}>\n <summary className=\"cursor-pointer text-sm font-semibold text-slate-700\">{title}</summary>\n <div className=\"mt-3 grid grid-cols-1 gap-2 sm:grid-cols-2\">\n {items.map((item) => {\n const image = value[item.id];\n return (\n <div\n key={item.id}\n className=\"flex items-center gap-2 rounded-md border border-slate-200 bg-white p-2\"\n >\n <div className=\"w-16 text-xs font-semibold text-slate-600\">{item.label}</div>\n <label className=\"flex-1 cursor-pointer rounded-md bg-cyan-600 px-2 py-1 text-center text-xs font-medium text-white\">\n {uploadLabel}\n <input\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={(event) => {\n handleFileChange(item.id, event.target.files?.[0]);\n event.currentTarget.value = '';\n }}\n />\n </label>\n {image ? (\n <>\n <img\n src={image}\n alt={item.label}\n className=\"h-8 w-8 rounded-full border border-slate-200 object-cover\"\n />\n <button\n type=\"button\"\n className=\"rounded-md border border-red-200 px-2 py-1 text-xs text-red-600\"\n onClick={() => handleRemove(item.id)}\n >\n {clearLabel}\n </button>\n </>\n ) : null}\n </div>\n );\n })}\n </div>\n </details>\n );\n}\n\n","/**\n * 通用存储 Hook\n * 支持多平台:Web、React Native、小程序\n *\n * 优点:\n * 1. 异步读取,不阻塞渲染\n * 2. 统一的错误处理\n * 3. 类型安全\n * 4. 跨平台支持\n * 5. 自动同步(支持的平台)\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { StorageAdapter } from '../types';\n\nexport function useStorage<T>(\n storage: StorageAdapter,\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n const [value, setValue] = useState<T>(defaultValue);\n const [loading, setLoading] = useState(true);\n\n // 初始化时从存储读取\n useEffect(() => {\n const loadValue = async () => {\n try {\n const stored = await storage.getItem(key);\n if (stored !== null) {\n setValue(JSON.parse(stored));\n }\n } catch (error) {\n console.error('Error reading storage key \"' + (key) + '\":', error);\n } finally {\n setLoading(false);\n }\n };\n\n void loadValue();\n }, [storage, key]);\n\n // 更新值并同步到存储\n const updateValue = useCallback(\n async (newValue: T) => {\n try {\n setValue(newValue);\n await storage.setItem(key, JSON.stringify(newValue));\n\n // 如果是 Web 适配器,触发自定义事件\n if ('dispatchChange' in storage && typeof storage.dispatchChange === 'function') {\n (storage as any).dispatchChange(key, JSON.stringify(newValue));\n }\n } catch (error) {\n console.error('Error setting storage key \"' + (key) + '\":', error);\n }\n },\n [storage, key]\n );\n\n // 删除值\n const removeValue = useCallback(async () => {\n try {\n setValue(defaultValue);\n await storage.removeItem(key);\n\n // 如果是 Web 适配器,触发自定义事件\n if ('dispatchChange' in storage && typeof storage.dispatchChange === 'function') {\n (storage as any).dispatchChange(key, null);\n }\n } catch (error) {\n console.error('Error removing storage key \"' + (key) + '\":', error);\n }\n }, [storage, key, defaultValue]);\n\n // 监听存储变化\n useEffect(() => {\n if (!storage.addChangeListener) {\n return;\n }\n\n const cleanup = storage.addChangeListener((changedKey: string, newValue: string | null) => {\n if (changedKey === key) {\n try {\n if (newValue === null) {\n setValue(defaultValue);\n } else {\n setValue(JSON.parse(newValue));\n }\n } catch (error) {\n console.error('Error parsing storage change event:', error);\n }\n }\n });\n\n return cleanup;\n }, [storage, key, defaultValue]);\n\n return [value, updateValue, removeValue, loading];\n}\n\n","/**\n * Web 平台存储适配器 (localStorage)\n */\n\nimport type { StorageAdapter } from '../types';\n\n/**\n * 检查是否在浏览器环境中\n */\nconst isBrowser = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport class WebStorageAdapter implements StorageAdapter {\n async getItem(key: string): Promise<string | null> {\n // SSR 环境下返回 null\n if (!isBrowser) {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.error('[WebStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.setItem(key, value);\n } catch (error) {\n console.error('[WebStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.error('[WebStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n try {\n localStorage.clear();\n } catch (error) {\n console.error('[WebStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // SSR 环境下返回空函数\n if (!isBrowser) {\n return () => {};\n }\n\n // 监听 storage 事件(跨标签页)\n const handleStorageEvent = (e: StorageEvent) => {\n if (e.key) {\n callback(e.key, e.newValue);\n }\n };\n\n // 监听自定义事件(同标签页)\n const handleCustomEvent = (e: Event) => {\n const customEvent = e as CustomEvent;\n callback(customEvent.detail.key, customEvent.detail.value);\n };\n\n window.addEventListener('storage', handleStorageEvent);\n window.addEventListener('local-storage-change', handleCustomEvent);\n\n // 返回清理函数\n return () => {\n window.removeEventListener('storage', handleStorageEvent);\n window.removeEventListener('local-storage-change', handleCustomEvent);\n };\n }\n\n /**\n * 触发自定义事件,通知同标签页的其他组件\n */\n dispatchChange(key: string, value: string | null): void {\n // SSR 环境下静默忽略\n if (!isBrowser) {\n return;\n }\n\n window.dispatchEvent(\n new CustomEvent('local-storage-change', {\n detail: { key, value },\n })\n );\n }\n}\n\n","/**\n * Web 平台 localStorage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { WebStorageAdapter } from '../adapters/web-adapter';\n\n// 创建单例适配器\nconst webStorage = new WebStorageAdapter();\n\n/**\n * Web 平台的 localStorage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useLocalStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(webStorage, key, defaultValue);\n}\n\n","import React from 'react';\nimport { useLocalStorage } from '../storage/hooks/useLocalStorage';\nimport {\n ImageMappingPanel,\n type ImageMappingItem,\n type ImageMappingPanelProps,\n type ImageMappingValue,\n} from './ImageMappingPanel';\n\nexport interface LocalImageMappingPanelProps\n extends Omit<ImageMappingPanelProps, 'value' | 'onChange'> {\n storageKey: string;\n defaultValue?: ImageMappingValue;\n onValueChange?: (next: ImageMappingValue) => void;\n}\n\nexport function LocalImageMappingPanel({\n storageKey,\n defaultValue = {},\n onValueChange,\n ...panelProps\n}: LocalImageMappingPanelProps) {\n const [value, setValue] = useLocalStorage<ImageMappingValue>(storageKey, defaultValue);\n\n return (\n <ImageMappingPanel\n {...panelProps}\n value={value}\n onChange={(next) => {\n setValue(next);\n onValueChange?.(next);\n }}\n />\n );\n}\n\nexport type { ImageMappingItem };\n\n","export * as bubbleShooter from './bubbleShooter';\n","export * from './types';\nexport * from './logic';\nexport * as webUI from './ui/web';\n","import type {\n BubbleShooterConfig,\n BubbleShooterResolution,\n BubbleShooterSlot,\n} from '../types';\n\nconst slotKey = (row: number, col: number): string => `${row}:${col}`;\n\nconst cloneGrid = (grid: (string | null)[][]): (string | null)[][] => grid.map((row) => [...row]);\n\nexport const DEFAULT_BUBBLE_SHOOTER_CONFIG: BubbleShooterConfig = {\n rows: 12,\n cols: 8,\n initialRows: 5,\n bubbleRadius: 16,\n topOffset: 18,\n palette: ['#fb7185', '#60a5fa', '#34d399', '#fbbf24', '#a78bfa'],\n launchSpeed: 440,\n minMatchCount: 3,\n};\n\nexport const getBubbleDiameter = (config: BubbleShooterConfig): number => config.bubbleRadius * 2;\n\nexport const getRowStep = (config: BubbleShooterConfig): number => Math.round(config.bubbleRadius * 1.73);\n\nexport const getBoardWidth = (config: BubbleShooterConfig): number => {\n return getBubbleDiameter(config) * config.cols + config.bubbleRadius;\n};\n\nexport const getBoardHeight = (config: BubbleShooterConfig): number => {\n return config.topOffset + getRowStep(config) * (config.rows + 1) + config.bubbleRadius;\n};\n\nexport const createEmptyGrid = (config: BubbleShooterConfig): (string | null)[][] => {\n return Array.from({ length: config.rows }, () => Array.from({ length: config.cols }, () => null));\n};\n\nexport const createInitialGrid = (config: BubbleShooterConfig): (string | null)[][] => {\n const grid = createEmptyGrid(config);\n for (let row = 0; row < config.initialRows; row += 1) {\n for (let col = 0; col < config.cols; col += 1) {\n const color = config.palette[Math.floor(Math.random() * config.palette.length)] || config.palette[0] || '#60a5fa';\n const targetRow = grid[row];\n if (targetRow) {\n targetRow[col] = color;\n }\n }\n }\n return grid;\n};\n\nexport const pickRandomColor = (palette: string[]): string => {\n return palette[Math.floor(Math.random() * palette.length)] || '#60a5fa';\n};\n\nexport const getBubblePosition = (\n row: number,\n col: number,\n config: BubbleShooterConfig\n): { x: number; y: number } => {\n const diameter = getBubbleDiameter(config);\n const rowStep = getRowStep(config);\n const x = config.bubbleRadius + col * diameter + (row % 2 === 1 ? config.bubbleRadius : 0);\n const y = config.topOffset + config.bubbleRadius + row * rowStep;\n return { x, y };\n};\n\nexport const isValidSlot = (slot: BubbleShooterSlot, config: BubbleShooterConfig): boolean => {\n return slot.row >= 0 && slot.row < config.rows && slot.col >= 0 && slot.col < config.cols;\n};\n\nexport const getNeighbors = (slot: BubbleShooterSlot, config: BubbleShooterConfig): BubbleShooterSlot[] => {\n const evenDirections = [\n { row: -1, col: -1 },\n { row: -1, col: 0 },\n { row: 0, col: -1 },\n { row: 0, col: 1 },\n { row: 1, col: -1 },\n { row: 1, col: 0 },\n ];\n\n const oddDirections = [\n { row: -1, col: 0 },\n { row: -1, col: 1 },\n { row: 0, col: -1 },\n { row: 0, col: 1 },\n { row: 1, col: 0 },\n { row: 1, col: 1 },\n ];\n\n const directions = slot.row % 2 === 0 ? evenDirections : oddDirections;\n return directions\n .map((direction) => ({ row: slot.row + direction.row, col: slot.col + direction.col }))\n .filter((candidate) => isValidSlot(candidate, config));\n};\n\nexport const getNearestSlot = (\n x: number,\n y: number,\n config: BubbleShooterConfig\n): BubbleShooterSlot => {\n const rowStep = getRowStep(config);\n const diameter = getBubbleDiameter(config);\n const row = Math.max(0, Math.min(config.rows - 1, Math.round((y - config.topOffset - config.bubbleRadius) / rowStep)));\n const rowOffset = row % 2 === 1 ? config.bubbleRadius : 0;\n const col = Math.max(0, Math.min(config.cols - 1, Math.round((x - config.bubbleRadius - rowOffset) / diameter)));\n return { row, col };\n};\n\nconst hasAdjacentBubble = (\n row: number,\n col: number,\n grid: (string | null)[][],\n config: BubbleShooterConfig\n): boolean => {\n if (row === 0) {\n return true;\n }\n return getNeighbors({ row, col }, config).some((neighbor) => {\n const targetRow = grid[neighbor.row];\n return Boolean(targetRow?.[neighbor.col]);\n });\n};\n\nexport const findAttachSlot = (\n x: number,\n y: number,\n grid: (string | null)[][],\n config: BubbleShooterConfig,\n preferred?: BubbleShooterSlot\n): BubbleShooterSlot | null => {\n const candidates: BubbleShooterSlot[] = [];\n if (preferred && isValidSlot(preferred, config)) {\n candidates.push(preferred, ...getNeighbors(preferred, config));\n }\n const nearest = getNearestSlot(x, y, config);\n candidates.push(nearest, ...getNeighbors(nearest, config));\n\n const uniqueCandidates = Array.from(\n new Map(candidates.map((slot) => [slotKey(slot.row, slot.col), slot])).values()\n );\n\n let best: BubbleShooterSlot | null = null;\n let bestDistance = Number.POSITIVE_INFINITY;\n\n uniqueCandidates.forEach((slot) => {\n const targetRow = grid[slot.row];\n if (!targetRow || targetRow[slot.col] || !hasAdjacentBubble(slot.row, slot.col, grid, config)) {\n return;\n }\n const position = getBubblePosition(slot.row, slot.col, config);\n const dx = position.x - x;\n const dy = position.y - y;\n const distance = dx * dx + dy * dy;\n if (distance < bestDistance) {\n bestDistance = distance;\n best = slot;\n }\n });\n\n return best;\n};\n\nexport const findCollisionSlot = (\n x: number,\n y: number,\n grid: (string | null)[][],\n config: BubbleShooterConfig\n): BubbleShooterSlot | null => {\n const threshold = (config.bubbleRadius * 2 - 1) ** 2;\n\n for (let row = 0; row < config.rows; row += 1) {\n for (let col = 0; col < config.cols; col += 1) {\n const targetRow = grid[row];\n if (!targetRow?.[col]) {\n continue;\n }\n const position = getBubblePosition(row, col, config);\n const dx = position.x - x;\n const dy = position.y - y;\n if (dx * dx + dy * dy <= threshold) {\n return { row, col };\n }\n }\n }\n\n return null;\n};\n\nconst collectGroup = (\n start: BubbleShooterSlot,\n grid: (string | null)[][],\n config: BubbleShooterConfig,\n color: string\n): BubbleShooterSlot[] => {\n const queue: BubbleShooterSlot[] = [start];\n const visited = new Set<string>();\n const group: BubbleShooterSlot[] = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n\n const key = slotKey(current.row, current.col);\n if (visited.has(key)) {\n continue;\n }\n visited.add(key);\n\n const currentColor = grid[current.row]?.[current.col];\n if (currentColor !== color) {\n continue;\n }\n\n group.push(current);\n getNeighbors(current, config).forEach((neighbor) => {\n const neighborKey = slotKey(neighbor.row, neighbor.col);\n if (!visited.has(neighborKey)) {\n queue.push(neighbor);\n }\n });\n }\n\n return group;\n};\n\nconst collectTopConnected = (\n grid: (string | null)[][],\n config: BubbleShooterConfig\n): Set<string> => {\n const visited = new Set<string>();\n const queue: BubbleShooterSlot[] = [];\n\n for (let col = 0; col < config.cols; col += 1) {\n if (grid[0]?.[col]) {\n queue.push({ row: 0, col });\n }\n }\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n continue;\n }\n\n const key = slotKey(current.row, current.col);\n if (visited.has(key)) {\n continue;\n }\n\n if (!grid[current.row]?.[current.col]) {\n continue;\n }\n\n visited.add(key);\n getNeighbors(current, config).forEach((neighbor) => {\n const neighborKey = slotKey(neighbor.row, neighbor.col);\n if (!visited.has(neighborKey)) {\n queue.push(neighbor);\n }\n });\n }\n\n return visited;\n};\n\nexport const resolveMatches = (\n grid: (string | null)[][],\n placed: BubbleShooterSlot,\n config: BubbleShooterConfig\n): BubbleShooterResolution => {\n const nextGrid = cloneGrid(grid);\n const placedColor = nextGrid[placed.row]?.[placed.col];\n if (!placedColor) {\n return { grid: nextGrid, removed: 0, matched: 0, dropped: 0 };\n }\n\n const group = collectGroup(placed, nextGrid, config, placedColor);\n let matched = 0;\n if (group.length >= config.minMatchCount) {\n group.forEach((slot) => {\n const targetRow = nextGrid[slot.row];\n if (targetRow?.[slot.col]) {\n targetRow[slot.col] = null;\n matched += 1;\n }\n });\n }\n\n let dropped = 0;\n if (matched > 0) {\n const topConnected = collectTopConnected(nextGrid, config);\n for (let row = 0; row < config.rows; row += 1) {\n for (let col = 0; col < config.cols; col += 1) {\n const targetRow = nextGrid[row];\n if (targetRow?.[col] && !topConnected.has(slotKey(row, col))) {\n targetRow[col] = null;\n dropped += 1;\n }\n }\n }\n }\n\n return {\n grid: nextGrid,\n matched,\n dropped,\n removed: matched + dropped,\n };\n};\n\nexport const hasAnyBubble = (grid: (string | null)[][]): boolean => {\n return grid.some((row) => row.some(Boolean));\n};\n\nexport const hasReachedDangerLine = (\n grid: (string | null)[][],\n config: BubbleShooterConfig,\n dangerRowOffset = 2\n): boolean => {\n const limitRow = Math.max(0, config.rows - dangerRowOffset);\n for (let row = limitRow; row < config.rows; row += 1) {\n const targetRow = grid[row];\n if (targetRow?.some(Boolean)) {\n return true;\n }\n }\n return false;\n};\n","export { default as BubbleShooterBoard } from './components/BubbleShooterBoard';\nexport { default as BubbleShooterGamePage } from './pages/BubbleShooterGamePage';\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { BubbleShooterConfig, BubbleShooterProjectile, BubbleShooterStatus } from '../../../types';\nimport {\n DEFAULT_BUBBLE_SHOOTER_CONFIG,\n createInitialGrid,\n findAttachSlot,\n findCollisionSlot,\n getBoardHeight,\n getBoardWidth,\n getBubblePosition,\n getNearestSlot,\n hasAnyBubble,\n hasReachedDangerLine,\n pickRandomColor,\n resolveMatches,\n} from '../../../logic';\n\nexport interface BubbleShooterBoardProps {\n config?: Partial<BubbleShooterConfig>;\n className?: string;\n}\n\nconst clampAim = (angle: number): number => {\n const minAngle = -Math.PI + 0.15;\n const maxAngle = -0.15;\n return Math.max(minAngle, Math.min(maxAngle, angle));\n};\n\nconst drawCircle = (\n context: CanvasRenderingContext2D,\n x: number,\n y: number,\n radius: number,\n color: string\n): void => {\n context.beginPath();\n context.arc(x, y, radius, 0, Math.PI * 2);\n context.fillStyle = color;\n context.fill();\n context.strokeStyle = 'rgba(15, 23, 42, 0.15)';\n context.lineWidth = 1;\n context.stroke();\n};\n\nconst normalizeConfig = (input?: Partial<BubbleShooterConfig>): BubbleShooterConfig => {\n return {\n ...DEFAULT_BUBBLE_SHOOTER_CONFIG,\n ...input,\n palette: input?.palette?.length ? input.palette : DEFAULT_BUBBLE_SHOOTER_CONFIG.palette,\n };\n};\n\nconst BubbleShooterBoard: React.FC<BubbleShooterBoardProps> = ({ config: inputConfig, className }) => {\n const config = useMemo(() => normalizeConfig(inputConfig), [inputConfig]);\n const boardWidth = useMemo(() => getBoardWidth(config), [config]);\n const boardHeight = useMemo(() => getBoardHeight(config), [config]);\n const shooterX = boardWidth / 2;\n const shooterY = boardHeight - config.bubbleRadius - 12;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rafRef = useRef<number | null>(null);\n const lastTsRef = useRef<number>(0);\n\n const [grid, setGrid] = useState<(string | null)[][]>(() => createInitialGrid(config));\n const [status, setStatus] = useState<BubbleShooterStatus>('ready');\n const [score, setScore] = useState(0);\n const [shots, setShots] = useState(0);\n const [aimAngle, setAimAngle] = useState(-Math.PI / 2);\n const [currentColor, setCurrentColor] = useState(() => pickRandomColor(config.palette));\n const [nextColor, setNextColor] = useState(() => pickRandomColor(config.palette));\n const [projectile, setProjectile] = useState<BubbleShooterProjectile | null>(null);\n\n const gridRef = useRef(grid);\n const currentColorRef = useRef(currentColor);\n const nextColorRef = useRef(nextColor);\n const statusRef = useRef(status);\n\n useEffect(() => {\n gridRef.current = grid;\n }, [grid]);\n\n useEffect(() => {\n currentColorRef.current = currentColor;\n }, [currentColor]);\n\n useEffect(() => {\n nextColorRef.current = nextColor;\n }, [nextColor]);\n\n useEffect(() => {\n statusRef.current = status;\n }, [status]);\n\n const restart = useCallback(() => {\n setGrid(createInitialGrid(config));\n setScore(0);\n setShots(0);\n setStatus('ready');\n setProjectile(null);\n setAimAngle(-Math.PI / 2);\n setCurrentColor(pickRandomColor(config.palette));\n setNextColor(pickRandomColor(config.palette));\n lastTsRef.current = 0;\n }, [config]);\n\n useEffect(() => {\n restart();\n }, [restart]);\n\n const settleProjectile = useCallback(\n (x: number, y: number, preferredSlot?: { row: number; col: number }) => {\n const working = gridRef.current.map((row) => [...row]);\n const attach = findAttachSlot(x, y, working, config, preferredSlot);\n\n if (!attach) {\n setProjectile(null);\n setStatus('lost');\n return;\n }\n\n const rowData = working[attach.row];\n if (!rowData || rowData[attach.col]) {\n setProjectile(null);\n setStatus('lost');\n return;\n }\n\n rowData[attach.col] = currentColorRef.current;\n const resolved = resolveMatches(working, attach, config);\n\n setGrid(resolved.grid);\n setProjectile(null);\n setShots((prev) => prev + 1);\n if (resolved.removed > 0) {\n setScore((prev) => prev + resolved.matched * 10 + resolved.dropped * 15);\n }\n\n const hasBubbleLeft = hasAnyBubble(resolved.grid);\n if (!hasBubbleLeft) {\n setStatus('won');\n } else if (hasReachedDangerLine(resolved.grid, config)) {\n setStatus('lost');\n } else {\n setStatus('ready');\n }\n\n const nextCurrent = nextColorRef.current;\n const nextQueued = pickRandomColor(config.palette);\n setCurrentColor(nextCurrent);\n setNextColor(nextQueued);\n },\n [config]\n );\n\n useEffect(() => {\n if (status !== 'shooting') {\n return;\n }\n\n const step = (timestamp: number) => {\n if (statusRef.current !== 'shooting') {\n lastTsRef.current = 0;\n return;\n }\n\n const previousTs = lastTsRef.current || timestamp;\n const deltaSec = Math.min((timestamp - previousTs) / 1000, 0.05);\n lastTsRef.current = timestamp;\n let shouldContinue = true;\n\n setProjectile((prev) => {\n if (!prev || statusRef.current !== 'shooting') {\n shouldContinue = false;\n return prev;\n }\n\n let nextX = prev.x + prev.vx * deltaSec;\n const nextY = prev.y + prev.vy * deltaSec;\n let nextVx = prev.vx;\n\n if (nextX <= config.bubbleRadius) {\n nextX = config.bubbleRadius;\n nextVx = Math.abs(nextVx);\n } else if (nextX >= boardWidth - config.bubbleRadius) {\n nextX = boardWidth - config.bubbleRadius;\n nextVx = -Math.abs(nextVx);\n }\n\n if (nextY <= config.topOffset + config.bubbleRadius) {\n shouldContinue = false;\n settleProjectile(nextX, config.topOffset + config.bubbleRadius, getNearestSlot(nextX, nextY, config));\n return null;\n }\n\n const collision = findCollisionSlot(nextX, nextY, gridRef.current, config);\n if (collision) {\n shouldContinue = false;\n settleProjectile(nextX, nextY, collision);\n return null;\n }\n\n return {\n ...prev,\n x: nextX,\n y: nextY,\n vx: nextVx,\n };\n });\n\n if (shouldContinue) {\n rafRef.current = window.requestAnimationFrame(step);\n } else {\n rafRef.current = null;\n lastTsRef.current = 0;\n }\n };\n\n rafRef.current = window.requestAnimationFrame(step);\n return () => {\n if (rafRef.current) {\n window.cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n lastTsRef.current = 0;\n };\n }, [boardWidth, config, settleProjectile, status]);\n\n const shoot = useCallback(() => {\n if (status !== 'ready') {\n return;\n }\n\n const vx = Math.cos(aimAngle) * config.launchSpeed;\n const vy = Math.sin(aimAngle) * config.launchSpeed;\n setProjectile({\n x: shooterX,\n y: shooterY - config.bubbleRadius,\n vx,\n vy,\n color: currentColor,\n });\n setStatus('shooting');\n }, [aimAngle, config.bubbleRadius, config.launchSpeed, currentColor, shooterX, shooterY, status]);\n\n const updateAimFromPointer = useCallback(\n (event: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas || status !== 'ready') {\n return;\n }\n const rect = canvas.getBoundingClientRect();\n const x = event.clientX - rect.left;\n const y = event.clientY - rect.top;\n const rawAngle = Math.atan2(y - shooterY, x - shooterX);\n setAimAngle(clampAim(rawAngle));\n },\n [shooterX, shooterY, status]\n );\n\n const handlePointerDown = (event: React.PointerEvent<HTMLCanvasElement>) => {\n event.currentTarget.setPointerCapture(event.pointerId);\n updateAimFromPointer(event);\n };\n\n const handlePointerUp = (event: React.PointerEvent<HTMLCanvasElement>) => {\n updateAimFromPointer(event);\n shoot();\n event.currentTarget.releasePointerCapture(event.pointerId);\n };\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return;\n }\n const context = canvas.getContext('2d');\n if (!context) {\n return;\n }\n\n const gradient = context.createLinearGradient(0, 0, 0, boardHeight);\n gradient.addColorStop(0, '#f8fafc');\n gradient.addColorStop(1, '#e2e8f0');\n context.fillStyle = gradient;\n context.fillRect(0, 0, boardWidth, boardHeight);\n\n context.fillStyle = 'rgba(148, 163, 184, 0.2)';\n context.fillRect(0, shooterY - config.bubbleRadius * 1.3, boardWidth, 2);\n\n for (let row = 0; row < config.rows; row += 1) {\n for (let col = 0; col < config.cols; col += 1) {\n const color = grid[row]?.[col];\n if (!color) {\n continue;\n }\n const position = getBubblePosition(row, col, config);\n drawCircle(context, position.x, position.y, config.bubbleRadius - 0.5, color);\n }\n }\n\n const aimLength = config.bubbleRadius * 9;\n const aimX = shooterX + Math.cos(aimAngle) * aimLength;\n const aimY = shooterY + Math.sin(aimAngle) * aimLength;\n context.strokeStyle = 'rgba(71, 85, 105, 0.75)';\n context.lineWidth = 2;\n context.setLineDash([4, 6]);\n context.beginPath();\n context.moveTo(shooterX, shooterY);\n context.lineTo(aimX, aimY);\n context.stroke();\n context.setLineDash([]);\n\n drawCircle(context, shooterX, shooterY, config.bubbleRadius - 0.5, currentColor);\n\n if (projectile) {\n drawCircle(context, projectile.x, projectile.y, config.bubbleRadius - 0.5, projectile.color);\n }\n\n drawCircle(context, boardWidth - config.bubbleRadius * 1.6, shooterY, config.bubbleRadius * 0.72, nextColor);\n context.fillStyle = '#334155';\n context.font = '12px sans-serif';\n context.textAlign = 'right';\n context.fillText('Next', boardWidth - config.bubbleRadius * 0.5, shooterY - config.bubbleRadius * 1.05);\n\n if (status === 'won' || status === 'lost') {\n context.fillStyle = 'rgba(15, 23, 42, 0.48)';\n context.fillRect(0, 0, boardWidth, boardHeight);\n context.fillStyle = '#ffffff';\n context.font = 'bold 26px sans-serif';\n context.textAlign = 'center';\n context.fillText(status === 'won' ? 'You Win!' : 'Game Over', boardWidth / 2, boardHeight / 2);\n }\n }, [aimAngle, boardHeight, boardWidth, config, currentColor, grid, nextColor, projectile, shooterX, shooterY, status]);\n\n return (\n <div className={className}>\n <div style={{ display: 'flex', gap: 16, marginBottom: 10, flexWrap: 'wrap', color: '#334155' }}>\n <span>状态:{status === 'ready' ? '待发射' : status === 'shooting' ? '发射中' : status === 'won' ? '胜利' : '失败'}</span>\n <span>分数:{score}</span>\n <span>发射次数:{shots}</span>\n </div>\n\n <canvas\n ref={canvasRef}\n width={boardWidth}\n height={boardHeight}\n onPointerMove={updateAimFromPointer}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n style={{\n width: '100%',\n maxWidth: boardWidth,\n borderRadius: 12,\n border: '1px solid #cbd5e1',\n boxShadow: '0 8px 28px rgba(15, 23, 42, 0.12)',\n touchAction: 'none',\n cursor: status === 'ready' ? 'crosshair' : 'default',\n display: 'block',\n }}\n />\n\n <div style={{ marginTop: 10, display: 'flex', gap: 10 }}>\n <button type=\"button\" onClick={restart} style={{ padding: '8px 12px' }}>\n 重新开始\n </button>\n </div>\n </div>\n );\n};\n\nexport default BubbleShooterBoard;\n","import React from 'react';\nimport type { BubbleShooterConfig } from '../../../types';\nimport BubbleShooterBoard from '../components/BubbleShooterBoard';\n\nexport interface BubbleShooterGamePageProps {\n config?: Partial<BubbleShooterConfig>;\n title?: string;\n description?: string;\n}\n\nconst BubbleShooterGamePage: React.FC<BubbleShooterGamePageProps> = ({\n config,\n title = '泡泡龙',\n description = '基础版:瞄准、发射、连消、悬空掉落。',\n}) => {\n return (\n <section>\n <h2>{title}</h2>\n <p style={{ color: '#64748b' }}>{description}</p>\n <BubbleShooterBoard config={config} />\n </section>\n );\n};\n\nexport default BubbleShooterGamePage;\n","/**\n * @package sa2kit/common\n *\n * SA2Kit 2.0 通用层入口:供 Web / Taro / Electron / Hono 等复用。\n */\nexport * as logger from './logger';\nexport * as utils from './utils';\nexport * as storage from './storage';\nexport * as request from './request';\nexport * as file from './file';\nexport * as dataExport from './export';\nexport * as auth from './auth';\nexport * as platform from './platform';\nexport * as i18n from '../i18n';\nexport * as analytics from '../analytics';\nexport * as config from '../config';\nexport * as api from '../api';\n\n/** 文件 SSOT 快捷导出 */\nexport * from './file';\n","/**\n * @package sa2kit/common/logger\n * 通用日志模块(2.0 common)\n */\nexport * from '../../logger';\n","/**\n * @package sa2kit/common/utils\n */\nexport * from '../../utils';\n","/**\n * @package sa2kit/common/storage\n */\nexport * from '../../storage';\n","/**\n * React Native 平台存储适配器 (AsyncStorage)\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 动态导入 AsyncStorage(避免在非 RN 环境报错)\nlet AsyncStorage: any = null;\n\ntry {\n AsyncStorage = require('@react-native-async-storage/async-storage').default;\n} catch (e) {\n // AsyncStorage 不可用(非 React Native 环境)\n // 这是正常的,不需要警告\n}\n\nexport class ReactNativeStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n if (!AsyncStorage) return null;\n\n try {\n return await AsyncStorage.getItem(key);\n } catch (error) {\n console.error('[ReactNativeStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.setItem(key, value);\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[ReactNativeStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.removeItem(key);\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[ReactNativeStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.clear();\n } catch (error) {\n console.error('[ReactNativeStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // React Native 没有原生的跨实例存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","/**\n * 小程序平台存储适配器 (wx.storage / Taro.storage)\n * 仅在小程序环境下加载和使用\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 延迟加载 Taro(仅在小程序环境)\nlet Taro: any = null;\nlet taroLoadPromise: Promise<void> | null = null;\nlet isMiniAppEnvironment: boolean | null = null;\n\n/**\n * 检测是否是小程序环境\n */\nfunction checkIsMiniApp(): boolean {\n if (isMiniAppEnvironment !== null) return isMiniAppEnvironment;\n\n // 服务端环境,不是小程序\n if (typeof window === 'undefined') {\n isMiniAppEnvironment = false;\n return false;\n }\n\n // 检测是否有小程序全局对象\n const globalObj = window as any;\n isMiniAppEnvironment = !!(\n globalObj.wx || // 微信小程序\n globalObj.my || // 支付宝小程序\n globalObj.swan || // 百度小程序\n globalObj.tt || // 抖音小程序\n globalObj.qq || // QQ 小程序\n globalObj.Taro // Taro 环境\n );\n\n return isMiniAppEnvironment;\n}\n\n/**\n * 加载 Taro(仅在小程序环境)\n */\nasync function loadTaro() {\n // 如果不是小程序环境,直接返回\n if (!checkIsMiniApp()) {\n return;\n }\n\n if (Taro) return;\n if (taroLoadPromise) return taroLoadPromise;\n\n taroLoadPromise = (async () => {\n try {\n // 使用动态导入,仅在小程序环境加载\n // 使用 Function 构造器来避免 TypeScript 在编译时解析模块\n const importTaro = new Function('return import(\"@tarojs/taro\")');\n const taroModule = await importTaro();\n Taro = taroModule.default || taroModule;\n } catch (e) {\n // Taro 不可用(非小程序环境或未安装)\n console.warn('[MiniAppStorage] Taro is not available. This is expected in non-MiniApp environments.');\n }\n })();\n\n return taroLoadPromise;\n}\n\nexport class MiniAppStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n // 非小程序环境,直接返回 null\n if (!checkIsMiniApp()) {\n return null;\n }\n\n await loadTaro();\n if (!Taro) return null;\n\n try {\n const result = await Taro.getStorage({ key });\n return result.data;\n } catch (error: any) {\n // 如果 key 不存在,Taro 会抛出错误\n if (error.errMsg?.includes('data not found')) {\n return null;\n }\n console.error('[MiniAppStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.setStorage({ key, data: value });\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[MiniAppStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.removeStorage({ key });\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[MiniAppStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n // 非小程序环境,抛出错误\n if (!checkIsMiniApp()) {\n throw new Error('[MiniAppStorage] This adapter can only be used in MiniApp environment');\n }\n\n await loadTaro();\n if (!Taro) {\n throw new Error('[MiniAppStorage] Taro is not available');\n }\n\n try {\n await Taro.clearStorage();\n } catch (error) {\n console.error('[MiniAppStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // 小程序没有原生的存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","/**\n * Electron 桌面端存储适配器\n *\n * Electron 渲染进程可以使用 localStorage(和 Web 相同)\n * 但我们提供专门的适配器以支持未来可能的主进程存储需求\n */\n\nimport type { StorageAdapter } from '../types';\n\n/**\n * 检查 localStorage 是否可用(Electron 渲染进程)\n */\nconst hasLocalStorage = typeof window !== 'undefined' && typeof window.localStorage !== 'undefined';\n\nexport class ElectronStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n // 非 Electron 或无 localStorage 环境返回 null\n if (!hasLocalStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(key);\n } catch (error) {\n console.error('[ElectronStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n // 非 Electron 或无 localStorage 环境静默忽略\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.setItem(key, value);\n this.notifyListeners(key, value);\n\n // 触发自定义事件(用于跨窗口同步)\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(key);\n this.notifyListeners(key, null);\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key, value: null },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!hasLocalStorage) {\n return;\n }\n\n try {\n localStorage.clear();\n\n // 通知所有监听器\n this.listeners.forEach((listeners, key) => {\n listeners.forEach((listener) => {\n listener(key, null);\n });\n });\n\n // 触发自定义事件\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('electron-storage-change', {\n detail: { key: '*', value: null },\n })\n );\n }\n } catch (error) {\n console.error('[ElectronStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n /**\n * 添加存储变化监听器\n * 支持跨 Electron 窗口同步\n */\n addChangeListener(listener: (key: string, newValue: string | null) => void): () => void {\n // 添加到监听器集合\n const allListeners = this.listeners.get('*') || new Set();\n allListeners.add(listener);\n this.listeners.set('*', allListeners);\n\n // Storage 事件监听(同源窗口)\n const storageHandler = (e: StorageEvent) => {\n if (e.key) {\n listener(e.key, e.newValue);\n }\n };\n\n // 自定义事件监听(Electron 窗口间通信)\n const customHandler = (e: Event) => {\n const customEvent = e as CustomEvent;\n const { key, value } = customEvent.detail;\n if (key === '*') {\n // clear 操作\n this.listeners.forEach((_, k) => listener(k, null));\n } else {\n listener(key, value);\n }\n };\n\n if (typeof window !== 'undefined') {\n window.addEventListener('storage', storageHandler);\n window.addEventListener('electron-storage-change', customHandler);\n }\n\n // 返回清理函数\n return () => {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n\n if (typeof window !== 'undefined') {\n window.removeEventListener('storage', storageHandler);\n window.removeEventListener('electron-storage-change', customHandler);\n }\n };\n }\n\n removeChangeListener(listener: (key: string, newValue: string | null) => void): void {\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.delete(listener);\n if (allListeners.size === 0) {\n this.listeners.delete('*');\n }\n }\n }\n\n /**\n * 通知监听器\n */\n private notifyListeners(key: string, value: string | null): void {\n // 通知特定 key 的监听器\n const keyListeners = this.listeners.get(key);\n if (keyListeners) {\n keyListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n\n // 通知通配符监听器\n const allListeners = this.listeners.get('*');\n if (allListeners) {\n allListeners.forEach((listener) => {\n listener(key, value);\n });\n }\n }\n}\n\n","'use client';\n\n/**\n * React Native AsyncStorage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ReactNativeStorageAdapter } from '../adapters/react-native-adapter';\n\n// 创建单例适配器\nconst asyncStorage = new ReactNativeStorageAdapter();\n\n/**\n * React Native 的 AsyncStorage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useAsyncStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(asyncStorage, key, defaultValue);\n}\n\n","'use client';\n\n/**\n * 小程序 Taro Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { MiniAppStorageAdapter } from '../adapters/miniapp-adapter';\n\n// 创建单例适配器\nconst taroStorage = new MiniAppStorageAdapter();\n\n/**\n * 小程序的 Taro Storage Hook\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n */\nexport function useTaroStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(taroStorage, key, defaultValue);\n}\n\n","'use client';\n\n/**\n * Electron 桌面端 Storage Hook\n * 基于通用 useStorage 的便捷封装\n */\n\nimport { useStorage } from './useStorage';\nimport { ElectronStorageAdapter } from '../adapters/electron-adapter';\n\n// 创建单例适配器\nconst electronStorage = new ElectronStorageAdapter();\n\n/**\n * Electron 桌面端的 Storage Hook\n *\n * 在 Electron 渲染进程中使用 localStorage\n * 支持跨窗口同步\n *\n * @param key - 存储键名\n * @param defaultValue - 默认值\n * @returns [value, setValue, removeValue, isLoading]\n *\n * @example\n * ```tsx\n * const [token, setToken, removeToken] = useElectronStorage('auth-token', '')\n * ```\n */\nexport function useElectronStorage<T>(\n key: string,\n defaultValue: T\n): [T, (value: T) => void, () => void, boolean] {\n return useStorage(electronStorage, key, defaultValue);\n}\n\n","/**\n * @package sa2kit/common/request\n */\nexport * from '../../request';\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * Web 平台请求适配器\n * 基于标准 fetch API\n *\n * 适用平台:\n * - Web (Next.js)\n * - Desktop (Electron)\n * - Mobile (React Native)\n */\nexport class WebRequestAdapter implements RequestAdapter {\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n // 构建 URL(如果有查询参数)\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n fullUrl += (url.includes('?') ? '&' : '?') + queryString;\n }\n }\n\n // 发送请求\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n credentials: 'include', // 🔐 自动发送和接收 Cookie(支持 httpOnly Cookie 认证)\n });\n\n // 解析响应\n const data = await response.json();\n\n // 如果响应不成功,返回错误格式\n if (!response.ok) {\n return {\n success: false,\n error: data.error || '请求失败: ' + (response.status),\n } as T;\n }\n\n return data;\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * Taro Request 接口定义\n * 兼容 @tarojs/taro request API\n */\ninterface TaroRequestStatic {\n request<T = any>(options: {\n url: string;\n method?: string;\n header?: Record<string, string>;\n data?: any;\n }): Promise<{\n statusCode: number;\n data: T;\n }>;\n}\n\n/**\n * Miniapp 平台请求适配器\n * 基于 Taro.request API\n *\n * 使用方式:\n * ```typescript\n * import Taro from '@tarojs/taro'\n * const adapter = new MiniappRequestAdapter(Taro)\n * ```\n *\n * 适用平台:\n * - WeChat Miniapp\n * - Other Taro-based miniapps\n */\nexport class MiniappRequestAdapter implements RequestAdapter {\n private taro: TaroRequestStatic;\n\n constructor(taro: TaroRequestStatic) {\n if (!taro) {\n throw new Error('MiniappRequestAdapter requires Taro instance');\n }\n this.taro = taro;\n }\n\n async request<T = any>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n try {\n const response = await this.taro.request({\n url,\n method: method as any,\n header: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n data: method === 'GET' ? params : body,\n });\n\n const data = response.data as any;\n\n // 统一返回格式\n if (response.statusCode >= 200 && response.statusCode < 300) {\n return data;\n } else {\n return {\n success: false,\n error: data.error || '请求失败: ' + (response.statusCode),\n } as T;\n }\n } catch (error) {\n console.error('[MiniappRequestAdapter] request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络请求失败',\n } as T;\n }\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * React Native 请求适配器(fetch,不携带 Cookie)\n * 与 WebRequestAdapter 的区别:RN 跨域场景下 credentials:include 无效且易误导\n */\nexport class ReactNativeRequestAdapter implements RequestAdapter {\n async request<T = unknown>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const qs = searchParams.toString();\n if (qs) {\n fullUrl += url.includes('?') ? `&${qs}` : `?${qs}`;\n }\n }\n\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as T & { error?: string };\n if (!response.ok) {\n return {\n success: false,\n error:\n (data as { error?: string }).error ??\n `请求失败 (${response.status})`,\n } as T;\n }\n return data;\n }\n}\n","/**\n * @package sa2kit/common/file\n *\n * 2.0 文件能力 SSOT:优先使用 ossFile;universalFile 客户端保留兼容导出。\n */\nexport * from '../../ossFile';\nexport {\n UniversalFileClient,\n universalFileClient,\n createFileClient,\n} from '../../universalFile/client';\nexport type * from '../../universalFile/types';\n","/**\n * 通用文件服务常量定义\n */\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_FILE_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_FILE_NAME = '@qhr123/sa2kit/universalFile';\n\n// ============= 文件大小限制 =============\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大图片大小(字节) - 10MB */\nexport const DEFAULT_MAX_IMAGE_SIZE = 10 * 1024 * 1024;\n\n/** 默认最大视频大小(字节) - 500MB */\nexport const DEFAULT_MAX_VIDEO_SIZE = 500 * 1024 * 1024;\n\n/** 默认最大音频大小(字节) - 50MB */\nexport const DEFAULT_MAX_AUDIO_SIZE = 50 * 1024 * 1024;\n\n/** 默认最大文档大小(字节) - 20MB */\nexport const DEFAULT_MAX_DOCUMENT_SIZE = 20 * 1024 * 1024;\n\n// ============= MIME类型 =============\n\n/** 图片MIME类型 */\nexport const IMAGE_MIME_TYPES = [\n 'image/jpeg',\n 'image/jpg',\n 'image/png',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n];\n\n/** 视频MIME类型 */\nexport const VIDEO_MIME_TYPES = [\n 'video/mp4',\n 'video/mpeg',\n 'video/quicktime',\n 'video/x-msvideo',\n 'video/webm',\n];\n\n/** 音频MIME类型 */\nexport const AUDIO_MIME_TYPES = ['audio/mpeg', 'audio/mp3', 'audio/wav', 'audio/ogg', 'audio/aac'];\n\n/** 文档MIME类型 */\nexport const DOCUMENT_MIME_TYPES = [\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'text/plain',\n];\n\n/** 所有支持的MIME类型 */\nexport const ALL_SUPPORTED_MIME_TYPES = [\n ...IMAGE_MIME_TYPES,\n ...VIDEO_MIME_TYPES,\n ...AUDIO_MIME_TYPES,\n ...DOCUMENT_MIME_TYPES,\n];\n\n// ============= 文件扩展名 =============\n\n/** 图片扩展名 */\nexport const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.svg'];\n\n/** 视频扩展名 */\nexport const VIDEO_EXTENSIONS = ['.mp4', '.mpeg', '.mov', '.avi', '.webm'];\n\n/** 音频扩展名 */\nexport const AUDIO_EXTENSIONS = ['.mp3', '.wav', '.ogg', '.aac'];\n\n/** 文档扩展名 */\nexport const DOCUMENT_EXTENSIONS = [\n '.pdf',\n '.doc',\n '.docx',\n '.xls',\n '.xlsx',\n '.ppt',\n '.pptx',\n '.txt',\n];\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-file';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 上传文件 */\n UPLOAD: (API_BASE_PATH) + '/upload',\n /** 获取文件URL */\n GET_URL: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId) + '/url',\n /** 获取文件元数据 */\n GET_METADATA: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId),\n /** 删除文件 */\n DELETE: (fileId: string) => (API_BASE_PATH) + '/files/' + (fileId),\n /** 查询文件列表 */\n QUERY: (API_BASE_PATH) + '/files',\n /** 批量删除 */\n BATCH_DELETE: (API_BASE_PATH) + '/files/batch-delete',\n /** 获取上传进度 */\n GET_PROGRESS: (fileId: string) => (API_BASE_PATH) + '/upload/' + (fileId) + '/progress',\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 文件上传错误 */\n FILE_UPLOAD_ERROR: 'FILE_UPLOAD_ERROR',\n /** 文件大小超限 */\n FILE_SIZE_EXCEEDED: 'FILE_SIZE_EXCEEDED',\n /** 文件类型不支持 */\n FILE_TYPE_NOT_SUPPORTED: 'FILE_TYPE_NOT_SUPPORTED',\n /** 文件不存在 */\n FILE_NOT_FOUND: 'FILE_NOT_FOUND',\n /** 文件处理错误 */\n FILE_PROCESSING_ERROR: 'FILE_PROCESSING_ERROR',\n /** 存储提供者错误 */\n STORAGE_PROVIDER_ERROR: 'STORAGE_PROVIDER_ERROR',\n /** CDN提供者错误 */\n CDN_PROVIDER_ERROR: 'CDN_PROVIDER_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 权限不足 */\n FORBIDDEN: 'FORBIDDEN',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n\n// ============= 默认配置 =============\n\n/** 默认分页大小 */\nexport const DEFAULT_PAGE_SIZE = 20;\n\n/** 默认请求超时时间(毫秒) - 30秒 */\nexport const DEFAULT_REQUEST_TIMEOUT = 30000;\n\n/** 默认上传超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_UPLOAD_TIMEOUT = 300000;\n\n/** 默认分片上传大小(字节) - 5MB */\nexport const DEFAULT_CHUNK_SIZE = 5 * 1024 * 1024;\n","/**\n * 通用文件服务工具函数\n */\n\nimport {\n IMAGE_MIME_TYPES,\n VIDEO_MIME_TYPES,\n AUDIO_MIME_TYPES,\n DOCUMENT_MIME_TYPES,\n} from './constants';\n\n// ============= 文件大小处理 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return ((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + (units[i]);\n}\n\n/**\n * 解析文件大小字符串\n */\nexport function parseFileSize(sizeStr: string): number {\n const match = sizeStr.match(/^(\\d+(?:\\.\\d+)?)\\s*([KMGT]?B)$/i);\n if (!match || !match[1] || !match[2]) return 0;\n\n const value = parseFloat(match[1]);\n const unit = match[2].toUpperCase();\n\n const units: Record<string, number> = {\n B: 1,\n KB: 1024,\n MB: 1024 * 1024,\n GB: 1024 * 1024 * 1024,\n TB: 1024 * 1024 * 1024 * 1024,\n };\n\n return value * (units[unit] || 1);\n}\n\n// ============= MIME类型处理 =============\n\n/**\n * 获取文件扩展名\n */\nexport function getFileExtension(fileName: string): string {\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot === -1) return '';\n return fileName.substring(lastDot).toLowerCase();\n}\n\n/**\n * 根据文件名获取MIME类型\n */\nexport function getMimeTypeFromFileName(fileName: string): string {\n const ext = getFileExtension(fileName);\n\n const mimeMap: Record<string, string> = {\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.png': 'image/png',\n '.gif': 'image/gif',\n '.webp': 'image/webp',\n '.svg': 'image/svg+xml',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.mp4': 'video/mp4',\n '.avi': 'video/x-msvideo',\n '.mov': 'video/quicktime',\n '.mp3': 'audio/mpeg',\n '.wav': 'audio/wav',\n '.ogg': 'audio/ogg',\n '.doc': 'application/msword',\n '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n '.xls': 'application/vnd.ms-excel',\n '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n };\n\n return mimeMap[ext] || 'application/octet-stream';\n}\n\n/**\n * 检查MIME类型是否支持\n */\nexport function isMimeTypeSupported(mimeType: string, allowedTypes?: string[]): boolean {\n if (allowedTypes && allowedTypes.length > 0) {\n return allowedTypes.includes(mimeType);\n }\n\n return (\n IMAGE_MIME_TYPES.includes(mimeType) ||\n VIDEO_MIME_TYPES.includes(mimeType) ||\n AUDIO_MIME_TYPES.includes(mimeType) ||\n DOCUMENT_MIME_TYPES.includes(mimeType)\n );\n}\n\n/**\n * 判断是否为图片类型\n */\nexport function isImageFile(mimeType: string): boolean {\n return IMAGE_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为视频类型\n */\nexport function isVideoFile(mimeType: string): boolean {\n return VIDEO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为音频类型\n */\nexport function isAudioFile(mimeType: string): boolean {\n return AUDIO_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 判断是否为文档类型\n */\nexport function isDocumentFile(mimeType: string): boolean {\n return DOCUMENT_MIME_TYPES.includes(mimeType);\n}\n\n/**\n * 获取文件类型类别\n */\nexport function getFileCategory(\n mimeType: string\n): 'image' | 'video' | 'audio' | 'document' | 'other' {\n if (isImageFile(mimeType)) return 'image';\n if (isVideoFile(mimeType)) return 'video';\n if (isAudioFile(mimeType)) return 'audio';\n if (isDocumentFile(mimeType)) return 'document';\n return 'other';\n}\n\n// ============= 文件名处理 =============\n\n/**\n * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n // 检查是否以点开头\n if (fileName.startsWith('.')) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName\n .replace(/[<>:\"|?*\\/\\\\]/g, '_')\n .replace(/^\\.+/, '')\n .substring(0, 255);\n}\n\n/**\n * 生成唯一文件名\n */\nexport function generateUniqueFileName(originalName: string, fileId: string): string {\n const ext = getFileExtension(originalName);\n return (fileId) + (ext);\n}\n\n// ============= 存储路径处理 =============\n\n/**\n * 生成存储路径\n */\nexport function generateStoragePath(\n moduleId: string,\n fileName: string,\n options?: {\n businessId?: string;\n useDate?: boolean;\n customPrefix?: string;\n }\n): string {\n const parts: string[] = [];\n\n // 添加自定义前缀\n if (options?.customPrefix) {\n parts.push(options.customPrefix);\n }\n\n // 添加模块标识\n parts.push(moduleId);\n\n // 添加业务标识\n if (options?.businessId) {\n parts.push(options.businessId);\n }\n\n // 添加日期路径\n if (options?.useDate !== false) {\n const date = new Date();\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n parts.push(String(year), month, day);\n }\n\n // 添加文件名\n parts.push(fileName);\n\n return parts.join('/');\n}\n\n/**\n * 解析存储路径\n */\nexport function parseStoragePath(path: string): {\n moduleId?: string;\n businessId?: string;\n year?: string;\n month?: string;\n day?: string;\n fileName: string;\n} {\n const parts = path.split('/');\n const fileName = parts[parts.length - 1] || '';\n\n return {\n moduleId: parts[0] || undefined,\n businessId: parts.length > 5 ? parts[1] : undefined,\n year: parts.length > 3 ? parts[parts.length - 4] : undefined,\n month: parts.length > 2 ? parts[parts.length - 3] : undefined,\n day: parts.length > 1 ? parts[parts.length - 2] : undefined,\n fileName,\n };\n}\n\n// ============= 文件验证 =============\n\n/**\n * 验证文件大小\n */\nexport function validateFileSize(file: File, maxSize: number): { valid: boolean; error?: string } {\n if (file.size > maxSize) {\n return {\n valid: false,\n error: '文件大小超过限制: ' + (formatFileSize(file.size)) + ' > ' + (formatFileSize(maxSize)),\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件类型\n */\nexport function validateFileType(\n file: File,\n allowedTypes?: string[]\n): { valid: boolean; error?: string } {\n const mimeType = file.type || getMimeTypeFromFileName(file.name);\n\n if (!isMimeTypeSupported(mimeType, allowedTypes)) {\n return {\n valid: false,\n error: '不支持的文件类型: ' + (mimeType),\n };\n }\n\n return { valid: true };\n}\n\n/**\n * 验证文件\n */\nexport function validateFile(\n file: File,\n options?: {\n maxSize?: number;\n allowedTypes?: string[];\n }\n): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证文件名\n if (!validateFileName(file.name)) {\n errors.push('文件名包含非法字符或长度不合法');\n }\n\n // 验证文件大小\n if (options?.maxSize) {\n const sizeResult = validateFileSize(file, options.maxSize);\n if (!sizeResult.valid && sizeResult.error) {\n errors.push(sizeResult.error);\n }\n }\n\n // 验证文件类型\n if (options?.allowedTypes) {\n const typeResult = validateFileType(file, options.allowedTypes);\n if (!typeResult.valid && typeResult.error) {\n errors.push(typeResult.error);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= URL处理 =============\n\n/**\n * 构建查询字符串\n */\nexport function buildQueryString(params: Record<string, any>): string {\n const searchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n value.forEach((v) => searchParams.append(key, String(v)));\n } else {\n searchParams.append(key, String(value));\n }\n }\n });\n\n const queryString = searchParams.toString();\n return queryString ? '?' + (queryString) : '';\n}\n\n/**\n * 解析URL查询参数\n */\nexport function parseQueryString(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n const urlObj = new URL(url, window.location.origin);\n\n urlObj.searchParams.forEach((value, key) => {\n params[key] = value;\n });\n\n return params;\n}\n\n// ============= 进度计算 =============\n\n/**\n * 计算上传进度\n */\nexport function calculateProgress(uploadedBytes: number, totalBytes: number): number {\n if (totalBytes === 0) return 0;\n return Math.min(Math.round((uploadedBytes / totalBytes) * 100), 100);\n}\n\n/**\n * 计算上传速度\n */\nexport function calculateSpeed(uploadedBytes: number, elapsedTime: number): number {\n if (elapsedTime === 0) return 0;\n return uploadedBytes / (elapsedTime / 1000); // 字节/秒\n}\n\n/**\n * 计算剩余时间\n */\nexport function calculateRemainingTime(\n uploadedBytes: number,\n totalBytes: number,\n speed: number\n): number {\n if (speed === 0) return 0;\n const remainingBytes = totalBytes - uploadedBytes;\n return Math.round(remainingBytes / speed); // 秒\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建文件错误对象\n */\nexport function createFileError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n if (error && typeof error === 'object' && 'message' in error) {\n return String(error.message);\n }\n\n return '未知错误';\n}\n\n// ============= 文件读取 =============\n\n/**\n * 读取文件为Base64\n */\nexport function readFileAsBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n const result = reader.result as string;\n // 移除Data URL前缀\n const base64 = result.split(',')[1] || '';\n resolve(base64);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 读取文件为ArrayBuffer\n */\nexport function readFileAsArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as ArrayBuffer);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsArrayBuffer(file);\n });\n}\n\n/**\n * 读取文件为文本\n */\nexport function readFileAsText(file: File, encoding: string = 'UTF-8'): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n resolve(reader.result as string);\n };\n\n reader.onerror = () => {\n reject(new Error('读取文件失败'));\n };\n\n reader.readAsText(file, encoding);\n });\n}\n","/**\n * 通用文件服务客户端SDK\n *\n * 提供文件上传、下载、查询等功能的客户端接口\n */\n\nimport type {\n FileMetadata,\n UploadFileInfo,\n UploadProgress,\n FileQueryOptions,\n PaginatedResult,\n BatchOperationResult,\n} from './types';\nimport {\n API_ENDPOINTS,\n ERROR_CODES,\n DEFAULT_REQUEST_TIMEOUT,\n DEFAULT_UPLOAD_TIMEOUT,\n} from './constants';\nimport { createFileError, formatErrorMessage, buildQueryString } from './utils';\nimport { createLogger } from '../logger';\n\nconst clientLogger = createLogger('UniversalFileClient');\n\n// ============= 配置类型 =============\n\nexport interface UniversalFileClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 上传超时时间(毫秒) */\n uploadTimeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用文件服务客户端\n */\nexport class UniversalFileClient {\n private config: Required<UniversalFileClientConfig>;\n\n constructor(config: UniversalFileClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || DEFAULT_REQUEST_TIMEOUT,\n uploadTimeout: config.uploadTimeout || DEFAULT_UPLOAD_TIMEOUT,\n headers: config.headers || {},\n };\n }\n\n // ============= 文件上传API =============\n\n /**\n * 上传文件\n */\n async uploadFile(\n fileInfo: UploadFileInfo,\n onProgress?: (progress: UploadProgress) => void\n ): Promise<FileMetadata> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.UPLOAD);\n const startTime = Date.now();\n\n // 创建FormData\n const formData = new FormData();\n formData.append('file', fileInfo.file);\n formData.append('moduleId', fileInfo.moduleId);\n\n if (fileInfo.businessId) {\n formData.append('businessId', fileInfo.businessId);\n }\n\n if (fileInfo.permission) {\n formData.append('permission', fileInfo.permission);\n }\n\n if (fileInfo.customPath) {\n formData.append('customPath', fileInfo.customPath);\n }\n\n if (fileInfo.metadata) {\n formData.append('metadata', JSON.stringify(fileInfo.metadata));\n }\n\n if (fileInfo.needsProcessing !== undefined) {\n formData.append('needsProcessing', String(fileInfo.needsProcessing));\n }\n\n if (fileInfo.processingOptions) {\n formData.append('processingOptions', JSON.stringify(fileInfo.processingOptions));\n }\n\n try {\n clientLogger.debug('开始上传文件', {\n url,\n fileName: fileInfo.file.name,\n fileSize: fileInfo.file.size,\n moduleId: fileInfo.moduleId,\n businessId: fileInfo.businessId,\n });\n\n // 创建XMLHttpRequest以支持上传进度\n return await new Promise<FileMetadata>((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n \n // 重要:启用 credentials 以携带 cookie\n xhr.withCredentials = true;\n\n // 监听上传进度\n xhr.upload.addEventListener('progress', (event) => {\n if (event.lengthComputable && onProgress) {\n const elapsedTime = Date.now() - startTime;\n const speed = event.loaded / (elapsedTime / 1000);\n const remainingBytes = event.total - event.loaded;\n const remainingTime = speed > 0 ? remainingBytes / speed : 0;\n\n const progress: UploadProgress = {\n fileId: '', // 暂时为空,上传完成后会有\n status: 'uploading',\n progress: Math.round((event.loaded / event.total) * 100),\n uploadedBytes: event.loaded,\n totalBytes: event.total,\n speed,\n remainingTime,\n };\n\n onProgress(progress);\n }\n });\n\n // 监听上传完成\n xhr.addEventListener('load', () => {\n clientLogger.debug('上传响应', {\n status: xhr.status,\n statusText: xhr.statusText,\n responseLength: xhr.responseText?.length,\n });\n \n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n const response = JSON.parse(xhr.responseText);\n clientLogger.debug('解析响应成功', response);\n \n // 支持多种响应格式\n const fileData = response.file || response.data || response;\n const fileMetadata = this.transformFileMetadataFromAPI(fileData);\n\n if (onProgress) {\n onProgress({\n fileId: fileMetadata.id,\n status: 'completed',\n progress: 100,\n uploadedBytes: fileInfo.file.size,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n });\n }\n\n resolve(fileMetadata);\n } catch (error) {\n clientLogger.error('解析响应失败', { error, responseText: xhr.responseText });\n reject(new Error('解析响应失败'));\n }\n } else {\n clientLogger.error('上传失败', {\n status: xhr.status,\n statusText: xhr.statusText,\n responseText: xhr.responseText,\n });\n reject(new Error('上传失败: ' + (xhr.statusText)));\n }\n });\n\n // 监听错误\n xhr.addEventListener('error', (event) => {\n clientLogger.error('网络错误', event);\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '网络错误',\n });\n }\n reject(new Error('上传失败: 网络错误'));\n });\n\n // 监听超时\n xhr.addEventListener('timeout', () => {\n if (onProgress) {\n onProgress({\n fileId: '',\n status: 'failed',\n progress: 0,\n uploadedBytes: 0,\n totalBytes: fileInfo.file.size,\n speed: 0,\n remainingTime: 0,\n error: '上传超时',\n });\n }\n reject(new Error('上传超时'));\n });\n\n // 配置请求\n xhr.open('POST', url);\n xhr.timeout = this.config.uploadTimeout;\n\n // 设置请求头\n Object.entries(this.config.headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n\n // 发送请求\n xhr.send(formData);\n });\n } catch (error) {\n throw createFileError(\n ERROR_CODES.FILE_UPLOAD_ERROR,\n '文件上传失败: ' + (formatErrorMessage(error)),\n { fileInfo, originalError: error }\n );\n }\n }\n\n // ============= 文件查询API =============\n\n /**\n * 获取文件访问URL\n */\n async getFileUrl(fileId: string, expiresIn?: number): Promise<string> {\n const url = this.config.baseUrl + API_ENDPOINTS.GET_URL(fileId) + (expiresIn ? `?expiresIn=${expiresIn}` : '');\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取文件URL失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.url;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取文件URL失败: ' + (formatErrorMessage(error)),\n { fileId, expiresIn, originalError: error }\n );\n }\n }\n\n /**\n * 获取文件元数据\n */\n async getFileMetadata(fileId: string): Promise<FileMetadata> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_METADATA(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error('获取文件元数据失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformFileMetadataFromAPI(data.file);\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取文件元数据失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 查询文件列表\n */\n async queryFiles(options: FileQueryOptions): Promise<PaginatedResult<FileMetadata>> {\n const queryString = buildQueryString({\n moduleId: options.moduleId,\n businessId: options.businessId,\n uploaderId: options.uploaderId,\n mimeType: options.mimeType,\n minSize: options.minSize,\n maxSize: options.maxSize,\n startTime: options.startTime?.toISOString(),\n endTime: options.endTime?.toISOString(),\n keyword: options.keyword,\n tags: options.tags,\n sortBy: options.sortBy,\n sortOrder: options.sortOrder,\n page: options.page,\n pageSize: options.pageSize,\n });\n\n const url = (this.config.baseUrl) + (API_ENDPOINTS.QUERY) + (queryString);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n clientLogger.error('查询文件列表失败', {\n status: response.status,\n statusText: response.statusText,\n });\n throw new Error('查询文件列表失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n clientLogger.debug('查询文件列表响应', {\n itemsCount: data.items?.length,\n total: data.total,\n page: data.page,\n });\n \n // 防御性检查\n if (!data.items || !Array.isArray(data.items)) {\n clientLogger.error('响应格式错误: items 不是数组', data);\n return {\n items: [],\n total: 0,\n page: 1,\n pageSize: 20,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n };\n }\n \n return {\n items: data.items.map((item: any) => this.transformFileMetadataFromAPI(item)),\n total: data.total,\n page: data.page,\n pageSize: data.pageSize,\n totalPages: data.totalPages,\n hasNext: data.hasNext,\n hasPrev: data.hasPrev,\n };\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '查询文件列表失败: ' + (formatErrorMessage(error)),\n { options, originalError: error }\n );\n }\n }\n\n // ============= 文件删除API =============\n\n /**\n * 删除文件\n */\n async deleteFile(fileId: string): Promise<void> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.DELETE(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw createFileError(ERROR_CODES.FILE_NOT_FOUND, '文件不存在', { fileId });\n }\n throw new Error('删除文件失败: ' + (response.statusText));\n }\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '删除文件失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n /**\n * 批量删除文件\n */\n async batchDeleteFiles(fileIds: string[]): Promise<BatchOperationResult> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.BATCH_DELETE);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ fileIds }),\n });\n\n if (!response.ok) {\n throw new Error('批量删除文件失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.result;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '批量删除文件失败: ' + (formatErrorMessage(error)),\n { fileIds, originalError: error }\n );\n }\n }\n\n // ============= 上传进度API =============\n\n /**\n * 获取上传进度\n */\n async getUploadProgress(fileId: string): Promise<UploadProgress> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_PROGRESS(fileId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取上传进度失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return data.progress;\n } catch (error) {\n throw createFileError(\n ERROR_CODES.NETWORK_ERROR,\n '获取上传进度失败: ' + (formatErrorMessage(error)),\n { fileId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n credentials: 'include', // 携带 cookie 用于授权\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createFileError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的文件元数据\n */\n private transformFileMetadataFromAPI(apiData: any): FileMetadata {\n return {\n id: apiData.id,\n originalName: apiData.originalName,\n storageName: apiData.storageName || apiData.storedName,\n size: apiData.size,\n mimeType: apiData.mimeType,\n extension: apiData.extension,\n hash: apiData.hash || apiData.md5Hash || apiData.sha256Hash,\n uploadTime: new Date(apiData.uploadTime),\n permission: apiData.permission || 'public',\n uploaderId: apiData.uploaderId,\n moduleId: apiData.moduleId,\n businessId: apiData.businessId,\n storageProvider: apiData.storageProvider || 'local',\n storagePath: apiData.storagePath,\n cdnUrl: apiData.cdnUrl,\n accessCount: apiData.accessCount,\n lastAccessTime: apiData.lastAccessTime ? new Date(apiData.lastAccessTime) : undefined,\n expiresAt: apiData.expiresAt ? new Date(apiData.expiresAt) : undefined,\n metadata: apiData.metadata,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalFileClient = new UniversalFileClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createFileClient(config?: UniversalFileClientConfig): UniversalFileClient {\n return new UniversalFileClient(config);\n}\n","import type { AliyunOSSConfig } from '../../universalFile/server/types';\n\n/** 与 profile-v1 配置项 / 环境变量对齐的 OSS 键名 */\nexport const STANDARD_ALIYUN_OSS_KEYS = {\n region: 'ALIYUN_OSS_REGION',\n bucket: 'ALIYUN_OSS_BUCKET',\n accessKeyId: 'ALIYUN_OSS_ACCESS_KEY_ID',\n accessKeySecret: 'ALIYUN_OSS_ACCESS_KEY_SECRET',\n customDomain: 'ALIYUN_OSS_CUSTOM_DOMAIN',\n secure: 'ALIYUN_OSS_SECURE',\n internal: 'ALIYUN_OSS_INTERNAL',\n} as const;\n\nexport type OssConfigKeyMap = typeof STANDARD_ALIYUN_OSS_KEYS;\n\nexport function parseAliyunOssConfigFromMap(\n configMap: Record<string, string | undefined | null>,\n keys: OssConfigKeyMap = STANDARD_ALIYUN_OSS_KEYS,\n): AliyunOSSConfig | null {\n const region = configMap[keys.region]?.trim();\n const bucket = configMap[keys.bucket]?.trim();\n const accessKeyId = configMap[keys.accessKeyId]?.trim();\n const accessKeySecret = configMap[keys.accessKeySecret]?.trim();\n\n if (!region || !bucket || !accessKeyId || !accessKeySecret) {\n return null;\n }\n\n const secureRaw = configMap[keys.secure]?.trim().toLowerCase();\n const internalRaw = configMap[keys.internal]?.trim().toLowerCase();\n\n return {\n type: 'aliyun-oss',\n enabled: true,\n region,\n bucket,\n accessKeyId,\n accessKeySecret,\n customDomain: configMap[keys.customDomain]?.trim() || undefined,\n secure: secureRaw === 'true',\n internal: internalRaw === 'true',\n };\n}\n\nexport function isCompleteOssConfig(config: AliyunOSSConfig | null): config is AliyunOSSConfig {\n return Boolean(\n config?.enabled\n && config.region\n && config.bucket\n && config.accessKeyId\n && config.accessKeySecret,\n );\n}\n\nexport function getOssStorageModeLabelFromConfig(config: AliyunOSSConfig | null): string {\n if (!isCompleteOssConfig(config)) {\n return '本地存储 + 文件服务';\n }\n return config.customDomain\n ? '阿里云 OSS + 自定义域名'\n : '阿里云 OSS';\n}\n","export interface BuildModuleUploadPathOptions {\n moduleId: string;\n businessId?: string;\n fileName: string;\n subfolder?: string;\n}\n\nexport interface ResolveUploadFolderPathOptions {\n moduleId: string;\n businessId?: string;\n fileName: string;\n /** 优先于 customPath;与 API FormData 字段一致 */\n folderPath?: string | null;\n /** universalFile UploadFileInfo.customPath 别名 */\n customPath?: string | null;\n}\n\n/**\n * 统一 folderPath / customPath 解析(R2-204)。\n * client 与 server 均应使用此函数,避免双端路径不一致。\n */\nexport function resolveUploadFolderPath(\n options: ResolveUploadFolderPathOptions,\n): string {\n for (const candidate of [options.folderPath, options.customPath]) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim();\n }\n }\n return buildModuleUploadPath({\n moduleId: options.moduleId,\n businessId: options.businessId,\n fileName: options.fileName,\n });\n}\n\n/**\n * 从 multipart FormData 解析上传路径(兼容 folderPath 与 customPath)。\n */\nexport function resolveUploadFolderPathFromFormData(\n formData: FormData,\n defaults: Pick<ResolveUploadFolderPathOptions, 'moduleId' | 'businessId' | 'fileName'>,\n): string {\n const folderPath = formData.get('folderPath');\n const customPath = formData.get('customPath');\n return resolveUploadFolderPath({\n ...defaults,\n folderPath: typeof folderPath === 'string' ? folderPath : undefined,\n customPath: typeof customPath === 'string' ? customPath : undefined,\n });\n}\n\n/**\n * 生成 OSS / universal-file 使用的 folderPath(含扩展名)。\n */\nexport function buildModuleUploadPath(options: BuildModuleUploadPathOptions): string {\n const extension = options.fileName.split('.').pop()?.toLowerCase() || 'jpg';\n const timestamp = Date.now();\n const randomId = Math.random().toString(36).slice(2, 11);\n const segments = [\n options.moduleId,\n options.businessId,\n options.subfolder,\n ].filter(Boolean);\n const base = segments.length > 0 ? segments.join('/') : options.moduleId;\n return `${base}/${timestamp}_${randomId}.${extension}`;\n}\n","import type { RequestAdapter, RequestConfig } from '../../request/types/types';\nimport type { PlatformAdapter } from '../../common/platform/types';\n\n/** 与标准 fetch 兼容,供 ossFile 客户端注入(Taro / Hono SSR 等) */\nexport type OssFileFetchFn = (\n url: string,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport type OssFileHttpConfig = {\n fetch?: OssFileFetchFn;\n};\n\nlet globalHttpConfig: OssFileHttpConfig = {};\n\nexport function configureOssFileHttp(config: OssFileHttpConfig): void {\n globalHttpConfig = { ...globalHttpConfig, ...config };\n}\n\n/** @internal 测试重置 */\nexport function resetOssFileHttpForTesting(): void {\n globalHttpConfig = {};\n}\n\nfunction isMultipartBody(body: BodyInit | null | undefined): boolean {\n return (\n body instanceof FormData ||\n body instanceof Blob ||\n body instanceof URLSearchParams\n );\n}\n\nfunction headersToRecord(headers?: HeadersInit): Record<string, string> {\n const out: Record<string, string> = {};\n if (!headers) {\n return out;\n }\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n out[key] = value;\n });\n return out;\n }\n if (Array.isArray(headers)) {\n for (const [key, value] of headers) {\n out[key] = value;\n }\n return out;\n }\n return { ...headers };\n}\n\n/**\n * 将 RequestAdapter 桥接为 fetch 形态(JSON 请求)。\n * multipart 上传需通过 `configureOssFileHttp({ fetch })` 注入完整 fetch。\n */\nexport function createOssFileFetchFromAdapter(\n adapter: RequestAdapter,\n): OssFileFetchFn {\n return async (url, init = {}) => {\n if (isMultipartBody(init.body ?? null)) {\n throw new Error(\n '[ossFile] RequestAdapter 不支持 multipart;请注入支持 FormData 的 fetch',\n );\n }\n\n const method = (init.method ?? 'GET').toUpperCase() as NonNullable<\n RequestConfig['method']\n >;\n let body: unknown;\n if (typeof init.body === 'string' && init.body) {\n try {\n body = JSON.parse(init.body) as unknown;\n } catch {\n body = init.body;\n }\n }\n\n const payload = await adapter.request({\n url,\n method,\n headers: headersToRecord(init.headers),\n body,\n });\n\n const success = (payload as { success?: boolean } | null)?.success;\n const status = success === false ? 400 : 200;\n return new Response(JSON.stringify(payload), {\n status,\n headers: { 'Content-Type': 'application/json' },\n });\n };\n}\n\n/**\n * 从 PlatformAdapter 配置 ossFile HTTP(R2-223)\n *\n * - JSON GET/POST:走 `platform.fetch`(RequestAdapter)\n * - FormData 上传:走 `uploadFetch`,默认回退全局 `fetch`\n */\nexport function configureOssFileFromPlatform(\n platform: PlatformAdapter,\n options: {\n uploadFetch?: OssFileFetchFn;\n } = {},\n): void {\n const jsonFetch = createOssFileFetchFromAdapter(platform.fetch);\n const uploadFetch =\n options.uploadFetch ??\n (typeof fetch !== 'undefined' ? fetch.bind(globalThis) : undefined);\n\n configureOssFileHttp({\n fetch: async (url, init) => {\n if (isMultipartBody(init?.body ?? null)) {\n if (!uploadFetch) {\n throw new Error(\n '[ossFile] multipart 上传需要 uploadFetch 或浏览器 fetch 环境',\n );\n }\n return uploadFetch(url, { credentials: 'include', ...init });\n }\n return jsonFetch(url, init);\n },\n });\n}\n\nexport function getOssFileFetch(override?: OssFileFetchFn): OssFileFetchFn {\n const fn = override ?? globalHttpConfig.fetch;\n if (fn) {\n return fn;\n }\n if (typeof fetch === 'undefined') {\n throw new Error(\n '[ossFile] 无可用 fetch;请先调用 configureOssFileHttp 或 configureOssFileFromPlatform',\n );\n }\n return fetch.bind(globalThis);\n}\n\nexport async function ossFileFetch(\n url: string,\n init?: RequestInit,\n override?: OssFileFetchFn,\n): Promise<Response> {\n return getOssFileFetch(override)(url, {\n credentials: 'include',\n ...init,\n });\n}\n","import {\n universalFileClient,\n createFileClient,\n type UniversalFileClientConfig,\n} from '../universalFile/client';\nimport { API_ENDPOINTS } from '../universalFile/constants';\nimport {\n STANDARD_ALIYUN_OSS_KEYS,\n parseAliyunOssConfigFromMap,\n isCompleteOssConfig,\n getOssStorageModeLabelFromConfig,\n} from './shared/ossConfig';\nimport { buildModuleUploadPath, resolveUploadFolderPath } from './shared/path';\nimport {\n configureOssFileFromPlatform,\n configureOssFileHttp,\n createOssFileFetchFromAdapter,\n ossFileFetch,\n type OssFileFetchFn,\n type OssFileHttpConfig,\n} from './shared/httpClient';\n\nexport {\n configureOssFileHttp,\n configureOssFileFromPlatform,\n createOssFileFetchFromAdapter,\n type OssFileFetchFn,\n type OssFileHttpConfig,\n};\n\nexport type { UniversalFileClientConfig };\n\nexport {\n universalFileClient,\n createFileClient,\n STANDARD_ALIYUN_OSS_KEYS,\n parseAliyunOssConfigFromMap,\n buildModuleUploadPath,\n resolveUploadFolderPath,\n};\n\nexport interface UploadModuleFileOptions {\n file: File | Blob;\n moduleId: string;\n businessId?: string;\n uploadUrl?: string;\n /** 与 universalFile 的 customPath 等价 */\n folderPath?: string;\n customPath?: string;\n needsProcessing?: boolean;\n permission?: 'public' | 'private' | 'authenticated' | 'owner-only';\n metadata?: Record<string, unknown>;\n extraFields?: Record<string, string>;\n /** 单次请求覆盖全局注入的 fetch(R2-223) */\n fetch?: OssFileFetchFn;\n}\n\nexport interface UploadModuleFileResult {\n fileId: string;\n accessUrl: string;\n}\n\nexport async function uploadModuleFile(\n options: UploadModuleFileOptions,\n): Promise<UploadModuleFileResult> {\n const uploadUrl = options.uploadUrl ?? API_ENDPOINTS.UPLOAD;\n const fileName = options.file instanceof File ? options.file.name : 'upload.jpg';\n const folderPath = resolveUploadFolderPath({\n moduleId: options.moduleId,\n businessId: options.businessId,\n fileName,\n folderPath: options.folderPath,\n customPath: options.customPath,\n });\n\n const formData = new FormData();\n formData.append('file', options.file);\n formData.append('moduleId', options.moduleId);\n formData.append('businessId', options.businessId ?? 'default');\n formData.append('folderPath', folderPath);\n if (options.permission) {\n formData.append('permission', options.permission);\n }\n if (options.metadata) {\n formData.append('metadata', JSON.stringify(options.metadata));\n }\n if (options.needsProcessing !== undefined) {\n formData.append('needsProcessing', String(options.needsProcessing));\n }\n if (options.extraFields) {\n for (const [key, value] of Object.entries(options.extraFields)) {\n formData.append(key, value);\n }\n }\n\n const response = await ossFileFetch(\n uploadUrl,\n {\n method: 'POST',\n body: formData,\n },\n options.fetch,\n );\n\n const payload = await response.json().catch(() => ({}));\n if (!response.ok || payload.success === false) {\n throw new Error(payload.error || payload.message || `HTTP ${response.status}`);\n }\n\n const data = payload.data ?? payload;\n const fileId = data.fileId ?? data.id;\n const accessUrl = data.accessUrl ?? data.url;\n if (!fileId || !accessUrl) {\n throw new Error('上传响应缺少 fileId 或 accessUrl');\n }\n\n return { fileId, accessUrl };\n}\n\nexport async function uploadArtworkImage(\n file: File,\n collectionId?: number,\n): Promise<UploadModuleFileResult> {\n return uploadModuleFile({\n file,\n moduleId: 'showmasterpiece',\n businessId: collectionId ? `collection-${collectionId}` : 'artwork',\n needsProcessing: true,\n });\n}\n\nexport async function getModuleFileAccessUrl(\n fileId: string,\n apiBase = '',\n fetchOverride?: OssFileFetchFn,\n): Promise<string> {\n const response = await ossFileFetch(\n `${apiBase}/api/universal-file/${fileId}`,\n { method: 'GET' },\n fetchOverride,\n );\n if (!response.ok) {\n throw new Error(`获取文件 URL 失败: HTTP ${response.status}`);\n }\n const payload = await response.json();\n if (payload.success === false) {\n throw new Error(payload.error || '获取文件 URL 失败');\n }\n const url = payload.data?.accessUrl ?? payload.accessUrl;\n if (!url) {\n throw new Error('响应缺少 accessUrl');\n }\n return url;\n}\n\nexport const getArtworkImageUrl = getModuleFileAccessUrl;\n\nlet cachedOssConfig: ReturnType<typeof parseAliyunOssConfigFromMap> = null;\n\nasync function loadOssConfigFromItemsApi(\n itemsApiUrl: string,\n fetchOverride?: OssFileFetchFn,\n) {\n const keys = Object.values(STANDARD_ALIYUN_OSS_KEYS).join(',');\n const url = `${itemsApiUrl}${itemsApiUrl.includes('?') ? '&' : '?'}keys=${encodeURIComponent(keys)}`;\n const response = await ossFileFetch(url, { method: 'GET' }, fetchOverride);\n if (!response.ok) return null;\n\n const data = await response.json();\n if (!data.success || !Array.isArray(data.items)) return null;\n\n const configMap: Record<string, string> = {};\n for (const item of data.items) {\n if (item?.key && item?.value) {\n configMap[item.key] = item.value;\n }\n }\n return parseAliyunOssConfigFromMap(configMap);\n}\n\nasync function getCachedOssConfig(itemsApiUrl?: string) {\n if (cachedOssConfig !== null) {\n return cachedOssConfig;\n }\n if (typeof window !== 'undefined' && itemsApiUrl) {\n cachedOssConfig = await loadOssConfigFromItemsApi(itemsApiUrl);\n }\n return cachedOssConfig;\n}\n\nexport async function shouldUseOssFileService(\n itemsApiUrl?: string,\n): Promise<boolean> {\n try {\n await getCachedOssConfig(itemsApiUrl);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getOssStorageModeDisplayName(\n itemsApiUrl?: string,\n): Promise<string> {\n const config = await getCachedOssConfig(itemsApiUrl);\n return getOssStorageModeLabelFromConfig(config);\n}\n\nexport function clearOssFileConfigCache(): void {\n cachedOssConfig = null;\n}\n\nexport async function refreshOssFileConfigCache(\n itemsApiUrl?: string,\n): Promise<void> {\n clearOssFileConfigCache();\n await getCachedOssConfig(itemsApiUrl);\n}\n\nexport const shouldUseUniversalFileService = shouldUseOssFileService;\nexport const getStorageModeDisplayName = getOssStorageModeDisplayName;\nexport const clearConfigCache = clearOssFileConfigCache;\nexport const refreshFileServiceConfig = refreshOssFileConfigCache;\n\nexport async function fetchOssConfigManagerFromItemsApi(\n itemsApiUrl: string,\n): Promise<ReturnType<typeof parseAliyunOssConfigFromMap>> {\n return loadOssConfigFromItemsApi(itemsApiUrl);\n}\n\nexport function isOssConfigured(config: ReturnType<typeof parseAliyunOssConfigFromMap>): boolean {\n return isCompleteOssConfig(config);\n}\n","/**\n * @package sa2kit/common/export\n */\nexport * from '../../universalExport';\n","/**\n * 通用导出服务类型定义\n *\n * 定义了导出功能的核心接口和类型\n */\n\n// ============= 基础类型定义 =============\n\n/** 导出格式类型 */\nexport type ExportFormat = 'csv' | 'excel' | 'json';\n\n/** 字段类型 */\nexport type FieldType = 'string' | 'number' | 'date' | 'boolean' | 'array' | 'object';\n\n/** 字段对齐方式 */\nexport type FieldAlignment = 'left' | 'center' | 'right';\n\n/** 导出状态 */\nexport type ExportStatus = 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';\n\n/** 分组模式 */\nexport type GroupingMode = 'merge' | 'separate' | 'nested';\n\n/** 分组处理类型 */\nexport type GroupValueProcessing = 'first' | 'last' | 'concat' | 'sum' | 'count' | 'custom';\n\n// ============= 字段定义接口 =============\n\n/** 导出字段定义 */\nexport interface ExportField {\n /** 字段键名 */\n key: string;\n /** 字段显示名称 */\n label: string;\n /** 字段类型 */\n type: FieldType;\n /** 是否启用 */\n enabled: boolean;\n /** 字段宽度 */\n width?: number;\n /** 对齐方式 */\n alignment?: FieldAlignment;\n /** 格式化函数 */\n formatter?: (value: any) => string;\n /** 排序权重 */\n sortOrder?: number;\n /** 是否必填 */\n required?: boolean;\n /** 字段描述 */\n description?: string;\n /** 自定义样式 */\n style?: Record<string, any>;\n}\n\n/** 分组字段配置 */\nexport interface GroupingField {\n /** 分组字段键名 */\n key: string;\n /** 分组字段显示名称 */\n label: string;\n /** 分组模式 */\n mode: GroupingMode;\n /** 其他字段的值处理方式 */\n valueProcessing: GroupValueProcessing;\n /** 自定义处理函数 */\n customProcessor?: (values: any[]) => any;\n /** 是否显示分组行 */\n showGroupHeader: boolean;\n /** 分组行模板 */\n groupHeaderTemplate?: string;\n /** 是否合并单元格(仅Excel格式支持) */\n mergeCells: boolean;\n}\n\n/** 分组配置 */\nexport interface GroupingConfig {\n /** 是否启用分组 */\n enabled: boolean;\n /** 分组字段列表(支持多级分组) */\n fields: GroupingField[];\n /** 分组后是否保持原始顺序 */\n preserveOrder: boolean;\n /** 空值处理方式 */\n nullValueHandling: 'skip' | 'group' | 'separate';\n /** 空值分组名称 */\n nullGroupName?: string;\n}\n\n/** 导出配置 */\nexport interface ExportConfig {\n /** 配置ID */\n id: string;\n /** 配置名称 */\n name: string;\n /** 配置描述 */\n description?: string;\n /** 导出格式 */\n format: ExportFormat;\n /** 字段定义 */\n fields: ExportField[];\n /** 分组配置 */\n grouping?: GroupingConfig;\n /** 文件名模板 */\n fileNameTemplate: string;\n /** 是否包含表头 */\n includeHeader: boolean;\n /** 分隔符 */\n delimiter: string;\n /** 编码格式 */\n encoding: string;\n /** 是否添加BOM */\n addBOM: boolean;\n /** 最大行数限制 */\n maxRows?: number;\n /** 创建时间 */\n createdAt: Date;\n /** 更新时间 */\n updatedAt: Date;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 创建者ID */\n createdBy?: string;\n}\n\n/** 导出请求 */\nexport interface ExportRequest {\n /** 导出配置ID或配置对象 */\n configId: string | ExportConfig;\n /** 数据源 */\n dataSource: string | (() => Promise<any[]>) | any[];\n /** 查询参数 */\n queryParams?: Record<string, any>;\n /** 自定义字段映射 */\n fieldMapping?: Record<string, string>;\n /** 过滤条件 */\n filters?: ExportFilter[];\n /** 排序条件 */\n sortBy?: ExportSort[];\n /** 分页参数 */\n pagination?: {\n page: number;\n pageSize: number;\n };\n /** 自定义文件名 */\n customFileName?: string;\n /** 回调函数 */\n callbacks?: {\n onProgress?: (progress: ExportProgress) => void;\n onSuccess?: (result: ExportResult) => void;\n onError?: (error: ExportError) => void;\n };\n}\n\n/** 导出过滤器 */\nexport interface ExportFilter {\n /** 字段名 */\n field: string;\n /** 操作符 */\n operator:\n | 'eq'\n | 'ne'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'contains'\n | 'startsWith'\n | 'endsWith'\n | 'in'\n | 'notIn';\n /** 值 */\n value: any;\n}\n\n/** 导出排序 */\nexport interface ExportSort {\n /** 字段名 */\n field: string;\n /** 排序方向 */\n direction: 'asc' | 'desc';\n}\n\n/** 导出进度 */\nexport interface ExportProgress {\n /** 导出ID */\n exportId: string;\n /** 状态 */\n status: ExportStatus;\n /** 进度百分比 */\n progress: number;\n /** 已处理行数 */\n processedRows: number;\n /** 总行数 */\n totalRows: number;\n /** 开始时间 */\n startTime: Date;\n /** 预计完成时间 */\n estimatedEndTime?: Date;\n /** 当前处理的数据 */\n currentData?: any;\n /** 错误信息 */\n error?: string;\n}\n\n/** 导出结果 */\nexport interface ExportResult {\n /** 导出ID */\n exportId: string;\n /** 文件名 */\n fileName: string;\n /** 文件大小 */\n fileSize: number;\n /** 文件URL */\n fileUrl?: string;\n /** 文件Blob */\n fileBlob?: Blob;\n /** 导出行数 */\n exportedRows: number;\n /** 开始时间 */\n startTime: Date;\n /** 完成时间 */\n endTime: Date;\n /** 耗时(毫秒) */\n duration: number;\n /** 统计信息 */\n statistics?: {\n totalRows: number;\n filteredRows: number;\n exportedRows: number;\n skippedRows: number;\n };\n}\n\n/** 导出错误 */\nexport interface ExportError {\n /** 错误代码 */\n code: string;\n /** 错误消息 */\n message: string;\n /** 错误详情 */\n details?: Record<string, any>;\n /** 错误时间 */\n timestamp: Date;\n}\n\n// ============= 服务配置接口 =============\n\n/** 通用导出服务配置 */\nexport interface UniversalExportServiceConfig {\n /** 默认导出格式 */\n defaultFormat: ExportFormat;\n /** 默认分隔符 */\n defaultDelimiter: string;\n /** 默认编码 */\n defaultEncoding: string;\n /** 是否默认添加BOM */\n defaultAddBOM: boolean;\n /** 最大文件大小限制(字节) */\n maxFileSize: number;\n /** 最大行数限制 */\n maxRowsLimit: number;\n /** 并发导出数量限制 */\n maxConcurrentExports: number;\n /** 导出超时时间(毫秒) */\n exportTimeout: number;\n /** 缓存配置 */\n cache: {\n /** 配置缓存TTL(秒) */\n configTTL: number;\n /** 结果缓存TTL(秒) */\n resultTTL: number;\n };\n}\n\n// ============= 异常类定义 =============\n\n/** 导出服务基础异常 */\nexport class ExportServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly details?: Record<string, any>\n ) {\n super(message);\n this.name = 'ExportServiceError';\n }\n}\n\n/** 导出配置错误 */\nexport class ExportConfigError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_CONFIG_ERROR', details);\n this.name = 'ExportConfigError';\n }\n}\n\n/** 导出数据处理错误 */\nexport class ExportDataError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_DATA_ERROR', details);\n this.name = 'ExportDataError';\n }\n}\n\n/** 导出文件生成错误 */\nexport class ExportFileError extends ExportServiceError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, 'EXPORT_FILE_ERROR', details);\n this.name = 'ExportFileError';\n }\n}\n\n// ============= 事件类型定义 =============\n\n/** 导出事件类型 */\nexport type ExportEventType =\n | 'export:start'\n | 'export:progress'\n | 'export:complete'\n | 'export:error'\n | 'export:cancel'\n | 'config:save'\n | 'config:delete';\n\n/** 导出事件 */\nexport interface ExportEvent {\n /** 事件类型 */\n type: ExportEventType;\n /** 导出ID */\n exportId: string;\n /** 事件时间 */\n timestamp: Date;\n /** 事件数据 */\n data?: Record<string, any>;\n /** 错误信息 */\n error?: string;\n}\n\n/** 导出事件监听器 */\nexport type ExportEventListener = (event: ExportEvent) => void | Promise<void>;\n\n// ============= 工具类型 =============\n\n/** 字段映射函数 */\nexport type FieldMapper<T = any> = (item: T, index: number) => Record<string, any>;\n\n/** 数据转换函数 */\nexport type DataTransformer<T = any, R = any> = (data: T[]) => R[];\n\n/** 验证函数 */\nexport type Validator<T = any> = (data: T) => boolean | string;\n\n/** 格式化函数 */\nexport type Formatter<T = any> = (value: T) => string;\n","/**\n * 通用导出服务常量定义\n */\n\nimport type { ExportFormat } from './types';\n\n// ============= 版本信息 =============\n\n/** 模块版本 */\nexport const UNIVERSAL_EXPORT_VERSION = '1.0.0';\n\n/** 模块名称 */\nexport const UNIVERSAL_EXPORT_NAME = '@lyricnote/universal-export';\n\n// ============= 默认配置 =============\n\n/** 默认导出格式 */\nexport const DEFAULT_EXPORT_FORMAT: ExportFormat = 'csv';\n\n/** 默认CSV分隔符 */\nexport const DEFAULT_CSV_DELIMITER = ',';\n\n/** 默认编码格式 */\nexport const DEFAULT_ENCODING = 'utf-8';\n\n/** 默认是否添加BOM */\nexport const DEFAULT_ADD_BOM = true;\n\n/** 默认最大文件大小(字节) - 100MB */\nexport const DEFAULT_MAX_FILE_SIZE = 100 * 1024 * 1024;\n\n/** 默认最大行数限制 */\nexport const DEFAULT_MAX_ROWS = 100000;\n\n/** 默认并发导出数量 */\nexport const DEFAULT_MAX_CONCURRENT_EXPORTS = 5;\n\n/** 默认导出超时时间(毫秒) - 5分钟 */\nexport const DEFAULT_EXPORT_TIMEOUT = 300000;\n\n/** 默认配置缓存TTL(秒) - 1小时 */\nexport const DEFAULT_CONFIG_CACHE_TTL = 3600;\n\n/** 默认结果缓存TTL(秒) - 30分钟 */\nexport const DEFAULT_RESULT_CACHE_TTL = 1800;\n\n// ============= 文件扩展名 =============\n\n/** 导出格式对应的文件扩展名 */\nexport const EXPORT_FORMAT_EXTENSIONS: Record<ExportFormat, string> = {\n csv: 'csv',\n excel: 'xlsx',\n json: 'json',\n};\n\n/** 导出格式对应的MIME类型 */\nexport const EXPORT_FORMAT_MIME_TYPES: Record<ExportFormat, string> = {\n csv: 'text/csv; charset=utf-8',\n excel: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n json: 'application/json; charset=utf-8',\n};\n\n// ============= API端点 =============\n\n/** API基础路径 */\nexport const API_BASE_PATH = '/api/universal-export';\n\n/** API端点 */\nexport const API_ENDPOINTS = {\n /** 获取配置列表 */\n GET_CONFIGS: (API_BASE_PATH) + '/configs',\n /** 创建配置 */\n CREATE_CONFIG: (API_BASE_PATH) + '/configs',\n /** 更新配置 */\n UPDATE_CONFIG: (configId: string) => (API_BASE_PATH) + '/configs/' + (configId),\n /** 删除配置 */\n DELETE_CONFIG: (configId: string) => (API_BASE_PATH) + '/configs/' + (configId),\n /** 触发导出 */\n EXPORT_DATA: (API_BASE_PATH) + '/export',\n /** 查询导出进度 */\n GET_PROGRESS: (exportId: string) => (API_BASE_PATH) + '/export/' + (exportId) + '/progress',\n /** 下载导出文件 */\n DOWNLOAD_FILE: (exportId: string) => (API_BASE_PATH) + '/export/' + (exportId) + '/download',\n} as const;\n\n// ============= 错误代码 =============\n\n/** 错误代码 */\nexport const ERROR_CODES = {\n /** 导出配置错误 */\n EXPORT_CONFIG_ERROR: 'EXPORT_CONFIG_ERROR',\n /** 导出数据错误 */\n EXPORT_DATA_ERROR: 'EXPORT_DATA_ERROR',\n /** 导出文件错误 */\n EXPORT_FILE_ERROR: 'EXPORT_FILE_ERROR',\n /** 网络错误 */\n NETWORK_ERROR: 'NETWORK_ERROR',\n /** 超时错误 */\n TIMEOUT_ERROR: 'TIMEOUT_ERROR',\n /** 未授权 */\n UNAUTHORIZED: 'UNAUTHORIZED',\n /** 服务器错误 */\n SERVER_ERROR: 'SERVER_ERROR',\n} as const;\n","/**\n * 通用导出服务工具函数\n */\n\nimport type { ExportFormat, Formatter } from './types';\nimport { EXPORT_FORMAT_EXTENSIONS } from './constants';\n\n// ============= 文件名处理 =============\n\n/**\n * 生成导出文件名\n */\nexport function generateExportFileName(template: string, format: ExportFormat): string {\n const now = new Date();\n const dateStr = now.toISOString().split('T')[0] || '';\n const timeStr = (now.toTimeString().split(' ')[0] || '').replace(/:/g, '-');\n const extension = EXPORT_FORMAT_EXTENSIONS[format];\n\n return (\n template\n .replace('{date}', dateStr)\n .replace('{time}', timeStr)\n .replace('{timestamp}', now.getTime().toString()) + '.' + (extension)\n );\n}\n\n/**\n * 验证文件名是否合法\n */\nexport function validateFileName(fileName: string): boolean {\n // 检查是否包含非法字符\n const invalidChars = /[<>:\"|?*\\/\\\\]/;\n if (invalidChars.test(fileName)) {\n return false;\n }\n\n // 检查长度\n if (fileName.length === 0 || fileName.length > 255) {\n return false;\n }\n\n return true;\n}\n\n/**\n * 清理文件名,移除非法字符\n */\nexport function sanitizeFileName(fileName: string): string {\n return fileName.replace(/[<>:\"|?*\\/\\\\]/g, '_').substring(0, 255);\n}\n\n// ============= CSV处理 =============\n\n/**\n * 转义CSV字段\n */\nexport function escapeCSVField(value: string, delimiter: string = ','): string {\n const valueStr = String(value || '');\n\n // 如果包含分隔符、双引号或换行符,需要用双引号包裹并转义内部的双引号\n if (valueStr.includes(delimiter) || valueStr.includes('\"') || valueStr.includes('\\n')) {\n return '\"' + (valueStr.replace(/\"/g, '\"\"')) + '\"';\n }\n\n return valueStr;\n}\n\n/**\n * 解析CSV字段\n */\nexport function parseCSVField(field: string): string {\n // 如果字段被双引号包裹,移除双引号并还原转义的双引号\n if (field.startsWith('\"') && field.endsWith('\"')) {\n return field.slice(1, -1).replace(/\"\"/g, '\"');\n }\n\n return field;\n}\n\n// ============= 数据格式化 =============\n\n/**\n * 内置格式化器集合\n */\nexport const DEFAULT_FORMATTERS: Record<string, Formatter> = {\n // 日期格式化\n date: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n return date.toISOString().split('T')[0] || '';\n },\n\n // 时间格式化\n datetime: (value: any) => {\n if (!value) return '';\n const date = new Date(value);\n if (isNaN(date.getTime())) return String(value);\n return date.toLocaleString('zh-CN');\n },\n\n // 数字格式化\n number: (value: any) => {\n if (value === null || value === undefined) return '';\n return String(value);\n },\n\n // 货币格式化\n currency: (value: any) => {\n if (value === null || value === undefined) return '';\n return '¥' + (Number(value).toFixed(2));\n },\n\n // 百分比格式化\n percentage: (value: any) => {\n if (value === null || value === undefined) return '';\n return ((Number(value) * 100).toFixed(2)) + '%';\n },\n\n // 布尔值格式化\n boolean: (value: any) => {\n if (value === null || value === undefined) return '';\n return value ? '是' : '否';\n },\n\n // 数组格式化\n array: (value: any) => {\n if (!Array.isArray(value)) return '';\n return value.join(', ');\n },\n\n // 对象格式化\n object: (value: any) => {\n if (!value || typeof value !== 'object') return '';\n return JSON.stringify(value);\n },\n};\n\n/**\n * 应用格式化器\n */\nexport function applyFormatter(value: any, formatter?: Formatter, type?: string): string {\n // 优先使用自定义格式化器\n if (formatter) {\n return formatter(value);\n }\n\n // 使用类型对应的默认格式化器\n if (type && DEFAULT_FORMATTERS[type]) {\n return DEFAULT_FORMATTERS[type](value);\n }\n\n // 默认转字符串\n return String(value || '');\n}\n\n// ============= 数据验证 =============\n\n/**\n * 验证导出配置\n */\nexport function validateExportConfig(config: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 检查必填字段\n if (!config.name || config.name.trim() === '') {\n errors.push('配置名称不能为空');\n }\n\n if (!config.fields || !Array.isArray(config.fields) || config.fields.length === 0) {\n errors.push('至少需要定义一个字段');\n }\n\n if (config.fields) {\n const enabledFields = config.fields.filter((f: any) => f.enabled);\n if (enabledFields.length === 0) {\n errors.push('至少需要启用一个字段');\n }\n\n // 检查字段键名唯一性\n const keys = config.fields.map((f: any) => f.key);\n const uniqueKeys = new Set(keys);\n if (keys.length !== uniqueKeys.size) {\n errors.push('字段键名必须唯一');\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * 验证导出请求\n */\nexport function validateExportRequest(request: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!request.configId) {\n errors.push('导出配置ID不能为空');\n }\n\n if (!request.dataSource) {\n errors.push('数据源不能为空');\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// ============= 文件大小格式化 =============\n\n/**\n * 格式化文件大小\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n const k = 1024;\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return ((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + (units[i]);\n}\n\n// ============= 时间处理 =============\n\n/**\n * 格式化持续时间\n */\nexport function formatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return (milliseconds) + 'ms';\n }\n\n const seconds = Math.floor(milliseconds / 1000);\n\n if (seconds < 60) {\n return (seconds) + '秒';\n }\n\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = seconds % 60;\n\n if (minutes < 60) {\n return remainingSeconds > 0 ? (minutes) + '分' + (remainingSeconds) + '秒' : (minutes) + '分钟';\n }\n\n const hours = Math.floor(minutes / 60);\n const remainingMinutes = minutes % 60;\n\n return remainingMinutes > 0 ? (hours) + '小时' + (remainingMinutes) + '分钟' : (hours) + '小时';\n}\n\n/**\n * 计算预计完成时间\n */\nexport function estimateEndTime(\n startTime: Date,\n processedRows: number,\n totalRows: number\n): Date | undefined {\n if (processedRows === 0 || totalRows === 0) {\n return undefined;\n }\n\n const elapsed = Date.now() - startTime.getTime();\n const avgTimePerRow = elapsed / processedRows;\n const remainingRows = totalRows - processedRows;\n const remainingTime = avgTimePerRow * remainingRows;\n\n return new Date(Date.now() + remainingTime);\n}\n\n// ============= 数据处理 =============\n\n/**\n * 获取嵌套对象的值\n */\nexport function getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => {\n return current && current[key] !== undefined ? current[key] : null;\n }, obj);\n}\n\n/**\n * 设置嵌套对象的值\n */\nexport function setNestedValue(obj: any, path: string, value: any): void {\n const keys = path.split('.');\n const lastKey = keys.pop();\n\n if (!lastKey) return;\n\n const target = keys.reduce((current, key) => {\n if (!current[key] || typeof current[key] !== 'object') {\n current[key] = {};\n }\n return current[key];\n }, obj);\n\n target[lastKey] = value;\n}\n\n// ============= 错误处理 =============\n\n/**\n * 创建导出错误对象\n */\nexport function createExportError(\n code: string,\n message: string,\n details?: Record<string, any>\n): { code: string; message: string; details?: Record<string, any>; timestamp: Date } {\n return {\n code,\n message,\n details,\n timestamp: new Date(),\n };\n}\n\n/**\n * 格式化错误消息\n */\nexport function formatErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n return error;\n }\n\n return '未知错误';\n}\n","/**\n * 通用导出服务客户端SDK\n *\n * 提供与后端API交互的客户端接口\n */\n\nimport type { ExportConfig, ExportProgress, ExportResult, ExportRequest } from './types';\nimport { API_ENDPOINTS, ERROR_CODES } from './constants';\nimport { createExportError, formatErrorMessage } from './utils';\n\n// ============= 配置类型 =============\n\nexport interface UniversalExportClientConfig {\n /** API基础URL */\n baseUrl?: string;\n /** 请求超时时间(毫秒) */\n timeout?: number;\n /** 自定义请求头 */\n headers?: Record<string, string>;\n}\n\n// ============= 客户端类 =============\n\n/**\n * 通用导出服务客户端\n */\nexport class UniversalExportClient {\n private config: UniversalExportClientConfig;\n\n constructor(config: UniversalExportClientConfig = {}) {\n this.config = {\n baseUrl: config.baseUrl || '',\n timeout: config.timeout || 30000,\n headers: config.headers || {},\n };\n }\n\n // ============= 配置管理API =============\n\n /**\n * 获取模块的导出配置列表\n */\n async getConfigsByModule(moduleId: string, businessId?: string): Promise<ExportConfig[]> {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.append('businessId', businessId);\n }\n\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_CONFIGS) + '?' + (params);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取配置失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformConfigsFromAPI(data.configs || []);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '获取导出配置失败: ' + (formatErrorMessage(error)),\n { moduleId, businessId, originalError: error }\n );\n }\n }\n\n /**\n * 创建导出配置\n */\n async createConfig(\n config: Omit<ExportConfig, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<ExportConfig> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.CREATE_CONFIG);\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(config),\n });\n\n if (!response.ok) {\n throw new Error('创建配置失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '创建导出配置失败: ' + (formatErrorMessage(error)),\n { config, originalError: error }\n );\n }\n }\n\n /**\n * 更新导出配置\n */\n async updateConfig(configId: string, updates: Partial<ExportConfig>): Promise<ExportConfig> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.UPDATE_CONFIG(configId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'PUT',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(updates),\n });\n\n if (!response.ok) {\n throw new Error('更新配置失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformConfigFromAPI(data.config);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '更新导出配置失败: ' + (formatErrorMessage(error)),\n { configId, updates, originalError: error }\n );\n }\n }\n\n /**\n * 删除导出配置\n */\n async deleteConfig(configId: string): Promise<void> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.DELETE_CONFIG(configId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'DELETE',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('删除配置失败: ' + (response.statusText));\n }\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '删除导出配置失败: ' + (formatErrorMessage(error)),\n { configId, originalError: error }\n );\n }\n }\n\n // ============= 导出执行API =============\n\n /**\n * 触发数据导出\n */\n async exportData(request: Omit<ExportRequest, 'callbacks' | 'dataSource'> & {\n dataSource: any[] | string;\n }): Promise<ExportResult> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.EXPORT_DATA);\n\n try {\n // 如果 dataSource 是数组,我们需要将其作为请求体的一部分\n const isDataArray = Array.isArray(request.dataSource);\n\n const requestBody: any = {\n queryParams: request.queryParams,\n fieldMapping: request.fieldMapping,\n filters: request.filters,\n sortBy: request.sortBy,\n pagination: request.pagination,\n customFileName: request.customFileName,\n };\n\n // 支持两种方式:传字符串 ID(服务端从缓存/数据库查找)或传完整配置对象(服务端直接使用)\n if (typeof request.configId === 'string') {\n requestBody.configId = request.configId;\n } else if (request.configId && typeof request.configId === 'object') {\n // 传入完整配置对象时,只设置 config 字段,避免与字符串 configId 产生歧义\n requestBody.config = request.configId;\n }\n\n // 如果是数组数据,直接包含在请求体中\n if (isDataArray) {\n requestBody.data = request.dataSource;\n } else {\n requestBody.dataSource = request.dataSource;\n }\n\n const response = await this.fetchWithTimeout(url, {\n method: 'POST',\n headers: {\n ...this.getHeaders(),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch {\n errorData = { message: errorText };\n }\n throw new Error(errorData.message || '导出失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformExportResultFromAPI(data.result);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.EXPORT_DATA_ERROR,\n '数据导出失败: ' + (formatErrorMessage(error)),\n { request, originalError: error }\n );\n }\n }\n\n /**\n * 查询导出进度\n */\n async getExportProgress(exportId: string): Promise<ExportProgress> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.GET_PROGRESS(exportId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('获取导出进度失败: ' + (response.statusText));\n }\n\n const data = await response.json();\n return this.transformProgressFromAPI(data.progress);\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '获取导出进度失败: ' + (formatErrorMessage(error)),\n { exportId, originalError: error }\n );\n }\n }\n\n /**\n * 下载导出文件\n */\n async downloadExportFile(exportId: string): Promise<Blob> {\n const url = (this.config.baseUrl) + (API_ENDPOINTS.DOWNLOAD_FILE(exportId));\n\n try {\n const response = await this.fetchWithTimeout(url, {\n method: 'GET',\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n throw new Error('下载文件失败: ' + (response.statusText));\n }\n\n return await response.blob();\n } catch (error) {\n throw createExportError(\n ERROR_CODES.NETWORK_ERROR,\n '下载导出文件失败: ' + (formatErrorMessage(error)),\n { exportId, originalError: error }\n );\n }\n }\n\n // ============= 私有辅助方法 =============\n\n /**\n * 获取请求头\n */\n private getHeaders(): Record<string, string> {\n return {\n ...this.config.headers,\n };\n }\n\n /**\n * 带超时的fetch请求\n */\n private async fetchWithTimeout(url: string, options: RequestInit): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n return response;\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n throw createExportError(ERROR_CODES.TIMEOUT_ERROR, '请求超时', {\n url,\n timeout: this.config.timeout,\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * 转换API返回的配置数据\n */\n private transformConfigFromAPI(apiConfig: any): ExportConfig {\n return {\n id: apiConfig.id,\n name: apiConfig.name,\n description: apiConfig.description || undefined,\n format: apiConfig.format,\n fields: apiConfig.fields,\n grouping: apiConfig.grouping,\n fileNameTemplate: apiConfig.fileNameTemplate,\n includeHeader: apiConfig.includeHeader,\n delimiter: apiConfig.delimiter,\n encoding: apiConfig.encoding,\n addBOM: apiConfig.addBOM,\n maxRows: apiConfig.maxRows || undefined,\n createdAt: new Date(apiConfig.createdAt),\n updatedAt: new Date(apiConfig.updatedAt),\n moduleId: apiConfig.moduleId,\n businessId: apiConfig.businessId || undefined,\n createdBy: apiConfig.createdBy || undefined,\n };\n }\n\n /**\n * 转换API返回的配置列表\n */\n private transformConfigsFromAPI(apiConfigs: any[]): ExportConfig[] {\n return apiConfigs.map((config) => this.transformConfigFromAPI(config));\n }\n\n /**\n * 转换API返回的导出结果\n */\n private transformExportResultFromAPI(apiResult: any): ExportResult {\n const fileBlob = this.createFileBlobFromBase64(\n apiResult.fileData ?? apiResult.fileBlob,\n apiResult.fileName\n );\n\n return {\n exportId: apiResult.exportId,\n fileName: apiResult.fileName,\n fileSize: apiResult.fileSize,\n fileUrl: apiResult.fileUrl,\n fileBlob,\n exportedRows: apiResult.exportedRows,\n startTime: new Date(apiResult.startTime),\n endTime: new Date(apiResult.endTime),\n duration: apiResult.duration,\n statistics: apiResult.statistics,\n };\n }\n\n /**\n * 将后端返回的base64文件数据转换为Blob\n */\n private createFileBlobFromBase64(fileData?: string, fileName?: string): Blob | undefined {\n if (!fileData || typeof fileData !== 'string') {\n return undefined;\n }\n\n try {\n if (typeof atob === 'function') {\n const binaryString = atob(fileData);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n\n const arrayBuffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n return new Blob([arrayBuffer], { type: this.getMimeTypeByFileName(fileName) });\n } else if (typeof Buffer !== 'undefined') {\n const bufferBytes = Buffer.from(fileData, 'base64');\n const bytes = Uint8Array.from(bufferBytes);\n const arrayBuffer = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n return new Blob([arrayBuffer], { type: this.getMimeTypeByFileName(fileName) });\n } else {\n return undefined;\n }\n } catch {\n return undefined;\n }\n }\n\n /**\n * 根据文件名推断MIME类型\n */\n private getMimeTypeByFileName(fileName?: string): string {\n const extension = fileName?.split('.').pop()?.toLowerCase();\n\n switch (extension) {\n case 'csv':\n return 'text/csv; charset=utf-8';\n case 'xlsx':\n case 'xls':\n return 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n case 'json':\n return 'application/json; charset=utf-8';\n default:\n return 'application/octet-stream';\n }\n }\n\n /**\n * 转换API返回的进度数据\n */\n private transformProgressFromAPI(apiProgress: any): ExportProgress {\n return {\n exportId: apiProgress.exportId,\n status: apiProgress.status,\n progress: apiProgress.progress,\n processedRows: apiProgress.processedRows,\n totalRows: apiProgress.totalRows,\n startTime: new Date(apiProgress.startTime),\n estimatedEndTime: apiProgress.estimatedEndTime\n ? new Date(apiProgress.estimatedEndTime)\n : undefined,\n currentData: apiProgress.currentData,\n error: apiProgress.error,\n };\n }\n}\n\n// ============= 单例导出 =============\n\n/**\n * 默认客户端实例\n */\nexport const universalExportClient = new UniversalExportClient();\n\n/**\n * 创建自定义客户端实例\n */\nexport function createExportClient(config?: UniversalExportClientConfig): UniversalExportClient {\n return new UniversalExportClient(config);\n}\n","/**\n * 导出配置编辑器组件\n * \n * 提供可视化的导出字段配置编辑功能\n */\n\n'use client';\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport { \n Settings, \n Trash2, \n Eye, \n EyeOff, \n MoveUp, \n MoveDown, \n Save, \n X,\n FileText,\n Calendar,\n Hash,\n CheckSquare,\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Group,\n GitMerge,\n Layers,\n ArrowUpDown,\n FileSpreadsheet,\n Database\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n FieldType, \n FieldAlignment,\n ExportFormat,\n GroupingConfig,\n GroupingField,\n GroupingMode,\n GroupValueProcessing\n} from '../types';\n\n// ============= 类型定义 =============\n\nexport interface ExportConfigEditorProps {\n /** 初始配置 */\n initialConfig?: ExportConfig;\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 保存配置回调 */\n onSave?: (config: ExportConfig) => void;\n /** 取消回调 */\n onCancel?: () => void;\n /** 是否显示 */\n visible?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 配置变化回调(新增/删除/更新) */\n onConfigChange?: () => void;\n}\n\n// ============= 字段类型图标映射 =============\n\nconst FIELD_TYPE_ICONS: Record<FieldType, React.ReactNode> = {\n string: <Type className=\"w-4 h-4\" />,\n number: <Hash className=\"w-4 h-4\" />,\n date: <Calendar className=\"w-4 h-4\" />,\n boolean: <CheckSquare className=\"w-4 h-4\" />,\n array: <FileText className=\"w-4 h-4\" />,\n object: <FileText className=\"w-4 h-4\" />,\n};\n\nconst FIELD_TYPE_LABELS: Record<FieldType, string> = {\n string: '文本',\n number: '数字',\n date: '日期',\n boolean: '布尔',\n array: '数组',\n object: '对象',\n};\n\nconst ALIGNMENT_ICONS: Record<FieldAlignment, React.ReactNode> = {\n left: <AlignLeft className=\"w-4 h-4\" />,\n center: <AlignCenter className=\"w-4 h-4\" />,\n right: <AlignRight className=\"w-4 h-4\" />,\n};\n\nconst ALIGNMENT_LABELS: Record<FieldAlignment, string> = {\n left: '左对齐',\n center: '居中对齐',\n right: '右对齐',\n};\n\n// ============= 分组相关标签 =============\n\nconst GROUPING_MODE_LABELS: Record<GroupingMode, string> = {\n merge: '合并模式',\n separate: '分离模式',\n nested: '嵌套模式',\n};\n\nconst GROUPING_MODE_DESCRIPTIONS: Record<GroupingMode, string> = {\n merge: '同组数据合并显示,Excel支持单元格合并',\n separate: '每个分组独立显示,可添加分组头',\n nested: '支持多级嵌套分组',\n};\n\nconst VALUE_PROCESSING_LABELS: Record<GroupValueProcessing, string> = {\n first: '取第一个值',\n last: '取最后一个值',\n concat: '连接所有值',\n sum: '求和',\n count: '计数',\n custom: '自定义处理',\n};\n\nconst FORMAT_ICONS: Record<ExportFormat, React.ReactNode> = {\n csv: <FileText className=\"w-4 h-4\" />,\n excel: <FileSpreadsheet className=\"w-4 h-4\" />,\n json: <Database className=\"w-4 h-4\" />,\n};\n\nconst FORMAT_DESCRIPTIONS: Record<ExportFormat, string> = {\n csv: '逗号分隔值文件,兼容性最好',\n excel: 'Excel表格文件,支持格式化和单元格合并',\n json: 'JSON数据文件,适合开发者使用',\n};\n\n// ============= 主组件 =============\n\nexport const ExportConfigEditor: React.FC<ExportConfigEditorProps> = ({\n initialConfig,\n moduleId,\n businessId,\n availableFields,\n onSave,\n onCancel,\n visible = false,\n className = '',\n onConfigChange,\n}) => {\n // ============= 状态管理 =============\n \n const [config, setConfig] = useState<ExportConfig>(() => {\n if (initialConfig) {\n return { ...initialConfig };\n }\n \n // 创建默认配置\n return {\n id: '',\n name: '新建导出配置',\n description: '',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n grouping: {\n enabled: false,\n fields: [],\n preserveOrder: true,\n nullValueHandling: 'separate',\n nullGroupName: '未分组'\n },\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n maxRows: undefined,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n });\n\n const [activeTab, setActiveTab] = useState<'basic' | 'fields' | 'grouping' | 'manage'>('basic');\n \n // 配置管理相关状态\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n const [loadingConfigs, setLoadingConfigs] = useState(false);\n const [deletingConfigId, setDeletingConfigId] = useState<string | null>(null);\n\n // 加载已保存的配置\n const loadSavedConfigs = useCallback(async () => {\n if (!visible || activeTab !== 'manage') return;\n \n setLoadingConfigs(true);\n try {\n const params = new URLSearchParams({ moduleId });\n if (businessId) {\n params.set('businessId', businessId);\n }\n \n const response = await fetch('/api/universal-export/configs?' + (params.toString()));\n if (response.ok) {\n const data = await response.json();\n setSavedConfigs(data.configs || []);\n }\n } catch (error) {\n console.error('加载配置异常:', error);\n } finally {\n setLoadingConfigs(false);\n }\n }, [visible, activeTab, moduleId, businessId]);\n\n // 删除配置\n const deleteConfig = useCallback(async (configId: string) => {\n setDeletingConfigId(configId);\n try {\n const response = await fetch('/api/universal-export/configs/' + (configId), {\n method: 'DELETE'\n });\n if (response.ok) {\n setSavedConfigs(prev => prev.filter(cfg => cfg.id !== configId));\n onConfigChange?.();\n }\n } catch (error) {\n console.error('删除配置失败:', error);\n } finally {\n setDeletingConfigId(null);\n }\n }, [onConfigChange]);\n\n // 加载配置到编辑器\n const loadConfigToEditor = useCallback((config: ExportConfig) => {\n setConfig(config);\n setActiveTab('basic');\n }, []);\n\n // 当切换到管理tab时加载配置\n useEffect(() => {\n if (activeTab === 'manage') {\n loadSavedConfigs();\n }\n }, [activeTab, loadSavedConfigs]);\n\n // 阻止背景滚动\n useEffect(() => {\n if (!visible) return;\n \n const scrollY = window.scrollY;\n document.body.style.position = 'fixed';\n document.body.style.top = '-' + (scrollY) + 'px';\n document.body.style.left = '0';\n document.body.style.right = '0';\n document.body.style.overflow = 'hidden';\n \n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onCancel?.();\n }\n };\n \n document.addEventListener('keydown', handleKeyDown);\n \n return () => {\n document.body.style.position = '';\n document.body.style.top = '';\n document.body.style.left = '';\n document.body.style.right = '';\n document.body.style.overflow = '';\n window.scrollTo(0, scrollY);\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [visible, onCancel]);\n\n // ============= 字段管理 =============\n\n const toggleFieldEnabled = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, enabled: !field.enabled }\n : field\n ),\n }));\n }, []);\n\n const updateField = useCallback((fieldKey: string, updates: Partial<ExportField>) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n }));\n }, []);\n\n const moveField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n fields: fields.map((field, idx) => ({ ...field, sortOrder: idx })),\n };\n });\n }, []);\n\n const removeField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n fields: prev.fields.filter(f => f.key !== fieldKey),\n }));\n }, []);\n\n // ============= 分组配置管理 =============\n\n const toggleGrouping = useCallback((enabled: boolean) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n enabled,\n },\n }));\n }, []);\n\n const addGroupingField = useCallback((fieldKey: string) => {\n const field = config.fields.find(f => f.key === fieldKey);\n if (!field) return;\n\n const groupField: GroupingField = {\n key: field.key,\n label: field.label,\n mode: 'merge',\n valueProcessing: 'first',\n showGroupHeader: false,\n mergeCells: true,\n };\n\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: [...prev.grouping!.fields, groupField],\n },\n }));\n }, [config.fields]);\n\n const removeGroupingField = useCallback((fieldKey: string) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.filter(f => f.key !== fieldKey),\n },\n }));\n }, []);\n\n const updateGroupingField = useCallback((fieldKey: string, updates: Partial<GroupingField>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields: prev.grouping!.fields.map(field =>\n field.key === fieldKey\n ? { ...field, ...updates }\n : field\n ),\n },\n }));\n }, []);\n\n const moveGroupingField = useCallback((fieldKey: string, direction: 'up' | 'down') => {\n setConfig(prev => {\n const fields = [...prev.grouping!.fields];\n const index = fields.findIndex(f => f.key === fieldKey);\n \n if (direction === 'up' && index > 0) {\n const temp = fields[index - 1]!;\n fields[index - 1] = fields[index]!;\n fields[index] = temp;\n } else if (direction === 'down' && index < fields.length - 1) {\n const temp = fields[index + 1]!;\n fields[index + 1] = fields[index]!;\n fields[index] = temp;\n }\n \n return {\n ...prev,\n grouping: {\n ...prev.grouping!,\n fields,\n },\n };\n });\n }, []);\n\n const updateGroupingConfig = useCallback((updates: Partial<GroupingConfig>) => {\n setConfig(prev => ({\n ...prev,\n grouping: {\n ...prev.grouping!,\n ...updates,\n },\n }));\n }, []);\n\n // ============= 保存配置 =============\n\n const handleSave = useCallback(() => {\n if (!config.name.trim()) {\n alert('请输入配置名称');\n return;\n }\n\n const enabledFields = config.fields.filter(f => f.enabled);\n if (enabledFields.length === 0) {\n alert('至少需要启用一个字段');\n return;\n }\n\n const updatedConfig: ExportConfig = {\n ...config,\n updatedAt: new Date(),\n };\n\n onSave?.(updatedConfig);\n onConfigChange?.();\n }, [config, onSave, onConfigChange]);\n\n // ============= 渲染组件 =============\n\n if (!visible) {\n return null;\n }\n\n const tabs = [\n { id: 'basic' as const, label: '基本配置', icon: <Settings className=\"w-4 h-4\" />, description: '配置名称、格式和基本选项' },\n { id: 'fields' as const, label: '字段设置', icon: <Type className=\"w-4 h-4\" />, description: '选择和配置导出字段' },\n { id: 'grouping' as const, label: '分组设置', icon: <Group className=\"w-4 h-4\" />, description: '配置数据分组和合并选项' },\n { id: 'manage' as const, label: '配置管理', icon: <Database className=\"w-4 h-4\" />, description: '管理已保存的导出配置' },\n ];\n\n return (\n <div \n className={clsx('fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-[50] p-4', className)}\n onClick={onCancel}\n >\n <div \n className=\"bg-white rounded-lg shadow-xl w-full max-w-5xl max-h-[90vh] flex flex-col\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 头部 */}\n <div className=\"flex items-center justify-between p-4 border-b flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <Settings className=\"w-6 h-6 text-blue-600\" />\n <div>\n <h2 className=\"text-xl font-semibold text-gray-900\">导出配置编辑器</h2>\n <p className=\"text-sm text-gray-600\">配置导出字段和格式选项</p>\n </div>\n </div>\n <button onClick={onCancel} className=\"p-2 text-gray-400 hover:text-gray-600 hover:bg-gray-100 rounded-lg\">\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n\n {/* Tab导航 */}\n <div className=\"border-b bg-gray-50 flex-shrink-0\">\n <nav className=\"flex space-x-1 p-2\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveTab(tab.id)}\n className={clsx('flex items-center gap-2 px-4 py-3 text-sm font-medium rounded-lg transition-colors', activeTab === tab.id ? 'bg-white text-blue-600 shadow-sm border border-gray-200' : 'text-gray-600 hover:text-gray-900')}\n >\n {tab.icon}\n <span>{tab.label}</span>\n </button>\n ))}\n </nav>\n </div>\n\n {/* Tab内容 */}\n <div className=\"flex-1 overflow-hidden flex flex-col\">\n <div className=\"bg-blue-50 border-b border-blue-100 p-4 flex-shrink-0\">\n <div className=\"flex items-center gap-2 text-blue-800 text-sm font-medium\">\n {tabs.find(t => t.id === activeTab)?.icon}\n {tabs.find(t => t.id === activeTab)?.description}\n </div>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4 sm:p-6\">\n {activeTab === 'basic' && (\n <div className=\"max-w-2xl mx-auto space-y-6\">\n <div className=\"space-y-4\">\n <label className=\"block text-sm font-medium text-gray-700\">配置名称 *</label>\n <input\n type=\"text\"\n value={config.name}\n onChange={(e) => setConfig(prev => ({ ...prev, name: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n />\n <label className=\"block text-sm font-medium text-gray-700\">描述</label>\n <textarea\n value={config.description}\n onChange={(e) => setConfig(prev => ({ ...prev, description: e.target.value }))}\n className=\"w-full px-3 py-2 border border-gray-300 rounded-lg\"\n rows={3}\n />\n <label className=\"block text-sm font-medium text-gray-700\">导出格式</label>\n <div className=\"space-y-3\">\n {(['csv', 'excel', 'json'] as ExportFormat[]).map((format) => (\n <label key={format} className=\"flex items-start gap-3 p-3 border rounded-lg cursor-pointer hover:border-blue-300\">\n <input\n type=\"radio\"\n checked={config.format === format}\n onChange={() => setConfig(prev => ({ ...prev, format }))}\n className=\"mt-1\"\n />\n <div>\n <div className=\"flex items-center gap-2 font-medium\">\n {FORMAT_ICONS[format]} {format.toUpperCase()}\n </div>\n <p className=\"text-sm text-gray-600\">{FORMAT_DESCRIPTIONS[format]}</p>\n </div>\n </label>\n ))}\n </div>\n </div>\n </div>\n )}\n\n {activeTab === 'fields' && (\n <div className=\"space-y-4\">\n {config.fields.map((field, index) => (\n <div key={field.key} className=\"flex items-center gap-3 p-3 border rounded-lg bg-white\">\n <button onClick={() => toggleFieldEnabled(field.key)} className={field.enabled ? 'text-blue-600' : 'text-gray-400'}>\n {field.enabled ? <Eye className=\"w-4 h-4\" /> : <EyeOff className=\"w-4 h-4\" />}\n </button>\n <div className=\"flex-1\">\n <div className=\"font-medium\">{field.label}</div>\n <div className=\"text-xs text-gray-500\">{field.key}</div>\n </div>\n <div className=\"flex gap-1\">\n <button onClick={() => moveField(field.key, 'up')} disabled={index === 0} className=\"disabled:opacity-30\"><MoveUp className=\"w-4 h-4\" /></button>\n <button onClick={() => moveField(field.key, 'down')} disabled={index === config.fields.length - 1} className=\"disabled:opacity-30\"><MoveDown className=\"w-4 h-4\" /></button>\n <button onClick={() => removeField(field.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {activeTab === 'grouping' && (\n <div className=\"space-y-6\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-medium flex items-center gap-2\"><Group className=\"w-5 h-5 text-blue-600\" /> 分组配置</h3>\n <label className=\"flex items-center gap-2\">\n <input type=\"checkbox\" checked={config.grouping?.enabled} onChange={(e) => toggleGrouping(e.target.checked)} />\n 启用分组\n </label>\n </div>\n {config.grouping?.enabled && (\n <div className=\"space-y-4\">\n {config.grouping.fields.map((gf, index) => (\n <div key={gf.key} className=\"p-4 border rounded-lg bg-blue-50 border-blue-200\">\n <div className=\"flex justify-between items-center mb-4\">\n <span className=\"font-medium text-blue-900\">{gf.label}</span>\n <button onClick={() => removeGroupingField(gf.key)} className=\"text-red-600\"><Trash2 className=\"w-4 h-4\" /></button>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <select value={gf.mode} onChange={(e) => updateGroupingField(gf.key, { mode: e.target.value as GroupingMode })} className=\"border rounded p-2\">\n <option value=\"merge\">合并模式</option>\n <option value=\"separate\">分离模式</option>\n <option value=\"nested\">嵌套模式</option>\n </select>\n <select value={gf.valueProcessing} onChange={(e) => updateGroupingField(gf.key, { valueProcessing: e.target.value as GroupValueProcessing })} className=\"border rounded p-2\">\n <option value=\"first\">首值</option>\n <option value=\"sum\">求和</option>\n <option value=\"count\">计数</option>\n </select>\n </div>\n </div>\n ))}\n <select onChange={(e) => e.target.value && addGroupingField(e.target.value)} className=\"w-full border rounded p-2\">\n <option value=\"\">添加分组字段...</option>\n {config.fields.filter(f => f.enabled && !config.grouping?.fields.some(gf => gf.key === f.key)).map(f => (\n <option key={f.key} value={f.key}>{f.label}</option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'manage' && (\n <div className=\"space-y-4\">\n {loadingConfigs ? <div className=\"text-center py-10\">加载中...</div> : savedConfigs.map(sc => (\n <div key={sc.id} className=\"flex justify-between items-center p-4 border rounded-lg\">\n <div>\n <div className=\"font-medium\">{sc.name}</div>\n <div className=\"text-sm text-gray-500\">{sc.format}</div>\n </div>\n <div className=\"flex gap-2\">\n <button onClick={() => loadConfigToEditor(sc)} className=\"text-blue-600 px-3 py-1 border rounded\">编辑</button>\n <button onClick={() => deleteConfig(sc.id)} className=\"text-red-600 px-3 py-1 border rounded\">删除</button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* 底部 */}\n <div className=\"flex justify-end gap-3 p-4 border-t bg-gray-50\">\n <button onClick={onCancel} className=\"px-4 py-2 border rounded\">取消</button>\n {activeTab !== 'manage' && (\n <button onClick={handleSave} className=\"px-4 py-2 bg-blue-600 text-white rounded flex items-center gap-2\">\n <Save className=\"w-4 h-4\" /> 保存配置\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n\n","/**\n * 通用导出按钮组件\n * \n * 提供统一的导出功能入口,支持配置化导出\n */\n\n'use client';\n\nimport React, { useState, useCallback } from 'react';\nimport { clsx } from 'clsx';\nimport { \n Download, \n Settings, \n FileText, \n Loader2,\n ChevronDown\n} from 'lucide-react';\n\nimport type { \n ExportConfig, \n ExportField, \n ExportRequest,\n ExportResult,\n ExportProgress \n} from '../types';\n\nimport { ExportConfigEditor } from './ExportConfigEditor';\n\n// ============= 类型定义 =============\n\nexport interface UniversalExportButtonProps {\n /** 导出服务实例 */\n exportService: any; // UniversalExportClient\n /** 模块标识 */\n moduleId: string;\n /** 业务标识 */\n businessId?: string;\n /** 可用的字段定义 */\n availableFields: ExportField[];\n /** 数据源函数 */\n dataSource: () => Promise<any[]>;\n /** 默认配置 */\n defaultConfig?: ExportConfig;\n /** 按钮文本 */\n buttonText?: string;\n /** 按钮样式 */\n variant?: 'primary' | 'secondary' | 'outline';\n /** 按钮大小 */\n size?: 'sm' | 'md' | 'lg';\n /** 是否禁用 */\n disabled?: boolean;\n /** 自定义样式类名 */\n className?: string;\n /** 导出成功回调 */\n onExportSuccess?: (result: ExportResult) => void;\n /** 导出失败回调 */\n onExportError?: (error: string) => void;\n /** 配置保存回调 */\n onConfigSave?: (config: ExportConfig) => void;\n}\n\n// ============= 按钮样式配置 =============\n\nconst BUTTON_STYLES = {\n primary: {\n sm: 'px-3 py-1.5 text-sm bg-blue-600 text-white hover:bg-blue-700',\n md: 'px-4 py-2 text-sm bg-blue-600 text-white hover:bg-blue-700',\n lg: 'px-6 py-3 text-base bg-blue-600 text-white hover:bg-blue-700',\n },\n secondary: {\n sm: 'px-3 py-1.5 text-sm bg-gray-600 text-white hover:bg-gray-700',\n md: 'px-4 py-2 text-sm bg-gray-600 text-white hover:bg-gray-700',\n lg: 'px-6 py-3 text-base bg-gray-600 text-white hover:bg-gray-700',\n },\n outline: {\n sm: 'px-3 py-1.5 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n md: 'px-4 py-2 text-sm border border-gray-300 text-gray-700 hover:bg-gray-50',\n lg: 'px-6 py-3 text-base border border-gray-300 text-gray-700 hover:bg-gray-50',\n },\n};\n\n// ============= 主组件 =============\n\nexport const UniversalExportButton: React.FC<UniversalExportButtonProps> = ({\n exportService,\n moduleId,\n businessId,\n availableFields,\n dataSource,\n defaultConfig,\n buttonText = '导出数据',\n variant = 'primary',\n size = 'md',\n disabled = false,\n className = '',\n onExportSuccess,\n onExportError,\n onConfigSave,\n}) => {\n // ============= 状态管理 =============\n \n const [showConfigEditor, setShowConfigEditor] = useState(false);\n const [showDropdown, setShowDropdown] = useState(false);\n const [isExporting, setIsExporting] = useState(false);\n const [exportProgress, setExportProgress] = useState<ExportProgress | null>(null);\n const [savedConfigs, setSavedConfigs] = useState<ExportConfig[]>([]);\n\n // 加载保存的配置\n const loadSavedConfigs = useCallback(async () => {\n try {\n if (exportService) {\n const configs = await exportService.getConfigsByModule(moduleId, businessId);\n setSavedConfigs(configs);\n }\n } catch (error) {\n console.error('加载保存的配置失败:', error);\n }\n }, [exportService, moduleId, businessId]);\n\n // 组件挂载时加载配置\n React.useEffect(() => {\n loadSavedConfigs();\n }, [loadSavedConfigs]);\n\n // ============= 导出处理 =============\n\n const handleExport = useCallback(async (config: ExportConfig) => {\n console.log('🚀 [UniversalExportButton] 开始导出:', {\n configId: config.id,\n configName: config.name,\n format: config.format,\n fieldsCount: config.fields.length,\n });\n\n if (!exportService) {\n console.error('❌ [UniversalExportButton] 导出服务未初始化');\n onExportError?.('导出服务未初始化');\n return;\n }\n\n setIsExporting(true);\n setExportProgress(null);\n\n try {\n // 获取数据\n console.log('📊 [UniversalExportButton] 获取数据...');\n const data = await dataSource();\n console.log('✅ [UniversalExportButton] 数据获取成功:', {\n dataType: typeof data,\n isArray: Array.isArray(data),\n length: Array.isArray(data) ? data.length : 'N/A',\n });\n\n // 创建导出请求(不包含回调,因为客户端不支持)\n const request = {\n configId: config,\n dataSource: data, // 传递实际数据而不是函数\n queryParams: undefined,\n fieldMapping: undefined,\n filters: undefined,\n sortBy: undefined,\n pagination: undefined,\n customFileName: undefined,\n };\n\n console.log('📞 [UniversalExportButton] 调用导出服务...');\n const result = await exportService.exportData(request);\n\n console.log('✅ [UniversalExportButton] 导出成功:', {\n fileName: result.fileName,\n fileSize: result.fileSize,\n exportedRows: result.exportedRows,\n });\n\n // 由于客户端不支持进度回调,我们模拟一个完成状态\n const progress: ExportProgress = {\n exportId: result.exportId,\n status: 'completed',\n progress: 100,\n processedRows: result.exportedRows,\n totalRows: result.exportedRows,\n startTime: result.startTime,\n estimatedEndTime: result.endTime,\n };\n setExportProgress(progress);\n\n // 下载文件\n if (result.fileUrl) {\n console.log('📥 [UniversalExportButton] 从URL下载文件...');\n const link = document.createElement('a');\n link.href = result.fileUrl;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n console.log('✅ [UniversalExportButton] 文件下载完成');\n } else if (result.fileBlob) {\n console.log('📥 [UniversalExportButton] 从Blob下载文件...');\n const url = window.URL.createObjectURL(result.fileBlob);\n const link = document.createElement('a');\n link.href = url;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n console.log('✅ [UniversalExportButton] 文件下载完成');\n } else if (result.exportId && typeof exportService.downloadExportFile === 'function') {\n console.log('📥 [UniversalExportButton] 从exportId兜底下载文件...');\n const blob = await exportService.downloadExportFile(result.exportId);\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = result.fileName;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n console.log('✅ [UniversalExportButton] 文件下载完成(兜底分支)');\n } else {\n console.warn('⚠️ [UniversalExportButton] 导出成功但缺少可下载文件信息:', result);\n }\n\n // 延迟清除进度状态\n setTimeout(() => {\n setIsExporting(false);\n setExportProgress(null);\n }, 1000);\n\n onExportSuccess?.(result);\n } catch (error) {\n console.error('❌ [UniversalExportButton] 导出异常:', error);\n setIsExporting(false);\n setExportProgress(null);\n\n // 更好地处理错误信息\n let errorMessage = '导出失败';\n if (error && typeof error === 'object') {\n if ('message' in error && typeof error.message === 'string') {\n errorMessage = error.message;\n } else if ('code' in error && 'message' in error) {\n errorMessage = (error.code) + ': ' + (error.message);\n }\n } else if (typeof error === 'string') {\n errorMessage = error;\n }\n\n onExportError?.(errorMessage);\n }\n }, [exportService, dataSource, onExportSuccess, onExportError]);\n\n const handleQuickExport = useCallback(async () => {\n if (defaultConfig) {\n await handleExport(defaultConfig);\n } else {\n // 创建默认配置\n const config: ExportConfig = {\n id: 'quick_export',\n name: '快速导出',\n description: '使用默认配置快速导出',\n format: 'csv',\n fields: availableFields.map((field, index) => ({\n ...field,\n enabled: true,\n sortOrder: index,\n })),\n fileNameTemplate: '导出数据_{date}',\n includeHeader: true,\n delimiter: ',',\n encoding: 'utf-8',\n addBOM: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n moduleId,\n businessId,\n };\n \n await handleExport(config);\n }\n }, [defaultConfig, availableFields, moduleId, businessId, handleExport]);\n\n // ============= 配置管理 =============\n\n const handleConfigSave = useCallback(async (config: ExportConfig) => {\n try {\n if (exportService) {\n const savedConfig = await exportService.createConfig(config);\n // 重新加载配置列表\n await loadSavedConfigs();\n onConfigSave?.(savedConfig);\n }\n setShowConfigEditor(false);\n } catch (error) {\n onExportError?.(error instanceof Error ? error.message : '保存配置失败');\n }\n }, [exportService, onConfigSave, onExportError, loadSavedConfigs]);\n\n // ============= 渲染进度 =============\n\n const renderProgress = () => {\n if (!exportProgress) return null;\n\n const { status, progress, processedRows, totalRows } = exportProgress;\n\n return (\n <div className=\"absolute top-full left-0 right-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg p-4 z-[10]\">\n <div className=\"flex items-center gap-3 mb-2\">\n <Loader2 className=\"w-4 h-4 animate-spin text-blue-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {status === 'processing' ? '正在导出...' : '导出完成'}\n </span>\n </div>\n \n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-xs text-gray-600\">\n <span>进度: {progress}%</span>\n <span>{processedRows} / {totalRows} 行</span>\n </div>\n \n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div \n className=\"bg-blue-600 h-2 rounded-full transition-all duration-300\"\n style={{ width: (progress) + '%' }}\n />\n </div>\n </div>\n </div>\n );\n };\n\n // ============= 渲染下拉菜单 =============\n\n const renderDropdown = () => {\n if (!showDropdown) return null;\n\n return (\n <div className=\"absolute top-full left-0 mt-2 bg-white border border-gray-200 rounded-lg shadow-lg py-2 z-[10] min-w-48\">\n {/* 快速导出 */}\n <button\n onClick={() => {\n setShowDropdown(false);\n handleQuickExport();\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Download className=\"w-4 h-4\" />\n 快速导出\n </button>\n\n {/* 使用保存的配置 */}\n {savedConfigs.length > 0 && (\n <>\n <div className=\"border-t border-gray-200 my-1\" />\n {savedConfigs.map((config) => (\n <button\n key={config.id}\n onClick={() => {\n setShowDropdown(false);\n handleExport(config);\n }}\n disabled={isExporting}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <FileText className=\"w-4 h-4\" />\n {config.name}\n </button>\n ))}\n </>\n )}\n\n {/* 配置编辑器 */}\n <div className=\"border-t border-gray-200 my-1\" />\n <button\n onClick={() => {\n setShowDropdown(false);\n setShowConfigEditor(true);\n }}\n className=\"w-full px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-50 flex items-center gap-2\"\n >\n <Settings className=\"w-4 h-4\" />\n 自定义配置\n </button>\n </div>\n );\n };\n\n // ============= 渲染组件 =============\n\n const buttonStyle = BUTTON_STYLES[variant][size];\n const baseClasses = 'inline-flex items-center gap-2 rounded-lg font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed ' + (buttonStyle);\n\n return (\n <div className={clsx('relative', className)}>\n {/* 主按钮 */}\n <button\n onClick={() => setShowDropdown(!showDropdown)}\n disabled={disabled || isExporting}\n className={clsx(baseClasses, isExporting ? 'cursor-not-allowed' : '')}\n >\n {isExporting ? (\n <Loader2 className=\"w-4 h-4 animate-spin\" />\n ) : (\n <Download className=\"w-4 h-4\" />\n )}\n <span>{isExporting ? '导出中...' : buttonText}</span>\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n\n {/* 下拉菜单 */}\n {renderDropdown()}\n\n {/* 进度显示 */}\n {renderProgress()}\n\n {/* 配置编辑器 */}\n <ExportConfigEditor\n moduleId={moduleId}\n businessId={businessId}\n availableFields={availableFields}\n onSave={handleConfigSave}\n onCancel={() => setShowConfigEditor(false)}\n visible={showConfigEditor}\n onConfigChange={loadSavedConfigs}\n />\n\n {/* 点击外部关闭下拉菜单 */}\n {showDropdown && (\n <div\n className=\"fixed inset-0 z-[0]\"\n onClick={() => setShowDropdown(false)}\n />\n )}\n </div>\n );\n};\n\n","/**\n * @package sa2kit/common/auth\n *\n * Browser / client 安全入口(Better Auth 3.0)\n */\nexport { createSa2kitAuthClient, type Sa2kitAuthClient, type Sa2kitAuthClientOptions } from './client';\nexport { useSession, type UseSessionReturn } from './hooks/useSession';\n\n/** @deprecated 3.0 请使用 createSa2kitAuthClient + useSession */\nexport { useAuth, useAuthForm } from './hooks/useAuth';\n/** @deprecated 3.0 请使用 createSa2kitAuthClient */\nexport { BaseApiClient, API_ROUTES, STORAGE_KEYS } from './client';\n\nexport type { LoginFormState, RegisterFormState } from './components/types';\nexport * from './types';\n","/**\n * Better Auth 客户端(vanilla — RN / 小程序 / Node fetch)\n */\nimport { createAuthClient } from 'better-auth/client';\nimport { emailOTPClient } from 'better-auth/client/plugins';\nimport { phoneNumberClient } from 'better-auth/client/plugins';\n\nexport type Sa2kitAuthClientOptions = {\n baseURL: string;\n basePath?: string;\n};\n\nfunction buildSa2kitAuthClient(options: Sa2kitAuthClientOptions) {\n return createAuthClient({\n baseURL: options.baseURL.replace(/\\/+$/, ''),\n basePath: options.basePath ?? '/api/auth',\n plugins: [emailOTPClient(), phoneNumberClient()],\n });\n}\n\nexport type Sa2kitAuthClient = ReturnType<typeof buildSa2kitAuthClient>;\n\nexport function createSa2kitAuthClient(options: Sa2kitAuthClientOptions): Sa2kitAuthClient {\n return buildSa2kitAuthClient(options);\n}\n","/**\n * Auth Client - Types\n * API 客户端类型定义\n */\n\nimport type { UserRole, User, ApiResponse, AuthResponse } from '../types';\n\nexport type { UserRole, User, ApiResponse, AuthResponse };\n\n/**\n * 存储键名\n */\nexport const STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n} as const;\n\n/**\n * API 路由\n */\nexport const API_ROUTES = {\n AUTH: {\n LOGIN: '/auth/login',\n REGISTER: '/auth/register',\n LOGOUT: '/auth/logout',\n ME: '/auth/me',\n },\n} as const;\n\n","/**\n * Auth Client - Base API Client\n * 基础 API 客户端\n */\n\nimport type { StorageAdapter } from '../../storage';\nimport type { RequestAdapter, RequestConfig } from '../../request';\nimport { API_ROUTES, STORAGE_KEYS, type ApiResponse, type User, type AuthResponse } from './types';\nimport type { IAuthClient } from '../types';\n\n/**\n * 基础 API 客户端\n * 提供统一的 API 调用逻辑,通过适配器模式支持多平台\n *\n * @example\n * ```typescript\n * import { BaseApiClient } from '@qhr123/sa2kit/common/auth/client';\n * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';\n * import { WebRequestAdapter } from '@qhr123/sa2kit/request';\n *\n * const apiClient = new BaseApiClient(\n * new WebStorageAdapter(),\n * new WebRequestAdapter(),\n * '/api'\n * );\n *\n * await apiClient.init();\n * const result = await apiClient.login('user@example.com', 'password');\n * ```\n */\nexport class BaseApiClient implements IAuthClient {\n private token: string | null = null;\n private user: User | null = null;\n\n constructor(\n private storage: StorageAdapter,\n private request: RequestAdapter,\n private baseUrl: string\n ) {}\n\n /**\n * 初始化 - 从存储中加载 token 和用户信息\n */\n async init(): Promise<void> {\n try {\n this.token = await this.storage.getItem(STORAGE_KEYS.AUTH_TOKEN);\n const userData = await this.storage.getItem(STORAGE_KEYS.USER_DATA);\n if (userData) {\n this.user = JSON.parse(userData);\n }\n } catch (error) {\n console.error('Failed to load auth data:', error);\n }\n }\n\n /**\n * 设置认证 token\n */\n async setToken(token: string | null): Promise<void> {\n this.token = token;\n if (token) {\n await this.storage.setItem(STORAGE_KEYS.AUTH_TOKEN, token);\n } else {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n }\n }\n\n /**\n * 设置用户信息\n */\n async setUser(user: User | null): Promise<void> {\n this.user = user;\n if (user) {\n await this.storage.setItem(STORAGE_KEYS.USER_DATA, JSON.stringify(user));\n } else {\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n }\n }\n\n /**\n * 获取当前 token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * 获取当前用户\n */\n getUser(): User | null {\n return this.user;\n }\n\n /**\n * 检查是否已登录\n */\n async isAuthenticated(): Promise<boolean> {\n return !!this.token;\n }\n\n /**\n * 清除用户数据\n */\n async clearUserData(): Promise<void> {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n this.token = null;\n this.user = null;\n }\n\n /**\n * 发送请求的通用方法\n */\n private async sendRequest<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n };\n\n // 添加认证 token\n if (this.token) {\n headers['Authorization'] = 'Bearer ' + (this.token);\n }\n\n const response = await this.request.request<ApiResponse<T>>({\n ...config,\n url: (this.baseUrl) + (config.url),\n headers,\n });\n\n return response;\n } catch (error) {\n console.error('API request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络错误,请重试',\n };\n }\n }\n\n // ==================== 认证相关 API ====================\n\n /**\n * 用户注册\n */\n async register(\n email: string,\n password: string,\n username: string\n ): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.REGISTER,\n method: 'POST',\n body: { email, password, username },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n }\n\n return response;\n }\n\n /**\n * 用户登录\n */\n async login(email: string, password: string): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.LOGIN,\n method: 'POST',\n body: { email, password },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n\n // 触发自定义事件通知登录成功\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('user_login_success', {\n detail: {\n userId: response.data.user.id,\n email: response.data.user.email,\n role: response.data.user.role,\n },\n })\n );\n }\n }\n\n return response;\n }\n\n /**\n * 用户退出登录\n */\n async logout(): Promise<void> {\n await this.sendRequest<void>({\n url: API_ROUTES.AUTH.LOGOUT,\n method: 'POST',\n });\n\n // 无论成功与否,都清除本地数据\n await this.clearUserData();\n }\n\n /**\n * 获取当前用户信息\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n const response = await this.sendRequest<any>({\n url: API_ROUTES.AUTH.ME,\n method: 'GET',\n });\n\n // 统一处理响应格式\n if (response.success && response.data) {\n const userData = response.data.user || response.data;\n await this.setUser(userData);\n return {\n ...response,\n data: userData,\n };\n }\n\n return response;\n }\n\n // ==================== 通用方法 ====================\n\n /**\n * 发送 GET 请求\n */\n async get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'GET', params });\n }\n\n /**\n * 发送 POST 请求\n */\n async post<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'POST', body });\n }\n\n /**\n * 发送 PUT 请求\n */\n async put<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PUT', body });\n }\n\n /**\n * 发送 DELETE 请求\n */\n async delete<T = any>(url: string): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'DELETE' });\n }\n}\n\n","'use client';\n\nimport type { Sa2kitAuthClient } from '../react';\n\n/**\n * 薄封装 Better Auth React `useSession`\n */\nexport function useSession(authClient: Sa2kitAuthClient) {\n return authClient.useSession();\n}\n\nexport type UseSessionReturn = ReturnType<typeof useSession>;\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { User, IAuthClient as BaseApiClient, AuthResult, UseAuthReturn } from '../types';\n\nexport type { User, BaseApiClient, AuthResult, UseAuthReturn };\n\nexport function useAuth(apiClient: BaseApiClient): UseAuthReturn {\n const [user, setUser] = useState<User | null>(null);\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [loading, setLoading] = useState(false);\n const [checkingAuth, setCheckingAuth] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * 检查认证状态\n */\n const checkAuthStatus = useCallback(async () => {\n try {\n setCheckingAuth(true);\n setError(null);\n\n const isAuth = await apiClient.isAuthenticated();\n\n if (isAuth) {\n // 验证 token 并获取用户信息\n const response = await apiClient.getCurrentUser();\n\n if (response.success && response.data) {\n setUser(response.data);\n setIsLoggedIn(true);\n } else {\n // Token 无效,清除登录状态\n await apiClient.clearUserData();\n setUser(null);\n setIsLoggedIn(false);\n }\n } else {\n setUser(null);\n setIsLoggedIn(false);\n }\n } catch (err) {\n console.error('检查登录状态失败:', err);\n setError(err instanceof Error ? err.message : '检查登录状态失败');\n setUser(null);\n setIsLoggedIn(false);\n } finally {\n setCheckingAuth(false);\n }\n }, [apiClient]);\n\n /**\n * 用户登录\n */\n const login = useCallback(\n async (email: string, password: string): Promise<AuthResult> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.login(email, password);\n\n if (response.success && response.data) {\n setUser(response.data.user);\n setIsLoggedIn(true);\n return { success: true };\n } else {\n const errorMsg = response.error || '登录失败';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '登录失败,请重试';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n } finally {\n setLoading(false);\n }\n },\n [apiClient]\n );\n\n /**\n * 用户注册\n */\n const register = useCallback(\n async (email: string, password: string, username: string): Promise<AuthResult> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.register(email, password, username);\n\n if (response.success && response.data) {\n setUser(response.data.user);\n setIsLoggedIn(true);\n return { success: true };\n } else {\n const errorMsg = response.error || '注册失败';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '注册失败,请重试';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n } finally {\n setLoading(false);\n }\n },\n [apiClient]\n );\n\n /**\n * 用户登出\n */\n const logout = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n await apiClient.logout();\n setUser(null);\n setIsLoggedIn(false);\n } catch (err) {\n console.error('登出失败:', err);\n setError(err instanceof Error ? err.message : '登出失败');\n // 即使登出失败,也清除本地状态\n setUser(null);\n setIsLoggedIn(false);\n } finally {\n setLoading(false);\n }\n }, [apiClient]);\n\n /**\n * 清除错误信息\n */\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n // 组件挂载时检查认证状态\n useEffect(() => {\n checkAuthStatus();\n }, [checkAuthStatus]);\n\n return {\n // 状态\n user,\n isLoggedIn,\n loading,\n checkingAuth,\n error,\n\n // 操作方法\n login,\n register,\n logout,\n refresh: checkAuthStatus,\n clearError,\n };\n}\n\n/**\n * 表单验证 Hook\n *\n * @example\n * ```typescript\n * const { values, errors, handleChange, handleBlur, validate } = useAuthForm({\n * email: '',\n * password: ''\n * })\n * ```\n */\nexport function useAuthForm<T extends Record<string, any>>(initialValues: T) {\n const [values, setValues] = useState<T>(initialValues);\n const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});\n const [touched, setTouched] = useState<Partial<Record<keyof T, boolean>>>({});\n\n const handleChange = useCallback(\n (field: keyof T, value: any) => {\n setValues((prev: T) => ({ ...prev, [field]: value }));\n // 清除该字段的错误\n if (errors[field]) {\n setErrors((prev: Partial<Record<keyof T, string>>) => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n },\n [errors]\n );\n\n const handleBlur = useCallback((field: keyof T) => {\n setTouched((prev: Partial<Record<keyof T, boolean>>) => ({ ...prev, [field]: true }));\n }, []);\n\n const validate = useCallback(\n (validationRules: Partial<Record<keyof T, (value: any) => string | undefined>>) => {\n const newErrors: Partial<Record<keyof T, string>> = {};\n\n Object.keys(validationRules).forEach((key) => {\n const field = key as keyof T;\n const rule = validationRules[field];\n if (rule) {\n const error = rule(values[field]);\n if (error) {\n newErrors[field] = error;\n }\n }\n });\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n },\n [values]\n );\n\n const reset = useCallback(() => {\n setValues(initialValues);\n setErrors({});\n setTouched({});\n }, [initialValues]);\n\n return {\n values,\n errors,\n touched,\n handleChange,\n handleBlur,\n validate,\n reset,\n setValues,\n setErrors,\n };\n}\n\n","/**\n * @package sa2kit/common/platform\n *\n * 跨平台运行时适配(storage / fetch / filePick)\n */\nexport type {\n PlatformAdapter,\n PlatformId,\n FilePickAdapter,\n FilePickOptions,\n PickedFile,\n} from './types';\n\nexport {\n createWebPlatformAdapter,\n createTaroPlatformAdapter,\n createElectronPlatformAdapter,\n createNodeHonoPlatformAdapter,\n} from './adapters';\n","import { WebRequestAdapter } from '../../../request/adapters/web-adapter';\nimport { WebStorageAdapter } from '../../../storage/adapters/web-adapter';\nimport type {\n FilePickAdapter,\n FilePickOptions,\n PlatformAdapter,\n PickedFile,\n} from '../types';\n\nfunction createWebFilePickAdapter(): FilePickAdapter {\n return {\n async pickFiles(options?: FilePickOptions): Promise<PickedFile[]> {\n if (typeof document === 'undefined') {\n throw new Error('[PlatformAdapter:web] filePick 需要浏览器 document');\n }\n\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.style.display = 'none';\n if (options?.accept) {\n input.accept = options.accept;\n }\n if (options?.multiple) {\n input.multiple = true;\n }\n\n input.onchange = () => {\n const files = Array.from(input.files ?? []);\n input.remove();\n resolve(\n files.map(file => ({\n name: file.name,\n mimeType: file.type || undefined,\n size: file.size,\n blob: file,\n })),\n );\n };\n\n input.oncancel = () => {\n input.remove();\n resolve([]);\n };\n\n document.body.appendChild(input);\n input.click();\n input.addEventListener('error', () => {\n input.remove();\n reject(new Error('[PlatformAdapter:web] filePick 失败'));\n });\n });\n },\n };\n}\n\n/** 浏览器 / Next.js CSR 官方 adapter */\nexport function createWebPlatformAdapter(\n options: { filePick?: boolean } = {},\n): PlatformAdapter {\n return {\n storage: new WebStorageAdapter(),\n fetch: new WebRequestAdapter(),\n filePick: options.filePick === false ? undefined : createWebFilePickAdapter(),\n };\n}\n","import type { PlatformAdapter } from '../types';\n\n/**\n * Taro 小程序 adapter 骨架(R2-222)\n *\n * 宿主需传入已初始化的 Taro storage / request 实现。\n */\nexport function createTaroPlatformAdapter(partial: PlatformAdapter): PlatformAdapter {\n if (!partial.storage || !partial.fetch) {\n throw new Error(\n '[PlatformAdapter:taro] 请注入 storage 与 fetch(基于 Taro.getStorage / Taro.request)',\n );\n }\n return {\n storage: partial.storage,\n fetch: partial.fetch,\n filePick: partial.filePick,\n };\n}\n","import { WebRequestAdapter } from '../../../request/adapters/web-adapter';\nimport { ElectronStorageAdapter } from '../../../storage/adapters/electron-adapter';\nimport { createWebPlatformAdapter } from './web';\nimport type { PlatformAdapter } from '../types';\n\n/**\n * Electron 桌面 adapter 骨架(R2-222)\n *\n * 默认复用 Web fetch + Electron storage;filePick 回退 Web input。\n */\nexport function createElectronPlatformAdapter(\n options: { filePick?: boolean } = {},\n): PlatformAdapter {\n try {\n return {\n storage: new ElectronStorageAdapter(),\n fetch: new WebRequestAdapter(),\n filePick:\n options.filePick === false\n ? undefined\n : createWebPlatformAdapter({ filePick: true }).filePick,\n };\n } catch {\n return createWebPlatformAdapter(options);\n }\n}\n","import type { FilePickAdapter, PlatformAdapter } from '../types';\nimport type { RequestAdapter } from '../../../request/types/types';\nimport type { StorageAdapter } from '../../../storage/types';\n\n/** 内存 storage,适用于无持久化需求的 Node / Hono SSR */\nclass MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n async getItem(key: string): Promise<string | null> {\n return this.store.get(key) ?? null;\n }\n\n async setItem(key: string, value: string): Promise<void> {\n this.store.set(key, value);\n }\n\n async removeItem(key: string): Promise<void> {\n this.store.delete(key);\n }\n}\n\n/** 基于全局 fetch 的 Node 请求适配器 */\nclass NodeFetchAdapter implements RequestAdapter {\n async request<T>(config: {\n url: string;\n method?: string;\n headers?: Record<string, string>;\n body?: unknown;\n params?: Record<string, unknown>;\n }): Promise<T> {\n let fullUrl = config.url;\n if (config.params) {\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(config.params)) {\n if (value !== undefined && value !== null) {\n search.append(key, String(value));\n }\n }\n const qs = search.toString();\n if (qs) {\n fullUrl += (fullUrl.includes('?') ? '&' : '?') + qs;\n }\n }\n\n const response = await fetch(fullUrl, {\n method: config.method ?? 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...config.headers,\n },\n body: config.body ? JSON.stringify(config.body) : undefined,\n });\n\n if (!response.ok) {\n throw new Error(`[PlatformAdapter:node-hono] HTTP ${response.status}`);\n }\n\n return (await response.json()) as T;\n }\n}\n\nconst unsupportedFilePick: FilePickAdapter = {\n async pickFiles() {\n throw new Error('[PlatformAdapter:node-hono] filePick 需在宿主注入');\n },\n};\n\n/** Hono / Node API 官方 adapter 骨架(R2-222) */\nexport function createNodeHonoPlatformAdapter(\n overrides: Partial<Pick<PlatformAdapter, 'storage' | 'fetch' | 'filePick'>> = {},\n): PlatformAdapter {\n return {\n storage: overrides.storage ?? new MemoryStorageAdapter(),\n fetch: overrides.fetch ?? new NodeFetchAdapter(),\n filePick: overrides.filePick ?? unsupportedFilePick,\n };\n}\n","/**\n * i18n 国际化模块\n *\n * 提供完整的国际化解决方案,支持多语言切换、动态加载、React Hooks 和 UI 组件\n */\n\n// 核心功能\nexport { createI18n, initI18n, getI18n, t } from './i18n';\n\n// 类型定义\nexport type {\n Locale,\n TranslationKey,\n TranslationValue,\n Translations,\n LocaleResources,\n TranslateOptions,\n I18nConfig,\n I18nInstance,\n I18nAdapter,\n} from './types';\n\n// React Hooks\nexport { useTranslation, useLocale } from './hooks';\n\n// 示例翻译资源\nexport { default as zhCN } from './locales/zh-CN';\nexport { default as enUS } from './locales/en-US';\n\n// 平台适配器\nexport * from './adapters';\n\n// UI 组件(Tailwind CSS)\nexport * from './components';\n","/**\n * 轻量级 i18n 核心实现\n * 支持:翻译、插值、复数、嵌套键、类型安全\n */\n\nimport type {\n Locale,\n Translations,\n LocaleResources,\n TranslateOptions,\n I18nConfig,\n I18nInstance,\n} from './types';\n\n/**\n * 默认插值函数\n * 支持 {{key}} 格式的变量替换\n */\nfunction defaultInterpolate(template: string, data: Record<string, any>): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key) => {\n return data[key]?.toString() ?? match;\n });\n}\n\n/**\n * 从嵌套对象中获取值\n * 支持 \"user.name\" 这样的路径\n */\nfunction getNestedValue(obj: any, path: string): any {\n const keys = path.split('.');\n let result = obj;\n\n for (const key of keys) {\n if (result && typeof result === 'object' && key in result) {\n result = result[key];\n } else {\n return undefined;\n }\n }\n\n return result;\n}\n\n/**\n * 创建 i18n 实例\n */\nexport function createI18n(config: I18nConfig): I18nInstance {\n let currentLocale: Locale = config.locale;\n const fallbackLocale: Locale = config.fallbackLocale || 'zh-CN';\n const resources: LocaleResources = config.resources || {};\n const interpolate = config.interpolate || defaultInterpolate;\n\n /**\n * 翻译函数\n * @param key 翻译键,支持嵌套 \"common.hello\"\n * @param options 选项\n */\n function t(key: string, options: TranslateOptions = {}): string {\n const { defaultValue, count, context = {} } = options;\n\n // 获取当前语言的翻译\n let translation = getNestedValue(resources[currentLocale], key);\n\n // 如果没有找到,尝试使用 fallback 语言\n if (translation === undefined && currentLocale !== fallbackLocale) {\n translation = getNestedValue(resources[fallbackLocale], key);\n }\n\n // 如果还是没有找到,使用默认值或键名\n if (translation === undefined) {\n return defaultValue || key;\n }\n\n // 如果不是字符串,返回 JSON 字符串\n if (typeof translation !== 'string') {\n return JSON.stringify(translation);\n }\n\n // 处理复数\n if (count !== undefined) {\n const pluralKey = count === 1 ? (key) + '_one' : (key) + '_other';\n const pluralTranslation = getNestedValue(resources[currentLocale], pluralKey);\n if (pluralTranslation && typeof pluralTranslation === 'string') {\n translation = pluralTranslation;\n }\n }\n\n // 插值\n const data = { ...context, count };\n return interpolate(translation, data);\n }\n\n /**\n * 设置当前语言\n */\n function setLocale(locale: Locale): void {\n currentLocale = locale;\n }\n\n /**\n * 添加翻译资源\n */\n function addResources(locale: Locale, newResources: Translations): void {\n if (!resources[locale]) {\n resources[locale] = {};\n }\n resources[locale] = {\n ...resources[locale],\n ...newResources,\n };\n }\n\n /**\n * 获取当前语言\n */\n function getLocale(): Locale {\n return currentLocale;\n }\n\n return {\n locale: currentLocale,\n t,\n setLocale,\n addResources,\n getLocale,\n };\n}\n\n/**\n * 全局 i18n 实例(可选)\n */\nlet globalI18n: I18nInstance | null = null;\n\n/**\n * 初始化全局 i18n\n */\nexport function initI18n(config: I18nConfig): I18nInstance {\n globalI18n = createI18n(config);\n return globalI18n;\n}\n\n/**\n * 获取全局 i18n 实例\n */\nexport function getI18n(): I18nInstance {\n if (!globalI18n) {\n throw new Error('i18n not initialized. Call initI18n() first.');\n }\n return globalI18n;\n}\n\n/**\n * 快捷翻译函数\n */\nexport function t(key: string, options?: TranslateOptions): string {\n return getI18n().t(key, options);\n}\n","/**\n * React hooks for i18n\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { getI18n } from './i18n';\nimport type { Locale, TranslateOptions } from './types';\n\n/**\n * useTranslation Hook\n * React 组件中使用翻译\n * 支持 SSR 环境,在 i18n 未初始化时安全降级\n */\nexport function useTranslation() {\n const [locale, setLocaleState] = useState<Locale>('zh-CN');\n const [i18nInstance, setI18nInstance] = useState<any>(null);\n\n useEffect(() => {\n // 仅在客户端尝试获取 i18n 实例\n if (typeof window !== 'undefined') {\n try {\n const i18n = getI18n();\n setI18nInstance(i18n);\n setLocaleState(i18n.getLocale());\n } catch {\n // i18n 未初始化,保持 null\n console.warn('i18n not initialized. Some translations may not work.');\n }\n }\n }, []);\n\n // 翻译函数\n const t = useCallback(\n (key: string, options?: TranslateOptions): string => {\n if (i18nInstance) {\n return i18nInstance.t(key, options);\n }\n // 未初始化时返回 key 作为后备\n return key;\n },\n [i18nInstance]\n );\n\n // 切换语言\n const setLocale = useCallback(\n (newLocale: Locale) => {\n if (i18nInstance) {\n i18nInstance.setLocale(newLocale);\n setLocaleState(newLocale);\n } else {\n console.warn('i18n not initialized. Cannot change locale.');\n }\n },\n [i18nInstance]\n );\n\n return useMemo(\n () => ({\n t,\n locale,\n setLocale,\n }),\n [t, locale, setLocale]\n );\n}\n\n/**\n * useLocale Hook\n * 只获取和设置语言,不包含翻译函数\n */\nexport function useLocale() {\n const i18n = getI18n();\n const [locale, setLocaleState] = useState<Locale>(i18n.getLocale());\n\n const setLocale = useCallback((newLocale: Locale) => {\n i18n.setLocale(newLocale);\n setLocaleState(newLocale);\n }, []);\n\n return {\n locale,\n setLocale,\n };\n}\n","/**\n * 简体中文翻译\n */\n\nexport default {\n // ==================== 应用信息 ====================\n app: {\n name: 'LyricNote',\n fullName: 'LyricNote - 歌词笔记',\n icon: '🎵',\n description: '一个强大的歌词和笔记管理应用',\n author: 'LyricNote Team',\n copyright: '© ' + (new Date().getFullYear()) + ' LyricNote',\n version: '1.0.0',\n },\n\n // ==================== 应用标题 ====================\n titles: {\n main: '🎵 LyricNote',\n admin: 'LyricNote 管理后台',\n withVersion: 'LyricNote v1.0.0',\n welcome: '欢迎使用 LyricNote',\n about: '关于 LyricNote',\n },\n\n // ==================== 通用文案 ====================\n common: {\n hello: '你好',\n welcome: '欢迎',\n confirm: '确认',\n cancel: '取消',\n save: '保存',\n delete: '删除',\n edit: '编辑',\n back: '返回',\n next: '下一步',\n submit: '提交',\n finish: '完成',\n loading: '加载中...',\n success: '操作成功',\n error: '操作失败',\n retry: '重试',\n empty: '暂无数据',\n },\n\n // ==================== 导航菜单 ====================\n nav: {\n home: '首页',\n lyrics: '歌词',\n create: '创作',\n collection: '收藏',\n profile: '我的',\n settings: '设置',\n history: '历史',\n logout: '退出登录',\n },\n\n // ==================== 用户相关 ====================\n user: {\n login: '登录',\n register: '注册',\n username: '用户名',\n password: '密码',\n email: '邮箱',\n phone: '手机号',\n nickname: '昵称',\n },\n\n // ==================== 页面标题和描述 ====================\n pages: {\n home: {\n title: '首页',\n description: '一个强大的歌词和笔记管理应用',\n },\n profile: {\n title: '个人中心',\n description: '管理您的个人信息和偏好设置',\n },\n admin: {\n title: 'LyricNote 管理后台',\n description: '系统管理和数据统计',\n },\n login: {\n title: '登录',\n description: '登录到 LyricNote',\n },\n },\n\n // ==================== 表单验证 ====================\n validation: {\n required: '{{field}}不能为空',\n invalid_email: '邮箱格式不正确',\n password_too_short: '密码至少需要{{count}}个字符',\n password_weak: '密码强度不够',\n passwords_not_match: '两次密码不一致',\n },\n\n // ==================== 状态提示 ====================\n status: {\n loading: '加载中...',\n success: '操作成功',\n error: '操作失败',\n empty: '暂无数据',\n network_error: '网络错误,请稍后重试',\n },\n\n // ==================== 错误消息 ====================\n errors: {\n network: '网络错误,请稍后重试',\n server: '服务器错误',\n unauthorized: '未授权,请先登录',\n not_found: '未找到相关内容',\n unknown: '未知错误',\n },\n\n // ==================== 成功消息 ====================\n success: {\n saved: '保存成功',\n deleted: '删除成功',\n updated: '更新成功',\n created: '创建成功',\n },\n\n // ==================== 语言设置 ====================\n language: {\n label: '语言',\n zh_cn: '简体中文',\n zh_tw: '繁體中文',\n en_us: 'English',\n ja_jp: '日本語',\n },\n} as const;\n","/**\n * English translations\n */\n\nexport default {\n // ==================== App Information ====================\n app: {\n name: 'LyricNote',\n fullName: 'LyricNote - Lyrics & Notes',\n icon: '🎵',\n description: 'A powerful lyrics and notes management app',\n author: 'LyricNote Team',\n copyright: '© ' + (new Date().getFullYear()) + ' LyricNote',\n version: '1.0.0',\n },\n\n // ==================== App Titles ====================\n titles: {\n main: '🎵 LyricNote',\n admin: 'LyricNote Admin',\n withVersion: 'LyricNote v1.0.0',\n welcome: 'Welcome to LyricNote',\n about: 'About LyricNote',\n },\n\n // ==================== Common ====================\n common: {\n hello: 'Hello',\n welcome: 'Welcome',\n confirm: 'Confirm',\n cancel: 'Cancel',\n save: 'Save',\n delete: 'Delete',\n edit: 'Edit',\n back: 'Back',\n next: 'Next',\n submit: 'Submit',\n finish: 'Finish',\n loading: 'Loading...',\n success: 'Success',\n error: 'Error',\n retry: 'Retry',\n empty: 'No data',\n },\n\n // ==================== Navigation ====================\n nav: {\n home: 'Home',\n lyrics: 'Lyrics',\n create: 'Create',\n collection: 'Collection',\n profile: 'Profile',\n settings: 'Settings',\n history: 'History',\n logout: 'Logout',\n },\n\n // ==================== User ====================\n user: {\n login: 'Login',\n register: 'Register',\n username: 'Username',\n password: 'Password',\n email: 'Email',\n phone: 'Phone',\n nickname: 'Nickname',\n },\n\n // ==================== Pages ====================\n pages: {\n home: {\n title: 'Home',\n description: 'A powerful lyrics and notes management app',\n },\n profile: {\n title: 'Profile',\n description: 'Manage your personal information and preferences',\n },\n admin: {\n title: 'LyricNote Admin',\n description: 'System management and data statistics',\n },\n login: {\n title: 'Login',\n description: 'Login to LyricNote',\n },\n },\n\n // ==================== Form Validation ====================\n validation: {\n required: '{{field}} is required',\n invalid_email: 'Invalid email format',\n password_too_short: 'Password must be at least {{count}} characters',\n password_weak: 'Password is too weak',\n passwords_not_match: 'Passwords do not match',\n },\n\n // ==================== Status Messages ====================\n status: {\n loading: 'Loading...',\n success: 'Success',\n error: 'Error',\n empty: 'No data',\n network_error: 'Network error, please try again later',\n },\n\n // ==================== Error Messages ====================\n errors: {\n network: 'Network error, please try again later',\n server: 'Server error',\n unauthorized: 'Unauthorized, please login first',\n not_found: 'Not found',\n unknown: 'Unknown error',\n },\n\n // ==================== Success Messages ====================\n success: {\n saved: 'Saved successfully',\n deleted: 'Deleted successfully',\n updated: 'Updated successfully',\n created: 'Created successfully',\n },\n\n // ==================== Language Settings ====================\n language: {\n label: 'Language',\n zh_cn: '简体中文',\n zh_tw: '繁體中文',\n en_us: 'English',\n ja_jp: '日本語',\n },\n} as const;\n","/**\n * Web 平台适配器\n * 用于浏览器环境的语言检测和存储\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * Web 平台适配器\n * 使用 localStorage 存储语言偏好\n */\nexport class WebI18nAdapter implements I18nAdapter {\n private storageKey = 'app_locale';\n\n getSystemLocale(): Locale {\n if (typeof navigator === 'undefined') return 'zh-CN';\n const browserLocale = navigator.language;\n return this.normalizeLocale(browserLocale);\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n if (typeof localStorage === 'undefined') return;\n localStorage.setItem(this.storageKey, locale);\n }\n\n async loadLocale(): Promise<Locale | null> {\n if (typeof localStorage === 'undefined') return null;\n const stored = localStorage.getItem(this.storageKey);\n return stored as Locale | null;\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n 'zh-CN': 'zh-CN',\n 'zh-TW': 'zh-TW',\n 'zh-HK': 'zh-TW',\n zh: 'zh-CN',\n 'en-US': 'en-US',\n 'en-GB': 'en-US',\n en: 'en-US',\n 'ja-JP': 'ja-JP',\n ja: 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","/**\n * React Native 平台适配器\n * 用于 React Native 应用的语言检测和存储\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * React Native 平台适配器\n * 使用 AsyncStorage 存储语言偏好\n *\n * 注意:需要安装 @react-native-async-storage/async-storage\n */\nexport class ReactNativeI18nAdapter implements I18nAdapter {\n private storageKey = '@app_locale';\n\n getSystemLocale(): Locale {\n // 需要导入 react-native 的 Platform 和 NativeModules\n try {\n // @ts-ignore - react-native 在运行时动态加载\n const { Platform, NativeModules } = require('react-native');\n const locale =\n Platform.OS === 'ios'\n ? NativeModules.SettingsManager.settings.AppleLocale ||\n NativeModules.SettingsManager.settings.AppleLanguages[0]\n : NativeModules.I18nManager.localeIdentifier;\n\n return this.normalizeLocale(locale);\n } catch {\n return 'zh-CN';\n }\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n try {\n // @ts-ignore - AsyncStorage 在运行时动态加载\n const AsyncStorage = require('@react-native-async-storage/async-storage').default;\n await AsyncStorage.setItem(this.storageKey, locale);\n } catch (error) {\n console.error('Failed to save locale:', error);\n }\n }\n\n async loadLocale(): Promise<Locale | null> {\n try {\n // @ts-ignore - AsyncStorage 在运行时动态加载\n const AsyncStorage = require('@react-native-async-storage/async-storage').default;\n const stored = await AsyncStorage.getItem(this.storageKey);\n return stored as Locale | null;\n } catch (error) {\n console.error('Failed to load locale:', error);\n return null;\n }\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n 'zh-CN': 'zh-CN',\n zh_CN: 'zh-CN',\n 'zh-Hans': 'zh-CN',\n zh_Hans_CN: 'zh-CN',\n 'zh-TW': 'zh-TW',\n zh_TW: 'zh-TW',\n 'zh-Hant': 'zh-TW',\n zh_Hant_TW: 'zh-TW',\n 'en-US': 'en-US',\n en_US: 'en-US',\n en: 'en-US',\n 'ja-JP': 'ja-JP',\n ja_JP: 'ja-JP',\n ja: 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","/**\n * Taro (小程序) 平台适配器\n * 用于微信小程序、支付宝小程序等通过 Taro 开发的应用\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * Taro (小程序) 平台适配器\n * 使用 Taro.storage API 存储语言偏好\n *\n * 注意:需要安装 @tarojs/taro\n */\nexport class TaroI18nAdapter implements I18nAdapter {\n private storageKey = 'app_locale';\n\n getSystemLocale(): Locale {\n try {\n // @ts-ignore - Taro 在运行时动态加载\n const Taro = require('@tarojs/taro').default;\n const systemInfo = Taro.getSystemInfoSync();\n return this.normalizeLocale(systemInfo.language);\n } catch {\n return 'zh-CN';\n }\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n try {\n // @ts-ignore - Taro 在运行时动态加载\n const Taro = require('@tarojs/taro').default;\n await Taro.setStorage({\n key: this.storageKey,\n data: locale,\n });\n } catch (error) {\n console.error('Failed to save locale:', error);\n }\n }\n\n async loadLocale(): Promise<Locale | null> {\n try {\n // @ts-ignore - Taro 在运行时动态加载\n const Taro = require('@tarojs/taro').default;\n const res = await Taro.getStorage({\n key: this.storageKey,\n });\n return res.data as Locale | null;\n } catch (error) {\n return null;\n }\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n zh_CN: 'zh-CN',\n 'zh-CN': 'zh-CN',\n zh_TW: 'zh-TW',\n 'zh-TW': 'zh-TW',\n en: 'en-US',\n 'en-US': 'en-US',\n ja: 'ja-JP',\n 'ja-JP': 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","/**\n * Electron 平台适配器\n * 用于 Electron 桌面应用的语言检测和存储\n */\n\nimport type { Locale, I18nAdapter } from '../types';\n\n/**\n * Electron 平台适配器\n * 使用 localStorage 存储语言偏好\n *\n * 注意:Electron 渲染进程支持 Web API\n */\nexport class ElectronI18nAdapter implements I18nAdapter {\n private storageKey = 'app_locale';\n\n getSystemLocale(): Locale {\n if (typeof navigator === 'undefined') return 'zh-CN';\n const browserLocale = navigator.language;\n return this.normalizeLocale(browserLocale);\n }\n\n async saveLocale(locale: Locale): Promise<void> {\n if (typeof localStorage === 'undefined') return;\n localStorage.setItem(this.storageKey, locale);\n }\n\n async loadLocale(): Promise<Locale | null> {\n if (typeof localStorage === 'undefined') return null;\n const stored = localStorage.getItem(this.storageKey);\n return stored as Locale | null;\n }\n\n private normalizeLocale(locale: string): Locale {\n const map: Record<string, Locale> = {\n 'zh-CN': 'zh-CN',\n 'zh-TW': 'zh-TW',\n 'zh-HK': 'zh-TW',\n zh: 'zh-CN',\n 'en-US': 'en-US',\n 'en-GB': 'en-US',\n en: 'en-US',\n 'ja-JP': 'ja-JP',\n ja: 'ja-JP',\n };\n return map[locale] || 'zh-CN';\n }\n}\n\n","'use client';\n\n/**\n * 语言切换组件\n * 支持多种样式:按钮组、下拉菜单、图标按钮\n * 使用 Tailwind CSS 样式,支持暗色模式\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useTranslation } from '../hooks';\nimport type { Locale } from '../types';\nimport { clsx } from 'clsx';\n\n// ==================== 类型定义 ====================\n\nexport interface LanguageSwitcherProps {\n variant?: 'buttons' | 'dropdown' | 'icon';\n className?: string;\n onLanguageChange?: (locale: Locale) => void;\n}\n\nexport interface LanguageOption {\n locale: Locale;\n label: string;\n flag: string;\n}\n\n// ==================== 语言选项配置 ====================\n\nconst LANGUAGE_OPTIONS: LanguageOption[] = [\n { locale: 'zh-CN', label: '简体中文', flag: '🇨🇳' },\n { locale: 'zh-TW', label: '繁體中文', flag: '🇹🇼' },\n { locale: 'en-US', label: 'English', flag: '🇺🇸' },\n { locale: 'ja-JP', label: '日本語', flag: '🇯🇵' },\n];\n\n// ==================== 按钮组样式 ====================\n\n/**\n * 按钮组语言切换器\n */\nexport function LanguageSwitcherButtons({\n className = '',\n onLanguageChange,\n}: LanguageSwitcherProps) {\n const { locale, setLocale } = useTranslation();\n\n const handleChange = (newLocale: Locale) => {\n setLocale(newLocale);\n onLanguageChange?.(newLocale);\n };\n\n return (\n <div\n className={clsx('inline-flex items-center gap-1 p-1 bg-gray-100 dark:bg-gray-800 rounded-lg', className)}\n >\n {LANGUAGE_OPTIONS.map((option) => (\n <button\n key={option.locale}\n onClick={() => handleChange(option.locale)}\n className={clsx(\n 'inline-flex items-center gap-2 px-3 py-1.5 rounded-md text-sm font-medium transition-all duration-200',\n locale === option.locale\n ? 'bg-white dark:bg-gray-700 text-blue-600 dark:text-blue-400 shadow-sm'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700/50'\n )}\n aria-label={option.label}\n >\n <span className=\"text-base leading-none\">{option.flag}</span>\n <span className=\"hidden sm:inline\">{option.label}</span>\n </button>\n ))}\n </div>\n );\n}\n\n// ==================== 下拉菜单样式 ====================\n\n/**\n * 下拉菜单语言切换器\n */\nexport function LanguageSwitcherDropdown({\n className = '',\n onLanguageChange,\n}: LanguageSwitcherProps) {\n const { locale, setLocale, t } = useTranslation();\n\n const handleChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const newLocale = e.target.value as Locale;\n setLocale(newLocale);\n onLanguageChange?.(newLocale);\n };\n\n return (\n <div className={clsx('inline-flex flex-col gap-2', className)}>\n <label\n htmlFor=\"language-select\"\n className=\"text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {t('language.label')}\n </label>\n <select\n id=\"language-select\"\n value={locale}\n onChange={handleChange}\n className=\"\n min-w-[160px] px-3 py-2 pr-8\n bg-white dark:bg-gray-800\n border border-gray-300 dark:border-gray-600\n rounded-lg text-sm\n text-gray-900 dark:text-gray-100\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n cursor-pointer\n appearance-none\n bg-[url('data:image/svg+xml;charset=UTF-8,%3csvg xmlns=%27http://www.w3.org/2000/svg%27 viewBox=%270 0 24 24%27 fill=%27none%27 stroke=%27currentColor%27 stroke-width=%272%27 stroke-linecap=%27round%27 stroke-linejoin=%27round%27%3e%3cpolyline points=%276 9 12 15 18 9%27%3e%3c/polyline%3e%3c/svg%3e')]\n bg-[length:1rem] bg-[right_0.5rem_center] bg-no-repeat\n \"\n aria-label={t('language.label')}\n >\n {LANGUAGE_OPTIONS.map((option) => (\n <option key={option.locale} value={option.locale}>\n {option.flag} {option.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\n// ==================== 图标按钮样式 ====================\n\n/**\n * 图标按钮语言切换器(带下拉菜单)\n */\nexport function LanguageSwitcherIcon({ className = '', onLanguageChange }: LanguageSwitcherProps) {\n const { locale, setLocale } = useTranslation();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const currentOption = LANGUAGE_OPTIONS.find((opt) => opt.locale === locale);\n\n const handleSelect = (newLocale: Locale) => {\n setLocale(newLocale);\n setIsOpen(false);\n onLanguageChange?.(newLocale);\n };\n\n // 点击外部关闭下拉菜单\n useEffect(() => {\n if (!isOpen) return;\n\n function handleClickOutside(event: MouseEvent) {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen]);\n\n return (\n <div className={clsx('relative', className)} ref={dropdownRef}>\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"\n inline-flex items-center gap-1.5 px-3 py-2\n bg-white dark:bg-gray-800\n border border-gray-300 dark:border-gray-600\n rounded-lg\n hover:bg-gray-50 dark:hover:bg-gray-700\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\n transition-all duration-200\n \"\n aria-label=\"Switch Language\"\n >\n <span className=\"text-lg leading-none\">{currentOption?.flag}</span>\n <svg\n className={clsx('w-4 h-4 text-gray-600 dark:text-gray-400 transition-transform duration-200', isOpen ? 'rotate-180' : '')}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {isOpen && (\n <div\n className=\"\n absolute top-full right-0 mt-2 min-w-[180px]\n bg-white dark:bg-gray-800\n border border-gray-200 dark:border-gray-700\n rounded-lg shadow-lg\n py-1\n z-50\n animate-in fade-in slide-in-from-top-2 duration-200\n \"\n >\n {LANGUAGE_OPTIONS.map((option) => (\n <button\n key={option.locale}\n onClick={() => handleSelect(option.locale)}\n className={clsx(\n 'w-full flex items-center gap-3 px-4 py-2.5 text-sm transition-colors duration-150',\n locale === option.locale\n ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700/50'\n )}\n >\n <span className=\"text-lg leading-none\">{option.flag}</span>\n <span className=\"flex-1 text-left\">{option.label}</span>\n {locale === option.locale && (\n <svg\n className=\"w-4 h-4 text-blue-600 dark:text-blue-400\"\n fill=\"currentColor\"\n viewBox=\"0 0 20 20\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ==================== 主组件 ====================\n\n/**\n * 语言切换器主组件\n * 根据 variant 自动选择样式\n */\nexport function LanguageSwitcher({\n variant = 'icon',\n className,\n onLanguageChange,\n}: LanguageSwitcherProps) {\n switch (variant) {\n case 'buttons':\n return <LanguageSwitcherButtons className={className} onLanguageChange={onLanguageChange} />;\n case 'dropdown':\n return <LanguageSwitcherDropdown className={className} onLanguageChange={onLanguageChange} />;\n case 'icon':\n default:\n return <LanguageSwitcherIcon className={className} onLanguageChange={onLanguageChange} />;\n }\n}\n\n// ==================== 默认导出 ====================\n\nexport default LanguageSwitcher;\n","/**\n * Analytics 埋点分析模块\n *\n * 提供完整的事件追踪、用户行为分析、数据上报等功能\n * 包含多平台适配器(web/mobile/desktop/miniapp)\n */\n\n// 核心类\nexport { Analytics } from './core/Analytics';\nexport {\n registerAnalytics,\n getRegisteredAnalytics,\n unregisterAnalytics,\n clearAnalyticsRegistry,\n setGlobalAnalytics,\n getGlobalAnalytics,\n} from './registry';\nexport { EventQueue } from './core/EventQueue';\nexport { Uploader } from './core/Uploader';\n\n// 类型定义\nexport * from './types';\n\n// 客户端工具(单例管理器 + 预设配置)\nexport * from './client';\n\n// 工具函数\nexport * from './utils/helpers';\nexport * from './utils/decorators';\nexport * from './utils/hooks';\n\n// 平台适配器\nexport * from './adapters';\n\n// UI 组件(已解决类型冲突:DashboardEvent vs AnalyticsEvent)\nexport {\n AnalyticsDashboard,\n StatCard,\n EventList,\n FilterPanel,\n PieChart,\n BarChart,\n} from './components';\nexport type {\n AnalyticsDashboardProps,\n StatCardProps,\n EventListProps,\n FilterPanelProps,\n DashboardEvent,\n DashboardStats,\n FilterOptions,\n ChartDataPoint,\n} from './components';\n\n// 服务端模块(Server-side)\n// 注意:server 模块需要单独导入,避免在客户端打包时引入服务端依赖\n// import { createAnalyticsService } from '@qhr123/sa2kit/analytics/server';\n\n// 版本信息\nexport const ANALYTICS_VERSION = '1.0.0';\n\n","/**\n * 埋点系统类型定义\n * Analytics System Type Definitions\n */\n\n/**\n * 事件类型枚举\n */\nexport enum EventType {\n // 页面事件\n PAGE_VIEW = 'page_view',\n PAGE_LEAVE = 'page_leave',\n\n // 用户行为事件\n CLICK = 'click',\n SCROLL = 'scroll',\n INPUT = 'input',\n SUBMIT = 'submit',\n\n // 业务事件\n LOGIN = 'login',\n LOGOUT = 'logout',\n REGISTER = 'register',\n SEARCH = 'search',\n SHARE = 'share',\n\n // 性能事件\n PERFORMANCE = 'performance',\n ERROR = 'error',\n API_CALL = 'api_call',\n\n // 自定义事件\n CUSTOM = 'custom',\n}\n\n/**\n * 事件优先级\n */\nexport enum EventPriority {\n LOW = 0, // 低优先级,可延迟上报\n NORMAL = 1, // 普通优先级,批量上报\n HIGH = 2, // 高优先级,实时上报\n CRITICAL = 3, // 关键事件,立即上报\n}\n\n/**\n * 基础事件数据接口\n */\nexport interface BaseEvent {\n // 基本信息\n event_id: string; // 事件唯一ID\n event_type: EventType; // 事件类型\n event_name: string; // 事件名称\n timestamp: number; // 事件时间戳\n priority: EventPriority; // 事件优先级\n\n // 用户信息\n user_id?: string; // 用户ID\n session_id: string; // 会话ID\n device_id: string; // 设备ID\n\n // 页面信息\n page_url?: string; // 页面URL\n page_title?: string; // 页面标题\n referrer?: string; // 来源页面\n\n // 自定义属性\n properties?: Record<string, any>;\n\n // 系统信息\n platform: string; // 平台:web/mobile/desktop/miniapp\n app_version: string; // 应用版本\n sdk_version: string; // SDK版本\n}\n\n/**\n * 页面浏览事件\n */\nexport interface PageViewEvent extends BaseEvent {\n event_type: EventType.PAGE_VIEW;\n page_url: string;\n page_title: string;\n duration?: number; // 页面停留时长(ms)\n}\n\n/**\n * 点击事件\n */\nexport interface ClickEvent extends BaseEvent {\n event_type: EventType.CLICK;\n element_id?: string; // 元素ID\n element_class?: string; // 元素类名\n element_text?: string; // 元素文本\n element_type?: string; // 元素类型\n position?: {\n // 点击位置\n x: number;\n y: number;\n };\n}\n\n/**\n * 错误事件\n */\nexport interface ErrorEvent extends BaseEvent {\n event_type: EventType.ERROR;\n error_message: string; // 错误信息\n error_stack?: string; // 错误堆栈\n error_type?: string; // 错误类型\n error_level?: 'warning' | 'error' | 'fatal';\n}\n\n/**\n * 性能事件\n */\nexport interface PerformanceEvent extends BaseEvent {\n event_type: EventType.PERFORMANCE;\n metric_name: string; // 指标名称\n metric_value: number; // 指标值\n metric_unit?: string; // 单位\n}\n\n/**\n * API调用事件\n */\nexport interface ApiCallEvent extends BaseEvent {\n event_type: EventType.API_CALL;\n api_url: string; // API地址\n api_method: string; // 请求方法\n api_status?: number; // 响应状态码\n duration?: number; // 请求耗时(ms)\n success: boolean; // 是否成功\n}\n\n/**\n * 所有事件类型联合\n */\nexport type AnalyticsEvent =\n | BaseEvent\n | PageViewEvent\n | ClickEvent\n | ErrorEvent\n | PerformanceEvent\n | ApiCallEvent;\n\n/**\n * 事件上报配置\n */\nexport interface AnalyticsConfig {\n // 基础配置\n appId: string; // 应用ID\n appVersion: string; // 应用版本\n endpoint: string; // 上报接口地址\n platform?: string; // 平台标识(web/mobile/miniapp/desktop)\n debug?: boolean; // 是否开启调试模式\n\n // 上报策略\n batchSize?: number; // 批量上报数量(默认10)\n batchInterval?: number; // 批量上报间隔(ms,默认5000)\n maxQueueSize?: number; // 最大队列长度(默认100)\n retryTimes?: number; // 失败重试次数(默认3)\n retryInterval?: number; // 重试间隔(ms,默认1000)\n\n // 功能开关\n enableAutoPageView?: boolean; // 自动采集页面浏览(默认true)\n enableAutoClick?: boolean; // 自动采集点击事件(默认false)\n enableAutoError?: boolean; // 自动采集错误(默认true)\n enableAutoPerformance?: boolean; // 自动采集性能(默认true)\n\n // 数据过滤\n ignoreUrls?: string[]; // 忽略的URL列表\n ignoreErrors?: string[]; // 忽略的错误列表\n beforeSend?: (event: AnalyticsEvent) => AnalyticsEvent | null; // 发送前钩子\n\n // 用户信息\n userId?: string; // 用户ID\n customProperties?: Record<string, any>; // 自定义全局属性\n}\n\n/**\n * 设备信息接口\n */\nexport interface DeviceInfo {\n device_id: string; // 设备唯一ID\n device_model?: string; // 设备型号\n device_brand?: string; // 设备品牌\n os_name: string; // 操作系统名称\n os_version: string; // 操作系统版本\n screen_width: number; // 屏幕宽度\n screen_height: number; // 屏幕高度\n language: string; // 系统语言\n timezone: string; // 时区\n network_type?: string; // 网络类型\n carrier?: string; // 运营商\n}\n\n/**\n * 上报响应接口\n */\nexport interface UploadResponse {\n success: boolean;\n message?: string;\n code?: number;\n}\n\n/**\n * 存储适配器接口\n */\nexport interface AnalyticsStorageAdapter {\n /**\n * 保存事件到本地存储\n */\n saveEvents(events: AnalyticsEvent[]): Promise<void>;\n\n /**\n * 获取本地存储的事件\n */\n getEvents(): Promise<AnalyticsEvent[]>;\n\n /**\n * 清除本地存储的事件\n */\n clearEvents(): Promise<void>;\n\n /**\n * 保存设备信息\n */\n saveDeviceInfo(info: DeviceInfo): Promise<void>;\n\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo | null>;\n\n /**\n * 保存会话ID\n */\n saveSessionId(sessionId: string): Promise<void>;\n\n /**\n * 获取会话ID\n */\n getSessionId(): Promise<string | null>;\n}\n\n/**\n * 网络适配器接口\n */\nexport interface AnalyticsNetworkAdapter {\n /**\n * 上传事件数据\n */\n upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse>;\n\n /**\n * 检查网络连接状态\n */\n isOnline(): Promise<boolean>;\n}\n\n/**\n * 设备信息适配器接口\n */\nexport interface AnalyticsDeviceAdapter {\n /**\n * 获取设备信息\n */\n getDeviceInfo(): Promise<DeviceInfo>;\n\n /**\n * 生成设备唯一ID\n */\n generateDeviceId(): Promise<string>;\n}\n","/**\n * 事件队列管理器\n * Event Queue Manager\n */\n\nimport type { AnalyticsEvent } from '../types';\n\nexport class EventQueue {\n private queue: AnalyticsEvent[] = [];\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n /**\n * 添加事件到队列\n */\n enqueue(event: AnalyticsEvent): void {\n // 如果队列已满,移除最老的低优先级事件\n if (this.queue.length >= this.maxSize) {\n this.removeLowestPriorityEvent();\n }\n\n this.queue.push(event);\n\n // 按优先级排序(高优先级在前)\n this.queue.sort((a, b) => b.priority - a.priority);\n }\n\n /**\n * 批量添加事件\n */\n enqueueBatch(events: AnalyticsEvent[]): void {\n events.forEach((event) => this.enqueue(event));\n }\n\n /**\n * 获取指定数量的事件\n */\n dequeue(count: number): AnalyticsEvent[] {\n return this.queue.splice(0, count);\n }\n\n /**\n * 获取所有事件\n */\n dequeueAll(): AnalyticsEvent[] {\n const events = [...this.queue];\n this.queue = [];\n return events;\n }\n\n /**\n * 获取高优先级事件\n */\n getHighPriorityEvents(): AnalyticsEvent[] {\n const highPriorityEvents = this.queue.filter(\n (event) => event.priority >= 2 // HIGH 和 CRITICAL\n );\n\n // 从队列中移除这些事件\n this.queue = this.queue.filter((event) => event.priority < 2);\n\n return highPriorityEvents;\n }\n\n /**\n * 查看队列长度\n */\n size(): number {\n return this.queue.length;\n }\n\n /**\n * 队列是否为空\n */\n isEmpty(): boolean {\n return this.queue.length === 0;\n }\n\n /**\n * 队列是否已满\n */\n isFull(): boolean {\n return this.queue.length >= this.maxSize;\n }\n\n /**\n * 清空队列\n */\n clear(): void {\n this.queue = [];\n }\n\n /**\n * 移除最低优先级的事件\n */\n private removeLowestPriorityEvent(): void {\n if (this.queue.length === 0) return;\n\n // 找到优先级最低的事件\n let lowestPriorityIndex = 0;\n let lowestPriority = this.queue[0]?.priority ?? 0;\n\n for (let i = 1; i < this.queue.length; i++) {\n const currentPriority = this.queue[i]?.priority ?? 0;\n if (currentPriority < lowestPriority) {\n lowestPriority = currentPriority;\n lowestPriorityIndex = i;\n }\n }\n\n this.queue.splice(lowestPriorityIndex, 1);\n }\n\n /**\n * 获取队列快照(不移除事件)\n */\n snapshot(): AnalyticsEvent[] {\n return [...this.queue];\n }\n}\n","/**\n * 事件上传器\n * Event Uploader\n */\n\nimport type {\n AnalyticsEvent,\n AnalyticsNetworkAdapter,\n AnalyticsStorageAdapter,\n} from '../types';\n\nexport interface UploaderConfig {\n endpoint: string;\n batchSize: number;\n retryTimes: number;\n retryInterval: number;\n networkAdapter: AnalyticsNetworkAdapter;\n storageAdapter: AnalyticsStorageAdapter;\n onSuccess?: (events: AnalyticsEvent[]) => void;\n onError?: (error: Error, events: AnalyticsEvent[]) => void;\n}\n\nexport class Uploader {\n private config: UploaderConfig;\n private uploading = false;\n private retryQueue: Map<string, { events: AnalyticsEvent[]; retryCount: number }> = new Map();\n\n constructor(config: UploaderConfig) {\n this.config = config;\n }\n\n /**\n * 上传事件\n */\n async upload(events: AnalyticsEvent[]): Promise<boolean> {\n if (events.length === 0) return true;\n\n // 检查网络状态\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) {\n // 离线时保存到本地\n await this.saveToLocal(events);\n return false;\n }\n\n try {\n this.uploading = true;\n\n const response = await this.config.networkAdapter.upload(this.config.endpoint, events);\n\n if (response.success) {\n this.config.onSuccess?.(events);\n return true;\n } else {\n throw new Error(response.message || 'Upload failed');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.config.onError?.(err, events);\n\n // 添加到重试队列\n await this.addToRetryQueue(events);\n return false;\n } finally {\n this.uploading = false;\n }\n }\n\n /**\n * 批量上传\n */\n async uploadBatch(events: AnalyticsEvent[]): Promise<boolean> {\n const batches = this.splitIntoBatches(events, this.config.batchSize);\n const results = await Promise.all(batches.map((batch) => this.upload(batch)));\n\n return results.every((result) => result);\n }\n\n /**\n * 重试失败的上传\n */\n async retryFailedUploads(): Promise<void> {\n if (this.uploading || this.retryQueue.size === 0) return;\n\n const isOnline = await this.config.networkAdapter.isOnline();\n if (!isOnline) return;\n\n const entries = Array.from(this.retryQueue.entries());\n\n for (const [key, item] of entries) {\n if (item.retryCount >= this.config.retryTimes) {\n // 达到最大重试次数,保存到本地\n await this.saveToLocal(item.events);\n this.retryQueue.delete(key);\n continue;\n }\n\n // 延迟重试\n await this.delay(this.config.retryInterval * (item.retryCount + 1));\n\n const success = await this.upload(item.events);\n\n if (success) {\n this.retryQueue.delete(key);\n } else {\n // 增加重试次数\n item.retryCount++;\n }\n }\n }\n\n /**\n * 上传本地缓存的事件\n */\n async uploadCachedEvents(): Promise<void> {\n try {\n const cachedEvents = await this.config.storageAdapter.getEvents();\n\n if (cachedEvents.length > 0) {\n const success = await this.uploadBatch(cachedEvents);\n\n if (success) {\n await this.config.storageAdapter.clearEvents();\n }\n }\n } catch (error) {\n console.error('Failed to upload cached events:', error);\n }\n }\n\n /**\n * 保存事件到本地存储\n */\n private async saveToLocal(events: AnalyticsEvent[]): Promise<void> {\n try {\n const existingEvents = await this.config.storageAdapter.getEvents();\n const allEvents = [...existingEvents, ...events];\n await this.config.storageAdapter.saveEvents(allEvents);\n } catch (error) {\n console.error('Failed to save events to local storage:', error);\n }\n }\n\n /**\n * 添加到重试队列\n */\n private async addToRetryQueue(events: AnalyticsEvent[]): Promise<void> {\n const key = (Date.now()) + '_' + (Math.random());\n this.retryQueue.set(key, {\n events,\n retryCount: 0,\n });\n }\n\n /**\n * 分割成批次\n */\n private splitIntoBatches(events: AnalyticsEvent[], batchSize: number): AnalyticsEvent[][] {\n const batches: AnalyticsEvent[][] = [];\n\n for (let i = 0; i < events.length; i += batchSize) {\n batches.push(events.slice(i, i + batchSize));\n }\n\n return batches;\n }\n\n /**\n * 延迟函数\n */\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n /**\n * 是否正在上传\n */\n isUploading(): boolean {\n return this.uploading;\n }\n\n /**\n * 获取重试队列大小\n */\n getRetryQueueSize(): number {\n return this.retryQueue.size;\n }\n\n /**\n * 清空重试队列\n */\n clearRetryQueue(): void {\n this.retryQueue.clear();\n }\n}\n","/**\n * 埋点系统核心类\n * Analytics Core SDK\n */\n\nimport {\n EventType,\n EventPriority,\n type AnalyticsConfig,\n type AnalyticsEvent,\n type BaseEvent,\n type AnalyticsStorageAdapter,\n type AnalyticsNetworkAdapter,\n type AnalyticsDeviceAdapter,\n type DeviceInfo,\n} from '../types';\nimport { EventQueue } from './EventQueue';\nimport { Uploader } from './Uploader';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private eventQueue: EventQueue;\n private uploader: Uploader;\n private storageAdapter: AnalyticsStorageAdapter;\n private networkAdapter: AnalyticsNetworkAdapter;\n private deviceAdapter: AnalyticsDeviceAdapter;\n\n private sessionId: string = '';\n private deviceId: string = '';\n private deviceInfo: DeviceInfo | null = null;\n private initialized = false;\n private batchTimer: any = null;\n\n constructor(\n config: Omit<AnalyticsConfig, 'endpoint'> & {\n adapter?: {\n storage: AnalyticsStorageAdapter;\n network: AnalyticsNetworkAdapter;\n device: AnalyticsDeviceAdapter;\n };\n platform?: string;\n serverUrl?: string;\n endpoint?: string;\n },\n storageAdapter?: AnalyticsStorageAdapter,\n networkAdapter?: AnalyticsNetworkAdapter,\n deviceAdapter?: AnalyticsDeviceAdapter\n ) {\n // 支持两种初始化方式:\n // 1. 新方式:传入包含 adapter 的 config 对象\n // 2. 旧方式:分别传入四个参数\n if (config.adapter) {\n this.storageAdapter = config.adapter.storage;\n this.networkAdapter = config.adapter.network;\n this.deviceAdapter = config.adapter.device;\n } else if (storageAdapter && networkAdapter && deviceAdapter) {\n this.storageAdapter = storageAdapter;\n this.networkAdapter = networkAdapter;\n this.deviceAdapter = deviceAdapter;\n } else {\n throw new Error('Analytics initialization failed: adapter is required');\n }\n\n // 合并默认配置\n const serverUrl = (config as any).serverUrl || config.endpoint || '/api/analytics/events';\n const platform = (config as any).platform || 'web';\n\n this.config = {\n ...config,\n appId: config.appId,\n appVersion: config.appVersion || '1.0.0',\n platform: platform,\n endpoint: serverUrl,\n batchSize: config.batchSize ?? 10,\n batchInterval: config.batchInterval ?? 5000,\n maxQueueSize: config.maxQueueSize ?? 100,\n retryTimes: config.retryTimes ?? 3,\n retryInterval: config.retryInterval ?? 1000,\n enableAutoPageView: config.enableAutoPageView ?? true,\n enableAutoClick: config.enableAutoClick ?? false,\n enableAutoError: config.enableAutoError ?? true,\n enableAutoPerformance: config.enableAutoPerformance ?? true,\n debug: config.debug ?? false,\n ignoreUrls: config.ignoreUrls ?? [],\n ignoreErrors: config.ignoreErrors ?? [],\n beforeSend: config.beforeSend,\n } as Required<AnalyticsConfig>;\n\n this.eventQueue = new EventQueue(this.config.maxQueueSize);\n this.uploader = new Uploader({\n endpoint: this.config.endpoint,\n batchSize: this.config.batchSize,\n retryTimes: this.config.retryTimes,\n retryInterval: this.config.retryInterval,\n networkAdapter: this.networkAdapter,\n storageAdapter: this.storageAdapter,\n onSuccess: (events) => this.onUploadSuccess(events),\n onError: (error, events) => this.onUploadError(error, events),\n });\n\n // 自动初始化\n this.init().catch((error) => {\n console.error('Failed to initialize Analytics:', error);\n });\n }\n\n /**\n * 初始化\n */\n async init(): Promise<void> {\n if (this.initialized) {\n this.log('Analytics already initialized');\n return;\n }\n\n try {\n // 初始化设备信息\n await this.initDeviceInfo();\n\n // 初始化会话\n await this.initSession();\n\n // 上传缓存的事件\n await this.uploader.uploadCachedEvents();\n\n // 启动批量上传定时器\n this.startBatchTimer();\n\n // 监听调试配置变化\n if (typeof window !== 'undefined') {\n window.addEventListener('analytics-debug-changed', ((e: CustomEvent) => {\n this.log('Debug mode changed: ' + (e.detail.enabled ? 'enabled' : 'disabled'));\n }) as EventListener);\n }\n\n this.initialized = true;\n this.log('Analytics initialized successfully');\n } catch (error) {\n console.error('Failed to initialize analytics:', error);\n throw error;\n }\n }\n\n /**\n * 追踪事件(简化版本,支持两种调用方式)\n */\n track(\n eventNameOrType: string | EventType,\n propertiesOrName?: Record<string, any> | string,\n maybeProperties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): void {\n if (!this.initialized) {\n console.warn('Analytics not initialized yet, queuing event...');\n // 可以选择在初始化后重试\n setTimeout(\n () => this.track(eventNameOrType, propertiesOrName, maybeProperties, priority),\n 100\n );\n return;\n }\n\n let eventType: EventType;\n let eventName: string;\n let properties: Record<string, any> | undefined;\n\n // 支持两种调用方式:\n // 1. track(eventName, properties) - 简化版\n // 2. track(eventType, eventName, properties, priority) - 完整版\n if (typeof propertiesOrName === 'string') {\n // 完整版调用\n eventType = eventNameOrType as EventType;\n eventName = propertiesOrName;\n properties = maybeProperties;\n } else {\n // 简化版调用\n eventType = EventType.CUSTOM;\n eventName = eventNameOrType as string;\n properties = propertiesOrName;\n }\n\n const event = this.createEvent(eventType, eventName, properties, priority);\n\n // beforeSend 钩子\n const processedEvent = this.config.beforeSend?.(event) ?? event;\n if (!processedEvent) {\n this.log('Event filtered by beforeSend hook', event);\n return;\n }\n\n // 添加到队列\n this.eventQueue.enqueue(processedEvent);\n this.log('Event tracked', processedEvent);\n\n // 高优先级事件立即上传\n if (priority >= EventPriority.HIGH) {\n this.flushHighPriority();\n }\n\n // 队列满了自动上传\n if (this.eventQueue.isFull()) {\n this.flush();\n }\n }\n\n /**\n * 追踪页面浏览\n */\n trackPageView(pageUrl: string, pageTitle: string, properties?: Record<string, any>): void {\n this.track(\n EventType.PAGE_VIEW,\n 'page_view',\n {\n page_url: pageUrl,\n page_title: pageTitle,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 追踪点击事件\n */\n trackClick(\n elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n position?: { x: number; y: number };\n },\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.CLICK,\n 'click',\n {\n ...elementInfo,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪错误\n */\n trackError(\n errorMessage: string,\n errorStack?: string,\n errorType?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.ERROR,\n 'error',\n {\n error_message: errorMessage,\n error_stack: errorStack,\n error_type: errorType,\n ...properties,\n },\n EventPriority.HIGH\n );\n }\n\n /**\n * 追踪性能指标\n */\n trackPerformance(\n metricName: string,\n metricValue: number,\n metricUnit?: string,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.PERFORMANCE,\n 'performance',\n {\n metric_name: metricName,\n metric_value: metricValue,\n metric_unit: metricUnit,\n ...properties,\n },\n EventPriority.LOW\n );\n }\n\n /**\n * 追踪 API 调用\n */\n trackApiCall(\n apiUrl: string,\n apiMethod: string,\n apiStatus: number,\n duration: number,\n success: boolean,\n properties?: Record<string, any>\n ): void {\n this.track(\n EventType.API_CALL,\n 'api_call',\n {\n api_url: apiUrl,\n api_method: apiMethod,\n api_status: apiStatus,\n duration,\n success,\n ...properties,\n },\n EventPriority.NORMAL\n );\n }\n\n /**\n * 设置用户ID\n */\n setUserId(userId: string): void {\n this.config.userId = userId;\n this.log('User ID set', userId);\n }\n\n /**\n * 设置用户信息(包括用户ID和其他属性)\n */\n setUser(userInfo: { userId: string; [key: string]: any }): void {\n const { userId, ...otherProps } = userInfo;\n this.config.userId = userId;\n this.config.customProperties = {\n ...this.config.customProperties,\n ...otherProps,\n };\n this.log('User info set', userInfo);\n }\n\n /**\n * 设置自定义属性\n */\n setCustomProperties(properties: Record<string, any>): void {\n this.config.customProperties = {\n ...this.config.customProperties,\n ...properties,\n };\n this.log('Custom properties set', properties);\n }\n\n /**\n * 立即上传所有事件\n */\n async flush(): Promise<void> {\n if (this.eventQueue.isEmpty()) {\n return;\n }\n\n const events = this.eventQueue.dequeueAll();\n await this.uploader.upload(events);\n }\n\n /**\n * 立即上传高优先级事件\n */\n private async flushHighPriority(): Promise<void> {\n const highPriorityEvents = this.eventQueue.getHighPriorityEvents();\n\n if (highPriorityEvents.length > 0) {\n await this.uploader.upload(highPriorityEvents);\n }\n }\n\n /**\n * 销毁实例\n */\n async destroy(): Promise<void> {\n // 停止定时器\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = null;\n }\n\n // 上传剩余事件\n await this.flush();\n\n this.initialized = false;\n this.log('Analytics destroyed');\n }\n\n /**\n * 创建事件对象\n */\n private createEvent(\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority: EventPriority = EventPriority.NORMAL\n ): BaseEvent {\n // 获取当前页面信息(仅在浏览器环境)\n let pageUrl: string | undefined;\n let pageTitle: string | undefined;\n let referrer: string | undefined;\n\n if (typeof window !== 'undefined') {\n pageUrl = window.location.href;\n pageTitle = document.title;\n referrer = document.referrer || undefined;\n }\n\n return {\n event_id: this.generateEventId(),\n event_type: eventType,\n event_name: eventName,\n timestamp: Date.now(),\n priority,\n user_id: this.config.userId,\n session_id: this.sessionId,\n device_id: this.deviceId,\n page_url: pageUrl,\n page_title: pageTitle,\n referrer: referrer,\n properties: {\n ...this.config.customProperties,\n ...properties,\n },\n platform: this.getPlatform(),\n app_version: this.config.appVersion,\n sdk_version: SDK_VERSION,\n };\n }\n\n /**\n * 初始化设备信息\n */\n private async initDeviceInfo(): Promise<void> {\n try {\n // 尝试从缓存获取\n let cachedDeviceInfo = await this.storageAdapter.getDeviceInfo();\n\n if (!cachedDeviceInfo) {\n // 生成新的设备信息\n this.deviceInfo = await this.deviceAdapter.getDeviceInfo();\n this.deviceId = await this.deviceAdapter.generateDeviceId();\n\n // 保存到缓存\n await this.storageAdapter.saveDeviceInfo(this.deviceInfo);\n } else {\n this.deviceInfo = cachedDeviceInfo;\n this.deviceId = cachedDeviceInfo.device_id;\n }\n } catch (error) {\n console.error('Failed to init device info:', error);\n // 使用临时ID\n this.deviceId = 'temp_' + (Date.now()) + '_' + (Math.random());\n }\n }\n\n /**\n * 初始化会话\n */\n private async initSession(): Promise<void> {\n try {\n // 尝试从缓存获取\n const cachedSessionId = await this.storageAdapter.getSessionId();\n\n if (cachedSessionId) {\n this.sessionId = cachedSessionId;\n } else {\n // 生成新会话\n this.sessionId = this.generateSessionId();\n await this.storageAdapter.saveSessionId(this.sessionId);\n }\n } catch (error) {\n console.error('Failed to init session:', error);\n this.sessionId = this.generateSessionId();\n }\n }\n\n /**\n * 启动批量上传定时器\n */\n private startBatchTimer(): void {\n this.batchTimer = setInterval(() => {\n if (!this.eventQueue.isEmpty()) {\n this.flush();\n }\n\n // 重试失败的上传\n this.uploader.retryFailedUploads();\n }, this.config.batchInterval);\n }\n\n /**\n * 上传成功回调\n */\n private onUploadSuccess(events: AnalyticsEvent[]): void {\n this.log('Events uploaded successfully', events);\n }\n\n /**\n * 上传失败回调\n */\n private onUploadError(error: Error, events: AnalyticsEvent[]): void {\n this.log('Failed to upload events', { error, events });\n }\n\n /**\n * 生成事件ID\n */\n private generateEventId(): string {\n return (Date.now()) + '_' + (Math.random().toString(36).substring(2, 15));\n }\n\n /**\n * 生成会话ID\n */\n private generateSessionId(): string {\n return 'session_' + (Date.now()) + '_' + (Math.random().toString(36).substring(2, 15));\n }\n\n /**\n * 获取平台标识\n */\n private getPlatform(): string {\n return this.config.platform || 'unknown';\n }\n\n /**\n * 日志输出\n */\n private log(message: string, data?: any): void {\n // 检查动态调试配置(优先级高于初始化时的 debug 配置)\n const dynamicDebug =\n typeof window !== 'undefined' ? localStorage.getItem('analytics-debug') === 'true' : false;\n\n if (this.config.debug || dynamicDebug) {\n console.log('[Analytics] ' + (message), data ?? '');\n }\n }\n\n /**\n * 获取队列状态\n */\n getQueueStatus(): {\n size: number;\n isFull: boolean;\n isEmpty: boolean;\n } {\n return {\n size: this.eventQueue.size(),\n isFull: this.eventQueue.isFull(),\n isEmpty: this.eventQueue.isEmpty(),\n };\n }\n\n /**\n * 获取初始化状态\n */\n isInitialized(): boolean {\n return this.initialized;\n }\n}\n","import type { Analytics } from './core/Analytics';\n\nconst DEFAULT_ID = 'default';\n\nconst registry = new Map<string, Analytics>();\n\n/**\n * 注册 Analytics 实例(R2-234,替代 globalThis.__analytics__)\n */\nexport function registerAnalytics(analytics: Analytics, id = DEFAULT_ID): void {\n registry.set(id, analytics);\n}\n\nexport function getRegisteredAnalytics(id = DEFAULT_ID): Analytics | null {\n return registry.get(id) ?? null;\n}\n\nexport function unregisterAnalytics(id = DEFAULT_ID): void {\n registry.delete(id);\n}\n\nexport function clearAnalyticsRegistry(): void {\n registry.clear();\n}\n\n/** @deprecated 使用 registerAnalytics */\nexport function setGlobalAnalytics(analytics: Analytics): void {\n registerAnalytics(analytics);\n}\n\n/** @deprecated 使用 getRegisteredAnalytics */\nexport function getGlobalAnalytics(): Analytics | null {\n return getRegisteredAnalytics();\n}\n","/**\n * Analytics 预设配置\n * Analytics Preset Configurations\n *\n * 提供常见场景的配置模板(不包含平台适配器)\n * 使用时需要提供具体的 adapter 实现\n */\n\nimport type { AnalyticsConfig } from '../types';\n\n/**\n * Web 应用基础配置模板\n */\nexport function createWebConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n enableAutoPageView?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'web',\n enableAutoPageView: options.enableAutoPageView ?? true,\n debug:\n options.debug ??\n (typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'),\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 移动应用基础配置模板\n */\nexport function createMobileConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'mobile',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 小程序基础配置模板\n */\nexport function createMiniappConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'miniapp',\n enableAutoPageView: true,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 桌面应用基础配置模板\n */\nexport function createDesktopConfig(\n appId: string,\n options: {\n endpoint?: string;\n debug?: boolean;\n appVersion?: string;\n } = {}\n): Partial<AnalyticsConfig> {\n return {\n appId,\n appVersion: options.appVersion || '1.0.0',\n endpoint: options.endpoint || '/api/analytics/events',\n platform: 'desktop',\n enableAutoPageView: false,\n debug: options.debug ?? false,\n // adapter 需要由调用者提供\n };\n}\n\n/**\n * 使用示例:\n *\n * ```typescript\n * import { createWebConfig, createAnalytics } from '@qhr123/sa2kit/analytics';\n * import { webAdapter } from './adapters/web'; // 你的适配器实现\n *\n * const config = createWebConfig('my-app', {\n * endpoint: 'https://api.example.com/analytics',\n * debug: true,\n * });\n *\n * const analytics = createAnalytics('my-instance', {\n * ...config,\n * adapter: webAdapter, // 提供具体的适配器\n * });\n * ```\n */\n","/**\n * Analytics 单例管理器\n * Analytics Singleton Manager\n *\n * 提供统一的单例创建和管理功能,支持多个独立实例\n */\n\nimport { Analytics } from '../core/Analytics';\nimport type { AnalyticsConfig } from '../types';\n\n// 存储多个实例的 Map\nconst instances = new Map<string, Analytics>();\n\n/**\n * 创建或获取 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @param config Analytics 配置\n * @returns Analytics 实例\n */\nexport function createAnalytics(instanceKey: string, config: AnalyticsConfig): Analytics {\n if (!instances.has(instanceKey)) {\n instances.set(instanceKey, new Analytics(config));\n }\n return instances.get(instanceKey)!;\n}\n\n/**\n * 获取已存在的 Analytics 实例\n * @param instanceKey 实例唯一标识\n * @returns Analytics 实例或 null\n */\nexport function getAnalyticsInstance(instanceKey: string): Analytics | null {\n return instances.get(instanceKey) || null;\n}\n\n/**\n * 重置指定实例\n * @param instanceKey 实例唯一标识\n */\nexport function resetAnalytics(instanceKey: string): void {\n instances.delete(instanceKey);\n}\n\n/**\n * 重置所有实例\n */\nexport function resetAllAnalytics(): void {\n instances.clear();\n}\n\n/**\n * 检查实例是否已初始化\n * @param instanceKey 实例唯一标识\n */\nexport function isAnalyticsInitialized(instanceKey: string): boolean {\n return instances.has(instanceKey);\n}\n\n/**\n * 获取所有已创建的实例键名\n */\nexport function getAllInstanceKeys(): string[] {\n return Array.from(instances.keys());\n}\n","/**\n * 埋点工具函数\n * Analytics Helper Functions\n */\n\nimport type { AnalyticsEvent } from '../types';\n\n/**\n * 节流函数\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n let previous = 0;\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now();\n const remaining = wait - (now - previous);\n\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(this, args);\n } else if (!timeout) {\n timeout = setTimeout(() => {\n previous = Date.now();\n timeout = null;\n func.apply(this, args);\n }, remaining);\n }\n };\n}\n\n/**\n * 防抖函数\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeout: any = null;\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n func.apply(this, args);\n }, wait);\n };\n}\n\n/**\n * 格式化事件数据\n */\nexport function formatEvent(event: AnalyticsEvent): string {\n return JSON.stringify(event, null, 2);\n}\n\n/**\n * 验证事件数据\n */\nexport function validateEvent(event: AnalyticsEvent): boolean {\n if (!event.event_id || !event.event_type || !event.event_name) {\n return false;\n }\n if (!event.timestamp || event.timestamp <= 0) {\n return false;\n }\n if (!event.session_id || !event.device_id) {\n return false;\n }\n return true;\n}\n\n/**\n * 批量验证事件\n */\nexport function validateEvents(events: AnalyticsEvent[]): {\n valid: AnalyticsEvent[];\n invalid: AnalyticsEvent[];\n} {\n const valid: AnalyticsEvent[] = [];\n const invalid: AnalyticsEvent[] = [];\n\n events.forEach((event) => {\n if (validateEvent(event)) {\n valid.push(event);\n } else {\n invalid.push(event);\n }\n });\n\n return { valid, invalid };\n}\n\n/**\n * 计算事件大小(字节)\n */\nexport function getEventSize(event: AnalyticsEvent): number {\n return new Blob([JSON.stringify(event)]).size;\n}\n\n/**\n * 计算批量事件大小\n */\nexport function getBatchSize(events: AnalyticsEvent[]): number {\n return events.reduce((total, event) => total + getEventSize(event), 0);\n}\n\n/**\n * 过滤敏感信息\n */\nexport function sanitizeEvent(\n event: AnalyticsEvent,\n sensitiveKeys: string[] = ['password', 'token', 'secret', 'key']\n): AnalyticsEvent {\n const sanitized = { ...event };\n\n if (sanitized.properties) {\n const cleanProperties = { ...sanitized.properties };\n\n sensitiveKeys.forEach((key) => {\n if (key in cleanProperties) {\n cleanProperties[key] = '***';\n }\n });\n\n sanitized.properties = cleanProperties;\n }\n\n return sanitized;\n}\n\n/**\n * 合并事件属性\n */\nexport function mergeEventProperties(\n baseProperties: Record<string, any>,\n ...additionalProperties: Record<string, any>[]\n): Record<string, any> {\n return Object.assign({}, baseProperties, ...additionalProperties);\n}\n\n/**\n * 生成唯一ID\n */\nexport function generateUniqueId(prefix: string = ''): string {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return prefix ? (prefix) + '_' + (timestamp) + '_' + (random) : (timestamp) + '_' + (random);\n}\n\n/**\n * 判断是否为移动设备\n */\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n\n return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n}\n\n/**\n * 判断是否为开发环境\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * 格式化时间戳\n */\nexport function formatTimestamp(\n timestamp: number,\n format: 'date' | 'datetime' | 'time' = 'datetime'\n): string {\n const date = new Date(timestamp);\n\n switch (format) {\n case 'date':\n return date.toLocaleDateString();\n case 'time':\n return date.toLocaleTimeString();\n case 'datetime':\n default:\n return date.toLocaleString();\n }\n}\n\n/**\n * 深拷贝对象\n */\nexport function deepClone<T>(obj: T): T {\n return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * 安全的 JSON.stringify\n */\nexport function safeStringify(obj: any, fallback: string = '{}'): string {\n try {\n return JSON.stringify(obj);\n } catch (error) {\n console.error('Failed to stringify object:', error);\n return fallback;\n }\n}\n\n/**\n * 安全的 JSON.parse\n */\nexport function safeParse<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json);\n } catch (error) {\n console.error('Failed to parse JSON:', error);\n return fallback;\n }\n}\n\n/**\n * 获取页面停留时长\n */\nexport function getPageDuration(startTime: number): number {\n return Date.now() - startTime;\n}\n\n/**\n * 获取当前页面 URL\n */\nexport function getCurrentPageUrl(): string {\n if (typeof window !== 'undefined') {\n return window.location.href;\n }\n return '';\n}\n\n/**\n * 获取当前页面标题\n */\nexport function getCurrentPageTitle(): string {\n if (typeof document !== 'undefined') {\n return document.title;\n }\n return '';\n}\n\n/**\n * 获取来源页面\n */\nexport function getReferrer(): string {\n if (typeof document !== 'undefined') {\n return document.referrer;\n }\n return '';\n}\n","/**\n * 埋点装饰器\n * Analytics Decorators\n */\n\nimport type { Analytics } from '../core/Analytics';\nimport { getRegisteredAnalytics } from '../registry';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 追踪方法执行\n * @param eventName 事件名称\n * @param priority 事件优先级\n */\nexport function Track(eventName?: string, priority: EventPriority = EventPriority.NORMAL) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n // 执行前记录\n const startTime = Date.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n\n // 执行成功\n analytics?.track(\n EventType.CUSTOM,\n finalEventName,\n {\n success: true,\n duration: Date.now() - startTime,\n args: JSON.stringify(args),\n },\n priority\n );\n\n return result;\n } catch (error) {\n // 执行失败\n analytics?.track(\n EventType.ERROR,\n (finalEventName) + '_error',\n {\n success: false,\n duration: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n },\n EventPriority.HIGH\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪点击事件\n */\nexport function TrackClick(eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalEventName = eventName || propertyKey;\n\n analytics?.track(\n EventType.CLICK,\n finalEventName,\n {\n args: JSON.stringify(args),\n },\n EventPriority.LOW\n );\n\n return originalMethod.apply(this, args);\n };\n\n return descriptor;\n };\n}\n\n/**\n * 追踪性能\n */\nexport function TrackPerformance(metricName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n const analytics = getAnalyticsInstance(this);\n const finalMetricName = metricName || propertyKey;\n const startTime = performance.now();\n\n try {\n const result = await originalMethod.apply(this, args);\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: true,\n });\n\n return result;\n } catch (error) {\n const duration = performance.now() - startTime;\n\n analytics?.trackPerformance(finalMetricName, duration, 'ms', {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 自动捕获错误\n */\nexport function CatchError(_eventName?: string) {\n return function (_target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: any, ...args: any[]) {\n try {\n return await originalMethod.apply(this, args);\n } catch (error) {\n const analytics = getAnalyticsInstance(this);\n\n analytics?.trackError(\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error.stack : undefined,\n error instanceof Error ? error.name : 'Error',\n {\n method: propertyKey,\n args: JSON.stringify(args),\n }\n );\n\n throw error;\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * 从实例中获取 Analytics 实例\n */\nfunction getAnalyticsInstance(instance: any): Analytics | null {\n // 尝试多种方式获取\n if (instance.analytics) {\n return instance.analytics;\n }\n if (instance._analytics) {\n return instance._analytics;\n }\n return getRegisteredAnalytics();\n}\n\nexport {\n registerAnalytics,\n getRegisteredAnalytics,\n unregisterAnalytics,\n setGlobalAnalytics,\n getGlobalAnalytics,\n} from '../registry';\n","'use client';\n\n/**\n * React Hooks for Analytics\n * 埋点 React Hooks\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport type { Analytics } from '../core/Analytics';\nimport { EventType, EventPriority } from '../types';\n\n/**\n * 使用埋点实例\n */\nexport function useAnalytics(analytics: Analytics | null) {\n return analytics;\n}\n\n/**\n * 追踪页面浏览\n */\nexport function usePageView(analytics: Analytics | null, pageUrl?: string, pageTitle?: string) {\n useEffect(() => {\n if (!analytics) return;\n\n const url = pageUrl || (typeof window !== 'undefined' ? window.location.href : '');\n const title = pageTitle || (typeof document !== 'undefined' ? document.title : '');\n\n analytics.trackPageView(url, title);\n }, [analytics, pageUrl, pageTitle]);\n}\n\n/**\n * 追踪事件(返回追踪函数)\n */\nexport function useTrackEvent(analytics: Analytics | null) {\n return useCallback(\n (\n eventType: EventType,\n eventName: string,\n properties?: Record<string, any>,\n priority?: EventPriority\n ) => {\n if (analytics) {\n analytics.track(eventType, eventName, properties, priority);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪点击事件\n */\nexport function useTrackClick(analytics: Analytics | null) {\n return useCallback(\n (elementInfo: {\n elementId?: string;\n elementClass?: string;\n elementText?: string;\n elementType?: string;\n }) => {\n if (analytics) {\n analytics.trackClick(elementInfo);\n }\n },\n [analytics]\n );\n}\n\n/**\n * 追踪页面停留时长\n */\nexport function usePageDuration(analytics: Analytics | null) {\n const startTimeRef = useRef<number>(Date.now());\n\n useEffect(() => {\n startTimeRef.current = Date.now();\n\n return () => {\n if (analytics) {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n }\n };\n }, [analytics]);\n}\n\n/**\n * 追踪性能指标\n */\nexport function usePerformanceTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n // 监听页面加载性能\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n const domReadyTime = timing.domContentLoadedEventEnd - timing.navigationStart;\n const firstPaintTime = timing.responseStart - timing.navigationStart;\n\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n analytics.trackPerformance('dom_ready_time', domReadyTime, 'ms');\n analytics.trackPerformance('first_paint_time', firstPaintTime, 'ms');\n }\n\n // 监听资源加载性能\n if ('PerformanceObserver' in window) {\n const observer = new PerformanceObserver((list) => {\n list.getEntries().forEach((entry) => {\n if (entry.entryType === 'resource') {\n analytics.trackPerformance('resource_load_time', entry.duration, 'ms', {\n resource_name: entry.name,\n });\n }\n });\n });\n\n observer.observe({ entryTypes: ['resource'] });\n\n return () => observer.disconnect();\n }\n\n return undefined;\n }, [analytics]);\n}\n\n/**\n * 追踪错误\n */\nexport function useErrorTracking(analytics: Analytics | null) {\n useEffect(() => {\n if (!analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name, {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n });\n };\n\n const handleUnhandledRejection = (event: PromiseRejectionEvent) => {\n analytics.trackError('Unhandled Promise Rejection', undefined, 'PromiseRejection', {\n reason: String(event.reason),\n });\n };\n\n window.addEventListener('error', handleError);\n window.addEventListener('unhandledrejection', handleUnhandledRejection);\n\n return () => {\n window.removeEventListener('error', handleError);\n window.removeEventListener('unhandledrejection', handleUnhandledRejection);\n };\n }, [analytics]);\n}\n\n/**\n * 自动追踪用户行为(综合 Hook)\n */\nexport function useAutoTracking(\n analytics: Analytics | null,\n options: {\n trackPageView?: boolean;\n trackPageDuration?: boolean;\n trackPerformance?: boolean;\n trackErrors?: boolean;\n } = {}\n) {\n const {\n trackPageView = true,\n trackPageDuration = true,\n trackPerformance = true,\n trackErrors = true,\n } = options;\n\n // 页面浏览\n useEffect(() => {\n if (trackPageView && analytics) {\n const url = typeof window !== 'undefined' ? window.location.href : '';\n const title = typeof document !== 'undefined' ? document.title : '';\n analytics.trackPageView(url, title);\n }\n }, [analytics, trackPageView]);\n\n // 页面停留时长\n const startTimeRef = useRef<number>(Date.now());\n useEffect(() => {\n if (!trackPageDuration || !analytics) return;\n\n startTimeRef.current = Date.now();\n\n return () => {\n const duration = Date.now() - startTimeRef.current;\n analytics.track(\n EventType.PAGE_LEAVE,\n 'page_leave',\n {\n duration,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n },\n EventPriority.NORMAL\n );\n };\n }, [analytics, trackPageDuration]);\n\n // 性能追踪\n useEffect(() => {\n if (!trackPerformance || !analytics || typeof window === 'undefined') return;\n\n const handleLoad = () => {\n if ('performance' in window && 'timing' in window.performance) {\n const timing = window.performance.timing as any;\n const loadTime = timing.loadEventEnd - timing.navigationStart;\n analytics.trackPerformance('page_load_time', loadTime, 'ms');\n }\n };\n\n window.addEventListener('load', handleLoad);\n return () => window.removeEventListener('load', handleLoad);\n }, [analytics, trackPerformance]);\n\n // 错误追踪\n useEffect(() => {\n if (!trackErrors || !analytics || typeof window === 'undefined') return;\n\n const handleError = (event: ErrorEvent) => {\n analytics.trackError(event.message, event.error?.stack, event.error?.name);\n };\n\n window.addEventListener('error', handleError);\n return () => window.removeEventListener('error', handleError);\n }, [analytics, trackErrors]);\n}\n","/**\n * Web 平台适配器\n * Browser/Next.js Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\nimport { WebStorageAdapter } from '../../storage/adapters/web-adapter';\n\n/**\n * Web 事件存储适配器\n * 基于通用 WebStorageAdapter 实现\n * \n * 注意:此适配器专门用于 Analytics 埋点事件的存储\n * 与通用存储适配器 (storage/adapters/web-adapter) 不同\n */\nexport class WebEventStorageAdapter implements AnalyticsStorageAdapter {\n private storage = new WebStorageAdapter();\n private EVENTS_KEY = 'analytics:events';\n private DEVICE_INFO_KEY = 'analytics:device_info';\n private SESSION_ID_KEY = 'analytics:session_id';\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n await this.storage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n const data = await this.storage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n await this.storage.removeItem(this.EVENTS_KEY);\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n await this.storage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n const data = await this.storage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n // sessionStorage 需要特殊处理\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n sessionStorage.setItem(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (typeof window !== 'undefined' && typeof sessionStorage !== 'undefined') {\n return sessionStorage.getItem(this.SESSION_ID_KEY);\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Web 网络适配器\n */\nexport class WebNetworkAdapter implements AnalyticsNetworkAdapter {\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n // 使用 keepalive 确保页面关闭时也能发送\n keepalive: true,\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: 'HTTP ' + (response.status),\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n return true;\n }\n}\n\n/**\n * Web 设备信息适配器\n */\nexport class WebDeviceAdapter implements AnalyticsDeviceAdapter {\n async getDeviceInfo(): Promise<DeviceInfo> {\n return {\n device_id: await this.generateDeviceId(),\n os_name: this.getOSName(),\n os_version: this.getOSVersion(),\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n device_model: this.getBrowserName(),\n device_brand: this.getBrowserVersion(),\n };\n }\n\n async generateDeviceId(): Promise<string> {\n // 尝试从 localStorage 获取已存在的 ID\n if (typeof window !== 'undefined') {\n let deviceId = localStorage.getItem('analytics:device_id');\n\n if (!deviceId) {\n deviceId = 'web_' + (Date.now()) + '_' + (Math.random().toString(36).substring(2, 15));\n localStorage.setItem('analytics:device_id', deviceId);\n }\n\n return deviceId;\n }\n\n return 'web_' + (Date.now()) + '_' + (Math.random().toString(36).substring(2, 15));\n }\n\n private getOSName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n\n if (userAgent.indexOf('Win') !== -1) return 'Windows';\n if (userAgent.indexOf('Mac') !== -1) return 'MacOS';\n if (userAgent.indexOf('Linux') !== -1) return 'Linux';\n if (userAgent.indexOf('Android') !== -1) return 'Android';\n if (userAgent.indexOf('iOS') !== -1) return 'iOS';\n\n return 'unknown';\n }\n\n private getOSVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n const match = userAgent.match(/\\(([^)]+)\\)/);\n\n return match && match[1] ? match[1] : 'unknown';\n }\n\n private getBrowserName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n\n if (userAgent.indexOf('Chrome') !== -1) return 'Chrome';\n if (userAgent.indexOf('Safari') !== -1) return 'Safari';\n if (userAgent.indexOf('Firefox') !== -1) return 'Firefox';\n if (userAgent.indexOf('Edge') !== -1) return 'Edge';\n\n return 'unknown';\n }\n\n private getBrowserVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const userAgent = navigator.userAgent;\n const match = userAgent.match(/(Chrome|Safari|Firefox|Edge)\\/(\\d+)/);\n\n return match && match[2] ? match[2] : 'unknown';\n }\n}\n\n/**\n * 统一的 Web 适配器对象\n */\nexport const webAdapter = {\n storage: new WebEventStorageAdapter(),\n network: new WebNetworkAdapter(),\n device: new WebDeviceAdapter(),\n};\n\n","/**\n * Mobile 平台适配器\n * React Native Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Mobile 事件存储适配器\n * 需要在 mobile 项目中实现具体的 AsyncStorage 逻辑\n */\nexport class MobileEventStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = '@analytics:events';\n private DEVICE_INFO_KEY = '@analytics:device_info';\n private SESSION_ID_KEY = '@analytics:session_id';\n\n // 需要注入具体的存储实现\n constructor(\n private storage: {\n getItem: (key: string) => Promise<string | null>;\n setItem: (key: string, value: string) => Promise<void>;\n removeItem: (key: string) => Promise<void>;\n }\n ) {}\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n await this.storage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n const data = await this.storage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n await this.storage.removeItem(this.EVENTS_KEY);\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n await this.storage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n const data = await this.storage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n await this.storage.setItem(this.SESSION_ID_KEY, sessionId);\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n return await this.storage.getItem(this.SESSION_ID_KEY);\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Mobile 网络适配器\n */\nexport class MobileNetworkAdapter implements AnalyticsNetworkAdapter {\n // 需要注入网络检查函数\n constructor(\n private netInfo?: {\n fetch: () => Promise<{ isConnected: boolean | null }>;\n }\n ) {}\n\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: 'HTTP ' + (response.status),\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n try {\n if (this.netInfo) {\n const state = await this.netInfo.fetch();\n return state.isConnected ?? false;\n }\n // 如果没有 NetInfo,假设在线\n return true;\n } catch (error) {\n return true;\n }\n }\n}\n\n/**\n * Mobile 设备信息适配器\n */\nexport class MobileDeviceAdapter implements AnalyticsDeviceAdapter {\n // 需要注入设备信息获取函数\n constructor(\n private deviceInfoModule?: {\n getSystemName: () => Promise<string>;\n getSystemVersion: () => Promise<string>;\n getModel: () => Promise<string>;\n getBrand: () => Promise<string>;\n getUniqueId: () => Promise<string>;\n }\n ) {}\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n try {\n const info = this.deviceInfoModule;\n\n return {\n device_id: info ? await info.getUniqueId() : await this.generateDeviceId(),\n device_model: info ? await info.getModel() : 'unknown',\n device_brand: info ? await info.getBrand() : 'unknown',\n os_name: info ? await info.getSystemName() : 'unknown',\n os_version: info ? await info.getSystemVersion() : 'unknown',\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n };\n } catch (error) {\n console.error('Failed to get device info:', error);\n return this.getDefaultDeviceInfo();\n }\n }\n\n async generateDeviceId(): Promise<string> {\n // 生成一个唯一的设备ID\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return 'mobile_' + (timestamp) + '_' + (random);\n }\n\n private getDefaultDeviceInfo(): DeviceInfo {\n return {\n device_id: 'mobile_' + (Date.now()),\n os_name: 'unknown',\n os_version: 'unknown',\n screen_width: 0,\n screen_height: 0,\n language: 'en',\n timezone: 'UTC',\n };\n }\n}\n\n/**\n * @deprecated 使用 MobileEventStorageAdapter 替代\n * 保留此导出以向后兼容\n */\nexport const MobileStorageAdapter = MobileEventStorageAdapter;\n","/**\n * 小程序平台适配器\n * WeChat MiniProgram Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * 小程序事件存储适配器\n */\nexport class MiniappEventStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics_events';\n private DEVICE_INFO_KEY = 'analytics_device_info';\n private SESSION_ID_KEY = 'analytics_session_id';\n\n // 需要注入 Taro 的存储 API\n constructor(\n private storage?: {\n getStorageSync: (key: string) => any;\n setStorageSync: (key: string, data: any) => void;\n removeStorageSync: (key: string) => void;\n }\n ) {}\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.EVENTS_KEY, events);\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (this.storage) {\n const data = this.storage.getStorageSync(this.EVENTS_KEY);\n return data || [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (this.storage) {\n this.storage.removeStorageSync(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.DEVICE_INFO_KEY, info);\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (this.storage) {\n return this.storage.getStorageSync(this.DEVICE_INFO_KEY) || null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (this.storage) {\n this.storage.setStorageSync(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (this.storage) {\n return this.storage.getStorageSync(this.SESSION_ID_KEY) || null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * 小程序网络适配器\n */\nexport class MiniappNetworkAdapter implements AnalyticsNetworkAdapter {\n // 需要注入 Taro 的网络 API\n constructor(\n private request?: {\n request: (options: any) => Promise<any>;\n },\n private netInfo?: {\n getNetworkType: () => Promise<{ networkType: string }>;\n }\n ) {}\n\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n if (!this.request) {\n throw new Error('Request module not provided');\n }\n\n const response = await this.request.request({\n url,\n method: 'POST',\n data: {\n events,\n timestamp: Date.now(),\n },\n header: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (response.statusCode === 200) {\n return {\n success: true,\n message: response.data.message,\n code: response.statusCode,\n };\n } else {\n return {\n success: false,\n message: 'HTTP ' + (response.statusCode),\n code: response.statusCode,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n try {\n if (this.netInfo) {\n const { networkType } = await this.netInfo.getNetworkType();\n return networkType !== 'none';\n }\n return true;\n } catch (error) {\n return true;\n }\n }\n}\n\n/**\n * 小程序设备信息适配器\n */\nexport class MiniappDeviceAdapter implements AnalyticsDeviceAdapter {\n // 需要注入 Taro 的系统信息 API\n constructor(\n private systemInfo?: {\n getSystemInfoSync: () => any;\n }\n ) {}\n\n async getDeviceInfo(): Promise<DeviceInfo> {\n try {\n if (this.systemInfo) {\n const info = this.systemInfo.getSystemInfoSync();\n\n return {\n device_id: await this.generateDeviceId(),\n device_model: info.model || 'unknown',\n device_brand: info.brand || 'unknown',\n os_name: info.platform || 'unknown',\n os_version: info.system || 'unknown',\n screen_width: info.screenWidth || 0,\n screen_height: info.screenHeight || 0,\n language: info.language || 'zh_CN',\n timezone: 'Asia/Shanghai',\n network_type: info.networkType,\n };\n }\n\n return this.getDefaultDeviceInfo();\n } catch (error) {\n console.error('Failed to get device info:', error);\n return this.getDefaultDeviceInfo();\n }\n }\n\n async generateDeviceId(): Promise<string> {\n // 小程序中使用唯一标识\n // 可以结合 openid 或其他标识\n const timestamp = Date.now();\n const random = Math.random().toString(36).substring(2, 15);\n return 'miniapp_' + (timestamp) + '_' + (random);\n }\n\n private getDefaultDeviceInfo(): DeviceInfo {\n return {\n device_id: 'miniapp_' + (Date.now()),\n os_name: 'wechat',\n os_version: 'unknown',\n screen_width: 0,\n screen_height: 0,\n language: 'zh_CN',\n timezone: 'Asia/Shanghai',\n };\n }\n}\n\n/**\n * @deprecated 使用 MiniappEventStorageAdapter 替代\n * 保留此导出以向后兼容\n */\nexport const MiniappStorageAdapter = MiniappEventStorageAdapter;\n","/**\n * Desktop 平台适配器\n * Electron Platform Adapters\n */\n\nimport type {\n AnalyticsStorageAdapter,\n AnalyticsNetworkAdapter,\n AnalyticsDeviceAdapter,\n DeviceInfo,\n AnalyticsEvent,\n UploadResponse,\n} from '../types';\n\n/**\n * Desktop 事件存储适配器(使用 localStorage)\n */\nexport class DesktopEventStorageAdapter implements AnalyticsStorageAdapter {\n private EVENTS_KEY = 'analytics:events';\n private DEVICE_INFO_KEY = 'analytics:device_info';\n private SESSION_ID_KEY = 'analytics:session_id';\n\n async saveEvents(events: AnalyticsEvent[]): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.EVENTS_KEY, JSON.stringify(events));\n }\n } catch (error) {\n console.error('Failed to save events:', error);\n }\n }\n\n async getEvents(): Promise<AnalyticsEvent[]> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.EVENTS_KEY);\n return data ? JSON.parse(data) : [];\n }\n return [];\n } catch (error) {\n console.error('Failed to get events:', error);\n return [];\n }\n }\n\n async clearEvents(): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.removeItem(this.EVENTS_KEY);\n }\n } catch (error) {\n console.error('Failed to clear events:', error);\n }\n }\n\n async saveDeviceInfo(info: DeviceInfo): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.DEVICE_INFO_KEY, JSON.stringify(info));\n }\n } catch (error) {\n console.error('Failed to save device info:', error);\n }\n }\n\n async getDeviceInfo(): Promise<DeviceInfo | null> {\n try {\n if (typeof window !== 'undefined') {\n const data = localStorage.getItem(this.DEVICE_INFO_KEY);\n return data ? JSON.parse(data) : null;\n }\n return null;\n } catch (error) {\n console.error('Failed to get device info:', error);\n return null;\n }\n }\n\n async saveSessionId(sessionId: string): Promise<void> {\n try {\n if (typeof window !== 'undefined') {\n localStorage.setItem(this.SESSION_ID_KEY, sessionId);\n }\n } catch (error) {\n console.error('Failed to save session ID:', error);\n }\n }\n\n async getSessionId(): Promise<string | null> {\n try {\n if (typeof window !== 'undefined') {\n return localStorage.getItem(this.SESSION_ID_KEY);\n }\n return null;\n } catch (error) {\n console.error('Failed to get session ID:', error);\n return null;\n }\n }\n}\n\n/**\n * Desktop 网络适配器\n */\nexport class DesktopNetworkAdapter implements AnalyticsNetworkAdapter {\n async upload(url: string, events: AnalyticsEvent[]): Promise<UploadResponse> {\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n events,\n timestamp: Date.now(),\n }),\n });\n\n if (response.ok) {\n const data = await response.json();\n return {\n success: true,\n message: data.message,\n code: response.status,\n };\n } else {\n return {\n success: false,\n message: 'HTTP ' + (response.status),\n code: response.status,\n };\n }\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : 'Network error',\n code: 0,\n };\n }\n }\n\n async isOnline(): Promise<boolean> {\n if (typeof navigator !== 'undefined' && 'onLine' in navigator) {\n return navigator.onLine;\n }\n return true;\n }\n}\n\n/**\n * Desktop 设备信息适配器\n */\nexport class DesktopDeviceAdapter implements AnalyticsDeviceAdapter {\n async getDeviceInfo(): Promise<DeviceInfo> {\n return {\n device_id: await this.generateDeviceId(),\n os_name: this.getOSName(),\n os_version: this.getOSVersion(),\n screen_width: typeof window !== 'undefined' ? window.screen.width : 0,\n screen_height: typeof window !== 'undefined' ? window.screen.height : 0,\n language: typeof navigator !== 'undefined' ? navigator.language : 'en',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n device_model: 'Desktop',\n device_brand: 'Electron',\n };\n }\n\n async generateDeviceId(): Promise<string> {\n // 尝试从 localStorage 获取已存在的 ID\n if (typeof window !== 'undefined') {\n let deviceId = localStorage.getItem('analytics:device_id');\n\n if (!deviceId) {\n // Electron 中可以使用机器的唯一标识\n // 这里简化处理,实际可以通过 IPC 获取\n deviceId = 'desktop_' + (Date.now()) + '_' + (Math.random().toString(36).substring(2, 15));\n localStorage.setItem('analytics:device_id', deviceId);\n }\n\n return deviceId;\n }\n\n return 'desktop_' + (Date.now()) + '_' + (Math.random().toString(36).substring(2, 15));\n }\n\n private getOSName(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n const platform = navigator.platform.toLowerCase();\n\n if (platform.indexOf('win') !== -1) return 'Windows';\n if (platform.indexOf('mac') !== -1) return 'MacOS';\n if (platform.indexOf('linux') !== -1) return 'Linux';\n\n return 'unknown';\n }\n\n private getOSVersion(): string {\n if (typeof navigator === 'undefined') return 'unknown';\n\n // Electron 中可以通过 process.getSystemVersion() 获取\n // 这里简化处理\n return navigator.userAgent;\n }\n}\n\n/**\n * @deprecated 使用 DesktopEventStorageAdapter 替代\n * 保留此导出以向后兼容\n */\nexport const DesktopStorageAdapter = DesktopEventStorageAdapter;\n","/**\n * 统计卡片组件\n * Statistics Card Component\n */\n\nimport React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface StatCardProps {\n title: string;\n value: string | number;\n subtitle?: string;\n icon?: React.ReactNode;\n trend?: {\n value: number;\n isPositive: boolean;\n };\n className?: string;\n}\n\nexport const StatCard: React.FC<StatCardProps> = ({\n title,\n value,\n subtitle,\n icon,\n trend,\n className = '',\n}) => {\n return (\n <div\n className={clsx('bg-white rounded-lg shadow-sm p-6 border border-gray-200 hover:shadow-md transition-shadow', className)}\n >\n <div className=\"flex items-start justify-between\">\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium text-gray-600 mb-1\">{title}</p>\n <p className=\"text-3xl font-bold text-gray-900\">{value.toLocaleString()}</p>\n {subtitle && <p className=\"text-sm text-gray-500 mt-2\">{subtitle}</p>}\n {trend && (\n <div className=\"flex items-center mt-2\">\n <span\n className={clsx('text-sm font-medium', trend.isPositive ? 'text-green-600' : 'text-red-600')}\n >\n {trend.isPositive ? '↑' : '↓'} {Math.abs(trend.value)}%\n </span>\n <span className=\"text-sm text-gray-500 ml-2\">vs 上周</span>\n </div>\n )}\n </div>\n {icon && (\n <div className=\"flex-shrink-0 bg-gradient-to-br from-purple-500 to-indigo-600 rounded-lg p-3\">\n <div className=\"text-white text-2xl\">{icon}</div>\n </div>\n )}\n </div>\n </div>\n );\n};\n","/**\n * 事件列表组件\n * Events List Component\n */\n\nimport React from 'react';\nimport type { DashboardEvent } from './types';\nimport { clsx } from 'clsx';\n\nexport interface EventListProps {\n events: DashboardEvent[];\n loading?: boolean;\n onEventClick?: (event: DashboardEvent) => void;\n className?: string;\n}\n\nexport const EventList: React.FC<EventListProps> = ({\n events,\n loading = false,\n onEventClick,\n className = '',\n}) => {\n if (loading) {\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm p-6', className)}>\n <div className=\"animate-pulse space-y-4\">\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} className=\"h-16 bg-gray-200 rounded\"></div>\n ))}\n </div>\n </div>\n );\n }\n\n if (events.length === 0) {\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm p-12 text-center', className)}>\n <div className=\"text-gray-400 text-5xl mb-4\">📊</div>\n <p className=\"text-gray-600 text-lg font-medium\">暂无数据</p>\n <p className=\"text-gray-500 text-sm mt-2\">尝试调整筛选条件</p>\n </div>\n );\n }\n\n const getPlatformColor = (platform: string) => {\n const colors: Record<string, string> = {\n web: 'bg-blue-100 text-blue-800',\n mobile: 'bg-green-100 text-green-800',\n miniapp: 'bg-purple-100 text-purple-800',\n desktop: 'bg-gray-100 text-gray-800',\n };\n return colors[platform] || 'bg-gray-100 text-gray-800';\n };\n\n const getEventTypeColor = (eventType: string) => {\n const colors: Record<string, string> = {\n page_view: 'bg-indigo-100 text-indigo-800',\n click: 'bg-amber-100 text-amber-800',\n error: 'bg-red-100 text-red-800',\n performance: 'bg-cyan-100 text-cyan-800',\n api_call: 'bg-emerald-100 text-emerald-800',\n };\n return colors[eventType] || 'bg-gray-100 text-gray-800';\n };\n\n const formatTimestamp = (timestamp: string) => {\n const date = new Date(timestamp);\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (minutes < 1) return '刚刚';\n if (minutes < 60) return (minutes) + '分钟前';\n if (hours < 24) return (hours) + '小时前';\n if (days < 7) return (days) + '天前';\n return date.toLocaleDateString('zh-CN');\n };\n\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm overflow-hidden', className)}>\n <div className=\"overflow-x-auto\">\n <table className=\"min-w-full divide-y divide-gray-200\">\n <thead className=\"bg-gray-50\">\n <tr>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n 事件\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n 平台\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n 页面\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n 用户\n </th>\n <th className=\"px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n 时间\n </th>\n <th className=\"px-6 py-3 text-right text-xs font-medium text-gray-500 uppercase tracking-wider\">\n 操作\n </th>\n </tr>\n </thead>\n <tbody className=\"bg-white divide-y divide-gray-200\">\n {events.map((event) => (\n <tr\n key={event.id}\n className=\"hover:bg-gray-50 cursor-pointer transition-colors\"\n onClick={() => onEventClick?.(event)}\n >\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"flex flex-col\">\n <span\n className={clsx('inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium', getEventTypeColor(\n event.eventType\n ), 'w-fit mb-1')}\n >\n {event.eventType}\n </span>\n <span className=\"text-sm text-gray-900\">{event.eventName}</span>\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <span\n className={clsx('inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium', getPlatformColor(\n event.platform\n ))}\n >\n {event.platform}\n </span>\n </td>\n <td className=\"px-6 py-4\">\n <div className=\"text-sm text-gray-900 max-w-xs truncate\">\n {event.pageUrl || '-'}\n </div>\n {event.pageTitle && (\n <div className=\"text-xs text-gray-500 max-w-xs truncate\">{event.pageTitle}</div>\n )}\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"text-sm text-gray-900\">{event.userId || '游客'}</div>\n <div className=\"text-xs text-gray-500\">{event.deviceId.slice(0, 8)}...</div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap\">\n <div className=\"text-sm text-gray-900\">{formatTimestamp(event.timestamp)}</div>\n <div className=\"text-xs text-gray-500\">\n {new Date(event.timestamp).toLocaleTimeString('zh-CN')}\n </div>\n </td>\n <td className=\"px-6 py-4 whitespace-nowrap text-right text-sm font-medium\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n onEventClick?.(event);\n }}\n className=\"text-indigo-600 hover:text-indigo-900\"\n >\n 详情\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n );\n};\n","/**\n * 筛选面板组件\n * Filter Panel Component\n */\n\nimport React, { useState } from 'react';\nimport type { FilterOptions } from './types';\nimport { clsx } from 'clsx';\n\nexport interface FilterPanelProps {\n onFilterChange: (filters: FilterOptions) => void;\n initialFilters?: FilterOptions;\n className?: string;\n}\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({\n onFilterChange,\n initialFilters = {},\n className = '',\n}) => {\n const [filters, setFilters] = useState<FilterOptions>(initialFilters);\n\n const handleDatePreset = (preset: string) => {\n const now = new Date();\n let startDate = new Date();\n\n switch (preset) {\n case 'today':\n startDate.setHours(0, 0, 0, 0);\n break;\n case 'yesterday':\n startDate.setDate(now.getDate() - 1);\n startDate.setHours(0, 0, 0, 0);\n now.setDate(now.getDate() - 1);\n now.setHours(23, 59, 59, 999);\n break;\n case 'week':\n startDate.setDate(now.getDate() - 7);\n break;\n case 'month':\n startDate.setMonth(now.getMonth() - 1);\n break;\n default:\n return;\n }\n\n const newFilters = {\n ...filters,\n dateRange: {\n startDate: startDate.toISOString(),\n endDate: now.toISOString(),\n },\n };\n setFilters(newFilters);\n onFilterChange(newFilters);\n };\n\n const handleFilterChange = (key: keyof FilterOptions, value: any) => {\n const newFilters = {\n ...filters,\n [key]: value || undefined,\n };\n setFilters(newFilters);\n onFilterChange(newFilters);\n };\n\n const handleReset = () => {\n const emptyFilters: FilterOptions = {};\n setFilters(emptyFilters);\n onFilterChange(emptyFilters);\n };\n\n return (\n <div className={clsx('bg-white rounded-xl shadow-sm border border-gray-200', className)}>\n <div className=\"flex items-center justify-between mb-4 p-4 bg-gradient-to-r from-gray-50 to-gray-100 -m-6 mb-4 rounded-t-xl border-b border-gray-200\">\n <div className=\"flex items-center gap-2\">\n <svg\n className=\"w-5 h-5 text-indigo-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z\"\n />\n </svg>\n <h3 className=\"text-sm font-semibold text-gray-900\">筛选条件</h3>\n </div>\n <button\n onClick={handleReset}\n className=\"text-xs px-3 py-1 text-gray-600 hover:text-indigo-600 hover:bg-indigo-50 rounded-lg transition-colors\"\n >\n 重置\n </button>\n </div>\n <div className=\"p-4 space-y-4\">\n {/* 时间范围快捷选择 */}\n <div>\n <label className=\"block text-xs font-semibold text-gray-700 mb-2\">时间范围</label>\n <div className=\"grid grid-cols-2 gap-2\">\n {[\n { label: '今天', value: 'today' },\n { label: '昨天', value: 'yesterday' },\n { label: '7天', value: 'week' },\n { label: '30天', value: 'month' },\n ].map((preset) => (\n <button\n key={preset.value}\n onClick={() => handleDatePreset(preset.value)}\n className=\"px-3 py-1.5 text-xs font-medium border border-gray-300 rounded-lg hover:bg-indigo-50 hover:border-indigo-500 hover:text-indigo-700 transition-colors\"\n >\n {preset.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* 自定义时间范围 */}\n <div className=\"space-y-3\">\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1.5\">开始时间</label>\n <input\n type=\"datetime-local\"\n value={\n filters.dateRange?.startDate\n ? new Date(filters.dateRange.startDate).toISOString().slice(0, 16)\n : ''\n }\n onChange={(e) =>\n handleFilterChange('dateRange', {\n ...filters.dateRange,\n startDate: e.target.value ? new Date(e.target.value).toISOString() : undefined,\n })\n }\n className=\"w-full px-2 py-1.5 text-xs border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500\"\n />\n </div>\n <div>\n <label className=\"block text-xs font-medium text-gray-700 mb-1.5\">结束时间</label>\n <input\n type=\"datetime-local\"\n value={\n filters.dateRange?.endDate\n ? new Date(filters.dateRange.endDate).toISOString().slice(0, 16)\n : ''\n }\n onChange={(e) =>\n handleFilterChange('dateRange', {\n ...filters.dateRange,\n endDate: e.target.value ? new Date(e.target.value).toISOString() : undefined,\n })\n }\n className=\"w-full px-2 py-1.5 text-xs border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500\"\n />\n </div>\n </div>\n\n {/* 事件类型 */}\n <div>\n <label className=\"block text-xs font-semibold text-gray-700 mb-2\">事件类型</label>\n <select\n value={filters.eventType || ''}\n onChange={(e) => handleFilterChange('eventType', e.target.value)}\n className=\"w-full px-2 py-1.5 text-xs border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500\"\n >\n <option value=\"\">全部</option>\n <option value=\"page_view\">页面浏览</option>\n <option value=\"click\">点击</option>\n <option value=\"search\">搜索</option>\n <option value=\"login\">登录</option>\n <option value=\"logout\">登出</option>\n <option value=\"error\">错误</option>\n <option value=\"performance\">性能</option>\n <option value=\"api_call\">API 调用</option>\n <option value=\"custom\">自定义</option>\n </select>\n </div>\n\n {/* 平台 */}\n <div>\n <label className=\"block text-xs font-semibold text-gray-700 mb-2\">平台</label>\n <select\n value={filters.platform || ''}\n onChange={(e) => handleFilterChange('platform', e.target.value)}\n className=\"w-full px-2 py-1.5 text-xs border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500\"\n >\n <option value=\"\">全部</option>\n <option value=\"web\">Web</option>\n <option value=\"mobile\">Mobile</option>\n <option value=\"miniapp\">小程序</option>\n <option value=\"desktop\">Desktop</option>\n </select>\n </div>\n\n {/* 用户ID */}\n <div>\n <label className=\"block text-xs font-semibold text-gray-700 mb-2\">用户ID</label>\n <input\n type=\"text\"\n value={filters.userId || ''}\n onChange={(e) => handleFilterChange('userId', e.target.value)}\n placeholder=\"输入用户ID\"\n className=\"w-full px-2 py-1.5 text-xs border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500 placeholder:text-gray-400\"\n />\n </div>\n </div>\n\n {/* 当前筛选条件摘要 */}\n <div className=\"px-4 py-3 bg-gray-50 -mx-6 -mb-6 mt-4 rounded-b-xl border-t border-gray-200\">\n <div className=\"flex items-center gap-2\">\n <div\n className={clsx('w-2 h-2 rounded-full', Object.keys(filters).length > 0 ? 'bg-green-500' : 'bg-gray-300')}\n ></div>\n <p className=\"text-xs text-gray-600\">\n {Object.keys(filters).length === 0\n ? '未应用筛选'\n : (Object.keys(filters).length) + ' 个筛选'}\n </p>\n </div>\n </div>\n </div>\n );\n};\n","/**\n * 图表组件\n * Charts Component\n */\n\nimport React from 'react';\nimport type { ChartDataPoint } from './types';\nimport { clsx } from 'clsx';\n\nexport interface PieChartProps {\n data: ChartDataPoint[];\n title?: string;\n className?: string;\n}\n\nexport const PieChart: React.FC<PieChartProps> = ({ data, title, className = '' }) => {\n const total = data.reduce((sum, item) => sum + item.value, 0);\n\n const colors = [\n 'bg-blue-500',\n 'bg-green-500',\n 'bg-purple-500',\n 'bg-yellow-500',\n 'bg-pink-500',\n 'bg-indigo-500',\n 'bg-red-500',\n 'bg-cyan-500',\n ];\n\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm p-6', className)}>\n {title && <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">{title}</h3>}\n <div className=\"space-y-3\">\n {data.map((item, index) => {\n const percentage = total > 0 ? ((item.value / total) * 100).toFixed(1) : 0;\n return (\n <div key={index}>\n <div className=\"flex items-center justify-between text-sm mb-1\">\n <span className=\"text-gray-700 font-medium\">{item.name}</span>\n <span className=\"text-gray-600\">\n {item.value.toLocaleString()} ({percentage}%)\n </span>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className={clsx('h-2 rounded-full', colors[index % colors.length])}\n style={{ width: (percentage) + '%' }}\n />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport interface BarChartProps {\n data: ChartDataPoint[];\n title?: string;\n className?: string;\n}\n\nexport const BarChart: React.FC<BarChartProps> = ({ data, title, className = '' }) => {\n const maxValue = Math.max(...data.map((item) => item.value), 1);\n\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm p-6', className)}>\n {title && <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">{title}</h3>}\n <div className=\"space-y-4\">\n {data.map((item, index) => {\n const percentage = (item.value / maxValue) * 100;\n return (\n <div key={index} className=\"flex items-center gap-4\">\n <div className=\"w-32 text-sm text-gray-700 font-medium truncate\">{item.name}</div>\n <div className=\"flex-1 flex items-center gap-2\">\n <div className=\"flex-1 bg-gray-200 rounded-full h-8 relative overflow-hidden\">\n <div\n className=\"h-full bg-gradient-to-r from-indigo-500 to-purple-600 flex items-center justify-end px-3\"\n style={{ width: (percentage) + '%', minWidth: '40px' }}\n >\n <span className=\"text-xs text-white font-semibold\">\n {item.value.toLocaleString()}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n\nexport interface LineChartProps {\n data: ChartDataPoint[];\n title?: string;\n className?: string;\n}\n\nexport const LineChart: React.FC<LineChartProps> = ({ data, title, className = '' }) => {\n const maxValue = Math.max(...data.map((item) => item.value), 1);\n const height = 200;\n\n const points = data\n .map((item, index) => {\n const x = (index / (data.length - 1 || 1)) * 100;\n const y = height - (item.value / maxValue) * height;\n return (x) + ',' + (y);\n })\n .join(' ');\n\n return (\n <div className={clsx('bg-white rounded-lg shadow-sm p-6', className)}>\n {title && <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">{title}</h3>}\n <div className=\"relative\" style={{ height: (height) + 'px' }}>\n <svg viewBox={'0 0 100 ' + (height)} preserveAspectRatio=\"none\" className=\"w-full h-full\">\n {/* 网格线 */}\n {[0, 25, 50, 75, 100].map((y) => (\n <line\n key={y}\n x1=\"0\"\n y1={y * (height / 100)}\n x2=\"100\"\n y2={y * (height / 100)}\n stroke=\"#e5e7eb\"\n strokeWidth=\"0.5\"\n />\n ))}\n {/* 折线 */}\n <polyline\n points={points}\n fill=\"none\"\n stroke=\"url(#gradient)\"\n strokeWidth=\"2\"\n vectorEffect=\"non-scaling-stroke\"\n />\n {/* 渐变填充 */}\n <linearGradient id=\"gradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"0%\">\n <stop offset=\"0%\" stopColor=\"#6366f1\" />\n <stop offset=\"100%\" stopColor=\"#8b5cf6\" />\n </linearGradient>\n {/* 数据点 */}\n {data.map((item, index) => {\n const x = (index / (data.length - 1 || 1)) * 100;\n const y = height - (item.value / maxValue) * height;\n return (\n <circle\n key={index}\n cx={x}\n cy={y}\n r=\"1.5\"\n fill=\"#6366f1\"\n vectorEffect=\"non-scaling-stroke\"\n />\n );\n })}\n </svg>\n </div>\n {/* X 轴标签 */}\n <div className=\"flex justify-between mt-4 text-xs text-gray-600\">\n {data.map((item, index) => (\n <span key={index} className=\"truncate max-w-[60px]\">\n {item.name}\n </span>\n ))}\n </div>\n </div>\n );\n};\n","/**\n * 埋点数据仪表板组件\n * Analytics Dashboard Component\n */\n\n'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { StatCard } from './StatCard';\nimport { EventList } from './EventList';\nimport { FilterPanel } from './FilterPanel';\nimport { PieChart, BarChart } from './Charts';\nimport type { DashboardEvent, DashboardStats, FilterOptions } from './types';\nimport { clsx } from 'clsx';\n\nexport interface AnalyticsDashboardProps {\n apiBaseUrl?: string;\n className?: string;\n}\n\nexport const AnalyticsDashboard: React.FC<AnalyticsDashboardProps> = ({\n apiBaseUrl = '/api/analytics',\n className = '',\n}) => {\n const [stats, setStats] = useState<DashboardStats | null>(null);\n const [events, setEvents] = useState<DashboardEvent[]>([]);\n const [filters, setFilters] = useState<FilterOptions>({});\n const [loading, setLoading] = useState(true);\n const [selectedEvent, setSelectedEvent] = useState<DashboardEvent | null>(null);\n const [currentPage, setCurrentPage] = useState(1);\n const [totalEvents, setTotalEvents] = useState(0);\n const pageSize = 20;\n\n // 加载统计数据\n const loadStats = async () => {\n try {\n const params = new URLSearchParams();\n if (filters.dateRange?.startDate) {\n params.append('startDate', filters.dateRange.startDate);\n }\n if (filters.dateRange?.endDate) {\n params.append('endDate', filters.dateRange.endDate);\n }\n if (filters.platform) {\n params.append('platform', filters.platform);\n }\n\n const response = await fetch((apiBaseUrl) + '/stats?' + (params));\n const data = await response.json();\n\n if (data.success) {\n setStats(data.data);\n }\n } catch (error) {\n console.error('Failed to load stats:', error);\n }\n };\n\n // 加载事件列表\n const loadEvents = async () => {\n try {\n setLoading(true);\n const params = new URLSearchParams();\n\n if (filters.dateRange?.startDate) {\n params.append('startDate', filters.dateRange.startDate);\n }\n if (filters.dateRange?.endDate) {\n params.append('endDate', filters.dateRange.endDate);\n }\n if (filters.eventType) {\n params.append('eventType', filters.eventType);\n }\n if (filters.platform) {\n params.append('platform', filters.platform);\n }\n if (filters.userId) {\n params.append('userId', filters.userId);\n }\n\n params.append('limit', pageSize.toString());\n params.append('offset', ((currentPage - 1) * pageSize).toString());\n params.append('orderBy', 'timestamp');\n params.append('orderDirection', 'desc');\n\n const response = await fetch((apiBaseUrl) + '/query?' + (params));\n const data = await response.json();\n\n if (data.success) {\n setEvents(data.data);\n setTotalEvents(data.total);\n }\n } catch (error) {\n console.error('Failed to load events:', error);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n loadStats();\n loadEvents();\n }, [filters, currentPage]);\n\n const handleFilterChange = (newFilters: FilterOptions) => {\n setFilters(newFilters);\n setCurrentPage(1);\n };\n\n const handleEventClick = (event: DashboardEvent) => {\n setSelectedEvent(event);\n };\n\n const closeEventDetail = () => {\n setSelectedEvent(null);\n };\n\n const totalPages = Math.ceil(totalEvents / pageSize);\n\n return (\n <div className={clsx('space-y-6', className)}>\n {/* 顶部操作栏 */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2 text-sm text-gray-600\">\n <svg\n className=\"w-5 h-5 text-indigo-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\"\n />\n </svg>\n <span className=\"font-medium\">实时数据监控</span>\n </div>\n {totalEvents > 0 && (\n <span className=\"text-xs px-2 py-1 bg-indigo-100 text-indigo-700 rounded-full font-medium\">\n {totalEvents.toLocaleString()} 条记录\n </span>\n )}\n </div>\n <button\n onClick={() => {\n loadStats();\n loadEvents();\n }}\n className=\"flex items-center gap-2 px-4 py-2 text-sm bg-gradient-to-r from-indigo-600 to-purple-600 text-white rounded-lg hover:from-indigo-700 hover:to-purple-700 transition-all duration-200 shadow-sm hover:shadow-md\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\"\n />\n </svg>\n <span>刷新数据</span>\n </button>\n </div>\n\n {/* 主内容区 */}\n <div className=\"grid grid-cols-12 gap-6\">\n {/* 筛选面板(可折叠) */}\n <div className=\"col-span-12 xl:col-span-3\">\n <FilterPanel onFilterChange={handleFilterChange} initialFilters={filters} />\n </div>\n\n {/* 数据展示区 */}\n <div className=\"col-span-12 xl:col-span-9 space-y-6\">\n {/* 统计卡片 - 优化加载状态 */}\n {loading && !stats ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-4\">\n {[1, 2, 3, 4].map((i) => (\n <div\n key={i}\n className=\"bg-white rounded-xl shadow-sm border border-gray-200 p-6 animate-pulse\"\n >\n <div className=\"h-4 bg-gray-200 rounded w-20 mb-3\"></div>\n <div className=\"h-8 bg-gray-200 rounded w-24 mb-2\"></div>\n <div className=\"h-3 bg-gray-200 rounded w-16\"></div>\n </div>\n ))}\n </div>\n ) : stats ? (\n <div className=\"grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-4 animate-fade-in\">\n <StatCard\n title=\"总事件数\"\n value={stats.totalEvents}\n subtitle=\"所有平台\"\n icon=\"📈\"\n className=\"hover:scale-105 transition-transform duration-200\"\n />\n <StatCard\n title=\"独立用户\"\n value={stats.uniqueUsers}\n subtitle=\"去重统计\"\n icon=\"👥\"\n className=\"hover:scale-105 transition-transform duration-200\"\n />\n <StatCard\n title=\"会话数\"\n value={stats.uniqueSessions}\n subtitle=\"用户会话\"\n icon=\"🔗\"\n className=\"hover:scale-105 transition-transform duration-200\"\n />\n <StatCard\n title=\"设备数\"\n value={stats.uniqueDevices}\n subtitle=\"独立设备\"\n icon=\"📱\"\n className=\"hover:scale-105 transition-transform duration-200\"\n />\n </div>\n ) : null}\n\n {/* 图表区域 */}\n {stats && (\n <div className=\"space-y-6 animate-fade-in\">\n <div className=\"grid grid-cols-1 xl:grid-cols-2 gap-6\">\n <div className=\"transform hover:scale-[1.02] transition-transform duration-200\">\n <PieChart\n title=\"平台分布\"\n data={stats.eventsByPlatform.map((item) => ({\n name: item.platform,\n value: item.count,\n }))}\n />\n </div>\n <div className=\"transform hover:scale-[1.02] transition-transform duration-200\">\n <BarChart\n title=\"事件类型 Top 10\"\n data={stats.eventsByType.slice(0, 10).map((item) => ({\n name: item.eventType,\n value: item.count,\n }))}\n />\n </div>\n </div>\n\n {/* 热门页面 */}\n {stats.topPages.length > 0 && (\n <div className=\"transform hover:scale-[1.02] transition-transform duration-200\">\n <BarChart\n title=\"热门页面 Top 10\"\n data={stats.topPages.slice(0, 10).map((item) => ({\n name: item.pageUrl,\n value: item.count,\n }))}\n />\n </div>\n )}\n </div>\n )}\n\n {/* 事件列表 */}\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold text-gray-900 flex items-center gap-2\">\n <svg\n className=\"w-5 h-5 text-indigo-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"\n />\n </svg>\n 事件记录\n </h3>\n {totalEvents > 0 && !loading && (\n <span className=\"text-sm text-gray-500\">\n 显示 {(currentPage - 1) * pageSize + 1}-\n {Math.min(currentPage * pageSize, totalEvents)} / {totalEvents.toLocaleString()}\n </span>\n )}\n </div>\n\n <div className=\"animate-fade-in\">\n <EventList events={events} loading={loading} onEventClick={handleEventClick} />\n </div>\n\n {/* 分页 - 优化样式 */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between bg-gradient-to-r from-gray-50 to-gray-100 px-6 py-4 rounded-xl border border-gray-200\">\n <div className=\"hidden sm:block text-sm text-gray-600\">\n 第 <span className=\"font-semibold text-gray-900\">{currentPage}</span> 页,共{' '}\n <span className=\"font-semibold text-gray-900\">{totalPages}</span> 页\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(1, p - 1))}\n disabled={currentPage === 1}\n className=\"flex items-center gap-1 px-4 py-2 text-sm font-medium bg-white border border-gray-300 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 hover:border-indigo-500 transition-all duration-200\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n <span className=\"hidden sm:inline\">上一页</span>\n </button>\n <div className=\"sm:hidden px-4 py-2 text-sm text-gray-600\">\n {currentPage} / {totalPages}\n </div>\n <button\n onClick={() => setCurrentPage((p) => Math.min(totalPages, p + 1))}\n disabled={currentPage === totalPages}\n className=\"flex items-center gap-1 px-4 py-2 text-sm font-medium bg-white border border-gray-300 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed hover:bg-gray-50 hover:border-indigo-500 transition-all duration-200\"\n >\n <span className=\"hidden sm:inline\">下一页</span>\n <svg className=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* 事件详情弹窗 - 优化样式 */}\n {selectedEvent && (\n <div\n className=\"fixed inset-0 bg-black bg-opacity-60 backdrop-blur-sm flex items-center justify-center z-[50] p-4 animate-fade-in\"\n onClick={closeEventDetail}\n >\n <div\n className=\"bg-white rounded-2xl shadow-2xl max-w-3xl w-full max-h-[85vh] overflow-hidden animate-slide-up\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 头部 */}\n <div className=\"bg-gradient-to-r from-indigo-600 to-purple-600 px-6 py-4 flex items-center justify-between\">\n <div className=\"flex items-center gap-3 text-white\">\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <h3 className=\"text-xl font-semibold\">事件详情</h3>\n </div>\n <button\n onClick={closeEventDetail}\n className=\"text-white hover:bg-white hover:bg-opacity-20 rounded-full p-2 transition-all duration-200\"\n >\n <svg className=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n {/* 内容 */}\n <div className=\"p-6 overflow-auto max-h-[calc(85vh-80px)]\">\n <div className=\"space-y-5\">\n {/* 基础信息卡片 */}\n <div className=\"bg-gradient-to-br from-blue-50 to-indigo-50 rounded-xl p-4 border border-blue-200\">\n <div className=\"flex items-center gap-2 mb-3\">\n <svg\n className=\"w-5 h-5 text-indigo-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M7 7h.01M7 3h5c.512 0 1.024.195 1.414.586l7 7a2 2 0 010 2.828l-7 7a2 2 0 01-2.828 0l-7-7A1.994 1.994 0 013 12V7a4 4 0 014-4z\"\n />\n </svg>\n <h4 className=\"font-semibold text-gray-900\">基础信息</h4>\n </div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-gray-600\">事件ID</span>\n <code className=\"text-xs bg-white px-2 py-1 rounded border border-blue-200 font-mono text-gray-800\">\n {selectedEvent.id.slice(0, 16)}...\n </code>\n </div>\n <div className=\"grid grid-cols-2 gap-3 pt-2\">\n <div>\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">\n 事件类型\n </span>\n <span className=\"inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-indigo-100 text-indigo-800\">\n {selectedEvent.eventType}\n </span>\n </div>\n <div>\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">\n 事件名称\n </span>\n <p className=\"text-sm font-medium text-gray-900 truncate\">\n {selectedEvent.eventName}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* 平台和版本信息 */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">平台</span>\n <p className=\"text-sm font-semibold text-gray-900\">{selectedEvent.platform}</p>\n </div>\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">应用版本</span>\n <p className=\"text-sm font-semibold text-gray-900\">\n {selectedEvent.appVersion}\n </p>\n </div>\n </div>\n\n {/* 用户信息卡片 */}\n <div className=\"bg-gradient-to-br from-purple-50 to-pink-50 rounded-xl p-4 border border-purple-200\">\n <div className=\"flex items-center gap-2 mb-3\">\n <svg\n className=\"w-5 h-5 text-purple-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\"\n />\n </svg>\n <h4 className=\"font-semibold text-gray-900\">用户信息</h4>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">用户ID</span>\n <p className=\"text-sm font-medium text-gray-900\">\n {selectedEvent.userId || <span className=\"text-gray-400\">游客</span>}\n </p>\n </div>\n <div>\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">会话ID</span>\n <code className=\"text-xs bg-white px-2 py-1 rounded border border-purple-200 font-mono text-gray-800 block truncate\">\n {selectedEvent.sessionId.slice(0, 12)}...\n </code>\n </div>\n </div>\n <div className=\"mt-3 pt-3 border-t border-purple-200\">\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">设备ID</span>\n <code className=\"text-xs bg-white px-2 py-1 rounded border border-purple-200 font-mono text-gray-800 block truncate\">\n {selectedEvent.deviceId}\n </code>\n </div>\n </div>\n\n {/* 页面信息 */}\n {(selectedEvent.pageUrl || selectedEvent.pageTitle) && (\n <div className=\"bg-gradient-to-br from-green-50 to-emerald-50 rounded-xl p-4 border border-green-200\">\n <div className=\"flex items-center gap-2 mb-3\">\n <svg\n className=\"w-5 h-5 text-green-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9a9 9 0 01-9-9m9 9c1.657 0 3-4.03 3-9s-1.343-9-3-9m0 18c-1.657 0-3-4.03-3-9s1.343-9 3-9m-9 9a9 9 0 019-9\"\n />\n </svg>\n <h4 className=\"font-semibold text-gray-900\">页面信息</h4>\n </div>\n {selectedEvent.pageTitle && (\n <div className=\"mb-2\">\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">\n 页面标题\n </span>\n <p className=\"text-sm font-medium text-gray-900\">\n {selectedEvent.pageTitle}\n </p>\n </div>\n )}\n {selectedEvent.pageUrl && (\n <div>\n <span className=\"text-xs font-medium text-gray-600 block mb-1\">\n 页面URL\n </span>\n <code className=\"text-xs bg-white px-2 py-1 rounded border border-green-200 font-mono text-gray-800 block break-all\">\n {selectedEvent.pageUrl}\n </code>\n </div>\n )}\n </div>\n )}\n\n {/* 时间信息 */}\n <div className=\"bg-gradient-to-br from-amber-50 to-yellow-50 rounded-xl p-4 border border-amber-200\">\n <div className=\"flex items-center gap-2 mb-2\">\n <svg\n className=\"w-5 h-5 text-amber-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"\n />\n </svg>\n <h4 className=\"font-semibold text-gray-900\">时间信息</h4>\n </div>\n <p className=\"text-sm font-medium text-gray-900\">\n {new Date(selectedEvent.timestamp).toLocaleString('zh-CN', {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })}\n </p>\n </div>\n\n {/* 自定义属性 */}\n {selectedEvent.properties && Object.keys(selectedEvent.properties).length > 0 && (\n <div className=\"bg-gradient-to-br from-gray-50 to-slate-50 rounded-xl p-4 border border-gray-300\">\n <div className=\"flex items-center gap-2 mb-3\">\n <svg\n className=\"w-5 h-5 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\"\n />\n </svg>\n <h4 className=\"font-semibold text-gray-900\">自定义属性</h4>\n </div>\n <pre className=\"text-xs bg-white p-4 rounded-lg border border-gray-200 overflow-auto max-h-48 font-mono text-gray-800\">\n {JSON.stringify(selectedEvent.properties, null, 2)}\n </pre>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","/**\n * Config 配置管理模块\n *\n * 提供配置缓存和管理相关的 Hooks\n *\n * 依赖:swr\n */\n\n// 类型定义\nexport type {\n ConfigItem,\n AllConfigs,\n UseConfigsOptions,\n} from './types';\n\n// Hooks\nexport {\n createUseConfigs,\n prefetchConfigs,\n invalidateAllConfigs,\n} from './hooks';\n\n","'use client';\n\n/**\n * 配置缓存优化 Hook\n *\n * 使用 SWR 实现智能缓存和自动重新验证\n * 支持多平台:Web、React Native、小程序\n *\n * 优点:\n * 1. 自动缓存,减少网络请求\n * 2. 自动重新验证(可配置)\n * 3. 乐观更新\n * 4. 错误重试\n * 5. 防抖和去重\n */\n\nimport { default as useSWR, mutate } from 'swr';\nimport { useCallback } from 'react';\nimport type { AllConfigs, UseConfigsOptions, ConfigItem } from '../types';\n\nexport type { AllConfigs, UseConfigsOptions, ConfigItem };\n\n/**\n * 创建 useConfigs Hook\n */\nexport function createUseConfigs(options: UseConfigsOptions) {\n const {\n apiBaseUrl = '',\n getAuthToken,\n onUnauthorized,\n dedupingInterval = 60000,\n revalidateOnFocus = false,\n } = options;\n\n // Fetcher 函数\n const fetcher = async (url: string) => {\n const token = await getAuthToken();\n\n const res = await fetch((apiBaseUrl) + (url), {\n headers: {\n Authorization: 'Bearer ' + (token),\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n });\n\n if (!res.ok) {\n if (res.status === 401) {\n onUnauthorized?.();\n throw new Error('Unauthorized');\n }\n throw new Error('Failed to fetch configs');\n }\n\n const data = await res.json();\n return data.data as AllConfigs;\n };\n\n // 返回 Hook 函数\n return function useConfigs() {\n const {\n data,\n error,\n mutate: mutateConfigs,\n } = useSWR<AllConfigs>('/api/admin/config', fetcher, {\n // 配置选项\n revalidateOnFocus,\n revalidateOnReconnect: true, // 网络重连时重新验证\n dedupingInterval, // 缓存去重时间\n errorRetryCount: 3, // 错误重试3次\n errorRetryInterval: 5000, // 重试间隔5秒\n shouldRetryOnError: true, // 启用错误重试\n\n // 成功时的回调\n onSuccess: (_data: AllConfigs) => {\n console.log('✅ Configs loaded from cache or network');\n },\n\n // 错误时的回调\n onError: (err: Error) => {\n console.error('❌ Failed to load configs:', err);\n },\n });\n\n // 更新配置(乐观更新)\n const updateConfigs = useCallback(\n async (category: string, updates: Record<string, any>) => {\n const token = await getAuthToken();\n\n // 乐观更新:立即更新本地缓存\n mutateConfigs(\n (current: AllConfigs | undefined) => {\n if (!current) return current;\n return {\n ...current,\n [category]: {\n ...current[category],\n ...Object.entries(updates).reduce((acc, [key, value]) => {\n acc[key] = {\n ...current[category]?.[key],\n value,\n };\n return acc;\n }, {} as any),\n },\n };\n },\n false // 不立即重新验证\n );\n\n try {\n // 发送到服务器\n const res = await fetch((apiBaseUrl) + '/api/admin/config/' + (category), {\n method: 'POST',\n headers: {\n Authorization: 'Bearer ' + (token),\n 'Content-Type': 'application/json',\n },\n credentials: 'include',\n body: JSON.stringify({ configs: updates }),\n });\n\n if (!res.ok) throw new Error('Update failed');\n\n // 更新成功,重新验证缓存\n mutateConfigs();\n\n return { success: true };\n } catch (error) {\n // 更新失败,回滚\n mutateConfigs(); // 从服务器重新获取\n throw error;\n }\n },\n [mutateConfigs, getAuthToken, apiBaseUrl]\n );\n\n // 手动刷新\n const refresh = useCallback(() => {\n mutateConfigs();\n }, [mutateConfigs]);\n\n return {\n configs: data,\n isLoading: !error && !data,\n isError: !!error,\n error,\n updateConfigs,\n refresh,\n };\n };\n}\n\n/**\n * 预加载配置\n */\nexport function prefetchConfigs(apiBaseUrl: string = '') {\n mutate((apiBaseUrl) + '/api/admin/config');\n}\n\n/**\n * 全局缓存失效\n */\nexport function invalidateAllConfigs(apiBaseUrl: string = '') {\n mutate(\n (key: any) => typeof key === 'string' && key.startsWith((apiBaseUrl) + '/api/admin/config'),\n undefined,\n { revalidate: true }\n );\n}\n\n","/**\n * API 模块\n * API Module\n *\n * 提供通用的 API 客户端基类和类型定义\n */\n\nexport * from './types';\nexport * from './BaseApiClient';\n\n// 重新导出依赖的适配器类型,方便使用\nexport type { StorageAdapter } from '../storage';\nexport type { RequestAdapter, RequestConfig } from '../request';\n\n// 导出常用的默认配置\nexport { DEFAULT_STORAGE_KEYS, DEFAULT_API_ROUTES } from './types';\n\n","/**\n * API 通用类型定义\n * Common API Types\n */\n\n/**\n * API 响应类型\n * Generic API Response Format\n */\nexport interface ApiResponse<T = any> {\n success: boolean;\n data?: T;\n error?: string;\n message?: string;\n meta?: {\n pagination?: {\n page: number;\n limit: number;\n total: number;\n pages: number;\n };\n [key: string]: any;\n };\n}\n\n/**\n * 分页参数类型\n * Pagination Parameters\n */\nexport interface PaginationParams {\n page?: number;\n limit?: number;\n search?: string;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * 认证响应类型(泛型)\n * Generic Auth Response\n */\nexport interface AuthResponse<TUser = any> {\n user: TUser;\n token: string;\n}\n\n/**\n * 默认存储键常量\n * Default Storage Keys\n */\nexport const DEFAULT_STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n REFRESH_TOKEN: 'refresh_token',\n} as const;\n\n/**\n * 存储键类型(可扩展)\n * Storage Keys Type\n */\nexport type StorageKeys = typeof DEFAULT_STORAGE_KEYS;\n\n/**\n * API 路由配置\n * API Routes Configuration\n */\nexport interface ApiRoutes {\n /** 认证相关路由 */\n auth?: {\n login?: string;\n logout?: string;\n register?: string;\n me?: string;\n };\n /** 用户相关路由 */\n users?: {\n list?: string;\n detail?: (id: string) => string;\n update?: (id: string) => string;\n delete?: (id: string) => string;\n };\n /** 自定义路由 */\n [key: string]: any;\n}\n\n/**\n * 默认 API 路由\n */\nexport const DEFAULT_API_ROUTES: ApiRoutes = {\n auth: {\n login: '/auth/login',\n logout: '/auth/logout',\n register: '/auth/register',\n me: '/auth/me',\n },\n users: {\n list: '/users',\n detail: (id: string) => '/users/' + (id),\n update: (id: string) => '/users/' + (id),\n delete: (id: string) => '/users/' + (id),\n },\n};\n","/**\n * 基础 API 客户端(泛型)\n * Base API Client (Generic)\n *\n * 提供统一的 API 调用逻辑,通过适配器模式支持多平台\n * 使用泛型 TUser 支持不同项目的用户类型\n */\n\nimport type { StorageAdapter } from '../storage';\nimport type { RequestAdapter, RequestConfig } from '../request';\nimport type { ApiResponse, AuthResponse, StorageKeys, ApiRoutes } from './types';\nimport { DEFAULT_STORAGE_KEYS, DEFAULT_API_ROUTES } from './types';\n\n/**\n * 基础 API 客户端配置\n */\nexport interface BaseApiClientConfig {\n /** 基础 URL */\n baseUrl: string;\n /** 存储适配器 */\n storage: StorageAdapter;\n /** 请求适配器 */\n request: RequestAdapter;\n /** 自定义存储键(可选) */\n storageKeys?: Partial<StorageKeys>;\n /** API 路由配置(可选) */\n routes?: ApiRoutes;\n}\n\n/**\n * 基础 API 客户端\n * @template TUser 用户类型(泛型)\n */\nexport class BaseApiClient<TUser = any> {\n protected token: string | null = null;\n protected user: TUser | null = null;\n protected baseUrl: string;\n protected storage: StorageAdapter;\n protected request: RequestAdapter;\n protected storageKeys: StorageKeys;\n protected routes: ApiRoutes;\n\n constructor(config: BaseApiClientConfig) {\n this.baseUrl = config.baseUrl;\n this.storage = config.storage;\n this.request = config.request;\n this.storageKeys = {\n ...DEFAULT_STORAGE_KEYS,\n ...(config.storageKeys || {}),\n };\n this.routes = {\n ...DEFAULT_API_ROUTES,\n ...(config.routes || {}),\n auth: {\n ...DEFAULT_API_ROUTES.auth,\n ...(config.routes?.auth || {}),\n },\n users: {\n ...DEFAULT_API_ROUTES.users,\n ...(config.routes?.users || {}),\n },\n };\n }\n\n /**\n * 初始化 - 从存储中加载 token 和用户信息\n */\n async init(): Promise<void> {\n try {\n this.token = await this.storage.getItem(this.storageKeys.AUTH_TOKEN);\n const userData = await this.storage.getItem(this.storageKeys.USER_DATA);\n if (userData) {\n this.user = JSON.parse(userData) as TUser;\n }\n } catch (error) {\n console.error('Failed to load auth data:', error);\n }\n }\n\n /**\n * 设置认证 token\n */\n async setToken(token: string | null): Promise<void> {\n this.token = token;\n if (token) {\n await this.storage.setItem(this.storageKeys.AUTH_TOKEN, token);\n } else {\n await this.storage.removeItem(this.storageKeys.AUTH_TOKEN);\n }\n }\n\n /**\n * 设置用户信息\n */\n async setUser(user: TUser | null): Promise<void> {\n this.user = user;\n if (user) {\n await this.storage.setItem(this.storageKeys.USER_DATA, JSON.stringify(user));\n } else {\n await this.storage.removeItem(this.storageKeys.USER_DATA);\n }\n }\n\n /**\n * 获取当前 token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * 获取当前用户\n */\n getUser(): TUser | null {\n return this.user;\n }\n\n /**\n * 检查是否已登录\n */\n async isAuthenticated(): Promise<boolean> {\n return !!this.token;\n }\n\n /**\n * 清除用户数据\n */\n async clearUserData(): Promise<void> {\n await this.storage.removeItem(this.storageKeys.AUTH_TOKEN);\n await this.storage.removeItem(this.storageKeys.USER_DATA);\n if (this.storageKeys.REFRESH_TOKEN) {\n await this.storage.removeItem(this.storageKeys.REFRESH_TOKEN);\n }\n this.token = null;\n this.user = null;\n }\n\n /**\n * 发送请求的通用方法\n */\n protected async sendRequest<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n };\n\n // 添加认证 token\n if (this.token) {\n headers['Authorization'] = 'Bearer ' + (this.token);\n }\n\n const response = await this.request.request<ApiResponse<T>>({\n ...config,\n url: (this.baseUrl) + (config.url),\n headers,\n });\n\n return response;\n } catch (error) {\n console.error('API request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络错误,请重试',\n };\n }\n }\n\n /**\n * 发送 GET 请求\n */\n async get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'GET', params });\n }\n\n /**\n * 发送 POST 请求\n */\n async post<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'POST', body });\n }\n\n /**\n * 发送 PUT 请求\n */\n async put<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PUT', body });\n }\n\n /**\n * 发送 PATCH 请求\n */\n async patch<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PATCH', body });\n }\n\n /**\n * 发送 DELETE 请求\n */\n async delete<T = any>(url: string): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'DELETE' });\n }\n\n // ==================== 默认认证方法(子类可重写) ====================\n\n /**\n * 用户注册\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async register(\n email: string,\n password: string,\n username: string\n ): Promise<ApiResponse<AuthResponse<TUser>>> {\n if (!this.routes.auth?.register) {\n throw new Error('Register route is not configured');\n }\n\n const response = await this.post<AuthResponse<TUser>>(this.routes.auth.register, {\n email,\n password,\n username,\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n await this.onAuthSuccess?.(response.data.user, response.data.token);\n } else if (!response.success) {\n await this.onAuthError?.(response.error || 'Registration failed');\n }\n\n return response;\n }\n\n /**\n * 用户登录\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async login(email: string, password: string): Promise<ApiResponse<AuthResponse<TUser>>> {\n if (!this.routes.auth?.login) {\n throw new Error('Login route is not configured');\n }\n\n const response = await this.post<AuthResponse<TUser>>(this.routes.auth.login, {\n email,\n password,\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n await this.onAuthSuccess?.(response.data.user, response.data.token);\n } else if (!response.success) {\n await this.onAuthError?.(response.error || 'Login failed');\n }\n\n return response;\n }\n\n /**\n * 用户退出登录\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async logout(): Promise<void> {\n if (this.routes.auth?.logout) {\n await this.post<void>(this.routes.auth.logout);\n }\n\n // 无论请求成功与否,都清除本地数据\n await this.clearUserData();\n await this.onLogout?.();\n }\n\n /**\n * 获取当前用户信息\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getCurrentUser(): Promise<ApiResponse<TUser>> {\n if (!this.routes.auth?.me) {\n throw new Error('Current user route is not configured');\n }\n\n const response = await this.get<any>(this.routes.auth.me);\n\n // 统一处理响应格式:自动展开 response.data.user 为 response.data\n if (response.success && response.data) {\n // 如果 data 是嵌套的 {user: {...}, session: {...}} 格式,提取 user\n const userData = response.data.user || response.data;\n\n await this.setUser(userData);\n\n return {\n ...response,\n data: userData,\n };\n }\n\n return response;\n }\n\n // ==================== 默认用户管理方法(子类可重写) ====================\n\n /**\n * 获取用户列表\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getUsers(params?: {\n page?: number;\n limit?: number;\n search?: string;\n }): Promise<ApiResponse<{ users: TUser[]; total: number }>> {\n if (!this.routes.users?.list) {\n throw new Error('Users list route is not configured');\n }\n\n return this.get(this.routes.users.list, params);\n }\n\n /**\n * 获取用户详情\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async getUserById(userId: string): Promise<ApiResponse<TUser>> {\n if (!this.routes.users?.detail) {\n throw new Error('User detail route is not configured');\n }\n\n return this.get(this.routes.users.detail(userId));\n }\n\n /**\n * 更新用户信息\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async updateUser(userId: string, data: Partial<TUser>): Promise<ApiResponse<TUser>> {\n if (!this.routes.users?.update) {\n throw new Error('User update route is not configured');\n }\n\n return this.put(this.routes.users.update(userId), data);\n }\n\n /**\n * 删除用户\n * 默认实现,子类可重写以添加自定义逻辑\n */\n async deleteUser(userId: string): Promise<ApiResponse<void>> {\n if (!this.routes.users?.delete) {\n throw new Error('User delete route is not configured');\n }\n\n return this.delete(this.routes.users.delete(userId));\n }\n\n // ==================== 子类可重写的钩子方法 ====================\n\n /**\n * 请求前钩子(子类可重写)\n */\n protected async onBeforeRequest?(config: RequestConfig): Promise<RequestConfig>;\n\n /**\n * 请求后钩子(子类可重写)\n */\n protected async onAfterRequest?<T>(response: ApiResponse<T>): Promise<ApiResponse<T>>;\n\n /**\n * 请求错误钩子(子类可重写)\n */\n protected async onRequestError?(error: Error): Promise<void>;\n\n /**\n * 认证成功钩子(子类可重写)\n */\n protected async onAuthSuccess?(user: TUser, token: string): Promise<void>;\n\n /**\n * 认证失败钩子(子类可重写)\n */\n protected async onAuthError?(error: string): Promise<void>;\n\n /**\n * 登出钩子(子类可重写)\n */\n protected async onLogout?(): Promise<void>;\n}\n\n","'use client';\n\nimport React from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogHeader,\n DialogTitle,\n} from '@/components/Dialog';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { ProfileData, SocialLink } from './types';\nimport { cn } from '@/utils';\n\nconst themeStyles = {\n light: \"\",\n dark: \"bg-[#222] text-[#eee] border-[#444]\",\n blue: \"bg-[#f0f8ff] border-[#1890ff]/20\",\n};\n\nexport interface ProfileModalProps {\n isOpen: boolean;\n onClose: () => void;\n data: ProfileData;\n showAvatar?: boolean;\n showContacts?: boolean;\n showSocial?: boolean;\n showBio?: boolean;\n avatarSize?: number;\n onAvatarClick?: () => void;\n onSocialLinkClick?: (url: string, type: string) => void;\n onContactClick?: (type: string, value: string) => void;\n themeName?: 'light' | 'dark' | 'blue';\n className?: string;\n children?: React.ReactNode;\n}\n\nexport const ProfileModal: React.FC<ProfileModalProps> = ({\n isOpen,\n onClose,\n data,\n showAvatar = true,\n showContacts = true,\n showSocial = true,\n showBio = true,\n avatarSize = 80,\n onAvatarClick,\n onSocialLinkClick,\n onContactClick,\n themeName = 'light',\n className,\n}) => {\n // 渲染社交媒体链接\n const renderSocialLinks = () => {\n if (!data.socialLinks || data.socialLinks.length === 0) return null;\n return (\n <div className=\"flex gap-3 mt-2\">\n {data.socialLinks.map((link: SocialLink, index: number) => (\n <a\n key={index}\n href={link.url}\n className={cn(\n \"w-8 h-8 flex items-center justify-center rounded-full no-underline transition-all hover:-translate-y-0.5\",\n themeName === 'dark' ? \"bg-gray-800 text-gray-200 hover:bg-gray-700\" : \"bg-gray-100 text-gray-800 hover:bg-gray-200\"\n )}\n title={link.type}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => {\n if (onSocialLinkClick) {\n e.preventDefault();\n onSocialLinkClick(link.url, link.type);\n }\n }}\n >\n {link.icon ? (\n <span className=\"text-base\">{link.icon}</span>\n ) : (\n <span className=\"text-[10px] font-semibold\">{link.type}</span>\n )}\n </a>\n ))}\n </div>\n );\n };\n\n // 渲染联系方式\n const renderContacts = () => {\n if (!data.contacts || Object.keys(data.contacts).length === 0) return null;\n return (\n <div className={cn(\n \"mt-4 border-t pt-4\",\n themeName === 'dark' ? \"border-gray-800\" : \"border-gray-100\"\n )}>\n {Object.entries(data.contacts).map(([type, value], index) => (\n <div \n key={index} \n className={cn(\n \"flex mb-2 cursor-pointer py-1.5 px-2 rounded transition-colors\",\n themeName === 'dark' ? \"hover:bg-gray-800\" : \"hover:bg-gray-50\"\n )}\n onClick={() => onContactClick && onContactClick(type, value)}\n >\n <span className={cn(\n \"font-medium w-[70px] shrink-0\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{type}:</span>\n <span className={themeName === 'dark' ? \"text-gray-200\" : \"text-gray-800\"}>{value}</span>\n </div>\n ))}\n </div>\n );\n };\n\n return (\n <Dialog open={isOpen} onOpenChange={(open: boolean) => !open && onClose()}>\n <DialogContent className={cn(\n \"sm:max-w-[500px] p-0 overflow-hidden border-none shadow-2xl\",\n themeStyles[themeName as keyof typeof themeStyles] || \"\",\n className\n )}>\n <div className=\"p-6\">\n <div className=\"flex gap-5 mb-5\">\n {showAvatar && (\n <div \n className=\"shrink-0\"\n onClick={onAvatarClick}\n style={{ cursor: onAvatarClick ? 'pointer' : 'default' }}\n >\n <Avatar className=\"border-2 border-primary/10 shadow-sm\" style={{ width: avatarSize, height: avatarSize }}>\n {data.avatar && <AvatarImage src={data.avatar} alt={data.name} className=\"object-cover\" />}\n <AvatarFallback className=\"text-xl\">\n {data.name.substring(0, 2).toUpperCase()}\n </AvatarFallback>\n </Avatar>\n </div>\n )}\n <div className=\"flex-1 min-w-0 flex flex-col justify-center\">\n <h2 className={cn(\n \"text-2xl font-bold m-0 mb-1\",\n themeName === 'dark' ? \"text-white\" : \"text-gray-900\"\n )}>{data.name}</h2>\n {data.title && <div className={cn(\n \"text-sm mb-2\",\n themeName === 'dark' ? \"text-gray-400\" : \"text-gray-500\"\n )}>{data.title}</div>}\n {showSocial && renderSocialLinks()}\n </div>\n </div>\n \n {showBio && data.bio && (\n <div className={cn(\n \"mb-5 leading-relaxed text-sm\",\n themeName === 'dark' ? \"text-gray-300\" : \"text-gray-600\"\n )}>\n <p>{data.bio}</p>\n </div>\n )}\n \n {showContacts && renderContacts()}\n \n {data.customContent && (\n <div className=\"mt-5\">\n {data.customContent}\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default ProfileModal;\n","import React from 'react';\nimport { Badge } from '@/components/Badge';\nimport { cn } from '@/utils';\nimport { BadgeType } from '../types';\n \ninterface BadgeListProps {\n badges: BadgeType[];\n className?: string;\n}\n\nexport const BadgeList: React.FC<BadgeListProps> = ({\n badges,\n className = '',\n}) => {\n if (!badges || badges.length === 0) return null;\n\n return (\n <div className={cn(\"flex flex-wrap gap-2 mt-4\", className)}>\n {badges.map((badge, index) => (\n <Badge \n key={index} \n variant={badge.type === 'default' ? 'default' : (badge.type as any)}\n >\n {badge.icon && <span className=\"mr-1\">{badge.icon}</span>}\n {badge.label}\n </Badge>\n ))}\n </div>\n );\n};\n","import { StatType } from '..';\nimport { cn } from '@/utils';\n\ninterface StatProps extends StatType {\n className?: string;\n}\n\nexport const Stat: React.FC<StatProps> = ({\n label,\n value,\n icon,\n className = '',\n}) => {\n return (\n <div className={cn(\"flex flex-col items-center flex-1 text-center\", className)}>\n {icon && <span className=\"mb-2 text-2xl text-gray-400\">{icon}</span>}\n <div>\n <div className=\"text-lg font-semibold text-gray-800\">{value}</div>\n <div className=\"text-xs text-gray-400 mt-1\">{label}</div>\n </div>\n </div>\n );\n};\n","import { StatType } from \"..\";\nimport { Stat } from \"./Stat\";\nimport { cn } from '@/utils';\n\ninterface StatListProps {\n stats: StatType[];\n className?: string;\n}\n\nexport const StatList: React.FC<StatListProps> = ({\n stats,\n className = '',\n}) => {\n if (!stats || stats.length === 0) return null;\n\n return (\n <div className={cn(\"flex justify-between mt-4 pt-4 border-t border-gray-100\", className)}>\n {stats.map((stat, index) => (\n <Stat key={index} {...stat} />\n ))}\n </div>\n );\n}; ","'use client';\n\nimport React, { useState } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\nimport { Button } from '@/components/Button';\n\n// 示例数据\nconst exampleProfileData: ProfileData = {\n name: '张三',\n avatar: 'https://randomuser.me/api/portraits/men/32.jpg',\n title: '高级前端工程师',\n bio: '专注于React和Next.js开发的前端工程师,有5年工作经验。热爱开源,喜欢分享技术经验。',\n contacts: {\n '邮箱': 'zhangsan@example.com',\n '电话': '138-8888-8888',\n '地址': '上海市浦东新区',\n },\n socialLinks: [\n { type: 'GitHub', url: 'https://github.com/zhangsan', icon: '★' },\n { type: 'Twitter', url: 'https://twitter.com/zhangsan', icon: '✦' },\n { type: 'LinkedIn', url: 'https://linkedin.com/in/zhangsan', icon: '✪' },\n ],\n badges: [\n { label: 'React', type: 'primary' },\n { label: 'Next.js', type: 'success' },\n { label: 'TypeScript', type: 'info' },\n { label: 'CSS', type: 'default' },\n ],\n stats: [\n { label: '项目', value: 42 },\n { label: '粉丝', value: 1024 },\n { label: '评分', value: '4.9' },\n ],\n customContent: (\n <div className=\"mt-5 border-t border-gray-100 pt-4\">\n <h3 className=\"text-sm font-semibold mb-2\">专业技能</h3>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n 精通React、Vue、Angular等前端框架,熟悉TypeScript、JavaScript、CSS3、HTML5等前端技术。\n 有丰富的大型项目开发经验,能独立负责前端架构设计。\n </p>\n </div>\n ),\n};\n\nexport interface ProfileButtonProps {\n data?: ProfileData;\n buttonText?: string;\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n className?: string;\n modalTheme?: 'light' | 'dark' | 'blue';\n}\n\n/**\n * 个人信息按钮组件,点击后显示个人信息弹窗\n */\nexport const ProfileButton: React.FC<ProfileButtonProps> = ({\n data = exampleProfileData,\n buttonText = '查看个人信息',\n variant = 'default',\n size = 'default',\n className = '',\n modalTheme = 'light',\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n const openModal = () => setIsModalOpen(true);\n const closeModal = () => setIsModalOpen(false);\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open('mailto:' + (value));\n } else if (type === '电话') {\n window.open('tel:' + (value));\n }\n };\n\n return (\n <>\n <Button \n variant={variant}\n size={size}\n onClick={openModal} \n className={className}\n >\n {buttonText}\n </Button>\n\n <ProfileModal\n isOpen={isModalOpen}\n onClose={closeModal}\n data={data}\n themeName={modalTheme}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.customContent}\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n </>\n );\n};\n\nexport default ProfileButton;\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport ProfileModal from './ProfileModal';\nimport { ProfileData } from './types';\nimport { BadgeList } from './internal/BadgeList';\nimport { StatList } from './internal/StatList';\n\nexport interface AutoOpenModalProps {\n data: ProfileData;\n delay?: number; // 延迟显示时间(毫秒)\n themeName?: 'light' | 'dark' | 'blue';\n onClose?: () => void;\n}\n\n/**\n * 自动打开个人信息弹窗组件\n * 页面加载后自动显示弹窗\n */\nexport const AutoOpenModal: React.FC<AutoOpenModalProps> = ({\n data,\n delay = 500, // 默认延迟500毫秒\n themeName = 'light',\n onClose,\n}) => {\n const [isModalOpen, setIsModalOpen] = useState(false);\n\n // 页面加载后自动显示弹窗\n useEffect(() => {\n const timer = setTimeout(() => {\n setIsModalOpen(true);\n }, delay);\n\n return () => clearTimeout(timer);\n }, [delay]);\n\n const handleClose = () => {\n setIsModalOpen(false);\n if (onClose) {\n onClose();\n }\n };\n\n const handleContactClick = (type: string, value: string) => {\n if (type === '邮箱') {\n window.open('mailto:' + (value));\n } else if (type === '电话') {\n window.open('tel:' + (value));\n }\n };\n\n return (\n <ProfileModal\n isOpen={isModalOpen}\n onClose={handleClose}\n data={data}\n themeName={themeName}\n onContactClick={handleContactClick}\n onSocialLinkClick={(url) => window.open(url, '_blank')}\n >\n {data.badges && <BadgeList badges={data.badges} />}\n {data.stats && <StatList stats={data.stats} />}\n </ProfileModal>\n );\n};\n\nexport default AutoOpenModal;\n","'use client';\n\nimport React from 'react';\nimport { Avatar, AvatarImage, AvatarFallback } from '@/components/Avatar';\nimport { cn } from '@/utils';\n\nexport interface EnhancedAvatarProps {\n src?: string;\n name?: string;\n size?: 'small' | 'medium' | 'large' | number;\n mood?: 'online' | 'offline' | 'away';\n statusText?: string;\n onClick?: () => void;\n className?: string;\n}\n\nconst sizeMap = {\n small: 'h-8 w-8',\n medium: 'h-12 w-12',\n large: 'h-16 w-16',\n};\n\nconst moodColors = {\n online: 'bg-green-500',\n offline: 'bg-gray-500',\n away: 'bg-yellow-500',\n};\n\nexport const EnhancedAvatar: React.FC<EnhancedAvatarProps> = ({\n src,\n name,\n size = 'medium',\n mood = 'online',\n statusText,\n onClick,\n className,\n}) => {\n const sizeClass = typeof size === 'string' ? sizeMap[size] : '';\n const customSizeStyle = typeof size === 'number' ? { width: size, height: size } : {};\n\n return (\n <div className={cn(\"relative inline-block\", className)} onClick={onClick}>\n <Avatar className={cn(sizeClass, onClick && \"cursor-pointer hover:ring-2 hover:ring-blue-500 transition-all\")} style={customSizeStyle}>\n {src && <AvatarImage src={src} alt={name || \"Avatar\"} className=\"object-cover\" />}\n <AvatarFallback className=\"bg-primary/10 text-primary-foreground\">\n {name ? name.substring(0, 2).toUpperCase() : '??'}\n </AvatarFallback>\n </Avatar>\n \n {mood && (\n <div\n className={cn(\n \"absolute bottom-0 right-0 rounded-full border-2 border-white\",\n moodColors[mood],\n typeof size === 'number' ? (size > 60 ? 'h-4 w-4' : 'h-3 w-3') : (size === 'large' ? 'h-4 w-4' : 'h-3 w-3')\n )}\n />\n )}\n \n {statusText && (\n <div className=\"absolute -bottom-6 left-1/2 transform -translate-x-1/2 whitespace-nowrap\">\n <span className=\"text-xs text-muted-foreground\">{statusText}</span>\n </div>\n )}\n </div>\n );\n};\n\nexport default EnhancedAvatar;\n","'use client';\n\nimport React from 'react';\nimport type { CollisionBallsConfig } from '@/components/CollisionBalls';\nimport type { TimelineConfig, TimelineItem } from '@/components/Timeline';\n\nexport interface AboutProps {\n timelineConfig: TimelineConfig;\n collisionBallsConfig: CollisionBallsConfig;\n Timeline: React.FC<{ items?: TimelineItem[] }>;\n CollisionBalls: React.FC<{ collisionBallsConfig: CollisionBallsConfig }>;\n}\n\nconst About: React.FC<AboutProps> = ({\n timelineConfig,\n collisionBallsConfig,\n Timeline,\n CollisionBalls,\n}) => {\n return (\n <section id=\"about\" className=\"py-16 bg-white\">\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12\">关于我</h2>\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-12\">\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">个人经历</h3>\n <Timeline items={timelineConfig.items} />\n </div>\n <div className=\"bg-white rounded-lg shadow-lg p-6\">\n <h3 className=\"text-2xl font-semibold mb-6\">技能展示</h3>\n <div style={{ height: '400px', position: 'relative' }}>\n <CollisionBalls collisionBallsConfig={collisionBallsConfig} />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default About;\n","'use client';\n\nimport React from 'react';\nimport About from './About';\nimport type { AboutProps } from './About';\nimport { CollisionBalls, Timeline } from './ui/defaultComponents';\n\n/** 向后兼容:宿主未注入 UI 时使用 sa2kit 默认 primitives */\nconst AboutWithDefaults: React.FC<Omit<AboutProps, 'Timeline' | 'CollisionBalls'>> = props => (\n <About {...props} Timeline={Timeline} CollisionBalls={CollisionBalls} />\n);\n\nexport default AboutWithDefaults;\n","'use client';\n\nimport React, { useState } from 'react';\nimport { clsx } from 'clsx';\n\ninterface FormData {\n name: string;\n email: string;\n message: string;\n}\n\nconst Contact: React.FC = () => {\n const [formData, setFormData] = useState<FormData>({\n name: '',\n email: '',\n message: ''\n });\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<'idle' | 'success' | 'error'>('idle');\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({\n ...prev,\n [name]: value\n }));\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setIsSubmitting(true);\n setSubmitStatus('idle');\n\n try {\n // 这里添加你的表单提交逻辑\n await new Promise(resolve => setTimeout(resolve, 1000)); // 模拟API调用\n setSubmitStatus('success');\n setFormData({ name: '', email: '', message: '' });\n } catch (error) {\n setSubmitStatus('error');\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <section id=\"contact\" className=\"py-16 bg-gray-50\">\n <div className=\"max-w-4xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl font-bold text-gray-900 sm:text-4xl\">\n 联系我\n </h2>\n <p className=\"mt-4 text-lg text-gray-600\">\n 有任何问题或建议?请随时联系我\n </p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-xl p-6 sm:p-8\">\n <form onSubmit={handleSubmit} className=\"space-y-6\">\n <div>\n <label htmlFor=\"name\" className=\"block text-sm font-medium text-gray-700\">\n 姓名\n </label>\n <input\n type=\"text\"\n name=\"name\"\n id=\"name\"\n value={formData.name}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的姓名\"\n />\n </div>\n\n <div>\n <label htmlFor=\"email\" className=\"block text-sm font-medium text-gray-700\">\n 邮箱\n </label>\n <input\n type=\"email\"\n name=\"email\"\n id=\"email\"\n value={formData.email}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的邮箱\"\n />\n </div>\n\n <div>\n <label htmlFor=\"message\" className=\"block text-sm font-medium text-gray-700\">\n 消息\n </label>\n <textarea\n name=\"message\"\n id=\"message\"\n rows={4}\n value={formData.message}\n onChange={handleChange}\n required\n className=\"mt-1 block w-full rounded-md border-gray-300 shadow-sm focus:border-blue-500 focus:ring-blue-500 sm:text-sm\"\n placeholder=\"请输入您的消息\"\n />\n </div>\n\n <div className=\"flex items-center justify-end\">\n <button\n type=\"submit\"\n disabled={isSubmitting}\n className={clsx('inline-flex justify-center py-2 px-4 border border-transparent shadow-sm text-sm font-medium rounded-md text-white', isSubmitting \n ? 'bg-blue-400 cursor-not-allowed' \n : 'bg-blue-600 hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500')}\n >\n {isSubmitting ? '发送中...' : '发送消息'}\n </button>\n </div>\n\n {submitStatus === 'success' && (\n <div className=\"rounded-md bg-green-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-green-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-green-800\">\n 消息已成功发送!\n </p>\n </div>\n </div>\n </div>\n )}\n\n {submitStatus === 'error' && (\n <div className=\"rounded-md bg-red-50 p-4\">\n <div className=\"flex\">\n <div className=\"flex-shrink-0\">\n <svg className=\"h-5 w-5 text-red-400\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\" clipRule=\"evenodd\" />\n </svg>\n </div>\n <div className=\"ml-3\">\n <p className=\"text-sm font-medium text-red-800\">\n 发送失败,请稍后重试\n </p>\n </div>\n </div>\n </div>\n )}\n </form>\n </div>\n\n {/* 联系方式 */}\n <div className=\"mt-12 grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3\">\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">邮箱</h3>\n <p className=\"mt-2 text-gray-600\">your.email@example.com</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">电话</h3>\n <p className=\"mt-2 text-gray-600\">+86 123 4567 8900</p>\n </div>\n\n <div className=\"bg-white rounded-lg shadow-lg p-6 text-center\">\n <div className=\"text-blue-600 mb-4\">\n <svg className=\"h-8 w-8 mx-auto\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n </div>\n <h3 className=\"text-lg font-medium text-gray-900\">地址</h3>\n <p className=\"mt-2 text-gray-600\">中国,北京</p>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Contact; ","'use client';\n\nimport React, { useEffect, useState } from \"react\";\nimport { cn } from '@/utils';\n\nexport interface HomeConfig {\n title: string;\n subtitle: string;\n buttons: Array<{\n text: string;\n link: string;\n }>;\n imageSrc: string;\n}\n\ninterface HomeProps {\n homeConfig: HomeConfig;\n className?: string;\n}\n\nexport const Home: React.FC<HomeProps> = ({ homeConfig, className }) => {\n const { title, subtitle, buttons, imageSrc } = homeConfig;\n const [displayText, setDisplayText] = useState(\"\");\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n if (currentIndex < title.length) {\n const timer = setTimeout(() => {\n setDisplayText((prev) => prev + title[currentIndex]);\n setCurrentIndex((prev) => prev + 1);\n }, 150);\n\n return () => clearTimeout(timer);\n }\n return () => {\n setDisplayText(\"\");\n setCurrentIndex(0);\n };\n }, [currentIndex, title]);\n\n return (\n <section \n id=\"home\" \n className={cn(\"min-h-screen flex items-center justify-center py-16 bg-gradient-to-b from-white to-gray-50\", className)}\n >\n <div className=\"container mx-auto px-4\">\n <div className=\"flex flex-col md:flex-row items-center gap-12\">\n <div className=\"flex-1 text-center md:text-left\">\n <h1 className=\"text-4xl md:text-6xl font-bold mb-6 text-gray-900\">\n <span className=\"inline-block\">{displayText}</span>\n <span className=\"animate-pulse ml-1 text-blue-500\">|</span>\n </h1>\n <p className=\"text-xl md:text-2xl text-gray-600 mb-8\">{subtitle}</p>\n <div className=\"flex flex-wrap gap-4 justify-center md:justify-start\">\n {buttons.map((button) => (\n <a\n key={button.link}\n href={button.link}\n className=\"px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-all duration-300 shadow-md hover:shadow-lg font-medium\"\n >\n {button.text}\n </a>\n ))}\n </div>\n </div>\n <div className=\"flex-1\">\n <div className=\"relative group\">\n <div className=\"absolute -inset-1 bg-gradient-to-r from-blue-600 to-purple-600 rounded-lg blur opacity-25 group-hover:opacity-50 transition duration-1000 group-hover:duration-200\"></div>\n <img\n src={imageSrc}\n alt=\"Profile\"\n className=\"relative w-full max-w-md mx-auto rounded-lg shadow-xl transform hover:scale-[1.02] transition-transform duration-300 bg-white\"\n />\n </div>\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default Home;\n\n","'use client';\n\nimport React from 'react';\nimport Link from 'next/link';\nimport { cn } from '@/utils';\n\nexport interface ExperimentCardProps {\n href: string;\n title: string;\n description: string;\n tags: string[];\n category: 'utility' | 'leisure';\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n className?: string;\n}\n\nexport const ExperimentCard: React.FC<ExperimentCardProps> = ({ \n href, \n title, \n description, \n tags, \n category, \n isCompleted,\n updatedAt,\n createdAt,\n className\n}) => {\n // 格式化日期显示\n const formatDate = (dateString?: string) => {\n if (!dateString) return '';\n \n try {\n const date = new Date(dateString);\n return date.toLocaleDateString('zh-CN', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n });\n } catch (e) {\n return dateString;\n }\n };\n \n return (\n <Link href={href} className={cn(\"block group\", className)}>\n <div className=\"w-full h-full bg-white rounded-2xl overflow-hidden shadow-md hover:shadow-2xl transition-all duration-300 transform group-hover:-translate-y-1 border border-gray-100 hover:border-gray-200\">\n <div className=\"p-6\">\n <div className=\"flex items-start justify-between mb-4\">\n <h3 className=\"text-xl font-semibold text-gray-900 flex-1 pr-4 leading-tight\">\n {title}\n </h3>\n <div className=\"flex flex-col gap-2 flex-shrink-0\">\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm\",\n category === 'utility' \n ? 'bg-gradient-to-r from-green-50 to-green-100 text-green-700 border border-green-200' \n : 'bg-gradient-to-r from-purple-50 to-purple-100 text-purple-700 border border-purple-200'\n )}>\n {category === 'utility' ? '🔧 实用工具' : '🎮 休闲娱乐'}\n </span>\n <span className={cn(\n \"px-3 py-1.5 text-xs font-medium rounded-full shadow-sm border\",\n isCompleted \n ? 'bg-gradient-to-r from-emerald-50 to-emerald-100 text-emerald-700 border border-emerald-200' \n : 'bg-gradient-to-r from-orange-50 to-orange-100 text-orange-700 border border-orange-200'\n )}>\n {isCompleted ? '✅ 已完成' : '🚧 进行中'}\n </span>\n </div>\n </div>\n <p className=\"text-gray-600 mb-4\">{description}</p>\n \n {/* 显示更新时间 */}\n {updatedAt && (\n <div className=\"flex items-center gap-1 mb-3 text-xs text-gray-500\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <span>更新于: {formatDate(updatedAt)}</span>\n {createdAt && createdAt !== updatedAt && (\n <span className=\"ml-2 text-gray-400\">创建于: {formatDate(createdAt)}</span>\n )}\n </div>\n )}\n \n <div className=\"flex flex-wrap gap-2\">\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"px-3 py-1.5 text-xs font-medium bg-gradient-to-r from-gray-50 to-gray-100 text-gray-700 rounded-full border border-gray-200 shadow-sm hover:shadow-md transition-shadow duration-200\"\n >\n #{tag}\n </span>\n ))}\n </div>\n </div>\n </div>\n </Link>\n );\n};\n\nexport default ExperimentCard;\n\n","'use client';\n\nimport React, { useState } from 'react';\nimport { ExperimentCard } from './ExperimentCard';\nimport { cn } from '@/utils';\n\n// Project相关的类型定义\nexport interface Project {\n id: string;\n title: string;\n description: string;\n image: string;\n link?: string;\n tags: string[];\n}\n\nexport interface ProjectsConfig {\n projects: Project[];\n}\n\ninterface ProjectCarouselProps {\n projects: Project[];\n className?: string;\n}\n\nexport const ProjectCarousel: React.FC<ProjectCarouselProps> = ({ projects, className }) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n\n const nextSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === projects.length - 1 ? 0 : prevIndex + 1\n );\n };\n\n const prevSlide = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === 0 ? projects.length - 1 : prevIndex - 1\n );\n };\n\n return (\n <section id=\"projects\" className={cn(\"py-16 bg-gray-50\", className)}>\n <div className=\"container mx-auto px-4\">\n <h2 className=\"text-3xl font-bold text-center mb-12 text-gray-900\">项目展示</h2>\n \n <div className=\"relative max-w-4xl mx-auto\">\n {/* 项目卡片 */}\n <div className=\"relative h-[400px] overflow-hidden rounded-lg shadow-xl\">\n {projects.map((project, index) => (\n <div\n key={project.id}\n className={cn(\n \"absolute w-full h-full transition-all duration-500 transform\",\n index === currentIndex\n ? \"translate-x-0 opacity-100\"\n : index < currentIndex\n ? \"-translate-x-full opacity-0\"\n : \"translate-x-full opacity-0\"\n )}\n >\n <ExperimentCard\n href={project.link || '#'}\n title={project.title}\n description={project.description}\n tags={project.tags}\n category=\"utility\"\n />\n </div>\n ))}\n </div>\n\n {/* 导航按钮 */}\n <button\n onClick={prevSlide}\n className=\"absolute left-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M15 19l-7-7 7-7\"\n />\n </svg>\n </button>\n\n <button\n onClick={nextSlide}\n className=\"absolute right-4 top-1/2 -translate-y-1/2 p-2 rounded-full bg-white/80 hover:bg-white shadow-lg focus:outline-none focus:ring-2 focus:ring-blue-500 transition-all z-[10]\"\n >\n <svg\n className=\"w-6 h-6 text-gray-600\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 5l7 7-7 7\"\n />\n </svg>\n </button>\n\n {/* 指示器 */}\n <div className=\"absolute bottom-4 left-1/2 transform -translate-x-1/2 flex space-x-2 z-[10]\">\n {projects.map((_, index) => (\n <button\n key={index}\n onClick={() => setCurrentIndex(index)}\n className={cn(\n \"w-2 h-2 rounded-full transition-all duration-300\",\n index === currentIndex ? \"bg-blue-500 w-4\" : \"bg-gray-300\"\n )}\n />\n ))}\n </div>\n </div>\n </div>\n </section>\n );\n};\n\nexport default ProjectCarousel;\n\n"," 'use client';\n\nimport React from 'react';\nimport { NavigationItem, NavigationDirection } from './types';\nimport { clsx } from 'clsx';\n\ninterface NavigationItemProps {\n item: NavigationItem;\n direction: NavigationDirection;\n isActive?: boolean;\n onClick: (item: NavigationItem) => void;\n}\n\nconst NavigationItemComponent: React.FC<NavigationItemProps> = ({\n item,\n direction,\n isActive,\n onClick\n}) => {\n const handleClick = (e: React.MouseEvent) => {\n e.preventDefault();\n onClick(item);\n };\n\n const getItemClasses = () => {\n const baseClasses = `\n group relative flex items-center gap-3\n transition-all duration-300 ease-in-out\n focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50\n rounded-lg\n `;\n\n const directionClasses = direction === 'vertical'\n ? 'px-4 py-3 w-full justify-start'\n : 'px-3 py-2 justify-center';\n\n const stateClasses = isActive\n ? 'bg-blue-500 text-white shadow-lg'\n : item.isExternal\n ? 'text-gray-700 hover:bg-purple-50 hover:text-purple-600 border border-purple-200'\n : 'text-gray-700 hover:bg-blue-50 hover:text-blue-600';\n\n return (baseClasses) + ' ' + (directionClasses) + ' ' + (stateClasses);\n };\n\n return (\n <a\n href={item.href}\n onClick={handleClick}\n target={item.target}\n rel={item.isExternal ? 'noopener noreferrer' : undefined}\n className={getItemClasses()}\n >\n {/* 图标 */}\n {item.icon && (\n <span className=\"flex-shrink-0\">\n {item.icon}\n </span>\n )}\n\n {/* 标签 */}\n <span className={clsx('font-medium', direction === 'vertical' ? 'text-sm' : 'text-xs')}>\n {item.label}\n </span>\n\n {/* 外链图标 */}\n {item.isExternal && (\n <svg\n className=\"w-3 h-3 opacity-60 group-hover:opacity-100 transition-opacity\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14\"\n />\n </svg>\n )}\n\n {/* 活动状态指示器 */}\n {direction === 'vertical' && isActive && (\n <div className=\"absolute left-1 top-1/2 transform -translate-y-1/2 w-1 h-6 bg-white rounded-full\" />\n )}\n </a>\n );\n};\n\nexport default NavigationItemComponent;"," 'use client';\n\nimport React from 'react';\nimport NavigationItem from './NavigationItem';\nimport { NavigationProps } from './types';\nimport { clsx } from 'clsx';\n\nconst Navigation: React.FC<NavigationProps> = ({\n config,\n isOpen,\n activeItemId,\n onItemClick,\n className = ''\n}) => {\n const { direction, position, items, avatar, logo } = config;\n\n // 获取导航栏位置和尺寸样式\n const getContainerClasses = () => {\n const baseClasses = `\n fixed z-[90]\n bg-white/95 backdrop-blur-lg\n border border-gray-200/50\n shadow-2xl\n transition-all duration-500 ease-in-out\n `;\n\n // 根据方向和位置确定样式\n if (direction === 'vertical') {\n const verticalClasses = 'h-screen w-64 flex flex-col';\n const positionClasses = position === 'left' \n ? 'left-0 top-0 ' + (isOpen ? 'translate-x-0' : '-translate-x-full')\n : 'right-0 top-0 ' + (isOpen ? 'translate-x-0' : 'translate-x-full');\n \n return (baseClasses) + ' ' + (verticalClasses) + ' ' + (positionClasses);\n } else {\n const horizontalClasses = 'w-full h-16 flex items-center';\n const positionClasses = position === 'top'\n ? 'top-0 left-0 right-0 ' + (isOpen ? 'translate-y-0' : '-translate-y-full')\n : 'bottom-0 left-0 right-0 ' + (isOpen ? 'translate-y-0' : 'translate-y-full');\n \n return (baseClasses) + ' ' + (horizontalClasses) + ' ' + (positionClasses);\n }\n };\n\n // 获取内容布局样式\n const getContentClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col h-full p-4';\n } else {\n return 'flex items-center justify-between w-full px-6';\n }\n };\n\n // 获取导航项列表样式\n const getItemsListClasses = () => {\n if (direction === 'vertical') {\n return 'flex flex-col gap-2 flex-1 overflow-y-auto mt-4';\n } else {\n return 'flex items-center gap-4';\n }\n };\n\n const handleItemClick = (item: any) => {\n // 处理页面跳转\n if (item.isExternal) {\n // 外链跳转\n window.open(item.href, item.target || '_blank');\n } else if (item.href.startsWith('#')) {\n // 锚点跳转\n const element = document.getElementById(item.id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' });\n }\n } else {\n // 内部页面跳转\n window.location.href = item.href;\n }\n\n // 触发回调\n onItemClick?.(item);\n };\n\n if (!isOpen) return null;\n\n return (\n <nav className={clsx(getContainerClasses(), className)}>\n <div className={getContentClasses()}>\n {/* Logo 区域 */}\n {logo && (\n <div className=\"flex items-center justify-center mb-4\">\n <img\n src={logo.src}\n alt={logo.alt || 'Logo'}\n className=\"h-8 w-auto\"\n />\n </div>\n )}\n\n {/* 顶部空间占位(为切换按钮预留) */}\n {direction === 'vertical' && (\n <div className=\"h-12 flex-shrink-0\" />\n )}\n\n {/* 导航项列表 */}\n <div className={getItemsListClasses()}>\n {items.map((item) => (\n <NavigationItem\n key={item.id}\n item={item}\n direction={direction}\n isActive={activeItemId === item.id}\n onClick={handleItemClick}\n />\n ))}\n </div>\n\n {/* 头像区域 */}\n {avatar && direction === 'vertical' && (\n <div className=\"flex items-center justify-center mt-auto pt-4\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-10 h-10 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n\n {/* 水平布局的头像 */}\n {avatar && direction === 'horizontal' && (\n <div className=\"flex items-center\">\n <img\n src={avatar.src}\n alt={avatar.alt || 'Avatar'}\n className=\"w-8 h-8 rounded-full border-2 border-gray-200\"\n />\n </div>\n )}\n </div>\n </nav>\n );\n};\n\nexport default Navigation;"," 'use client';\n\nimport React from 'react';\nimport { NavigationPosition } from './types';\nimport { clsx } from 'clsx';\n\ninterface NavigationToggleProps {\n isOpen: boolean;\n onClick: () => void;\n position: NavigationPosition;\n}\n\nconst NavigationToggle: React.FC<NavigationToggleProps> = ({\n isOpen,\n onClick,\n position\n}) => {\n const getPositionClasses = () => {\n switch (position) {\n case 'top':\n return 'top-4 left-4';\n case 'bottom':\n return 'bottom-4 left-4';\n case 'left':\n return 'top-4 left-4';\n case 'right':\n return 'top-4 right-4';\n default:\n return 'top-4 left-4';\n }\n };\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'fixed',\n getPositionClasses(),\n 'z-[100] p-3 rounded-xl bg-white/90 backdrop-blur-md shadow-lg hover:shadow-xl border border-gray-200/50 transition-all duration-300 ease-in-out hover:scale-105 active:scale-95 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50'\n )}\n aria-label={isOpen ? '关闭导航栏' : '打开导航栏'}\n >\n <div className=\"w-5 h-5 flex flex-col justify-center items-center\">\n <span\n className={clsx(\n 'block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out',\n isOpen ? 'rotate-45 translate-y-0.5' : ''\n )}\n />\n <span\n className={clsx(\n 'block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1',\n isOpen ? 'opacity-0 scale-0' : 'opacity-100 scale-100'\n )}\n />\n <span\n className={clsx(\n 'block w-5 h-0.5 bg-gray-600 rounded-full transform transition-all duration-300 ease-in-out mt-1',\n isOpen ? '-rotate-45 -translate-y-2.5' : ''\n )}\n />\n </div>\n </button>\n );\n};\n\nexport default NavigationToggle;","'use client';\n\nimport React, { useState, useRef, useEffect, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { clsx } from 'clsx';\n\nexport interface FloatingMenuProps {\n /**\n * 触发按钮的内容\n */\n trigger: ReactNode;\n \n /**\n * 菜单内容\n */\n menu: ReactNode;\n \n /**\n * 初始位置\n */\n initialPosition?: { x: number; y: number };\n \n /**\n * 是否默认打开菜单\n */\n defaultOpen?: boolean;\n \n /**\n * 自定义类名\n */\n className?: string;\n \n /**\n * 菜单类名\n */\n menuClassName?: string;\n \n /**\n * 触发器类名\n */\n triggerClassName?: string;\n \n /**\n * z-index\n */\n zIndex?: number;\n}\n\nconst FloatingMenu: React.FC<FloatingMenuProps> = ({\n trigger,\n menu,\n initialPosition = { x: 20, y: 20 },\n defaultOpen = false,\n className = '',\n menuClassName = '',\n triggerClassName = '',\n zIndex = 1000,\n}) => {\n const [position, setPosition] = useState(initialPosition);\n const [isMenuOpen, setIsMenuOpen] = useState(defaultOpen);\n const [menuDirection, setMenuDirection] = useState<'left' | 'right'>('right');\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n const containerRef = useRef<HTMLDivElement>(null);\n const [mounted, setMounted] = useState(false);\n // 添加一个标志,用于跟踪是否发生了拖动\n const [hasDragged, setHasDragged] = useState(false);\n // 添加一个计时器引用,用于区分点击和拖动\n const dragTimerRef = useRef<number | null>(null);\n // 添加一个引用,记录鼠标按下的初始位置\n const mouseDownPosRef = useRef<{ x: number, y: number } | null>(null);\n\n // 客户端挂载检查\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n // 计算菜单方向\n useEffect(() => {\n if (!mounted || !containerRef.current) return;\n \n const updateMenuDirection = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n \n const windowWidth = window.innerWidth;\n const middlePoint = windowWidth / 2;\n \n // 如果悬浮窗在屏幕左半部分,菜单向右展开;否则向左展开\n setMenuDirection(rect.left < middlePoint ? 'right' : 'left');\n };\n \n updateMenuDirection();\n \n // 监听窗口大小变化和滚动事件\n window.addEventListener('resize', updateMenuDirection);\n window.addEventListener('scroll', updateMenuDirection);\n \n return () => {\n window.removeEventListener('resize', updateMenuDirection);\n window.removeEventListener('scroll', updateMenuDirection);\n };\n }, [mounted]);\n\n // 处理拖动开始\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!containerRef.current) return;\n \n // 防止触发菜单点击\n e.stopPropagation();\n \n // 记录鼠标按下的初始位置\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n \n const rect = containerRef.current.getBoundingClientRect();\n setDragOffset({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top\n });\n \n // 重置拖动标志\n setHasDragged(false);\n \n // 设置拖动状态\n setIsDragging(true);\n };\n\n // 处理拖动过程\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: MouseEvent) => {\n // 检查是否移动了足够的距离来认为是拖动\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n \n // 如果移动距离超过阈值,标记为拖动\n if (dx > 3 || dy > 3) {\n setHasDragged(true);\n }\n }\n \n // 计算新位置并应用边界检查\n const newX = e.clientX - dragOffset.x;\n const newY = e.clientY - dragOffset.y;\n \n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n setPosition({\n x: Math.min(Math.max(newX, 0), windowWidth - 50),\n y: Math.min(Math.max(newY, 0), windowHeight - 50)\n });\n };\n \n const handleMouseUp = () => {\n setIsDragging(false);\n \n // 重置鼠标按下位置\n mouseDownPosRef.current = null;\n \n // 设置一个短暂的延时,防止拖动后立即触发点击\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n \n dragTimerRef.current = window.setTimeout(() => {\n setHasDragged(false);\n }, 300); // 300ms 后重置拖动状态\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, dragOffset]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n };\n }, []);\n\n // 切换菜单开关\n const toggleMenu = (e: React.MouseEvent) => {\n e.stopPropagation();\n \n // 如果刚刚拖动过,不触发菜单切换\n if (hasDragged) {\n return;\n }\n \n setIsMenuOpen(!isMenuOpen);\n };\n\n // 关闭菜单的点击外部处理\n useEffect(() => {\n if (!isMenuOpen) return;\n \n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n \n document.addEventListener('mousedown', handleClickOutside);\n \n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isMenuOpen]);\n\n // 窗口大小变化时的边界检查\n useEffect(() => {\n if (!mounted) return;\n \n const checkBoundaries = () => {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n // 确保悬浮窗不会被拖出屏幕\n setPosition(prev => {\n const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);\n const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);\n \n // 只有在实际需要调整时才更新位置\n if (newX !== prev.x || newY !== prev.y) {\n return { x: newX, y: newY };\n }\n return prev;\n });\n };\n \n // 只在窗口大小变化时检查边界\n window.addEventListener('resize', checkBoundaries);\n \n return () => {\n window.removeEventListener('resize', checkBoundaries);\n };\n }, [mounted]);\n\n if (!mounted) return null;\n\n return createPortal(\n <div\n ref={containerRef}\n className={clsx('fixed select-none box-border', className)}\n style={{\n left: (position.x) + 'px',\n top: (position.y) + 'px',\n zIndex,\n }}\n >\n {/* 触发器按钮 */}\n <div \n className={clsx(\n 'flex items-center justify-center w-12 h-12 md:w-12 md:h-12 bg-white rounded-full shadow-md hover:shadow-lg cursor-grab active:cursor-grabbing transition-all duration-200 hover:scale-105 active:scale-95',\n triggerClassName\n )}\n onMouseDown={handleMouseDown}\n onClick={toggleMenu}\n >\n {trigger}\n </div>\n \n {/* 菜单内容 */}\n {isMenuOpen && (\n <div \n className={clsx(\n 'absolute top-0 bg-white rounded-lg shadow-xl p-3 min-w-[200px] md:min-w-[200px] max-w-[300px] z-[1000] transition-all duration-200',\n isMenuOpen ? 'opacity-100 scale-100' : 'opacity-0 scale-95',\n menuDirection === 'left' ? 'right-[calc(100%+10px)]' : 'left-[calc(100%+10px)]',\n menuClassName\n )}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchMove={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n >\n {menu}\n </div>\n )}\n </div>,\n document.body\n );\n};\n\nexport default FloatingMenu;","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport FloatingMenu from './FloatingMenu';\n\nexport const FloatingMenuExample: React.FC = () => {\n const [windowWidth, setWindowWidth] = useState(0);\n \n useEffect(() => {\n setWindowWidth(window.innerWidth);\n const handleResize = () => setWindowWidth(window.innerWidth);\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n const menuItems = [\n { id: 1, label: '首页', icon: '🏠' },\n { id: 2, label: '设置', icon: '⚙️' },\n { id: 3, label: '消息', icon: '📩' },\n { id: 4, label: '帮助', icon: '❓' },\n { id: 5, label: '退出', icon: '🚪' },\n ];\n \n const handleMenuItemClick = (id: number) => {\n console.log('点击了菜单项: ' + (id));\n };\n \n return (\n <div className=\"w-full h-screen bg-gray-100 relative p-8\">\n <div className=\"max-w-2xl mx-auto bg-white rounded-2xl shadow-sm p-8 mt-12\">\n <h1 className=\"text-3xl font-bold mb-4 text-gray-900\">悬浮菜单示例</h1>\n <p className=\"text-gray-600 leading-relaxed mb-6\">\n 这是一个可拖拽的悬浮菜单组件示例。你可以尝试拖动下方的 <span className=\"font-bold text-blue-600\">蓝色按钮</span> 到处移动。\n </p>\n <div className=\"bg-blue-50 border-l-4 border-blue-500 p-4 mb-6\">\n <p className=\"text-sm text-blue-700\">\n <strong>智能定位:</strong> 菜单会根据按钮在屏幕上的位置自动调整弹出方向(向左或向右)。\n </p>\n </div>\n </div>\n \n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-blue-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">➕</span>\n </div>\n }\n menu={\n <div className=\"w-48 bg-white rounded-xl shadow-xl border border-gray-100 overflow-hidden\">\n <div className=\"px-4 py-3 border-b border-gray-100\">\n <h3 className=\"text-sm font-bold text-gray-900\">快捷菜单</h3>\n </div>\n <ul className=\"py-1\">\n {menuItems.map(item => (\n <li \n key={item.id} \n className=\"flex items-center gap-3 px-4 py-2.5 hover:bg-blue-50 text-gray-700 hover:text-blue-600 cursor-pointer transition-colors text-sm\"\n onClick={() => handleMenuItemClick(item.id)}\n >\n <span className=\"text-lg\">{item.icon}</span>\n <span className=\"font-medium\">{item.label}</span>\n </li>\n ))}\n </ul>\n </div>\n }\n initialPosition={{ x: 100, y: 100 }}\n />\n \n {windowWidth > 0 && (\n <FloatingMenu\n trigger={\n <div className=\"w-12 h-12 bg-purple-600 rounded-full flex items-center justify-center text-white shadow-lg cursor-pointer\">\n <span className=\"text-xl\">🔍</span>\n </div>\n }\n menu={\n <div className=\"w-64 bg-white rounded-xl shadow-xl border border-gray-100 p-4\">\n <h3 className=\"text-sm font-bold text-gray-900 mb-3\">快速搜索</h3>\n <div className=\"space-y-3\">\n <input \n type=\"text\" \n placeholder=\"输入关键字...\" \n className=\"w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-transparent outline-none\"\n />\n <button className=\"w-full bg-purple-600 text-white py-2 rounded-lg text-sm font-medium hover:bg-purple-700 transition-colors\">\n 搜索\n </button>\n </div>\n </div>\n }\n initialPosition={{ x: windowWidth - 100, y: 100 }}\n />\n )}\n </div>\n );\n};\n\nexport default FloatingMenuExample;\n\n","/**\n * 实验田模块工具函数\n */\n\nimport type { ExperimentItem, ViewMode, TestFieldConfig, CompletionFilter } from '../types';\n\n/**\n * 过滤实验项目\n */\nexport function filterExperiments(\n experiments: ExperimentItem[],\n config: Partial<TestFieldConfig>\n): ExperimentItem[] {\n const {\n viewMode = 'all',\n searchQuery = '',\n completionFilter = 'all'\n } = config;\n\n return experiments.filter(experiment => {\n // 类别过滤\n const matchesViewMode = viewMode === 'all' || experiment.category === viewMode;\n \n // 搜索过滤\n const query = searchQuery.toLowerCase();\n const matchesSearch = !query || \n experiment.title.toLowerCase().includes(query) ||\n experiment.description.toLowerCase().includes(query) ||\n experiment.tags.some(tag => tag.toLowerCase().includes(query));\n \n // 完成状态过滤\n const matchesCompletion = (() => {\n switch (completionFilter) {\n case 'completed':\n return experiment.isCompleted === true;\n case 'incomplete':\n return experiment.isCompleted !== true;\n case 'all':\n default:\n return true;\n }\n })();\n \n return matchesViewMode && matchesSearch && matchesCompletion;\n });\n}\n\n/**\n * 排序实验项目\n */\nexport function sortExperiments(\n experiments: ExperimentItem[],\n sortBy: TestFieldConfig['sortBy'] = 'title',\n sortOrder: TestFieldConfig['sortOrder'] = 'asc'\n): ExperimentItem[] {\n return [...experiments].sort((a, b) => {\n let comparison = 0;\n \n switch (sortBy) {\n case 'title':\n comparison = a.title.localeCompare(b.title);\n break;\n case 'category':\n comparison = a.category.localeCompare(b.category);\n break;\n case 'completion':\n // 已完成的排在前面\n const aCompleted = a.isCompleted ? 1 : 0;\n const bCompleted = b.isCompleted ? 1 : 0;\n comparison = bCompleted - aCompleted;\n break;\n case 'createdAt':\n // 处理创建日期排序,确保没有日期的项目排在最后\n if (!a.createdAt && !b.createdAt) {\n comparison = 0;\n } else if (!a.createdAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.createdAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();\n }\n break;\n case 'updatedAt':\n // 处理更新日期排序,确保没有日期的项目排在最后\n if (!a.updatedAt && !b.updatedAt) {\n comparison = 0;\n } else if (!a.updatedAt) {\n comparison = 1; // a没有日期,排在后面\n } else if (!b.updatedAt) {\n comparison = -1; // b没有日期,排在后面\n } else {\n // 日期字符串比较(假设格式为YYYY-MM-DD)\n comparison = new Date(a.updatedAt).getTime() - new Date(b.updatedAt).getTime();\n }\n break;\n default:\n comparison = 0;\n }\n \n // 如果主要排序字段相同,使用ID作为第二排序键确保稳定性\n if (comparison === 0) {\n comparison = a.id.localeCompare(b.id);\n }\n \n return sortOrder === 'asc' ? comparison : -comparison;\n });\n}\n\n/**\n * 获取所有标签\n */\nexport function getAllTags(experiments: ExperimentItem[]): string[] {\n const allTags = experiments.flatMap(experiment => experiment.tags);\n return Array.from(new Set(allTags)).sort();\n}\n\n/**\n * 根据类别统计实验项目数量\n */\nexport function getExperimentCounts(experiments: ExperimentItem[]) {\n const counts = {\n all: experiments.length,\n utility: 0,\n leisure: 0,\n completed: 0,\n inProgress: 0\n };\n \n experiments.forEach(experiment => {\n if (experiment.category === 'utility') {\n counts.utility++;\n } else if (experiment.category === 'leisure') {\n counts.leisure++;\n }\n \n if (experiment.isCompleted) {\n counts.completed++;\n } else {\n counts.inProgress++;\n }\n });\n \n return counts;\n}\n\n/**\n * 验证实验项目数据\n */\nexport function validateExperiment(experiment: Partial<ExperimentItem>): boolean {\n return !!(\n experiment.id &&\n experiment.title &&\n experiment.description &&\n experiment.path &&\n experiment.category &&\n Array.isArray(experiment.tags)\n );\n}\n\n/**\n * 获取类别显示名称\n */\nexport function getCategoryDisplayName(category: ViewMode): string {\n switch (category) {\n case 'utility':\n return '实用工具';\n case 'leisure':\n return '休闲娱乐';\n case 'all':\n default:\n return '全部';\n }\n}\n\n/**\n * 获取类别颜色\n */\nexport function getCategoryColor(category: ExperimentItem['category']): string {\n switch (category) {\n case 'utility':\n return 'bg-blue-100 text-blue-800 border-blue-200';\n case 'leisure':\n return 'bg-purple-100 text-purple-800 border-purple-200';\n default:\n return 'bg-gray-100 text-gray-800 border-gray-200';\n }\n}\n\n/**\n * 获取完成状态显示名称\n */\nexport function getCompletionFilterDisplayName(filter: CompletionFilter): string {\n switch (filter) {\n case 'completed':\n return '已完成';\n case 'incomplete':\n return '进行中';\n case 'all':\n default:\n return '全部状态';\n }\n}\n\n/**\n * 获取完成状态标签样式\n */\nexport function getCompletionStatusColor(isCompleted?: boolean): string {\n if (isCompleted) {\n return 'bg-green-100 text-green-800 border-green-200';\n }\n return 'bg-yellow-100 text-yellow-800 border-yellow-200';\n}\n\n/**\n * 获取完成状态标签文本\n */\nexport function getCompletionStatusText(isCompleted?: boolean): string {\n return isCompleted ? '已完成' : '进行中';\n}","'use client';\n\nimport React from \"react\";\nimport type { ViewMode } from '../types';\nimport { getCategoryDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components/FilterButtonGroup';\n\ninterface CategoryFilterProps {\n viewMode: ViewMode;\n onViewModeChange: (mode: ViewMode) => void;\n counts: { utility: number; leisure: number };\n className?: string;\n}\n\nexport const CategoryFilter: React.FC<CategoryFilterProps> = ({ \n viewMode, \n onViewModeChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCategoryDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-blue-500',\n shadow: 'shadow-blue-200'\n },\n showCount: false\n },\n {\n value: 'utility' as const,\n label: getCategoryDisplayName('utility'),\n icon: '🔧',\n activeColor: {\n bg: 'bg-green-500',\n shadow: 'shadow-green-200'\n },\n count: counts.utility,\n showCount: true\n },\n {\n value: 'leisure' as const,\n label: getCategoryDisplayName('leisure'),\n icon: '🎮',\n activeColor: {\n bg: 'bg-purple-500',\n shadow: 'shadow-purple-200'\n },\n count: counts.leisure,\n showCount: true\n },\n ];\n\n return (\n <FilterButtonGroup\n label=\"项目类别\"\n value={viewMode}\n options={options}\n onChange={onViewModeChange}\n className={className}\n />\n );\n};\n\nexport default CategoryFilter;\n","'use client';\n\nimport React from \"react\";\nimport type { CompletionFilter } from '../types';\nimport { getCompletionFilterDisplayName } from '../utils';\nimport { FilterButtonGroup } from '@/components/FilterButtonGroup';\n\ninterface CompletionFilterProps {\n completionFilter: CompletionFilter;\n onCompletionFilterChange: (filter: CompletionFilter) => void;\n counts: { all: number; completed: number; inProgress: number };\n className?: string;\n}\n\nexport const CompletionFilterComponent: React.FC<CompletionFilterProps> = ({ \n completionFilter, \n onCompletionFilterChange, \n counts,\n className\n}) => {\n const options = [\n {\n value: 'all' as const,\n label: getCompletionFilterDisplayName('all'),\n icon: '📊',\n activeColor: {\n bg: 'bg-slate-500',\n shadow: 'shadow-slate-200'\n },\n count: counts.all,\n showCount: true\n },\n {\n value: 'completed' as const,\n label: getCompletionFilterDisplayName('completed'),\n icon: '✅',\n activeColor: {\n bg: 'bg-emerald-500',\n shadow: 'shadow-emerald-200'\n },\n count: counts.completed,\n showCount: true\n },\n {\n value: 'incomplete' as const,\n label: getCompletionFilterDisplayName('incomplete'),\n icon: '🚧',\n activeColor: {\n bg: 'bg-orange-500',\n shadow: 'shadow-orange-200'\n },\n count: counts.inProgress,\n showCount: true\n }\n ];\n\n return (\n <FilterButtonGroup\n label=\"完成状态\"\n value={completionFilter}\n options={options}\n onChange={onCompletionFilterChange}\n className={className}\n />\n );\n};\n\nexport default CompletionFilterComponent;\n","'use client';\n\nimport React from \"react\";\nimport { BackButton } from '@/components/BackButton';\n\nexport interface PageHeaderProps {\n counts: { all: number; utility: number; leisure: number; completed: number };\n className?: string;\n}\n\nexport const PageHeader: React.FC<PageHeaderProps> = ({ counts, className }) => {\n return (\n <div className={className}>\n {/* 顶部导航 */}\n <div className=\"mb-8\">\n <BackButton />\n </div>\n\n {/* 页面标题 */}\n <div className=\"mb-8\">\n <h1 className=\"text-3xl font-bold text-gray-900\">实验田</h1>\n <p className=\"mt-2 text-sm text-gray-600\">\n 在这里,你可以尝试各种实验性的功能和项目\n </p>\n \n {/* 统计信息 */}\n <div className=\"mt-4 flex flex-wrap gap-4 text-sm text-gray-500\">\n <span>总计: {counts.all} 个项目</span>\n <span>实用工具: {counts.utility} 个</span>\n <span>休闲娱乐: {counts.leisure} 个</span>\n <span>已完成: {counts.completed} 个</span>\n </div>\n </div>\n </div>\n );\n};\n\nexport default PageHeader;\n","'use client';\n\nimport React from \"react\";\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { Grid } from '@/components/Grid';\nimport type { GridItem, GridColumns, GridGap } from '@/components/Grid';\n\n/** 实验项目网格项接口 */\nexport interface ExperimentGridItem extends GridItem {\n title: string;\n description: string;\n path: string;\n tags: string[];\n category: string;\n isCompleted?: boolean;\n updatedAt?: string;\n createdAt?: string;\n}\n\n/** 实验项目网格组件 Props */\nexport interface ExperimentGridProps<T extends ExperimentGridItem> {\n /** 数据项数组 */\n items: T[];\n /** 自定义渲染函数(可选) */\n renderItem?: (item: T, index: number) => React.ReactNode;\n /** 网格列数配置(可选) */\n columns?: GridColumns;\n /** 间距配置(可选) */\n gap?: GridGap;\n /** 额外的容器类名 */\n className?: string;\n}\n\n/** 默认的 ExperimentCard 渲染器 */\nfunction defaultExperimentRenderer(item: ExperimentItem) {\n return (\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n );\n}\n\n/** 实验项目网格组件 */\nexport function ExperimentGrid<T extends ExperimentGridItem>({\n items,\n renderItem,\n columns = { sm: 1, md: 2, lg: 3, xl: 4 },\n gap = 'md',\n className = ''\n}: ExperimentGridProps<T>) {\n const itemRenderer = renderItem || ((item: T) => defaultExperimentRenderer(item as any));\n\n return (\n <Grid\n items={items}\n renderItem={itemRenderer}\n columns={columns}\n gap={gap}\n className={className}\n />\n );\n}\n\n/** 为了向后兼容,导出一个专门用于 ExperimentItem 的组件 */\nexport function ExperimentItemGrid({ \n experiments, \n ...props \n}: Omit<ExperimentGridProps<ExperimentItem>, 'items'> & { experiments: ExperimentItem[] }) {\n return <ExperimentGrid<ExperimentItem> items={experiments} {...props} />;\n}\n\nexport default ExperimentGrid;\n","'use client';\n\nimport React from \"react\";\nimport { clsx } from 'clsx';\n\nexport interface EmptyStateProps {\n searchQuery: string;\n onClearSearch: () => void;\n className?: string;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({ searchQuery, onClearSearch, className }) => {\n return (\n <div className={clsx('text-center py-12', className)}>\n <svg \n className=\"mx-auto h-12 w-12 text-gray-400\" \n fill=\"none\" \n stroke=\"currentColor\" \n viewBox=\"0 0 24 24\"\n >\n <path \n strokeLinecap=\"round\" \n strokeLinejoin=\"round\" \n strokeWidth={2} \n d=\"M9.172 16.172a4 4 0 015.656 0M9 12h6m-6-4h6m2 5.291A7.962 7.962 0 0112 15c-2.34 0-4.47.904-6.06 2.384\" \n />\n </svg>\n <h3 className=\"mt-2 text-sm font-medium text-gray-900\">没有找到匹配的实验项目</h3>\n <p className=\"mt-1 text-sm text-gray-500\">\n {searchQuery \n ? '尝试调整搜索关键词或筛选条件' \n : '当前分类下暂无实验项目'\n }\n </p>\n {searchQuery && (\n <div className=\"mt-4\">\n <button\n onClick={onClearSearch}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-blue-700 bg-blue-100 hover:bg-blue-200\"\n >\n 清除搜索\n </button>\n </div>\n )}\n </div>\n );\n};\n\nexport default EmptyState;\n","'use client';\n\nimport React from 'react';\nimport type { TestFieldConfig } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortControlProps {\n sortBy: TestFieldConfig['sortBy'];\n sortOrder: TestFieldConfig['sortOrder'];\n onSortByChange: (sortBy: TestFieldConfig['sortBy']) => void;\n onSortOrderChange: (sortOrder: TestFieldConfig['sortOrder']) => void;\n}\n\nexport const SortControl: React.FC<SortControlProps> = ({\n sortBy,\n sortOrder,\n onSortByChange,\n onSortOrderChange,\n}) => {\n // 排序方式选项\n const sortOptions: { value: TestFieldConfig['sortBy']; label: string }[] = [\n { value: 'title', label: '名称' },\n { value: 'updatedAt', label: '更新时间' },\n { value: 'createdAt', label: '创建时间' },\n { value: 'category', label: '类别' },\n { value: 'completion', label: '完成状态' },\n ];\n\n return (\n <div className=\"flex flex-col sm:flex-row items-start sm:items-center gap-2 sm:gap-4 p-4 bg-white rounded-lg shadow-sm border border-gray-100\">\n <div className=\"text-sm font-medium text-gray-700\">排序方式:</div>\n \n <div className=\"flex flex-wrap gap-2\">\n {sortOptions.map((option) => (\n <button\n key={option.value}\n className={clsx('px-3 py-1.5 text-sm rounded-full transition-colors', sortBy === option.value\n ? 'bg-blue-100 text-blue-700 font-medium'\n : 'bg-gray-100 text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortByChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n \n <div className=\"ml-auto flex items-center\">\n <button\n className=\"flex items-center gap-1 px-3 py-1.5 text-sm rounded-full bg-gray-100 hover:bg-gray-200\"\n onClick={() => onSortOrderChange(sortOrder === 'asc' ? 'desc' : 'asc')}\n >\n {sortOrder === 'asc' ? (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h6m4 0l4-4m0 0l4 4m-4-4v12\" />\n </svg>\n <span>升序</span>\n </>\n ) : (\n <>\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>降序</span>\n </>\n )}\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortControl;\n","'use client';\n\nimport React from 'react';\nimport type { SortMode } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortModeToggleProps {\n sortMode: SortMode;\n onSortModeChange: (mode: SortMode) => void;\n}\n\nexport const SortModeToggle: React.FC<SortModeToggleProps> = ({ sortMode, onSortModeChange }) => {\n return (\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-3 bg-white p-4 rounded-lg shadow-sm border border-gray-100\">\n <span className=\"text-sm font-medium text-gray-700\">排序模式:</span>\n \n <div className=\"flex w-full sm:w-auto p-1 bg-gray-100 rounded-lg\">\n <button\n className={clsx('flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors', sortMode === 'auto'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortModeChange('auto')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M3 4h13M3 8h9m-9 4h9m5-4v12m0 0l-4-4m4 4l4-4\" />\n </svg>\n <span>自动排序</span>\n </div>\n </button>\n \n <button\n className={clsx('flex-1 sm:flex-initial px-3 py-1.5 text-sm rounded-md transition-colors', sortMode === 'manual'\n ? 'bg-white text-blue-700 font-medium shadow-sm'\n : 'text-gray-600 hover:bg-gray-200')}\n onClick={() => onSortModeChange('manual')}\n >\n <div className=\"flex items-center justify-center sm:justify-start space-x-1\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M7 11.5V14m0-2.5v-6a1.5 1.5 0 113 0m-3 6a1.5 1.5 0 00-3 0v2a7.5 7.5 0 0015 0v-5a1.5 1.5 0 013 0m-6-3V11m0-5.5v-1a1.5 1.5 0 013 0v1m0 0V11m0-5.5a1.5 1.5 0 013 0v3m0 0V11\" />\n </svg>\n <span>手动排序</span>\n </div>\n </button>\n </div>\n </div>\n );\n};\n\nexport default SortModeToggle;\n","'use client';\n\nimport React from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\nimport { ExperimentCard } from '@/portfolio/ExperimentCard';\nimport type { ExperimentItem } from '../types';\nimport { clsx } from 'clsx';\n\nexport interface SortableExperimentItemProps {\n item: ExperimentItem;\n onMoveUp?: () => void;\n onMoveDown?: () => void;\n isFirst?: boolean;\n isLast?: boolean;\n}\n\nexport const SortableExperimentItem: React.FC<SortableExperimentItemProps> = ({ \n item, \n onMoveUp, \n onMoveDown,\n isFirst,\n isLast \n}) => {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id: item.id });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n zIndex: isDragging ? 100 : 1,\n opacity: isDragging ? 0.8 : 1,\n position: 'relative' as const,\n };\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className=\"relative group\"\n >\n {/* 拖拽手柄 - 桌面端 */}\n <div\n {...attributes}\n {...listeners}\n className=\"absolute right-2 top-2 w-8 h-8 bg-white/80 hover:bg-white rounded-full flex items-center justify-center shadow-md z-[10]\n hidden sm:flex\n opacity-0 group-hover:opacity-100 transition-opacity\n cursor-grab active:cursor-grabbing\n touch-action-none\" /* 防止触摸设备上的滚动冲突 */\n onClick={(e) => e.stopPropagation()}\n aria-label=\"拖动排序\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 text-gray-500\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 8h16M4 16h16\" />\n </svg>\n \n <span className=\"absolute top-full mt-1 left-1/2 transform -translate-x-1/2 text-xs bg-gray-800 text-white px-2 py-1 rounded whitespace-nowrap opacity-0 group-hover:opacity-100 transition-opacity\">\n 拖动排序\n </span>\n </div>\n\n {/* 移动端排序按钮组 */}\n <div className=\"absolute right-2 top-2 flex flex-col gap-2 sm:hidden z-[10]\">\n {/* 向上按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveUp?.();\n }}\n disabled={isFirst}\n className={clsx('w-8 h-8 rounded-full flex items-center justify-center shadow-md', isFirst ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100')}\n aria-label=\"向上移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={clsx('h-5 w-5', isFirst ? 'text-gray-400' : 'text-gray-500')} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 15l7-7 7 7\" />\n </svg>\n </button>\n\n {/* 向下按钮 */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMoveDown?.();\n }}\n disabled={isLast}\n className={clsx('w-8 h-8 rounded-full flex items-center justify-center shadow-md', isLast ? 'bg-gray-200 cursor-not-allowed' : 'bg-white/80 hover:bg-white active:bg-gray-100')}\n aria-label=\"向下移动\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" className={clsx('h-5 w-5', isLast ? 'text-gray-400' : 'text-gray-500')} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n </div>\n\n {/* 实验卡片 */}\n <div className={clsx('transition-all', isDragging ? 'scale-105 shadow-xl' : '')}>\n <ExperimentCard\n href={item.path}\n title={item.title}\n description={item.description}\n tags={item.tags}\n category={item.category as any}\n isCompleted={item.isCompleted}\n updatedAt={item.updatedAt}\n createdAt={item.createdAt}\n />\n </div>\n </div>\n );\n};\n\nexport default SortableExperimentItem;\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { ExperimentItem } from '../types';\nimport { clsx } from 'clsx';\nimport { \n DndContext, \n closestCenter, \n KeyboardSensor, \n PointerSensor, \n useSensor, \n useSensors,\n DragEndEvent,\n TouchSensor\n} from '@dnd-kit/core';\nimport {\n arrayMove,\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy\n} from '@dnd-kit/sortable';\nimport { SortableExperimentItem } from './SortableExperimentItem';\n\nexport interface DraggableExperimentGridProps {\n items: ExperimentItem[];\n onOrderChange?: (items: ExperimentItem[]) => void;\n className?: string;\n}\n\nexport const DraggableExperimentGrid: React.FC<DraggableExperimentGridProps> = ({ \n items: initialItems, \n onOrderChange,\n className = '' \n}) => {\n // 本地状态跟踪项目顺序\n const [items, setItems] = useState<ExperimentItem[]>(initialItems);\n const [isDragging, setIsDragging] = useState(false);\n\n // 设置传感器\n const sensors = useSensors(\n useSensor(PointerSensor, {\n activationConstraint: {\n distance: 8, // 需要拖动8px才激活,避免意外触发\n },\n }),\n useSensor(TouchSensor, {\n activationConstraint: {\n delay: 250, // 触摸需要按住250ms才激活,避免与点击冲突\n tolerance: 5, // 允许的移动容差\n },\n }),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n })\n );\n\n // 处理拖拽开始事件\n function handleDragStart() {\n setIsDragging(true);\n }\n\n // 处理拖拽结束事件\n function handleDragEnd(event: DragEndEvent) {\n setIsDragging(false);\n \n const { active, over } = event;\n \n if (over && active.id !== over.id) {\n setItems((currentItems) => {\n // 找到拖拽项和目标项的索引\n const oldIndex = currentItems.findIndex(item => item.id === active.id);\n const newIndex = currentItems.findIndex(item => item.id === over.id);\n \n // 重新排序项目\n const newItems = arrayMove(currentItems, oldIndex, newIndex);\n \n // 如果提供了回调函数,通知父组件顺序变化\n if (onOrderChange) {\n onOrderChange(newItems);\n }\n \n return newItems;\n });\n }\n }\n\n // 处理向上移动\n const handleMoveUp = (index: number) => {\n if (index > 0) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index - 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 处理向下移动\n const handleMoveDown = (index: number) => {\n if (index < items.length - 1) {\n setItems((currentItems) => {\n const newItems = arrayMove(currentItems, index, index + 1);\n onOrderChange?.(newItems);\n return newItems;\n });\n }\n };\n\n // 当初始项目变化时更新本地状态\n React.useEffect(() => {\n setItems(initialItems);\n }, [initialItems]);\n\n return (\n <div className={clsx('relative', className)}>\n <div className=\"mb-4 px-4 py-3 bg-blue-50 text-blue-700 rounded-lg border border-blue-200 text-sm\">\n <div className=\"flex items-start sm:items-center\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" className=\"h-5 w-5 mr-2 flex-shrink-0 mt-0.5 sm:mt-0\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n <path fillRule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clipRule=\"evenodd\" />\n </svg>\n <div>\n <p className=\"mb-1\">拖拽卡片可以自定义排序。点击卡片可以访问对应的实验项目。</p>\n <p className=\"text-xs text-blue-600 sm:hidden\">点击卡片右上角的上下箭头按钮调整顺序</p>\n <p className=\"text-xs text-blue-600 hidden sm:block\">长按卡片右上角的拖动图标进行排序</p>\n </div>\n </div>\n </div>\n \n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n >\n <SortableContext\n items={items.map(item => item.id)}\n strategy={rectSortingStrategy}\n >\n <div className={clsx('grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6', isDragging ? 'cursor-grabbing' : '')}>\n {items.map((item, index) => (\n <SortableExperimentItem \n key={item.id} \n item={item}\n onMoveUp={() => handleMoveUp(index)}\n onMoveDown={() => handleMoveDown(index)}\n isFirst={index === 0}\n isLast={index === items.length - 1}\n />\n ))}\n </div>\n </SortableContext>\n </DndContext>\n </div>\n );\n};\n\nexport default DraggableExperimentGrid;\n","/**\n * Auth Schema - Enums\n * 认证相关的枚举类型定义\n */\n\nimport { pgEnum } from 'drizzle-orm/pg-core';\n\n/**\n * 用户角色枚举\n */\nexport const userRole = pgEnum('UserRole', ['USER', 'ADMIN', 'SUPER_ADMIN']);\n\n/**\n * 类型定义\n */\nexport type UserRole = 'USER' | 'ADMIN' | 'SUPER_ADMIN';\n\n","/**\n * Better Auth — user 表(3.0 SSOT)\n */\nimport { boolean, pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport { userRole } from './enums';\n\nexport const user = pgTable('user', {\n id: text('id').primaryKey().notNull(),\n name: text('name').notNull(),\n email: text('email').notNull(),\n emailVerified: boolean('emailVerified').default(false).notNull(),\n image: text('image'),\n phoneNumber: text('phoneNumber'),\n phoneNumberVerified: boolean('phoneNumberVerified').default(false),\n role: userRole('role').default('USER').notNull(),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type User = typeof user.$inferSelect;\nexport type NewUser = typeof user.$inferInsert;\n","/**\n * Better Auth — session 表(3.0 SSOT)\n */\nimport { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport { user } from './user';\n\nexport const session = pgTable('session', {\n id: text('id').primaryKey().notNull(),\n userId: text('userId')\n .notNull()\n .references(() => user.id, { onDelete: 'cascade' }),\n token: text('token').notNull(),\n expiresAt: timestamp('expiresAt', { precision: 3, mode: 'date' }).notNull(),\n ipAddress: text('ipAddress'),\n userAgent: text('userAgent'),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type Session = typeof session.$inferSelect;\nexport type NewSession = typeof session.$inferInsert;\n","/**\n * Better Auth — account 表(credential / OAuth,3.0 SSOT)\n */\nimport { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\nimport { user } from './user';\n\nexport const account = pgTable('account', {\n id: text('id').primaryKey().notNull(),\n accountId: text('accountId').notNull(),\n providerId: text('providerId').notNull(),\n userId: text('userId')\n .notNull()\n .references(() => user.id, { onDelete: 'cascade' }),\n accessToken: text('accessToken'),\n refreshToken: text('refreshToken'),\n idToken: text('idToken'),\n accessTokenExpiresAt: timestamp('accessTokenExpiresAt', { precision: 3, mode: 'date' }),\n refreshTokenExpiresAt: timestamp('refreshTokenExpiresAt', { precision: 3, mode: 'date' }),\n scope: text('scope'),\n password: text('password'),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type Account = typeof account.$inferSelect;\nexport type NewAccount = typeof account.$inferInsert;\n","/**\n * Better Auth — verification 表(OTP / magic link,3.0 SSOT)\n */\nimport { pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport { sql } from 'drizzle-orm';\n\nexport const verification = pgTable('verification', {\n id: text('id').primaryKey().notNull(),\n identifier: text('identifier').notNull(),\n value: text('value').notNull(),\n expiresAt: timestamp('expiresAt', { precision: 3, mode: 'date' }).notNull(),\n createdAt: timestamp('createdAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n updatedAt: timestamp('updatedAt', { precision: 3, mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n});\n\nexport type Verification = typeof verification.$inferSelect;\nexport type NewVerification = typeof verification.$inferInsert;\n\n/** @deprecated 3.0 使用 `verification` */\nexport const verifications = verification;\n","/**\n * Auth Schema - Relations\n * 表关系定义\n */\n\nimport { relations } from 'drizzle-orm';\nimport { user } from './user';\nimport { session } from './session';\nimport { account } from './account';\n\n/**\n * User 表关系\n */\nexport const userRelations = relations(user, ({ many }) => ({\n sessions: many(session),\n accounts: many(account),\n}));\n\n/**\n * Session 表关系\n */\nexport const sessionRelations = relations(session, ({ one }) => ({\n user: one(user, {\n fields: [session.userId],\n references: [user.id],\n }),\n}));\n\n/**\n * Account 表关系\n */\nexport const accountRelations = relations(account, ({ one }) => ({\n user: one(user, {\n fields: [account.userId],\n references: [user.id],\n }),\n}));\n\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, UseAuthReturn, useAuth } from '@/auth';\nimport { Shield, AlertTriangle } from 'lucide-react';\nimport { ApiError } from '@/universalFile/server';\n\ninterface PermissionGuardProps {\n children: React.ReactNode;\n fallback?: React.ReactNode;\n apiClient: BaseApiClient;\n}\n\nexport const PermissionGuard: React.FC<PermissionGuardProps> = ({\n apiClient,\n children,\n fallback\n}) => {\n const { user, isLoggedIn } = useAuth(apiClient);\n\n // 检查用户是否有权限(所有登录用户都可以访问实验田)\n const hasPermission = () => {\n if (!isLoggedIn || !user) {\n return false;\n }\n\n // 实验田对所有登录用户开放\n return true;\n };\n\n if (!hasPermission()) {\n return (fallback as any) || (\n <div className=\"min-h-screen bg-gray-50 flex items-center justify-center\">\n <div className=\"max-w-md w-full bg-white rounded-lg shadow-lg p-8 text-center\">\n <div className=\"flex items-center justify-center mb-4\">\n <Shield className=\"w-12 h-12 text-red-500\" />\n </div>\n <h2 className=\"text-xl font-semibold text-gray-900 mb-2\">\n 需要登录\n </h2>\n <p className=\"text-gray-600 mb-4\">\n 请先登录以访问实验田功能。\n </p>\n <div className=\"flex items-center justify-center text-sm text-gray-500 mb-4\">\n <AlertTriangle className=\"w-4 h-4 mr-1\" />\n 实验田对所有注册用户开放\n </div>\n <button\n onClick={() => window.history.back()}\n className=\"inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-green-600 hover:bg-green-700\"\n >\n 返回上一页\n </button>\n </div>\n </div>\n );\n }\n\n return <>{children}</>;\n};\n\nexport default PermissionGuard;\n","'use client';\n\nimport React from 'react';\nimport { BaseApiClient, useAuth } from '@/auth';\nimport { LogOut, User, FlaskConical } from 'lucide-react';\n\nexport interface UserInfoBarProps {\n apiClient: BaseApiClient;\n}\n\nexport const UserInfoBar: React.FC<UserInfoBarProps> = ({ apiClient }) => {\n const { user, logout, isLoggedIn } = useAuth(apiClient);\n\n const handleLogout = async () => {\n try {\n await logout();\n // 登出后重定向到首页\n window.location.href = '/';\n } catch (error) {\n console.error('登出失败:', error);\n }\n };\n\n if (!isLoggedIn || !user) {\n return null;\n }\n\n return (\n <div className=\"bg-white border-b border-gray-200 px-4 py-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-3\">\n <div className=\"flex items-center space-x-2\">\n <User className=\"w-5 h-5 text-gray-600\" />\n <span className=\"text-sm font-medium text-gray-900\">\n {user.name || user.email || '用户'}\n </span>\n {user.role && (\n <span className=\"inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-green-100 text-green-800\">\n {user.role}\n </span>\n )}\n </div>\n </div>\n \n <div className=\"flex items-center space-x-2\">\n <div className=\"flex items-center space-x-1 text-sm text-gray-500\">\n <FlaskConical className=\"w-4 h-4\" />\n <span>实验田</span>\n </div>\n \n <button\n onClick={handleLogout}\n className=\"inline-flex items-center px-3 py-1.5 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-green-500\"\n >\n <LogOut className=\"w-4 h-4 mr-1\" />\n 登出\n </button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default UserInfoBar;\n","'use client';\n\nimport React, { useState } from 'react';\n\ninterface DanmakuPanelProps {\n onSend: (text: string) => void;\n}\n\nexport function DanmakuPanel({ onSend }: DanmakuPanelProps) {\n const [text, setText] = useState('');\n\n const emit = () => {\n const value = text.trim();\n if (!value) {\n return;\n }\n onSend(value);\n setText('');\n };\n\n return (\n <div className=\"rounded-xl border border-slate-600/40 bg-slate-900/70 p-3 text-slate-100 backdrop-blur-sm\">\n <div className=\"flex gap-2\">\n <input\n type=\"text\"\n value={text}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n emit();\n }\n }}\n placeholder=\"发送弹幕(支持 /miku /avatar /normal)\"\n className=\"flex-1 rounded-md border border-slate-600 bg-slate-950 px-2.5 py-2 text-sm text-slate-100 outline-none focus:border-cyan-400\"\n />\n <button\n type=\"button\"\n onClick={emit}\n className=\"rounded-md bg-cyan-400 px-3 py-2 text-sm font-medium text-slate-950 hover:bg-cyan-300\"\n >\n 发送\n </button>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\n\ninterface FireworksCanvasProps {\n canvasRef: React.RefObject<HTMLCanvasElement>;\n}\n\nexport function FireworksCanvas({ canvasRef }: FireworksCanvasProps) {\n return (\n <canvas\n ref={canvasRef}\n className=\"absolute inset-0 h-full w-full\"\n style={{\n background:\n 'radial-gradient(circle at 20% 20%, rgba(57,197,187,0.15) 0%, rgba(6,8,22,1) 45%, rgba(4,6,15,1) 100%)',\n }}\n />\n );\n}\n","import type { FireworkKind } from './types';\n\nexport const DEFAULT_MAX_PARTICLES = 5000;\nexport const DEFAULT_MAX_ACTIVE_FIREWORKS = 12;\n\nexport const FIREWORK_KIND_LABELS: Record<FireworkKind, string> = {\n normal: '普通烟花',\n miku: 'MIKU 主题',\n avatar: '头像烟花',\n};\n\nexport const MIKU_PALETTE = ['#39c5bb', '#66e3db', '#7ad8ff', '#b0fff8', '#8cf7e0'];\nexport const NORMAL_PALETTE = ['#ffe066', '#ff6b6b', '#4dabf7', '#c77dff', '#69db7c'];\n\nexport const DANMAKU_MAX_LENGTH = 32;\nexport const DANMAKU_TRACK_COUNT = 8;\n","'use client';\n\nimport React from 'react';\nimport { FIREWORK_KIND_LABELS } from '../constants';\nimport type { FireworkKind } from '../types';\n\ninterface FireworksControlPanelProps {\n selectedKind: FireworkKind;\n onKindChange: (kind: FireworkKind) => void;\n autoLaunchOnDanmaku: boolean;\n onAutoLaunchChange: (value: boolean) => void;\n avatarUrl: string;\n onAvatarUrlChange: (value: string) => void;\n onLaunch: () => void;\n fps: number;\n realtimeConnected?: boolean;\n onlineCount?: number;\n}\n\nexport function FireworksControlPanel({\n selectedKind,\n onKindChange,\n autoLaunchOnDanmaku,\n onAutoLaunchChange,\n avatarUrl,\n onAvatarUrlChange,\n onLaunch,\n fps,\n realtimeConnected,\n onlineCount,\n}: FireworksControlPanelProps) {\n return (\n <div className=\"rounded-xl border border-slate-600/40 bg-slate-900/70 p-3 text-slate-100 backdrop-blur-sm\">\n <div className=\"mb-3 flex flex-wrap items-center gap-2\">\n {(Object.keys(FIREWORK_KIND_LABELS) as FireworkKind[]).map((kind) => {\n const active = kind === selectedKind;\n return (\n <button\n key={kind}\n type=\"button\"\n onClick={() => onKindChange(kind)}\n className={`rounded-md px-3 py-1.5 text-sm transition ${\n active ? 'bg-cyan-500 text-slate-950' : 'bg-slate-700/70 hover:bg-slate-600/80'\n }`}\n >\n {FIREWORK_KIND_LABELS[kind]}\n </button>\n );\n })}\n\n <button\n type=\"button\"\n onClick={onLaunch}\n className=\"ml-auto rounded-md bg-emerald-400 px-3 py-1.5 text-sm font-medium text-slate-900 hover:bg-emerald-300\"\n >\n 发射烟花\n </button>\n </div>\n\n <div className=\"grid gap-2 md:grid-cols-2\">\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={autoLaunchOnDanmaku}\n onChange={(event) => onAutoLaunchChange(event.target.checked)}\n />\n 发送弹幕后自动放烟花\n </label>\n\n <div className=\"text-sm text-slate-300\">FPS: {fps}</div>\n {typeof realtimeConnected === 'boolean' ? (\n <div className=\"text-sm text-slate-300\">\n 实时状态: {realtimeConnected ? '已连接' : '未连接'}\n {typeof onlineCount === 'number' ? ` · 在线 ${onlineCount}` : ''}\n </div>\n ) : null}\n </div>\n\n {selectedKind === 'avatar' ? (\n <div className=\"mt-2\">\n <input\n type=\"url\"\n value={avatarUrl}\n onChange={(event) => onAvatarUrlChange(event.target.value)}\n placeholder=\"头像图片 URL(用于头像烟花)\"\n className=\"w-full rounded-md border border-slate-600 bg-slate-950 px-2.5 py-2 text-sm text-slate-100 outline-none focus:border-cyan-400\"\n />\n </div>\n ) : null}\n </div>\n );\n}\n","'use client';\n\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT } from '../constants';\nimport type { DanmakuControllerOptions, DanmakuMessage, DanmakuSendResult, FireworkKind } from '../types';\n\nexport interface DanmakuOverlayItem extends DanmakuMessage {\n track: number;\n durationMs: number;\n}\n\ninterface SendDanmakuOptions {\n optimistic?: boolean;\n}\n\nexport function useDanmakuController(options?: DanmakuControllerOptions) {\n const [items, setItems] = useState<DanmakuOverlayItem[]>([]);\n const cursorRef = useRef(0);\n\n const removeItem = useCallback((id: string) => {\n setItems((prev) => prev.filter((item) => item.id !== id));\n }, []);\n\n const addIncoming = useCallback((message: DanmakuMessage) => {\n setItems((prev) => {\n const track = cursorRef.current % DANMAKU_TRACK_COUNT;\n const item: DanmakuOverlayItem = {\n ...message,\n track,\n durationMs: 8000 + Math.floor(Math.random() * 2800),\n };\n return [...prev.slice(-40), item];\n });\n cursorRef.current += 1;\n }, []);\n\n const send = useCallback(\n (text: string, color?: string, sendOptions?: SendDanmakuOptions): DanmakuSendResult | null => {\n const trimmed = text.trim();\n if (!trimmed) {\n return null;\n }\n\n const { content, launchKind } = parseCommand(trimmed);\n const safeText = content.slice(0, DANMAKU_MAX_LENGTH);\n if (!safeText) {\n return null;\n }\n\n const message: DanmakuMessage = {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n text: safeText,\n color,\n timestamp: Date.now(),\n };\n\n const optimistic = sendOptions?.optimistic ?? true;\n if (optimistic) {\n addIncoming(message);\n }\n\n options?.onSend?.(message);\n\n return {\n message,\n launchKind,\n };\n },\n [addIncoming, options]\n );\n\n return useMemo(\n () => ({\n items,\n send,\n addIncoming,\n removeItem,\n }),\n [addIncoming, items, removeItem, send]\n );\n}\n\nfunction parseCommand(text: string): { content: string; launchKind?: FireworkKind } {\n if (text.startsWith('/miku ')) {\n return { launchKind: 'miku', content: text.replace('/miku ', '').trim() };\n }\n if (text === '/miku') {\n return { launchKind: 'miku', content: 'MIKU!' };\n }\n if (text.startsWith('/avatar ')) {\n return { launchKind: 'avatar', content: text.replace('/avatar ', '').trim() };\n }\n if (text === '/avatar') {\n return { launchKind: 'avatar', content: 'Avatar Firework!' };\n }\n if (text.startsWith('/normal ')) {\n return { launchKind: 'normal', content: text.replace('/normal ', '').trim() };\n }\n if (text === '/normal') {\n return { launchKind: 'normal', content: 'Fireworks!' };\n }\n return { content: text };\n}\n","import * as THREE from 'three';\n\nexport function createCircularSpriteTexture(): THREE.CanvasTexture {\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return new THREE.CanvasTexture(canvas);\n }\n\n const center = size / 2;\n const gradient = ctx.createRadialGradient(center, center, 2, center, center, center);\n gradient.addColorStop(0, 'rgba(255,255,255,1)');\n gradient.addColorStop(0.4, 'rgba(255,255,255,0.9)');\n gradient.addColorStop(1, 'rgba(255,255,255,0)');\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, size, size);\n\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n}\n","import { MIKU_PALETTE, NORMAL_PALETTE } from '../constants';\nimport type { FireworkKind } from '../types';\n\nexport function pickPalette(kind: FireworkKind): string[] {\n if (kind === 'miku') {\n return MIKU_PALETTE;\n }\n return NORMAL_PALETTE;\n}\n\nexport function pickRandomColor(colors: string[]): string {\n if (colors.length === 0) {\n return '#ffffff';\n }\n const index = Math.floor(Math.random() * colors.length);\n return colors[index] || '#ffffff';\n}\n","export async function sampleAvatarPoints(\n avatarUrl: string,\n sampleStep = 4,\n maxPoints = 500\n): Promise<Array<{ x: number; y: number; brightness: number }>> {\n const image = await loadImage(avatarUrl);\n const size = 64;\n const canvas = document.createElement('canvas');\n canvas.width = size;\n canvas.height = size;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n return [];\n }\n\n ctx.clearRect(0, 0, size, size);\n ctx.drawImage(image, 0, 0, size, size);\n\n const { data } = ctx.getImageData(0, 0, size, size);\n const points: Array<{ x: number; y: number; brightness: number }> = [];\n\n for (let y = 0; y < size; y += sampleStep) {\n for (let x = 0; x < size; x += sampleStep) {\n const index = (y * size + x) * 4;\n const alpha = data[index + 3] ?? 0;\n if (alpha < 24) {\n continue;\n }\n const r = data[index] ?? 0;\n const g = data[index + 1] ?? 0;\n const b = data[index + 2] ?? 0;\n const brightness = (r + g + b) / (3 * 255);\n points.push({ x: x - size / 2, y: size / 2 - y, brightness });\n if (points.length >= maxPoints) {\n return points;\n }\n }\n }\n\n return points;\n}\n\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new window.Image();\n image.crossOrigin = 'anonymous';\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error('Failed to load avatar image.'));\n image.src = url;\n });\n}\n","import { sampleAvatarPoints } from '../../utils/avatarSprite';\nimport type { SeedParticle } from './normal';\n\nexport async function createAvatarSeeds(avatarUrl: string, fallbackColor: string): Promise<SeedParticle[]> {\n const points = await sampleAvatarPoints(avatarUrl);\n\n if (points.length === 0) {\n return [];\n }\n\n return points.map((point) => {\n const spread = 0.22;\n return {\n x: 0,\n y: 0,\n z: 0,\n vx: point.x * spread + (Math.random() - 0.5) * 2.4,\n vy: point.y * spread + Math.random() * 2.2,\n vz: (Math.random() - 0.5) * 3.5,\n life: 1.1 + point.brightness * 1.6,\n color: fallbackColor,\n };\n });\n}\n","import { MIKU_PALETTE } from '../../constants';\nimport { pickRandomColor } from '../../utils/colorPalettes';\nimport type { SeedParticle } from './normal';\n\nexport function createMikuSeeds(count: number): SeedParticle[] {\n const seeds: SeedParticle[] = [];\n\n for (let i = 0; i < count; i += 1) {\n const ratio = i / Math.max(count - 1, 1);\n const angle = ratio * Math.PI * 2 * 2;\n const radial = 7 + Math.random() * 9;\n\n const spiralBoost = 3 + Math.random() * 4;\n seeds.push({\n x: 0,\n y: 0,\n z: 0,\n vx: Math.cos(angle) * radial,\n vy: Math.sin(angle * 0.5) * spiralBoost + 7,\n vz: Math.sin(angle) * radial,\n life: 1.2 + Math.random() * 1.5,\n color: pickRandomColor(MIKU_PALETTE),\n });\n }\n\n return seeds;\n}\n","export interface SeedParticle {\n x: number;\n y: number;\n z: number;\n vx: number;\n vy: number;\n vz: number;\n life: number;\n color: string;\n}\n\nexport function createNormalSeeds(count: number, color: string): SeedParticle[] {\n const seeds: SeedParticle[] = [];\n for (let i = 0; i < count; i += 1) {\n const theta = Math.random() * Math.PI * 2;\n const phi = Math.acos(2 * Math.random() - 1);\n const speed = 8 + Math.random() * 12;\n seeds.push({\n x: 0,\n y: 0,\n z: 0,\n vx: speed * Math.sin(phi) * Math.cos(theta),\n vy: speed * Math.cos(phi),\n vz: speed * Math.sin(phi) * Math.sin(theta),\n life: 1 + Math.random() * 1.6,\n color,\n });\n }\n return seeds;\n}\n","import type { FireworkKind } from '../types';\nimport { pickPalette, pickRandomColor } from '../utils/colorPalettes';\nimport { createAvatarSeeds } from './patterns/avatar';\nimport { createMikuSeeds } from './patterns/miku';\nimport { createNormalSeeds, type SeedParticle } from './patterns/normal';\n\ninterface EmitOptions {\n kind: FireworkKind;\n count: number;\n color?: string;\n avatarUrl?: string;\n}\n\nexport async function createSeedParticles(options: EmitOptions): Promise<SeedParticle[]> {\n const palette = pickPalette(options.kind);\n const color = options.color ?? pickRandomColor(palette);\n\n if (options.kind === 'miku') {\n return createMikuSeeds(options.count);\n }\n\n if (options.kind === 'avatar' && options.avatarUrl) {\n const avatarSeeds = await createAvatarSeeds(options.avatarUrl, color);\n if (avatarSeeds.length > 0) {\n return avatarSeeds;\n }\n }\n\n return createNormalSeeds(options.count, color);\n}\n","export interface ParticleState {\n x: number;\n y: number;\n z: number;\n vx: number;\n vy: number;\n vz: number;\n life: number;\n maxLife: number;\n r: number;\n g: number;\n b: number;\n}\n\nexport class ParticlePool {\n private readonly pool: ParticleState[] = [];\n\n acquire(): ParticleState {\n const reused = this.pool.pop();\n if (reused) {\n return reused;\n }\n return {\n x: 0,\n y: 0,\n z: 0,\n vx: 0,\n vy: 0,\n vz: 0,\n life: 0,\n maxLife: 1,\n r: 1,\n g: 1,\n b: 1,\n };\n }\n\n release(particle: ParticleState): void {\n this.pool.push(particle);\n }\n}\n","export interface EngineDegradePolicy {\n shouldDegrade: boolean;\n recommendedParticleScale: number;\n}\n\nexport function evaluateDegradePolicy(fps: number): EngineDegradePolicy {\n if (fps < 24) {\n return { shouldDegrade: true, recommendedParticleScale: 0.65 };\n }\n if (fps < 34) {\n return { shouldDegrade: true, recommendedParticleScale: 0.82 };\n }\n return { shouldDegrade: false, recommendedParticleScale: 1 };\n}\n","import * as THREE from 'three';\nimport { DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES } from '../constants';\nimport type { FireworkEngineOptions, FireworkLaunchPayload } from '../types';\nimport { createCircularSpriteTexture } from '../utils/textureFactory';\nimport { createSeedParticles } from './emitters';\nimport { ParticlePool, type ParticleState } from './particlePool';\nimport { evaluateDegradePolicy } from './postfx';\n\ninterface Burst {\n id: string;\n points: THREE.Points;\n geometry: THREE.BufferGeometry;\n material: THREE.PointsMaterial;\n positions: Float32Array;\n colors: Float32Array;\n particles: ParticleState[];\n}\n\ninterface FireworksEngineInit {\n canvas: HTMLCanvasElement;\n container: HTMLElement;\n options?: FireworkEngineOptions;\n}\n\nexport class FireworksEngine {\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private renderer: THREE.WebGLRenderer;\n private readonly canvas: HTMLCanvasElement;\n private readonly container: HTMLElement;\n private readonly pool = new ParticlePool();\n private readonly bursts: Burst[] = [];\n private readonly maxParticles: number;\n private readonly maxActiveFireworks: number;\n private readonly onError?: (error: Error) => void;\n private readonly onFpsReport?: (fps: number) => void;\n\n private animationFrameId: number | null = null;\n private lastTick = 0;\n private fpsWindow = { frames: 0, elapsed: 0, fps: 60, particleScale: 1 };\n\n private resizeObserver: ResizeObserver | null = null;\n private spriteTexture: THREE.Texture;\n\n constructor(init: FireworksEngineInit) {\n this.canvas = init.canvas;\n this.container = init.container;\n this.maxParticles = init.options?.maxParticles ?? DEFAULT_MAX_PARTICLES;\n this.maxActiveFireworks = init.options?.maxActiveFireworks ?? DEFAULT_MAX_ACTIVE_FIREWORKS;\n this.onError = init.options?.onError;\n this.onFpsReport = init.options?.onFpsReport;\n\n this.scene = new THREE.Scene();\n this.scene.background = new THREE.Color('#060816');\n\n this.camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n this.camera.position.set(0, 0, 45);\n\n this.renderer = new THREE.WebGLRenderer({\n canvas: this.canvas,\n alpha: true,\n antialias: true,\n powerPreference: 'high-performance',\n });\n this.renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 2));\n\n this.spriteTexture = createCircularSpriteTexture();\n\n this.attachResizeObserver();\n this.resize();\n }\n\n start(): void {\n if (this.animationFrameId != null) {\n return;\n }\n this.lastTick = window.performance.now();\n this.loop();\n }\n\n stop(): void {\n if (this.animationFrameId != null) {\n window.cancelAnimationFrame(this.animationFrameId);\n this.animationFrameId = null;\n }\n }\n\n async launch(payload: FireworkLaunchPayload): Promise<void> {\n try {\n this.enforceBurstCap();\n\n const particleBudget = Math.max(80, Math.floor(280 * this.fpsWindow.particleScale));\n const seeds = await createSeedParticles({\n kind: payload.kind,\n count: particleBudget,\n color: payload.color,\n avatarUrl: payload.avatarUrl,\n });\n\n if (seeds.length === 0) {\n return;\n }\n\n const launchPosition = payload.position ?? {\n x: (Math.random() - 0.5) * 18,\n y: -4 + Math.random() * 12,\n z: (Math.random() - 0.5) * 4,\n };\n\n const particles: ParticleState[] = [];\n const positions = new Float32Array(seeds.length * 3);\n const colors = new Float32Array(seeds.length * 3);\n\n const colorHelper = new THREE.Color();\n for (let i = 0; i < seeds.length; i += 1) {\n const seed = seeds[i];\n if (!seed) {\n continue;\n }\n const particle = this.pool.acquire();\n particle.x = launchPosition.x + seed.x;\n particle.y = launchPosition.y + seed.y;\n particle.z = launchPosition.z + seed.z;\n particle.vx = seed.vx;\n particle.vy = seed.vy;\n particle.vz = seed.vz;\n particle.life = seed.life;\n particle.maxLife = seed.life;\n\n colorHelper.set(seed.color);\n particle.r = colorHelper.r;\n particle.g = colorHelper.g;\n particle.b = colorHelper.b;\n\n particles.push(particle);\n\n const offset = i * 3;\n positions[offset] = particle.x;\n positions[offset + 1] = particle.y;\n positions[offset + 2] = particle.z;\n colors[offset] = particle.r;\n colors[offset + 1] = particle.g;\n colors[offset + 2] = particle.b;\n }\n\n if (this.totalParticleCount() + particles.length > this.maxParticles) {\n this.releaseParticles(particles);\n return;\n }\n\n const geometry = new THREE.BufferGeometry();\n geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n\n const material = new THREE.PointsMaterial({\n size: payload.kind === 'miku' ? 0.42 : 0.36,\n vertexColors: true,\n map: this.spriteTexture,\n transparent: true,\n opacity: 1,\n depthWrite: false,\n blending: THREE.AdditiveBlending,\n });\n\n const points = new THREE.Points(geometry, material);\n this.scene.add(points);\n\n const burst: Burst = {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n points,\n geometry,\n material,\n positions,\n colors,\n particles,\n };\n\n this.bursts.push(burst);\n } catch (error) {\n this.onError?.(error instanceof Error ? error : new Error('Failed to launch firework.'));\n }\n }\n\n dispose(): void {\n this.stop();\n\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n this.resizeObserver = null;\n }\n\n for (const burst of this.bursts) {\n this.destroyBurst(burst);\n }\n this.bursts.length = 0;\n\n this.spriteTexture.dispose();\n this.renderer.dispose();\n }\n\n private loop = (): void => {\n const now = window.performance.now();\n const dt = Math.min((now - this.lastTick) / 1000, 0.05);\n this.lastTick = now;\n\n this.update(dt);\n this.renderer.render(this.scene, this.camera);\n\n this.animationFrameId = window.requestAnimationFrame(this.loop);\n };\n\n private update(dt: number): void {\n const gravity = -8.8;\n\n for (let b = this.bursts.length - 1; b >= 0; b -= 1) {\n const burst = this.bursts[b];\n if (!burst) {\n continue;\n }\n\n let alive = 0;\n for (let i = 0; i < burst.particles.length; i += 1) {\n const particle = burst.particles[i];\n if (!particle) {\n continue;\n }\n\n particle.life -= dt;\n if (particle.life <= 0) {\n continue;\n }\n\n particle.vx *= 0.992;\n particle.vy = particle.vy * 0.992 + gravity * dt;\n particle.vz *= 0.992;\n\n particle.x += particle.vx * dt;\n particle.y += particle.vy * dt;\n particle.z += particle.vz * dt;\n\n const idx = i * 3;\n burst.positions[idx] = particle.x;\n burst.positions[idx + 1] = particle.y;\n burst.positions[idx + 2] = particle.z;\n\n const alpha = Math.max(particle.life / particle.maxLife, 0);\n burst.colors[idx] = particle.r * alpha;\n burst.colors[idx + 1] = particle.g * alpha;\n burst.colors[idx + 2] = particle.b * alpha;\n\n alive += 1;\n }\n\n const positionAttr = burst.geometry.getAttribute('position') as THREE.BufferAttribute;\n const colorAttr = burst.geometry.getAttribute('color') as THREE.BufferAttribute;\n positionAttr.needsUpdate = true;\n colorAttr.needsUpdate = true;\n\n burst.material.opacity = Math.min(1, 0.22 + alive / Math.max(burst.particles.length, 1));\n\n if (alive === 0) {\n this.bursts.splice(b, 1);\n this.destroyBurst(burst);\n }\n }\n\n this.updateFpsStats(dt);\n }\n\n private updateFpsStats(dt: number): void {\n this.fpsWindow.frames += 1;\n this.fpsWindow.elapsed += dt;\n\n if (this.fpsWindow.elapsed < 0.6) {\n return;\n }\n\n const fps = this.fpsWindow.frames / this.fpsWindow.elapsed;\n this.fpsWindow.fps = fps;\n\n const policy = evaluateDegradePolicy(fps);\n this.fpsWindow.particleScale = policy.recommendedParticleScale;\n\n this.onFpsReport?.(Math.round(fps));\n\n this.fpsWindow.frames = 0;\n this.fpsWindow.elapsed = 0;\n }\n\n private totalParticleCount(): number {\n return this.bursts.reduce((sum, burst) => sum + burst.particles.length, 0);\n }\n\n private enforceBurstCap(): void {\n while (this.bursts.length >= this.maxActiveFireworks) {\n const burst = this.bursts.shift();\n if (!burst) {\n break;\n }\n this.destroyBurst(burst);\n }\n }\n\n private destroyBurst(burst: Burst): void {\n this.scene.remove(burst.points);\n burst.geometry.dispose();\n burst.material.dispose();\n this.releaseParticles(burst.particles);\n }\n\n private releaseParticles(particles: ParticleState[]): void {\n for (const particle of particles) {\n this.pool.release(particle);\n }\n }\n\n private attachResizeObserver(): void {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.container);\n }\n\n private resize(): void {\n const width = Math.max(1, this.container.clientWidth);\n const height = Math.max(1, this.container.clientHeight);\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(width, height, false);\n }\n}\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { FireworksEngine } from '../engine/FireworksEngine';\nimport type { FireworkEngineOptions, FireworkLaunchPayload } from '../types';\n\nexport interface UseFireworksEngineOptions extends FireworkEngineOptions {\n onLaunch?: (payload: FireworkLaunchPayload) => void;\n}\n\nexport function useFireworksEngine(options?: UseFireworksEngineOptions) {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const engineRef = useRef<FireworksEngine | null>(null);\n const pendingLaunchesRef = useRef<FireworkLaunchPayload[]>([]);\n const [fps, setFps] = useState(60);\n const [engineReady, setEngineReady] = useState(false);\n const [pendingLaunchCount, setPendingLaunchCount] = useState(0);\n const { maxParticles, maxActiveFireworks, onError, onFpsReport, onLaunch } = options || {};\n\n useEffect(() => {\n if (!containerRef.current || !canvasRef.current) {\n return;\n }\n\n const engine = new FireworksEngine({\n container: containerRef.current,\n canvas: canvasRef.current,\n options: {\n maxParticles,\n maxActiveFireworks,\n onError,\n onFpsReport: (nextFps) => {\n setFps(nextFps);\n onFpsReport?.(nextFps);\n },\n },\n });\n\n engine.start();\n engineRef.current = engine;\n setEngineReady(true);\n if (pendingLaunchesRef.current.length > 0) {\n const pending = [...pendingLaunchesRef.current];\n pendingLaunchesRef.current = [];\n setPendingLaunchCount(0);\n pending.forEach((payload) => {\n void engine.launch(payload);\n });\n }\n\n return () => {\n engineRef.current?.dispose();\n engineRef.current = null;\n pendingLaunchesRef.current = [];\n setPendingLaunchCount(0);\n setEngineReady(false);\n };\n }, [maxParticles, maxActiveFireworks, onError, onFpsReport]);\n\n const launch = useCallback(\n (payload: FireworkLaunchPayload) => {\n if (!engineRef.current) {\n pendingLaunchesRef.current.push(payload);\n if (pendingLaunchesRef.current.length > 120) {\n pendingLaunchesRef.current.splice(0, pendingLaunchesRef.current.length - 120);\n }\n setPendingLaunchCount(pendingLaunchesRef.current.length);\n } else {\n void engineRef.current.launch(payload);\n }\n onLaunch?.(payload);\n },\n [onLaunch]\n );\n\n const api = useMemo(\n () => ({\n containerRef,\n canvasRef,\n launch,\n fps,\n engineReady,\n pendingLaunchCount,\n }),\n [engineReady, fps, launch, pendingLaunchCount]\n );\n\n return api;\n}\n","import type {\n FireworkKind,\n FireworkLaunchPayload,\n FireworksRealtimeConfig,\n FireworksRealtimeState,\n FireworksRealtimeUser,\n} from '../types';\n\ninterface RealtimeDanmakuEvent {\n id: string;\n roomId: string;\n text: string;\n color?: string;\n kind?: FireworkKind;\n user: FireworksRealtimeUser;\n timestamp: number;\n}\n\ninterface RealtimeFireworkEvent {\n id: string;\n roomId: string;\n payload: FireworkLaunchPayload;\n user: FireworksRealtimeUser;\n timestamp: number;\n}\n\ntype ClientMessage =\n | {\n type: 'join';\n roomId: string;\n user: FireworksRealtimeUser;\n }\n | {\n type: 'leave';\n }\n | {\n type: 'danmaku.send';\n payload: {\n text: string;\n color?: string;\n kind?: FireworkKind;\n };\n }\n | {\n type: 'firework.launch';\n payload: FireworkLaunchPayload;\n };\n\ntype ServerMessage =\n | {\n type: 'joined';\n roomId: string;\n onlineCount: number;\n self: FireworksRealtimeUser;\n }\n | {\n type: 'room.snapshot';\n roomId: string;\n users: FireworksRealtimeUser[];\n danmakuHistory: RealtimeDanmakuEvent[];\n fireworkHistory: RealtimeFireworkEvent[];\n }\n | {\n type: 'room.user_joined';\n roomId: string;\n user: FireworksRealtimeUser;\n onlineCount: number;\n }\n | {\n type: 'room.user_left';\n roomId: string;\n userId: string;\n onlineCount: number;\n }\n | {\n type: 'danmaku.broadcast';\n roomId: string;\n event: RealtimeDanmakuEvent;\n }\n | {\n type: 'firework.broadcast';\n roomId: string;\n event: RealtimeFireworkEvent;\n }\n | {\n type: 'error';\n code: string;\n message: string;\n }\n | {\n type: 'pong';\n ts: number;\n };\n\nexport interface WebSocketTransportCallbacks {\n onStateChange?: (state: FireworksRealtimeState) => void;\n onDanmakuBroadcast?: (event: RealtimeDanmakuEvent) => void;\n onFireworkBroadcast?: (event: RealtimeFireworkEvent) => void;\n onSnapshot?: (snapshot: Extract<ServerMessage, { type: 'room.snapshot' }>) => void;\n onError?: (error: Error) => void;\n}\n\nexport class WebSocketTransport {\n private socket: WebSocket | null = null;\n private reconnectTimer: number | null = null;\n private isManualClose = false;\n private readonly pendingQueue: ClientMessage[] = [];\n private readonly config: FireworksRealtimeConfig;\n private readonly callbacks: WebSocketTransportCallbacks;\n private state: FireworksRealtimeState;\n\n constructor(config: FireworksRealtimeConfig, callbacks?: WebSocketTransportCallbacks) {\n this.config = config;\n this.callbacks = callbacks || {};\n this.state = {\n connected: false,\n joined: false,\n onlineCount: 0,\n roomId: config.roomId,\n };\n }\n\n connect(): void {\n if (this.socket && (this.socket.readyState === window.WebSocket.OPEN || this.socket.readyState === window.WebSocket.CONNECTING)) {\n return;\n }\n\n this.isManualClose = false;\n\n try {\n this.socket = this.config.protocols\n ? new window.WebSocket(this.config.serverUrl, this.config.protocols)\n : new window.WebSocket(this.config.serverUrl);\n this.socket.binaryType = 'arraybuffer';\n } catch {\n this.callbacks.onError?.(new Error('Failed to create WebSocket connection.'));\n return;\n }\n\n this.socket.onopen = () => {\n this.updateState({ connected: true, joined: false });\n this.send({\n type: 'join',\n roomId: this.config.roomId,\n user: this.config.user,\n });\n };\n\n this.socket.onmessage = (event) => {\n const parsed = parseServerMessage(event.data);\n if (!parsed) {\n return;\n }\n this.handleServerMessage(parsed);\n };\n\n this.socket.onerror = () => {\n this.callbacks.onError?.(new Error('WebSocket transport error.'));\n };\n\n this.socket.onclose = () => {\n this.updateState({ connected: false, joined: false });\n this.scheduleReconnect();\n };\n }\n\n disconnect(): void {\n this.isManualClose = true;\n this.pendingQueue.length = 0;\n if (this.reconnectTimer != null) {\n window.clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (!this.socket) {\n return;\n }\n\n this.send({ type: 'leave' });\n this.socket.close();\n this.socket = null;\n }\n\n sendDanmaku(payload: { text: string; color?: string; kind?: FireworkKind }): void {\n this.send({\n type: 'danmaku.send',\n payload,\n });\n }\n\n sendFirework(payload: FireworkLaunchPayload): void {\n this.send({\n type: 'firework.launch',\n payload,\n });\n }\n\n getState(): FireworksRealtimeState {\n return this.state;\n }\n\n private send(message: ClientMessage): void {\n if (!this.socket || this.socket.readyState !== window.WebSocket.OPEN) {\n if (message.type === 'danmaku.send' || message.type === 'firework.launch') {\n this.pendingQueue.push(message);\n }\n return;\n }\n\n if ((message.type === 'danmaku.send' || message.type === 'firework.launch') && !this.state.joined) {\n this.pendingQueue.push(message);\n return;\n }\n\n this.socket.send(JSON.stringify(message));\n }\n\n private updateState(partial: Partial<FireworksRealtimeState>): void {\n this.state = {\n ...this.state,\n ...partial,\n };\n this.callbacks.onStateChange?.(this.state);\n }\n\n private handleServerMessage(message: ServerMessage): void {\n if (message.type === 'joined') {\n this.updateState({ roomId: message.roomId, onlineCount: message.onlineCount, joined: true });\n this.flushPendingQueue();\n return;\n }\n\n if (message.type === 'room.user_joined' || message.type === 'room.user_left') {\n this.updateState({ onlineCount: message.onlineCount, roomId: message.roomId, joined: true });\n this.flushPendingQueue();\n return;\n }\n\n if (message.type === 'room.snapshot') {\n this.updateState({ roomId: message.roomId, onlineCount: message.users.length, joined: true });\n this.flushPendingQueue();\n this.callbacks.onSnapshot?.(message);\n return;\n }\n\n if (message.type === 'danmaku.broadcast') {\n if (!this.state.joined) {\n this.updateState({ joined: true, roomId: message.roomId });\n this.flushPendingQueue();\n }\n this.callbacks.onDanmakuBroadcast?.(message.event);\n return;\n }\n\n if (message.type === 'firework.broadcast') {\n if (!this.state.joined) {\n this.updateState({ joined: true, roomId: message.roomId });\n this.flushPendingQueue();\n }\n this.callbacks.onFireworkBroadcast?.(message.event);\n return;\n }\n\n if (message.type === 'error') {\n this.callbacks.onError?.(new Error(`${message.code}: ${message.message}`));\n }\n }\n\n private scheduleReconnect(): void {\n const reconnect = this.config.reconnect ?? true;\n if (this.isManualClose || !reconnect) {\n return;\n }\n\n if (this.reconnectTimer != null) {\n return;\n }\n\n const delay = this.config.reconnectIntervalMs ?? 1500;\n this.reconnectTimer = window.setTimeout(() => {\n this.reconnectTimer = null;\n this.connect();\n }, delay);\n }\n\n private flushPendingQueue(): void {\n if (!this.socket || this.socket.readyState !== window.WebSocket.OPEN || !this.state.joined) {\n return;\n }\n\n while (this.pendingQueue.length > 0) {\n const message = this.pendingQueue.shift();\n if (!message) {\n break;\n }\n this.socket.send(JSON.stringify(message));\n }\n }\n}\n\nfunction parseServerMessage(raw: unknown): ServerMessage | null {\n const text = decodeMessage(raw);\n if (!text) {\n return null;\n }\n\n try {\n return JSON.parse(text) as ServerMessage;\n } catch {\n return null;\n }\n}\n\nfunction decodeMessage(raw: unknown): string | null {\n if (typeof raw === 'string') {\n return raw;\n }\n\n if (raw instanceof ArrayBuffer) {\n return new TextDecoder().decode(new Uint8Array(raw));\n }\n\n if (ArrayBuffer.isView(raw)) {\n return new TextDecoder().decode(raw);\n }\n\n return null;\n}\n","'use client';\n\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { WebSocketTransport } from '../client/WebSocketTransport';\nimport type {\n FireworkLaunchPayload,\n FireworksRealtimeConfig,\n FireworksRealtimeState,\n FireworkKind,\n} from '../types';\n\ninterface UseFireworksRealtimeOptions {\n config?: FireworksRealtimeConfig;\n enabled?: boolean;\n onDanmakuBroadcast?: (event: {\n text: string;\n color?: string;\n kind?: FireworkKind;\n userId: string;\n timestamp: number;\n id: string;\n }) => void;\n onFireworkBroadcast?: (event: {\n id: string;\n payload: FireworkLaunchPayload;\n userId: string;\n timestamp: number;\n }) => void;\n onSnapshot?: (snapshot: {\n roomId: string;\n danmakuHistory: Array<{\n id: string;\n text: string;\n color?: string;\n kind?: FireworkKind;\n userId: string;\n timestamp: number;\n }>;\n fireworkHistory: Array<{\n id: string;\n payload: FireworkLaunchPayload;\n userId: string;\n timestamp: number;\n }>;\n }) => void;\n onError?: (error: Error) => void;\n onStateChange?: (state: FireworksRealtimeState) => void;\n}\n\nexport function useFireworksRealtime(options: UseFireworksRealtimeOptions) {\n const { config, enabled, onDanmakuBroadcast, onFireworkBroadcast, onSnapshot, onError, onStateChange } = options;\n const transportRef = useRef<WebSocketTransport | null>(null);\n const callbackRef = useRef({\n onDanmakuBroadcast,\n onFireworkBroadcast,\n onSnapshot,\n onError,\n onStateChange,\n });\n const serverUrl = config?.serverUrl ?? '';\n const roomId = config?.roomId ?? '';\n const userId = config?.user.userId ?? '';\n const nickname = config?.user.nickname ?? '';\n const avatarUrl = config?.user.avatarUrl ?? '';\n const reconnect = config?.reconnect ?? true;\n const reconnectIntervalMs = config?.reconnectIntervalMs ?? 1500;\n const [state, setState] = useState<FireworksRealtimeState>({\n connected: false,\n joined: false,\n onlineCount: 0,\n roomId,\n });\n\n useEffect(() => {\n callbackRef.current = {\n onDanmakuBroadcast,\n onFireworkBroadcast,\n onSnapshot,\n onError,\n onStateChange,\n };\n }, [onDanmakuBroadcast, onError, onFireworkBroadcast, onSnapshot, onStateChange]);\n\n const normalizedConfig = useMemo(() => {\n if (!serverUrl || !roomId || !userId) {\n return undefined;\n }\n const protocols = Array.isArray(config?.protocols)\n ? [...config.protocols]\n : config?.protocols;\n\n return {\n serverUrl,\n roomId,\n user: {\n userId,\n nickname: nickname || undefined,\n avatarUrl: avatarUrl || undefined,\n },\n protocols,\n reconnect,\n reconnectIntervalMs,\n } satisfies FireworksRealtimeConfig;\n }, [avatarUrl, config?.protocols, nickname, reconnect, reconnectIntervalMs, roomId, serverUrl, userId]);\n\n useEffect(() => {\n if (!enabled || !normalizedConfig) {\n transportRef.current?.disconnect();\n transportRef.current = null;\n setState({\n connected: false,\n joined: false,\n onlineCount: 0,\n roomId: normalizedConfig?.roomId,\n });\n return;\n }\n\n const transport = new WebSocketTransport(normalizedConfig, {\n onStateChange: (nextState) => {\n setState(nextState);\n callbackRef.current.onStateChange?.(nextState);\n },\n onDanmakuBroadcast: (event) => {\n callbackRef.current.onDanmakuBroadcast?.({\n id: event.id,\n text: event.text,\n color: event.color,\n kind: event.kind,\n userId: event.user.userId,\n timestamp: event.timestamp,\n });\n },\n onFireworkBroadcast: (event) => {\n callbackRef.current.onFireworkBroadcast?.({\n id: event.id,\n payload: event.payload,\n userId: event.user.userId,\n timestamp: event.timestamp,\n });\n },\n onSnapshot: (snapshot) => {\n callbackRef.current.onSnapshot?.({\n roomId: snapshot.roomId,\n danmakuHistory: snapshot.danmakuHistory.map((item) => ({\n id: item.id,\n text: item.text,\n color: item.color,\n kind: item.kind,\n userId: item.user.userId,\n timestamp: item.timestamp,\n })),\n fireworkHistory: snapshot.fireworkHistory.map((item) => ({\n id: item.id,\n payload: item.payload,\n userId: item.user.userId,\n timestamp: item.timestamp,\n })),\n });\n },\n onError: (error) => {\n callbackRef.current.onError?.(error);\n },\n });\n\n transport.connect();\n transportRef.current = transport;\n\n return () => {\n transport.disconnect();\n if (transportRef.current === transport) {\n transportRef.current = null;\n }\n };\n }, [enabled, normalizedConfig]);\n\n return useMemo(\n () => ({\n state,\n sendDanmaku: (payload: { text: string; color?: string; kind?: FireworkKind }) => {\n transportRef.current?.sendDanmaku(payload);\n },\n sendFirework: (payload: FireworkLaunchPayload) => {\n transportRef.current?.sendFirework(payload);\n },\n }),\n [state]\n );\n}\n","'use client';\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport { DanmakuPanel } from './DanmakuPanel';\nimport { FireworksCanvas } from './FireworksCanvas';\nimport { FireworksControlPanel } from './FireworksControlPanel';\nimport { useDanmakuController } from '../hooks/useDanmakuController';\nimport { useFireworksEngine } from '../hooks/useFireworksEngine';\nimport { useFireworksRealtime } from '../hooks/useFireworksRealtime';\nimport type { FireworkKind, MikuFireworks3DProps } from '../types';\n\nexport function MikuFireworks3D({\n width = '100%',\n height = 520,\n className,\n defaultKind = 'normal',\n autoLaunchOnDanmaku = true,\n maxParticles,\n maxActiveFireworks,\n defaultAvatarUrl = '',\n onLaunch,\n onDanmakuSend,\n onError,\n onFpsReport,\n onRealtimeStateChange,\n realtime,\n}: MikuFireworks3DProps) {\n const [selectedKind, setSelectedKind] = useState<FireworkKind>(defaultKind);\n const [avatarUrl, setAvatarUrl] = useState(defaultAvatarUrl);\n const [autoLaunch, setAutoLaunch] = useState(autoLaunchOnDanmaku);\n const seenDanmakuIdsRef = useRef<Set<string>>(new Set());\n const seenFireworkIdsRef = useRef<Set<string>>(new Set());\n\n const {\n containerRef,\n canvasRef,\n launch,\n fps,\n engineReady,\n pendingLaunchCount,\n } = useFireworksEngine({\n maxParticles,\n maxActiveFireworks,\n onLaunch,\n onError,\n onFpsReport,\n });\n\n const { items, send, addIncoming, removeItem } = useDanmakuController({\n onSend: onDanmakuSend,\n });\n\n const realtimeEnabled = Boolean(realtime && (realtime.enabled ?? true));\n\n const logSync = (phase: string, eventId: string, extra?: Record<string, unknown>) => {\n const payload = {\n phase,\n eventId,\n engineReady,\n pendingLaunchCount,\n connected: realtimeApi.state.connected,\n joined: realtimeApi.state.joined,\n ...extra,\n };\n globalThis.console?.log('[MikuFireworks3D][sync_event]', payload);\n };\n\n const realtimeApi = useFireworksRealtime({\n enabled: realtimeEnabled,\n config: realtime,\n onStateChange: onRealtimeStateChange,\n onError,\n onDanmakuBroadcast: (event) => {\n if (seenDanmakuIdsRef.current.has(event.id)) {\n return;\n }\n seenDanmakuIdsRef.current.add(event.id);\n addIncoming({\n id: event.id,\n userId: event.userId,\n text: event.text,\n color: event.color,\n timestamp: event.timestamp,\n });\n },\n onFireworkBroadcast: (event) => {\n logSync('firework.broadcast.received', event.id, { kind: event.payload.kind });\n if (seenFireworkIdsRef.current.has(event.id)) {\n logSync('firework.broadcast.deduped', event.id);\n return;\n }\n seenFireworkIdsRef.current.add(event.id);\n launch(event.payload);\n logSync('firework.broadcast.dispatched', event.id, { kind: event.payload.kind });\n },\n onSnapshot: (snapshot) => {\n for (const danmaku of snapshot.danmakuHistory) {\n if (seenDanmakuIdsRef.current.has(danmaku.id)) {\n continue;\n }\n seenDanmakuIdsRef.current.add(danmaku.id);\n addIncoming({\n id: danmaku.id,\n userId: danmaku.userId,\n text: danmaku.text,\n color: danmaku.color,\n timestamp: danmaku.timestamp,\n });\n }\n for (const firework of snapshot.fireworkHistory) {\n logSync('firework.snapshot.received', firework.id, { kind: firework.payload.kind });\n if (seenFireworkIdsRef.current.has(firework.id)) {\n logSync('firework.snapshot.deduped', firework.id);\n continue;\n }\n seenFireworkIdsRef.current.add(firework.id);\n launch(firework.payload);\n logSync('firework.snapshot.dispatched', firework.id, { kind: firework.payload.kind });\n }\n },\n });\n\n const handleLaunch = (kind: FireworkKind) => {\n const payload = {\n kind,\n avatarUrl: kind === 'avatar' ? avatarUrl || undefined : undefined,\n };\n\n if (realtimeEnabled) {\n realtimeApi.sendFirework(payload);\n return;\n }\n\n launch(payload);\n };\n\n const handleSendDanmaku = (text: string) => {\n const result = send(text, undefined, {\n optimistic: !realtimeEnabled,\n });\n if (!result) {\n return;\n }\n\n const launchKind = result.launchKind ?? selectedKind;\n if (realtimeEnabled) {\n realtimeApi.sendDanmaku({\n text: result.message.text,\n color: result.message.color,\n kind: result.launchKind,\n });\n\n if (autoLaunch) {\n realtimeApi.sendFirework({\n kind: launchKind,\n avatarUrl: launchKind === 'avatar' ? avatarUrl || undefined : undefined,\n message: result.message,\n });\n }\n return;\n }\n\n if (autoLaunch || result.launchKind) {\n launch({\n kind: launchKind,\n avatarUrl: launchKind === 'avatar' ? avatarUrl || undefined : undefined,\n message: result.message,\n });\n }\n };\n\n const containerStyle = useMemo<React.CSSProperties>(\n () => ({\n width,\n height,\n minHeight: 360,\n }),\n [height, width]\n );\n\n return (\n <div className={`mx-auto flex w-full max-w-5xl flex-col gap-3 ${className || ''}`}>\n <div ref={containerRef} className=\"relative overflow-hidden rounded-2xl border border-slate-700\" style={containerStyle}>\n <FireworksCanvas canvasRef={canvasRef} />\n\n <div className=\"pointer-events-none absolute inset-0 overflow-hidden\">\n {items.map((item) => (\n <div\n key={item.id}\n onAnimationEnd={() => removeItem(item.id)}\n className=\"absolute right-[-30%] whitespace-nowrap text-sm font-semibold text-white drop-shadow\"\n style={{\n top: `${8 + item.track * 11}%`,\n color: item.color || '#ffffff',\n animation: `sa2kit-danmaku-move ${item.durationMs}ms linear forwards`,\n }}\n >\n {item.text}\n </div>\n ))}\n </div>\n </div>\n\n <FireworksControlPanel\n selectedKind={selectedKind}\n onKindChange={setSelectedKind}\n autoLaunchOnDanmaku={autoLaunch}\n onAutoLaunchChange={setAutoLaunch}\n avatarUrl={avatarUrl}\n onAvatarUrlChange={setAvatarUrl}\n onLaunch={() => handleLaunch(selectedKind)}\n fps={fps}\n realtimeConnected={realtimeEnabled ? realtimeApi.state.connected : undefined}\n onlineCount={realtimeEnabled ? realtimeApi.state.onlineCount : undefined}\n />\n\n <DanmakuPanel onSend={handleSendDanmaku} />\n\n <style>{`\\n @keyframes sa2kit-danmaku-move {\\n 0% {\\n transform: translateX(0);\\n opacity: 1;\\n }\\n 100% {\\n transform: translateX(-160vw);\\n opacity: 0.92;\\n }\\n }\\n `}</style>\n </div>\n );\n}\n","import type { RefObject } from 'react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n ScreenReceiverJoinedMessage,\n ScreenReceiverPeerLeftMessage,\n ScreenReceiverRoomStateMessage,\n} from './types';\n\nconst DEFAULT_STUN_SERVER: RTCIceServer = { urls: 'stun:stun.l.google.com:19302' };\n\nexport interface ScreenReceiverLogEntry {\n id: number;\n text: string;\n}\n\nexport interface UseScreenReceiverOptions {\n wsUrl: string;\n roomId: string;\n iceServers?: RTCIceServer[];\n maxLogs?: number;\n}\n\nexport interface UseScreenReceiverReturn {\n connect: () => Promise<void>;\n disconnect: () => void;\n clearLogs: () => void;\n logs: ScreenReceiverLogEntry[];\n isConnected: boolean;\n connectionState: RTCPeerConnectionState | 'idle';\n iceConnectionState: RTCIceConnectionState | 'idle';\n videoRef: RefObject<HTMLVideoElement>;\n stream: MediaStream | null;\n}\n\ntype PeerContext = {\n ws?: WebSocket;\n pc?: RTCPeerConnection;\n pendingCandidates: RTCIceCandidateInit[];\n selfPeerId?: string;\n publisherPeerId?: string;\n};\n\nfunction parseMessage(payload: MessageEvent['data']): Record<string, any> | null {\n try {\n if (typeof payload === 'string') return JSON.parse(payload);\n if (payload instanceof ArrayBuffer) return JSON.parse(new TextDecoder().decode(payload));\n return JSON.parse(String(payload));\n } catch {\n return null;\n }\n}\n\nexport function useScreenReceiver(options: UseScreenReceiverOptions): UseScreenReceiverReturn {\n const { wsUrl, roomId, iceServers = [DEFAULT_STUN_SERVER], maxLogs = 80 } = options;\n const [logs, setLogs] = useState<ScreenReceiverLogEntry[]>([]);\n const [isConnected, setIsConnected] = useState(false);\n const [connectionState, setConnectionState] = useState<RTCPeerConnectionState | 'idle'>('idle');\n const [iceConnectionState, setIceConnectionState] = useState<RTCIceConnectionState | 'idle'>('idle');\n const [stream, setStream] = useState<MediaStream | null>(null);\n const logIdRef = useRef(0);\n const peerRef = useRef<PeerContext>({ pendingCandidates: [] });\n const videoRef = useRef<HTMLVideoElement>(null);\n\n const appendLog = useCallback(\n (text: string) => {\n logIdRef.current += 1;\n setLogs((prev) => [...prev, { id: logIdRef.current, text }].slice(-maxLogs));\n },\n [maxLogs],\n );\n\n const disconnect = useCallback(() => {\n peerRef.current.ws?.close();\n peerRef.current.pc?.close();\n peerRef.current = { pendingCandidates: [] };\n setIsConnected(false);\n setConnectionState('idle');\n setIceConnectionState('idle');\n setStream(null);\n }, []);\n\n const connect = useCallback(async () => {\n disconnect();\n\n const normalizedWsUrl = wsUrl.trim();\n const normalizedRoomId = roomId.trim();\n if (!normalizedWsUrl) {\n appendLog('ws url is empty');\n return;\n }\n if (!normalizedRoomId) {\n appendLog('room id is empty');\n return;\n }\n\n appendLog(`connecting: ${normalizedWsUrl}`);\n\n let ws: WebSocket;\n try {\n ws = new WebSocket(normalizedWsUrl);\n } catch (error) {\n appendLog(`ws create error: ${String(error)}`);\n return;\n }\n\n const pc = new RTCPeerConnection({ iceServers });\n pc.addTransceiver('video', { direction: 'recvonly' });\n\n peerRef.current.ws = ws;\n peerRef.current.pc = pc;\n peerRef.current.pendingCandidates = [];\n\n ws.onopen = () => {\n appendLog('ws connected');\n setIsConnected(true);\n ws.send(JSON.stringify({ type: 'join', roomId: normalizedRoomId, role: 'viewer' }));\n };\n\n ws.onclose = () => {\n appendLog('ws closed');\n setIsConnected(false);\n };\n\n ws.onerror = (event) => {\n appendLog(`ws error: ${event.type}`);\n };\n\n ws.onmessage = async (event) => {\n const message = parseMessage(event.data);\n if (!message) {\n appendLog('ws message parse error');\n return;\n }\n\n if (message.type === 'joined') {\n const joined = message as ScreenReceiverJoinedMessage;\n peerRef.current.selfPeerId = joined.peerId;\n appendLog(`joined room ${joined.roomId} as ${joined.peerId}`);\n return;\n }\n\n if (message.type === 'room_state') {\n const roomState = message as ScreenReceiverRoomStateMessage;\n const broadcaster = roomState.peers.find((peer) => peer.role === 'broadcaster');\n if (broadcaster) {\n peerRef.current.publisherPeerId = broadcaster.peerId;\n appendLog(`broadcaster online: ${broadcaster.peerId}`);\n }\n return;\n }\n\n if (message.type === 'offer' && typeof message.sdp === 'string') {\n appendLog('offer received');\n peerRef.current.publisherPeerId = typeof message.fromPeerId === 'string' ? message.fromPeerId : undefined;\n await pc.setRemoteDescription({ type: 'offer', sdp: message.sdp });\n for (const candidate of peerRef.current.pendingCandidates) {\n try {\n await pc.addIceCandidate(candidate);\n } catch (error) {\n appendLog(`ice err: ${String(error)}`);\n }\n }\n peerRef.current.pendingCandidates = [];\n\n const answer = await pc.createAnswer();\n await pc.setLocalDescription(answer);\n ws.send(\n JSON.stringify({\n type: 'answer',\n sdp: answer.sdp,\n targetPeerId: peerRef.current.publisherPeerId,\n }),\n );\n appendLog('answer sent');\n return;\n }\n\n if (message.type === 'ice' && message.candidate) {\n if (!pc.remoteDescription) {\n peerRef.current.pendingCandidates.push(message.candidate as RTCIceCandidateInit);\n return;\n }\n try {\n await pc.addIceCandidate(message.candidate as RTCIceCandidateInit);\n } catch (error) {\n appendLog(`ice err: ${String(error)}`);\n }\n return;\n }\n\n if (message.type === 'peer_left') {\n const peerLeft = message as ScreenReceiverPeerLeftMessage;\n if (peerLeft.peerId === peerRef.current.publisherPeerId) {\n peerRef.current.publisherPeerId = undefined;\n appendLog(`publisher left: ${peerLeft.peerId}`);\n }\n return;\n }\n\n if (message.type === 'error') {\n appendLog(`server error: ${String(message.reason ?? 'unknown')}`);\n }\n };\n\n pc.ontrack = (event) => {\n const receivedStream = event.streams[0];\n if (receivedStream) {\n setStream(receivedStream);\n appendLog('track received');\n }\n };\n\n pc.onicecandidate = (event) => {\n if (!event.candidate) return;\n ws.send(\n JSON.stringify({\n type: 'ice',\n candidate: event.candidate,\n targetPeerId: peerRef.current.publisherPeerId,\n }),\n );\n };\n\n pc.onconnectionstatechange = () => {\n const state = pc.connectionState || 'new';\n setConnectionState(state);\n appendLog(`pc state: ${state}`);\n };\n\n pc.oniceconnectionstatechange = () => {\n const state = pc.iceConnectionState || 'new';\n setIceConnectionState(state);\n appendLog(`ice state: ${state}`);\n };\n }, [appendLog, disconnect, iceServers, roomId, wsUrl]);\n\n useEffect(() => () => disconnect(), [disconnect]);\n\n useEffect(() => {\n if (!videoRef.current) return;\n videoRef.current.srcObject = stream;\n }, [stream]);\n\n const clearLogs = useCallback(() => setLogs([]), []);\n\n return useMemo(\n () => ({\n connect,\n disconnect,\n clearLogs,\n logs,\n isConnected,\n connectionState,\n iceConnectionState,\n videoRef,\n stream,\n }),\n [clearLogs, connect, connectionState, disconnect, iceConnectionState, isConnected, logs, stream],\n );\n}\n","const DEFAULT_PORT = 8787;\nconst DEFAULT_PATH = '/ws';\n\nexport interface ResolveScreenReceiverSignalUrlOptions {\n signalUrl?: string;\n path?: string;\n port?: number;\n}\n\nexport function resolveScreenReceiverSignalUrl(\n options: ResolveScreenReceiverSignalUrlOptions = {},\n): string {\n const { signalUrl, path = DEFAULT_PATH, port = DEFAULT_PORT } = options;\n if (signalUrl && signalUrl.trim()) return signalUrl.trim();\n\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n if (typeof window !== 'undefined') {\n const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n return `${protocol}//${window.location.host}${normalizedPath}`;\n }\n\n return `ws://127.0.0.1:${port}${normalizedPath}`;\n}\n","import React, { useMemo, useState } from 'react';\nimport { resolveScreenReceiverSignalUrl } from './signalUrl';\nimport { useScreenReceiver } from './useScreenReceiver';\n\nexport interface ScreenReceiverPanelProps {\n defaultSignalUrl?: string;\n defaultRoomId?: string;\n className?: string;\n}\n\nconst DEFAULT_ROOM_ID = 'screen-room-1';\n\nexport function ScreenReceiverPanel(props: ScreenReceiverPanelProps) {\n const { defaultSignalUrl, defaultRoomId = DEFAULT_ROOM_ID, className } = props;\n const initialSignalUrl = useMemo(\n () => resolveScreenReceiverSignalUrl({ signalUrl: defaultSignalUrl }),\n [defaultSignalUrl],\n );\n const [wsUrl, setWsUrl] = useState(initialSignalUrl);\n const [roomId, setRoomId] = useState(defaultRoomId);\n const receiver = useScreenReceiver({ wsUrl, roomId });\n const logs = useMemo(() => receiver.logs.map((entry) => entry.text).join('\\n'), [receiver.logs]);\n\n return (\n <div className={className}>\n <div className=\"flex flex-col gap-4\">\n <div className=\"grid gap-3 md:grid-cols-[2fr,1fr,auto]\">\n <label className=\"flex flex-col gap-1 text-sm\">\n <span>Signaling WS</span>\n <input\n className=\"rounded-md border px-3 py-2\"\n value={wsUrl}\n onChange={(event) => setWsUrl(event.target.value)}\n />\n </label>\n <label className=\"flex flex-col gap-1 text-sm\">\n <span>Room</span>\n <input\n className=\"rounded-md border px-3 py-2\"\n value={roomId}\n onChange={(event) => setRoomId(event.target.value)}\n />\n </label>\n <div className=\"flex items-end gap-2\">\n <button\n onClick={() => void receiver.connect()}\n className=\"rounded-md border bg-black px-4 py-2 text-sm text-white\"\n >\n {receiver.isConnected ? 'Reconnect' : 'Connect'}\n </button>\n <button\n onClick={receiver.disconnect}\n className=\"rounded-md border px-4 py-2 text-sm\"\n >\n Disconnect\n </button>\n </div>\n </div>\n\n <div className=\"grid gap-3 md:grid-cols-3\">\n <StatusItem label=\"WebSocket\" value={receiver.isConnected ? 'connected' : 'idle'} />\n <StatusItem label=\"PeerConnection\" value={receiver.connectionState} />\n <StatusItem label=\"ICE State\" value={receiver.iceConnectionState} />\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-[3fr,2fr]\">\n <div className=\"rounded-xl border bg-black p-3\">\n <video\n ref={receiver.videoRef}\n autoPlay\n playsInline\n controls\n muted\n className=\"h-[360px] w-full rounded-lg bg-black\"\n />\n </div>\n <div className=\"rounded-xl border p-3\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-semibold\">Session Log</p>\n <button\n onClick={receiver.clearLogs}\n className=\"text-xs underline-offset-2 hover:underline\"\n >\n Clear\n </button>\n </div>\n <pre className=\"mt-3 h-[320px] overflow-auto rounded-lg border bg-slate-50 p-3 text-xs\">\n {logs || 'No logs yet.'}\n </pre>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction StatusItem({ label, value }: { label: string; value: string }) {\n return (\n <div className=\"rounded-md border px-3 py-2\">\n <p className=\"text-xs text-slate-500\">{label}</p>\n <p className=\"text-sm font-medium\">{value}</p>\n </div>\n );\n}\n","import type { FestivalCardConfig } from '../types';\n\nexport const DEFAULT_FESTIVAL_CARD_CONFIG: FestivalCardConfig = {\n id: 'default-festival-card',\n name: 'Holiday Card',\n theme: 'winter',\n coverTitle: 'Happy Holidays',\n coverSubtitle: 'Warm wishes for you',\n background: {\n colorA: '#0c1a34',\n colorB: '#1f4f8a',\n },\n backgroundMusic: {\n src: '',\n loop: true,\n autoPlay: false,\n volume: 0.5,\n },\n pages: [\n {\n id: 'page-1',\n title: '封面',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p1-text-1',\n type: 'text',\n x: 50,\n y: 20,\n content: '新年快乐',\n fontSize: 34,\n fontWeight: 700,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p1-text-2',\n type: 'text',\n x: 50,\n y: 36,\n content: '愿这一年平安喜乐',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#dbeafe',\n },\n {\n id: 'p1-image-1',\n type: 'image',\n x: 50,\n y: 68,\n width: 72,\n height: 42,\n src: 'https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 16,\n alt: 'holiday',\n isBackground: false,\n },\n ],\n },\n {\n id: 'page-2',\n title: '祝福',\n background: { color: '#1a3766' },\n elements: [\n {\n id: 'p2-text-1',\n type: 'text',\n x: 50,\n y: 28,\n content: '愿你新岁:',\n fontSize: 28,\n fontWeight: 700,\n align: 'center',\n color: '#fef3c7',\n },\n {\n id: 'p2-text-2',\n type: 'text',\n x: 50,\n y: 42,\n content: '所得皆所期,所失亦无碍',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p2-text-3',\n type: 'text',\n x: 50,\n y: 55,\n content: '愿你的每一步都走向光亮',\n fontSize: 16,\n fontWeight: 400,\n align: 'center',\n color: '#dbeafe',\n },\n ],\n },\n {\n id: 'page-3',\n title: '落款',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p3-image-1',\n type: 'image',\n x: 50,\n y: 34,\n width: 60,\n height: 42,\n src: 'https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 14,\n alt: 'gift',\n isBackground: false,\n },\n {\n id: 'p3-text-1',\n type: 'text',\n x: 50,\n y: 72,\n content: 'Best wishes, from SA2Kit',\n fontSize: 18,\n fontWeight: 600,\n align: 'center',\n color: '#f8fafc',\n },\n ],\n },\n ],\n};\n","import { DEFAULT_FESTIVAL_CARD_CONFIG } from './defaults';\nimport type { FestivalCardConfig, FestivalCardPage } from '../types';\n\nconst ensurePage = (page: FestivalCardPage, index: number): FestivalCardPage => ({\n id: page.id || `page-${index + 1}`,\n title: page.title || `第 ${index + 1} 页`,\n elements: Array.isArray(page.elements) ? page.elements : [],\n background: page.background || {},\n});\n\nexport const normalizeFestivalCardConfig = (\n config?: Partial<FestivalCardConfig> | null\n): FestivalCardConfig => {\n const pages = config?.pages && config.pages.length > 0 ? config.pages : DEFAULT_FESTIVAL_CARD_CONFIG.pages;\n\n return {\n ...DEFAULT_FESTIVAL_CARD_CONFIG,\n ...config,\n background: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.background,\n ...(config?.background || {}),\n },\n backgroundMusic: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic,\n ...(config?.backgroundMusic || {}),\n src: config?.backgroundMusic?.src ?? DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic?.src ?? '',\n },\n pages: pages.map(ensurePage),\n };\n};\n\nexport const resizeFestivalCardPages = (config: FestivalCardConfig, pageCount: number): FestivalCardConfig => {\n const safeCount = Math.max(1, Math.min(12, Math.floor(pageCount || 1)));\n const nextPages = [...config.pages];\n\n while (nextPages.length < safeCount) {\n const idx = nextPages.length;\n nextPages.push({\n id: `page-${idx + 1}`,\n title: `第 ${idx + 1} 页`,\n elements: [],\n background: {},\n });\n }\n\n return {\n ...config,\n pages: nextPages.slice(0, safeCount),\n };\n};\n","'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\n\ninterface UseFestivalCardConfigOptions {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const useFestivalCardConfig = (options?: UseFestivalCardConfigOptions) => {\n const [config, setConfig] = useState<FestivalCardConfig>(() =>\n normalizeFestivalCardConfig(options?.initialConfig || DEFAULT_FESTIVAL_CARD_CONFIG)\n );\n const [loading, setLoading] = useState(Boolean(options?.fetchConfig));\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n const fetchConfig = options?.fetchConfig;\n if (!fetchConfig) return;\n\n let active = true;\n void fetchConfig()\n .then((value) => {\n if (!active) return;\n setConfig(normalizeFestivalCardConfig(value));\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [options?.fetchConfig]);\n\n const save = useCallback(async () => {\n const onSave = options?.onSave;\n if (!onSave) return;\n setSaving(true);\n try {\n await onSave(config);\n } finally {\n setSaving(false);\n }\n }, [config, options?.onSave]);\n\n return useMemo(\n () => ({\n config,\n setConfig,\n loading,\n saving,\n save,\n }),\n [config, loading, save, saving]\n );\n};\n","'use client';\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport type { FestivalCardElement, FestivalCardPage } from '../types';\n\nconst elementStyle = (element: FestivalCardElement): React.CSSProperties => ({\n position: 'absolute',\n zIndex: 2,\n left: `${element.x}%`,\n top: `${element.y}%`,\n width: `${element.width ?? 70}%`,\n height: element.height ? `${element.height}%` : undefined,\n transform: 'translate(-50%, -50%)',\n});\n\nconst renderElement = (element: FestivalCardElement) => {\n if (element.type === 'text') {\n return (\n <div\n key={element.id}\n style={{\n ...elementStyle(element),\n color: element.color || '#f8fafc',\n fontSize: element.fontSize || 18,\n fontWeight: element.fontWeight || 500,\n fontFamily: element.fontFamily || 'inherit',\n textAlign: element.align || 'left',\n lineHeight: 1.45,\n whiteSpace: 'pre-wrap',\n }}\n >\n {element.content}\n </div>\n );\n }\n\n return (\n <img\n key={element.id}\n src={element.src}\n alt={element.alt || 'festival-card-image'}\n style={{\n ...elementStyle(element),\n objectFit: element.fit || 'cover',\n borderRadius: element.borderRadius || 0,\n overflow: 'hidden',\n boxShadow: '0 12px 30px rgba(2, 6, 23, 0.32)',\n }}\n />\n );\n};\n\ninterface FestivalCardPageRendererProps {\n page: FestivalCardPage;\n editable?: boolean;\n selectedElementId?: string | null;\n onElementSelect?: (elementId: string | null) => void;\n onElementChange?: (elementId: string, patch: Partial<FestivalCardElement>) => void;\n}\n\ntype InteractionState = {\n pointerId: number;\n elementId: string;\n mode: 'move' | 'resize';\n rect: DOMRect;\n};\n\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\n\nexport const FestivalCardPageRenderer: React.FC<FestivalCardPageRendererProps> = ({\n page,\n editable = false,\n selectedElementId = null,\n onElementSelect,\n onElementChange,\n}) => {\n const [draggingElementId, setDraggingElementId] = useState<string | null>(null);\n const [resizingElementId, setResizingElementId] = useState<string | null>(null);\n const stageRef = useRef<HTMLDivElement | null>(null);\n const interactionRef = useRef<InteractionState | null>(null);\n const backgroundElement = useMemo(\n () =>\n page.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n ),\n [page]\n );\n const foregroundElements = useMemo(\n () => page.elements.filter((element) => !(element.type === 'image' && element.isBackground)),\n [page]\n );\n\n const updateElementByPointer = (element: FestivalCardElement, interaction: InteractionState, clientX: number, clientY: number) => {\n if (!onElementChange || interaction.rect.width <= 0 || interaction.rect.height <= 0) return;\n const xPercent = clamp(((clientX - interaction.rect.left) / interaction.rect.width) * 100, 0, 100);\n const yPercent = clamp(((clientY - interaction.rect.top) / interaction.rect.height) * 100, 0, 100);\n if (interaction.mode === 'move') {\n onElementChange(element.id, { x: xPercent, y: yPercent });\n return;\n }\n\n const nextWidth = clamp(Math.abs(xPercent - element.x) * 2, 4, 100);\n if (element.type === 'image') {\n const nextHeight = clamp(Math.abs(yPercent - element.y) * 2, 4, 100);\n onElementChange(element.id, { width: nextWidth, height: nextHeight });\n return;\n }\n onElementChange(element.id, { width: nextWidth });\n };\n\n const beginInteraction = (\n event: React.PointerEvent<HTMLElement>,\n elementId: string,\n mode: InteractionState['mode']\n ) => {\n if (!editable || !stageRef.current) return;\n event.preventDefault();\n event.stopPropagation();\n const rect = stageRef.current.getBoundingClientRect();\n interactionRef.current = {\n pointerId: event.pointerId,\n elementId,\n mode,\n rect,\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n onElementSelect?.(elementId);\n if (mode === 'move') {\n setDraggingElementId(elementId);\n setResizingElementId(null);\n } else {\n setResizingElementId(elementId);\n setDraggingElementId(null);\n }\n const element = foregroundElements.find((item) => item.id === elementId);\n if (element) {\n updateElementByPointer(element, interactionRef.current, event.clientX, event.clientY);\n }\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n const interaction = interactionRef.current;\n if (!interaction || interaction.pointerId !== event.pointerId) return;\n const element = foregroundElements.find((item) => item.id === interaction.elementId);\n if (!element) return;\n updateElementByPointer(element, interaction, event.clientX, event.clientY);\n };\n\n const endInteraction = (event: React.PointerEvent<HTMLDivElement>) => {\n const interaction = interactionRef.current;\n if (!interaction || interaction.pointerId !== event.pointerId) return;\n interactionRef.current = null;\n setDraggingElementId(null);\n setResizingElementId(null);\n };\n\n return (\n <div\n ref={stageRef}\n onPointerMove={editable ? handlePointerMove : undefined}\n onPointerUp={editable ? endInteraction : undefined}\n onPointerCancel={editable ? endInteraction : undefined}\n onClick={editable ? () => onElementSelect?.(null) : undefined}\n className={`relative h-full w-full overflow-hidden rounded-2xl ${editable ? 'touch-none' : ''}`}\n style={{\n backgroundColor: page.background?.color || '#0f172a',\n backgroundImage: backgroundElement\n ? `url(${backgroundElement.src})`\n : page.background?.image\n ? `url(${page.background.image})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n <div className=\"absolute inset-0 bg-slate-950/20\" />\n {foregroundElements.map((element) => {\n if (!editable) {\n return renderElement(element);\n }\n const isSelected = selectedElementId === element.id;\n const isDragging = draggingElementId === element.id;\n const isResizing = resizingElementId === element.id;\n return (\n <div\n key={element.id}\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n onElementSelect?.(element.id);\n }}\n onPointerDown={(event) => beginInteraction(event, element.id, 'move')}\n className={`absolute select-none touch-none rounded-md ${\n isDragging ? 'cursor-grabbing' : isResizing ? 'cursor-se-resize' : 'cursor-grab'\n } ${isSelected ? 'ring-2 ring-sky-300' : 'ring-1 ring-white/40'}`}\n style={{\n ...elementStyle(element),\n zIndex: isSelected ? 4 : 2,\n }}\n >\n {element.type === 'text' ? (\n <div\n className=\"rounded-md bg-black/20 px-2 py-1\"\n style={{\n color: element.color || '#f8fafc',\n fontSize: element.fontSize || 18,\n fontWeight: element.fontWeight || 500,\n fontFamily: element.fontFamily || 'inherit',\n textAlign: element.align || 'left',\n lineHeight: 1.45,\n whiteSpace: 'pre-wrap',\n }}\n >\n {element.content}\n </div>\n ) : (\n <img\n src={element.src}\n alt={element.alt || 'festival-card-image'}\n draggable={false}\n className=\"pointer-events-none h-full w-full\"\n style={{\n objectFit: element.fit || 'cover',\n borderRadius: element.borderRadius || 0,\n overflow: 'hidden',\n boxShadow: '0 12px 30px rgba(2, 6, 23, 0.32)',\n }}\n />\n )}\n <button\n type=\"button\"\n aria-label=\"resize\"\n onPointerDown={(event) => beginInteraction(event, element.id, 'resize')}\n className=\"absolute -bottom-2 -right-2 h-4 w-4 rounded-full border border-white bg-sky-500 shadow\"\n />\n </div>\n );\n })}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardElement, FestivalCardPage } from '../types';\nimport FloatingMenu from '../../navigation/FloatingMenu';\nimport { FestivalCardPageRenderer } from './FestivalCardPageRenderer';\n\nexport interface FestivalCardBook3DProps {\n config: FestivalCardConfig;\n className?: string;\n editable?: boolean;\n enableExportImage?: boolean;\n currentPage?: number;\n onCurrentPageChange?: (index: number) => void;\n selectedElementId?: string | null;\n onSelectedElementChange?: (elementId: string | null) => void;\n onElementChange?: (pageIndex: number, elementId: string, patch: Partial<FestivalCardElement>) => void;\n}\n\nconst loadImage = (src: string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new window.Image();\n image.crossOrigin = 'anonymous';\n image.decoding = 'async';\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`图片加载失败: ${src}`));\n image.src = src;\n });\n\nconst drawImageWithFit = (\n ctx: CanvasRenderingContext2D,\n image: HTMLImageElement,\n left: number,\n top: number,\n width: number,\n height: number,\n fit: 'cover' | 'contain'\n) => {\n const imageRatio = image.width / image.height;\n const boxRatio = width / height;\n let drawWidth = width;\n let drawHeight = height;\n let offsetX = left;\n let offsetY = top;\n\n if (fit === 'cover') {\n if (imageRatio > boxRatio) {\n drawHeight = height;\n drawWidth = height * imageRatio;\n offsetX = left - (drawWidth - width) / 2;\n } else {\n drawWidth = width;\n drawHeight = width / imageRatio;\n offsetY = top - (drawHeight - height) / 2;\n }\n } else if (imageRatio > boxRatio) {\n drawWidth = width;\n drawHeight = width / imageRatio;\n offsetY = top + (height - drawHeight) / 2;\n } else {\n drawHeight = height;\n drawWidth = height * imageRatio;\n offsetX = left + (width - drawWidth) / 2;\n }\n\n ctx.drawImage(image, offsetX, offsetY, drawWidth, drawHeight);\n};\n\nconst withRoundedClip = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n width: number,\n height: number,\n radius: number,\n draw: () => void\n) => {\n const safeRadius = Math.max(0, Math.min(radius, Math.min(width, height) / 2));\n if (safeRadius <= 0) {\n draw();\n return;\n }\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left + safeRadius, top);\n ctx.lineTo(left + width - safeRadius, top);\n ctx.quadraticCurveTo(left + width, top, left + width, top + safeRadius);\n ctx.lineTo(left + width, top + height - safeRadius);\n ctx.quadraticCurveTo(left + width, top + height, left + width - safeRadius, top + height);\n ctx.lineTo(left + safeRadius, top + height);\n ctx.quadraticCurveTo(left, top + height, left, top + height - safeRadius);\n ctx.lineTo(left, top + safeRadius);\n ctx.quadraticCurveTo(left, top, left + safeRadius, top);\n ctx.closePath();\n ctx.clip();\n draw();\n ctx.restore();\n};\n\nconst drawMultilineText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n left: number,\n top: number,\n maxWidth: number,\n lineHeight: number\n) => {\n const paragraphs = text.split('\\n');\n let currentY = top;\n paragraphs.forEach((paragraph, index) => {\n const words = paragraph.split('');\n let line = '';\n for (const word of words) {\n const testLine = line + word;\n if (ctx.measureText(testLine).width > maxWidth && line) {\n ctx.fillText(line, left, currentY);\n line = word;\n currentY += lineHeight;\n } else {\n line = testLine;\n }\n }\n ctx.fillText(line, left, currentY);\n currentY += lineHeight;\n if (index < paragraphs.length - 1) {\n currentY += lineHeight * 0.2;\n }\n });\n};\n\nconst exportPageToPng = async (page: FestivalCardPage, fileName: string) => {\n const width = 1080;\n const height = 1440;\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('无法创建 Canvas 上下文');\n\n ctx.fillStyle = page.background?.color || '#0f172a';\n ctx.fillRect(0, 0, width, height);\n\n const backgroundElement = page.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n );\n const backgroundImageSrc = backgroundElement?.src || page.background?.image;\n if (backgroundImageSrc) {\n const image = await loadImage(backgroundImageSrc);\n drawImageWithFit(ctx, image, 0, 0, width, height, 'cover');\n }\n\n const foregroundElements = page.elements.filter((element) => !(element.type === 'image' && element.isBackground));\n for (const element of foregroundElements) {\n const elementWidth = (width * (element.width ?? 70)) / 100;\n const elementHeight = element.height ? (height * element.height) / 100 : undefined;\n const centerX = (width * element.x) / 100;\n const centerY = (height * element.y) / 100;\n const left = centerX - elementWidth / 2;\n\n if (element.type === 'image') {\n const image = await loadImage(element.src);\n const drawHeight = elementHeight ?? elementWidth;\n const boxTop = centerY - drawHeight / 2;\n withRoundedClip(ctx, left, boxTop, elementWidth, drawHeight, element.borderRadius ?? 0, () => {\n drawImageWithFit(ctx, image, left, boxTop, elementWidth, drawHeight, element.fit || 'cover');\n });\n continue;\n }\n\n const fontSize = (element.fontSize || 18) * 1.5;\n ctx.fillStyle = element.color || '#f8fafc';\n ctx.font = `${element.fontWeight || 500} ${fontSize}px ${element.fontFamily || 'sans-serif'}`;\n ctx.textBaseline = 'top';\n ctx.textAlign = (element.align || 'left') as CanvasTextAlign;\n const textX =\n element.align === 'center' ? centerX : element.align === 'right' ? left + elementWidth : left;\n drawMultilineText(ctx, element.content || '', textX, centerY - fontSize * 0.72, elementWidth, fontSize * 1.45);\n }\n\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/png'));\n if (!blob) throw new Error('导出失败,请重试');\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n};\n\nexport const FestivalCardBook3D: React.FC<FestivalCardBook3DProps> = ({\n config,\n className,\n editable = false,\n enableExportImage = !editable,\n currentPage: currentPageProp,\n onCurrentPageChange,\n selectedElementId = null,\n onSelectedElementChange,\n onElementChange,\n}) => {\n const [internalCurrentPage, setInternalCurrentPage] = useState(0);\n const [exporting, setExporting] = useState(false);\n const normalized = useMemo(() => normalizeFestivalCardConfig(config), [config]);\n const pages = normalized.pages;\n const currentPage = typeof currentPageProp === 'number' ? currentPageProp : internalCurrentPage;\n const setCurrentPage = (updater: number | ((prev: number) => number)) => {\n const prev = currentPage;\n const nextValue = typeof updater === 'function' ? (updater as (prev: number) => number)(prev) : updater;\n if (typeof currentPageProp === 'number') {\n onCurrentPageChange?.(nextValue);\n return;\n }\n setInternalCurrentPage(nextValue);\n onCurrentPageChange?.(nextValue);\n };\n\n const canPrev = currentPage > 0;\n const canNext = currentPage < pages.length - 1;\n const currentPageData = pages[currentPage];\n\n const handleExportCurrentPage = async () => {\n if (!currentPageData || exporting) return;\n setExporting(true);\n try {\n const base = normalized.id || 'festival-card';\n const fileName = `${base}-page-${currentPage + 1}.png`;\n await exportPageToPng(currentPageData, fileName);\n } catch (error) {\n window.alert((error as Error).message || '导出图片失败');\n } finally {\n setExporting(false);\n }\n };\n\n return (\n <div className={className}>\n <div className=\"w-full min-h-screen px-0 py-4\">\n <div className=\"mx-auto w-full text-center text-slate-100\">\n <h3 className=\"mb-3 text-lg font-semibold\">{normalized.coverTitle || 'Festival Card'}</h3>\n </div>\n\n <div className=\"mx-auto w-full\">\n <div className=\"relative h-[calc(100vh-170px)] min-h-[460px]\">\n {pages.map((page, index) => (\n <div\n key={page.id}\n className=\"absolute inset-0 transition-opacity duration-500 ease-out\"\n style={{\n opacity: index === currentPage ? 1 : 0,\n pointerEvents: index === currentPage ? 'auto' : 'none',\n }}\n >\n <FestivalCardPageRenderer\n page={page}\n editable={editable && index === currentPage}\n selectedElementId={selectedElementId}\n onElementSelect={onSelectedElementChange}\n onElementChange={(elementId, patch) => onElementChange?.(index, elementId, patch)}\n />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-4 flex justify-center gap-3\">\n <button\n type=\"button\"\n disabled={!canPrev}\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n className=\"rounded-full bg-white px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 上一页\n </button>\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={() => setCurrentPage((p) => Math.min(pages.length - 1, p + 1))}\n className=\"rounded-full bg-sky-300 px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 下一页\n </button>\n </div>\n </div>\n\n {normalized.backgroundMusic?.src ? (\n <audio\n src={normalized.backgroundMusic.src}\n autoPlay={normalized.backgroundMusic.autoPlay}\n loop={normalized.backgroundMusic.loop}\n controls\n className=\"mt-3 w-full\"\n />\n ) : null}\n {enableExportImage ? (\n <FloatingMenu\n initialPosition={{ x: 24, y: 120 }}\n trigger={\n <div className=\"text-lg leading-none text-slate-700\" aria-hidden>\n ⌁\n </div>\n }\n menu={\n <div className=\"grid gap-2\">\n <div className=\"text-xs font-semibold tracking-wide text-slate-500\">贺卡工具</div>\n <button\n type=\"button\"\n onClick={() => void handleExportCurrentPage()}\n disabled={exporting}\n className=\"rounded-lg bg-sky-600 px-3 py-2 text-left text-sm font-medium text-white disabled:opacity-60\"\n >\n {exporting ? '导出中...' : `导出第 ${currentPage + 1} 页 PNG`}\n </button>\n </div>\n }\n triggerClassName=\"bg-white/95 backdrop-blur\"\n menuClassName=\"bg-white/95 backdrop-blur\"\n />\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { resizeFestivalCardPages } from '../core';\nimport type { FestivalCardConfig, FestivalCardElement } from '../types';\n\ninterface FestivalCardConfigEditorProps {\n value: FestivalCardConfig;\n onChange: (config: FestivalCardConfig) => void;\n activePageIndex?: number;\n onActivePageIndexChange?: (index: number) => void;\n selectedElementId?: string | null;\n}\n\nconst createTextElement = (pageIndex: number): FestivalCardElement => ({\n id: `text-${Date.now()}-${pageIndex}`,\n type: 'text',\n x: 50,\n y: 50,\n width: 70,\n content: '请输入文字',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#ffffff',\n fontFamily: 'inherit',\n});\n\nconst createImageElement = (pageIndex: number): FestivalCardElement => ({\n id: `image-${Date.now()}-${pageIndex}`,\n type: 'image',\n x: 50,\n y: 50,\n width: 60,\n height: 40,\n src: 'https://images.unsplash.com/photo-1482517967863-00e15c9b44be?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 12,\n});\n\nexport const FestivalCardConfigEditor: React.FC<FestivalCardConfigEditorProps> = ({\n value,\n onChange,\n activePageIndex: activePageIndexProp,\n onActivePageIndexChange,\n selectedElementId,\n}) => {\n const [internalActivePageIndex, setInternalActivePageIndex] = useState(0);\n const activePageIndex = activePageIndexProp ?? internalActivePageIndex;\n const setActivePageIndex = (index: number) => {\n if (typeof activePageIndexProp === 'number') {\n onActivePageIndexChange?.(index);\n return;\n }\n setInternalActivePageIndex(index);\n };\n const page = value.pages[activePageIndex];\n const canEditPage = Boolean(page);\n const pageOptions = useMemo(() => value.pages.map((_, index) => index), [value.pages]);\n\n const handlePageCountChange = (nextRaw: number) => {\n const next = Number.isFinite(nextRaw) ? Math.max(1, Math.min(12, Math.floor(nextRaw))) : value.pages.length;\n const resized = resizeFestivalCardPages(value, next);\n onChange(resized);\n if (activePageIndex > resized.pages.length - 1) {\n setActivePageIndex(resized.pages.length - 1);\n }\n };\n\n const updateElement = (elementId: string, patch: Partial<FestivalCardElement>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.map((el) => (el.id === elementId ? { ...el, ...patch } as FestivalCardElement : el)),\n }\n : p\n ),\n });\n };\n\n const removeElement = (elementId: string) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.filter((el) => el.id !== elementId),\n }\n : p\n ),\n });\n };\n\n const updatePage = (patch: Partial<FestivalCardConfig['pages'][number]>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, index) => (index === activePageIndex ? { ...p, ...patch } : p)),\n });\n };\n\n const numberFieldClassName =\n 'w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100';\n\n return (\n <div className=\"rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm\">\n <div className=\"grid gap-3\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面数量</span>\n <input\n type=\"number\"\n min={1}\n max={12}\n value={value.pages.length}\n onChange={(event) => handlePageCountChange(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">背景音乐 URL</span>\n <input\n type=\"url\"\n value={value.backgroundMusic?.src || ''}\n onChange={(event) =>\n onChange({\n ...value,\n backgroundMusic: {\n ...value.backgroundMusic,\n src: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面标题</span>\n <input\n type=\"text\"\n value={page?.title || ''}\n onChange={(event) => updatePage({ title: event.target.value })}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面背景色</span>\n <input\n type=\"color\"\n value={page?.background?.color || '#0f172a'}\n onChange={(event) =>\n updatePage({\n background: {\n ...page?.background,\n color: event.target.value,\n },\n })\n }\n className=\"h-10 w-full rounded-lg border border-slate-300 bg-white p-1\"\n />\n </label>\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面背景图 URL</span>\n <input\n type=\"url\"\n value={page?.background?.image || ''}\n onChange={(event) =>\n updatePage({\n background: {\n ...page?.background,\n image: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n </div>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">编辑页面</span>\n <select\n value={activePageIndex}\n onChange={(event) => setActivePageIndex(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {pageOptions.map((index) => (\n <option key={index} value={index}>\n 第 {index + 1} 页\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {canEditPage ? (\n <div className=\"mt-4\">\n <div className=\"mb-3 flex gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createTextElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\"\n >\n + 文字\n </button>\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createImageElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white\"\n >\n + 图片\n </button>\n </div>\n\n <div className=\"grid max-h-[340px] gap-2.5 overflow-auto pr-1\">\n {(page?.elements ?? []).map((element) => (\n <div\n key={element.id}\n className={`rounded-xl border bg-slate-50 p-3 ${\n selectedElementId === element.id ? 'border-sky-400 ring-2 ring-sky-100' : 'border-slate-200'\n }`}\n >\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"text-xs font-semibold tracking-wide text-slate-500\">{element.type.toUpperCase()}</div>\n <button\n type=\"button\"\n onClick={() => removeElement(element.id)}\n className=\"rounded-md border border-rose-300 bg-rose-50 px-2 py-1 text-xs font-medium text-rose-700\"\n >\n 删除\n </button>\n </div>\n {element.type === 'text' ? (\n <div className=\"grid gap-2\">\n <textarea\n value={element.content}\n onChange={(event) => updateElement(element.id, { content: event.target.value })}\n rows={3}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1 text-xs text-slate-600\">\n X(%)\n <input\n type=\"number\"\n value={element.x}\n onChange={(event) => updateElement(element.id, { x: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n Y(%)\n <input\n type=\"number\"\n value={element.y}\n onChange={(event) => updateElement(element.id, { y: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 宽度(%)\n <input\n type=\"number\"\n value={element.width ?? 70}\n onChange={(event) => updateElement(element.id, { width: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 字号(px)\n <input\n type=\"number\"\n value={element.fontSize ?? 18}\n onChange={(event) => updateElement(element.id, { fontSize: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 字重\n <input\n type=\"number\"\n min={100}\n max={900}\n step={100}\n value={element.fontWeight ?? 500}\n onChange={(event) => updateElement(element.id, { fontWeight: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 对齐\n <select\n value={element.align || 'left'}\n onChange={(event) =>\n updateElement(element.id, { align: event.target.value as 'left' | 'center' | 'right' })\n }\n className={numberFieldClassName}\n >\n <option value=\"left\">left</option>\n <option value=\"center\">center</option>\n <option value=\"right\">right</option>\n </select>\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600 sm:col-span-2\">\n 字体\n <input\n type=\"text\"\n value={element.fontFamily || ''}\n onChange={(event) => updateElement(element.id, { fontFamily: event.target.value })}\n placeholder=\"inherit / serif / sans-serif / PingFang SC\"\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600 sm:col-span-2\">\n 文字颜色\n <div className=\"grid grid-cols-[64px_1fr] gap-2\">\n <input\n type=\"color\"\n value={element.color || '#ffffff'}\n onChange={(event) => updateElement(element.id, { color: event.target.value })}\n className=\"h-10 rounded-lg border border-slate-300 bg-white p-1\"\n />\n <input\n type=\"text\"\n value={element.color || '#ffffff'}\n onChange={(event) => updateElement(element.id, { color: event.target.value })}\n className={numberFieldClassName}\n />\n </div>\n </label>\n </div>\n </div>\n ) : (\n <div className=\"grid gap-2\">\n <input\n type=\"url\"\n value={element.src}\n onChange={(event) => updateElement(element.id, { src: event.target.value })}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1 text-xs text-slate-600\">\n X(%)\n <input\n type=\"number\"\n value={element.x}\n onChange={(event) => updateElement(element.id, { x: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n Y(%)\n <input\n type=\"number\"\n value={element.y}\n onChange={(event) => updateElement(element.id, { y: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 宽度(%)\n <input\n type=\"number\"\n value={element.width ?? 60}\n onChange={(event) => updateElement(element.id, { width: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 高度(%)\n <input\n type=\"number\"\n value={element.height ?? 40}\n onChange={(event) => updateElement(element.id, { height: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 圆角(px)\n <input\n type=\"number\"\n value={element.borderRadius ?? 0}\n onChange={(event) => updateElement(element.id, { borderRadius: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 填充\n <select\n value={element.fit || 'cover'}\n onChange={(event) => updateElement(element.id, { fit: event.target.value as 'cover' | 'contain' })}\n className={numberFieldClassName}\n >\n <option value=\"cover\">cover</option>\n <option value=\"contain\">contain</option>\n </select>\n </label>\n </div>\n <label className=\"inline-flex items-center gap-2 text-sm text-slate-700\">\n <input\n type=\"checkbox\"\n checked={Boolean(element.isBackground)}\n onChange={(event) => updateElement(element.id, { isBackground: event.target.checked })}\n className=\"h-4 w-4 rounded border-slate-300 text-sky-600\"\n />\n 作为本页背景图\n </label>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport { useFestivalCardConfig } from '../hooks/useFestivalCardConfig';\nimport type { FestivalCardConfig, FestivalCardElement } from '../types';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport { FestivalCardConfigEditor } from './FestivalCardConfigEditor';\n\ninterface FestivalCardStudioProps {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const FestivalCardStudio: React.FC<FestivalCardStudioProps> = ({ initialConfig, fetchConfig, onSave }) => {\n const { config, setConfig, loading, save, saving } = useFestivalCardConfig({\n initialConfig: normalizeFestivalCardConfig(initialConfig),\n fetchConfig,\n onSave,\n });\n const [activePageIndex, setActivePageIndex] = useState(0);\n const [selectedElementId, setSelectedElementId] = useState<string | null>(null);\n\n useEffect(() => {\n if (config.pages.length === 0) return;\n if (activePageIndex <= config.pages.length - 1) return;\n setActivePageIndex(config.pages.length - 1);\n }, [activePageIndex, config.pages.length]);\n\n const updateElementByPreview = (pageIndex: number, elementId: string, patch: Partial<FestivalCardElement>) => {\n setConfig((prev) => ({\n ...prev,\n pages: prev.pages.map((page, index) =>\n index === pageIndex\n ? {\n ...page,\n elements: page.elements.map((element) =>\n element.id === elementId ? ({ ...element, ...patch } as FestivalCardElement) : element\n ),\n }\n : page\n ),\n }));\n };\n\n if (loading) return <div>加载中...</div>;\n\n return (\n <div className=\"grid items-start gap-4 lg:grid-cols-[1.45fr_1fr]\">\n <FestivalCardBook3D\n config={config}\n className=\"h-full\"\n editable\n currentPage={activePageIndex}\n onCurrentPageChange={(index) => {\n setActivePageIndex(index);\n setSelectedElementId(null);\n }}\n selectedElementId={selectedElementId}\n onSelectedElementChange={setSelectedElementId}\n onElementChange={updateElementByPreview}\n />\n <div className=\"lg:sticky lg:top-4\">\n <FestivalCardConfigEditor\n value={config}\n onChange={setConfig}\n activePageIndex={activePageIndex}\n onActivePageIndexChange={(index) => {\n setActivePageIndex(index);\n setSelectedElementId(null);\n }}\n selectedElementId={selectedElementId}\n />\n {onSave ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"mt-3 w-full rounded-lg bg-slate-900 px-4 py-2.5 text-sm font-medium text-white disabled:opacity-60\"\n >\n {saving ? '保存中...' : '保存配置'}\n </button>\n ) : null}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FestivalCardStudio } from './FestivalCardStudio';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardConfigPageProps {\n apiBase?: string;\n cardId?: string;\n mainPagePath?: string;\n}\n\nexport const FestivalCardConfigPage: React.FC<FestivalCardConfigPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n mainPagePath = '/festivalCard',\n}) => {\n const [list, setList] = useState<FestivalCardConfigSummary[]>([]);\n const [selectedId, setSelectedId] = useState(cardId || 'default-festival-card');\n\n const parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload\n .filter((item): item is FestivalCardConfigSummary => Boolean(item && typeof item === 'object' && typeof (item as { id?: unknown }).id === 'string'))\n .map((item) => ({ id: item.id, name: item.name }));\n };\n\n const parseConfigResponse = (data: unknown): FestivalCardConfig => {\n if (!data || typeof data !== 'object') return normalizeFestivalCardConfig();\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return normalizeFestivalCardConfig();\n return normalizeFestivalCardConfig(payload as Partial<FestivalCardConfig>);\n };\n\n const reloadList = useCallback(async () => {\n try {\n const response = await fetch(apiBase, { cache: 'no-store' });\n if (!response.ok) throw new Error(`加载卡片列表失败: ${response.status}`);\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n if (items.length === 0) {\n const fallbackId = 'default-festival-card';\n const fallbackConfig = normalizeFestivalCardConfig({ id: fallbackId, name: 'Holiday Card' });\n await fetch(`${apiBase}/${encodeURIComponent(fallbackId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config: fallbackConfig }),\n });\n setList([{ id: fallbackId, name: fallbackConfig.name }]);\n setSelectedId(fallbackId);\n return;\n }\n setList(items);\n } catch (error) {\n window.alert((error as Error).message || '加载卡片列表失败');\n }\n }, [apiBase]);\n\n useEffect(() => {\n void reloadList();\n }, [reloadList]);\n\n const fetchConfig = async (): Promise<FestivalCardConfig> => {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: 'no-store' });\n if (!response.ok) {\n const message = `加载配置失败: ${response.status}`;\n window.alert(message);\n throw new Error(message);\n }\n const data: unknown = await response.json();\n return parseConfigResponse(data);\n };\n\n const saveConfig = async (config: FestivalCardConfig) => {\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`保存失败: ${response.status}`);\n await reloadList();\n window.alert('保存成功');\n } catch (error) {\n window.alert((error as Error).message || '保存失败');\n throw error;\n }\n };\n\n const createNew = async () => {\n const name = window.prompt('请输入新卡片名称');\n if (!name) return;\n const id = `festival-${Date.now()}`;\n const config = normalizeFestivalCardConfig({\n id,\n name,\n });\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`创建失败: ${response.status}`);\n setSelectedId(id);\n await reloadList();\n window.alert('新卡片创建成功');\n } catch (error) {\n window.alert((error as Error).message || '创建失败');\n }\n };\n\n const mainLink = useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);\n\n return (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-center gap-2 rounded-xl border border-slate-800 bg-slate-900/50 p-3\">\n <select\n value={selectedId}\n onChange={(event) => setSelectedId(event.target.value)}\n className=\"min-w-[240px] rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {list.map((item) => (\n <option key={item.id} value={item.id}>\n {item.name || item.id}\n </option>\n ))}\n </select>\n <button type=\"button\" onClick={() => void createNew()} className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\">\n 新建卡片\n </button>\n <a href={mainLink} className=\"rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-sm text-sky-700\">\n 打开主页面\n </a>\n </div>\n\n <FestivalCardStudio fetchConfig={fetchConfig} onSave={saveConfig} />\n </div>\n );\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardManagedPageProps {\n apiBase?: string;\n cardId?: string;\n}\n\nconst isSummary = (value: unknown): value is FestivalCardConfigSummary => {\n if (!value || typeof value !== 'object') return false;\n return typeof (value as { id?: unknown }).id === 'string';\n};\n\nconst parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload.filter(isSummary).map((item) => ({ id: item.id, name: item.name }));\n};\n\nconst parseConfigResponse = (data: unknown): FestivalCardConfig | null => {\n if (!data || typeof data !== 'object') return null;\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return null;\n if (!Array.isArray((payload as FestivalCardConfig).pages)) return null;\n return payload as FestivalCardConfig;\n};\n\nexport const FestivalCardManagedPage: React.FC<FestivalCardManagedPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n}) => {\n const [currentCardId, setCurrentCardId] = useState<string>(cardId || '');\n const [config, setConfig] = useState<FestivalCardConfig | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const fetchList = async () => {\n const response = await fetch(apiBase, { cache: 'no-store' });\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n const first = items[0];\n if (!currentCardId && first) {\n setCurrentCardId(first.id);\n }\n };\n\n void fetchList();\n }, [apiBase, currentCardId]);\n\n useEffect(() => {\n if (!currentCardId) return;\n setLoading(true);\n void fetch(`${apiBase}/${encodeURIComponent(currentCardId)}`, { cache: 'no-store' })\n .then((res) => res.json() as Promise<unknown>)\n .then((data) => setConfig(parseConfigResponse(data)))\n .finally(() => setLoading(false));\n }, [apiBase, currentCardId]);\n\n return (\n <div>{loading || !config ? <div className=\"py-12 text-center text-slate-400\">加载中...</div> : <FestivalCardBook3D config={config} />}</div>\n );\n};\n","import type { FestivalCardDbAdapter } from '../types';\n\nlet dbAdapter: FestivalCardDbAdapter | null = null;\n\nexport const initializeFestivalCardDb = (adapter: FestivalCardDbAdapter): void => {\n dbAdapter = adapter;\n};\n\nexport const getFestivalCardDb = (): FestivalCardDbAdapter | null => dbAdapter;\n","import { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport { getFestivalCardDb } from '../server/db';\nimport type {\n FestivalCardConfig,\n FestivalCardConfigSummary,\n FestivalCardDbAdapter,\n FestivalCardServiceOptions,\n} from '../types';\n\nexport class FestivalCardService {\n private db: FestivalCardDbAdapter | null;\n\n constructor(options?: FestivalCardServiceOptions) {\n this.db = options?.db || getFestivalCardDb();\n }\n\n async listConfigs(): Promise<FestivalCardConfigSummary[]> {\n if (!this.db) {\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n if (this.db.listConfigs) {\n const list = await this.db.listConfigs();\n return list.length > 0\n ? list\n : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n async getConfig(cardId = 'default-festival-card'): Promise<FestivalCardConfig> {\n if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;\n const config = await this.db.getConfig(cardId);\n return normalizeFestivalCardConfig(config);\n }\n\n async saveConfig(cardId: string, config: FestivalCardConfig): Promise<FestivalCardConfig> {\n const normalized = normalizeFestivalCardConfig(config);\n if (!this.db) return normalized;\n await this.db.saveConfig(cardId, normalized);\n return normalized;\n }\n\n async deleteConfig(cardId: string): Promise<void> {\n if (!this.db?.deleteConfig) return;\n await this.db.deleteConfig(cardId);\n }\n}\n\nconst memoryStore = new Map<string, FestivalCardConfig>();\nconst defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card';\nif (!memoryStore.has(defaultId)) {\n memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);\n}\n\nexport const createInMemoryFestivalCardDb = (): FestivalCardDbAdapter => ({\n listConfigs() {\n return Promise.resolve(\n Array.from(memoryStore.entries()).map(([id, config]) => ({\n id,\n name: config.name || id,\n }))\n );\n },\n getConfig(id: string) {\n return Promise.resolve(memoryStore.get(id) || null);\n },\n saveConfig(id: string, config: FestivalCardConfig) {\n memoryStore.set(id, config);\n return Promise.resolve();\n },\n deleteConfig(id: string) {\n memoryStore.delete(id);\n return Promise.resolve();\n },\n});\n","const AMBIGUOUS = new Set(['0', '1', 'I', 'O', 'L']);\nconst ALPHABET = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789'.split('').filter((c) => !AMBIGUOUS.has(c));\n\nexport interface GenerateMatchCodeOptions {\n length?: number;\n maxAttempts?: number;\n exists: (code: string) => Promise<boolean>;\n}\n\nexport const normalizeMatchCode = (value: string): string => value.trim().toUpperCase();\n\nexport const generateMatchCode = async ({\n length = 6,\n maxAttempts = 20,\n exists,\n}: GenerateMatchCodeOptions): Promise<string> => {\n if (length < 4) {\n throw new Error('Match code length must be at least 4');\n }\n\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n const code = Array.from({ length })\n .map(() => ALPHABET[Math.floor(Math.random() * ALPHABET.length)])\n .join('');\n\n // eslint-disable-next-line no-await-in-loop\n if (!(await exists(code))) {\n return code;\n }\n }\n\n throw new Error('Unable to generate unique match code');\n};\n","import { randomUUID } from 'crypto';\nimport type {\n BoothAuditEvent,\n BoothUploadRecord,\n BoothVaultStore,\n CreateBoothUploadInput,\n CreateBoothUploadResult,\n} from '../types';\nimport { generateMatchCode, normalizeMatchCode } from './code';\n\nexport interface BoothRedeemGuardLike {\n assertAllowed(subjectKey: string): void;\n registerAttempt(subjectKey: string, success: boolean): void;\n}\n\nexport interface BoothVaultServiceOptions {\n store: BoothVaultStore;\n codeLength?: number;\n defaultTtlHours?: number;\n baseDownloadPath?: string;\n redeemGuard?: BoothRedeemGuardLike;\n onAuditEvent?: (event: BoothAuditEvent) => void;\n}\n\nexport class BoothVaultService {\n private emitAudit(event: Omit<BoothAuditEvent, 'at'>): void {\n this.onAuditEvent?.({\n ...event,\n at: new Date().toISOString(),\n });\n }\n private readonly store: BoothVaultStore;\n private readonly codeLength: number;\n private readonly defaultTtlHours: number;\n private readonly baseDownloadPath: string;\n private readonly redeemGuard?: BoothRedeemGuardLike;\n private readonly onAuditEvent?: (event: BoothAuditEvent) => void;\n\n constructor(options: BoothVaultServiceOptions) {\n this.store = options.store;\n this.codeLength = options.codeLength ?? 6;\n this.defaultTtlHours = options.defaultTtlHours ?? 24 * 14;\n this.baseDownloadPath = options.baseDownloadPath ?? '/redeem';\n this.redeemGuard = options.redeemGuard;\n this.onAuditEvent = options.onAuditEvent;\n }\n\n async createUpload(input: CreateBoothUploadInput): Promise<CreateBoothUploadResult> {\n if (!input.files?.length) {\n throw new Error('At least one file is required');\n }\n\n const now = new Date();\n const ttlHours = Math.max(1, input.ttlHours ?? this.defaultTtlHours);\n const expiresAt = new Date(now.getTime() + ttlHours * 60 * 60 * 1000);\n\n const matchCode = await generateMatchCode({\n length: this.codeLength,\n exists: (code) => this.store.existsByMatchCode(code),\n });\n\n const record: BoothUploadRecord = {\n id: randomUUID(),\n boothId: input.boothId,\n matchCode,\n createdAt: now.toISOString(),\n expiresAt: expiresAt.toISOString(),\n files: input.files.map((file) => ({\n ...file,\n id: randomUUID(),\n })),\n metadata: input.metadata,\n status: 'active',\n downloadCount: 0,\n };\n\n await this.store.saveRecord(record);\n this.emitAudit({\n type: 'upload.created',\n boothId: record.boothId,\n recordId: record.id,\n matchCode: record.matchCode,\n detail: { fileCount: record.files.length },\n });\n\n return {\n record,\n downloadUrlPath: `${this.baseDownloadPath}?code=${record.matchCode}`,\n };\n }\n\n async getByMatchCode(matchCode: string): Promise<BoothUploadRecord | null> {\n const normalized = normalizeMatchCode(matchCode);\n const record = await this.store.findByMatchCode(normalized);\n\n if (!record) {\n return null;\n }\n\n if (new Date(record.expiresAt).getTime() <= Date.now() && record.status === 'active') {\n return {\n ...record,\n status: 'expired',\n };\n }\n\n return record;\n }\n\n async markDownloaded(recordId: string): Promise<void> {\n await this.store.incrementDownloadCount(recordId);\n }\n\n async resolveDownloadFilesByCode(\n matchCode: string,\n options?: { requesterKey?: string }\n ): Promise<BoothUploadRecord | null> {\n const requesterKey = options?.requesterKey;\n if (requesterKey && this.redeemGuard) {\n try {\n this.redeemGuard.assertAllowed(requesterKey);\n } catch (error) {\n this.emitAudit({\n type: 'redeem.blocked',\n requesterKey,\n matchCode,\n detail: { message: error instanceof Error ? error.message : 'blocked' },\n });\n throw error;\n }\n }\n\n const record = await this.getByMatchCode(matchCode);\n const success = !!record && record.status === 'active';\n\n if (requesterKey && this.redeemGuard) {\n this.redeemGuard.registerAttempt(requesterKey, success);\n }\n\n if (!success) {\n this.emitAudit({\n type: 'redeem.failed',\n requesterKey,\n matchCode,\n boothId: record?.boothId,\n recordId: record?.id,\n });\n return record;\n }\n\n await this.markDownloaded(record.id);\n const reloaded = this.store.findByRecordId\n ? await this.store.findByRecordId(record.id)\n : await this.getByMatchCode(record.matchCode);\n\n this.emitAudit({\n type: 'redeem.success',\n requesterKey,\n matchCode: record.matchCode,\n boothId: record.boothId,\n recordId: record.id,\n });\n\n return reloaded ?? record;\n }\n}\n","export interface VocaloidBoothConfig {\n boothId: string;\n title: string;\n description?: string;\n defaultTtlHours: number;\n maxFiles: number;\n maxSingleFileSizeMb: number;\n maxTotalFileSizeMb: number;\n allowedExtensions: string[];\n}\n\nexport const defaultVocaloidBoothConfig: VocaloidBoothConfig = {\n boothId: 'default-booth',\n title: 'MMD / Vocaloid 创作文件寄存站',\n description: '上传创作文件并生成匹配码,后续可凭码下载',\n defaultTtlHours: 24 * 14,\n maxFiles: 20,\n maxSingleFileSizeMb: 2048,\n maxTotalFileSizeMb: 5120,\n allowedExtensions: ['zip', '7z', 'rar', 'vsqx', 'vpr', 'vmd', 'pmx', 'wav', 'mp3', 'mp4'],\n};\n\nexport const normalizeVocaloidBoothConfig = (\n input?: Partial<VocaloidBoothConfig>\n): VocaloidBoothConfig => {\n const merged = {\n ...defaultVocaloidBoothConfig,\n ...(input ?? {}),\n };\n\n return {\n ...merged,\n boothId: merged.boothId || defaultVocaloidBoothConfig.boothId,\n title: merged.title || defaultVocaloidBoothConfig.title,\n defaultTtlHours: Math.max(1, merged.defaultTtlHours),\n maxFiles: Math.max(1, merged.maxFiles),\n maxSingleFileSizeMb: Math.max(1, merged.maxSingleFileSizeMb),\n maxTotalFileSizeMb: Math.max(1, merged.maxTotalFileSizeMb),\n allowedExtensions: (merged.allowedExtensions?.length\n ? merged.allowedExtensions\n : defaultVocaloidBoothConfig.allowedExtensions\n ).map((ext) => ext.toLowerCase()),\n };\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\n\nexport interface BoothUploadSubmitPayload {\n boothId: string;\n files: File[];\n nickname?: string;\n contactTail?: string;\n ttlHours?: number;\n}\n\nexport interface BoothUploadPanelProps {\n boothId: string;\n maxFiles?: number;\n maxFileSizeMb?: number;\n accept?: string;\n uploading?: boolean;\n onSubmit: (payload: BoothUploadSubmitPayload) => Promise<void> | void;\n}\n\nexport const BoothUploadPanel: React.FC<BoothUploadPanelProps> = ({\n boothId,\n maxFiles = 10,\n maxFileSizeMb = 2048,\n accept,\n uploading = false,\n onSubmit,\n}) => {\n const [files, setFiles] = useState<File[]>([]);\n const [nickname, setNickname] = useState('');\n const [contactTail, setContactTail] = useState('');\n const [ttlHours, setTtlHours] = useState(24 * 14);\n const [error, setError] = useState<string | null>(null);\n\n const totalSizeMb = useMemo(\n () => files.reduce((acc, file) => acc + file.size, 0) / 1024 / 1024,\n [files]\n );\n\n const addFiles = (newFiles: FileList | null) => {\n if (!newFiles) return;\n const incoming = Array.from(newFiles);\n const next = [...files, ...incoming];\n\n if (next.length > maxFiles) {\n setError(`最多上传 ${maxFiles} 个文件`);\n return;\n }\n\n const oversized = incoming.find((f) => f.size > maxFileSizeMb * 1024 * 1024);\n if (oversized) {\n setError(`文件 ${oversized.name} 超过 ${maxFileSizeMb}MB 限制`);\n return;\n }\n\n setError(null);\n setFiles(next);\n };\n\n const removeFile = (name: string) => setFiles((prev) => prev.filter((f) => f.name !== name));\n\n const handleSubmit = async () => {\n if (files.length === 0) {\n setError('请先选择至少一个文件');\n return;\n }\n setError(null);\n await onSubmit({\n boothId,\n files,\n nickname: nickname || undefined,\n contactTail: contactTail || undefined,\n ttlHours,\n });\n };\n\n return (\n <div className=\"rounded-xl border border-slate-200 bg-white p-4 shadow-sm\">\n <h3 className=\"mb-3 text-lg font-semibold\">上传创作文件</h3>\n\n <input\n type=\"file\"\n multiple\n accept={accept}\n onChange={(e) => addFiles(e.target.files)}\n className=\"mb-3 block w-full text-sm\"\n />\n\n <div className=\"mb-3 grid grid-cols-1 gap-2 md:grid-cols-3\">\n <input\n value={nickname}\n onChange={(e) => setNickname(e.target.value)}\n placeholder=\"昵称(可选)\"\n className=\"rounded-md border px-3 py-2 text-sm\"\n />\n <input\n value={contactTail}\n onChange={(e) => setContactTail(e.target.value)}\n placeholder=\"联系方式后4位(可选)\"\n className=\"rounded-md border px-3 py-2 text-sm\"\n />\n <input\n value={ttlHours}\n type=\"number\"\n min={1}\n onChange={(e) => setTtlHours(Number(e.target.value) || 24)}\n placeholder=\"保存时长(小时)\"\n className=\"rounded-md border px-3 py-2 text-sm\"\n />\n </div>\n\n <div className=\"mb-3 text-xs text-slate-500\">\n 已选 {files.length} 个文件,总计 {totalSizeMb.toFixed(2)} MB\n </div>\n\n <ul className=\"mb-3 max-h-40 overflow-auto rounded-md border border-slate-100 p-2 text-sm\">\n {files.length === 0 && <li className=\"text-slate-400\">尚未选择文件</li>}\n {files.map((file) => (\n <li key={`${file.name}-${file.size}`} className=\"mb-1 flex items-center justify-between gap-2\">\n <span className=\"truncate\">{file.name}</span>\n <button type=\"button\" className=\"text-rose-500\" onClick={() => removeFile(file.name)}>\n 移除\n </button>\n </li>\n ))}\n </ul>\n\n {error && <div className=\"mb-3 rounded-md bg-rose-50 p-2 text-sm text-rose-700\">{error}</div>}\n\n <button\n type=\"button\"\n disabled={uploading}\n onClick={handleSubmit}\n className=\"rounded-md bg-indigo-600 px-3 py-2 text-white disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {uploading ? '上传中...' : '开始上传'}\n </button>\n </div>\n );\n};\n","'use client';\n\nimport React, { useState } from 'react';\nimport type { BoothUploadRecord } from '../types';\n\nexport interface BoothRedeemPanelProps {\n loading?: boolean;\n onRedeem: (matchCode: string) => Promise<BoothUploadRecord | null>;\n}\n\nexport const BoothRedeemPanel: React.FC<BoothRedeemPanelProps> = ({ onRedeem, loading }) => {\n const [matchCode, setMatchCode] = useState('');\n const [record, setRecord] = useState<BoothUploadRecord | null>(null);\n const [error, setError] = useState<string | null>(null);\n\n const handleRedeem = async () => {\n setError(null);\n const result = await onRedeem(matchCode.trim());\n\n if (!result) {\n setRecord(null);\n setError('匹配码不存在,请检查后重试');\n return;\n }\n\n if (result.status !== 'active') {\n setRecord(result);\n setError('匹配码已过期或失效');\n return;\n }\n\n setRecord(result);\n };\n\n return (\n <div className=\"rounded-xl border border-slate-200 bg-white p-4 shadow-sm\">\n <h3 className=\"mb-3 text-lg font-semibold\">凭匹配码下载</h3>\n\n <div className=\"mb-3 flex gap-2\">\n <input\n value={matchCode}\n onChange={(e) => setMatchCode(e.target.value.toUpperCase())}\n placeholder=\"输入匹配码(如 A7K9Q2)\"\n className=\"w-full rounded-md border px-3 py-2 text-sm uppercase\"\n />\n <button\n type=\"button\"\n onClick={handleRedeem}\n disabled={loading}\n className=\"rounded-md bg-slate-900 px-3 py-2 text-white disabled:opacity-50\"\n >\n 查询\n </button>\n </div>\n\n {error && <div className=\"mb-3 rounded-md bg-amber-50 p-2 text-sm text-amber-700\">{error}</div>}\n\n {record && (\n <div className=\"rounded-md border border-slate-100 p-3\">\n <div className=\"mb-2 text-xs text-slate-500\">共 {record.files.length} 个文件</div>\n <ul className=\"space-y-1 text-sm\">\n {record.files.map((file) => (\n <li key={file.id} className=\"flex items-center justify-between gap-2\">\n <span className=\"truncate\">{file.fileName}</span>\n <a href={file.objectKey} className=\"text-indigo-600 hover:underline\" download>\n 下载\n </a>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n};\n","'use client';\n\nimport React from 'react';\n\nexport interface BoothSuccessCardProps {\n matchCode: string;\n expiresAt: string;\n downloadUrlPath: string;\n onCopyCode?: (code: string) => void;\n className?: string;\n}\n\nexport const BoothSuccessCard: React.FC<BoothSuccessCardProps> = ({\n matchCode,\n expiresAt,\n downloadUrlPath,\n onCopyCode,\n className,\n}) => {\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(matchCode);\n } catch {\n // ignore clipboard errors in non-secure contexts\n }\n onCopyCode?.(matchCode);\n };\n\n return (\n <div className={`rounded-xl border border-emerald-200 bg-emerald-50 p-4 text-sm ${className ?? ''}`}>\n <div className=\"mb-2 text-xs text-emerald-800\">上传完成,已生成匹配码</div>\n <div className=\"mb-3 text-2xl font-bold tracking-widest text-emerald-900\">{matchCode}</div>\n <div className=\"mb-3 text-xs text-emerald-800\">过期时间:{new Date(expiresAt).toLocaleString()}</div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"rounded-md bg-emerald-600 px-3 py-2 text-white hover:bg-emerald-700\"\n >\n 复制匹配码\n </button>\n <a\n href={downloadUrlPath}\n className=\"rounded-md border border-emerald-400 bg-white px-3 py-2 text-emerald-700 hover:bg-emerald-100\"\n >\n 打开下载页\n </a>\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport {\n defaultVocaloidBoothConfig,\n normalizeVocaloidBoothConfig,\n type VocaloidBoothConfig,\n} from '../core';\n\nexport interface BoothConfigPageProps {\n initialConfig?: Partial<VocaloidBoothConfig>;\n onSave?: (config: VocaloidBoothConfig) => Promise<void> | void;\n}\n\nexport const BoothConfigPage: React.FC<BoothConfigPageProps> = ({ initialConfig, onSave }) => {\n const [config, setConfig] = useState<VocaloidBoothConfig>(\n normalizeVocaloidBoothConfig(initialConfig)\n );\n const [saving, setSaving] = useState(false);\n\n const extText = useMemo(() => config.allowedExtensions.join(','), [config.allowedExtensions]);\n\n const update = <K extends keyof VocaloidBoothConfig>(key: K, value: VocaloidBoothConfig[K]) =>\n setConfig((prev) => ({ ...prev, [key]: value }));\n\n const save = async () => {\n setSaving(true);\n try {\n const normalized = normalizeVocaloidBoothConfig(config);\n setConfig(normalized);\n await onSave?.(normalized);\n } finally {\n setSaving(false);\n }\n };\n\n const reset = () => setConfig(defaultVocaloidBoothConfig);\n\n return (\n <div className=\"rounded-xl border border-slate-200 bg-white p-4 shadow-sm space-y-3\">\n <h3 className=\"text-lg font-semibold\">Vocaloid Booth 配置页</h3>\n\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-3 text-sm\">\n <input className=\"rounded border px-3 py-2\" value={config.boothId} onChange={(e) => update('boothId', e.target.value)} placeholder=\"boothId\" />\n <input className=\"rounded border px-3 py-2\" value={config.title} onChange={(e) => update('title', e.target.value)} placeholder=\"标题\" />\n <input className=\"rounded border px-3 py-2 md:col-span-2\" value={config.description ?? ''} onChange={(e) => update('description', e.target.value)} placeholder=\"描述\" />\n\n <input className=\"rounded border px-3 py-2\" type=\"number\" value={config.defaultTtlHours} onChange={(e) => update('defaultTtlHours', Number(e.target.value) || 1)} placeholder=\"默认保存时长(小时)\" />\n <input className=\"rounded border px-3 py-2\" type=\"number\" value={config.maxFiles} onChange={(e) => update('maxFiles', Number(e.target.value) || 1)} placeholder=\"最大文件数\" />\n <input className=\"rounded border px-3 py-2\" type=\"number\" value={config.maxSingleFileSizeMb} onChange={(e) => update('maxSingleFileSizeMb', Number(e.target.value) || 1)} placeholder=\"单文件上限 MB\" />\n <input className=\"rounded border px-3 py-2\" type=\"number\" value={config.maxTotalFileSizeMb} onChange={(e) => update('maxTotalFileSizeMb', Number(e.target.value) || 1)} placeholder=\"总大小上限 MB\" />\n\n <textarea\n className=\"rounded border px-3 py-2 md:col-span-2\"\n rows={3}\n value={extText}\n onChange={(e) =>\n update(\n 'allowedExtensions',\n e.target.value\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean)\n )\n }\n placeholder=\"允许后缀,逗号分隔\"\n />\n </div>\n\n <div className=\"flex gap-2\">\n <button className=\"rounded bg-indigo-600 px-3 py-2 text-white\" disabled={saving} onClick={save}>\n {saving ? '保存中...' : '保存配置'}\n </button>\n <button className=\"rounded border px-3 py-2\" onClick={reset}>\n 恢复默认\n </button>\n </div>\n </div>\n );\n};\n","import type { MikuContestConfig, MikuVotingRules } from '../../types';\n\nexport const defaultMikuVotingRules: MikuVotingRules = {\n maxVotesPerDay: 3,\n forbidDuplicateVotePerWork: true,\n maxVotesPerDevicePerDay: 20,\n maxVotesPerIpPerDay: 100,\n};\n\nexport const createDefaultMikuContestConfig = (overrides?: Partial<MikuContestConfig>): MikuContestConfig => ({\n id: overrides?.id || 'miku-contest-default',\n name: overrides?.name || '初音未来社团征稿大赛',\n theme: overrides?.theme || '初音未来主题创作征稿',\n organizer: overrides?.organizer || '初音未来社团',\n awards: overrides?.awards || ['一等奖', '二等奖', '三等奖', '人气奖'],\n rules: overrides?.rules || '请确保作品原创且符合社团规范。',\n copyright: overrides?.copyright || '投稿即视为授权赛事展示与公示。',\n timeline: overrides?.timeline || {\n submissionStartAt: new Date().toISOString(),\n submissionEndAt: new Date().toISOString(),\n votingStartAt: new Date().toISOString(),\n votingEndAt: new Date().toISOString(),\n publicResultAt: new Date().toISOString(),\n },\n votingRules: {\n ...defaultMikuVotingRules,\n ...(overrides?.votingRules || {}),\n },\n toggles: {\n submissionEnabled: overrides?.toggles?.submissionEnabled ?? true,\n votingEnabled: overrides?.toggles?.votingEnabled ?? true,\n resultEnabled: overrides?.toggles?.resultEnabled ?? false,\n },\n});\n","import type { CreateMikuSubmissionInput, MikuWorkType } from '../../types';\n\nconst DESCRIPTION_LIMIT = 500;\nconst MINIAPP_DESCRIPTION_LIMIT = 200;\nconst TEXT_CONTENT_LIMIT = 2000;\nconst MAX_TAGS = 3;\n\nconst hasValue = (value: unknown): boolean => {\n return typeof value === 'string' ? value.trim().length > 0 : value !== null && value !== undefined;\n};\n\nconst validateByType = (type: MikuWorkType, input: CreateMikuSubmissionInput): string[] => {\n const errors: string[] = [];\n const { content } = input;\n\n switch (type) {\n case 'visual': {\n const imageCount = content.images?.length || 0;\n if (imageCount < 1 || imageCount > 3) {\n errors.push('视觉类作品需上传 1-3 张图片');\n }\n break;\n }\n case 'video': {\n if (!hasValue(content.videoLink)) {\n errors.push('视频类作品需提供视频链接');\n }\n if (!hasValue(content.coverImage)) {\n errors.push('视频类作品需提供封面图');\n }\n break;\n }\n case 'text': {\n const text = content.textContent || '';\n if (!text.trim()) {\n errors.push('文字类作品需填写正文');\n }\n if (text.length > TEXT_CONTENT_LIMIT) {\n errors.push(`文字正文不能超过 ${TEXT_CONTENT_LIMIT} 字`);\n }\n break;\n }\n case 'audio': {\n if (!hasValue(content.audioLink)) {\n errors.push('音频类作品需提供音频链接');\n }\n break;\n }\n default:\n break;\n }\n\n return errors;\n};\n\nexport const validateMikuSubmissionInput = (\n input: CreateMikuSubmissionInput,\n mode: 'web' | 'miniapp' = 'web',\n): string[] => {\n const errors: string[] = [];\n\n if (!input.contestId.trim()) errors.push('contestId 不能为空');\n if (!input.authorId.trim()) errors.push('authorId 不能为空');\n if (!input.authorNickname.trim()) errors.push('作者昵称不能为空');\n if (!input.title.trim()) errors.push('作品名称不能为空');\n\n const descriptionLimit = mode === 'miniapp' ? MINIAPP_DESCRIPTION_LIMIT : DESCRIPTION_LIMIT;\n if (input.description.length > descriptionLimit) {\n errors.push(`作品简介不能超过 ${descriptionLimit} 字`);\n }\n\n if ((input.tags?.length || 0) > MAX_TAGS) {\n errors.push(`标签最多 ${MAX_TAGS} 个`);\n }\n\n errors.push(...validateByType(input.type, input));\n return errors;\n};\n","import type { MikuVoteRecord, MikuVotingRules } from '../../types';\n\nexport const toVoteDayKey = (date: Date = new Date()): string => {\n const y = date.getUTCFullYear();\n const m = String(date.getUTCMonth() + 1).padStart(2, '0');\n const d = String(date.getUTCDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n};\n\nexport interface VoteCheckContext {\n existingVotes: MikuVoteRecord[];\n submissionId: string;\n voterId: string;\n dayKey: string;\n rules: MikuVotingRules;\n}\n\nexport const checkVoteEligibility = (context: VoteCheckContext): { ok: boolean; reason?: string } => {\n const { existingVotes, submissionId, voterId, dayKey, rules } = context;\n\n const userTodayVotes = existingVotes.filter((vote) => vote.voterId === voterId && vote.dayKey === dayKey);\n\n if (userTodayVotes.length >= rules.maxVotesPerDay) {\n return { ok: false, reason: '已达到今日投票上限' };\n }\n\n if (rules.forbidDuplicateVotePerWork) {\n const duplicated = userTodayVotes.some((vote) => vote.submissionId === submissionId);\n if (duplicated) return { ok: false, reason: '不可重复投同一作品' };\n }\n\n return { ok: true };\n};\n\nexport const sortByVotesDesc = <T extends { voteCount: number; createdAt?: string }>(items: T[]): T[] => {\n return [...items].sort((a, b) => {\n if (b.voteCount === a.voteCount) {\n return (a.createdAt || '').localeCompare(b.createdAt || '');\n }\n return b.voteCount - a.voteCount;\n });\n};\n","import {\n checkVoteEligibility,\n createDefaultMikuContestConfig,\n sortByVotesDesc,\n toVoteDayKey,\n validateMikuSubmissionInput,\n} from '../logic/shared';\nimport * as XLSX from 'xlsx';\nimport type {\n CreateMikuAnnouncementInput,\n CreateMikuSubmissionInput,\n MikuAnnouncement,\n MikuContestConfig,\n MikuContestPersistedState,\n MikuContestStateSnapshot,\n MikuLeaderboardItem,\n MikuSubmissionExportRow,\n MikuSubmissionFilter,\n MikuSubmission,\n MikuVoterRestriction,\n MikuVoteRecord,\n ResetMikuVotesInput,\n ReviewMikuSubmissionInput,\n SetMikuVoterRestrictionInput,\n VoteMikuSubmissionInput,\n} from '../types';\n\nconst randomId = (prefix: string): string => {\n return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n};\n\nconst serialNo = (): string => {\n const now = new Date();\n const y = now.getFullYear();\n const m = String(now.getMonth() + 1).padStart(2, '0');\n const d = String(now.getDate()).padStart(2, '0');\n const seq = Math.floor(Math.random() * 9000 + 1000);\n return `MIKU-${y}${m}${d}-${seq}`;\n};\n\nexport interface MikuContestServiceOptions {\n contestConfig?: Partial<MikuContestConfig>;\n}\n\nexport class MikuContestService {\n private contest: MikuContestConfig;\n\n private readonly submissions = new Map<string, MikuSubmission>();\n\n private readonly votes: MikuVoteRecord[] = [];\n\n private readonly announcements = new Map<string, MikuAnnouncement>();\n\n private readonly voterRestrictions = new Map<string, MikuVoterRestriction>();\n\n constructor(options: MikuContestServiceOptions = {}) {\n this.contest = createDefaultMikuContestConfig(options.contestConfig);\n }\n\n getContestConfig(): MikuContestConfig {\n return this.contest;\n }\n\n updateContestConfig(patch: Partial<MikuContestConfig>): MikuContestConfig {\n this.contest = {\n ...this.contest,\n ...patch,\n votingRules: {\n ...this.contest.votingRules,\n ...(patch.votingRules || {}),\n },\n toggles: {\n ...this.contest.toggles,\n ...(patch.toggles || {}),\n },\n timeline: {\n ...this.contest.timeline,\n ...(patch.timeline || {}),\n },\n };\n\n return this.contest;\n }\n\n createSubmission(input: CreateMikuSubmissionInput, mode: 'web' | 'miniapp' = 'web'): MikuSubmission {\n if (!this.contest.toggles.submissionEnabled) {\n throw new Error('当前未开放投稿');\n }\n\n const errors = validateMikuSubmissionInput(input, mode);\n if (errors.length > 0) {\n throw new Error(errors.join(';'));\n }\n\n const now = new Date().toISOString();\n const next: MikuSubmission = {\n id: randomId('submission'),\n serialNo: serialNo(),\n contestId: input.contestId,\n authorId: input.authorId,\n authorNickname: input.authorNickname,\n title: input.title,\n type: input.type,\n description: input.description,\n tags: input.tags || [],\n content: input.content,\n voteCount: 0,\n status: 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.submissions.set(next.id, next);\n return next;\n }\n\n listSubmissions(filter?: MikuSubmissionFilter): MikuSubmission[] {\n const authorKeyword = filter?.authorKeyword?.trim().toLowerCase();\n const titleKeyword = filter?.titleKeyword?.trim().toLowerCase();\n\n return [...this.submissions.values()].filter((item) => {\n if (filter?.status && item.status !== filter.status) return false;\n if (filter?.type && item.type !== filter.type) return false;\n if (filter?.authorId && item.authorId !== filter.authorId) return false;\n if (authorKeyword && !item.authorNickname.toLowerCase().includes(authorKeyword)) return false;\n if (titleKeyword && !item.title.toLowerCase().includes(titleKeyword)) return false;\n return true;\n });\n }\n\n getSubmission(submissionId: string): MikuSubmission | null {\n return this.submissions.get(submissionId) || null;\n }\n\n reviewSubmission(input: ReviewMikuSubmissionInput): MikuSubmission {\n const current = this.submissions.get(input.submissionId);\n if (!current) throw new Error('投稿不存在');\n\n if (input.action === 'reject' && !input.rejectReason?.trim()) {\n throw new Error('驳回需填写原因');\n }\n\n const reviewed: MikuSubmission = {\n ...current,\n status: input.action === 'approve' ? 'approved' : 'rejected',\n rejectReason: input.action === 'reject' ? input.rejectReason?.trim() : undefined,\n reviewedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n this.submissions.set(reviewed.id, reviewed);\n return reviewed;\n }\n\n vote(input: VoteMikuSubmissionInput): MikuSubmission {\n if (!this.contest.toggles.votingEnabled) {\n throw new Error('当前未开放投票');\n }\n\n const restriction = this.voterRestrictions.get(input.voterId);\n if (restriction?.banned) {\n throw new Error('当前账号已被限制投票');\n }\n\n const target = this.submissions.get(input.submissionId);\n if (!target) throw new Error('作品不存在');\n if (target.status !== 'approved') throw new Error('仅可对已过审作品投票');\n\n const dayKey = toVoteDayKey();\n const eligible = checkVoteEligibility({\n existingVotes: this.votes,\n submissionId: input.submissionId,\n voterId: input.voterId,\n dayKey,\n rules: this.contest.votingRules,\n });\n\n if (!eligible.ok) {\n throw new Error(eligible.reason || '投票失败');\n }\n\n const vote: MikuVoteRecord = {\n id: randomId('vote'),\n contestId: input.contestId,\n submissionId: input.submissionId,\n voterId: input.voterId,\n votedAt: new Date().toISOString(),\n dayKey,\n deviceId: input.deviceId,\n ip: input.ip,\n };\n\n this.votes.push(vote);\n\n const updated: MikuSubmission = {\n ...target,\n voteCount: target.voteCount + 1,\n updatedAt: new Date().toISOString(),\n };\n this.submissions.set(updated.id, updated);\n\n return updated;\n }\n\n getVoterRestriction(voterId: string): MikuVoterRestriction | null {\n return this.voterRestrictions.get(voterId) || null;\n }\n\n setVoterRestriction(input: SetMikuVoterRestrictionInput): MikuVoterRestriction {\n const next: MikuVoterRestriction = {\n voterId: input.voterId,\n banned: input.banned,\n reason: input.reason,\n operatorId: input.operatorId,\n updatedAt: new Date().toISOString(),\n };\n\n this.voterRestrictions.set(input.voterId, next);\n return next;\n }\n\n resetVotes(input: ResetMikuVotesInput): { removedVotes: number; affectedSubmissions: string[] } {\n if (!input.submissionId && !input.voterId) {\n throw new Error('submissionId 与 voterId 至少提供一个');\n }\n\n const before = this.votes.length;\n const affected = new Set<string>();\n const remained = this.votes.filter((vote) => {\n const matchSubmission = input.submissionId ? vote.submissionId === input.submissionId : true;\n const matchVoter = input.voterId ? vote.voterId === input.voterId : true;\n const shouldRemove = matchSubmission && matchVoter;\n if (shouldRemove) affected.add(vote.submissionId);\n return !shouldRemove;\n });\n\n this.votes.length = 0;\n this.votes.push(...remained);\n this.recalculateVoteCounts();\n\n return {\n removedVotes: before - remained.length,\n affectedSubmissions: [...affected],\n };\n }\n\n listAnnouncements(contestId?: string): MikuAnnouncement[] {\n const all = [...this.announcements.values()];\n return contestId ? all.filter((item) => item.contestId === contestId) : all;\n }\n\n publishAnnouncement(input: CreateMikuAnnouncementInput): MikuAnnouncement {\n const now = new Date().toISOString();\n const announcement: MikuAnnouncement = {\n id: randomId('notice'),\n contestId: input.contestId,\n title: input.title,\n content: input.content,\n type: input.type,\n createdBy: input.createdBy,\n createdAt: now,\n updatedAt: now,\n };\n\n this.announcements.set(announcement.id, announcement);\n return announcement;\n }\n\n getLeaderboard(limit = 10): MikuLeaderboardItem[] {\n const ranked = sortByVotesDesc(this.listSubmissions({ status: 'approved' })).slice(0, limit);\n return ranked.map((item, index) => ({\n submissionId: item.id,\n title: item.title,\n authorNickname: item.authorNickname,\n voteCount: item.voteCount,\n rank: index + 1,\n }));\n }\n\n getSnapshot(): MikuContestStateSnapshot {\n return {\n contest: this.contest,\n submissions: this.listSubmissions(),\n announcements: this.listAnnouncements(),\n leaderboard: this.getLeaderboard(),\n };\n }\n\n getSubmissionExportRows(filter?: MikuSubmissionFilter): MikuSubmissionExportRow[] {\n return this.listSubmissions(filter).map((item) => ({\n 投稿编号: item.serialNo,\n 投稿ID: item.id,\n 赛事ID: item.contestId,\n 作者ID: item.authorId,\n 作者昵称: item.authorNickname,\n 作品名称: item.title,\n 作品类型: item.type,\n 简介: item.description,\n 标签: item.tags.join(','),\n 审核状态: item.status,\n 驳回原因: item.rejectReason || '',\n 票数: item.voteCount,\n 提交时间: item.createdAt,\n 更新时间: item.updatedAt,\n }));\n }\n\n exportSubmissionExcel(filter?: MikuSubmissionFilter): Uint8Array {\n const rows = this.getSubmissionExportRows(filter);\n const workbook = XLSX.utils.book_new();\n const worksheet = XLSX.utils.json_to_sheet(rows);\n XLSX.utils.book_append_sheet(workbook, worksheet, 'submissions');\n return XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' }) as Uint8Array;\n }\n\n private recalculateVoteCounts(): void {\n const counts = new Map<string, number>();\n for (const vote of this.votes) {\n counts.set(vote.submissionId, (counts.get(vote.submissionId) || 0) + 1);\n }\n\n for (const [id, submission] of this.submissions.entries()) {\n const nextCount = counts.get(id) || 0;\n if (submission.voteCount === nextCount) continue;\n this.submissions.set(id, {\n ...submission,\n voteCount: nextCount,\n updatedAt: new Date().toISOString(),\n });\n }\n }\n\n exportPersistenceState(): MikuContestPersistedState {\n return {\n contest: this.contest,\n submissions: [...this.submissions.values()],\n votes: [...this.votes],\n announcements: [...this.announcements.values()],\n voterRestrictions: [...this.voterRestrictions.values()],\n updatedAt: new Date().toISOString(),\n };\n }\n\n importPersistenceState(state: MikuContestPersistedState): void {\n this.contest = state.contest;\n this.submissions.clear();\n this.announcements.clear();\n this.voterRestrictions.clear();\n this.votes.length = 0;\n\n for (const item of state.submissions) {\n this.submissions.set(item.id, item);\n }\n for (const item of state.announcements) {\n this.announcements.set(item.id, item);\n }\n for (const item of state.voterRestrictions) {\n this.voterRestrictions.set(item.voterId, item);\n }\n this.votes.push(...state.votes);\n }\n}\n\nexport const createMikuContestService = (options?: MikuContestServiceOptions): MikuContestService => {\n return new MikuContestService(options);\n};\n","import { integer, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport type {\n MikuAnnouncement,\n MikuContestConfig,\n MikuSubmissionContent,\n MikuVoterRestriction,\n MikuVoteRecord,\n} from '../../types';\n\nexport const mikuContestConfigs = pgTable('miku_contest_configs', {\n contestId: text('contest_id').primaryKey(),\n config: jsonb('config').$type<MikuContestConfig>().notNull(),\n createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),\n});\n\nexport const mikuContestSubmissions = pgTable('miku_contest_submissions', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n serialNo: text('serial_no').notNull(),\n authorId: text('author_id').notNull(),\n authorNickname: text('author_nickname').notNull(),\n title: text('title').notNull(),\n type: text('type').notNull(),\n description: text('description').notNull(),\n tags: jsonb('tags').$type<string[]>().notNull(),\n content: jsonb('content').$type<MikuSubmissionContent>().notNull(),\n voteCount: integer('vote_count').notNull().default(0),\n status: text('status').notNull(),\n rejectReason: text('reject_reason'),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull(),\n reviewedAt: timestamp('reviewed_at', { withTimezone: true }),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull(),\n});\n\nexport const mikuContestVotes = pgTable('miku_contest_votes', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n submissionId: text('submission_id').notNull(),\n voterId: text('voter_id').notNull(),\n votedAt: text('voted_at').notNull(),\n dayKey: text('day_key').notNull(),\n deviceId: text('device_id'),\n ip: text('ip'),\n});\n\nexport const mikuContestNotices = pgTable('miku_contest_notices', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n title: text('title').notNull(),\n content: text('content').notNull(),\n type: text('type').notNull(),\n createdBy: text('created_by').notNull(),\n createdAt: text('created_at').notNull(),\n updatedAt: text('updated_at').notNull(),\n});\n\nexport const mikuContestVoterRestrictions = pgTable('miku_contest_voter_restrictions', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n data: jsonb('data').$type<MikuVoterRestriction>().notNull(),\n});\n\nexport type MikuContestVoteRow = typeof mikuContestVotes.$inferSelect & MikuVoteRecord;\nexport type MikuContestNoticeRow = typeof mikuContestNotices.$inferSelect & MikuAnnouncement;\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */\nimport { eq } from 'drizzle-orm';\nimport type { MikuAnnouncement, MikuContestPersistedState, MikuSubmission, MikuVoterRestriction, MikuVoteRecord } from '../../types';\nimport {\n mikuContestConfigs,\n mikuContestNotices,\n mikuContestSubmissions,\n mikuContestVotes,\n mikuContestVoterRestrictions,\n} from './drizzle-schema';\nimport type { DrizzleLikeDb } from './types';\n\nexport class MikuContestStateDbService {\n constructor(private readonly db: DrizzleLikeDb) {}\n\n async loadState(contestId: string): Promise<MikuContestPersistedState | null> {\n const configRows = await this.db\n .select({ config: mikuContestConfigs.config })\n .from(mikuContestConfigs)\n .where(eq(mikuContestConfigs.contestId, contestId))\n .limit(1);\n\n const config = configRows[0]?.config;\n if (!config) return null;\n\n const [submissions, votes, announcements, restrictions] = await Promise.all([\n this.db\n .select()\n .from(mikuContestSubmissions)\n .where(eq(mikuContestSubmissions.contestId, contestId)),\n this.db\n .select()\n .from(mikuContestVotes)\n .where(eq(mikuContestVotes.contestId, contestId)),\n this.db\n .select()\n .from(mikuContestNotices)\n .where(eq(mikuContestNotices.contestId, contestId)),\n this.db\n .select({ data: mikuContestVoterRestrictions.data })\n .from(mikuContestVoterRestrictions)\n .where(eq(mikuContestVoterRestrictions.contestId, contestId)),\n ]);\n\n return {\n contest: config,\n submissions: submissions as MikuSubmission[],\n votes: votes as MikuVoteRecord[],\n announcements: announcements as MikuAnnouncement[],\n voterRestrictions: restrictions.map((item: { data: MikuVoterRestriction }) => item.data),\n updatedAt: new Date().toISOString(),\n };\n }\n\n async saveState(state: MikuContestPersistedState): Promise<void> {\n const contestId = state.contest.id;\n\n const exists = await this.db\n .select({ contestId: mikuContestConfigs.contestId })\n .from(mikuContestConfigs)\n .where(eq(mikuContestConfigs.contestId, contestId))\n .limit(1);\n\n if (exists[0]) {\n await this.db\n .update(mikuContestConfigs)\n .set({\n config: state.contest,\n updatedAt: new Date(),\n })\n .where(eq(mikuContestConfigs.contestId, contestId));\n } else {\n await this.db.insert(mikuContestConfigs).values({\n contestId,\n config: state.contest,\n });\n }\n\n await this.db.delete(mikuContestSubmissions).where(eq(mikuContestSubmissions.contestId, contestId));\n await this.db.delete(mikuContestVotes).where(eq(mikuContestVotes.contestId, contestId));\n await this.db.delete(mikuContestNotices).where(eq(mikuContestNotices.contestId, contestId));\n await this.db\n .delete(mikuContestVoterRestrictions)\n .where(eq(mikuContestVoterRestrictions.contestId, contestId));\n\n if (state.submissions.length > 0) {\n await this.db.insert(mikuContestSubmissions).values(\n state.submissions.map((item) => ({\n ...item,\n contestId,\n createdAt: new Date(item.createdAt),\n reviewedAt: item.reviewedAt ? new Date(item.reviewedAt) : null,\n updatedAt: new Date(item.updatedAt),\n })),\n );\n }\n\n if (state.votes.length > 0) {\n await this.db.insert(mikuContestVotes).values(state.votes);\n }\n\n if (state.announcements.length > 0) {\n await this.db.insert(mikuContestNotices).values(state.announcements);\n }\n\n if (state.voterRestrictions.length > 0) {\n await this.db.insert(mikuContestVoterRestrictions).values(\n state.voterRestrictions.map((item) => ({\n id: `${contestId}:${item.voterId}`,\n contestId,\n data: item,\n })),\n );\n }\n }\n}\n","import { MikuContestStateDbService } from './drizzle-state-service';\nimport type { MikuContestPersistenceAdapter, DrizzleLikeDb } from './types';\n\nexport const createMikuContestDrizzlePersistenceAdapter = (\n db: DrizzleLikeDb,\n): MikuContestPersistenceAdapter => {\n const service = new MikuContestStateDbService(db);\n\n return {\n loadState: (contestId: string) => service.loadState(contestId),\n saveState: (state) => service.saveState(state),\n };\n};\n\nexport type { DrizzleLikeDb } from './types';\n","import { createMikuContestService, type MikuContestService, type MikuContestServiceOptions } from '../service';\nimport type {\n CreateMikuAnnouncementInput,\n CreateMikuSubmissionInput,\n MikuAnnouncement,\n MikuContestConfig,\n MikuContestStateSnapshot,\n MikuLeaderboardItem,\n MikuSubmission,\n MikuSubmissionExportRow,\n MikuSubmissionFilter,\n MikuVoterRestriction,\n ResetMikuVotesInput,\n ReviewMikuSubmissionInput,\n SetMikuVoterRestrictionInput,\n VoteMikuSubmissionInput,\n} from '../../types';\nimport type { MikuContestPersistenceAdapter } from './types';\n\nexport interface MikuContestPersistentServiceOptions extends MikuContestServiceOptions {\n persistenceAdapter: MikuContestPersistenceAdapter;\n}\n\nexport class MikuContestPersistentService {\n private readonly engine: MikuContestService;\n\n private hydrated = false;\n\n private hydrationPromise: Promise<void> | null = null;\n\n constructor(private readonly options: MikuContestPersistentServiceOptions) {\n this.engine = createMikuContestService(options);\n }\n\n private async ensureHydrated(): Promise<void> {\n if (this.hydrated) return;\n if (this.hydrationPromise) return this.hydrationPromise;\n\n this.hydrationPromise = (async () => {\n const contestId = this.engine.getContestConfig().id;\n const loaded = await this.options.persistenceAdapter.loadState(contestId);\n if (loaded) {\n this.engine.importPersistenceState(loaded);\n } else {\n await this.options.persistenceAdapter.saveState(this.engine.exportPersistenceState());\n }\n this.hydrated = true;\n })();\n\n await this.hydrationPromise;\n }\n\n private async persist(): Promise<void> {\n await this.options.persistenceAdapter.saveState(this.engine.exportPersistenceState());\n }\n\n async getContestConfig(): Promise<MikuContestConfig> {\n await this.ensureHydrated();\n return this.engine.getContestConfig();\n }\n\n async updateContestConfig(patch: Partial<MikuContestConfig>): Promise<MikuContestConfig> {\n await this.ensureHydrated();\n const data = this.engine.updateContestConfig(patch);\n await this.persist();\n return data;\n }\n\n async createSubmission(\n input: CreateMikuSubmissionInput,\n mode: 'web' | 'miniapp' = 'web',\n ): Promise<MikuSubmission> {\n await this.ensureHydrated();\n const data = this.engine.createSubmission(input, mode);\n await this.persist();\n return data;\n }\n\n async listSubmissions(filter?: MikuSubmissionFilter): Promise<MikuSubmission[]> {\n await this.ensureHydrated();\n return this.engine.listSubmissions(filter);\n }\n\n async getSubmission(submissionId: string): Promise<MikuSubmission | null> {\n await this.ensureHydrated();\n return this.engine.getSubmission(submissionId);\n }\n\n async reviewSubmission(input: ReviewMikuSubmissionInput): Promise<MikuSubmission> {\n await this.ensureHydrated();\n const data = this.engine.reviewSubmission(input);\n await this.persist();\n return data;\n }\n\n async vote(input: VoteMikuSubmissionInput): Promise<MikuSubmission> {\n await this.ensureHydrated();\n const data = this.engine.vote(input);\n await this.persist();\n return data;\n }\n\n async getVoterRestriction(voterId: string): Promise<MikuVoterRestriction | null> {\n await this.ensureHydrated();\n return this.engine.getVoterRestriction(voterId);\n }\n\n async setVoterRestriction(input: SetMikuVoterRestrictionInput): Promise<MikuVoterRestriction> {\n await this.ensureHydrated();\n const data = this.engine.setVoterRestriction(input);\n await this.persist();\n return data;\n }\n\n async resetVotes(input: ResetMikuVotesInput): Promise<{ removedVotes: number; affectedSubmissions: string[] }> {\n await this.ensureHydrated();\n const data = this.engine.resetVotes(input);\n await this.persist();\n return data;\n }\n\n async listAnnouncements(contestId?: string): Promise<MikuAnnouncement[]> {\n await this.ensureHydrated();\n return this.engine.listAnnouncements(contestId);\n }\n\n async publishAnnouncement(input: CreateMikuAnnouncementInput): Promise<MikuAnnouncement> {\n await this.ensureHydrated();\n const data = this.engine.publishAnnouncement(input);\n await this.persist();\n return data;\n }\n\n async getLeaderboard(limit = 10): Promise<MikuLeaderboardItem[]> {\n await this.ensureHydrated();\n return this.engine.getLeaderboard(limit);\n }\n\n async getSnapshot(): Promise<MikuContestStateSnapshot> {\n await this.ensureHydrated();\n return this.engine.getSnapshot();\n }\n\n async getSubmissionExportRows(filter?: MikuSubmissionFilter): Promise<MikuSubmissionExportRow[]> {\n await this.ensureHydrated();\n return this.engine.getSubmissionExportRows(filter);\n }\n\n async exportSubmissionExcel(filter?: MikuSubmissionFilter): Promise<Uint8Array> {\n await this.ensureHydrated();\n return this.engine.exportSubmissionExcel(filter);\n }\n}\n\nexport const createMikuContestPersistentService = (\n options: MikuContestPersistentServiceOptions,\n): MikuContestPersistentService => {\n return new MikuContestPersistentService(options);\n};\n","import type { DrizzleLikeDb } from './persistence';\n\nclass MikuContestDbService {\n private _db: DrizzleLikeDb | null = null;\n\n setDb(db: DrizzleLikeDb): void {\n this._db = db;\n }\n\n isConfigured(): boolean {\n return Boolean(this._db);\n }\n\n get db(): DrizzleLikeDb {\n if (!this._db) {\n throw new Error('MikuContestDbService: Database instance not set. Call setDb(db) first.');\n }\n return this._db;\n }\n}\n\nexport const mikuContestDbService = new MikuContestDbService();\n","import { useMemo, useState } from 'react';\nimport { createMikuContestService, type MikuContestServiceOptions } from '../../server';\n\nexport const useMikuContest = (options?: MikuContestServiceOptions) => {\n const [service] = useState(() => createMikuContestService(options));\n const [version, setVersion] = useState(0);\n\n const refresh = () => setVersion((value) => value + 1);\n\n const snapshot = useMemo(() => {\n void version;\n return service.getSnapshot();\n }, [service, version]);\n\n return {\n service,\n snapshot,\n refresh,\n };\n};\n","import type {\n CreateMikuSubmissionInput,\n MikuContestConfig,\n MikuContestStateSnapshot,\n MikuSubmission,\n MikuSubmissionFilter,\n MikuVoterRestriction,\n ResetMikuVotesInput,\n ReviewMikuSubmissionInput,\n SetMikuVoterRestrictionInput,\n VoteMikuSubmissionInput,\n} from '../../types';\n\nexport interface MikuContestApiClient {\n getSnapshot(): Promise<MikuContestStateSnapshot>;\n updateContestConfig(patch: Partial<MikuContestConfig>): Promise<MikuContestConfig>;\n createSubmission(input: CreateMikuSubmissionInput, mode?: 'web' | 'miniapp'): Promise<MikuSubmission>;\n listSubmissions(filter?: MikuSubmissionFilter): Promise<MikuSubmission[]>;\n reviewSubmission(input: ReviewMikuSubmissionInput): Promise<MikuSubmission>;\n vote(input: VoteMikuSubmissionInput): Promise<MikuSubmission>;\n setVoterRestriction(input: SetMikuVoterRestrictionInput): Promise<MikuVoterRestriction>;\n resetVotes(input: ResetMikuVotesInput): Promise<{ removedVotes: number; affectedSubmissions: string[] }>;\n exportSubmissions(filter?: MikuSubmissionFilter): Promise<ArrayBuffer>;\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'PATCH';\n\nexport interface Requester {\n <T>(url: string, options?: { method?: HttpMethod; body?: unknown }): Promise<T>;\n}\n\nconst toQueryString = (filter?: MikuSubmissionFilter): string => {\n if (!filter) return '';\n const params = new URLSearchParams();\n if (filter.status) params.set('status', filter.status);\n if (filter.type) params.set('type', filter.type);\n if (filter.authorId) params.set('authorId', filter.authorId);\n if (filter.authorKeyword) params.set('authorKeyword', filter.authorKeyword);\n if (filter.titleKeyword) params.set('titleKeyword', filter.titleKeyword);\n const query = params.toString();\n return query ? `?${query}` : '';\n};\n\ninterface ApiEnvelope<T> {\n success: boolean;\n data?: T;\n error?: string;\n}\n\nconst unwrap = <T>(result: ApiEnvelope<T>): T => {\n if (!result.success || result.data === undefined) {\n throw new Error(result.error || '请求失败');\n }\n return result.data;\n};\n\nexport const createMikuContestApiClient = (\n basePath: string,\n requester: Requester,\n): MikuContestApiClient => {\n return {\n async getSnapshot() {\n const result = await requester<ApiEnvelope<MikuContestStateSnapshot>>(`${basePath}/contest`, { method: 'GET' });\n return unwrap(result);\n },\n async updateContestConfig(patch) {\n const result = await requester<ApiEnvelope<MikuContestConfig>>(`${basePath}/contest`, {\n method: 'PATCH',\n body: patch,\n });\n return unwrap(result);\n },\n async createSubmission(input, mode = 'web') {\n const result = await requester<ApiEnvelope<MikuSubmission>>(`${basePath}/submissions`, {\n method: 'POST',\n body: { payload: input, mode },\n });\n return unwrap(result);\n },\n async listSubmissions(filter) {\n const result = await requester<ApiEnvelope<MikuSubmission[]>>(\n `${basePath}/submissions${toQueryString(filter)}`,\n { method: 'GET' },\n );\n return unwrap(result);\n },\n async reviewSubmission(input) {\n const result = await requester<ApiEnvelope<MikuSubmission>>(`${basePath}/submissions/review`, {\n method: 'POST',\n body: input,\n });\n return unwrap(result);\n },\n async vote(input) {\n const result = await requester<ApiEnvelope<MikuSubmission>>(`${basePath}/votes`, {\n method: 'POST',\n body: input,\n });\n return unwrap(result);\n },\n async setVoterRestriction(input) {\n const result = await requester<ApiEnvelope<MikuVoterRestriction>>(`${basePath}/admin/voter-restrictions`, {\n method: 'POST',\n body: input,\n });\n return unwrap(result);\n },\n async resetVotes(input) {\n const result = await requester<ApiEnvelope<{ removedVotes: number; affectedSubmissions: string[] }>>(\n `${basePath}/admin/votes/reset`,\n {\n method: 'POST',\n body: input,\n },\n );\n return unwrap(result);\n },\n async exportSubmissions(filter) {\n const response = await fetch(`${basePath}/admin/submissions/export${toQueryString(filter)}`);\n if (!response.ok) {\n throw new Error(`导出失败: ${response.status}`);\n }\n return response.arrayBuffer();\n },\n };\n};\n","export * from './client';\n","import { createMikuContestApiClient, type Requester } from '../api';\n\nexport interface MikuContestWebClientOptions {\n baseUrl?: string;\n basePath?: string;\n headers?: Record<string, string>;\n}\n\nconst defaultRequester = (options: MikuContestWebClientOptions): Requester => {\n const baseUrl = options.baseUrl || '';\n const commonHeaders = options.headers || {};\n\n return async <T>(url: string, requestOptions?: { method?: 'GET' | 'POST' | 'PATCH'; body?: unknown }): Promise<T> => {\n const response = await fetch(`${baseUrl}${url}`, {\n method: requestOptions?.method || 'GET',\n headers: {\n 'Content-Type': 'application/json',\n ...commonHeaders,\n },\n body: requestOptions?.body ? JSON.stringify(requestOptions.body) : undefined,\n });\n\n const json = (await response.json()) as T;\n return json;\n };\n};\n\nexport const createMikuContestWebClient = (options: MikuContestWebClientOptions = {}) => {\n const basePath = options.basePath || '/api/miku-contest';\n return createMikuContestApiClient(basePath, defaultRequester(options));\n};\n","export * from './client';\n","import { createMikuContestApiClient, type Requester } from '../api';\n\nexport interface MikuContestMiniappClientOptions {\n basePath?: string;\n requester: Requester;\n}\n\nexport const createMikuContestMiniappClient = (options: MikuContestMiniappClientOptions) => {\n const basePath = options.basePath || '/api/miku-contest';\n return createMikuContestApiClient(basePath, options.requester);\n};\n","import { NextResponse } from 'next/server';\nimport { createMikuContestService } from '../server';\nimport type { MikuContestService } from '../server';\nimport {\n createMikuContestDrizzlePersistenceAdapter,\n createMikuContestPersistentService,\n type DrizzleLikeDb,\n type MikuContestPersistenceAdapter,\n} from '../server/persistence';\nimport type { NextRequest } from 'next/server';\nimport type {\n CreateMikuSubmissionInput,\n MikuContestConfig,\n MikuContestStateSnapshot,\n MikuSubmission,\n MikuSubmissionFilter,\n MikuSubmissionStatus,\n MikuWorkType,\n ResetMikuVotesInput,\n ReviewMikuSubmissionInput,\n SetMikuVoterRestrictionInput,\n VoteMikuSubmissionInput,\n MikuVoterRestriction,\n} from '../types';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport interface MikuContestServiceLike {\n getSnapshot(): MaybePromise<MikuContestStateSnapshot>;\n createSubmission(input: CreateMikuSubmissionInput, mode?: 'web' | 'miniapp'): MaybePromise<MikuSubmission>;\n vote(input: VoteMikuSubmissionInput): MaybePromise<MikuSubmission>;\n reviewSubmission(input: ReviewMikuSubmissionInput): MaybePromise<MikuSubmission>;\n listSubmissions(filter?: MikuSubmissionFilter): MaybePromise<MikuSubmission[]>;\n setVoterRestriction(input: SetMikuVoterRestrictionInput): MaybePromise<MikuVoterRestriction>;\n resetVotes(input: ResetMikuVotesInput): MaybePromise<{ removedVotes: number; affectedSubmissions: string[] }>;\n exportSubmissionExcel(filter?: MikuSubmissionFilter): MaybePromise<Uint8Array>;\n updateContestConfig(patch: Partial<MikuContestConfig>): MaybePromise<MikuContestConfig>;\n}\n\nexport interface MikuContestRouteConfig {\n service?: MikuContestServiceLike;\n persistenceAdapter?: MikuContestPersistenceAdapter;\n db?: unknown;\n}\n\nconst isDrizzleDb = (value: unknown): value is DrizzleLikeDb => {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.select === 'function' &&\n typeof candidate.insert === 'function' &&\n typeof candidate.update === 'function' &&\n typeof candidate.delete === 'function'\n );\n};\n\nconst resolveService = (config?: MikuContestRouteConfig): MikuContestServiceLike => {\n if (config?.service) return config.service;\n\n const adapter =\n config?.persistenceAdapter || (isDrizzleDb(config?.db) ? createMikuContestDrizzlePersistenceAdapter(config.db) : null);\n\n if (adapter) {\n return createMikuContestPersistentService({\n persistenceAdapter: adapter,\n });\n }\n\n return createMikuContestService();\n};\n\nexport const createGetContestSnapshotHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (_request: NextRequest) => {\n const data = await service.getSnapshot();\n return NextResponse.json({ success: true, data });\n };\n};\n\nexport const createUpdateContestConfigHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Partial<MikuContestConfig>;\n const data = await service.updateContestConfig(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createCreateSubmissionHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const body = (await request.json()) as {\n mode?: 'web' | 'miniapp';\n payload?: CreateMikuSubmissionInput;\n };\n\n const mode = body.mode || 'web';\n const payload = body.payload;\n if (!payload) {\n return NextResponse.json({ success: false, error: 'payload 不能为空' }, { status: 400 });\n }\n\n const data = await service.createSubmission(payload, mode);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createVoteHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['vote']>[0];\n const data = await service.vote(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createReviewSubmissionHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['reviewSubmission']>[0];\n const data = await service.reviewSubmission(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nconst buildSubmissionFilterFromQuery = (request: NextRequest): MikuSubmissionFilter => {\n const search = request.nextUrl.searchParams;\n const status = search.get('status');\n const type = search.get('type');\n\n return {\n status: status ? (status as MikuSubmissionStatus) : undefined,\n type: type ? (type as MikuWorkType) : undefined,\n authorId: search.get('authorId') || undefined,\n authorKeyword: search.get('authorKeyword') || undefined,\n titleKeyword: search.get('titleKeyword') || undefined,\n };\n};\n\nexport const createListSubmissionsHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n const filter = buildSubmissionFilterFromQuery(request);\n const data = await service.listSubmissions(filter);\n return NextResponse.json({ success: true, data });\n };\n};\n\nexport const createSetVoterRestrictionHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['setVoterRestriction']>[0];\n const data = await service.setVoterRestriction(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createResetVotesHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['resetVotes']>[0];\n const data = await service.resetVotes(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createExportSubmissionsHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n const filter = buildSubmissionFilterFromQuery(request);\n const data = await service.exportSubmissionExcel(filter);\n const body = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n return new NextResponse(body, {\n status: 200,\n headers: {\n 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'Content-Disposition': 'attachment; filename=\"miku-submissions.xlsx\"',\n },\n });\n };\n};\n","export { default as MikuContestDashboard } from './components/MikuContestDashboard';\nexport { default as MikuContestPage } from './pages/MikuContestPage';\nexport { default as MikuContestAudiencePage } from './pages/MikuContestAudiencePage';\nexport { default as MikuContestArtistPage } from './pages/MikuContestArtistPage';\nexport { default as MikuContestAdminPage } from './pages/MikuContestAdminPage';\n","import React from 'react';\nimport type { MikuContestStateSnapshot } from '../../../types';\n\nexport interface MikuContestDashboardProps {\n snapshot: MikuContestStateSnapshot;\n}\n\nconst MikuContestDashboard: React.FC<MikuContestDashboardProps> = ({ snapshot }) => {\n return (\n <div>\n <h2>{snapshot.contest.name}</h2>\n <p>{snapshot.contest.theme}</p>\n <p>投稿数:{snapshot.submissions.length}</p>\n <p>公告数:{snapshot.announcements.length}</p>\n <ul>\n {snapshot.leaderboard.map((item) => (\n <li key={item.submissionId}>\n #{item.rank} {item.title} - {item.voteCount}票\n </li>\n ))}\n </ul>\n </div>\n );\n};\n\nexport default MikuContestDashboard;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { createMikuContestWebClient } from '../../../service/web';\nimport type { MikuContestApiClient } from '../../../service/api';\nimport type { MikuContestStateSnapshot, MikuSubmission } from '../../../types';\n\nexport interface MikuContestAudiencePageProps {\n client?: Pick<MikuContestApiClient, 'getSnapshot' | 'vote'>;\n voterId: string;\n title?: string;\n}\n\nconst MikuContestAudiencePage: React.FC<MikuContestAudiencePageProps> = ({\n client,\n voterId,\n title = '观众投票区',\n}) => {\n const api = useMemo(() => client || createMikuContestWebClient(), [client]);\n\n const [snapshot, setSnapshot] = useState<MikuContestStateSnapshot | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const approvedWorks = useMemo(() => {\n if (!snapshot) return [];\n return snapshot.submissions.filter((item) => item.status === 'approved');\n }, [snapshot]);\n\n const loadSnapshot = async () => {\n setLoading(true);\n setError(null);\n try {\n const data = await api.getSnapshot();\n setSnapshot(data);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void loadSnapshot();\n }, []);\n\n const handleVote = async (submission: MikuSubmission) => {\n if (!snapshot) return;\n try {\n await api.vote({\n contestId: snapshot.contest.id,\n submissionId: submission.id,\n voterId,\n });\n await loadSnapshot();\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n return (\n <section>\n <h2>{title}</h2>\n <button onClick={() => void loadSnapshot()} disabled={loading}>\n {loading ? '刷新中...' : '刷新数据'}\n </button>\n {error ? <p style={{ color: 'crimson' }}>错误:{error}</p> : null}\n\n {!snapshot ? null : (\n <>\n <p>\n 赛事:{snapshot.contest.name}|主题:{snapshot.contest.theme}\n </p>\n <p>\n 已过审作品:{approvedWorks.length}|每日上限:{snapshot.contest.votingRules.maxVotesPerDay}\n </p>\n <ul>\n {approvedWorks.map((work) => (\n <li key={work.id}>\n <strong>{work.title}</strong>({work.authorNickname})- 当前 {work.voteCount} 票{' '}\n <button onClick={() => void handleVote(work)}>投票</button>\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n );\n};\n\nexport default MikuContestAudiencePage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { createMikuContestWebClient } from '../../../service/web';\nimport type { MikuContestApiClient } from '../../../service/api';\nimport type { CreateMikuSubmissionInput, MikuContestStateSnapshot, MikuSubmission, MikuWorkType } from '../../../types';\n\nexport interface MikuContestArtistPageProps {\n client?: Pick<MikuContestApiClient, 'getSnapshot' | 'createSubmission' | 'listSubmissions'>;\n authorId: string;\n authorNickname: string;\n title?: string;\n}\n\nconst workTypes: MikuWorkType[] = ['visual', 'video', 'text', 'audio'];\n\nconst MikuContestArtistPage: React.FC<MikuContestArtistPageProps> = ({\n client,\n authorId,\n authorNickname,\n title = '画师投稿区',\n}) => {\n const api = useMemo(() => client || createMikuContestWebClient(), [client]);\n\n const [snapshot, setSnapshot] = useState<MikuContestStateSnapshot | null>(null);\n const [mySubmissions, setMySubmissions] = useState<MikuSubmission[]>([]);\n const [submitting, setSubmitting] = useState(false);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n const [titleInput, setTitleInput] = useState('');\n const [descInput, setDescInput] = useState('');\n const [coverImage, setCoverImage] = useState('');\n const [workType, setWorkType] = useState<MikuWorkType>('visual');\n\n const loadData = async () => {\n setLoading(true);\n setError(null);\n try {\n const [contest, mine] = await Promise.all([\n api.getSnapshot(),\n api.listSubmissions({ authorId }),\n ]);\n setSnapshot(contest);\n setMySubmissions(mine);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void loadData();\n }, []);\n\n const submitWork = async () => {\n if (!snapshot) return;\n const payload: CreateMikuSubmissionInput = {\n contestId: snapshot.contest.id,\n authorId,\n authorNickname,\n title: titleInput,\n description: descInput,\n type: workType,\n tags: ['web'],\n content: {\n coverImage,\n images: coverImage ? [coverImage] : undefined,\n },\n };\n\n setSubmitting(true);\n setError(null);\n try {\n await api.createSubmission(payload, 'web');\n setTitleInput('');\n setDescInput('');\n setCoverImage('');\n await loadData();\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <section>\n <h2>{title}</h2>\n <button onClick={() => void loadData()} disabled={loading}>\n {loading ? '刷新中...' : '刷新数据'}\n </button>\n {error ? <p style={{ color: 'crimson' }}>错误:{error}</p> : null}\n\n <div>\n <h3>新建投稿</h3>\n <input value={titleInput} onChange={(e) => setTitleInput(e.target.value)} placeholder=\"作品标题\" />\n <br />\n <textarea value={descInput} onChange={(e) => setDescInput(e.target.value)} placeholder=\"作品简介\" />\n <br />\n <input value={coverImage} onChange={(e) => setCoverImage(e.target.value)} placeholder=\"封面 URL\" />\n <br />\n <select value={workType} onChange={(e) => setWorkType(e.target.value as MikuWorkType)}>\n {workTypes.map((item) => (\n <option value={item} key={item}>\n {item}\n </option>\n ))}\n </select>\n <button onClick={() => void submitWork()} disabled={submitting || !snapshot}>\n {submitting ? '提交中...' : '提交稿件'}\n </button>\n </div>\n\n <div>\n <h3>我的投稿({mySubmissions.length})</h3>\n <ul>\n {mySubmissions.map((item) => (\n <li key={item.id}>\n {item.title}|状态:{item.status}|票数:{item.voteCount}\n {item.rejectReason ? `|驳回:${item.rejectReason}` : ''}\n </li>\n ))}\n </ul>\n </div>\n </section>\n );\n};\n\nexport default MikuContestArtistPage;\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { createMikuContestWebClient } from '../../../service/web';\nimport type { MikuContestApiClient } from '../../../service/api';\nimport type { MikuContestStateSnapshot, MikuSubmission } from '../../../types';\n\nexport interface MikuContestAdminPageProps {\n client?: Pick<\n MikuContestApiClient,\n | 'getSnapshot'\n | 'listSubmissions'\n | 'reviewSubmission'\n | 'setVoterRestriction'\n | 'resetVotes'\n | 'exportSubmissions'\n | 'updateContestConfig'\n >;\n adminId: string;\n title?: string;\n}\n\nconst MikuContestAdminPage: React.FC<MikuContestAdminPageProps> = ({\n client,\n adminId,\n title = '管理员面板',\n}) => {\n const api = useMemo(() => client || createMikuContestWebClient(), [client]);\n\n const [snapshot, setSnapshot] = useState<MikuContestStateSnapshot | null>(null);\n const [submissions, setSubmissions] = useState<MikuSubmission[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [voterId, setVoterId] = useState('');\n\n const loadData = async () => {\n setLoading(true);\n setError(null);\n try {\n const [contest, list] = await Promise.all([api.getSnapshot(), api.listSubmissions()]);\n setSnapshot(contest);\n setSubmissions(list);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n void loadData();\n }, []);\n\n const review = async (item: MikuSubmission, action: 'approve' | 'reject') => {\n try {\n await api.reviewSubmission({\n submissionId: item.id,\n reviewerId: adminId,\n action,\n rejectReason: action === 'reject' ? '管理员驳回' : undefined,\n });\n await loadData();\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const toggleVoting = async (enabled: boolean) => {\n if (!snapshot) return;\n try {\n await api.updateContestConfig({\n toggles: {\n ...snapshot.contest.toggles,\n votingEnabled: enabled,\n },\n });\n await loadData();\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const setRestriction = async (banned: boolean) => {\n if (!snapshot || !voterId.trim()) return;\n try {\n await api.setVoterRestriction({\n voterId: voterId.trim(),\n banned,\n reason: banned ? '管理员手动封禁' : '管理员解除封禁',\n operatorId: adminId,\n });\n setVoterId('');\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const resetVotesByVoter = async () => {\n if (!voterId.trim()) return;\n try {\n await api.resetVotes({ voterId: voterId.trim() });\n setVoterId('');\n await loadData();\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const exportExcel = async () => {\n try {\n const data = await api.exportSubmissions();\n const blob = new Blob([data], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'miku-submissions.xlsx';\n a.click();\n URL.revokeObjectURL(url);\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n return (\n <section>\n <h2>{title}</h2>\n <button onClick={() => void loadData()} disabled={loading}>\n {loading ? '刷新中...' : '刷新数据'}\n </button>\n {error ? <p style={{ color: 'crimson' }}>错误:{error}</p> : null}\n\n <div>\n <h3>赛事开关</h3>\n <button onClick={() => void toggleVoting(true)} disabled={!snapshot}>\n 开启投票\n </button>\n <button onClick={() => void toggleVoting(false)} disabled={!snapshot}>\n 关闭投票\n </button>\n </div>\n\n <div>\n <h3>投稿审核({submissions.length})</h3>\n <ul>\n {submissions.map((item) => (\n <li key={item.id}>\n <strong>{item.title}</strong>|作者:{item.authorNickname}|状态:{item.status}|票数:{item.voteCount}\n {item.status === 'pending' ? (\n <>\n {' '}\n <button onClick={() => void review(item, 'approve')}>通过</button>\n <button onClick={() => void review(item, 'reject')}>驳回</button>\n </>\n ) : null}\n </li>\n ))}\n </ul>\n </div>\n\n <div>\n <h3>投票风控</h3>\n <input value={voterId} onChange={(e) => setVoterId(e.target.value)} placeholder=\"voterId\" />\n <button onClick={() => void setRestriction(true)} disabled={!snapshot}>\n 封禁投票\n </button>\n <button onClick={() => void setRestriction(false)} disabled={!snapshot}>\n 解除封禁\n </button>\n <button onClick={() => void resetVotesByVoter()}>清零该用户票数</button>\n </div>\n\n <div>\n <h3>导出</h3>\n <button onClick={() => void exportExcel()}>导出投稿 Excel</button>\n </div>\n </section>\n );\n};\n\nexport default MikuContestAdminPage;\n","import React, { useState } from 'react';\nimport MikuContestAudiencePage from './MikuContestAudiencePage';\nimport MikuContestArtistPage from './MikuContestArtistPage';\nimport MikuContestAdminPage from './MikuContestAdminPage';\n\ntype MikuContestView = 'audience' | 'artist' | 'admin';\n\nexport interface MikuContestPageProps {\n defaultView?: MikuContestView;\n viewerVoterId?: string;\n artistId?: string;\n artistNickname?: string;\n adminId?: string;\n}\n\nconst MikuContestPage: React.FC<MikuContestPageProps> = ({\n defaultView = 'audience',\n viewerVoterId = 'viewer-demo',\n artistId = 'artist-demo',\n artistNickname = 'Demo 画师',\n adminId = 'admin-demo',\n}) => {\n const [view, setView] = useState<MikuContestView>(defaultView);\n\n return (\n <div>\n <h1>Miku Contest</h1>\n <div>\n <button onClick={() => setView('audience')}>观众端</button>\n <button onClick={() => setView('artist')}>画师端</button>\n <button onClick={() => setView('admin')}>管理员端</button>\n </div>\n\n {view === 'audience' ? <MikuContestAudiencePage voterId={viewerVoterId} /> : null}\n {view === 'artist' ? <MikuContestArtistPage authorId={artistId} authorNickname={artistNickname} /> : null}\n {view === 'admin' ? <MikuContestAdminPage adminId={adminId} /> : null}\n </div>\n );\n};\n\nexport default MikuContestPage;\n","export { default as MikuContestMiniappHome } from './components/MikuContestMiniappHome';\nexport { default as MikuContestMiniappPage } from './pages/MikuContestMiniappPage';\n","import React from 'react';\nimport type { MikuContestStateSnapshot } from '../../../types';\n\nexport interface MikuContestMiniappHomeProps {\n snapshot: MikuContestStateSnapshot;\n}\n\nconst MikuContestMiniappHome: React.FC<MikuContestMiniappHomeProps> = ({ snapshot }) => {\n return (\n <div>\n <h3>{snapshot.contest.name}</h3>\n <p>投稿:{snapshot.submissions.length} | 公告:{snapshot.announcements.length}</p>\n <ol>\n {snapshot.leaderboard.slice(0, 3).map((item) => (\n <li key={item.submissionId}>\n {item.title}({item.voteCount}票)\n </li>\n ))}\n </ol>\n </div>\n );\n};\n\nexport default MikuContestMiniappHome;\n","import React, { useMemo, useState } from 'react';\nimport { useMikuContest } from '../../../logic';\nimport type { MikuWorkType } from '../../../types';\n\nconst MikuContestMiniappPage: React.FC = () => {\n const { service, snapshot, refresh } = useMikuContest();\n\n const [tab, setTab] = useState<'vote' | 'submit'>('vote');\n const [voterId, setVoterId] = useState('miniapp-voter');\n const [authorId, setAuthorId] = useState('miniapp-author');\n const [authorNickname, setAuthorNickname] = useState('小程序画师');\n const [title, setTitle] = useState('');\n const [desc, setDesc] = useState('');\n const [type, setType] = useState<MikuWorkType>('visual');\n const [error, setError] = useState<string | null>(null);\n\n const approvedWorks = useMemo(() => {\n return snapshot.submissions.filter((item) => item.status === 'approved');\n }, [snapshot.submissions]);\n\n const vote = (submissionId: string) => {\n try {\n service.vote({\n contestId: snapshot.contest.id,\n submissionId,\n voterId,\n });\n refresh();\n setError(null);\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const submit = () => {\n try {\n service.createSubmission(\n {\n contestId: snapshot.contest.id,\n authorId,\n authorNickname,\n title,\n description: desc,\n type,\n content: {},\n },\n 'miniapp',\n );\n setTitle('');\n setDesc('');\n refresh();\n setError(null);\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n return (\n <div>\n <h3>{snapshot.contest.name}</h3>\n <p>小程序端示例页面</p>\n <button onClick={() => setTab('vote')}>观众投票</button>\n <button onClick={() => setTab('submit')}>画师投稿</button>\n\n {error ? <p style={{ color: 'crimson' }}>错误:{error}</p> : null}\n\n {tab === 'vote' ? (\n <div>\n <input value={voterId} onChange={(e) => setVoterId(e.target.value)} placeholder=\"voterId\" />\n <ul>\n {approvedWorks.map((item) => (\n <li key={item.id}>\n {item.title}({item.voteCount}票)\n <button onClick={() => vote(item.id)}>投票</button>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {tab === 'submit' ? (\n <div>\n <input value={authorId} onChange={(e) => setAuthorId(e.target.value)} placeholder=\"authorId\" />\n <input value={authorNickname} onChange={(e) => setAuthorNickname(e.target.value)} placeholder=\"作者昵称\" />\n <input value={title} onChange={(e) => setTitle(e.target.value)} placeholder=\"作品标题\" />\n <input value={desc} onChange={(e) => setDesc(e.target.value)} placeholder=\"作品简介\" />\n <select value={type} onChange={(e) => setType(e.target.value as MikuWorkType)}>\n <option value=\"visual\">visual</option>\n <option value=\"video\">video</option>\n <option value=\"text\">text</option>\n <option value=\"audio\">audio</option>\n </select>\n <button onClick={submit}>提交</button>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default MikuContestMiniappPage;\n"]}