sa2kit 1.6.30 → 1.6.31

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 (237) hide show
  1. package/dist/AliyunOSSProvider-P6TOVKMM.mjs +6 -0
  2. package/dist/{AliyunOSSProvider-KJYRIZES.mjs.map → AliyunOSSProvider-P6TOVKMM.mjs.map} +1 -1
  3. package/dist/AliyunOSSProvider-Z5BRBCG6.js +15 -0
  4. package/dist/{AliyunOSSProvider-FWAKUB2T.js.map → AliyunOSSProvider-Z5BRBCG6.js.map} +1 -1
  5. package/dist/ConfigService-3DIC6C3Q.js +21 -0
  6. package/dist/{ConfigService-7MEZXKJ5.js.map → ConfigService-3DIC6C3Q.js.map} +1 -1
  7. package/dist/ConfigService-V6ZK273Z.mjs +4 -0
  8. package/dist/{ConfigService-BV57YYFW.mjs.map → ConfigService-V6ZK273Z.mjs.map} +1 -1
  9. package/dist/LocalStorageProvider-3RVPCQB3.mjs +6 -0
  10. package/dist/{LocalStorageProvider-RTPMUOZ2.mjs.map → LocalStorageProvider-3RVPCQB3.mjs.map} +1 -1
  11. package/dist/LocalStorageProvider-PP7MA5OT.js +15 -0
  12. package/dist/{LocalStorageProvider-XSRCUXOU.js.map → LocalStorageProvider-PP7MA5OT.js.map} +1 -1
  13. package/dist/PMXParser-2VTA737I.js +13 -0
  14. package/dist/{PMXParser-YBS3B6HM.js.map → PMXParser-2VTA737I.js.map} +1 -1
  15. package/dist/PMXParser-RNVQL76A.mjs +4 -0
  16. package/dist/{PMXParser-L6IWHL4I.mjs.map → PMXParser-RNVQL76A.mjs.map} +1 -1
  17. package/dist/analytics/index.js +46 -45
  18. package/dist/analytics/index.js.map +1 -1
  19. package/dist/analytics/index.mjs +45 -44
  20. package/dist/analytics/index.mjs.map +1 -1
  21. package/dist/analytics/server/index.js +4 -4
  22. package/dist/analytics/server/index.js.map +1 -1
  23. package/dist/analytics/server/index.mjs +4 -4
  24. package/dist/analytics/server/index.mjs.map +1 -1
  25. package/dist/api/index.js +5 -5
  26. package/dist/api/index.js.map +1 -1
  27. package/dist/api/index.mjs +5 -5
  28. package/dist/api/index.mjs.map +1 -1
  29. package/dist/audioDetection/index.js +17 -16
  30. package/dist/audioDetection/index.js.map +1 -1
  31. package/dist/audioDetection/index.mjs +17 -16
  32. package/dist/audioDetection/index.mjs.map +1 -1
  33. package/dist/auth/client/index.js +4 -4
  34. package/dist/auth/client/index.mjs +1 -1
  35. package/dist/auth/components/index.js +3 -3
  36. package/dist/auth/components/index.js.map +1 -1
  37. package/dist/auth/components/index.mjs +3 -3
  38. package/dist/auth/components/index.mjs.map +1 -1
  39. package/dist/auth/index.js +29 -29
  40. package/dist/auth/index.mjs +5 -5
  41. package/dist/auth/middleware/index.js +3 -3
  42. package/dist/auth/middleware/index.mjs +2 -2
  43. package/dist/auth/routes/index.js +14 -14
  44. package/dist/auth/routes/index.mjs +2 -2
  45. package/dist/auth/services/index.js +7 -7
  46. package/dist/auth/services/index.mjs +1 -1
  47. package/dist/calendar/index.js +146 -182
  48. package/dist/calendar/index.js.map +1 -1
  49. package/dist/calendar/index.mjs +139 -175
  50. package/dist/calendar/index.mjs.map +1 -1
  51. package/dist/calendar/routes/index.js +1 -1
  52. package/dist/calendar/routes/index.js.map +1 -1
  53. package/dist/calendar/routes/index.mjs +1 -1
  54. package/dist/calendar/routes/index.mjs.map +1 -1
  55. package/dist/{chunk-5YQ5B7IZ.js → chunk-24HGREE6.js} +5 -5
  56. package/dist/{chunk-5YQ5B7IZ.js.map → chunk-24HGREE6.js.map} +1 -1
  57. package/dist/{chunk-6PRFP5EG.js → chunk-25OFOKNF.js} +6 -6
  58. package/dist/chunk-25OFOKNF.js.map +1 -0
  59. package/dist/{chunk-KQGP6BTS.mjs → chunk-3DXPQ4YV.mjs} +6 -6
  60. package/dist/chunk-3DXPQ4YV.mjs.map +1 -0
  61. package/dist/{chunk-3BGPZN4X.mjs → chunk-3NHAT7D4.mjs} +12 -12
  62. package/dist/chunk-3NHAT7D4.mjs.map +1 -0
  63. package/dist/{chunk-MW4BCIZC.mjs → chunk-4HC6M7FK.mjs} +3 -3
  64. package/dist/chunk-4HC6M7FK.mjs.map +1 -0
  65. package/dist/{chunk-ESRCX5TQ.mjs → chunk-52TN2QSS.mjs} +3 -3
  66. package/dist/{chunk-ESRCX5TQ.mjs.map → chunk-52TN2QSS.mjs.map} +1 -1
  67. package/dist/{chunk-DW2ZTOCV.js → chunk-5A7ERLKK.js} +105 -106
  68. package/dist/chunk-5A7ERLKK.js.map +1 -0
  69. package/dist/{chunk-CNTILN5J.mjs → chunk-5YQ62BKX.mjs} +20 -19
  70. package/dist/chunk-5YQ62BKX.mjs.map +1 -0
  71. package/dist/{chunk-6W5BMXJG.js → chunk-6OWNMJKG.js} +4 -4
  72. package/dist/{chunk-6W5BMXJG.js.map → chunk-6OWNMJKG.js.map} +1 -1
  73. package/dist/{chunk-TV3VKRJK.mjs → chunk-77M5AQG3.mjs} +37 -37
  74. package/dist/chunk-77M5AQG3.mjs.map +1 -0
  75. package/dist/{chunk-DUHZ7VZP.js → chunk-7VRT55ZD.js} +3 -3
  76. package/dist/chunk-7VRT55ZD.js.map +1 -0
  77. package/dist/{chunk-LX4XX6W7.js → chunk-C54W2CMK.js} +16 -16
  78. package/dist/chunk-C54W2CMK.js.map +1 -0
  79. package/dist/{chunk-3WOAPLEG.mjs → chunk-EB4NR623.mjs} +27 -26
  80. package/dist/chunk-EB4NR623.mjs.map +1 -0
  81. package/dist/{chunk-CD77U7LZ.js → chunk-GBPLX42J.js} +9 -9
  82. package/dist/chunk-GBPLX42J.js.map +1 -0
  83. package/dist/{chunk-TFQF2HDO.mjs → chunk-HDEOCX2L.mjs} +12 -12
  84. package/dist/chunk-HDEOCX2L.mjs.map +1 -0
  85. package/dist/{chunk-LFG6FPM5.mjs → chunk-KIP2CERU.mjs} +37 -38
  86. package/dist/chunk-KIP2CERU.mjs.map +1 -0
  87. package/dist/{chunk-6YKMCPQI.mjs → chunk-KZKIH4AS.mjs} +4 -4
  88. package/dist/chunk-KZKIH4AS.mjs.map +1 -0
  89. package/dist/{chunk-6MQUBPKB.mjs → chunk-LJ4CCSSY.mjs} +3 -3
  90. package/dist/{chunk-6MQUBPKB.mjs.map → chunk-LJ4CCSSY.mjs.map} +1 -1
  91. package/dist/{chunk-TOC5FSHP.js → chunk-NJ2SNXBJ.js} +12 -12
  92. package/dist/chunk-NJ2SNXBJ.js.map +1 -0
  93. package/dist/{chunk-OCR5DS4C.mjs → chunk-PE5EAHZK.mjs} +3 -3
  94. package/dist/chunk-PE5EAHZK.mjs.map +1 -0
  95. package/dist/{chunk-LZHMNOED.js → chunk-Q5EDCKQA.js} +26 -26
  96. package/dist/chunk-Q5EDCKQA.js.map +1 -0
  97. package/dist/{chunk-CLKKZSPZ.js → chunk-RBKGYWME.js} +20 -19
  98. package/dist/chunk-RBKGYWME.js.map +1 -0
  99. package/dist/{chunk-VRTRSEEH.mjs → chunk-RSJSZ7QH.mjs} +11 -11
  100. package/dist/chunk-RSJSZ7QH.mjs.map +1 -0
  101. package/dist/{chunk-E7RGBAYJ.js → chunk-TDCDEBGP.js} +30 -29
  102. package/dist/chunk-TDCDEBGP.js.map +1 -0
  103. package/dist/{chunk-T5OZHYVM.mjs → chunk-TVROG2Q4.mjs} +15 -15
  104. package/dist/chunk-TVROG2Q4.mjs.map +1 -0
  105. package/dist/{chunk-JZXJQMVE.js → chunk-UIFFDRTE.js} +11 -11
  106. package/dist/chunk-UIFFDRTE.js.map +1 -0
  107. package/dist/{chunk-UOFTHYIH.js → chunk-UL6XJGUZ.js} +4 -4
  108. package/dist/chunk-UL6XJGUZ.js.map +1 -0
  109. package/dist/{chunk-A3UP56MS.js → chunk-WA67GZSZ.js} +3 -3
  110. package/dist/chunk-WA67GZSZ.js.map +1 -0
  111. package/dist/{chunk-OLHGZXN3.mjs → chunk-WEEXCPSE.mjs} +5 -5
  112. package/dist/chunk-WEEXCPSE.mjs.map +1 -0
  113. package/dist/{chunk-OPPF3326.js → chunk-X3UU7JHT.js} +38 -38
  114. package/dist/chunk-X3UU7JHT.js.map +1 -0
  115. package/dist/{chunk-QU5OT4DF.js → chunk-XJ7ZAGC5.js} +5 -5
  116. package/dist/chunk-XJ7ZAGC5.js.map +1 -0
  117. package/dist/{chunk-ZI25QCHD.mjs → chunk-YOTQG4NP.mjs} +25 -25
  118. package/dist/chunk-YOTQG4NP.mjs.map +1 -0
  119. package/dist/{chunk-QAT2RWAO.mjs → chunk-Z36R3P62.mjs} +7 -7
  120. package/dist/chunk-Z36R3P62.mjs.map +1 -0
  121. package/dist/{chunk-7Z5LLJ3A.js → chunk-ZWQJSZEY.js} +13 -13
  122. package/dist/chunk-ZWQJSZEY.js.map +1 -0
  123. package/dist/config/index.js +6 -6
  124. package/dist/config/index.js.map +1 -1
  125. package/dist/config/index.mjs +6 -6
  126. package/dist/config/index.mjs.map +1 -1
  127. package/dist/config/server/index.js +37 -37
  128. package/dist/config/server/index.js.map +1 -1
  129. package/dist/config/server/index.mjs +37 -37
  130. package/dist/config/server/index.mjs.map +1 -1
  131. package/dist/i18n/index.d.mts +2 -2
  132. package/dist/i18n/index.d.ts +2 -2
  133. package/dist/i18n/index.js +16 -17
  134. package/dist/i18n/index.js.map +1 -1
  135. package/dist/i18n/index.mjs +16 -17
  136. package/dist/i18n/index.mjs.map +1 -1
  137. package/dist/imageCrop/index.js +11 -10
  138. package/dist/imageCrop/index.js.map +1 -1
  139. package/dist/imageCrop/index.mjs +11 -10
  140. package/dist/imageCrop/index.mjs.map +1 -1
  141. package/dist/index.js +221 -246
  142. package/dist/index.js.map +1 -1
  143. package/dist/index.mjs +79 -104
  144. package/dist/index.mjs.map +1 -1
  145. package/dist/logger/index.js +6 -6
  146. package/dist/logger/index.mjs +1 -1
  147. package/dist/mmd/admin/index.js +11 -10
  148. package/dist/mmd/admin/index.js.map +1 -1
  149. package/dist/mmd/admin/index.mjs +11 -10
  150. package/dist/mmd/admin/index.mjs.map +1 -1
  151. package/dist/mmd/index.js +223 -241
  152. package/dist/mmd/index.js.map +1 -1
  153. package/dist/mmd/index.mjs +220 -238
  154. package/dist/mmd/index.mjs.map +1 -1
  155. package/dist/mmd/server/index.js +6 -6
  156. package/dist/mmd/server/index.js.map +1 -1
  157. package/dist/mmd/server/index.mjs +6 -6
  158. package/dist/mmd/server/index.mjs.map +1 -1
  159. package/dist/music/index.js +16 -16
  160. package/dist/music/index.mjs +2 -2
  161. package/dist/music/server/index.js +8 -8
  162. package/dist/music/server/index.mjs +1 -1
  163. package/dist/request/index.js +2 -2
  164. package/dist/request/index.js.map +1 -1
  165. package/dist/request/index.mjs +2 -2
  166. package/dist/request/index.mjs.map +1 -1
  167. package/dist/storage/index.js +11 -11
  168. package/dist/storage/index.mjs +2 -2
  169. package/dist/testYourself/admin/index.js +3 -3
  170. package/dist/testYourself/admin/index.mjs +1 -1
  171. package/dist/testYourself/index.js +22 -22
  172. package/dist/testYourself/index.js.map +1 -1
  173. package/dist/testYourself/index.mjs +14 -14
  174. package/dist/testYourself/index.mjs.map +1 -1
  175. package/dist/testYourself/server/index.js +4 -4
  176. package/dist/testYourself/server/index.mjs +1 -1
  177. package/dist/universalExport/index.d.mts +3 -3
  178. package/dist/universalExport/index.d.ts +3 -3
  179. package/dist/universalExport/index.js +48 -47
  180. package/dist/universalExport/index.js.map +1 -1
  181. package/dist/universalExport/index.mjs +48 -47
  182. package/dist/universalExport/index.mjs.map +1 -1
  183. package/dist/universalExport/server/index.js +29 -29
  184. package/dist/universalExport/server/index.js.map +1 -1
  185. package/dist/universalExport/server/index.mjs +28 -28
  186. package/dist/universalExport/server/index.mjs.map +1 -1
  187. package/dist/universalFile/index.d.mts +3 -3
  188. package/dist/universalFile/index.d.ts +3 -3
  189. package/dist/universalFile/index.js +73 -72
  190. package/dist/universalFile/index.js.map +1 -1
  191. package/dist/universalFile/index.mjs +73 -72
  192. package/dist/universalFile/index.mjs.map +1 -1
  193. package/dist/universalFile/server/index.js +258 -260
  194. package/dist/universalFile/server/index.js.map +1 -1
  195. package/dist/universalFile/server/index.mjs +244 -246
  196. package/dist/universalFile/server/index.mjs.map +1 -1
  197. package/dist/utils/index.js +11 -11
  198. package/dist/utils/index.mjs +2 -2
  199. package/package.json +1 -1
  200. package/dist/AliyunOSSProvider-FWAKUB2T.js +0 -15
  201. package/dist/AliyunOSSProvider-KJYRIZES.mjs +0 -6
  202. package/dist/ConfigService-7MEZXKJ5.js +0 -21
  203. package/dist/ConfigService-BV57YYFW.mjs +0 -4
  204. package/dist/LocalStorageProvider-RTPMUOZ2.mjs +0 -6
  205. package/dist/LocalStorageProvider-XSRCUXOU.js +0 -15
  206. package/dist/PMXParser-L6IWHL4I.mjs +0 -4
  207. package/dist/PMXParser-YBS3B6HM.js +0 -13
  208. package/dist/chunk-3BGPZN4X.mjs.map +0 -1
  209. package/dist/chunk-3WOAPLEG.mjs.map +0 -1
  210. package/dist/chunk-6PRFP5EG.js.map +0 -1
  211. package/dist/chunk-6YKMCPQI.mjs.map +0 -1
  212. package/dist/chunk-7Z5LLJ3A.js.map +0 -1
  213. package/dist/chunk-A3UP56MS.js.map +0 -1
  214. package/dist/chunk-CD77U7LZ.js.map +0 -1
  215. package/dist/chunk-CLKKZSPZ.js.map +0 -1
  216. package/dist/chunk-CNTILN5J.mjs.map +0 -1
  217. package/dist/chunk-DUHZ7VZP.js.map +0 -1
  218. package/dist/chunk-DW2ZTOCV.js.map +0 -1
  219. package/dist/chunk-E7RGBAYJ.js.map +0 -1
  220. package/dist/chunk-JZXJQMVE.js.map +0 -1
  221. package/dist/chunk-KQGP6BTS.mjs.map +0 -1
  222. package/dist/chunk-LFG6FPM5.mjs.map +0 -1
  223. package/dist/chunk-LX4XX6W7.js.map +0 -1
  224. package/dist/chunk-LZHMNOED.js.map +0 -1
  225. package/dist/chunk-MW4BCIZC.mjs.map +0 -1
  226. package/dist/chunk-OCR5DS4C.mjs.map +0 -1
  227. package/dist/chunk-OLHGZXN3.mjs.map +0 -1
  228. package/dist/chunk-OPPF3326.js.map +0 -1
  229. package/dist/chunk-QAT2RWAO.mjs.map +0 -1
  230. package/dist/chunk-QU5OT4DF.js.map +0 -1
  231. package/dist/chunk-T5OZHYVM.mjs.map +0 -1
  232. package/dist/chunk-TFQF2HDO.mjs.map +0 -1
  233. package/dist/chunk-TOC5FSHP.js.map +0 -1
  234. package/dist/chunk-TV3VKRJK.mjs.map +0 -1
  235. package/dist/chunk-UOFTHYIH.js.map +0 -1
  236. package/dist/chunk-VRTRSEEH.mjs.map +0 -1
  237. package/dist/chunk-ZI25QCHD.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/Button.tsx","../src/components/Card.tsx","../src/components/Badge.tsx","../src/components/Input.tsx","../src/components/Label.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"],"names":["cva","React","Slot","cn","React2","React3","React4","React5","LabelPrimitive","TabsPrimitive","React6","DialogPrimitive","React7","X","AlertDialogPrimitive","React8","DropdownMenuPrimitive","React9","ChevronRight","Check","Circle","PopoverPrimitive","React10","React11","ProgressPrimitive","React12","ScrollAreaPrimitive","SelectPrimitive","React13","ChevronDown","ChevronUp","Separator","React14","SeparatorPrimitive","SheetPrimitive","React15","React16","TooltipPrimitive","React17","React18","AvatarPrimitive","useRef","useState","useEffect","draggedBall","width","height","mousePos","useCallback","RotateCcw","Save","AlertCircle","GripVertical","useRouter"],"mappings":"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","file":"chunk-DW2ZTOCV.js","sourcesContent":["import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } 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, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...(props as any)}\n />\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 * as LabelPrimitive from \"@radix-ui/react-label\"\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 React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...(props as any)}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"../utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\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 = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\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 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow\",\n className\n )}\n {...(props as any)}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\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))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-[9999] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...(props as any)}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...(props as any)}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\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 React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\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 = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\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\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimport { cn } from \"../utils\"\nimport { buttonVariants } from \"./Button\"\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-[50] bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...(props as any)}\n ref={ref}\n />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[9999] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className\n )}\n {...(props as any)}\n />\n </AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({\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)\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\n\nconst AlertDialogFooter = ({\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)\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\n\nconst AlertDialogTitle = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold\", className)}\n {...(props as any)}\n />\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(buttonVariants(), className)}\n {...(props as any)}\n />\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\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 = AlertDialogPrimitive.Cancel.displayName\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 * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...(props as any)}\n >\n {children}\n <ChevronRight className=\"ml-auto\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\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 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...(props as any)}\n />\n))\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n className\n )}\n {...(props as any)}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\n inset && \"pl-8\",\n className\n )}\n {...(props as any)}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n checked={checked}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...(props as any)}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold\",\n inset && \"pl-8\",\n className\n )}\n {...(props as any)}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n {...(props as any)}\n />\n )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\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\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"../utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n className\n )}\n {...(props as any)}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"../utils\"\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\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 <ProgressPrimitive.Indicator\n className=\"h-full w-full flex-1 bg-primary transition-all\"\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"../utils\"\n\nconst ScrollArea = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(\"relative overflow-hidden\", className)}\n {...(props as any)}\n >\n <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className\n )}\n {...(props as any)}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\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 data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-1 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n className\n )}\n {...(props as any)}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <ChevronDown className=\"h-4 w-4 opacity-50\" />\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...(props as any)}\n >\n <ChevronUp className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\n \"flex cursor-default items-center justify-center py-1\",\n className\n )}\n {...(props as any)}\n >\n <ChevronDown className=\"h-4 w-4\" />\n </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n position === \"popper\" &&\n \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n className\n )}\n position={position}\n {...(props as any)}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 text-sm font-semibold\", className)}\n {...(props as any)}\n />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\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 focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className\n )}\n {...(props as any)}\n >\n <span className=\"absolute right-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...(props as any)}\n />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\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\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n 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 = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className\n )}\n {...(props as any)}\n ref={ref}\n />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500 data-[state=open]:animate-in data-[state=closed]:animate-out\",\n {\n variants: {\n side: {\n top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n bottom:\n \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n right:\n \"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n },\n },\n defaultVariants: {\n side: \"right\",\n },\n }\n)\n\ninterface SheetContentProps\n extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Content>,\n SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n ref={ref}\n className={cn(sheetVariants({ side }), className)}\n {...(props as any)}\n >\n <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </SheetPrimitive.Close>\n {children}\n </SheetPrimitive.Content>\n </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\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 React.ElementRef<typeof SheetPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Title\n ref={ref}\n className={cn(\"text-lg font-semibold text-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n React.ElementRef<typeof SheetPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <SheetPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\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\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"../utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 overflow-hidden rounded-md bg-primary px-3 py-1.5 text-xs text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n className\n )}\n {...(props as any)}\n />\n </TooltipPrimitive.Portal>\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"../utils\"\n\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Root\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))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn(\"aspect-square h-full w-full\", className)}\n {...(props as any)}\n />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\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))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n","import React from 'react';\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={`grid ${gridColsClasses} ${gapClass} ${className}`.trim()}\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';\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={`\n w-full ${styles.container} ${styles.input}\n ${isLarge ? 'border-2 border-gray-200 rounded-2xl shadow-lg' : 'border border-gray-300 rounded-lg shadow-sm'}\n bg-white \n focus:ring-2 focus:ring-blue-500/20 focus:border-blue-500 \n hover:border-gray-400 ${isLarge ? 'hover:shadow-xl' : 'hover:shadow-md'}\n transition-all duration-300 ease-out\n 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={`\n absolute top-1/2 ${styles.clearButton} transform -translate-y-1/2\n z-10 group/clear\n `}\n >\n <div className={`\n ${styles.clearButton} flex items-center justify-center\n rounded-full \n bg-gray-100 hover:bg-gray-200 \n transition-all duration-200 \n group-hover/clear:scale-105\n `}>\n <svg \n className={`${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\";\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={`px-4 py-2 bg-blue-500 text-white rounded-lg hover:bg-blue-600 transition-colors ${\n isShaking ? \"animate-pulse\" : \"\"\n }`}\n >\n 摇一摇\n </button>\n <button\n onClick={slowdown}\n className={`px-4 py-2 bg-green-500 text-white rounded-lg hover:bg-green-600 transition-colors ${\n isShaking ? \"animate-pulse\" : \"\"\n }`}\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 className?: string;\n maskClosable?: boolean;\n children: React.ReactNode;\n zIndex?: number;\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n width,\n className,\n maskClosable = true,\n children,\n zIndex = 50,\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 // This is a bit tricky with Radix UI Dialog, but we can manage it\n }\n }\n }}>\n <DialogContent \n className={cn(\"sm:max-w-[425px]\", className) + ` z-[${zIndex}]`}\n onPointerDownOutside={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n onEscapeKeyDown={(e) => {\n if (!maskClosable) e.preventDefault();\n }}\n style={width ? { maxWidth: typeof width === 'number' ? `${width}px` : width } : undefined}\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\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/music/components/MusicPlayer.tsx","../src/music/components/MikutapMusicPlayer.tsx","../src/music/adapters/kugou.ts","../src/music/adapters/netease.ts","../src/music/adapters/tencent.ts","../src/music/adapters/xiami.ts","../src/music/hooks/useMusic.ts"],"names":["useState","useRef","useEffect","useCallback","React","useSWR","DEFAULT_MUSIC_SOURCE","useMemo"],"mappings":"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","file":"chunk-E7RGBAYJ.js","sourcesContent":["'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface MusicPlayerState {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n volume: number;\n isLoading: boolean;\n error?: string;\n}\n\nexport interface PlayerMusicTrack {\n id: string;\n name: string;\n file: string;\n duration?: number;\n volume?: number;\n}\n\nexport interface MusicPlayerProps {\n track?: PlayerMusicTrack;\n onPlay?: () => void; // 新增播放回调\n onPause?: () => void;\n onStop?: () => void;\n onVolumeChange?: (volume: number) => void;\n onSeek?: (time: number) => void;\n initialVolume?: number;\n className?: string;\n compact?: boolean;\n ultraCompact?: boolean; // 超级紧缩模式,只显示播放控制和音量\n hideVolumeControl?: boolean; // 隐藏音量控制模块\n showTrackInfo?: boolean;\n // 外部状态控制 - 必需的props\n isPlaying: boolean; // 外部播放状态\n currentTime: number; // 外部当前时间\n duration: number; // 外部总时长\n externalVolume?: number; // 外部音量状态\n}\n\nexport default function MusicPlayer({\n track,\n onPlay,\n onPause,\n onStop,\n onVolumeChange,\n onSeek,\n initialVolume = 0.7,\n className = '',\n compact = false,\n ultraCompact = false,\n hideVolumeControl = false,\n showTrackInfo = true,\n isPlaying,\n currentTime,\n duration,\n externalVolume\n}: MusicPlayerProps) {\n const [volume, setVolume] = useState(externalVolume ?? initialVolume);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | undefined>();\n\n const progressRef = useRef<HTMLDivElement>(null);\n const volumeRef = useRef<HTMLDivElement>(null);\n const [isDraggingProgress, setIsDraggingProgress] = useState(false);\n const [isDraggingVolume, setIsDraggingVolume] = useState(false);\n\n // 同步外部音量状态\n useEffect(() => {\n if (externalVolume !== undefined) {\n setVolume(externalVolume);\n }\n }, [externalVolume]);\n\n // 格式化时间显示\n const formatTime = (seconds: number): string => {\n if (!seconds || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n // 播放控制\n const handlePlay = useCallback(() => {\n onPlay?.();\n }, [onPlay]);\n\n // 暂停控制\n const handlePause = useCallback(() => {\n onPause?.();\n }, [onPause]);\n\n // 停止控制\n const handleStop = useCallback(() => {\n onStop?.();\n }, [onStop]);\n\n // 音量控制\n const handleVolumeChange = useCallback((newVolume: number) => {\n const clampedVolume = Math.max(0, Math.min(1, newVolume));\n setVolume(clampedVolume);\n onVolumeChange?.(clampedVolume);\n }, [onVolumeChange]);\n\n // 进度控制\n const handleSeek = useCallback((time: number) => {\n if (!duration || isNaN(duration)) return;\n \n const seekTime = Math.max(0, Math.min(duration, time));\n onSeek?.(seekTime);\n }, [duration, onSeek]);\n\n // 鼠标拖拽进度条\n const handleProgressMouseDown = useCallback((e: React.MouseEvent) => {\n if (!progressRef.current || !duration) return;\n \n setIsDraggingProgress(true);\n const rect = progressRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * duration;\n handleSeek(time);\n }, [duration, handleSeek]);\n\n // 鼠标拖拽音量条\n const handleVolumeMouseDown = useCallback((e: React.MouseEvent) => {\n if (!volumeRef.current) return;\n \n setIsDraggingVolume(true);\n const rect = volumeRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n handleVolumeChange(percent);\n }, [handleVolumeChange]);\n\n // 处理拖拽事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingProgress && progressRef.current && duration) {\n const rect = progressRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const time = percent * duration;\n handleSeek(time);\n }\n \n if (isDraggingVolume && volumeRef.current) {\n const rect = volumeRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n handleVolumeChange(percent);\n }\n };\n\n const handleMouseUp = () => {\n setIsDraggingProgress(false);\n setIsDraggingVolume(false);\n };\n\n if (isDraggingProgress || isDraggingVolume) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDraggingProgress, isDraggingVolume, duration, handleSeek, handleVolumeChange]);\n\n // 阻止事件传播的通用处理器\n const stopPropagation = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n // 如果是超级紧缩模式\n if (ultraCompact) {\n return (\n <div \n className={`flex items-center gap-2 bg-white/90 backdrop-blur-sm rounded-xl p-2 shadow-lg border border-purple-200 ${className}`}\n style={{ width: hideVolumeControl ? '120px' : '192px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 控制按钮 */}\n <div className={`flex items-center gap-1 ${hideVolumeControl ? 'w-full justify-center' : ''}`}>\n {/* 停止按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); handleStop(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className=\"w-7 h-7 rounded-lg bg-gray-100 hover:bg-gray-200 border border-gray-300 flex items-center justify-center transition-colors\"\n title=\"停止\"\n >\n <div className=\"w-2.5 h-2.5 bg-gray-600 rounded-sm\"></div>\n </button>\n\n {/* 播放/暂停按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={`w-8 h-8 rounded-lg border flex items-center justify-center transition-colors ${\n isPlaying \n ? 'bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400' \n : 'bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer'\n }`}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isPlaying ? (\n <div className=\"flex gap-0.5\">\n <div className=\"w-1 h-3 bg-white rounded-sm\"></div>\n <div className=\"w-1 h-3 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[6px] border-l-white border-t-[4px] border-t-transparent border-b-[4px] border-b-transparent ml-0.5\"></div>\n )}\n </button>\n </div>\n\n {/* 音量控制 */}\n {!hideVolumeControl && (\n <div className=\"flex items-center gap-1 flex-1\">\n <div className=\"text-gray-500 text-xs\">🔊</div>\n <div \n ref={volumeRef}\n className=\"flex-1 h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleVolumeMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full\"\n style={{ width: `${volume * 100}%` }}\n ></div>\n <div \n className=\"absolute top-1/2 w-3 h-3 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ left: `${volume * 100}%`, transform: 'translateX(-50%) translateY(-50%)' }}\n ></div>\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div \n className={`bg-white/90 backdrop-blur-sm rounded-xl p-4 shadow-lg border border-purple-200 ${className}`}\n style={{ width: compact ? '280px' : '320px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 音乐信息 */}\n {!compact && showTrackInfo && track && (\n <div className=\"mb-3\">\n <h3 className=\"text-sm font-medium text-gray-800 truncate\">{track.name}</h3>\n <p className=\"text-xs text-gray-500\">背景音乐</p>\n </div>\n )}\n\n {/* 进度条 */}\n {!compact && (\n <div className=\"mb-3\">\n <div \n ref={progressRef}\n className=\"w-full h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleProgressMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full transition-all duration-100\"\n style={{ width: duration > 0 ? `${(currentTime / duration) * 100}%` : '0%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ \n left: duration > 0 ? `${(currentTime / duration) * 100}%` : '0%',\n transform: 'translateX(-50%) translateY(-50%)'\n }}\n ></div>\n </div>\n \n <div className=\"flex justify-between text-xs text-gray-500 mt-1\">\n <span>{formatTime(currentTime)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n )}\n\n {/* 控制按钮 */}\n <div className=\"flex items-center justify-center gap-3 mb-3\">\n {/* 停止按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); handleStop(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className=\"w-10 h-10 rounded-full bg-gray-100 hover:bg-gray-200 border border-gray-300 flex items-center justify-center transition-colors\"\n title=\"停止\"\n >\n <div className=\"w-4 h-4 bg-gray-600 rounded-sm\"></div>\n </button>\n\n {/* 播放/暂停按钮 */}\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={`w-12 h-12 rounded-full border-2 flex items-center justify-center transition-colors ${\n isPlaying \n ? 'bg-gradient-to-r from-purple-500 to-pink-500 hover:from-purple-600 hover:to-pink-600 text-white border-purple-400' \n : 'bg-gradient-to-r from-green-500 to-blue-500 hover:from-green-600 hover:to-blue-600 text-white border-green-400 cursor-pointer'\n }`}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isLoading ? (\n <div className=\"w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n ) : isPlaying ? (\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1\"></div>\n )}\n </button>\n </div>\n\n {/* 音量控制 */}\n {!hideVolumeControl && (\n <div className=\"flex items-center gap-3\">\n <div className=\"text-gray-500 text-sm\">🔊</div>\n <div \n ref={volumeRef}\n className=\"flex-1 h-2 bg-gray-200 rounded-full cursor-pointer relative\"\n onMouseDown={handleVolumeMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-purple-400 to-pink-400 rounded-full\"\n style={{ width: `${volume * 100}%` }}\n ></div>\n <div \n className=\"absolute top-1/2 w-4 h-4 bg-white border-2 border-purple-400 rounded-full transform -translate-y-1/2 cursor-grab\"\n style={{ left: `${volume * 100}%`, transform: 'translateX(-50%) translateY(-50%)' }}\n ></div>\n </div>\n <div className=\"text-xs text-gray-500 w-8 text-right\">\n {Math.round(volume * 100)}%\n </div>\n </div>\n )}\n\n {/* 错误信息 */}\n {error && (\n <div className=\"mt-2 text-xs text-red-500\">\n {error}\n </div>\n )}\n </div>\n );\n}","'use client';\n\nimport React, { useState, useEffect, useRef, useCallback } from 'react';\n\nexport interface MikutapMusicTrack {\n id: string;\n name: string;\n audioUrl: string;\n audioData?: string;\n duration?: number;\n}\n\nexport interface MikutapMusicPlayerProps {\n track?: MikutapMusicTrack;\n onPlay?: () => void;\n onPause?: () => void;\n onSeek?: (time: number) => void;\n className?: string;\n // 外部状态控制\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n}\n\nexport default function MikutapMusicPlayer({\n track,\n onPlay,\n onPause,\n onSeek,\n className = '',\n isPlaying,\n currentTime,\n duration,\n}: MikutapMusicPlayerProps) {\n const progressRef = useRef<HTMLDivElement>(null);\n const [isDraggingProgress, setIsDraggingProgress] = useState(false);\n\n // 格式化时间显示\n const formatTime = (seconds: number): string => {\n if (!seconds || isNaN(seconds)) return '0:00';\n const mins = Math.floor(seconds / 60);\n const secs = Math.floor(seconds % 60);\n return `${mins}:${secs.toString().padStart(2, '0')}`;\n };\n\n // 播放控制\n const handlePlay = useCallback(() => {\n onPlay?.();\n }, [onPlay]);\n\n // 暂停控制\n const handlePause = useCallback(() => {\n onPause?.();\n }, [onPause]);\n\n // 进度控制\n const handleSeek = useCallback((time: number) => {\n if (!duration || isNaN(duration)) return;\n \n const seekTime = Math.max(0, Math.min(duration, time));\n onSeek?.(seekTime);\n }, [duration, onSeek]);\n\n // 鼠标拖拽进度条\n const handleProgressMouseDown = useCallback((e: React.MouseEvent) => {\n if (!progressRef.current || !duration) return;\n \n setIsDraggingProgress(true);\n const rect = progressRef.current.getBoundingClientRect();\n const percent = (e.clientX - rect.left) / rect.width;\n const time = percent * duration;\n handleSeek(time);\n }, [duration, handleSeek]);\n\n // 处理拖拽事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingProgress && progressRef.current && duration) {\n const rect = progressRef.current.getBoundingClientRect();\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));\n const time = percent * duration;\n handleSeek(time);\n }\n };\n\n const handleMouseUp = () => {\n setIsDraggingProgress(false);\n };\n\n if (isDraggingProgress) {\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n }\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDraggingProgress, duration, handleSeek]);\n\n // 阻止事件传播的通用处理器\n const stopPropagation = useCallback((e: React.SyntheticEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n return (\n <div \n className={`bg-gradient-to-r from-purple-900/95 to-pink-900/95 backdrop-blur-sm rounded-2xl p-4 shadow-2xl border border-purple-300/30 ${className}`}\n style={{ width: '200px' }}\n onClick={stopPropagation}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n {/* 音乐信息 */}\n {track && (\n <div className=\"mb-3 text-center\">\n <div className=\"text-white text-sm font-medium truncate mb-1\">\n {track.name}\n </div>\n <div className=\"text-purple-200 text-xs\">\n 背景音乐\n </div>\n </div>\n )}\n\n {/* 播放/暂停按钮 */}\n <div className=\"flex justify-center mb-3\">\n <button\n onClick={(e) => { stopPropagation(e); isPlaying ? handlePause() : handlePlay(); }}\n onMouseDown={stopPropagation}\n onMouseUp={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n className={`w-12 h-12 rounded-full border-2 flex items-center justify-center transition-all duration-300 shadow-lg hover:scale-105 ${\n isPlaying \n ? 'bg-gradient-to-r from-orange-400 to-red-500 hover:from-orange-500 hover:to-red-600 text-white border-orange-300 shadow-orange-500/50' \n : 'bg-gradient-to-r from-green-400 to-emerald-500 hover:from-green-500 hover:to-emerald-600 text-white border-green-300 shadow-green-500/50'\n }`}\n title={isPlaying ? \"暂停\" : \"播放\"}\n >\n {isPlaying ? (\n <div className=\"flex gap-1\">\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n <div className=\"w-1.5 h-4 bg-white rounded-sm\"></div>\n </div>\n ) : (\n <div className=\"w-0 h-0 border-l-[10px] border-l-white border-t-[7px] border-t-transparent border-b-[7px] border-b-transparent ml-1\"></div>\n )}\n </button>\n </div>\n\n {/* 进度条 */}\n <div className=\"mb-2\">\n <div \n ref={progressRef}\n className=\"w-full h-2 bg-white/20 rounded-full cursor-pointer relative overflow-hidden\"\n onMouseDown={handleProgressMouseDown}\n onClick={stopPropagation}\n onTouchStart={stopPropagation}\n onTouchEnd={stopPropagation}\n onPointerDown={stopPropagation}\n onPointerUp={stopPropagation}\n >\n <div \n className=\"h-full bg-gradient-to-r from-cyan-400 to-blue-500 rounded-full transition-all duration-100 shadow-sm\"\n style={{ width: duration > 0 ? `${(currentTime / duration) * 100}%` : '0%' }}\n ></div>\n <div \n className=\"absolute top-1/2 w-3 h-3 bg-white border-2 border-cyan-400 rounded-full transform -translate-y-1/2 cursor-grab shadow-lg\"\n style={{ \n left: duration > 0 ? `${(currentTime / duration) * 100}%` : '0%',\n transform: 'translateX(-50%) translateY(-50%)'\n }}\n ></div>\n </div>\n \n <div className=\"flex justify-between text-xs text-purple-200 mt-1\">\n <span>{formatTime(currentTime)}</span>\n <span>{formatTime(duration)}</span>\n </div>\n </div>\n\n {/* 状态指示器 */}\n <div className=\"flex justify-center\">\n <div className={`flex items-center gap-2 text-xs px-3 py-1 rounded-full transition-all duration-300 ${\n isPlaying \n ? 'bg-orange-500/20 text-orange-200 border border-orange-400/30' \n : 'bg-gray-500/20 text-gray-300 border border-gray-400/30'\n }`}>\n <div className={`w-2 h-2 rounded-full transition-all duration-300 ${\n isPlaying ? 'bg-orange-400 animate-pulse' : 'bg-gray-400'\n }`}></div>\n <span>{isPlaying ? '播放中' : '已暂停'}</span>\n </div>\n </div>\n </div>\n );\n} ","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const kugouAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const info = root.data?.data?.info || root.data?.info || root.info || [];\n const total = root.data?.data?.total || root.data?.total || info.length;\n return {\n tracks: info.map((item: any) => {\n // 优先从 trans_param.union_cover 提取封面,并替换 {size} 为 400\n let pic = item.pic || '';\n if (item.trans_param?.union_cover) {\n pic = item.trans_param.union_cover.replace('{size}', '400');\n }\n\n return {\n id: item.hash || item.id,\n name: item.songname || item.filename || 'Unknown',\n artist: item.singername || 'Unknown Artist',\n album: item.album_name || item.album || '',\n pic: pic,\n url: item.url,\n lrc: item.lrc,\n source: 'kugou',\n isVip: item.privilege >= 8,\n playable: item.status !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n return data.url?.url || data.url?.backup_url?.[0] || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const neteaseAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const songs = root.result?.songs || root.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id,\n name: item.name,\n artist: Array.isArray(item.artist) ? item.artist.join(', ') : item.artist,\n album: item.album?.name || item.album,\n pic: item.pic || item.album?.picUrl,\n url: item.url,\n lrc: item.lrc,\n source: 'netease',\n isVip: item.fee === 1 || item.fee === 4,\n playable: item.noCopyrightRcmd === null,\n })),\n total: root.result?.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n const item = root.data?.[0] || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const tencentAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n \n // 兼容多种 QQ 音乐返回结构\n const songData = root.data?.data?.song || root.data?.song || root.data || root;\n const list = songData.list || root.songs || [];\n const total = songData.totalnum || root.total || list.length;\n \n return {\n tracks: list.map((item: any) => {\n // 解析歌手名\n const artist = Array.isArray(item.singer) \n ? item.singer.map((s: any) => s.name).join(', ') \n : (item.singer?.[0]?.name || item.artist || 'Unknown');\n\n // 处理封面图 (QQ 音乐封面通常基于 album mid)\n let pic = item.pic;\n if (!pic && item.album?.mid) {\n pic = `https://y.gtimg.cn/music/photo_new/T002R300x300M000${item.album.mid}.jpg`;\n }\n\n return {\n id: item.mid || item.id || item.songid,\n name: item.name || item.title || item.songname,\n artist: artist,\n album: item.album?.name || item.albumname || item.album,\n pic: pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'tencent',\n isVip: item.pay?.pay_play === 1,\n playable: item.action?.switch !== 0,\n };\n }),\n total: total,\n };\n },\n\n parseGetSongUrl(data: any): string | null {\n\n const root = data\n\n const urlData = root.url.url;\n let finalUrl = Object.values(urlData)[0] as string;\n console.log('finalUrl2', finalUrl);\n return finalUrl.startsWith('http') ? finalUrl : `http://${finalUrl}`;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || '';\n }\n};\n\n","import { SearchResult } from '../types';\nimport { MusicSourceAdapter } from './types';\n\nexport const xiamiAdapter: MusicSourceAdapter = {\n parseSearchResult(data: any): SearchResult {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 虾米返回的结构(根据提供的数据,类似于网易云的结构)\n const result = root.data?.result || root.result || root;\n const songs = result.songs || (Array.isArray(root) ? root : []);\n \n return {\n tracks: songs.map((item: any) => ({\n id: item.id?.toString() || '',\n name: item.name || 'Unknown',\n artist: Array.isArray(item.ar) \n ? item.ar.map((a: any) => a.name).join(', ') \n : (item.artist || 'Unknown Artist'),\n album: item.al?.name || item.album || '',\n pic: item.al?.picUrl || item.pic || '',\n url: item.url,\n lrc: item.lrc,\n source: 'xiami',\n // 这里的逻辑参考提供的数据结构\n isVip: item.fee === 1 || item.fee === 8,\n playable: item.copyright !== 0,\n })),\n total: result.songCount || songs.length,\n };\n },\n\n parseGetSongUrl(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n // 兼容多种可能的包装结构\n const item = root.data?.[0] || root.data || root[0] || root;\n return item.url || null;\n },\n\n parseGetLyric(data: any): any {\n const root = typeof data === 'string' ? JSON.parse(data) : data;\n return root.lyric || root.lrc || root.data?.lyric || root.data || '';\n }\n};\n\n","import useSWR from 'swr';\nimport { useState, useCallback, useMemo } from 'react';\nimport { MusicTrack, SearchOptions, SearchResult, MusicApiResponse } from '../types';\nimport { DEFAULT_MUSIC_SOURCE } from '../constants';\nimport { \n kugouAdapter, \n neteaseAdapter, \n tencentAdapter, \n xiamiAdapter,\n MusicSourceAdapter \n} from '../adapters';\n\nconst fetcher = (url: string) => fetch(url).then(res => res.json());\n\nconst ADAPTERS: Record<string, MusicSourceAdapter> = {\n kugou: kugouAdapter,\n netease: neteaseAdapter,\n tencent: tencentAdapter,\n xiami: xiamiAdapter,\n};\n\nexport function useMusic() {\n const [searchOptions, setSearchOptions] = useState<SearchOptions | null>(null);\n\n // 搜索歌曲\n const { data: rawData, error: searchError, isLoading: isSearching } = useSWR<MusicApiResponse<any>>(\n searchOptions ? `/api/music/search?keyword=${encodeURIComponent(searchOptions.keyword)}&source=${searchOptions.source || DEFAULT_MUSIC_SOURCE}&limit=${searchOptions.limit || 20}&offset=${searchOptions.offset || 0}${searchOptions.miku ? '&miku=true' : ''}` : null,\n fetcher\n );\n\n const searchResult = useMemo(() => {\n if (!rawData?.data || !searchOptions) return undefined;\n const adapter = ADAPTERS[searchOptions.source || DEFAULT_MUSIC_SOURCE];\n if (adapter) {\n return adapter.parseSearchResult(rawData.data);\n }\n return undefined;\n }, [rawData, searchOptions]);\n\n const search = useCallback((options: SearchOptions) => {\n setSearchOptions(options);\n }, []);\n\n // 获取播放链接\n const getSongUrl = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch(`/api/music/url?id=${id}&source=${source}`);\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n console.log('json2', json.data,source,adapter);\n if (adapter && json.data) {\n console.log('getSongUrl2', json.data);\n return adapter.parseGetSongUrl(json.data) || undefined;\n }\n return json.data?.url;\n } catch (err) {\n console.error('[Music] Failed to get song URL:', err);\n return undefined;\n }\n }, []);\n\n // 获取歌词\n const getLyric = useCallback(async (id: string, source: string = DEFAULT_MUSIC_SOURCE): Promise<string | undefined> => {\n try {\n const res = await fetch(`/api/music/lyric?id=${id}&source=${source}`);\n const json: MusicApiResponse<any> = await res.json();\n const adapter = ADAPTERS[source];\n if (adapter && json.data) {\n return adapter.parseGetLyric(json.data);\n }\n return json.data?.lyric;\n } catch (err) {\n console.error('[Music] Failed to get lyric:', err);\n return undefined;\n }\n }, []);\n\n return {\n search,\n searchResult,\n isSearching,\n searchError,\n getSongUrl,\n getLyric,\n };\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mmd/pmx/parser/PMXParser.ts"],"names":[],"mappings":"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","file":"chunk-JZXJQMVE.js","sourcesContent":["/**\n * PMX模型文件解析器\n * 用于解析PMX格式的MMD模型文件,提取纹理映射关系\n */\n\nimport {\n PMXHeader,\n PMXModelInfo,\n PMXMaterial,\n PMXTexture,\n PMXParseResult,\n MaterialTextureMapping,\n} from '../types';\n\nexport class PMXParser {\n private view!: DataView;\n private offset: number = 0;\n private textEncoding: 'utf16le' | 'utf8' = 'utf16le';\n private textureIndexSize: number = 1;\n private additionalVec4Count: number = 0;\n private vertexIndexSize: number = 1;\n private boneIndexSize: number = 1;\n\n /**\n * 从URL加载并解析PMX文件\n */\n async loadAndParse(url: string): Promise<PMXParseResult> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to load PMX file: ${response.statusText}`);\n }\n\n const buffer = await response.arrayBuffer();\n return this.parse(buffer);\n }\n\n /**\n * 解析PMX文件\n */\n parse(buffer: ArrayBuffer): PMXParseResult {\n this.view = new DataView(buffer);\n this.offset = 0;\n\n console.log('[PMXParser] Starting parse, file size:', buffer.byteLength);\n\n // 1. 解析头部\n const header = this.parseHeader();\n console.log('[PMXParser] Header parsed, offset:', this.offset);\n console.log('[PMXParser] Globals:', header.globals);\n\n // 2. 解析模型信息\n const modelInfo = this.parseModelInfo();\n console.log('[PMXParser] Model info parsed, offset:', this.offset);\n console.log('[PMXParser] Model name:', modelInfo.modelName);\n\n // 3. 解析顶点(只统计数量,不解析详细数据以提高性能)\n const vertexCount = this.skipVertices();\n console.log('[PMXParser] Vertices skipped, count:', vertexCount, 'offset:', this.offset);\n\n // 4. 解析面(只统计数量)\n const faceCount = this.skipFaces();\n console.log('[PMXParser] Faces skipped, count:', faceCount, 'offset:', this.offset);\n\n // 5. 解析纹理列表\n const textures = this.parseTextures();\n console.log('[PMXParser] Textures parsed, count:', textures.length, 'offset:', this.offset);\n\n // 6. 解析材质\n const materials = this.parseMaterials();\n console.log('[PMXParser] Materials parsed, count:', materials.length, 'offset:', this.offset);\n\n // 7. 生成材质纹理映射\n const materialTextureMappings = this.generateMaterialTextureMappings(\n materials,\n textures\n );\n\n return {\n header,\n modelInfo,\n textures,\n materials,\n materialTextureMappings,\n vertexCount,\n faceCount,\n };\n }\n\n /**\n * 解析文件头\n */\n private parseHeader(): PMXHeader {\n // 签名 \"PMX \" (4 bytes)\n const signature = this.readString(4);\n if (signature !== 'PMX ') {\n throw new Error(`Invalid PMX signature: ${signature}`);\n }\n\n // 版本号 (4 bytes float)\n const version = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n // 全局设置数量 (1 byte)\n const globalsCount = this.view.getUint8(this.offset);\n this.offset += 1;\n\n if (globalsCount !== 8) {\n throw new Error(`Unexpected globals count: ${globalsCount}`);\n }\n\n // 读取全局设置\n const encoding = this.view.getUint8(this.offset);\n this.offset += 1;\n this.textEncoding = encoding === 0 ? 'utf16le' : 'utf8';\n\n const additionalVec4Count = this.view.getUint8(this.offset);\n this.offset += 1;\n this.additionalVec4Count = additionalVec4Count;\n\n const vertexIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.vertexIndexSize = vertexIndexSize;\n\n const textureIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.textureIndexSize = textureIndexSize;\n\n const materialIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n const boneIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n this.boneIndexSize = boneIndexSize;\n\n const morphIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n const rigidBodyIndexSize = this.view.getUint8(this.offset);\n this.offset += 1;\n\n return {\n signature,\n version,\n globals: {\n encoding,\n additionalVec4Count,\n vertexIndexSize,\n textureIndexSize,\n materialIndexSize,\n boneIndexSize,\n morphIndexSize,\n rigidBodyIndexSize,\n },\n };\n }\n\n /**\n * 解析模型信息\n */\n private parseModelInfo(): PMXModelInfo {\n const modelName = this.readTextBuffer();\n const modelNameEnglish = this.readTextBuffer();\n const comment = this.readTextBuffer();\n const commentEnglish = this.readTextBuffer();\n\n return {\n modelName,\n modelNameEnglish,\n comment,\n commentEnglish,\n };\n }\n\n /**\n * 跳过顶点数据(只返回数量)\n */\n private skipVertices(): number {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n // 跳过所有顶点数据\n // 每个顶点的大小是可变的,需要根据权重类型计算\n for (let i = 0; i < count; i++) {\n // Position (12 bytes)\n this.offset += 12;\n // Normal (12 bytes)\n this.offset += 12;\n // UV (8 bytes)\n this.offset += 8;\n\n // Additional UV (使用保存的additionalVec4Count)\n this.offset += this.additionalVec4Count * 16;\n\n // Weight type\n const weightType = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // 根据权重类型跳过不同大小的数据\n this.skipVertexWeight(weightType);\n\n // Edge scale (4 bytes)\n this.offset += 4;\n }\n\n return count;\n }\n\n /**\n * 跳过顶点权重数据\n */\n private skipVertexWeight(weightType: number): void {\n switch (weightType) {\n case 0: // BDEF1\n this.offset += this.boneIndexSize;\n break;\n case 1: // BDEF2\n this.offset += this.boneIndexSize * 2 + 4;\n break;\n case 2: // BDEF4\n this.offset += this.boneIndexSize * 4 + 16;\n break;\n case 3: // SDEF\n this.offset += this.boneIndexSize * 2 + 4 + 36;\n break;\n case 4: // QDEF\n this.offset += this.boneIndexSize * 4 + 16;\n break;\n }\n }\n\n /**\n * 跳过面数据(只返回数量)\n */\n private skipFaces(): number {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n this.offset += count * this.vertexIndexSize;\n\n return count / 3; // 返回面数(每个面3个顶点)\n }\n\n /**\n * 解析纹理列表\n */\n private parseTextures(): PMXTexture[] {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n console.log('[PMXParser] Parsing textures, count:', count);\n\n if (count < 0 || count > 10000) {\n throw new Error(`Invalid texture count: ${count} at offset ${this.offset - 4}`);\n }\n\n const textures: PMXTexture[] = [];\n\n for (let i = 0; i < count; i++) {\n const path = this.readTextBuffer();\n textures.push({\n index: i,\n path,\n });\n console.log(`[PMXParser] Texture ${i}: ${path}`);\n }\n\n return textures;\n }\n\n /**\n * 解析材质列表\n */\n private parseMaterials(): PMXMaterial[] {\n const count = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n const materials: PMXMaterial[] = [];\n\n for (let i = 0; i < count; i++) {\n // 材质名称\n const name = this.readTextBuffer();\n const nameEnglish = this.readTextBuffer();\n\n // 颜色信息\n const diffuse: [number, number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n this.view.getFloat32(this.offset + 12, true),\n ];\n this.offset += 16;\n\n const specular: [number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n ];\n this.offset += 12;\n\n const specularStrength = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n const ambient: [number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n ];\n this.offset += 12;\n\n // 绘制标志\n const drawingFlags = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // 边缘信息\n const edgeColor: [number, number, number, number] = [\n this.view.getFloat32(this.offset, true),\n this.view.getFloat32(this.offset + 4, true),\n this.view.getFloat32(this.offset + 8, true),\n this.view.getFloat32(this.offset + 12, true),\n ];\n this.offset += 16;\n\n const edgeSize = this.view.getFloat32(this.offset, true);\n this.offset += 4;\n\n // 纹理信息\n const textureIndex = this.readIndex(this.textureIndexSize);\n const sphereTextureIndex = this.readIndex(this.textureIndexSize);\n const sphereMode = this.view.getUint8(this.offset);\n this.offset += 1;\n\n // Toon信息\n const isSharedToon = this.view.getUint8(this.offset) === 1;\n this.offset += 1;\n\n const toonTextureIndex = isSharedToon\n ? this.view.getUint8(this.offset++)\n : this.readIndex(this.textureIndexSize);\n\n // 备注\n const memo = this.readTextBuffer();\n\n // 面数\n const surfaceCount = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n materials.push({\n name,\n nameEnglish,\n diffuse,\n specular,\n specularStrength,\n ambient,\n drawingFlags,\n edgeColor,\n edgeSize,\n textureIndex,\n sphereTextureIndex,\n sphereMode,\n isSharedToon,\n toonTextureIndex,\n memo,\n surfaceCount,\n });\n }\n\n return materials;\n }\n\n /**\n * 生成材质纹理映射\n */\n private generateMaterialTextureMappings(\n materials: PMXMaterial[],\n textures: PMXTexture[]\n ): MaterialTextureMapping[] {\n const sphereModeMap = ['none', 'multiply', 'add', 'subTexture'] as const;\n\n return materials.map((material, index) => {\n const mapping: MaterialTextureMapping = {\n materialIndex: index,\n materialName: material.name,\n materialNameEnglish: material.nameEnglish,\n surfaceCount: material.surfaceCount,\n };\n\n // 主纹理\n if (material.textureIndex >= 0 && material.textureIndex < textures.length) {\n mapping.mainTexture = {\n index: material.textureIndex,\n path: textures[material.textureIndex]!.path,\n };\n }\n\n // Sphere纹理\n if (\n material.sphereTextureIndex >= 0 &&\n material.sphereTextureIndex < textures.length &&\n material.sphereMode > 0\n ) {\n mapping.sphereTexture = {\n index: material.sphereTextureIndex,\n path: textures[material.sphereTextureIndex]!.path,\n mode: sphereModeMap[material.sphereMode] as 'multiply' | 'add' | 'subTexture',\n };\n }\n\n // Toon纹理\n if (material.isSharedToon) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: `toon${String(material.toonTextureIndex).padStart(2, '0')}.bmp`,\n isShared: true,\n };\n } else if (\n material.toonTextureIndex >= 0 &&\n material.toonTextureIndex < textures.length\n ) {\n mapping.toonTexture = {\n index: material.toonTextureIndex,\n path: textures[material.toonTextureIndex]!.path,\n isShared: false,\n };\n }\n\n return mapping;\n });\n }\n\n /**\n * 读取文本缓冲区\n */\n private readTextBuffer(): string {\n const length = this.view.getInt32(this.offset, true);\n this.offset += 4;\n\n if (length === 0) return '';\n\n // 添加边界检查\n if (length < 0 || length > 10000000) { // 10MB 限制\n throw new Error(`Invalid text buffer length: ${length} at offset ${this.offset - 4}`);\n }\n\n if (this.offset + length > this.view.buffer.byteLength) {\n throw new Error(`Text buffer extends beyond file boundary: offset=${this.offset}, length=${length}, fileSize=${this.view.buffer.byteLength}`);\n }\n\n const bytes = new Uint8Array(this.view.buffer, this.offset, length);\n this.offset += length;\n\n if (this.textEncoding === 'utf8') {\n return new TextDecoder('utf-8').decode(bytes);\n } else {\n return new TextDecoder('utf-16le').decode(bytes);\n }\n }\n\n /**\n * 读取固定长度字符串\n */\n private readString(length: number): string {\n const bytes = new Uint8Array(this.view.buffer, this.offset, length);\n this.offset += length;\n return new TextDecoder('ascii').decode(bytes);\n }\n\n /**\n * 读取索引\n */\n private readIndex(size: number): number {\n let value: number;\n\n switch (size) {\n case 1:\n value = this.view.getInt8(this.offset);\n break;\n case 2:\n value = this.view.getInt16(this.offset, true);\n break;\n case 4:\n value = this.view.getInt32(this.offset, true);\n break;\n default:\n throw new Error(`Invalid index size: ${size}`);\n }\n\n this.offset += size;\n return value;\n }\n}\n\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/logger/types.ts","../src/logger/console-adapter.ts","../src/logger/Logger.ts"],"names":["LogLevel"],"mappings":"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","file":"chunk-KQGP6BTS.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"]}