sa2kit 2.0.4 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. package/dist/{UniversalFileService-GsP6D3Rc.d.ts → UniversalFileService-CC4d3wkc.d.ts} +2 -2
  2. package/dist/{UniversalFileService-BpvbZitV.d.mts → UniversalFileService-CzAE_G4V.d.mts} +2 -2
  3. package/dist/auth/client/index.d.mts +8 -27
  4. package/dist/auth/client/index.d.ts +8 -27
  5. package/dist/auth/client/index.js +9 -4
  6. package/dist/auth/client/index.mjs +2 -1
  7. package/dist/auth/components/index.d.mts +8 -225
  8. package/dist/auth/components/index.d.ts +8 -225
  9. package/dist/auth/components/index.js +62 -319
  10. package/dist/auth/components/index.js.map +1 -1
  11. package/dist/auth/components/index.mjs +6 -316
  12. package/dist/auth/components/index.mjs.map +1 -1
  13. package/dist/auth/hooks/index.d.mts +11 -29
  14. package/dist/auth/hooks/index.d.ts +11 -29
  15. package/dist/auth/hooks/index.js +14 -3
  16. package/dist/auth/hooks/index.mjs +4 -1
  17. package/dist/auth/index.d.mts +17 -14
  18. package/dist/auth/index.d.ts +17 -14
  19. package/dist/auth/index.js +51 -90
  20. package/dist/auth/index.mjs +8 -7
  21. package/dist/auth/rn/index.d.mts +3087 -18
  22. package/dist/auth/rn/index.d.ts +3087 -18
  23. package/dist/auth/rn/index.js +396 -477
  24. package/dist/auth/rn/index.js.map +1 -1
  25. package/dist/auth/rn/index.mjs +384 -475
  26. package/dist/auth/rn/index.mjs.map +1 -1
  27. package/dist/auth/schema/index.d.mts +3 -788
  28. package/dist/auth/schema/index.d.ts +3 -788
  29. package/dist/auth/schema/index.js +17 -9
  30. package/dist/auth/schema/index.mjs +1 -1
  31. package/dist/auth/services/index.d.mts +1 -48
  32. package/dist/auth/services/index.d.ts +1 -48
  33. package/dist/auth/services/index.js +3 -20
  34. package/dist/auth/services/index.mjs +1 -2
  35. package/dist/{base-api-client-B3wZZoaH.d.ts → base-api-client-BpmcQt4Q.d.ts} +1 -1
  36. package/dist/{base-api-client-ACKKt13v.d.mts → base-api-client-CFIhZK4C.d.mts} +1 -1
  37. package/dist/{base-api-client-ACKKt13v.d.ts → base-api-client-CFIhZK4C.d.ts} +1 -1
  38. package/dist/{base-api-client-DrL35Ea2.d.mts → base-api-client-DXLsq2yz.d.mts} +1 -1
  39. package/dist/business/index.d.mts +1 -5
  40. package/dist/business/index.d.ts +1 -5
  41. package/dist/business/index.js +34 -1135
  42. package/dist/business/index.js.map +1 -1
  43. package/dist/business/index.mjs +5 -1105
  44. package/dist/business/index.mjs.map +1 -1
  45. package/dist/calendar/routes/index.d.mts +74 -1
  46. package/dist/calendar/routes/index.d.ts +74 -1
  47. package/dist/calendar/routes/index.js +186 -97
  48. package/dist/calendar/routes/index.js.map +1 -1
  49. package/dist/calendar/routes/index.mjs +178 -99
  50. package/dist/calendar/routes/index.mjs.map +1 -1
  51. package/dist/{chunk-IIVNHQEI.mjs → chunk-5GBDDXYL.mjs} +4 -3
  52. package/dist/chunk-5GBDDXYL.mjs.map +1 -0
  53. package/dist/chunk-7E3J7VAD.mjs +3 -0
  54. package/dist/chunk-7E3J7VAD.mjs.map +1 -0
  55. package/dist/chunk-B3CZ3HXJ.mjs +126 -0
  56. package/dist/chunk-B3CZ3HXJ.mjs.map +1 -0
  57. package/dist/chunk-CAYOQDBR.js +78 -0
  58. package/dist/chunk-CAYOQDBR.js.map +1 -0
  59. package/dist/{chunk-PTMSDNGO.mjs → chunk-CX2GHCAI.mjs} +4 -75
  60. package/dist/chunk-CX2GHCAI.mjs.map +1 -0
  61. package/dist/chunk-EBHPTFG6.mjs +82 -0
  62. package/dist/chunk-EBHPTFG6.mjs.map +1 -0
  63. package/dist/chunk-FOQEQWX5.js +4 -0
  64. package/dist/chunk-FOQEQWX5.js.map +1 -0
  65. package/dist/{chunk-YGI7UU2D.mjs → chunk-G4NFB2QA.mjs} +2 -2
  66. package/dist/chunk-G4NFB2QA.mjs.map +1 -0
  67. package/dist/chunk-G5HJGXGC.mjs +39 -0
  68. package/dist/chunk-G5HJGXGC.mjs.map +1 -0
  69. package/dist/{chunk-GSNGCENJ.js → chunk-GQZHGSRR.js} +2 -39
  70. package/dist/chunk-GQZHGSRR.js.map +1 -0
  71. package/dist/chunk-GS7XLKET.js +41 -0
  72. package/dist/chunk-GS7XLKET.js.map +1 -0
  73. package/dist/{chunk-7B5SI4OF.mjs → chunk-IBWDBBX5.mjs} +4 -3
  74. package/dist/chunk-IBWDBBX5.mjs.map +1 -0
  75. package/dist/chunk-IS7O4LPI.js +146 -0
  76. package/dist/chunk-IS7O4LPI.js.map +1 -0
  77. package/dist/chunk-LGHUCQIU.js +93 -0
  78. package/dist/chunk-LGHUCQIU.js.map +1 -0
  79. package/dist/chunk-LHJKLUM7.mjs +18 -0
  80. package/dist/chunk-LHJKLUM7.mjs.map +1 -0
  81. package/dist/chunk-LKBIVQBT.mjs +34 -0
  82. package/dist/chunk-LKBIVQBT.mjs.map +1 -0
  83. package/dist/chunk-MIDXG6LS.js +32 -0
  84. package/dist/chunk-MIDXG6LS.js.map +1 -0
  85. package/dist/chunk-MWSAH7ZG.mjs +42 -0
  86. package/dist/chunk-MWSAH7ZG.mjs.map +1 -0
  87. package/dist/{chunk-HCI6JQOU.mjs → chunk-MZOGYD4N.mjs} +7 -4
  88. package/dist/chunk-MZOGYD4N.mjs.map +1 -0
  89. package/dist/chunk-NDGHXVGS.js +25 -0
  90. package/dist/chunk-NDGHXVGS.js.map +1 -0
  91. package/dist/chunk-Q5VFBPMG.mjs +76 -0
  92. package/dist/chunk-Q5VFBPMG.mjs.map +1 -0
  93. package/dist/chunk-QDUBO567.js +1148 -0
  94. package/dist/chunk-QDUBO567.js.map +1 -0
  95. package/dist/{chunk-3CSCIRQY.js → chunk-QP5N3ER6.js} +6 -5
  96. package/dist/chunk-QP5N3ER6.js.map +1 -0
  97. package/dist/chunk-RWCD2CAD.mjs +1132 -0
  98. package/dist/chunk-RWCD2CAD.mjs.map +1 -0
  99. package/dist/{chunk-VQ54PUQV.js → chunk-S37OK2QG.js} +2 -2
  100. package/dist/chunk-S37OK2QG.js.map +1 -0
  101. package/dist/chunk-S3PUP7N4.js +20 -0
  102. package/dist/chunk-S3PUP7N4.js.map +1 -0
  103. package/dist/{chunk-QQ2WFYOD.js → chunk-S6YSGVWD.js} +4 -76
  104. package/dist/chunk-S6YSGVWD.js.map +1 -0
  105. package/dist/chunk-SFDJNKWC.js +22 -0
  106. package/dist/chunk-SFDJNKWC.js.map +1 -0
  107. package/dist/chunk-TTYCVBIQ.mjs +144 -0
  108. package/dist/chunk-TTYCVBIQ.mjs.map +1 -0
  109. package/dist/{chunk-HBF4HPRK.js → chunk-TXMX6PZR.js} +7 -3
  110. package/dist/chunk-TXMX6PZR.js.map +1 -0
  111. package/dist/chunk-VHN7PF5I.js +20 -0
  112. package/dist/chunk-VHN7PF5I.js.map +1 -0
  113. package/dist/chunk-VJNDOYEC.js +41 -0
  114. package/dist/chunk-VJNDOYEC.js.map +1 -0
  115. package/dist/chunk-XBZIS3MV.mjs +13 -0
  116. package/dist/chunk-XBZIS3MV.mjs.map +1 -0
  117. package/dist/chunk-XFOZ56FB.mjs +20 -0
  118. package/dist/chunk-XFOZ56FB.mjs.map +1 -0
  119. package/dist/chunk-Z23HAXHL.js +136 -0
  120. package/dist/chunk-Z23HAXHL.js.map +1 -0
  121. package/dist/chunk-ZF7DKR5A.mjs +26 -0
  122. package/dist/chunk-ZF7DKR5A.mjs.map +1 -0
  123. package/dist/common/auth/client/index.d.mts +3239 -0
  124. package/dist/common/auth/client/index.d.ts +3239 -0
  125. package/dist/common/auth/client/index.js +26 -0
  126. package/dist/common/auth/client/index.mjs +5 -0
  127. package/dist/common/auth/components/index.d.mts +374 -0
  128. package/dist/common/auth/components/index.d.ts +374 -0
  129. package/dist/common/auth/components/index.js +70 -0
  130. package/dist/common/auth/components/index.mjs +9 -0
  131. package/dist/common/auth/hooks/index.d.mts +75 -0
  132. package/dist/common/auth/hooks/index.d.ts +75 -0
  133. package/dist/common/auth/hooks/index.js +28 -0
  134. package/dist/common/auth/hooks/index.js.map +1 -0
  135. package/dist/common/auth/hooks/index.mjs +7 -0
  136. package/dist/common/auth/hooks/index.mjs.map +1 -0
  137. package/dist/common/auth/index.d.mts +14 -6
  138. package/dist/common/auth/index.d.ts +14 -6
  139. package/dist/common/auth/index.js +17 -8
  140. package/dist/common/auth/index.mjs +4 -3
  141. package/dist/common/auth/react/index.d.mts +3056 -0
  142. package/dist/common/auth/react/index.d.ts +3056 -0
  143. package/dist/common/auth/react/index.js +31 -0
  144. package/dist/common/auth/react/index.js.map +1 -0
  145. package/dist/common/auth/react/index.mjs +21 -0
  146. package/dist/common/auth/react/index.mjs.map +1 -0
  147. package/dist/common/auth/rn/index.d.mts +3138 -0
  148. package/dist/common/auth/rn/index.d.ts +3138 -0
  149. package/dist/common/auth/rn/index.js +348 -0
  150. package/dist/common/auth/rn/index.js.map +1 -0
  151. package/dist/common/auth/rn/index.mjs +327 -0
  152. package/dist/common/auth/rn/index.mjs.map +1 -0
  153. package/dist/common/auth/schema/index.d.mts +1479 -0
  154. package/dist/common/auth/schema/index.d.ts +1479 -0
  155. package/dist/common/auth/schema/index.js +49 -0
  156. package/dist/common/auth/schema/index.js.map +1 -0
  157. package/dist/common/auth/schema/index.mjs +4 -0
  158. package/dist/common/auth/schema/index.mjs.map +1 -0
  159. package/dist/common/auth/server/index.d.mts +7 -30
  160. package/dist/common/auth/server/index.d.ts +7 -30
  161. package/dist/common/auth/server/index.js +36 -79
  162. package/dist/common/auth/server/index.mjs +2 -5
  163. package/dist/common/auth/services/index.d.mts +14 -0
  164. package/dist/common/auth/services/index.d.ts +14 -0
  165. package/dist/common/auth/services/index.js +17 -0
  166. package/dist/common/auth/services/index.js.map +1 -0
  167. package/dist/common/auth/services/index.mjs +4 -0
  168. package/dist/common/auth/services/index.mjs.map +1 -0
  169. package/dist/common/index.d.mts +13 -5
  170. package/dist/common/index.d.ts +13 -5
  171. package/dist/common/index.js +19 -16
  172. package/dist/common/index.mjs +11 -8
  173. package/dist/common/request/index.js +5 -4
  174. package/dist/common/request/index.mjs +3 -2
  175. package/dist/common/storage/index.js +13 -12
  176. package/dist/common/storage/index.mjs +3 -2
  177. package/dist/festivalCard/index.d.mts +3 -3
  178. package/dist/festivalCard/index.d.ts +3 -3
  179. package/dist/festivalCard/routes/index.d.mts +1 -1
  180. package/dist/festivalCard/routes/index.d.ts +1 -1
  181. package/dist/festivalCard/server/index.d.mts +2 -2
  182. package/dist/festivalCard/server/index.d.ts +2 -2
  183. package/dist/{festivalCardService-BFCRhJrq.d.ts → festivalCardService-B3GsnNpV.d.ts} +1 -1
  184. package/dist/{festivalCardService-GriR2VMc.d.mts → festivalCardService-CWhrLNE9.d.mts} +1 -1
  185. package/dist/{index-DPYkrKZf.d.mts → index-BcjDRcKp.d.mts} +11 -6
  186. package/dist/{index-Bnh6VqFv.d.ts → index-BlpXrrTy.d.ts} +11 -6
  187. package/dist/{index-1Ag7IBXN.d.ts → index-DZ5iJtNO.d.mts} +2 -44
  188. package/dist/{index-DdeZSeTJ.d.mts → index-DZ5iJtNO.d.ts} +2 -44
  189. package/dist/index.d.mts +6296 -40
  190. package/dist/index.d.ts +6296 -40
  191. package/dist/index.js +1378 -2508
  192. package/dist/index.js.map +1 -1
  193. package/dist/index.mjs +1073 -2203
  194. package/dist/index.mjs.map +1 -1
  195. package/dist/mmd/admin/index.d.mts +1 -1
  196. package/dist/mmd/admin/index.d.ts +1 -1
  197. package/dist/mmd/index.d.mts +1 -1
  198. package/dist/mmd/index.d.ts +1 -1
  199. package/dist/mmd/server/index.d.mts +3 -3
  200. package/dist/mmd/server/index.d.ts +3 -3
  201. package/dist/request/index.js +4 -3
  202. package/dist/request/index.mjs +2 -1
  203. package/dist/session-BCXvGCnm.d.mts +81 -0
  204. package/dist/session-BCXvGCnm.d.ts +81 -0
  205. package/dist/storage/index.js +12 -11
  206. package/dist/storage/index.mjs +2 -1
  207. package/dist/{types-DyG3ZV9V.d.mts → types-B6B210gX.d.mts} +1 -1
  208. package/dist/{types-DyG3ZV9V.d.ts → types-B6B210gX.d.ts} +1 -1
  209. package/dist/{types-BTiaMsBz.d.mts → types-Bdnte5EN.d.mts} +1 -1
  210. package/dist/{types-tQfupO6d.d.mts → types-Cs0CLvrH.d.mts} +1 -1
  211. package/dist/{types-tQfupO6d.d.ts → types-Cs0CLvrH.d.ts} +1 -1
  212. package/dist/{types-ERmJyjx8.d.ts → types-_rFX1atk.d.ts} +1 -1
  213. package/dist/types.legacy-J-j-_ig_.d.mts +25 -0
  214. package/dist/types.legacy-J-j-_ig_.d.ts +25 -0
  215. package/dist/useAuthActions-7S5dL7Oh.d.mts +77 -0
  216. package/dist/useAuthActions-7S5dL7Oh.d.ts +77 -0
  217. package/dist/vocaloidBooth/server/index.d.mts +3 -3
  218. package/dist/vocaloidBooth/server/index.d.ts +3 -3
  219. package/package.json +44 -76
  220. package/dist/auth/legacy/core/index.d.mts +0 -42
  221. package/dist/auth/legacy/core/index.d.ts +0 -42
  222. package/dist/auth/legacy/core/index.js +0 -242
  223. package/dist/auth/legacy/core/index.js.map +0 -1
  224. package/dist/auth/legacy/core/index.mjs +0 -226
  225. package/dist/auth/legacy/core/index.mjs.map +0 -1
  226. package/dist/auth/legacy/db/index.d.mts +0 -5
  227. package/dist/auth/legacy/db/index.d.ts +0 -5
  228. package/dist/auth/legacy/db/index.js +0 -261
  229. package/dist/auth/legacy/db/index.js.map +0 -1
  230. package/dist/auth/legacy/db/index.mjs +0 -250
  231. package/dist/auth/legacy/db/index.mjs.map +0 -1
  232. package/dist/auth/legacy/index.d.mts +0 -5
  233. package/dist/auth/legacy/index.d.ts +0 -5
  234. package/dist/auth/legacy/index.js +0 -1107
  235. package/dist/auth/legacy/index.js.map +0 -1
  236. package/dist/auth/legacy/index.mjs +0 -1086
  237. package/dist/auth/legacy/index.mjs.map +0 -1
  238. package/dist/auth/legacy/logic/index.d.mts +0 -9
  239. package/dist/auth/legacy/logic/index.d.ts +0 -9
  240. package/dist/auth/legacy/logic/index.js +0 -194
  241. package/dist/auth/legacy/logic/index.js.map +0 -1
  242. package/dist/auth/legacy/logic/index.mjs +0 -187
  243. package/dist/auth/legacy/logic/index.mjs.map +0 -1
  244. package/dist/auth/legacy/miniapp/index.d.mts +0 -5
  245. package/dist/auth/legacy/miniapp/index.d.ts +0 -5
  246. package/dist/auth/legacy/miniapp/index.js +0 -506
  247. package/dist/auth/legacy/miniapp/index.js.map +0 -1
  248. package/dist/auth/legacy/miniapp/index.mjs +0 -487
  249. package/dist/auth/legacy/miniapp/index.mjs.map +0 -1
  250. package/dist/auth/legacy/routes/index.d.mts +0 -53
  251. package/dist/auth/legacy/routes/index.d.ts +0 -53
  252. package/dist/auth/legacy/routes/index.js +0 -278
  253. package/dist/auth/legacy/routes/index.js.map +0 -1
  254. package/dist/auth/legacy/routes/index.mjs +0 -271
  255. package/dist/auth/legacy/routes/index.mjs.map +0 -1
  256. package/dist/auth/legacy/schema/index.d.mts +0 -401
  257. package/dist/auth/legacy/schema/index.d.ts +0 -401
  258. package/dist/auth/legacy/schema/index.js +0 -50
  259. package/dist/auth/legacy/schema/index.js.map +0 -1
  260. package/dist/auth/legacy/schema/index.mjs +0 -44
  261. package/dist/auth/legacy/schema/index.mjs.map +0 -1
  262. package/dist/auth/legacy/server/index.d.mts +0 -13
  263. package/dist/auth/legacy/server/index.d.ts +0 -13
  264. package/dist/auth/legacy/server/index.js +0 -21
  265. package/dist/auth/legacy/server/index.js.map +0 -1
  266. package/dist/auth/legacy/server/index.mjs +0 -19
  267. package/dist/auth/legacy/server/index.mjs.map +0 -1
  268. package/dist/auth/legacy/services/index.d.mts +0 -40
  269. package/dist/auth/legacy/services/index.d.ts +0 -40
  270. package/dist/auth/legacy/services/index.js +0 -258
  271. package/dist/auth/legacy/services/index.js.map +0 -1
  272. package/dist/auth/legacy/services/index.mjs +0 -252
  273. package/dist/auth/legacy/services/index.mjs.map +0 -1
  274. package/dist/auth/legacy/ui/miniapp/index.d.mts +0 -10
  275. package/dist/auth/legacy/ui/miniapp/index.d.ts +0 -10
  276. package/dist/auth/legacy/ui/miniapp/index.js +0 -298
  277. package/dist/auth/legacy/ui/miniapp/index.js.map +0 -1
  278. package/dist/auth/legacy/ui/miniapp/index.mjs +0 -290
  279. package/dist/auth/legacy/ui/miniapp/index.mjs.map +0 -1
  280. package/dist/auth/legacy/ui/web/index.d.mts +0 -22
  281. package/dist/auth/legacy/ui/web/index.d.ts +0 -22
  282. package/dist/auth/legacy/ui/web/index.js +0 -899
  283. package/dist/auth/legacy/ui/web/index.js.map +0 -1
  284. package/dist/auth/legacy/ui/web/index.mjs +0 -889
  285. package/dist/auth/legacy/ui/web/index.mjs.map +0 -1
  286. package/dist/auth/legacy/web/index.d.mts +0 -5
  287. package/dist/auth/legacy/web/index.d.ts +0 -5
  288. package/dist/auth/legacy/web/index.js +0 -1107
  289. package/dist/auth/legacy/web/index.js.map +0 -1
  290. package/dist/auth/legacy/web/index.mjs +0 -1086
  291. package/dist/auth/legacy/web/index.mjs.map +0 -1
  292. package/dist/auth/middleware/index.d.mts +0 -75
  293. package/dist/auth/middleware/index.d.ts +0 -75
  294. package/dist/auth/middleware/index.js +0 -15
  295. package/dist/auth/middleware/index.mjs +0 -6
  296. package/dist/auth/routes/index.d.mts +0 -261
  297. package/dist/auth/routes/index.d.ts +0 -261
  298. package/dist/auth/routes/index.js +0 -59
  299. package/dist/auth/routes/index.mjs +0 -6
  300. package/dist/chunk-37HYTHEC.mjs +0 -90
  301. package/dist/chunk-37HYTHEC.mjs.map +0 -1
  302. package/dist/chunk-3CSCIRQY.js.map +0 -1
  303. package/dist/chunk-5WV35FPV.js +0 -131
  304. package/dist/chunk-5WV35FPV.js.map +0 -1
  305. package/dist/chunk-7B5SI4OF.mjs.map +0 -1
  306. package/dist/chunk-DCRD5CZB.js +0 -573
  307. package/dist/chunk-DCRD5CZB.js.map +0 -1
  308. package/dist/chunk-DDX4JKFS.js +0 -19
  309. package/dist/chunk-DDX4JKFS.js.map +0 -1
  310. package/dist/chunk-DV6M7MFP.js +0 -283
  311. package/dist/chunk-DV6M7MFP.js.map +0 -1
  312. package/dist/chunk-EQXPL7TN.mjs +0 -78
  313. package/dist/chunk-EQXPL7TN.mjs.map +0 -1
  314. package/dist/chunk-GSNGCENJ.js.map +0 -1
  315. package/dist/chunk-HBF4HPRK.js.map +0 -1
  316. package/dist/chunk-HCI6JQOU.mjs.map +0 -1
  317. package/dist/chunk-I44HXJ3X.mjs +0 -17
  318. package/dist/chunk-I44HXJ3X.mjs.map +0 -1
  319. package/dist/chunk-IIVNHQEI.mjs.map +0 -1
  320. package/dist/chunk-IJ4YYWE3.mjs +0 -122
  321. package/dist/chunk-IJ4YYWE3.mjs.map +0 -1
  322. package/dist/chunk-J4BEIZUC.js +0 -92
  323. package/dist/chunk-J4BEIZUC.js.map +0 -1
  324. package/dist/chunk-OKPWFVXC.js +0 -24
  325. package/dist/chunk-OKPWFVXC.js.map +0 -1
  326. package/dist/chunk-PNOTQAYK.mjs +0 -560
  327. package/dist/chunk-PNOTQAYK.mjs.map +0 -1
  328. package/dist/chunk-PTMSDNGO.mjs.map +0 -1
  329. package/dist/chunk-Q2IAL7YV.js +0 -36
  330. package/dist/chunk-Q2IAL7YV.js.map +0 -1
  331. package/dist/chunk-QQ2WFYOD.js.map +0 -1
  332. package/dist/chunk-VQ54PUQV.js.map +0 -1
  333. package/dist/chunk-W5JEGA76.mjs +0 -33
  334. package/dist/chunk-W5JEGA76.mjs.map +0 -1
  335. package/dist/chunk-YGI7UU2D.mjs.map +0 -1
  336. package/dist/chunk-ZCLQSI5F.mjs +0 -271
  337. package/dist/chunk-ZCLQSI5F.mjs.map +0 -1
  338. package/dist/drizzle-auth-service-D-pljzCD.d.mts +0 -145
  339. package/dist/drizzle-auth-service-D3qryE_I.d.ts +0 -145
  340. package/dist/index-DNKZ7-R_.d.mts +0 -184
  341. package/dist/index-DNKZ7-R_.d.ts +0 -184
  342. package/dist/types-C5vUWf9u.d.ts +0 -70
  343. package/dist/types-IYCqCk2g.d.mts +0 -70
  344. /package/dist/{auth/middleware → common/auth/client}/index.js.map +0 -0
  345. /package/dist/{auth/middleware → common/auth/client}/index.mjs.map +0 -0
  346. /package/dist/{auth/routes → common/auth/components}/index.js.map +0 -0
  347. /package/dist/{auth/routes → common/auth/components}/index.mjs.map +0 -0
