sa2kit 1.6.60 → 1.6.62

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 (297) hide show
  1. package/dist/UniversalFileService-C3WQAFOV.js +15 -0
  2. package/dist/{UniversalFileService-J6ET6KZK.js.map → UniversalFileService-C3WQAFOV.js.map} +1 -1
  3. package/dist/UniversalFileService-O3IEROBN.mjs +6 -0
  4. package/dist/{UniversalFileService-336GFY6N.mjs.map → UniversalFileService-O3IEROBN.mjs.map} +1 -1
  5. package/dist/ai/llm/index.d.mts +70 -0
  6. package/dist/ai/llm/index.d.ts +70 -0
  7. package/dist/ai/llm/index.js +54 -0
  8. package/dist/ai/llm/index.js.map +1 -0
  9. package/dist/ai/llm/index.mjs +5 -0
  10. package/dist/ai/llm/index.mjs.map +1 -0
  11. package/dist/ai/llm/ui/electron/index.d.mts +5 -0
  12. package/dist/ai/llm/ui/electron/index.d.ts +5 -0
  13. package/dist/ai/llm/ui/electron/index.js +21 -0
  14. package/dist/ai/llm/ui/electron/index.js.map +1 -0
  15. package/dist/ai/llm/ui/electron/index.mjs +8 -0
  16. package/dist/ai/llm/ui/electron/index.mjs.map +1 -0
  17. package/dist/ai/llm/ui/miniapp/index.d.mts +9 -0
  18. package/dist/ai/llm/ui/miniapp/index.d.ts +9 -0
  19. package/dist/ai/llm/ui/miniapp/index.js +107 -0
  20. package/dist/ai/llm/ui/miniapp/index.js.map +1 -0
  21. package/dist/ai/llm/ui/miniapp/index.mjs +101 -0
  22. package/dist/ai/llm/ui/miniapp/index.mjs.map +1 -0
  23. package/dist/ai/llm/ui/rn/index.d.mts +9 -0
  24. package/dist/ai/llm/ui/rn/index.d.ts +9 -0
  25. package/dist/ai/llm/ui/rn/index.js +249 -0
  26. package/dist/ai/llm/ui/rn/index.js.map +1 -0
  27. package/dist/ai/llm/ui/rn/index.mjs +243 -0
  28. package/dist/ai/llm/ui/rn/index.mjs.map +1 -0
  29. package/dist/ai/llm/ui/web/index.d.mts +15 -0
  30. package/dist/ai/llm/ui/web/index.d.ts +15 -0
  31. package/dist/ai/llm/ui/web/index.js +21 -0
  32. package/dist/ai/llm/ui/web/index.js.map +1 -0
  33. package/dist/ai/llm/ui/web/index.mjs +8 -0
  34. package/dist/ai/llm/ui/web/index.mjs.map +1 -0
  35. package/dist/ar/index.d.mts +7 -0
  36. package/dist/ar/index.d.ts +7 -0
  37. package/dist/ar/index.js +17 -0
  38. package/dist/ar/index.js.map +1 -0
  39. package/dist/ar/index.mjs +4 -0
  40. package/dist/ar/index.mjs.map +1 -0
  41. package/dist/auth/index.js +22 -22
  42. package/dist/auth/index.mjs +2 -2
  43. package/dist/auth/legacy/db/index.d.mts +5 -0
  44. package/dist/auth/legacy/db/index.d.ts +5 -0
  45. package/dist/auth/legacy/db/index.js +34 -0
  46. package/dist/auth/legacy/db/index.js.map +1 -0
  47. package/dist/auth/legacy/db/index.mjs +5 -0
  48. package/dist/auth/legacy/db/index.mjs.map +1 -0
  49. package/dist/auth/legacy/index.d.mts +51 -0
  50. package/dist/auth/legacy/index.d.ts +51 -0
  51. package/dist/auth/legacy/index.js +146 -0
  52. package/dist/auth/legacy/index.js.map +1 -0
  53. package/dist/auth/legacy/index.mjs +13 -0
  54. package/dist/auth/legacy/index.mjs.map +1 -0
  55. package/dist/auth/legacy/logic/index.d.mts +9 -0
  56. package/dist/auth/legacy/logic/index.d.ts +9 -0
  57. package/dist/auth/legacy/logic/index.js +18 -0
  58. package/dist/auth/legacy/logic/index.js.map +1 -0
  59. package/dist/auth/legacy/logic/index.mjs +5 -0
  60. package/dist/auth/legacy/logic/index.mjs.map +1 -0
  61. package/dist/auth/legacy/routes/index.d.mts +50 -0
  62. package/dist/auth/legacy/routes/index.d.ts +50 -0
  63. package/dist/auth/legacy/routes/index.js +34 -0
  64. package/dist/auth/legacy/routes/index.js.map +1 -0
  65. package/dist/auth/legacy/routes/index.mjs +5 -0
  66. package/dist/auth/legacy/routes/index.mjs.map +1 -0
  67. package/dist/auth/legacy/schema/index.d.mts +401 -0
  68. package/dist/auth/legacy/schema/index.d.ts +401 -0
  69. package/dist/auth/legacy/schema/index.js +29 -0
  70. package/dist/auth/legacy/schema/index.js.map +1 -0
  71. package/dist/auth/legacy/schema/index.mjs +4 -0
  72. package/dist/auth/legacy/schema/index.mjs.map +1 -0
  73. package/dist/auth/legacy/server/index.d.mts +15 -0
  74. package/dist/auth/legacy/server/index.d.ts +15 -0
  75. package/dist/auth/legacy/server/index.js +65 -0
  76. package/dist/auth/legacy/server/index.js.map +1 -0
  77. package/dist/auth/legacy/server/index.mjs +8 -0
  78. package/dist/auth/legacy/server/index.mjs.map +1 -0
  79. package/dist/auth/legacy/services/index.d.mts +40 -0
  80. package/dist/auth/legacy/services/index.d.ts +40 -0
  81. package/dist/auth/legacy/services/index.js +14 -0
  82. package/dist/auth/legacy/services/index.js.map +1 -0
  83. package/dist/auth/legacy/services/index.mjs +5 -0
  84. package/dist/auth/legacy/services/index.mjs.map +1 -0
  85. package/dist/auth/legacy/ui/miniapp/index.d.mts +10 -0
  86. package/dist/auth/legacy/ui/miniapp/index.d.ts +10 -0
  87. package/dist/auth/legacy/ui/miniapp/index.js +23 -0
  88. package/dist/auth/legacy/ui/miniapp/index.js.map +1 -0
  89. package/dist/auth/legacy/ui/miniapp/index.mjs +6 -0
  90. package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -0
  91. package/dist/auth/legacy/ui/web/index.d.mts +22 -0
  92. package/dist/auth/legacy/ui/web/index.d.ts +22 -0
  93. package/dist/auth/legacy/ui/web/index.js +31 -0
  94. package/dist/auth/legacy/ui/web/index.js.map +1 -0
  95. package/dist/auth/legacy/ui/web/index.mjs +6 -0
  96. package/dist/auth/legacy/ui/web/index.mjs.map +1 -0
  97. package/dist/calendar/index.d.mts +390 -237
  98. package/dist/calendar/index.d.ts +390 -237
  99. package/dist/calendar/index.js +3825 -3785
  100. package/dist/calendar/index.js.map +1 -1
  101. package/dist/calendar/index.mjs +3730 -3696
  102. package/dist/calendar/index.mjs.map +1 -1
  103. package/dist/calendar/routes/index.js +30 -327
  104. package/dist/calendar/routes/index.js.map +1 -1
  105. package/dist/calendar/routes/index.mjs +1 -323
  106. package/dist/calendar/routes/index.mjs.map +1 -1
  107. package/dist/calendar/server.d.mts +6 -0
  108. package/dist/calendar/server.d.ts +6 -0
  109. package/dist/calendar/server.js +41 -13
  110. package/dist/calendar/server.js.map +1 -1
  111. package/dist/calendar/server.mjs +2 -2
  112. package/dist/calendar/server.mjs.map +1 -1
  113. package/dist/chunk-24F7KUED.js +263 -0
  114. package/dist/chunk-24F7KUED.js.map +1 -0
  115. package/dist/{chunk-YMS6BPXS.js → chunk-27IUMDDK.js} +3 -3
  116. package/dist/{chunk-YMS6BPXS.js.map → chunk-27IUMDDK.js.map} +1 -1
  117. package/dist/chunk-37M6NZIF.js +279 -0
  118. package/dist/chunk-37M6NZIF.js.map +1 -0
  119. package/dist/chunk-3JMUNOUT.js +144 -0
  120. package/dist/chunk-3JMUNOUT.js.map +1 -0
  121. package/dist/chunk-3PFCOTJP.mjs +256 -0
  122. package/dist/chunk-3PFCOTJP.mjs.map +1 -0
  123. package/dist/{chunk-NZZZUMMX.mjs → chunk-57MVE5LL.mjs} +3 -3
  124. package/dist/{chunk-NZZZUMMX.mjs.map → chunk-57MVE5LL.mjs.map} +1 -1
  125. package/dist/{chunk-622Y6LTH.mjs → chunk-5BLZEVWK.mjs} +196 -468
  126. package/dist/chunk-5BLZEVWK.mjs.map +1 -0
  127. package/dist/{chunk-YN4MJFIG.js → chunk-5LCGOCKG.js} +5 -5
  128. package/dist/{chunk-YN4MJFIG.js.map → chunk-5LCGOCKG.js.map} +1 -1
  129. package/dist/chunk-6XUQ2B4K.js +219 -0
  130. package/dist/chunk-6XUQ2B4K.js.map +1 -0
  131. package/dist/{chunk-NCOXT7SK.js → chunk-77UEPWVQ.js} +4 -4
  132. package/dist/{chunk-NCOXT7SK.js.map → chunk-77UEPWVQ.js.map} +1 -1
  133. package/dist/chunk-CFM56MGO.mjs +35 -0
  134. package/dist/chunk-CFM56MGO.mjs.map +1 -0
  135. package/dist/chunk-CPSFYP34.mjs +140 -0
  136. package/dist/chunk-CPSFYP34.mjs.map +1 -0
  137. package/dist/chunk-D22QBOCM.mjs +336 -0
  138. package/dist/chunk-D22QBOCM.mjs.map +1 -0
  139. package/dist/chunk-DA4QV64P.mjs +35 -0
  140. package/dist/chunk-DA4QV64P.mjs.map +1 -0
  141. package/dist/chunk-EKDLZND6.js +275 -0
  142. package/dist/chunk-EKDLZND6.js.map +1 -0
  143. package/dist/chunk-EKQPFZXQ.js +12 -0
  144. package/dist/chunk-EKQPFZXQ.js.map +1 -0
  145. package/dist/chunk-ERAAB5VG.js +324 -0
  146. package/dist/chunk-ERAAB5VG.js.map +1 -0
  147. package/dist/chunk-ESLY72VI.mjs +175 -0
  148. package/dist/chunk-ESLY72VI.mjs.map +1 -0
  149. package/dist/chunk-FGQGWW73.js +38 -0
  150. package/dist/chunk-FGQGWW73.js.map +1 -0
  151. package/dist/chunk-FXQOXLDE.js +120 -0
  152. package/dist/chunk-FXQOXLDE.js.map +1 -0
  153. package/dist/chunk-FZELCJR7.mjs +19 -0
  154. package/dist/chunk-FZELCJR7.mjs.map +1 -0
  155. package/dist/{chunk-HHVDOIPV.js → chunk-H3P2PGZL.js} +3 -3
  156. package/dist/{chunk-HHVDOIPV.js.map → chunk-H3P2PGZL.js.map} +1 -1
  157. package/dist/chunk-HBQMN5QM.mjs +10 -0
  158. package/dist/chunk-HBQMN5QM.mjs.map +1 -0
  159. package/dist/chunk-ITRIXMXF.mjs +862 -0
  160. package/dist/chunk-ITRIXMXF.mjs.map +1 -0
  161. package/dist/chunk-IUWSCUDC.js +4 -0
  162. package/dist/chunk-IUWSCUDC.js.map +1 -0
  163. package/dist/chunk-JCKCKRC2.js +50 -0
  164. package/dist/chunk-JCKCKRC2.js.map +1 -0
  165. package/dist/chunk-L7GQNY54.mjs +286 -0
  166. package/dist/chunk-L7GQNY54.mjs.map +1 -0
  167. package/dist/{chunk-ZRWED7Q6.js → chunk-LDVJ7URJ.js} +235 -520
  168. package/dist/chunk-LDVJ7URJ.js.map +1 -0
  169. package/dist/{chunk-CYTXGBP2.js → chunk-MLP74E3O.js} +573 -1607
  170. package/dist/chunk-MLP74E3O.js.map +1 -0
  171. package/dist/chunk-NAX4TUT7.js +182 -0
  172. package/dist/chunk-NAX4TUT7.js.map +1 -0
  173. package/dist/chunk-NW4EN4YI.mjs +213 -0
  174. package/dist/chunk-NW4EN4YI.mjs.map +1 -0
  175. package/dist/chunk-P3QMT3AY.mjs +44 -0
  176. package/dist/chunk-P3QMT3AY.mjs.map +1 -0
  177. package/dist/chunk-PJ4KYAQZ.mjs +631 -0
  178. package/dist/chunk-PJ4KYAQZ.mjs.map +1 -0
  179. package/dist/chunk-PLSEAREM.js +345 -0
  180. package/dist/chunk-PLSEAREM.js.map +1 -0
  181. package/dist/{chunk-EGJPS7OL.mjs → chunk-QZU4UJZG.mjs} +3 -3
  182. package/dist/{chunk-EGJPS7OL.mjs.map → chunk-QZU4UJZG.mjs.map} +1 -1
  183. package/dist/chunk-RJVR33ME.mjs +3 -0
  184. package/dist/chunk-RJVR33ME.mjs.map +1 -0
  185. package/dist/chunk-SYBHDB2D.js +650 -0
  186. package/dist/chunk-SYBHDB2D.js.map +1 -0
  187. package/dist/chunk-TVKVM7JT.js +21 -0
  188. package/dist/chunk-TVKVM7JT.js.map +1 -0
  189. package/dist/{chunk-PONZPO3U.mjs → chunk-UTB72ZJ7.mjs} +414 -1448
  190. package/dist/chunk-UTB72ZJ7.mjs.map +1 -0
  191. package/dist/chunk-V7EVKD5G.mjs +116 -0
  192. package/dist/chunk-V7EVKD5G.mjs.map +1 -0
  193. package/dist/chunk-VGPR3KLR.js +872 -0
  194. package/dist/chunk-VGPR3KLR.js.map +1 -0
  195. package/dist/chunk-VS7WATQD.js +255 -0
  196. package/dist/chunk-VS7WATQD.js.map +1 -0
  197. package/dist/chunk-VSP7XJT5.mjs +272 -0
  198. package/dist/chunk-VSP7XJT5.mjs.map +1 -0
  199. package/dist/{chunk-CSDIPQQO.mjs → chunk-VTKAIOP5.mjs} +5 -5
  200. package/dist/{chunk-CSDIPQQO.mjs.map → chunk-VTKAIOP5.mjs.map} +1 -1
  201. package/dist/chunk-VULJUXTF.mjs +267 -0
  202. package/dist/chunk-VULJUXTF.mjs.map +1 -0
  203. package/dist/chunk-XAHM6B3V.js +44 -0
  204. package/dist/chunk-XAHM6B3V.js.map +1 -0
  205. package/dist/chunk-YSF5YISM.mjs +248 -0
  206. package/dist/chunk-YSF5YISM.mjs.map +1 -0
  207. package/dist/{chunk-OFYBMMWT.mjs → chunk-YYJEVAJI.mjs} +3 -3
  208. package/dist/{chunk-OFYBMMWT.mjs.map → chunk-YYJEVAJI.mjs.map} +1 -1
  209. package/dist/components/index.d.mts +1 -0
  210. package/dist/components/index.d.ts +1 -0
  211. package/dist/components/index.js +182 -181
  212. package/dist/components/index.mjs +4 -3
  213. package/dist/index-DNKZ7-R_.d.mts +184 -0
  214. package/dist/index-DNKZ7-R_.d.ts +184 -0
  215. package/dist/index.d.mts +4 -1
  216. package/dist/index.d.ts +4 -1
  217. package/dist/index.js +285 -229
  218. package/dist/index.js.map +1 -1
  219. package/dist/index.mjs +15 -10
  220. package/dist/index.mjs.map +1 -1
  221. package/dist/mikuFusionGame/index.js +3 -3
  222. package/dist/mikuFusionGame/index.mjs +2 -2
  223. package/dist/mmd/index.d.mts +67 -9
  224. package/dist/mmd/index.d.ts +67 -9
  225. package/dist/mmd/index.js +969 -625
  226. package/dist/mmd/index.js.map +1 -1
  227. package/dist/mmd/index.mjs +969 -628
  228. package/dist/mmd/index.mjs.map +1 -1
  229. package/dist/portfolio/index.js +10 -9
  230. package/dist/portfolio/index.mjs +5 -4
  231. package/dist/qqbot/index.d.mts +2 -0
  232. package/dist/qqbot/index.d.ts +2 -0
  233. package/dist/qqbot/index.js +21 -0
  234. package/dist/qqbot/index.js.map +1 -0
  235. package/dist/qqbot/index.mjs +4 -0
  236. package/dist/qqbot/index.mjs.map +1 -0
  237. package/dist/qqbot/server/index.d.mts +91 -0
  238. package/dist/qqbot/server/index.d.ts +91 -0
  239. package/dist/qqbot/server/index.js +21 -0
  240. package/dist/qqbot/server/index.js.map +1 -0
  241. package/dist/qqbot/server/index.mjs +4 -0
  242. package/dist/qqbot/server/index.mjs.map +1 -0
  243. package/dist/qqbot/ui/web/index.d.mts +10 -0
  244. package/dist/qqbot/ui/web/index.d.ts +10 -0
  245. package/dist/qqbot/ui/web/index.js +105 -0
  246. package/dist/qqbot/ui/web/index.js.map +1 -0
  247. package/dist/qqbot/ui/web/index.mjs +99 -0
  248. package/dist/qqbot/ui/web/index.mjs.map +1 -0
  249. package/dist/screenReceiver/index.d.mts +78 -0
  250. package/dist/screenReceiver/index.d.ts +78 -0
  251. package/dist/screenReceiver/index.js +17 -0
  252. package/dist/screenReceiver/index.js.map +1 -0
  253. package/dist/screenReceiver/index.mjs +4 -0
  254. package/dist/screenReceiver/index.mjs.map +1 -0
  255. package/dist/screenReceiver/server/index.d.mts +36 -0
  256. package/dist/screenReceiver/server/index.d.ts +36 -0
  257. package/dist/screenReceiver/server/index.js +160 -0
  258. package/dist/screenReceiver/server/index.js.map +1 -0
  259. package/dist/screenReceiver/server/index.mjs +157 -0
  260. package/dist/screenReceiver/server/index.mjs.map +1 -0
  261. package/dist/showmasterpiece/db/index.js +42 -42
  262. package/dist/showmasterpiece/db/index.mjs +1 -1
  263. package/dist/showmasterpiece/index.js +52 -41
  264. package/dist/showmasterpiece/index.js.map +1 -1
  265. package/dist/showmasterpiece/index.mjs +15 -4
  266. package/dist/showmasterpiece/index.mjs.map +1 -1
  267. package/dist/showmasterpiece/server/index.js +42 -42
  268. package/dist/showmasterpiece/server/index.mjs +1 -1
  269. package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -0
  270. package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -0
  271. package/dist/showmasterpiece/ui/miniapp/index.js +83 -55
  272. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
  273. package/dist/showmasterpiece/ui/miniapp/index.mjs +83 -55
  274. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
  275. package/dist/showmasterpiece/ui/web/index.js +43 -32
  276. package/dist/showmasterpiece/ui/web/index.mjs +15 -4
  277. package/dist/testYourself/index.js +13 -13
  278. package/dist/testYourself/index.mjs +2 -2
  279. package/dist/types-B-hOccQw.d.mts +122 -0
  280. package/dist/types-B8rGXc4e.d.mts +38 -0
  281. package/dist/types-Cg89HGz2.d.ts +38 -0
  282. package/dist/types-CvKvpyN8.d.mts +48 -0
  283. package/dist/types-CvKvpyN8.d.ts +48 -0
  284. package/dist/types-Dy6x2gJW.d.ts +122 -0
  285. package/dist/universalFile/server/index.js +11 -11
  286. package/dist/universalFile/server/index.mjs +4 -4
  287. package/package.json +101 -1
  288. package/dist/UniversalFileService-336GFY6N.mjs +0 -6
  289. package/dist/UniversalFileService-J6ET6KZK.js +0 -15
  290. package/dist/chunk-622Y6LTH.mjs.map +0 -1
  291. package/dist/chunk-CYTXGBP2.js.map +0 -1
  292. package/dist/chunk-GVVS4IMM.mjs +0 -302
  293. package/dist/chunk-GVVS4IMM.mjs.map +0 -1
  294. package/dist/chunk-PONZPO3U.mjs.map +0 -1
  295. package/dist/chunk-WC5QFO3T.js +0 -314
  296. package/dist/chunk-WC5QFO3T.js.map +0 -1
  297. package/dist/chunk-ZRWED7Q6.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/legacy/components/ForgotPasswordModal.tsx","../src/auth/legacy/components/LoginModal.tsx","../src/auth/legacy/components/AuthGuard.tsx","../src/auth/legacy/components/RegisterModal.tsx","../src/auth/legacy/components/UserMenu.tsx"],"names":["error","React","useState","useEffect","X","Lock","EyeOff","Eye","createPortal","Phone","User"],"mappings":"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","file":"chunk-ITRIXMXF.mjs","sourcesContent":["'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X, Phone, Lock, Eye, EyeOff } from 'lucide-react';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { ForgotPasswordModalProps } from '../types';\n\nexport default function ForgotPasswordModal({ isOpen, onClose, onSuccess }: ForgotPasswordModalProps) {\n const [formData, setFormData] = useState({\n phone: '',\n newPassword: '',\n confirmPassword: '',\n verificationCode: '',\n });\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [countdown, setCountdown] = useState(0);\n const [mounted, setMounted] = useState(false);\n\n // 确保在客户端渲染\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({ ...prev, [name]: value }));\n if (error) setError(''); // 清除错误信息\n };\n\n const validateForm = () => {\n if (!formData.phone || !formData.newPassword || !formData.confirmPassword || !formData.verificationCode) {\n setError('请填写完整信息');\n return false;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号格式');\n return false;\n }\n\n const passwordValidation = validatePassword(formData.newPassword);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n return false;\n }\n\n if (formData.newPassword !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n return false;\n }\n\n if (!/^\\d{6}$/.test(formData.verificationCode)) {\n setError('请输入6位数字验证码');\n return false;\n }\n\n return true;\n };\n\n const handleSendCode = async () => {\n if (!formData.phone) {\n setError('请输入手机号');\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号格式');\n return;\n }\n\n try {\n setLoading(true);\n setError(''); // 清除之前的错误信息\n \n const response = await fetch('/api/auth/send-verification-code', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ phone: formData.phone }),\n });\n\n const data = await response.json();\n if (data.success) {\n // 开始倒计时\n setCountdown(60);\n const timer = setInterval(() => {\n setCountdown(prev => {\n if (prev <= 1) {\n clearInterval(timer);\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n \n // 显示成功提示\n console.log('✅ 验证码发送成功');\n } else {\n setError(data.message || '发送验证码失败');\n }\n } catch (error) {\n console.error('发送验证码异常:', error);\n setError('发送验证码失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n\n try {\n if (!validateForm()) {\n return;\n }\n\n const response = await fetch('/api/auth/reset-password', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n phone: formData.phone,\n newPassword: formData.newPassword,\n verificationCode: formData.verificationCode,\n }),\n });\n\n const data = await response.json();\n if (data.success) {\n onSuccess();\n } else {\n setError(data.message || '重置密码失败');\n }\n } catch (error) {\n setError('重置密码失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n if (!isOpen || !mounted) return null;\n\n const modalContent = (\n <div \n className=\"fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4\"\n style={{ margin: 0 }}\n onClick={handleOverlayClick}\n >\n <div \n className=\"bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 关闭按钮 */}\n <button \n className=\"absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center\"\n onClick={onClose}\n >\n <X size={20} />\n </button>\n\n {/* 标题 */}\n <div className=\"px-6 pt-6 pb-4 text-center border-b border-gray-100\">\n <h2 className=\"text-2xl font-semibold text-gray-800 mb-2\">重置密码</h2>\n <p className=\"text-gray-500 text-sm\">请输入手机号和验证码重置密码</p>\n </div>\n\n {/* 重置密码表单 */}\n <form onSubmit={handleSubmit} className=\"p-6\">\n {/* 手机号输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"phone\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 手机号\n </label>\n <div className=\"relative flex items-center\">\n <Phone size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"phone\"\n name=\"phone\"\n type=\"tel\"\n value={formData.phone}\n onChange={handleInputChange}\n placeholder=\"请输入手机号\"\n className=\"w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n </div>\n </div>\n\n {/* 验证码输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"verificationCode\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 验证码\n </label>\n <div className=\"relative flex items-center\">\n <input\n id=\"verificationCode\"\n name=\"verificationCode\"\n type=\"text\"\n value={formData.verificationCode}\n onChange={handleInputChange}\n placeholder=\"请输入验证码\"\n className=\"w-full py-3 px-4 pr-28 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n maxLength={6}\n />\n <button\n type=\"button\"\n className=\"absolute right-2 top-1/2 -translate-y-1/2 bg-transparent border-none text-blue-500 text-sm font-medium cursor-pointer px-2 py-1 rounded transition-all whitespace-nowrap hover:bg-blue-50 disabled:text-gray-400 disabled:cursor-not-allowed\"\n onClick={handleSendCode}\n disabled={loading || countdown > 0}\n >\n {countdown > 0 ? `${countdown}秒后重试` : '发送验证码'}\n </button>\n </div>\n </div>\n\n {/* 新密码输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"newPassword\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 新密码\n </label>\n <div className=\"relative flex items-center\">\n <Lock size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"newPassword\"\n name=\"newPassword\"\n type={showPassword ? 'text' : 'password'}\n value={formData.newPassword}\n onChange={handleInputChange}\n placeholder=\"请输入新密码\"\n className=\"w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n <button\n type=\"button\"\n className=\"absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() => setShowPassword(!showPassword)}\n disabled={loading}\n >\n {showPassword ? <EyeOff size={18} /> : <Eye size={18} />}\n </button>\n </div>\n </div>\n\n {/* 确认密码输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"confirmPassword\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 确认密码\n </label>\n <div className=\"relative flex items-center\">\n <Lock size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n type={showConfirmPassword ? 'text' : 'password'}\n value={formData.confirmPassword}\n onChange={handleInputChange}\n placeholder=\"请再次输入新密码\"\n className=\"w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n <button\n type=\"button\"\n className=\"absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n disabled={loading}\n >\n {showConfirmPassword ? <EyeOff size={18} /> : <Eye size={18} />}\n </button>\n </div>\n </div>\n\n {/* 错误信息 */}\n {error && (\n <div className=\"text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed\">\n {error}\n </div>\n )}\n\n {/* 提交按钮 */}\n <button\n type=\"submit\"\n className=\"w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2\"\n disabled={loading}\n >\n {loading ? '提交中...' : '重置密码'}\n </button>\n </form>\n </div>\n </div>\n );\n\n // 使用 Portal 渲染到 body,避免父组件样式影响\n return createPortal(modalContent, document.body);\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X, User, Lock, Eye, EyeOff } from 'lucide-react';\nimport { useAuth } from '../contexts/AuthContext';\nimport { validatePhoneNumber } from '../utils/authUtils';\nimport type { LoginModalProps } from '../types';\nimport ForgotPasswordModal from './ForgotPasswordModal';\n\n/**\n * 登录模态框组件\n * 提供用户登录界面和逻辑\n */\nexport default function LoginModal({ isOpen, onClose, onSuccess, onSwitchToRegister }: LoginModalProps) {\n const { login } = useAuth();\n const [formData, setFormData] = useState({\n phone: '',\n password: '',\n });\n const [showPassword, setShowPassword] = useState(false);\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [showForgotPassword, setShowForgotPassword] = useState(false);\n const [mounted, setMounted] = useState(false);\n\n // 确保在客户端渲染\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // 开发环境快速填充\n const fillDemoAccount = (type: 'admin' | 'user') => {\n if (process.env.NODE_ENV === 'development') {\n const accounts = {\n admin: { phone: '13800138000', password: 'admin123456' },\n user: { phone: '13900139000', password: 'test123456' }\n };\n setFormData(accounts[type]);\n setError('');\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({ ...prev, [name]: value }));\n if (error) setError(''); // 清除错误信息\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n\n console.log('🔄 [LoginModal] handleSubmit 开始');\n\n try {\n // 前端验证\n if (!formData.phone || !formData.password) {\n console.log('❌ [LoginModal] 前端验证失败: 信息不完整');\n setError('请填写完整信息');\n return;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n console.log('❌ [LoginModal] 前端验证失败: 手机号格式错误');\n setError('请输入正确的手机号');\n return;\n }\n\n console.log('✅ [LoginModal] 前端验证通过');\n console.log('🔑 [LoginModal] 提交登录表单:', { \n phone: formData.phone, \n password: '***' \n });\n\n console.log('📞 [LoginModal] 准备调用 useAuth.login()...');\n \n // 使用useAuth的login方法\n const result = await login(formData);\n \n console.log('📡 [LoginModal] useAuth.login() 返回结果:', result);\n\n if (result.success) {\n console.log('✅ [LoginModal] 登录成功,准备调用 onSuccess()');\n console.log('👤 [LoginModal] 登录成功的用户信息:', result.user);\n \n // 短暂延迟确保状态已更新\n setTimeout(() => {\n console.log('🎯 [LoginModal] 调用 onSuccess 回调');\n onSuccess();\n console.log('🏁 [LoginModal] onSuccess 调用完成');\n }, 100);\n \n } else {\n console.log('❌ [LoginModal] 登录失败:', result.message);\n setError(result.message || '登录失败');\n }\n } catch (error) {\n console.error('💥 [LoginModal] 登录异常:', error);\n setError('登录失败,请稍后重试');\n } finally {\n console.log('🔚 [LoginModal] handleSubmit 结束,设置 loading = false');\n setLoading(false);\n }\n };\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n if (!isOpen || !mounted) return null;\n\n const modalContent = (\n <>\n {/* 遮罩层 */}\n <div \n className=\"fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4\"\n style={{ margin: 0 }}\n onClick={handleOverlayClick}\n >\n {/* 模态框主体 */}\n <div \n className=\"bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 关闭按钮 */}\n <button \n className=\"absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center\"\n onClick={onClose}\n >\n <X size={20} />\n </button>\n\n {/* 标题 */}\n <div className=\"px-6 pt-6 pb-4 text-center border-b border-gray-100\">\n <h2 className=\"text-2xl font-semibold text-gray-800 mb-2\">用户登录</h2>\n <p className=\"text-gray-500 text-sm\">请输入您的手机号和密码</p>\n </div>\n\n {/* 开发环境快捷登录 */}\n {process.env.NODE_ENV === 'development' && (\n <div className=\"px-6 py-4 bg-amber-50 border-b border-gray-100\">\n <p className=\"text-xs text-amber-800 font-medium mb-2\">开发环境快捷登录:</p>\n <div className=\"flex gap-2\">\n <button \n type=\"button\" \n onClick={() => fillDemoAccount('admin')} \n className=\"px-3 py-1.5 text-xs bg-amber-400 text-amber-900 border-none rounded-md cursor-pointer transition-all font-medium hover:bg-amber-500\"\n >\n 管理员账号\n </button>\n <button \n type=\"button\" \n onClick={() => fillDemoAccount('user')} \n className=\"px-3 py-1.5 text-xs bg-amber-400 text-amber-900 border-none rounded-md cursor-pointer transition-all font-medium hover:bg-amber-500\"\n >\n 用户账号\n </button>\n </div>\n </div>\n )}\n\n {/* 登录表单 */}\n <form onSubmit={handleSubmit} className=\"p-6\">\n {/* 手机号输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"phone\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 手机号\n </label>\n <div className=\"relative flex items-center\">\n <User size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"phone\"\n name=\"phone\"\n type=\"tel\"\n value={formData.phone}\n onChange={handleInputChange}\n placeholder=\"请输入手机号\"\n className=\"w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n </div>\n </div>\n\n {/* 密码输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"password\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 密码\n </label>\n <div className=\"relative flex items-center\">\n <Lock size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"password\"\n name=\"password\"\n type={showPassword ? 'text' : 'password'}\n value={formData.password}\n onChange={handleInputChange}\n placeholder=\"请输入密码\"\n className=\"w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n <button\n type=\"button\"\n className=\"absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() => setShowPassword(!showPassword)}\n disabled={loading}\n >\n {showPassword ? <EyeOff size={18} /> : <Eye size={18} />}\n </button>\n </div>\n </div>\n\n {/* 忘记密码链接 */}\n <div className=\"text-right -mt-2 mb-4\">\n <button\n type=\"button\"\n onClick={() => setShowForgotPassword(true)}\n className=\"bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n >\n 忘记密码?\n </button>\n </div>\n\n {/* 错误信息 */}\n {error && (\n <div className=\"text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed\">\n {error}\n </div>\n )}\n\n {/* 提交按钮 */}\n <button\n type=\"submit\"\n className=\"w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2\"\n disabled={loading}\n >\n {loading ? '登录中...' : '登录'}\n </button>\n\n {/* 注册链接 */}\n {onSwitchToRegister && (\n <div className=\"text-center mt-5 pt-4 border-t border-gray-100\">\n <span className=\"text-gray-500 text-sm mr-1\">还没有账号?</span>\n <button \n type=\"button\" \n onClick={onSwitchToRegister} \n className=\"bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n >\n 立即注册\n </button>\n </div>\n )}\n </form>\n </div>\n </div>\n\n {/* 忘记密码模态框 */}\n <ForgotPasswordModal\n isOpen={showForgotPassword}\n onClose={() => setShowForgotPassword(false)}\n onSuccess={() => {\n setShowForgotPassword(false);\n onSuccess();\n }}\n />\n </>\n );\n\n // 使用 Portal 渲染到 body,避免父组件样式影响\n return createPortal(modalContent, document.body);\n}\n","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { useAuth } from '../contexts/AuthContext';\nimport LoginModal from './LoginModal';\nimport type { AuthGuardProps } from '../types';\n\n/**\n * 认证守卫组件\n * 保护需要登录的页面和组件\n */\nexport default function AuthGuard({ \n children, \n fallback,\n requireAuth = true \n}: AuthGuardProps) {\n const { isAuthenticated, loading, refreshUser } = useAuth();\n const [showLoginModal, setShowLoginModal] = useState(false);\n\n useEffect(() => {\n if (!loading && requireAuth && !isAuthenticated) {\n setShowLoginModal(true);\n }\n }, [loading, requireAuth, isAuthenticated]);\n\n // 登录成功后的处理\n const handleLoginSuccess = () => {\n refreshUser();\n setShowLoginModal(false);\n };\n\n // 如果正在加载,显示加载状态\n if (loading) {\n return (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '200px',\n color: '#6b7280',\n flexDirection: 'column',\n gap: '12px'\n }}>\n <div style={{\n width: '32px',\n height: '32px',\n border: '3px solid #e5e7eb',\n borderTop: '3px solid #3b82f6',\n borderRadius: '50%',\n animation: 'spin 1s linear infinite'\n }}></div>\n <div>验证登录状态...</div>\n </div>\n );\n }\n\n // 如果需要认证但未登录,显示登录模态框\n if (requireAuth && !isAuthenticated) {\n return (\n <>\n {fallback || (\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: '200px',\n color: '#6b7280',\n flexDirection: 'column',\n gap: '16px',\n padding: '24px',\n textAlign: 'center'\n }}>\n <div style={{\n fontSize: '48px',\n opacity: 0.5\n }}>\n 🔒\n </div>\n <div style={{\n fontSize: '18px',\n fontWeight: '500'\n }}>\n 请先登录以访问此页面\n </div>\n <div style={{\n fontSize: '14px',\n opacity: 0.7\n }}>\n 登录后即可查看相关内容\n </div>\n </div>\n )}\n <LoginModal\n isOpen={showLoginModal}\n onClose={() => setShowLoginModal(false)}\n onSuccess={handleLoginSuccess}\n />\n </>\n );\n }\n\n // 已认证或不需要认证,显示子组件\n return <>{children}</>;\n} ","'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X, User, Lock, Phone, Eye, EyeOff } from 'lucide-react';\nimport { useAuth } from '../contexts/AuthContext';\nimport { validatePhoneNumber, validatePassword } from '../utils/authUtils';\nimport type { RegisterModalProps } from '../types';\n\nexport default function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }: RegisterModalProps) {\n const { register } = useAuth();\n const [formData, setFormData] = useState({\n phone: '',\n password: '',\n confirmPassword: '',\n name: '',\n });\n const [showPassword, setShowPassword] = useState(false);\n const [showConfirmPassword, setShowConfirmPassword] = useState(false);\n const [error, setError] = useState('');\n const [loading, setLoading] = useState(false);\n const [mounted, setMounted] = useState(false);\n\n // 确保在客户端渲染\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const { name, value } = e.target;\n setFormData(prev => ({ ...prev, [name]: value }));\n if (error) setError(''); // 清除错误信息\n };\n\n const validateForm = () => {\n if (!formData.phone || !formData.password || !formData.confirmPassword) {\n setError('请填写必要信息');\n return false;\n }\n\n if (!validatePhoneNumber(formData.phone)) {\n setError('请输入正确的手机号格式');\n return false;\n }\n\n const passwordValidation = validatePassword(formData.password);\n if (!passwordValidation.valid) {\n setError(passwordValidation.message || '密码格式错误');\n return false;\n }\n\n if (formData.password !== formData.confirmPassword) {\n setError('两次输入的密码不一致');\n return false;\n }\n\n return true;\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n setError('');\n setLoading(true);\n\n try {\n if (!validateForm()) {\n return;\n }\n\n console.log('📝 [RegisterModal] 提交注册表单:', { \n phone: formData.phone, \n name: formData.name || '未设置',\n password: '***' \n });\n\n // 使用useAuth的register方法\n const result = await register({\n phone: formData.phone,\n password: formData.password,\n name: formData.name || undefined,\n });\n\n if (result.success) {\n console.log('✅ [RegisterModal] 注册成功');\n onSuccess();\n } else {\n console.log('❌ [RegisterModal] 注册失败:', result.message);\n setError(result.message || '注册失败');\n }\n } catch (error) {\n console.error('💥 [RegisterModal] 注册异常:', error);\n setError('注册失败,请稍后重试');\n } finally {\n setLoading(false);\n }\n };\n\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n if (!isOpen || !mounted) return null;\n\n const modalContent = (\n <div \n className=\"fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4\"\n style={{ margin: 0 }}\n onClick={handleOverlayClick}\n >\n <div \n className=\"bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* 关闭按钮 */}\n <button \n className=\"absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center\"\n onClick={onClose}\n >\n <X size={20} />\n </button>\n\n {/* 标题 */}\n <div className=\"px-6 pt-6 pb-4 text-center border-b border-gray-100\">\n <h2 className=\"text-2xl font-semibold text-gray-800 mb-2\">用户注册</h2>\n <p className=\"text-gray-500 text-sm\">请填写以下信息创建账户</p>\n </div>\n\n {/* 注册表单 */}\n <form onSubmit={handleSubmit} className=\"p-6\">\n {/* 手机号输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"phone\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 手机号 *\n </label>\n <div className=\"relative flex items-center\">\n <Phone size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"phone\"\n name=\"phone\"\n type=\"tel\"\n value={formData.phone}\n onChange={handleInputChange}\n placeholder=\"请输入手机号\"\n className=\"w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n </div>\n </div>\n\n {/* 姓名输入(可选) */}\n <div className=\"mb-5\">\n <label htmlFor=\"name\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 姓名\n </label>\n <div className=\"relative flex items-center\">\n <User size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"name\"\n name=\"name\"\n type=\"text\"\n value={formData.name}\n onChange={handleInputChange}\n placeholder=\"请输入姓名(可选)\"\n className=\"w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n </div>\n </div>\n\n {/* 密码输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"password\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 密码 *\n </label>\n <div className=\"relative flex items-center\">\n <Lock size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"password\"\n name=\"password\"\n type={showPassword ? 'text' : 'password'}\n value={formData.password}\n onChange={handleInputChange}\n placeholder=\"请输入密码(至少6位)\"\n className=\"w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n <button\n type=\"button\"\n className=\"absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() => setShowPassword(!showPassword)}\n disabled={loading}\n >\n {showPassword ? <EyeOff size={18} /> : <Eye size={18} />}\n </button>\n </div>\n </div>\n\n {/* 确认密码输入 */}\n <div className=\"mb-5\">\n <label htmlFor=\"confirmPassword\" className=\"block mb-1.5 text-sm font-medium text-gray-700\">\n 确认密码 *\n </label>\n <div className=\"relative flex items-center\">\n <Lock size={18} className=\"absolute left-4 text-gray-400 z-[1] pointer-events-none\" />\n <input\n id=\"confirmPassword\"\n name=\"confirmPassword\"\n type={showConfirmPassword ? 'text' : 'password'}\n value={formData.confirmPassword}\n onChange={handleInputChange}\n placeholder=\"请再次输入密码\"\n className=\"w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed\"\n disabled={loading}\n />\n <button\n type=\"button\"\n className=\"absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50\"\n onClick={() => setShowConfirmPassword(!showConfirmPassword)}\n disabled={loading}\n >\n {showConfirmPassword ? <EyeOff size={18} /> : <Eye size={18} />}\n </button>\n </div>\n </div>\n\n {/* 错误信息 */}\n {error && (\n <div className=\"text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed\">\n {error}\n </div>\n )}\n\n {/* 提交按钮 */}\n <button\n type=\"submit\"\n className=\"w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2\"\n disabled={loading}\n >\n {loading ? '注册中...' : '注册'}\n </button>\n\n {/* 登录链接 */}\n {onSwitchToLogin && (\n <div className=\"text-center mt-5 pt-4 border-t border-gray-100\">\n <span className=\"text-gray-500 text-sm mr-1\">已有账号?</span>\n <button \n type=\"button\" \n onClick={onSwitchToLogin} \n className=\"bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2\"\n >\n 立即登录\n </button>\n </div>\n )}\n </form>\n </div>\n </div>\n );\n\n // 使用 Portal 渲染到 body,避免父组件样式影响\n return createPortal(modalContent, document.body);\n}\n","'use client';\n\nimport React, { useState } from 'react';\nimport { LogOut, LogIn, User } from 'lucide-react';\nimport { useAuth } from '../contexts/AuthContext';\nimport LoginModal from './LoginModal';\nimport RegisterModal from './RegisterModal';\nimport type { UserMenuProps } from '../types';\n\nexport default function UserMenu({ customMenuItems = [], className }: UserMenuProps) {\n const { user, isAuthenticated, logout } = useAuth();\n const [isOpen, setIsOpen] = useState(false);\n const [showLoginModal, setShowLoginModal] = useState(false);\n const [showRegisterModal, setShowRegisterModal] = useState(false);\n\n // 切换菜单显示\n const toggleMenu = () => {\n setIsOpen(!isOpen);\n };\n\n // 点击菜单外部时关闭菜单\n const handleMenuClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n };\n\n // 处理自定义菜单项点击\n const handleCustomMenuClick = (item: any) => {\n console.log(`🔧 [UserMenu] 自定义菜单项被点击: ${item.label}`);\n item.onClick();\n setIsOpen(false);\n };\n\n // 处理登录\n const handleLogin = () => {\n console.log('🔑 [UserMenu] 登录按钮被点击');\n setShowLoginModal(true);\n setIsOpen(false);\n };\n\n // 处理注册\n const handleRegister = () => {\n console.log('📝 [UserMenu] 注册按钮被点击');\n setShowRegisterModal(true);\n setIsOpen(false);\n };\n\n // 处理退出登录\n const handleLogout = async () => {\n console.log('🚪 [UserMenu] 退出登录按钮被点击');\n try {\n await logout();\n console.log('✅ [UserMenu] 退出登录成功');\n } catch (error) {\n console.error('退出登录失败:', error);\n }\n setIsOpen(false);\n };\n\n // 登录成功后的处理\n const handleAuthSuccess = () => {\n console.log('🎉 [UserMenu] 认证成功回调被调用');\n console.log('👤 [UserMenu] 当前useAuth状态:', {\n user: user ? `${user.name || '未设置'} (${user.phone})` : null,\n isAuthenticated\n });\n \n // useAuth hook会自动更新状态,这里不需要手动处理\n setShowLoginModal(false);\n setShowRegisterModal(false);\n \n console.log('✅ [UserMenu] 认证成功处理完成 - 模态框已关闭');\n \n // 延迟检查状态\n setTimeout(() => {\n console.log('🔍 [UserMenu] 延迟状态检查:', {\n user: user ? `${user.name || '未设置'} (${user.phone})` : null,\n isAuthenticated\n });\n }, 500);\n };\n\n // 从登录切换到注册\n const handleSwitchToRegister = () => {\n console.log('🔄 [UserMenu] 从登录切换到注册');\n setShowLoginModal(false);\n setShowRegisterModal(true);\n };\n\n // 从注册切换到登录\n const handleSwitchToLogin = () => {\n console.log('🔄 [UserMenu] 从注册切换到登录');\n setShowRegisterModal(false);\n setShowLoginModal(true);\n };\n\n // 过滤自定义菜单项:根据登录状态和requireAuth属性\n const getVisibleCustomMenuItems = () => {\n return customMenuItems.filter(item => {\n // 如果设置了requireAuth为true,只有登录后才显示\n if (item.requireAuth === true) {\n return isAuthenticated;\n }\n // 如果设置了requireAuth为false,只有未登录才显示\n if (item.requireAuth === false) {\n return !isAuthenticated;\n }\n // 如果没有设置requireAuth,总是显示\n return true;\n });\n };\n\n // 全局点击处理(关闭菜单)\n React.useEffect(() => {\n const handleGlobalClick = () => {\n setIsOpen(false);\n };\n\n if (isOpen) {\n document.addEventListener('click', handleGlobalClick);\n }\n\n return () => {\n document.removeEventListener('click', handleGlobalClick);\n };\n }, [isOpen]);\n\n const visibleCustomMenuItems = getVisibleCustomMenuItems();\n\n return (\n <div className={`relative inline-block ${className || ''}`}>\n {/* 用户头像/图标 */}\n <button \n className=\"flex items-center gap-2 px-3 py-2 bg-slate-50 text-slate-500 border border-slate-200 rounded-lg cursor-pointer transition-all min-w-11 min-h-11 text-sm font-medium hover:bg-slate-200 hover:text-slate-800 focus:outline-none focus:ring-2 focus:ring-blue-500/10\"\n onClick={toggleMenu}\n >\n <User size={24} />\n {isAuthenticated && user && (\n <span className=\"max-w-[120px] overflow-hidden text-ellipsis whitespace-nowrap\">\n {user.name || user.phone}\n </span>\n )}\n </button>\n\n {/* 下拉菜单 */}\n {isOpen && (\n <div \n className=\"absolute top-[calc(100%+0.5rem)] right-0 z-[1000] min-w-[200px] bg-white border border-slate-200 rounded-xl shadow-lg max-h-[90vh] overflow-y-auto p-2 animate-in slide-in-from-top-2 fade-in duration-200\"\n onClick={handleMenuClick}\n >\n {isAuthenticated && user ? (\n // 已登录状态的菜单\n <>\n <div className=\"p-3 mb-2 bg-slate-50 rounded-lg\">\n <div className=\"text-sm font-semibold text-slate-800 mb-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n {user.name || '未设置名称'}\n </div>\n <div className=\"text-xs text-slate-500 mb-1 overflow-hidden text-ellipsis whitespace-nowrap\">\n {user.phone}\n </div>\n <div className=\"text-xs text-blue-500 font-medium\">\n {user.role === 'admin' ? '管理员' : '普通用户'}\n </div>\n </div>\n \n {/* 自定义菜单项 */}\n {visibleCustomMenuItems.length > 0 && (\n <>\n <div className=\"h-px bg-slate-200 my-2\"></div>\n {visibleCustomMenuItems.map((item) => {\n const IconComponent = item.icon;\n return (\n <button \n key={item.id}\n className=\"flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10\"\n onClick={() => handleCustomMenuClick(item)}\n >\n {IconComponent && <IconComponent size={16} />}\n <span>{item.label}</span>\n </button>\n );\n })}\n </>\n )}\n \n <div className=\"h-px bg-slate-200 my-2\"></div>\n \n <button \n className=\"flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-red-50 hover:text-red-600 focus:outline-none focus:bg-red-50 focus:text-red-600 focus:ring-2 focus:ring-red-500/10\"\n onClick={handleLogout}\n >\n <LogOut size={16} />\n <span>退出登录</span>\n </button>\n </>\n ) : (\n // 未登录状态的菜单\n <>\n <button \n className=\"flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10\"\n onClick={handleLogin}\n >\n <LogIn size={16} />\n <span>登录</span>\n </button>\n <button \n className=\"flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10\"\n onClick={handleRegister}\n >\n <User size={16} />\n <span>注册</span>\n </button>\n \n {/* 未登录状态的自定义菜单项 */}\n {visibleCustomMenuItems.length > 0 && (\n <>\n <div className=\"h-px bg-slate-200 my-2\"></div>\n {visibleCustomMenuItems.map((item) => {\n const IconComponent = item.icon;\n return (\n <button \n key={item.id}\n className=\"flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10\"\n onClick={() => handleCustomMenuClick(item)}\n >\n {IconComponent && <IconComponent size={16} />}\n <span>{item.label}</span>\n </button>\n );\n })}\n </>\n )}\n </>\n )}\n </div>\n )}\n\n {/* 登录模态框 */}\n <LoginModal\n isOpen={showLoginModal}\n onClose={() => setShowLoginModal(false)}\n onSuccess={handleAuthSuccess}\n onSwitchToRegister={handleSwitchToRegister}\n />\n\n {/* 注册模态框 */}\n <RegisterModal\n isOpen={showRegisterModal}\n onClose={() => setShowRegisterModal(false)}\n onSuccess={handleAuthSuccess}\n onSwitchToLogin={handleSwitchToLogin}\n />\n </div>\n );\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=chunk-IUWSCUDC.js.map
4
+ //# sourceMappingURL=chunk-IUWSCUDC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-IUWSCUDC.js"}
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var pgCore = require('drizzle-orm/pg-core');
4
+ var drizzleOrm = require('drizzle-orm');
5
+
6
+ // src/auth/legacy/schema/index.ts
7
+ var legacyUsers = pgCore.pgTable("users", {
8
+ id: pgCore.serial("id").primaryKey(),
9
+ phone: pgCore.varchar("phone", { length: 20 }).notNull().unique(),
10
+ password: pgCore.varchar("password", { length: 255 }).notNull(),
11
+ name: pgCore.varchar("name", { length: 100 }),
12
+ email: pgCore.varchar("email", { length: 255 }),
13
+ isActive: pgCore.boolean("is_active").notNull().default(true),
14
+ role: pgCore.varchar("role", { length: 20 }).notNull().default("user"),
15
+ lastLoginAt: pgCore.timestamp("last_login_at"),
16
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
17
+ updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
18
+ });
19
+ var legacyUserSessions = pgCore.pgTable("user_sessions", {
20
+ id: pgCore.serial("id").primaryKey(),
21
+ userId: pgCore.integer("user_id").notNull().references(() => legacyUsers.id, { onDelete: "cascade" }),
22
+ sessionToken: pgCore.varchar("session_token", { length: 255 }).notNull().unique(),
23
+ expiresAt: pgCore.timestamp("expires_at").notNull(),
24
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
25
+ });
26
+ var legacyVerificationCodes = pgCore.pgTable("verification_codes", {
27
+ id: pgCore.serial("id").primaryKey(),
28
+ phone: pgCore.text("phone").notNull(),
29
+ code: pgCore.text("code").notNull(),
30
+ expiresAt: pgCore.timestamp("expires_at").notNull(),
31
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
32
+ used: pgCore.boolean("used").default(false).notNull()
33
+ });
34
+ var legacyUsersRelations = drizzleOrm.relations(legacyUsers, ({ many }) => ({
35
+ sessions: many(legacyUserSessions)
36
+ }));
37
+ var legacyUserSessionsRelations = drizzleOrm.relations(legacyUserSessions, ({ one }) => ({
38
+ user: one(legacyUsers, {
39
+ fields: [legacyUserSessions.userId],
40
+ references: [legacyUsers.id]
41
+ })
42
+ }));
43
+
44
+ exports.legacyUserSessions = legacyUserSessions;
45
+ exports.legacyUserSessionsRelations = legacyUserSessionsRelations;
46
+ exports.legacyUsers = legacyUsers;
47
+ exports.legacyUsersRelations = legacyUsersRelations;
48
+ exports.legacyVerificationCodes = legacyVerificationCodes;
49
+ //# sourceMappingURL=chunk-JCKCKRC2.js.map
50
+ //# sourceMappingURL=chunk-JCKCKRC2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/legacy/schema/index.ts"],"names":["pgTable","serial","varchar","boolean","timestamp","integer","text","relations"],"mappings":";;;;;;AAIO,IAAM,WAAA,GAAcA,eAAQ,OAAA,EAAS;AAAA,EAC1C,EAAA,EAAIC,aAAA,CAAO,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC5B,KAAA,EAAOC,cAAA,CAAQ,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAI,CAAA,CAAE,OAAA,EAAQ,CAAE,MAAA,EAAO;AAAA,EACzD,QAAA,EAAUA,eAAQ,UAAA,EAAY,EAAE,QAAQ,GAAA,EAAK,EAAE,OAAA,EAAQ;AAAA,EACvD,MAAMA,cAAA,CAAQ,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EACrC,OAAOA,cAAA,CAAQ,OAAA,EAAS,EAAE,MAAA,EAAQ,KAAK,CAAA;AAAA,EACvC,UAAUC,cAAA,CAAQ,WAAW,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA;AAAA,EACrD,IAAA,EAAMD,cAAA,CAAQ,MAAA,EAAQ,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,OAAA,EAAQ,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EAC9D,WAAA,EAAaE,iBAAU,eAAe,CAAA;AAAA,EACtC,WAAWA,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA,GAAa,OAAA,EAAQ;AAAA,EACxD,WAAWA,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA,GAAa,OAAA;AAClD,CAAC;AAGM,IAAM,kBAAA,GAAqBJ,eAAQ,eAAA,EAAiB;AAAA,EACzD,EAAA,EAAIC,aAAA,CAAO,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC5B,MAAA,EAAQI,cAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,EAAQ,CAAE,UAAA,CAAW,MAAM,WAAA,CAAY,EAAA,EAAI,EAAE,QAAA,EAAU,WAAW,CAAA;AAAA,EAC7F,YAAA,EAAcH,cAAA,CAAQ,eAAA,EAAiB,EAAE,MAAA,EAAQ,KAAK,CAAA,CAAE,OAAA,EAAQ,CAAE,MAAA,EAAO;AAAA,EACzE,SAAA,EAAWE,gBAAA,CAAU,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3C,WAAWA,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA,GAAa,OAAA;AAClD,CAAC;AAGM,IAAM,uBAAA,GAA0BJ,eAAQ,oBAAA,EAAsB;AAAA,EACnE,EAAA,EAAIC,aAAA,CAAO,IAAI,CAAA,CAAE,UAAA,EAAW;AAAA,EAC5B,KAAA,EAAOK,WAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7B,IAAA,EAAMA,WAAA,CAAK,MAAM,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3B,SAAA,EAAWF,gBAAA,CAAU,YAAY,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC3C,WAAWA,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA,GAAa,OAAA,EAAQ;AAAA,EACxD,MAAMD,cAAA,CAAQ,MAAM,EAAE,OAAA,CAAQ,KAAK,EAAE,OAAA;AACvC,CAAC;AAGM,IAAM,uBAAuBI,oBAAA,CAAU,WAAA,EAAa,CAAC,EAAE,MAAK,MAAO;AAAA,EACxE,QAAA,EAAU,KAAK,kBAAkB;AACnC,CAAA,CAAE;AAEK,IAAM,8BAA8BA,oBAAA,CAAU,kBAAA,EAAoB,CAAC,EAAE,KAAI,MAAO;AAAA,EACrF,IAAA,EAAM,IAAI,WAAA,EAAa;AAAA,IACrB,MAAA,EAAQ,CAAC,kBAAA,CAAmB,MAAM,CAAA;AAAA,IAClC,UAAA,EAAY,CAAC,WAAA,CAAY,EAAE;AAAA,GAC5B;AACH,CAAA,CAAE","file":"chunk-JCKCKRC2.js","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// 用户表\nexport const legacyUsers = pgTable('users', {\n id: serial('id').primaryKey(),\n phone: varchar('phone', { length: 20 }).notNull().unique(),\n password: varchar('password', { length: 255 }).notNull(),\n name: varchar('name', { length: 100 }),\n email: varchar('email', { length: 255 }),\n isActive: boolean('is_active').notNull().default(true),\n role: varchar('role', { length: 20 }).notNull().default('user'),\n lastLoginAt: timestamp('last_login_at'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n// 用户会话表\nexport const legacyUserSessions = pgTable('user_sessions', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => legacyUsers.id, { onDelete: 'cascade' }),\n sessionToken: varchar('session_token', { length: 255 }).notNull().unique(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// 验证码表\nexport const legacyVerificationCodes = pgTable('verification_codes', {\n id: serial('id').primaryKey(),\n phone: text('phone').notNull(),\n code: text('code').notNull(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n used: boolean('used').default(false).notNull(),\n});\n\n// 关系定义\nexport const legacyUsersRelations = relations(legacyUsers, ({ many }) => ({\n sessions: many(legacyUserSessions),\n}));\n\nexport const legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({\n user: one(legacyUsers, {\n fields: [legacyUserSessions.userId],\n references: [legacyUsers.id],\n }),\n}));\n"]}
@@ -0,0 +1,286 @@
1
+ import { cn } from './chunk-3NHAT7D4.mjs';
2
+ import * as React4 from 'react';
3
+ import { cva } from 'class-variance-authority';
4
+ import { X } from 'lucide-react';
5
+ import { createPortal } from 'react-dom';
6
+
7
+ var buttonVariants = cva(
8
+ "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",
9
+ {
10
+ variants: {
11
+ variant: {
12
+ default: "bg-primary text-primary-foreground shadow hover:bg-primary/90",
13
+ destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
14
+ outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
15
+ secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
16
+ ghost: "hover:bg-accent hover:text-accent-foreground",
17
+ link: "text-primary underline-offset-4 hover:underline"
18
+ },
19
+ size: {
20
+ default: "h-9 px-4 py-2",
21
+ sm: "h-8 rounded-md px-3 text-xs",
22
+ lg: "h-10 rounded-md px-8",
23
+ icon: "h-9 w-9"
24
+ }
25
+ },
26
+ defaultVariants: {
27
+ variant: "default",
28
+ size: "default"
29
+ }
30
+ }
31
+ );
32
+ var Button = React4.forwardRef(
33
+ ({ className, variant = "default", size = "default", asChild = false, children, ...props }, ref) => {
34
+ if (asChild && React4.isValidElement(children)) {
35
+ const childProps = children.props;
36
+ return React4.cloneElement(children, {
37
+ ...props,
38
+ className: cn(buttonVariants({ variant, size, className }), childProps.className)
39
+ });
40
+ }
41
+ return /* @__PURE__ */ React4.createElement(
42
+ "button",
43
+ {
44
+ className: cn(buttonVariants({ variant, size, className })),
45
+ ref,
46
+ ...props
47
+ },
48
+ children
49
+ );
50
+ }
51
+ );
52
+ Button.displayName = "Button";
53
+ var Input = React4.forwardRef(
54
+ ({ className, type, ...props }, ref) => {
55
+ return /* @__PURE__ */ React4.createElement(
56
+ "input",
57
+ {
58
+ type,
59
+ className: cn(
60
+ "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",
61
+ className
62
+ ),
63
+ ref,
64
+ ...props
65
+ }
66
+ );
67
+ }
68
+ );
69
+ Input.displayName = "Input";
70
+ function useControllableState({
71
+ value,
72
+ defaultValue,
73
+ onChange
74
+ }) {
75
+ const [internal, setInternal] = React4.useState(defaultValue);
76
+ const isControlled = value !== void 0;
77
+ const state = isControlled ? value : internal;
78
+ const setState = React4.useCallback(
79
+ (next) => {
80
+ if (!isControlled) setInternal(next);
81
+ onChange?.(next);
82
+ },
83
+ [isControlled, onChange]
84
+ );
85
+ return [state, setState];
86
+ }
87
+ function Portal({
88
+ children,
89
+ container
90
+ }) {
91
+ const [mounted, setMounted] = React4.useState(false);
92
+ React4.useEffect(() => {
93
+ setMounted(true);
94
+ }, []);
95
+ if (!mounted) return null;
96
+ return createPortal(children, container ?? document.body);
97
+ }
98
+ function useOnClickOutside(refs, handler, enabled) {
99
+ React4.useEffect(() => {
100
+ if (!enabled) return;
101
+ const listener = (event) => {
102
+ const target = event.target;
103
+ const clickedInside = refs.some((ref) => {
104
+ const el = ref.current;
105
+ return el && el.contains(target);
106
+ });
107
+ if (!clickedInside) {
108
+ handler(event);
109
+ }
110
+ };
111
+ document.addEventListener("mousedown", listener);
112
+ document.addEventListener("touchstart", listener);
113
+ return () => {
114
+ document.removeEventListener("mousedown", listener);
115
+ document.removeEventListener("touchstart", listener);
116
+ };
117
+ }, [refs, handler, enabled]);
118
+ }
119
+ function mergeRefs(...refs) {
120
+ return (value) => {
121
+ refs.forEach((ref) => {
122
+ if (!ref) return;
123
+ if (typeof ref === "function") {
124
+ ref(value);
125
+ } else {
126
+ ref.current = value;
127
+ }
128
+ });
129
+ };
130
+ }
131
+
132
+ // src/components/Dialog.tsx
133
+ var DialogContext = React4.createContext(null);
134
+ var Dialog = ({ open, defaultOpen = false, onOpenChange, children }) => {
135
+ const [isOpen, setIsOpen] = useControllableState({
136
+ value: open,
137
+ defaultValue: defaultOpen,
138
+ onChange: onOpenChange
139
+ });
140
+ const triggerRef = React4.useRef(null);
141
+ const contentRef = React4.useRef(null);
142
+ return /* @__PURE__ */ React4.createElement(DialogContext.Provider, { value: { open: isOpen, setOpen: setIsOpen, triggerRef, contentRef } }, children);
143
+ };
144
+ var DialogTrigger = React4.forwardRef(
145
+ ({ children, onClick, ...props }, ref) => {
146
+ const ctx = React4.useContext(DialogContext);
147
+ if (!ctx) return null;
148
+ const mergedRef = mergeRefs(ctx.triggerRef, ref);
149
+ const handleClick = (e) => {
150
+ ctx.setOpen(true);
151
+ onClick?.(e);
152
+ };
153
+ return /* @__PURE__ */ React4.createElement("button", { ref: mergedRef, type: "button", onClick: handleClick, ...props }, children);
154
+ }
155
+ );
156
+ DialogTrigger.displayName = "DialogTrigger";
157
+ var DialogPortal = ({ children }) => {
158
+ const ctx = React4.useContext(DialogContext);
159
+ if (!ctx?.open) return null;
160
+ return /* @__PURE__ */ React4.createElement(Portal, null, children);
161
+ };
162
+ var DialogClose = React4.forwardRef(({ onClick, ...props }, ref) => {
163
+ const ctx = React4.useContext(DialogContext);
164
+ return /* @__PURE__ */ React4.createElement(
165
+ "button",
166
+ {
167
+ ref,
168
+ type: "button",
169
+ onClick: (e) => {
170
+ ctx?.setOpen(false);
171
+ onClick?.(e);
172
+ },
173
+ ...props
174
+ }
175
+ );
176
+ });
177
+ DialogClose.displayName = "DialogClose";
178
+ var DialogOverlay = React4.forwardRef(({ className, ...props }, ref) => {
179
+ const ctx = React4.useContext(DialogContext);
180
+ if (!ctx?.open) return null;
181
+ return /* @__PURE__ */ React4.createElement(
182
+ "div",
183
+ {
184
+ ref,
185
+ className: cn("fixed inset-0 z-[9999] bg-black/80", className),
186
+ ...props
187
+ }
188
+ );
189
+ });
190
+ DialogOverlay.displayName = "DialogOverlay";
191
+ var DialogContent = React4.forwardRef(
192
+ ({ className, children, onPointerDownOutside, onEscapeKeyDown, showCloseButton = true, ...props }, ref) => {
193
+ const ctx = React4.useContext(DialogContext);
194
+ const open = !!ctx?.open;
195
+ useOnClickOutside(
196
+ [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],
197
+ (evt) => {
198
+ onPointerDownOutside?.(evt);
199
+ if (!evt.defaultPrevented) {
200
+ ctx?.setOpen(false);
201
+ }
202
+ },
203
+ open
204
+ );
205
+ React4.useEffect(() => {
206
+ if (!open) return;
207
+ const onKey = (e) => {
208
+ if (e.key !== "Escape") return;
209
+ onEscapeKeyDown?.(e);
210
+ if (!e.defaultPrevented) {
211
+ ctx?.setOpen(false);
212
+ }
213
+ };
214
+ document.addEventListener("keydown", onKey);
215
+ return () => document.removeEventListener("keydown", onKey);
216
+ }, [ctx, onEscapeKeyDown, open]);
217
+ if (!ctx || !open) return null;
218
+ return /* @__PURE__ */ React4.createElement(DialogPortal, null, /* @__PURE__ */ React4.createElement(DialogOverlay, null), /* @__PURE__ */ React4.createElement(
219
+ "div",
220
+ {
221
+ ref: mergeRefs(ctx.contentRef, ref),
222
+ className: cn(
223
+ "fixed left-[50%] top-[50%] z-[10000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg",
224
+ className
225
+ ),
226
+ ...props
227
+ },
228
+ children,
229
+ showCloseButton ? /* @__PURE__ */ React4.createElement(DialogClose, { className: "absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100" }, /* @__PURE__ */ React4.createElement(X, { className: "h-4 w-4" }), /* @__PURE__ */ React4.createElement("span", { className: "sr-only" }, "Close")) : null
230
+ ));
231
+ }
232
+ );
233
+ DialogContent.displayName = "DialogContent";
234
+ var DialogHeader = ({
235
+ className,
236
+ ...props
237
+ }) => /* @__PURE__ */ React4.createElement(
238
+ "div",
239
+ {
240
+ className: cn(
241
+ "flex flex-col space-y-1.5 text-center sm:text-left",
242
+ className
243
+ ),
244
+ ...props
245
+ }
246
+ );
247
+ DialogHeader.displayName = "DialogHeader";
248
+ var DialogFooter = ({
249
+ className,
250
+ ...props
251
+ }) => /* @__PURE__ */ React4.createElement(
252
+ "div",
253
+ {
254
+ className: cn(
255
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
256
+ className
257
+ ),
258
+ ...props
259
+ }
260
+ );
261
+ DialogFooter.displayName = "DialogFooter";
262
+ var DialogTitle = React4.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React4.createElement(
263
+ "h2",
264
+ {
265
+ ref,
266
+ className: cn(
267
+ "text-lg font-semibold leading-none tracking-tight",
268
+ className
269
+ ),
270
+ ...props
271
+ }
272
+ ));
273
+ DialogTitle.displayName = "DialogTitle";
274
+ var DialogDescription = React4.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ React4.createElement(
275
+ "p",
276
+ {
277
+ ref,
278
+ className: cn("text-sm text-muted-foreground", className),
279
+ ...props
280
+ }
281
+ ));
282
+ DialogDescription.displayName = "DialogDescription";
283
+
284
+ export { Button, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, Input, Portal, buttonVariants, mergeRefs, useControllableState, useOnClickOutside };
285
+ //# sourceMappingURL=chunk-L7GQNY54.mjs.map
286
+ //# sourceMappingURL=chunk-L7GQNY54.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Button.tsx","../src/components/Input.tsx","../src/components/internal/ui-core.tsx","../src/components/Dialog.tsx"],"names":["React","React2","React3"],"mappings":"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","file":"chunk-L7GQNY54.mjs","sourcesContent":["import * as React from \"react\"\nimport { cva } from \"class-variance-authority\"\n\nimport { cn } from \"../utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'destructive' | 'outline' | 'secondary' | 'ghost' | 'link';\n size?: 'default' | 'sm' | 'lg' | 'icon';\n asChild?: boolean;\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant = 'default', size = 'default', asChild = false, children, ...props }, ref) => {\n if (asChild && React.isValidElement(children)) {\n const childProps = children.props as { className?: string }\n return React.cloneElement(children, {\n ...(props as object),\n className: cn(buttonVariants({ variant, size, className }), childProps.className),\n })\n }\n\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import * as React from \"react\"\n\nimport { cn } from \"../utils\"\n\nconst 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 { createPortal } from \"react-dom\";\n\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: {\n value?: T;\n defaultValue: T;\n onChange?: (next: T) => void;\n}) {\n const [internal, setInternal] = React.useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const state = isControlled ? (value as T) : internal;\n\n const setState = React.useCallback(\n (next: T) => {\n if (!isControlled) setInternal(next);\n onChange?.(next);\n },\n [isControlled, onChange]\n );\n\n return [state, setState] as const;\n}\n\nexport function Portal({\n children,\n container,\n}: {\n children: React.ReactNode;\n container?: Element | null;\n}) {\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!mounted) return null;\n return createPortal(children, container ?? document.body);\n}\n\nexport function useOnClickOutside(\n refs: Array<React.RefObject<HTMLElement | null>>,\n handler: (event: MouseEvent | TouchEvent) => void,\n enabled: boolean\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const target = event.target as Node;\n const clickedInside = refs.some((ref) => {\n const el = ref.current;\n return el && el.contains(target);\n });\n if (!clickedInside) {\n handler(event);\n }\n };\n\n document.addEventListener(\"mousedown\", listener);\n document.addEventListener(\"touchstart\", listener);\n return () => {\n document.removeEventListener(\"mousedown\", listener);\n document.removeEventListener(\"touchstart\", listener);\n };\n }, [refs, handler, enabled]);\n}\n\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | undefined>\n): React.RefCallback<T> {\n return (value) => {\n refs.forEach((ref) => {\n if (!ref) return;\n if (typeof ref === \"function\") {\n ref(value);\n } else {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n });\n };\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"../utils\"\nimport { mergeRefs, Portal, useControllableState, useOnClickOutside } from \"./internal/ui-core\"\n\ninterface DialogContextValue {\n open: boolean\n setOpen: (open: boolean) => void\n triggerRef: React.RefObject<HTMLButtonElement>\n contentRef: React.RefObject<HTMLDivElement>\n}\n\nconst DialogContext = React.createContext<DialogContextValue | null>(null)\n\ninterface DialogProps {\n open?: boolean\n defaultOpen?: boolean\n onOpenChange?: (open: boolean) => void\n children: React.ReactNode\n}\n\nconst Dialog = ({ open, defaultOpen = false, onOpenChange, children }: DialogProps) => {\n const [isOpen, setIsOpen] = useControllableState({\n value: open,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n })\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const contentRef = React.useRef<HTMLDivElement>(null)\n\n return (\n <DialogContext.Provider value={{ open: isOpen, setOpen: setIsOpen, triggerRef, contentRef }}>\n {children}\n </DialogContext.Provider>\n )\n}\n\ninterface TriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n children: React.ReactNode\n}\n\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, TriggerProps>(\n ({ children, onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx) return null\n\n const mergedRef = mergeRefs<HTMLButtonElement>(ctx.triggerRef, ref)\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n ctx.setOpen(true)\n onClick?.(e)\n }\n\n return (\n <button ref={mergedRef} type=\"button\" onClick={handleClick} {...(props as any)}>\n {children}\n </button>\n )\n }\n)\nDialogTrigger.displayName = \"DialogTrigger\"\n\nconst DialogPortal = ({ children }: { children: React.ReactNode }) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return <Portal>{children}</Portal>\n}\n\nconst DialogClose = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement>\n>(({ onClick, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n return (\n <button\n ref={ref}\n type=\"button\"\n onClick={(e) => {\n ctx?.setOpen(false)\n onClick?.(e)\n }}\n {...(props as any)}\n />\n )\n})\nDialogClose.displayName = \"DialogClose\"\n\nconst DialogOverlay = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n if (!ctx?.open) return null\n return (\n <div\n ref={ref}\n className={cn(\"fixed inset-0 z-[9999] bg-black/80\", className)}\n {...(props as any)}\n />\n )\n})\nDialogOverlay.displayName = \"DialogOverlay\"\n\nexport interface DialogContentProps extends React.HTMLAttributes<HTMLDivElement> {\n onPointerDownOutside?: (event: PointerEvent) => void\n onEscapeKeyDown?: (event: KeyboardEvent) => void\n showCloseButton?: boolean\n}\n\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n ({ className, children, onPointerDownOutside, onEscapeKeyDown, showCloseButton = true, ...props }, ref) => {\n const ctx = React.useContext(DialogContext)\n const open = !!ctx?.open\n\n useOnClickOutside(\n [ctx?.contentRef ?? { current: null }, ctx?.triggerRef ?? { current: null }],\n (evt) => {\n onPointerDownOutside?.(evt as PointerEvent)\n if (!(evt as Event).defaultPrevented) {\n ctx?.setOpen(false)\n }\n },\n open\n )\n\n React.useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return\n onEscapeKeyDown?.(e)\n if (!e.defaultPrevented) {\n ctx?.setOpen(false)\n }\n }\n document.addEventListener(\"keydown\", onKey)\n return () => document.removeEventListener(\"keydown\", onKey)\n }, [ctx, onEscapeKeyDown, open])\n\n if (!ctx || !open) return null\n\n return (\n <DialogPortal>\n <DialogOverlay />\n <div\n ref={mergeRefs(ctx.contentRef, ref)}\n className={cn(\n \"fixed left-[50%] top-[50%] z-[10000] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg sm:rounded-lg\",\n className\n )}\n {...(props as any)}\n >\n {children}\n {showCloseButton ? (\n <DialogClose className=\"absolute right-4 top-4 rounded-sm opacity-70 transition-opacity hover:opacity-100\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogClose>\n ) : null}\n </div>\n </DialogPortal>\n )\n }\n)\nDialogContent.displayName = \"DialogContent\"\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className\n )}\n {...(props as any)}\n />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h2\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className\n )}\n {...(props as any)}\n />\n))\nDialogTitle.displayName = \"DialogTitle\"\n\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...(props as any)}\n />\n))\nDialogDescription.displayName = \"DialogDescription\"\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n"]}