@@ -0,0 +1,1132 @@
1
+ import { useAuthContext } from './chunk-LKBIVQBT.mjs';
2
+ import { useAuthActions } from './chunk-TTYCVBIQ.mjs';
3
+ import { validatePhoneNumber, validateEmail, validatePassword } from './chunk-ZF7DKR5A.mjs';
4
+ import { useAuth } from './chunk-MZOGYD4N.mjs';
5
+ import React7, { useState, useEffect } from 'react';
6
+ import { X, Phone, Lock, EyeOff, Eye, Mail, User, LogOut, LogIn } from 'lucide-react';
7
+ import { createPortal } from 'react-dom';
8
+ import { clsx } from 'clsx';
9
+
10
+ function SignInForm({
11
+ authClient,
12
+ initialMode = "email-password",
13
+ onSuccess,
14
+ onError,
15
+ children
16
+ }) {
17
+ const actions = useAuthActions(authClient);
18
+ const [mode, setMode] = useState(initialMode);
19
+ const [step, setStep] = useState("credentials");
20
+ const [email, setEmail] = useState("");
21
+ const [phone, setPhone] = useState("");
22
+ const [password, setPassword] = useState("");
23
+ const [otp, setOtp] = useState("");
24
+ const [loading, setLoading] = useState(false);
25
+ const [error, setError] = useState(null);
26
+ const fail = (message) => {
27
+ setError(message);
28
+ onError?.(message);
29
+ };
30
+ const sendOtp = async () => {
31
+ setLoading(true);
32
+ setError(null);
33
+ try {
34
+ if (mode === "phone-otp") {
35
+ if (!validatePhoneNumber(phone)) {
36
+ fail("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7");
37
+ return;
38
+ }
39
+ const result = await actions.sendPhoneOtp(phone.trim());
40
+ if (!result.success) {
41
+ fail(result.error);
42
+ return;
43
+ }
44
+ setStep("otp");
45
+ } else if (mode === "email-otp") {
46
+ if (!validateEmail(email)) {
47
+ fail("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u90AE\u7BB1");
48
+ return;
49
+ }
50
+ const result = await actions.sendEmailOtp(email.trim(), "sign-in");
51
+ if (!result.success) {
52
+ fail(result.error);
53
+ return;
54
+ }
55
+ setStep("otp");
56
+ }
57
+ } finally {
58
+ setLoading(false);
59
+ }
60
+ };
61
+ const handleSubmit = async (e) => {
62
+ e?.preventDefault();
63
+ setLoading(true);
64
+ setError(null);
65
+ try {
66
+ if (mode === "email-password") {
67
+ if (!validateEmail(email)) return fail("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u90AE\u7BB1");
68
+ const pwd = validatePassword(password);
69
+ if (!pwd.valid) return fail(pwd.message ?? "\u5BC6\u7801\u65E0\u6548");
70
+ const result = await actions.signInWithEmail(email.trim(), password);
71
+ if (!result.success) return fail(result.error);
72
+ onSuccess?.();
73
+ return;
74
+ }
75
+ if (mode === "phone-password") {
76
+ if (!validatePhoneNumber(phone)) return fail("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7");
77
+ const pwd = validatePassword(password);
78
+ if (!pwd.valid) return fail(pwd.message ?? "\u5BC6\u7801\u65E0\u6548");
79
+ const result = await actions.signInWithPhonePassword(phone.trim(), password);
80
+ if (!result.success) return fail(result.error);
81
+ onSuccess?.();
82
+ return;
83
+ }
84
+ if (mode === "phone-otp") {
85
+ if (step === "credentials") {
86
+ await sendOtp();
87
+ return;
88
+ }
89
+ if (!/^\d{4,8}$/.test(otp)) return fail("\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801");
90
+ const result = await actions.verifyPhoneOtp(phone.trim(), otp);
91
+ if (!result.success) return fail(result.error);
92
+ onSuccess?.();
93
+ return;
94
+ }
95
+ if (mode === "email-otp") {
96
+ if (step === "credentials") {
97
+ await sendOtp();
98
+ return;
99
+ }
100
+ if (!/^\d{4,8}$/.test(otp)) return fail("\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801");
101
+ const result = await actions.signInWithEmailOtp(email.trim(), otp);
102
+ if (!result.success) return fail(result.error);
103
+ onSuccess?.();
104
+ }
105
+ } finally {
106
+ setLoading(false);
107
+ }
108
+ };
109
+ const state = {
110
+ mode,
111
+ step,
112
+ email,
113
+ phone,
114
+ password,
115
+ otp,
116
+ loading,
117
+ error,
118
+ setMode: (next) => {
119
+ setMode(next);
120
+ setStep("credentials");
121
+ setError(null);
122
+ },
123
+ setEmail,
124
+ setPhone,
125
+ setPassword,
126
+ setOtp,
127
+ sendOtp,
128
+ handleSubmit
129
+ };
130
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, children(state));
131
+ }
132
+ function RegisterFormHeadless({
133
+ authClient,
134
+ initialChannel = "email",
135
+ onSuccess,
136
+ onError,
137
+ children
138
+ }) {
139
+ const actions = useAuthActions(authClient);
140
+ const [channel, setChannel] = useState(initialChannel);
141
+ const [step, setStep] = useState("credentials");
142
+ const [email, setEmail] = useState("");
143
+ const [phone, setPhone] = useState("");
144
+ const [password, setPassword] = useState("");
145
+ const [confirmPassword, setConfirmPassword] = useState("");
146
+ const [name, setName] = useState("");
147
+ const [otp, setOtp] = useState("");
148
+ const [loading, setLoading] = useState(false);
149
+ const [error, setError] = useState(null);
150
+ const fail = (message) => {
151
+ setError(message);
152
+ onError?.(message);
153
+ };
154
+ const sendOtp = async () => {
155
+ setLoading(true);
156
+ setError(null);
157
+ try {
158
+ if (!validatePhoneNumber(phone)) {
159
+ fail("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7");
160
+ return;
161
+ }
162
+ const result = await actions.sendPhoneOtp(phone.trim());
163
+ if (!result.success) {
164
+ fail(result.error);
165
+ return;
166
+ }
167
+ setStep("otp");
168
+ } finally {
169
+ setLoading(false);
170
+ }
171
+ };
172
+ const handleSubmit = async (e) => {
173
+ e?.preventDefault();
174
+ setLoading(true);
175
+ setError(null);
176
+ try {
177
+ if (channel === "email") {
178
+ if (!validateEmail(email)) return fail("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u90AE\u7BB1");
179
+ const pwd = validatePassword(password);
180
+ if (!pwd.valid) return fail(pwd.message ?? "\u5BC6\u7801\u65E0\u6548");
181
+ if (password !== confirmPassword) return fail("\u4E24\u6B21\u5BC6\u7801\u4E0D\u4E00\u81F4");
182
+ if (!name.trim()) return fail("\u8BF7\u586B\u5199\u6635\u79F0");
183
+ const result = await actions.signUpWithEmail(email.trim(), password, name.trim());
184
+ if (!result.success) return fail(result.error);
185
+ onSuccess?.();
186
+ return;
187
+ }
188
+ if (step === "credentials") {
189
+ const pwd = validatePassword(password);
190
+ if (!pwd.valid) return fail(pwd.message ?? "\u5BC6\u7801\u65E0\u6548");
191
+ if (password !== confirmPassword) return fail("\u4E24\u6B21\u5BC6\u7801\u4E0D\u4E00\u81F4");
192
+ await sendOtp();
193
+ return;
194
+ }
195
+ if (!/^\d{4,8}$/.test(otp)) return fail("\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801");
196
+ const verify = await actions.verifyPhoneOtp(phone.trim(), otp);
197
+ if (!verify.success) return fail(verify.error);
198
+ onSuccess?.();
199
+ } finally {
200
+ setLoading(false);
201
+ }
202
+ };
203
+ const state = {
204
+ channel,
205
+ step,
206
+ email,
207
+ phone,
208
+ password,
209
+ confirmPassword,
210
+ name,
211
+ otp,
212
+ loading,
213
+ error,
214
+ setChannel: (next) => {
215
+ setChannel(next);
216
+ setStep("credentials");
217
+ setError(null);
218
+ },
219
+ setEmail,
220
+ setPhone,
221
+ setPassword,
222
+ setConfirmPassword,
223
+ setName,
224
+ setOtp,
225
+ sendOtp,
226
+ handleSubmit
227
+ };
228
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, children(state));
229
+ }
230
+ function VerifyOtpForm({
231
+ authClient,
232
+ channel,
233
+ target,
234
+ onSuccess,
235
+ onError,
236
+ children
237
+ }) {
238
+ const actions = useAuthActions(authClient);
239
+ const [otp, setOtp] = useState("");
240
+ const [loading, setLoading] = useState(false);
241
+ const [error, setError] = useState(null);
242
+ const fail = (message) => {
243
+ setError(message);
244
+ onError?.(message);
245
+ };
246
+ const resendOtp = async () => {
247
+ setLoading(true);
248
+ setError(null);
249
+ try {
250
+ if (channel === "phone") {
251
+ if (!validatePhoneNumber(target)) return fail("\u624B\u673A\u53F7\u65E0\u6548");
252
+ const result = await actions.sendPhoneOtp(target.trim());
253
+ if (!result.success) fail(result.error);
254
+ } else {
255
+ if (!validateEmail(target)) return fail("\u90AE\u7BB1\u65E0\u6548");
256
+ const result = await actions.sendEmailOtp(target.trim(), "sign-in");
257
+ if (!result.success) fail(result.error);
258
+ }
259
+ } finally {
260
+ setLoading(false);
261
+ }
262
+ };
263
+ const handleSubmit = async (e) => {
264
+ e?.preventDefault();
265
+ setLoading(true);
266
+ setError(null);
267
+ try {
268
+ if (!/^\d{4,8}$/.test(otp)) return fail("\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801");
269
+ if (channel === "phone") {
270
+ const result = await actions.verifyPhoneOtp(target.trim(), otp);
271
+ if (!result.success) return fail(result.error);
272
+ } else {
273
+ const result = await actions.signInWithEmailOtp(target.trim(), otp);
274
+ if (!result.success) return fail(result.error);
275
+ }
276
+ onSuccess?.();
277
+ } finally {
278
+ setLoading(false);
279
+ }
280
+ };
281
+ const state = {
282
+ channel,
283
+ target,
284
+ otp,
285
+ loading,
286
+ error,
287
+ setOtp,
288
+ resendOtp,
289
+ handleSubmit
290
+ };
291
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, children(state));
292
+ }
293
+ var overlayClass = "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";
294
+ var panelClass = "bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative";
295
+ var closeBtnClass = "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";
296
+ var inputClass = "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";
297
+ var submitClass = "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";
298
+ var errorClass = "text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed";
299
+ var linkBtnClass = "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";
300
+ function useClientMounted() {
301
+ const [mounted, setMounted] = useState(false);
302
+ useEffect(() => setMounted(true), []);
303
+ return mounted;
304
+ }
305
+ function AuthModalPortal({ children }) {
306
+ const mounted = useClientMounted();
307
+ if (!mounted) return null;
308
+ return createPortal(children, document.body);
309
+ }
310
+ var authModalStyles = {
311
+ overlayClass,
312
+ panelClass,
313
+ closeBtnClass,
314
+ inputClass,
315
+ submitClass,
316
+ errorClass,
317
+ linkBtnClass
318
+ };
319
+ function ForgotPasswordModal({ isOpen, onClose, onSuccess }) {
320
+ const { requestPhonePasswordReset, resetPhonePassword } = useAuthContext();
321
+ const [phone, setPhone] = useState("");
322
+ const [otp, setOtp] = useState("");
323
+ const [newPassword, setNewPassword] = useState("");
324
+ const [confirmPassword, setConfirmPassword] = useState("");
325
+ const [showPassword, setShowPassword] = useState(false);
326
+ const [showConfirmPassword, setShowConfirmPassword] = useState(false);
327
+ const [error, setError] = useState("");
328
+ const [loading, setLoading] = useState(false);
329
+ const [countdown, setCountdown] = useState(0);
330
+ const startCountdown = () => {
331
+ setCountdown(60);
332
+ const timer = setInterval(() => {
333
+ setCountdown((prev) => {
334
+ if (prev <= 1) {
335
+ clearInterval(timer);
336
+ return 0;
337
+ }
338
+ return prev - 1;
339
+ });
340
+ }, 1e3);
341
+ };
342
+ const handleSendCode = async () => {
343
+ setError("");
344
+ if (!validatePhoneNumber(phone)) {
345
+ setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7");
346
+ return;
347
+ }
348
+ setLoading(true);
349
+ try {
350
+ const result = await requestPhonePasswordReset(phone.trim());
351
+ if (!result.success) {
352
+ setError(result.error);
353
+ return;
354
+ }
355
+ startCountdown();
356
+ } finally {
357
+ setLoading(false);
358
+ }
359
+ };
360
+ const handleSubmit = async (e) => {
361
+ e.preventDefault();
362
+ setError("");
363
+ if (!validatePhoneNumber(phone)) return setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7");
364
+ const pwd = validatePassword(newPassword);
365
+ if (!pwd.valid) return setError(pwd.message ?? "\u5BC6\u7801\u65E0\u6548");
366
+ if (newPassword !== confirmPassword) return setError("\u4E24\u6B21\u5BC6\u7801\u4E0D\u4E00\u81F4");
367
+ if (!/^\d{4,8}$/.test(otp)) return setError("\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801");
368
+ setLoading(true);
369
+ try {
370
+ const result = await resetPhonePassword(phone.trim(), otp, newPassword);
371
+ if (!result.success) {
372
+ setError(result.error);
373
+ return;
374
+ }
375
+ onSuccess?.();
376
+ } finally {
377
+ setLoading(false);
378
+ }
379
+ };
380
+ if (!isOpen) return null;
381
+ return /* @__PURE__ */ React7.createElement(AuthModalPortal, null, /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.overlayClass, style: { margin: 0 }, onClick: (e) => e.target === e.currentTarget && onClose() }, /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.panelClass, onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React7.createElement("button", { type: "button", className: authModalStyles.closeBtnClass, onClick: onClose }, /* @__PURE__ */ React7.createElement(X, { size: 20 })), /* @__PURE__ */ React7.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React7.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u91CD\u7F6E\u5BC6\u7801"), /* @__PURE__ */ React7.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u8F93\u5165\u624B\u673A\u53F7\u548C\u9A8C\u8BC1\u7801\u91CD\u7F6E\u5BC6\u7801")), /* @__PURE__ */ React7.createElement("form", { onSubmit: handleSubmit, className: "p-6" }, /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "reset-phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Phone, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
382
+ "input",
383
+ {
384
+ id: "reset-phone",
385
+ type: "tel",
386
+ value: phone,
387
+ onChange: (e) => setPhone(e.target.value),
388
+ placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
389
+ className: authModalStyles.inputClass,
390
+ disabled: loading
391
+ }
392
+ ))), /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "reset-otp", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u9A8C\u8BC1\u7801"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(
393
+ "input",
394
+ {
395
+ id: "reset-otp",
396
+ type: "text",
397
+ inputMode: "numeric",
398
+ value: otp,
399
+ onChange: (e) => setOtp(e.target.value),
400
+ placeholder: "\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801",
401
+ 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",
402
+ disabled: loading,
403
+ maxLength: 8
404
+ }
405
+ ), /* @__PURE__ */ React7.createElement(
406
+ "button",
407
+ {
408
+ type: "button",
409
+ 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",
410
+ onClick: handleSendCode,
411
+ disabled: loading || countdown > 0
412
+ },
413
+ countdown > 0 ? `${countdown}\u79D2\u540E\u91CD\u8BD5` : "\u53D1\u9001\u9A8C\u8BC1\u7801"
414
+ ))), /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "reset-password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u65B0\u5BC6\u7801"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
415
+ "input",
416
+ {
417
+ id: "reset-password",
418
+ type: showPassword ? "text" : "password",
419
+ value: newPassword,
420
+ onChange: (e) => setNewPassword(e.target.value),
421
+ placeholder: "\u8BF7\u8F93\u5165\u65B0\u5BC6\u7801",
422
+ className: `${authModalStyles.inputClass} pr-12`,
423
+ disabled: loading
424
+ }
425
+ ), /* @__PURE__ */ React7.createElement(
426
+ "button",
427
+ {
428
+ type: "button",
429
+ 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",
430
+ onClick: () => setShowPassword((v) => !v),
431
+ disabled: loading
432
+ },
433
+ showPassword ? /* @__PURE__ */ React7.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React7.createElement(Eye, { size: 18 })
434
+ ))), /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "reset-confirm-password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u786E\u8BA4\u5BC6\u7801"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
435
+ "input",
436
+ {
437
+ id: "reset-confirm-password",
438
+ type: showConfirmPassword ? "text" : "password",
439
+ value: confirmPassword,
440
+ onChange: (e) => setConfirmPassword(e.target.value),
441
+ placeholder: "\u8BF7\u518D\u6B21\u8F93\u5165\u65B0\u5BC6\u7801",
442
+ className: `${authModalStyles.inputClass} pr-12`,
443
+ disabled: loading
444
+ }
445
+ ), /* @__PURE__ */ React7.createElement(
446
+ "button",
447
+ {
448
+ type: "button",
449
+ 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",
450
+ onClick: () => setShowConfirmPassword((v) => !v),
451
+ disabled: loading
452
+ },
453
+ showConfirmPassword ? /* @__PURE__ */ React7.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React7.createElement(Eye, { size: 18 })
454
+ ))), error && /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.errorClass }, error), /* @__PURE__ */ React7.createElement("button", { type: "submit", className: authModalStyles.submitClass, disabled: loading }, loading ? "\u63D0\u4EA4\u4E2D..." : "\u91CD\u7F6E\u5BC6\u7801")))));
455
+ }
456
+
457
+ // src/common/auth/components/styled/LoginModal.tsx
458
+ var MODE_LABELS = {
459
+ "phone-password": "\u624B\u673A\u5BC6\u7801",
460
+ "email-password": "\u90AE\u7BB1\u5BC6\u7801",
461
+ "phone-otp": "\u624B\u673A\u9A8C\u8BC1\u7801",
462
+ "email-otp": "\u90AE\u7BB1\u9A8C\u8BC1\u7801"
463
+ };
464
+ function LoginModal({
465
+ isOpen,
466
+ onClose,
467
+ onSuccess,
468
+ onSwitchToRegister,
469
+ defaultMode = "phone-password"
470
+ }) {
471
+ const { authClient, refreshSession } = useAuthContext();
472
+ const [showPassword, setShowPassword] = useState(false);
473
+ const [showForgotPassword, setShowForgotPassword] = useState(false);
474
+ const handleSuccess = async () => {
475
+ await refreshSession();
476
+ onSuccess?.();
477
+ };
478
+ if (!isOpen) return null;
479
+ return /* @__PURE__ */ React7.createElement(AuthModalPortal, null, /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.overlayClass, style: { margin: 0 }, onClick: (e) => e.target === e.currentTarget && onClose() }, /* @__PURE__ */ React7.createElement(SignInForm, { authClient, initialMode: defaultMode, onSuccess: handleSuccess }, (state) => /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.panelClass, onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React7.createElement("button", { type: "button", className: authModalStyles.closeBtnClass, onClick: onClose }, /* @__PURE__ */ React7.createElement(X, { size: 20 })), /* @__PURE__ */ React7.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React7.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u7528\u6237\u767B\u5F55"), /* @__PURE__ */ React7.createElement("p", { className: "text-gray-500 text-sm" }, "\u9009\u62E9\u767B\u5F55\u65B9\u5F0F\u5E76\u586B\u5199\u4FE1\u606F")), /* @__PURE__ */ React7.createElement("div", { className: "px-6 pt-4 flex flex-wrap gap-2" }, Object.keys(MODE_LABELS).map((mode) => /* @__PURE__ */ React7.createElement(
480
+ "button",
481
+ {
482
+ key: mode,
483
+ type: "button",
484
+ onClick: () => state.setMode(mode),
485
+ className: `px-3 py-1.5 text-xs rounded-full border transition-all ${state.mode === mode ? "bg-blue-500 text-white border-blue-500" : "bg-white text-gray-600 border-gray-200 hover:border-blue-300"}`
486
+ },
487
+ MODE_LABELS[mode]
488
+ ))), /* @__PURE__ */ React7.createElement("form", { onSubmit: state.handleSubmit, className: "p-6" }, (state.mode === "email-password" || state.mode === "email-otp") && state.step === "credentials" && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "login-email", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u90AE\u7BB1"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Mail, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
489
+ "input",
490
+ {
491
+ id: "login-email",
492
+ type: "email",
493
+ autoComplete: "email",
494
+ value: state.email,
495
+ onChange: (e) => state.setEmail(e.target.value),
496
+ placeholder: "\u8BF7\u8F93\u5165\u90AE\u7BB1",
497
+ className: authModalStyles.inputClass,
498
+ disabled: state.loading
499
+ }
500
+ ))), (state.mode === "phone-password" || state.mode === "phone-otp") && state.step === "credentials" && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "login-phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Phone, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
501
+ "input",
502
+ {
503
+ id: "login-phone",
504
+ type: "tel",
505
+ autoComplete: "tel",
506
+ value: state.phone,
507
+ onChange: (e) => state.setPhone(e.target.value),
508
+ placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
509
+ className: authModalStyles.inputClass,
510
+ disabled: state.loading
511
+ }
512
+ ))), (state.mode === "email-password" || state.mode === "phone-password") && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "login-password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u5BC6\u7801"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
513
+ "input",
514
+ {
515
+ id: "login-password",
516
+ type: showPassword ? "text" : "password",
517
+ autoComplete: "current-password",
518
+ value: state.password,
519
+ onChange: (e) => state.setPassword(e.target.value),
520
+ placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801",
521
+ className: `${authModalStyles.inputClass} pr-12`,
522
+ disabled: state.loading
523
+ }
524
+ ), /* @__PURE__ */ React7.createElement(
525
+ "button",
526
+ {
527
+ type: "button",
528
+ 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",
529
+ onClick: () => setShowPassword((v) => !v),
530
+ disabled: state.loading
531
+ },
532
+ showPassword ? /* @__PURE__ */ React7.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React7.createElement(Eye, { size: 18 })
533
+ ))), (state.mode === "phone-otp" || state.mode === "email-otp") && state.step === "otp" && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "login-otp", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u9A8C\u8BC1\u7801"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(User, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
534
+ "input",
535
+ {
536
+ id: "login-otp",
537
+ type: "text",
538
+ inputMode: "numeric",
539
+ value: state.otp,
540
+ onChange: (e) => state.setOtp(e.target.value),
541
+ placeholder: "\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801",
542
+ className: authModalStyles.inputClass,
543
+ disabled: state.loading,
544
+ maxLength: 8
545
+ }
546
+ ))), (state.mode === "phone-password" || state.mode === "phone-otp") && state.step === "credentials" && /* @__PURE__ */ React7.createElement("div", { className: "text-right -mt-2 mb-4" }, /* @__PURE__ */ React7.createElement("button", { type: "button", onClick: () => setShowForgotPassword(true), className: authModalStyles.linkBtnClass }, "\u5FD8\u8BB0\u5BC6\u7801\uFF1F")), state.error && /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.errorClass }, state.error), /* @__PURE__ */ React7.createElement("button", { type: "submit", className: authModalStyles.submitClass, disabled: state.loading }, state.loading ? "\u5904\u7406\u4E2D..." : state.step === "otp" ? "\u9A8C\u8BC1\u5E76\u767B\u5F55" : state.mode === "phone-otp" || state.mode === "email-otp" ? "\u53D1\u9001\u9A8C\u8BC1\u7801" : "\u767B\u5F55"), onSwitchToRegister && /* @__PURE__ */ React7.createElement("div", { className: "text-center mt-5 pt-4 border-t border-gray-100" }, /* @__PURE__ */ React7.createElement("span", { className: "text-gray-500 text-sm mr-1" }, "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF1F"), /* @__PURE__ */ React7.createElement("button", { type: "button", onClick: onSwitchToRegister, className: authModalStyles.linkBtnClass }, "\u7ACB\u5373\u6CE8\u518C")))))), /* @__PURE__ */ React7.createElement(
547
+ ForgotPasswordModal,
548
+ {
549
+ isOpen: showForgotPassword,
550
+ onClose: () => setShowForgotPassword(false),
551
+ onSuccess: () => {
552
+ setShowForgotPassword(false);
553
+ handleSuccess();
554
+ }
555
+ }
556
+ ));
557
+ }
558
+ function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }) {
559
+ const { authClient, refreshSession } = useAuthContext();
560
+ const [showPassword, setShowPassword] = useState(false);
561
+ const [showConfirmPassword, setShowConfirmPassword] = useState(false);
562
+ const handleSuccess = async () => {
563
+ await refreshSession();
564
+ onSuccess?.();
565
+ };
566
+ if (!isOpen) return null;
567
+ return /* @__PURE__ */ React7.createElement(AuthModalPortal, null, /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.overlayClass, style: { margin: 0 }, onClick: (e) => e.target === e.currentTarget && onClose() }, /* @__PURE__ */ React7.createElement(RegisterFormHeadless, { authClient, initialChannel: "phone", onSuccess: handleSuccess }, (state) => /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.panelClass, onClick: (e) => e.stopPropagation() }, /* @__PURE__ */ React7.createElement("button", { type: "button", className: authModalStyles.closeBtnClass, onClick: onClose }, /* @__PURE__ */ React7.createElement(X, { size: 20 })), /* @__PURE__ */ React7.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React7.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u7528\u6237\u6CE8\u518C"), /* @__PURE__ */ React7.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u586B\u5199\u4EE5\u4E0B\u4FE1\u606F\u521B\u5EFA\u8D26\u6237")), /* @__PURE__ */ React7.createElement("div", { className: "px-6 pt-4 flex gap-2" }, /* @__PURE__ */ React7.createElement(
568
+ "button",
569
+ {
570
+ type: "button",
571
+ onClick: () => state.setChannel("phone"),
572
+ className: `px-3 py-1.5 text-xs rounded-full border transition-all ${state.channel === "phone" ? "bg-blue-500 text-white border-blue-500" : "bg-white text-gray-600 border-gray-200 hover:border-blue-300"}`
573
+ },
574
+ "\u624B\u673A\u53F7\u6CE8\u518C"
575
+ ), /* @__PURE__ */ React7.createElement(
576
+ "button",
577
+ {
578
+ type: "button",
579
+ onClick: () => state.setChannel("email"),
580
+ className: `px-3 py-1.5 text-xs rounded-full border transition-all ${state.channel === "email" ? "bg-blue-500 text-white border-blue-500" : "bg-white text-gray-600 border-gray-200 hover:border-blue-300"}`
581
+ },
582
+ "\u90AE\u7BB1\u6CE8\u518C"
583
+ )), /* @__PURE__ */ React7.createElement("form", { onSubmit: state.handleSubmit, className: "p-6" }, state.channel === "email" && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "register-email", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u90AE\u7BB1 *"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Mail, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
584
+ "input",
585
+ {
586
+ id: "register-email",
587
+ type: "email",
588
+ autoComplete: "email",
589
+ value: state.email,
590
+ onChange: (e) => state.setEmail(e.target.value),
591
+ placeholder: "\u8BF7\u8F93\u5165\u90AE\u7BB1",
592
+ className: authModalStyles.inputClass,
593
+ disabled: state.loading
594
+ }
595
+ ))), state.channel === "phone" && state.step === "credentials" && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "register-phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7 *"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Phone, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
596
+ "input",
597
+ {
598
+ id: "register-phone",
599
+ type: "tel",
600
+ autoComplete: "tel",
601
+ value: state.phone,
602
+ onChange: (e) => state.setPhone(e.target.value),
603
+ placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
604
+ className: authModalStyles.inputClass,
605
+ disabled: state.loading
606
+ }
607
+ ))), state.channel === "email" && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "register-name", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u6635\u79F0 *"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(User, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
608
+ "input",
609
+ {
610
+ id: "register-name",
611
+ type: "text",
612
+ autoComplete: "name",
613
+ value: state.name,
614
+ onChange: (e) => state.setName(e.target.value),
615
+ placeholder: "\u8BF7\u8F93\u5165\u6635\u79F0",
616
+ className: authModalStyles.inputClass,
617
+ disabled: state.loading
618
+ }
619
+ ))), state.step === "credentials" && /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "register-password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u5BC6\u7801 *"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
620
+ "input",
621
+ {
622
+ id: "register-password",
623
+ type: showPassword ? "text" : "password",
624
+ autoComplete: "new-password",
625
+ value: state.password,
626
+ onChange: (e) => state.setPassword(e.target.value),
627
+ placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801\uFF08\u81F3\u5C116\u4F4D\uFF09",
628
+ className: `${authModalStyles.inputClass} pr-12`,
629
+ disabled: state.loading
630
+ }
631
+ ), /* @__PURE__ */ React7.createElement(
632
+ "button",
633
+ {
634
+ type: "button",
635
+ 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",
636
+ onClick: () => setShowPassword((v) => !v),
637
+ disabled: state.loading
638
+ },
639
+ showPassword ? /* @__PURE__ */ React7.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React7.createElement(Eye, { size: 18 })
640
+ ))), /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "register-confirm-password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u786E\u8BA4\u5BC6\u7801 *"), /* @__PURE__ */ React7.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React7.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React7.createElement(
641
+ "input",
642
+ {
643
+ id: "register-confirm-password",
644
+ type: showConfirmPassword ? "text" : "password",
645
+ autoComplete: "new-password",
646
+ value: state.confirmPassword,
647
+ onChange: (e) => state.setConfirmPassword(e.target.value),
648
+ placeholder: "\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801",
649
+ className: `${authModalStyles.inputClass} pr-12`,
650
+ disabled: state.loading
651
+ }
652
+ ), /* @__PURE__ */ React7.createElement(
653
+ "button",
654
+ {
655
+ type: "button",
656
+ 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",
657
+ onClick: () => setShowConfirmPassword((v) => !v),
658
+ disabled: state.loading
659
+ },
660
+ showConfirmPassword ? /* @__PURE__ */ React7.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React7.createElement(Eye, { size: 18 })
661
+ )))), state.channel === "phone" && state.step === "otp" && /* @__PURE__ */ React7.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "register-otp", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u9A8C\u8BC1\u7801 *"), /* @__PURE__ */ React7.createElement(
662
+ "input",
663
+ {
664
+ id: "register-otp",
665
+ type: "text",
666
+ inputMode: "numeric",
667
+ value: state.otp,
668
+ onChange: (e) => state.setOtp(e.target.value),
669
+ placeholder: "\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801",
670
+ className: "w-full py-3 px-4 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",
671
+ disabled: state.loading,
672
+ maxLength: 8
673
+ }
674
+ )), state.error && /* @__PURE__ */ React7.createElement("div", { className: authModalStyles.errorClass }, state.error), /* @__PURE__ */ React7.createElement("button", { type: "submit", className: authModalStyles.submitClass, disabled: state.loading }, state.loading ? "\u5904\u7406\u4E2D..." : state.channel === "phone" && state.step === "credentials" ? "\u53D1\u9001\u9A8C\u8BC1\u7801" : state.channel === "phone" && state.step === "otp" ? "\u5B8C\u6210\u6CE8\u518C" : "\u6CE8\u518C"), onSwitchToLogin && /* @__PURE__ */ React7.createElement("div", { className: "text-center mt-5 pt-4 border-t border-gray-100" }, /* @__PURE__ */ React7.createElement("span", { className: "text-gray-500 text-sm mr-1" }, "\u5DF2\u6709\u8D26\u53F7\uFF1F"), /* @__PURE__ */ React7.createElement("button", { type: "button", onClick: onSwitchToLogin, className: authModalStyles.linkBtnClass }, "\u7ACB\u5373\u767B\u5F55")))))));
675
+ }
676
+ function AuthGuard({ children, fallback, requireAuth = true }) {
677
+ const { isAuthenticated, loading, refreshSession } = useAuthContext();
678
+ const [showLoginModal, setShowLoginModal] = useState(false);
679
+ useEffect(() => {
680
+ if (!loading && requireAuth && !isAuthenticated) {
681
+ setShowLoginModal(true);
682
+ }
683
+ }, [loading, requireAuth, isAuthenticated]);
684
+ const handleLoginSuccess = async () => {
685
+ await refreshSession();
686
+ setShowLoginModal(false);
687
+ };
688
+ if (loading) {
689
+ return /* @__PURE__ */ React7.createElement("div", { className: "flex items-center justify-center min-h-[200px] text-gray-500 flex-col gap-3" }, /* @__PURE__ */ React7.createElement("div", { className: "w-8 h-8 border-[3px] border-gray-200 border-t-blue-500 rounded-full animate-spin" }), /* @__PURE__ */ React7.createElement("div", null, "\u9A8C\u8BC1\u767B\u5F55\u72B6\u6001..."));
690
+ }
691
+ if (requireAuth && !isAuthenticated) {
692
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, fallback ?? /* @__PURE__ */ React7.createElement("div", { className: "flex items-center justify-center min-h-[200px] text-gray-500 flex-col gap-4 p-6 text-center" }, /* @__PURE__ */ React7.createElement("div", { className: "text-5xl opacity-50" }, "\u{1F512}"), /* @__PURE__ */ React7.createElement("div", { className: "text-lg font-medium" }, "\u8BF7\u5148\u767B\u5F55\u4EE5\u8BBF\u95EE\u6B64\u9875\u9762"), /* @__PURE__ */ React7.createElement("div", { className: "text-sm opacity-70" }, "\u767B\u5F55\u540E\u5373\u53EF\u67E5\u770B\u76F8\u5173\u5185\u5BB9")), /* @__PURE__ */ React7.createElement(LoginModal, { isOpen: showLoginModal, onClose: () => setShowLoginModal(false), onSuccess: handleLoginSuccess }));
693
+ }
694
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, children);
695
+ }
696
+ function UserMenu({ customMenuItems = [], className }) {
697
+ const { user, isAuthenticated, signOut, refreshSession } = useAuthContext();
698
+ const [isOpen, setIsOpen] = useState(false);
699
+ const [showLoginModal, setShowLoginModal] = useState(false);
700
+ const [showRegisterModal, setShowRegisterModal] = useState(false);
701
+ useEffect(() => {
702
+ const handleGlobalClick = () => setIsOpen(false);
703
+ if (isOpen) document.addEventListener("click", handleGlobalClick);
704
+ return () => document.removeEventListener("click", handleGlobalClick);
705
+ }, [isOpen]);
706
+ const visibleCustomMenuItems = customMenuItems.filter((item) => {
707
+ if (item.requireAuth === true) return isAuthenticated;
708
+ if (item.requireAuth === false) return !isAuthenticated;
709
+ return true;
710
+ });
711
+ const handleAuthSuccess = async () => {
712
+ await refreshSession();
713
+ setShowLoginModal(false);
714
+ setShowRegisterModal(false);
715
+ };
716
+ const displayName = user?.name || user?.phoneNumber || user?.email || "\u7528\u6237";
717
+ return /* @__PURE__ */ React7.createElement("div", { className: `relative inline-block ${className ?? ""}` }, /* @__PURE__ */ React7.createElement(
718
+ "button",
719
+ {
720
+ type: "button",
721
+ 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",
722
+ onClick: () => setIsOpen((v) => !v)
723
+ },
724
+ /* @__PURE__ */ React7.createElement(User, { size: 24 }),
725
+ isAuthenticated && user && /* @__PURE__ */ React7.createElement("span", { className: "max-w-[120px] overflow-hidden text-ellipsis whitespace-nowrap" }, displayName)
726
+ ), isOpen && /* @__PURE__ */ React7.createElement(
727
+ "div",
728
+ {
729
+ 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",
730
+ onClick: (e) => e.stopPropagation()
731
+ },
732
+ isAuthenticated && user ? /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("div", { className: "p-3 mb-2 bg-slate-50 rounded-lg" }, /* @__PURE__ */ React7.createElement("div", { className: "text-sm font-semibold text-slate-800 mb-1 overflow-hidden text-ellipsis whitespace-nowrap" }, user.name || "\u672A\u8BBE\u7F6E\u540D\u79F0"), /* @__PURE__ */ React7.createElement("div", { className: "text-xs text-slate-500 mb-1 overflow-hidden text-ellipsis whitespace-nowrap" }, user.phoneNumber || user.email), user.role && /* @__PURE__ */ React7.createElement("div", { className: "text-xs text-blue-500 font-medium" }, user.role === "admin" ? "\u7BA1\u7406\u5458" : "\u666E\u901A\u7528\u6237")), visibleCustomMenuItems.length > 0 && /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("div", { className: "h-px bg-slate-200 my-2" }), visibleCustomMenuItems.map((item) => {
733
+ const IconComponent = item.icon;
734
+ return /* @__PURE__ */ React7.createElement(
735
+ "button",
736
+ {
737
+ key: item.id,
738
+ type: "button",
739
+ 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",
740
+ onClick: () => {
741
+ item.onClick();
742
+ setIsOpen(false);
743
+ }
744
+ },
745
+ IconComponent && /* @__PURE__ */ React7.createElement(IconComponent, { size: 16 }),
746
+ /* @__PURE__ */ React7.createElement("span", null, item.label)
747
+ );
748
+ })), /* @__PURE__ */ React7.createElement("div", { className: "h-px bg-slate-200 my-2" }), /* @__PURE__ */ React7.createElement(
749
+ "button",
750
+ {
751
+ type: "button",
752
+ 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",
753
+ onClick: async () => {
754
+ await signOut();
755
+ setIsOpen(false);
756
+ }
757
+ },
758
+ /* @__PURE__ */ React7.createElement(LogOut, { size: 16 }),
759
+ /* @__PURE__ */ React7.createElement("span", null, "\u9000\u51FA\u767B\u5F55")
760
+ )) : /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement(
761
+ "button",
762
+ {
763
+ type: "button",
764
+ 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",
765
+ onClick: () => {
766
+ setShowLoginModal(true);
767
+ setIsOpen(false);
768
+ }
769
+ },
770
+ /* @__PURE__ */ React7.createElement(LogIn, { size: 16 }),
771
+ /* @__PURE__ */ React7.createElement("span", null, "\u767B\u5F55")
772
+ ), /* @__PURE__ */ React7.createElement(
773
+ "button",
774
+ {
775
+ type: "button",
776
+ 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",
777
+ onClick: () => {
778
+ setShowRegisterModal(true);
779
+ setIsOpen(false);
780
+ }
781
+ },
782
+ /* @__PURE__ */ React7.createElement(User, { size: 16 }),
783
+ /* @__PURE__ */ React7.createElement("span", null, "\u6CE8\u518C")
784
+ ), visibleCustomMenuItems.length > 0 && /* @__PURE__ */ React7.createElement(React7.Fragment, null, /* @__PURE__ */ React7.createElement("div", { className: "h-px bg-slate-200 my-2" }), visibleCustomMenuItems.map((item) => {
785
+ const IconComponent = item.icon;
786
+ return /* @__PURE__ */ React7.createElement(
787
+ "button",
788
+ {
789
+ key: item.id,
790
+ type: "button",
791
+ 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",
792
+ onClick: () => {
793
+ item.onClick();
794
+ setIsOpen(false);
795
+ }
796
+ },
797
+ IconComponent && /* @__PURE__ */ React7.createElement(IconComponent, { size: 16 }),
798
+ /* @__PURE__ */ React7.createElement("span", null, item.label)
799
+ );
800
+ })))
801
+ ), /* @__PURE__ */ React7.createElement(
802
+ LoginModal,
803
+ {
804
+ isOpen: showLoginModal,
805
+ onClose: () => setShowLoginModal(false),
806
+ onSuccess: handleAuthSuccess,
807
+ onSwitchToRegister: () => {
808
+ setShowLoginModal(false);
809
+ setShowRegisterModal(true);
810
+ }
811
+ }
812
+ ), /* @__PURE__ */ React7.createElement(
813
+ RegisterModal,
814
+ {
815
+ isOpen: showRegisterModal,
816
+ onClose: () => setShowRegisterModal(false),
817
+ onSuccess: handleAuthSuccess,
818
+ onSwitchToLogin: () => {
819
+ setShowRegisterModal(false);
820
+ setShowLoginModal(true);
821
+ }
822
+ }
823
+ ));
824
+ }
825
+ function LoginForm({ apiClient, onSuccess, onError, children }) {
826
+ const { login, loading, error: authError, clearError } = useAuth(apiClient);
827
+ const [email, setEmail] = useState("");
828
+ const [password, setPassword] = useState("");
829
+ const handleSubmit = async (e) => {
830
+ if (e) {
831
+ e.preventDefault();
832
+ }
833
+ clearError();
834
+ const result = await login(email, password);
835
+ if (result.success) {
836
+ onSuccess?.(apiClient.getUser());
837
+ } else {
838
+ onError?.(result.error || "\u767B\u5F55\u5931\u8D25");
839
+ }
840
+ };
841
+ const state = {
842
+ email,
843
+ password,
844
+ loading,
845
+ error: authError,
846
+ handleEmailChange: setEmail,
847
+ handlePasswordChange: setPassword,
848
+ handleSubmit
849
+ };
850
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, children(state));
851
+ }
852
+ function RegisterForm({
853
+ apiClient,
854
+ onSuccess,
855
+ onError,
856
+ children
857
+ }) {
858
+ const { register, loading, error: authError, clearError } = useAuth(apiClient);
859
+ const [email, setEmail] = useState("");
860
+ const [password, setPassword] = useState("");
861
+ const [username, setUsername] = useState("");
862
+ const handleSubmit = async (e) => {
863
+ if (e) {
864
+ e.preventDefault();
865
+ }
866
+ clearError();
867
+ if (!email || !password || !username) {
868
+ const errorMsg = "\u8BF7\u586B\u5199\u6240\u6709\u5B57\u6BB5";
869
+ onError?.(errorMsg);
870
+ return;
871
+ }
872
+ if (password.length < 6) {
873
+ const errorMsg = "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A 6 \u4F4D";
874
+ onError?.(errorMsg);
875
+ return;
876
+ }
877
+ const result = await register(email, password, username);
878
+ if (result.success) {
879
+ onSuccess?.(apiClient.getUser());
880
+ } else {
881
+ onError?.(result.error || "\u6CE8\u518C\u5931\u8D25");
882
+ }
883
+ };
884
+ const state = {
885
+ email,
886
+ password,
887
+ username,
888
+ loading,
889
+ error: authError,
890
+ handleEmailChange: setEmail,
891
+ handlePasswordChange: setPassword,
892
+ handleUsernameChange: setUsername,
893
+ handleSubmit
894
+ };
895
+ return /* @__PURE__ */ React7.createElement(React7.Fragment, null, children(state));
896
+ }
897
+ var DefaultContainer = ({ children }) => /* @__PURE__ */ React7.createElement("div", { className: "min-h-screen bg-gradient-to-br from-indigo-100 via-purple-50 to-pink-100 flex items-center justify-center px-4 py-12 relative overflow-hidden" }, /* @__PURE__ */ React7.createElement("div", { className: "absolute inset-0 overflow-hidden pointer-events-none" }, /* @__PURE__ */ React7.createElement(
898
+ "div",
899
+ {
900
+ className: "absolute -top-40 -right-40 w-80 h-80 bg-purple-300 rounded-full mix-blend-multiply filter blur-xl opacity-70",
901
+ style: {
902
+ animation: "blob 7s infinite"
903
+ }
904
+ }
905
+ ), /* @__PURE__ */ React7.createElement(
906
+ "div",
907
+ {
908
+ className: "absolute -bottom-40 -left-40 w-80 h-80 bg-indigo-300 rounded-full mix-blend-multiply filter blur-xl opacity-70",
909
+ style: {
910
+ animation: "blob 7s infinite",
911
+ animationDelay: "2s"
912
+ }
913
+ }
914
+ ), /* @__PURE__ */ React7.createElement(
915
+ "div",
916
+ {
917
+ className: "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 w-80 h-80 bg-pink-300 rounded-full mix-blend-multiply filter blur-xl opacity-70",
918
+ style: {
919
+ animation: "blob 7s infinite",
920
+ animationDelay: "4s"
921
+ }
922
+ }
923
+ )), /* @__PURE__ */ React7.createElement("div", { className: "relative z-[10]" }, children), /* @__PURE__ */ React7.createElement("style", { dangerouslySetInnerHTML: { __html: `
924
+ @keyframes blob {
925
+ 0%, 100% { transform: translate(0, 0) scale(1); }
926
+ 25% { transform: translate(20px, -50px) scale(1.1); }
927
+ 50% { transform: translate(-20px, 20px) scale(0.9); }
928
+ 75% { transform: translate(50px, 50px) scale(1.05); }
929
+ }
930
+ ` } }));
931
+ var DefaultCard = ({ children }) => /* @__PURE__ */ React7.createElement("div", { className: "w-full max-w-md bg-white/95 backdrop-blur-xl rounded-2xl shadow-2xl border border-white/20 overflow-hidden" }, children);
932
+ var DefaultInput = (props) => /* @__PURE__ */ React7.createElement(
933
+ "input",
934
+ {
935
+ ...props,
936
+ className: "w-full px-4 py-3 bg-gray-50 border border-gray-200 rounded-xl focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-transparent transition-all duration-200 placeholder-gray-400 text-gray-900 hover:border-gray-300"
937
+ }
938
+ );
939
+ var DefaultButton = ({ children, disabled, type, ...props }) => /* @__PURE__ */ React7.createElement(
940
+ "button",
941
+ {
942
+ type: type || "button",
943
+ disabled,
944
+ ...props,
945
+ className: clsx("w-full bg-gradient-to-r from-blue-50 to-indigo-50 border-2 border-dashed border-blue-300 text-blue-700 hover:from-blue-100 hover:to-indigo-100 hover:border-blue-400 px-4 py-2.5 rounded-xl text-sm font-medium transition-all duration-200 transform hover:scale-105 active:scale-95", disabled ? "opacity-60 cursor-not-allowed hover:scale-100 hover:shadow-none" : "block", "}"),
946
+ style: {
947
+ backgroundSize: "200% 100%",
948
+ backgroundPosition: disabled ? "0% 0%" : "0% 0%",
949
+ display: "block"
950
+ },
951
+ onMouseEnter: (e) => {
952
+ if (!disabled) {
953
+ e.currentTarget.style.backgroundPosition = "100% 0%";
954
+ }
955
+ },
956
+ onMouseLeave: (e) => {
957
+ if (!disabled) {
958
+ e.currentTarget.style.backgroundPosition = "0% 0%";
959
+ }
960
+ }
961
+ },
962
+ children
963
+ );
964
+ var DefaultAlert = ({ children }) => /* @__PURE__ */ React7.createElement("div", { className: "bg-red-50 border-l-4 border-red-500 text-red-700 px-4 py-3 rounded-lg relative flex items-start space-x-3 shadow-sm" }, /* @__PURE__ */ React7.createElement("svg", { className: "w-5 h-5 text-red-500 mt-0.5 flex-shrink-0", fill: "currentColor", viewBox: "0 0 20 20" }, /* @__PURE__ */ React7.createElement("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z", clipRule: "evenodd" })), /* @__PURE__ */ React7.createElement("div", { className: "flex-1 text-sm" }, children));
965
+ var DefaultBadge = ({
966
+ children,
967
+ variant,
968
+ className = ""
969
+ }) => /* @__PURE__ */ React7.createElement(
970
+ "span",
971
+ {
972
+ className: clsx("inline-flex items-center px-3 py-1.5 rounded-full text-xs font-semibold shadow-sm", variant === "dev" ? "bg-gradient-to-r from-orange-400 to-amber-500 text-white border-0" : "bg-gray-100 text-gray-700 border border-gray-200", className)
973
+ },
974
+ children
975
+ );
976
+ function AdminLoginPage(props) {
977
+ const {
978
+ apiClient,
979
+ onLoginSuccess,
980
+ onLoginError,
981
+ checkPermission,
982
+ permissionDeniedMessage = "\u8BBF\u95EE\u88AB\u62D2\u7EDD\uFF1A\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650",
983
+ devConfig,
984
+ texts = {},
985
+ analytics,
986
+ components,
987
+ classNames = {}
988
+ } = props;
989
+ const Container = components?.Container || DefaultContainer;
990
+ const Card = components?.Card || DefaultCard;
991
+ const Input = components?.Input || DefaultInput;
992
+ const Button = components?.Button || DefaultButton;
993
+ const Alert = components?.Alert || DefaultAlert;
994
+ components?.Badge || DefaultBadge;
995
+ const t = {
996
+ appName: texts.appName || "LyricNote",
997
+ appDescription: texts.appDescription || "\u667A\u80FD\u6B4C\u8BCD\u7BA1\u7406\u5E73\u53F0",
998
+ pageTitle: texts.pageTitle || "\u7BA1\u7406\u5458\u767B\u5F55",
999
+ pageSubtitle: texts.pageSubtitle || "\u8BF7\u4F7F\u7528\u7BA1\u7406\u5458\u8D26\u6237\u767B\u5F55\u7CFB\u7EDF",
1000
+ emailLabel: texts.emailLabel || "\u7BA1\u7406\u5458\u90AE\u7BB1",
1001
+ emailPlaceholder: texts.emailPlaceholder || "admin@example.com",
1002
+ passwordLabel: texts.passwordLabel || "\u5BC6\u7801",
1003
+ passwordPlaceholder: texts.passwordPlaceholder || "\u8BF7\u8F93\u5165\u5BC6\u7801",
1004
+ loginButton: texts.loginButton || "\u767B\u5F55\u7BA1\u7406\u540E\u53F0",
1005
+ loggingInButton: texts.loggingInButton || "\u767B\u5F55\u4E2D...",
1006
+ fillTestAccount: texts.fillTestAccount || "\u586B\u5145\u6D4B\u8BD5\u8D26\u6237",
1007
+ copyCredentials: texts.copyCredentials || "\u590D\u5236",
1008
+ devModeLabel: texts.devModeLabel || "\u5F00\u53D1\u73AF\u5883",
1009
+ testAccountInfo: texts.testAccountInfo || "\u6D4B\u8BD5\u8D26\u6237\u5DF2\u586B\u5145\uFF0C\u53EF\u76F4\u63A5\u767B\u5F55",
1010
+ testAccountFilled: texts.testAccountFilled || "\u5DF2\u81EA\u52A8\u586B\u5145\u6D4B\u8BD5\u8D26\u6237\u4FE1\u606F",
1011
+ footer: texts.footer || "\u4EC5\u9650\u7BA1\u7406\u5458\u8BBF\u95EE \u2022 \u7CFB\u7EDF\u5B89\u5168\u4FDD\u62A4"
1012
+ };
1013
+ const [email, setEmail] = useState("");
1014
+ const [password, setPassword] = useState("");
1015
+ const [showPassword, setShowPassword] = useState(false);
1016
+ const [autoFilled, setAutoFilled] = useState(false);
1017
+ const [localError, setLocalError] = useState("");
1018
+ const isDevelopment = devConfig?.enabled ?? (typeof window !== "undefined" && (process.env.NODE_ENV === "development" || window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1"));
1019
+ const testEmail = devConfig?.testEmail || "admin@example.com";
1020
+ const testPassword = devConfig?.testPassword || "admin123";
1021
+ const autoFillDelay = devConfig?.autoFillDelay || 2e3;
1022
+ const { user, isLoggedIn, loading, error: authError, login, clearError } = useAuth(apiClient);
1023
+ const error = authError || localError;
1024
+ useEffect(() => {
1025
+ if (typeof window !== "undefined" && analytics?.trackPageView) {
1026
+ analytics.trackPageView({
1027
+ pageName: "admin_login_page",
1028
+ pageUrl: window.location.pathname
1029
+ });
1030
+ }
1031
+ }, [analytics]);
1032
+ useEffect(() => {
1033
+ if (isDevelopment && !email && !password) {
1034
+ const timer = setTimeout(() => {
1035
+ if (!email && !password) {
1036
+ setEmail(testEmail);
1037
+ setPassword(testPassword);
1038
+ setAutoFilled(true);
1039
+ }
1040
+ }, autoFillDelay);
1041
+ return () => clearTimeout(timer);
1042
+ }
1043
+ return;
1044
+ }, [isDevelopment, email, password, testEmail, testPassword, autoFillDelay]);
1045
+ useEffect(() => {
1046
+ if (user && isLoggedIn) {
1047
+ if (checkPermission && !checkPermission(user)) {
1048
+ setLocalError(permissionDeniedMessage);
1049
+ analytics?.trackPermissionDenied?.(user);
1050
+ return;
1051
+ }
1052
+ analytics?.trackLoginSuccess?.(user);
1053
+ analytics?.setUser?.({
1054
+ userId: user.id,
1055
+ email: user.email,
1056
+ role: user.role
1057
+ });
1058
+ onLoginSuccess?.(user);
1059
+ }
1060
+ }, [user, isLoggedIn, checkPermission, permissionDeniedMessage, analytics, onLoginSuccess]);
1061
+ const handleSubmit = async (e) => {
1062
+ e.preventDefault();
1063
+ setLocalError("");
1064
+ clearError();
1065
+ try {
1066
+ const result = await login(email, password);
1067
+ if (!result.success) {
1068
+ const errorMsg = result.error || "\u767B\u5F55\u5931\u8D25";
1069
+ setLocalError(errorMsg);
1070
+ analytics?.trackLoginFailed?.(errorMsg, email);
1071
+ onLoginError?.(errorMsg);
1072
+ }
1073
+ } catch (err) {
1074
+ const errorMsg = "\u767B\u5F55\u5931\u8D25\uFF1A\u7F51\u7EDC\u9519\u8BEF\u6216\u670D\u52A1\u5668\u9519\u8BEF";
1075
+ setLocalError(errorMsg);
1076
+ analytics?.trackLoginFailed?.(errorMsg, email);
1077
+ onLoginError?.(errorMsg);
1078
+ }
1079
+ };
1080
+ const fillTestAccount = () => {
1081
+ setEmail(testEmail);
1082
+ setPassword(testPassword);
1083
+ setLocalError("");
1084
+ setAutoFilled(true);
1085
+ };
1086
+ return /* @__PURE__ */ React7.createElement(Container, null, /* @__PURE__ */ React7.createElement("div", { className: "w-full max-w-md" }, /* @__PURE__ */ React7.createElement(Card, null, /* @__PURE__ */ React7.createElement("div", { className: "p-8" }, /* @__PURE__ */ React7.createElement("div", { className: "pb-8" }, /* @__PURE__ */ React7.createElement("h2", { className: "text-2xl font-bold text-center text-gray-800" }, t.pageTitle)), /* @__PURE__ */ React7.createElement("form", { onSubmit: handleSubmit, className: "space-y-5" }, error && /* @__PURE__ */ React7.createElement(Alert, null, error), /* @__PURE__ */ React7.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "email", className: "text-sm font-semibold text-gray-700 block" }, t.emailLabel), /* @__PURE__ */ React7.createElement(
1087
+ Input,
1088
+ {
1089
+ id: "email",
1090
+ type: "email",
1091
+ value: email,
1092
+ onChange: (e) => setEmail(e.target.value),
1093
+ placeholder: t.emailPlaceholder,
1094
+ required: true,
1095
+ disabled: loading
1096
+ }
1097
+ )), /* @__PURE__ */ React7.createElement("div", { className: "space-y-2" }, /* @__PURE__ */ React7.createElement("label", { htmlFor: "password", className: "text-sm font-semibold text-gray-700 block" }, t.passwordLabel), /* @__PURE__ */ React7.createElement("div", { className: "relative" }, /* @__PURE__ */ React7.createElement(
1098
+ Input,
1099
+ {
1100
+ id: "password",
1101
+ type: showPassword ? "text" : "password",
1102
+ value: password,
1103
+ onChange: (e) => setPassword(e.target.value),
1104
+ placeholder: t.passwordPlaceholder,
1105
+ required: true,
1106
+ disabled: loading
1107
+ }
1108
+ ), /* @__PURE__ */ React7.createElement(
1109
+ "button",
1110
+ {
1111
+ type: "button",
1112
+ onClick: () => setShowPassword(!showPassword),
1113
+ className: "absolute right-3 top-1/2 transform -translate-y-1/2 text-gray-400 hover:text-gray-600 transition-colors p-1",
1114
+ disabled: loading,
1115
+ title: showPassword ? "\u9690\u85CF\u5BC6\u7801" : "\u663E\u793A\u5BC6\u7801"
1116
+ },
1117
+ showPassword ? /* @__PURE__ */ React7.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React7.createElement("path", { fillRule: "evenodd", d: "M3.707 2.293a1 1 0 00-1.414 1.414l14 14a1 1 0 001.414-1.414l-1.473-1.473A10.014 10.014 0 0019.542 10C18.268 5.943 14.478 3 10 3a9.958 9.958 0 00-4.512 1.074l-1.78-1.781zm4.261 4.26l1.514 1.515a2.003 2.003 0 012.45 2.45l1.514 1.514a4 4 0 00-5.478-5.478z", clipRule: "evenodd" }), /* @__PURE__ */ React7.createElement("path", { d: "M12.454 16.697L9.75 13.992a4 4 0 01-3.742-3.741L2.335 6.578A9.98 9.98 0 00.458 10c1.274 4.057 5.065 7 9.542 7 .847 0 1.669-.105 2.454-.303z" })) : /* @__PURE__ */ React7.createElement("svg", { xmlns: "http://www.w3.org/2000/svg", className: "h-5 w-5", viewBox: "0 0 20 20", fill: "currentColor" }, /* @__PURE__ */ React7.createElement("path", { d: "M10 12a2 2 0 100-4 2 2 0 000 4z" }), /* @__PURE__ */ React7.createElement("path", { fillRule: "evenodd", d: "M.458 10C1.732 5.943 5.522 3 10 3s8.268 2.943 9.542 7c-1.274 4.057-5.064 7-9.542 7S1.732 14.057.458 10zM14 10a4 4 0 11-8 0 4 4 0 018 0z", clipRule: "evenodd" }))
1118
+ ))), isDevelopment && /* @__PURE__ */ React7.createElement("div", { className: "pt-2" }, /* @__PURE__ */ React7.createElement(
1119
+ "button",
1120
+ {
1121
+ type: "button",
1122
+ onClick: fillTestAccount,
1123
+ className: "w-full bg-gradient-to-r from-blue-50 to-indigo-50 border-2 border-dashed border-blue-300 text-blue-700 hover:from-blue-100 hover:to-indigo-100 hover:border-blue-400 px-4 py-2.5 rounded-xl text-sm font-medium transition-all duration-200 transform hover:scale-105 active:scale-95",
1124
+ disabled: loading
1125
+ },
1126
+ t.fillTestAccount
1127
+ )), /* @__PURE__ */ React7.createElement("div", { className: "pt-3" }, /* @__PURE__ */ React7.createElement(Button, { type: "submit", disabled: loading }, loading ? t.loggingInButton : t.loginButton)))))));
1128
+ }
1129
+
1130
+ export { AdminLoginPage, AuthGuard, ForgotPasswordModal, LoginForm, LoginModal, RegisterForm, RegisterFormHeadless, RegisterModal, SignInForm, UserMenu, VerifyOtpForm };
1131
+ //# sourceMappingURL=chunk-RWCD2CAD.mjs.map
1132
+ //# sourceMappingURL=chunk-RWCD2CAD.mjs.map