@tinyrack/issuary-server 0.26.0 → 0.27.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 (386) hide show
  1. package/dist/entities/terms-content.entity.d.ts +9 -0
  2. package/dist/entities/terms-content.entity.d.ts.map +1 -1
  3. package/dist/entities/terms.entity.d.ts +9 -0
  4. package/dist/entities/terms.entity.d.ts.map +1 -1
  5. package/dist/entities/terms.entity.js +4 -0
  6. package/dist/entities/terms.entity.js.map +1 -1
  7. package/dist/entities/user-terms-consent.entity.d.ts +9 -0
  8. package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
  9. package/dist/entrypoints/app.d.ts +598 -3
  10. package/dist/entrypoints/app.d.ts.map +1 -1
  11. package/dist/entrypoints/database/postgres/compiled-functions.d.ts +19 -16
  12. package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
  13. package/dist/entrypoints/database/postgres/compiled-functions.js +133 -76
  14. package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
  15. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +19 -16
  16. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
  17. package/dist/entrypoints/database/sqlite/compiled-functions.js +133 -76
  18. package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
  19. package/dist/lib/config/branding.d.ts +5 -0
  20. package/dist/lib/config/branding.d.ts.map +1 -1
  21. package/dist/lib/config/branding.js +23 -1
  22. package/dist/lib/config/branding.js.map +1 -1
  23. package/dist/lib/config/resolved.d.ts +3 -0
  24. package/dist/lib/config/resolved.d.ts.map +1 -1
  25. package/dist/lib/interpolate-html.d.ts +3 -3
  26. package/dist/lib/interpolate-html.js +3 -3
  27. package/dist/lib/interpolate-html.js.map +1 -1
  28. package/dist/migrations/postgres/Migration20260827090000_archive_terms.d.ts +6 -0
  29. package/dist/migrations/postgres/Migration20260827090000_archive_terms.d.ts.map +1 -0
  30. package/dist/migrations/postgres/Migration20260827090000_archive_terms.js +12 -0
  31. package/dist/migrations/postgres/Migration20260827090000_archive_terms.js.map +1 -0
  32. package/dist/migrations/postgres/index.d.ts.map +1 -1
  33. package/dist/migrations/postgres/index.js +2 -0
  34. package/dist/migrations/postgres/index.js.map +1 -1
  35. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.d.ts +6 -0
  36. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.d.ts.map +1 -0
  37. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.js +12 -0
  38. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.js.map +1 -0
  39. package/dist/migrations/sqlite/index.d.ts.map +1 -1
  40. package/dist/migrations/sqlite/index.js +2 -0
  41. package/dist/migrations/sqlite/index.js.map +1 -1
  42. package/dist/repositories/terms.repository.d.ts.map +1 -1
  43. package/dist/repositories/terms.repository.js +1 -1
  44. package/dist/repositories/terms.repository.js.map +1 -1
  45. package/dist/routes/api/admin/console/index.d.ts +523 -0
  46. package/dist/routes/api/admin/console/index.d.ts.map +1 -0
  47. package/dist/routes/api/admin/console/index.js +212 -0
  48. package/dist/routes/api/admin/console/index.js.map +1 -0
  49. package/dist/routes/api/admin/index.d.ts +584 -0
  50. package/dist/routes/api/admin/index.d.ts.map +1 -1
  51. package/dist/routes/api/admin/index.js +3 -1
  52. package/dist/routes/api/admin/index.js.map +1 -1
  53. package/dist/routes/api/admin/users/index.d.ts +64 -0
  54. package/dist/routes/api/admin/users/index.d.ts.map +1 -1
  55. package/dist/routes/api/admin/users/index.js +47 -0
  56. package/dist/routes/api/admin/users/index.js.map +1 -1
  57. package/dist/routes/api/config/get.d.ts +10 -3
  58. package/dist/routes/api/config/get.d.ts.map +1 -1
  59. package/dist/routes/api/config/get.js +3 -0
  60. package/dist/routes/api/config/get.js.map +1 -1
  61. package/dist/routes/api/config/index.d.ts +10 -3
  62. package/dist/routes/api/config/index.d.ts.map +1 -1
  63. package/dist/routes/api/index.d.ts +594 -3
  64. package/dist/routes/api/index.d.ts.map +1 -1
  65. package/dist/routes/index.d.ts +594 -3
  66. package/dist/routes/index.d.ts.map +1 -1
  67. package/dist/schemas/response.d.ts +4 -1
  68. package/dist/schemas/response.d.ts.map +1 -1
  69. package/dist/schemas/response.js +11 -2
  70. package/dist/schemas/response.js.map +1 -1
  71. package/dist/services/admin-console.service.d.ts +407 -0
  72. package/dist/services/admin-console.service.d.ts.map +1 -0
  73. package/dist/services/admin-console.service.js +377 -0
  74. package/dist/services/admin-console.service.js.map +1 -0
  75. package/dist/services/container.d.ts +5 -0
  76. package/dist/services/container.d.ts.map +1 -1
  77. package/dist/services/container.js +3 -0
  78. package/dist/services/container.js.map +1 -1
  79. package/dist/services/user.service.d.ts +21 -0
  80. package/dist/services/user.service.d.ts.map +1 -1
  81. package/dist/services/user.service.js +65 -1
  82. package/dist/services/user.service.js.map +1 -1
  83. package/package.json +1 -1
  84. package/public/assets/2fa-BowFczF7.js +2 -0
  85. package/public/assets/2fa-BowFczF7.js.map +1 -0
  86. package/public/assets/2fa-C_pA-n2i.js +2 -0
  87. package/public/assets/{2fa-DFTcWEMb.js.map → 2fa-C_pA-n2i.js.map} +1 -1
  88. package/public/assets/2fa-Cpfhakvn.js +2 -0
  89. package/public/assets/{2fa-huNZDYU9.js.map → 2fa-Cpfhakvn.js.map} +1 -1
  90. package/public/assets/2fa-o1a13VHx.js +2 -0
  91. package/public/assets/2fa-o1a13VHx.js.map +1 -0
  92. package/public/assets/FieldControl-ShLuCjvG.js +2 -0
  93. package/public/assets/FieldControl-ShLuCjvG.js.map +1 -0
  94. package/public/assets/Separator-C6MmGAmP.js +2 -0
  95. package/public/assets/Separator-C6MmGAmP.js.map +1 -0
  96. package/public/assets/admin-_jFLs8Ve.js +2 -0
  97. package/public/assets/admin-_jFLs8Ve.js.map +1 -0
  98. package/public/assets/admin-shell-B91U4-Ro.js +2 -0
  99. package/public/assets/admin-shell-B91U4-Ro.js.map +1 -0
  100. package/public/assets/alert-D3aaK-_3.js +2 -0
  101. package/public/assets/alert-D3aaK-_3.js.map +1 -0
  102. package/public/assets/alert-kRxM1xsM.js +2 -0
  103. package/public/assets/alert-kRxM1xsM.js.map +1 -0
  104. package/public/assets/auth-choice-row-h4heOMHs.js +2 -0
  105. package/public/assets/auth-choice-row-h4heOMHs.js.map +1 -0
  106. package/public/assets/auth-field-BpJ4AHtU.js +2 -0
  107. package/public/assets/{auth-field-CWyXGKoC.js.map → auth-field-BpJ4AHtU.js.map} +1 -1
  108. package/public/assets/auth-footer-Du6S-oDG.js +2 -0
  109. package/public/assets/auth-footer-Du6S-oDG.js.map +1 -0
  110. package/public/assets/auth-layout-BdRRr0vT.js +2 -0
  111. package/public/assets/auth-layout-BdRRr0vT.js.map +1 -0
  112. package/public/assets/auth-page-header-ChaCNNrn.js +2 -0
  113. package/public/assets/{auth-page-header-DgGAaIiP.js.map → auth-page-header-ChaCNNrn.js.map} +1 -1
  114. package/public/assets/authorization-context-banner-zVxGX5e8.js +2 -0
  115. package/public/assets/{authorization-context-banner-DznMDPOX.js.map → authorization-context-banner-zVxGX5e8.js.map} +1 -1
  116. package/public/assets/avatar-BxTPQIDp.js +2 -0
  117. package/public/assets/{avatar-D-FRGa1m.js.map → avatar-BxTPQIDp.js.map} +1 -1
  118. package/public/assets/badge-B8D0Q2qq.js +2 -0
  119. package/public/assets/{badge-CsOfUji0.js.map → badge-B8D0Q2qq.js.map} +1 -1
  120. package/public/assets/checkbox-DTPGfvmq.js +2 -0
  121. package/public/assets/{checkbox-C90dDDza.js.map → checkbox-DTPGfvmq.js.map} +1 -1
  122. package/public/assets/{circle-check-6QTLhwM_.js → circle-check-Cnzuu7xR.js} +2 -2
  123. package/public/assets/{circle-check-6QTLhwM_.js.map → circle-check-Cnzuu7xR.js.map} +1 -1
  124. package/public/assets/clients-DLqy7K3N.js +5 -0
  125. package/public/assets/clients-DLqy7K3N.js.map +1 -0
  126. package/public/assets/config-C18-l7z7.js +2 -0
  127. package/public/assets/config-C18-l7z7.js.map +1 -0
  128. package/public/assets/{consent-RtCi_85E.js → consent-BWniDzI3.js} +2 -2
  129. package/public/assets/{consent-RtCi_85E.js.map → consent-BWniDzI3.js.map} +1 -1
  130. package/public/assets/consent-r_tX8DTb.js +2 -0
  131. package/public/assets/{consent-B9sQEyO8.js.map → consent-r_tX8DTb.js.map} +1 -1
  132. package/public/assets/{createLucideIcon-BPpAIXR_.js → createLucideIcon-D-yizrWN.js} +2 -2
  133. package/public/assets/{createLucideIcon-BPpAIXR_.js.map → createLucideIcon-D-yizrWN.js.map} +1 -1
  134. package/public/assets/design-system-rich-text-B3NzIRoJ.js +2 -0
  135. package/public/assets/design-system-rich-text-B3NzIRoJ.js.map +1 -0
  136. package/public/assets/email-Bx9JlWp3.js +2 -0
  137. package/public/assets/email-Bx9JlWp3.js.map +1 -0
  138. package/public/assets/email-Cpfhakvn.js +2 -0
  139. package/public/assets/email-Cpfhakvn.js.map +1 -0
  140. package/public/assets/error-DDY8m_Px.js +2 -0
  141. package/public/assets/error-DDY8m_Px.js.map +1 -0
  142. package/public/assets/field-CsrUbl__.js +3 -0
  143. package/public/assets/field-CsrUbl__.js.map +1 -0
  144. package/public/assets/{fingerprint-pattern-DP62Vk8x.js → fingerprint-pattern-BwUoN1_w.js} +2 -2
  145. package/public/assets/{fingerprint-pattern-DP62Vk8x.js.map → fingerprint-pattern-BwUoN1_w.js.map} +1 -1
  146. package/public/assets/forgot-Cpfhakvn.js +2 -0
  147. package/public/assets/forgot-Cpfhakvn.js.map +1 -0
  148. package/public/assets/forgot-u52JMu6e.js +2 -0
  149. package/public/assets/forgot-u52JMu6e.js.map +1 -0
  150. package/public/assets/form-sJw-V9wb.js +2 -0
  151. package/public/assets/form-sJw-V9wb.js.map +1 -0
  152. package/public/assets/index-8mX6CKcW.css +2 -0
  153. package/public/assets/index-lTEyHSus.js +11 -0
  154. package/public/assets/index-lTEyHSus.js.map +1 -0
  155. package/public/assets/initial-avatar-WMjxW3Zz.js +2 -0
  156. package/public/assets/initial-avatar-WMjxW3Zz.js.map +1 -0
  157. package/public/assets/input-QvBxPgy5.js +2 -0
  158. package/public/assets/{input-CxVeC8Pn.js.map → input-QvBxPgy5.js.map} +1 -1
  159. package/public/assets/{key-round-CdvHb8vT.js → key-round-BxWppK6h.js} +2 -2
  160. package/public/assets/{key-round-CdvHb8vT.js.map → key-round-BxWppK6h.js.map} +1 -1
  161. package/public/assets/labeled-separator-DdkyYDWH.js +2 -0
  162. package/public/assets/labeled-separator-DdkyYDWH.js.map +1 -0
  163. package/public/assets/link-BHmn75Zo.js +2 -0
  164. package/public/assets/{link-C-WdTj3F.js.map → link-BHmn75Zo.js.map} +1 -1
  165. package/public/assets/{lock-7NRyvXBS.js → lock-8wpR2C78.js} +2 -2
  166. package/public/assets/{lock-7NRyvXBS.js.map → lock-8wpR2C78.js.map} +1 -1
  167. package/public/assets/login-Cpfhakvn.js +2 -0
  168. package/public/assets/login-Cpfhakvn.js.map +1 -0
  169. package/public/assets/login-DRcHjJ2-.js +2 -0
  170. package/public/assets/login-DRcHjJ2-.js.map +1 -0
  171. package/public/assets/logout-Dphj1d_0.js +2 -0
  172. package/public/assets/logout-Dphj1d_0.js.map +1 -0
  173. package/public/assets/{mail-D0B_1Dzd.js → mail-DVP_XMUi.js} +2 -2
  174. package/public/assets/{mail-D0B_1Dzd.js.map → mail-DVP_XMUi.js.map} +1 -1
  175. package/public/assets/modal-JuaLVSyx.js +2 -0
  176. package/public/assets/modal-JuaLVSyx.js.map +1 -0
  177. package/public/assets/mutationOptions-Cv_vJkJn.js +2 -0
  178. package/public/assets/{mutationOptions-DyYFUbyn.js.map → mutationOptions-Cv_vJkJn.js.map} +1 -1
  179. package/public/assets/passkey-CObBlfKK.js +2 -0
  180. package/public/assets/passkey-CObBlfKK.js.map +1 -0
  181. package/public/assets/{passkey-J1qnYp9A.js → passkey-CWTjw19S.js} +2 -2
  182. package/public/assets/{passkey-J1qnYp9A.js.map → passkey-CWTjw19S.js.map} +1 -1
  183. package/public/assets/passkey-CavITajY.js +2 -0
  184. package/public/assets/passkey-CavITajY.js.map +1 -0
  185. package/public/assets/passkey-Cpfhakvn.js +2 -0
  186. package/public/assets/passkey-Cpfhakvn.js.map +1 -0
  187. package/public/assets/{passkey-error-ZqqPQUta.js → passkey-error-CZ26Ss-I.js} +2 -2
  188. package/public/assets/{passkey-error-ZqqPQUta.js.map → passkey-error-CZ26Ss-I.js.map} +1 -1
  189. package/public/assets/password-Cpfhakvn.js +2 -0
  190. package/public/assets/password-Cpfhakvn.js.map +1 -0
  191. package/public/assets/password-Dk8PwtZN.js +2 -0
  192. package/public/assets/password-Dk8PwtZN.js.map +1 -0
  193. package/public/assets/password-reset-BcFpGOop.js +2 -0
  194. package/public/assets/{password-reset-sU5KkBKi.js.map → password-reset-BcFpGOop.js.map} +1 -1
  195. package/public/assets/password-strength-Bgvy7kz6.js +2 -0
  196. package/public/assets/{password-strength-BIPcWiM_.js.map → password-strength-Bgvy7kz6.js.map} +1 -1
  197. package/public/assets/pin-input-DhsRO4Ei.js +2 -0
  198. package/public/assets/{pin-input-CITrr-Yc.js.map → pin-input-DhsRO4Ei.js.map} +1 -1
  199. package/public/assets/profile-PjXEnzA-.js +2 -0
  200. package/public/assets/profile-PjXEnzA-.js.map +1 -0
  201. package/public/assets/profile-k66ruDWl.js +2 -0
  202. package/public/assets/{profile-BHPL9Px_.js.map → profile-k66ruDWl.js.map} +1 -1
  203. package/public/assets/provider-mark-CeYazOfu.js +2 -0
  204. package/public/assets/provider-mark-CeYazOfu.js.map +1 -0
  205. package/public/assets/recovery-hdRyezmb.js +2 -0
  206. package/public/assets/recovery-hdRyezmb.js.map +1 -0
  207. package/public/assets/register-Cpfhakvn.js +2 -0
  208. package/public/assets/register-Cpfhakvn.js.map +1 -0
  209. package/public/assets/register-DMgKT_fm.js +2 -0
  210. package/public/assets/register-DMgKT_fm.js.map +1 -0
  211. package/public/assets/reset-Cpfhakvn.js +2 -0
  212. package/public/assets/reset-Cpfhakvn.js.map +1 -0
  213. package/public/assets/reset-DBu3wYpE.js +2 -0
  214. package/public/assets/reset-DBu3wYpE.js.map +1 -0
  215. package/public/assets/select-5LheSsRl.js +2 -0
  216. package/public/assets/select-5LheSsRl.js.map +1 -0
  217. package/public/assets/select-Cpfhakvn.js +2 -0
  218. package/public/assets/{select-huNZDYU9.js.map → select-Cpfhakvn.js.map} +1 -1
  219. package/public/assets/separator-CMGc2Y1q.js +2 -0
  220. package/public/assets/separator-CMGc2Y1q.js.map +1 -0
  221. package/public/assets/settings-BVe4k3kJ.js +2 -0
  222. package/public/assets/settings-BVe4k3kJ.js.map +1 -0
  223. package/public/assets/shell-header-bar-CdOEWmCT.js +2 -0
  224. package/public/assets/shell-header-bar-CdOEWmCT.js.map +1 -0
  225. package/public/assets/{shield-check-D_p8H0ni.js → shield-check-DpYF8yeI.js} +2 -2
  226. package/public/assets/{shield-check-D_p8H0ni.js.map → shield-check-DpYF8yeI.js.map} +1 -1
  227. package/public/assets/standard-schema-C50nwAaQ.js +2 -0
  228. package/public/assets/{standard-schema-e8gtSzGE.js.map → standard-schema-C50nwAaQ.js.map} +1 -1
  229. package/public/assets/system-BoUqxc5h.js +2 -0
  230. package/public/assets/system-BoUqxc5h.js.map +1 -0
  231. package/public/assets/table-Dl89o43x.js +2 -0
  232. package/public/assets/table-Dl89o43x.js.map +1 -0
  233. package/public/assets/terms-B2wWfx1d.js +2 -0
  234. package/public/assets/terms-B2wWfx1d.js.map +1 -0
  235. package/public/assets/terms-COr3cDw5.js +2 -0
  236. package/public/assets/terms-COr3cDw5.js.map +1 -0
  237. package/public/assets/terms-checkbox-list-C9TkDC8Y.js +2 -0
  238. package/public/assets/terms-checkbox-list-C9TkDC8Y.js.map +1 -0
  239. package/public/assets/terms-k66ruDWl.js +2 -0
  240. package/public/assets/terms-k66ruDWl.js.map +1 -0
  241. package/public/assets/totp-BJycMMTC.js +2 -0
  242. package/public/assets/totp-BJycMMTC.js.map +1 -0
  243. package/public/assets/{totp-BNZ904Zm.js → totp-BhElob6P.js} +2 -2
  244. package/public/assets/{totp-BNZ904Zm.js.map → totp-BhElob6P.js.map} +1 -1
  245. package/public/assets/totp-C1ba10Is.js +2 -0
  246. package/public/assets/totp-C1ba10Is.js.map +1 -0
  247. package/public/assets/{trash-2-DZdKBLvC.js → trash-2-B3NVE8pR.js} +2 -2
  248. package/public/assets/{trash-2-DZdKBLvC.js.map → trash-2-B3NVE8pR.js.map} +1 -1
  249. package/public/assets/{triangle-alert-CqNn0kPs.js → triangle-alert-DATO9o3k.js} +2 -2
  250. package/public/assets/{triangle-alert-CqNn0kPs.js.map → triangle-alert-DATO9o3k.js.map} +1 -1
  251. package/public/assets/use-admin-selection-D2b7jnym.js +2 -0
  252. package/public/assets/use-admin-selection-D2b7jnym.js.map +1 -0
  253. package/public/assets/use-totp-setup-KOVNS2DC.js +3 -0
  254. package/public/assets/use-totp-setup-KOVNS2DC.js.map +1 -0
  255. package/public/assets/useAriaLabelledBy-CF3crxLc.js +2 -0
  256. package/public/assets/{useAriaLabelledBy-IIwdHUss.js.map → useAriaLabelledBy-CF3crxLc.js.map} +1 -1
  257. package/public/assets/useMutation-DqIIIiBW.js +2 -0
  258. package/public/assets/{useMutation-BWZ0G4Td.js.map → useMutation-DqIIIiBW.js.map} +1 -1
  259. package/public/assets/useQuery-CLr9TaKA.js +2 -0
  260. package/public/assets/{useQuery-Ccv_nzQl.js.map → useQuery-CLr9TaKA.js.map} +1 -1
  261. package/public/assets/users-BQQQm353.js +2 -0
  262. package/public/assets/users-BQQQm353.js.map +1 -0
  263. package/public/assets/{zod-C87S6Tec.js → zod-Dszyrytb.js} +2 -2
  264. package/public/assets/{zod-C87S6Tec.js.map → zod-Dszyrytb.js.map} +1 -1
  265. package/public/index.html +6 -6
  266. package/public/issuary-app-icon-512.png +0 -0
  267. package/public/issuary-app-icon.svg +8 -0
  268. package/public/assets/2fa-C9wUlSBS.js +0 -2
  269. package/public/assets/2fa-C9wUlSBS.js.map +0 -1
  270. package/public/assets/2fa-DFTcWEMb.js +0 -2
  271. package/public/assets/2fa-TtshNxXv.js +0 -2
  272. package/public/assets/2fa-TtshNxXv.js.map +0 -1
  273. package/public/assets/2fa-huNZDYU9.js +0 -2
  274. package/public/assets/DialogHandle-DICBMcjK.js +0 -2
  275. package/public/assets/DialogHandle-DICBMcjK.js.map +0 -1
  276. package/public/assets/FieldItemContext-BeNfhOsU.js +0 -2
  277. package/public/assets/FieldItemContext-BeNfhOsU.js.map +0 -1
  278. package/public/assets/admin-CFZaO1bM.js +0 -2
  279. package/public/assets/admin-CFZaO1bM.js.map +0 -1
  280. package/public/assets/admin-users-BK_BN8jm.js +0 -2
  281. package/public/assets/admin-users-BK_BN8jm.js.map +0 -1
  282. package/public/assets/alert-leqyvHOp.js +0 -2
  283. package/public/assets/alert-leqyvHOp.js.map +0 -1
  284. package/public/assets/auth-choice-row-CXuyJgkR.js +0 -2
  285. package/public/assets/auth-choice-row-CXuyJgkR.js.map +0 -1
  286. package/public/assets/auth-field-CWyXGKoC.js +0 -2
  287. package/public/assets/auth-footer-Cz5ivsDc.js +0 -2
  288. package/public/assets/auth-footer-Cz5ivsDc.js.map +0 -1
  289. package/public/assets/auth-layout-CiNn2-Nb.js +0 -2
  290. package/public/assets/auth-layout-CiNn2-Nb.js.map +0 -1
  291. package/public/assets/auth-page-header-DgGAaIiP.js +0 -2
  292. package/public/assets/authorization-context-banner-DznMDPOX.js +0 -2
  293. package/public/assets/avatar-D-FRGa1m.js +0 -2
  294. package/public/assets/badge-CsOfUji0.js +0 -2
  295. package/public/assets/checkbox-C90dDDza.js +0 -2
  296. package/public/assets/chevron-right-CN0jUyV0.js +0 -2
  297. package/public/assets/chevron-right-CN0jUyV0.js.map +0 -1
  298. package/public/assets/config-DTQCUlfZ.js +0 -2
  299. package/public/assets/config-DTQCUlfZ.js.map +0 -1
  300. package/public/assets/consent-B9sQEyO8.js +0 -2
  301. package/public/assets/email-8RKQzeig.js +0 -2
  302. package/public/assets/email-8RKQzeig.js.map +0 -1
  303. package/public/assets/email-huNZDYU9.js +0 -2
  304. package/public/assets/email-huNZDYU9.js.map +0 -1
  305. package/public/assets/error-BYe3gUMO.js +0 -2
  306. package/public/assets/error-BYe3gUMO.js.map +0 -1
  307. package/public/assets/field-BMT214_m.js +0 -3
  308. package/public/assets/field-BMT214_m.js.map +0 -1
  309. package/public/assets/forgot-BenoOUxC.js +0 -2
  310. package/public/assets/forgot-BenoOUxC.js.map +0 -1
  311. package/public/assets/forgot-huNZDYU9.js +0 -2
  312. package/public/assets/forgot-huNZDYU9.js.map +0 -1
  313. package/public/assets/index-CKpnrw9M.js +0 -11
  314. package/public/assets/index-CKpnrw9M.js.map +0 -1
  315. package/public/assets/index-Ct9o0oCZ.css +0 -2
  316. package/public/assets/initial-avatar-E5DK9Igm.js +0 -2
  317. package/public/assets/initial-avatar-E5DK9Igm.js.map +0 -1
  318. package/public/assets/input-CxVeC8Pn.js +0 -2
  319. package/public/assets/labeled-separator-CV7nb0XW.js +0 -2
  320. package/public/assets/labeled-separator-CV7nb0XW.js.map +0 -1
  321. package/public/assets/link-C-WdTj3F.js +0 -2
  322. package/public/assets/login-1YuiZD30.js +0 -2
  323. package/public/assets/login-1YuiZD30.js.map +0 -1
  324. package/public/assets/login-huNZDYU9.js +0 -2
  325. package/public/assets/login-huNZDYU9.js.map +0 -1
  326. package/public/assets/logout-B5T52P8u.js +0 -2
  327. package/public/assets/logout-B5T52P8u.js.map +0 -1
  328. package/public/assets/modal-tByFpy18.js +0 -2
  329. package/public/assets/modal-tByFpy18.js.map +0 -1
  330. package/public/assets/mutationOptions-DyYFUbyn.js +0 -2
  331. package/public/assets/passkey-CgAHaQ1p.js +0 -2
  332. package/public/assets/passkey-CgAHaQ1p.js.map +0 -1
  333. package/public/assets/passkey-huNZDYU9.js +0 -2
  334. package/public/assets/passkey-huNZDYU9.js.map +0 -1
  335. package/public/assets/passkey-v9Pzv-4A.js +0 -2
  336. package/public/assets/passkey-v9Pzv-4A.js.map +0 -1
  337. package/public/assets/password-Cuh9Hnjp.js +0 -2
  338. package/public/assets/password-Cuh9Hnjp.js.map +0 -1
  339. package/public/assets/password-huNZDYU9.js +0 -2
  340. package/public/assets/password-huNZDYU9.js.map +0 -1
  341. package/public/assets/password-reset-sU5KkBKi.js +0 -2
  342. package/public/assets/password-strength-BIPcWiM_.js +0 -2
  343. package/public/assets/pin-input-CITrr-Yc.js +0 -2
  344. package/public/assets/plus-DSBBSrgj.js +0 -2
  345. package/public/assets/plus-DSBBSrgj.js.map +0 -1
  346. package/public/assets/profile-BHPL9Px_.js +0 -2
  347. package/public/assets/profile-C8KaELVe.js +0 -2
  348. package/public/assets/profile-C8KaELVe.js.map +0 -1
  349. package/public/assets/provider-logos-u1YURWQr.js +0 -2
  350. package/public/assets/provider-logos-u1YURWQr.js.map +0 -1
  351. package/public/assets/recovery-CVROV9nj.js +0 -2
  352. package/public/assets/recovery-CVROV9nj.js.map +0 -1
  353. package/public/assets/register-cpxjX3qr.js +0 -2
  354. package/public/assets/register-cpxjX3qr.js.map +0 -1
  355. package/public/assets/register-huNZDYU9.js +0 -2
  356. package/public/assets/register-huNZDYU9.js.map +0 -1
  357. package/public/assets/reset-huNZDYU9.js +0 -2
  358. package/public/assets/reset-huNZDYU9.js.map +0 -1
  359. package/public/assets/reset-iNqYdsoa.js +0 -2
  360. package/public/assets/reset-iNqYdsoa.js.map +0 -1
  361. package/public/assets/select-DdjQtcLJ.js +0 -2
  362. package/public/assets/select-DdjQtcLJ.js.map +0 -1
  363. package/public/assets/select-huNZDYU9.js +0 -2
  364. package/public/assets/separator-B0Bvh1he.js +0 -2
  365. package/public/assets/separator-B0Bvh1he.js.map +0 -1
  366. package/public/assets/shell-header-bar-JcFhS7mb.js +0 -2
  367. package/public/assets/shell-header-bar-JcFhS7mb.js.map +0 -1
  368. package/public/assets/standard-schema-e8gtSzGE.js +0 -2
  369. package/public/assets/terms-BHPL9Px_.js +0 -2
  370. package/public/assets/terms-BHPL9Px_.js.map +0 -1
  371. package/public/assets/terms-BjwMWDFp.js +0 -2
  372. package/public/assets/terms-BjwMWDFp.js.map +0 -1
  373. package/public/assets/terms-checkbox-list-DNOq4Pb2.js +0 -2
  374. package/public/assets/terms-checkbox-list-DNOq4Pb2.js.map +0 -1
  375. package/public/assets/totp-D_EWG1h8.js +0 -2
  376. package/public/assets/totp-D_EWG1h8.js.map +0 -1
  377. package/public/assets/totp-DetFwOkk.js +0 -2
  378. package/public/assets/totp-DetFwOkk.js.map +0 -1
  379. package/public/assets/use-totp-setup-DtlgPUPJ.js +0 -3
  380. package/public/assets/use-totp-setup-DtlgPUPJ.js.map +0 -1
  381. package/public/assets/useAriaLabelledBy-IIwdHUss.js +0 -2
  382. package/public/assets/useMutation-BWZ0G4Td.js +0 -2
  383. package/public/assets/useQuery-Ccv_nzQl.js +0 -2
  384. package/public/assets/users-B1gvPM_x.js +0 -2
  385. package/public/assets/users-B1gvPM_x.js.map +0 -1
  386. package/public/vite.svg +0 -1
@@ -1,2 +0,0 @@
1
- import{J as e,Z as t}from"./createLucideIcon-BPpAIXR_.js";var n=t(e(),1),r=e=>e.type===`checkbox`,i=e=>e instanceof Date,a=e=>e==null,o=e=>typeof e==`object`,s=e=>!a(e)&&!Array.isArray(e)&&o(e)&&!i(e),c=e=>s(e)&&e.target?r(e.target)?e.target.checked:e.target.value:e,l=(e,t)=>t.split(`.`).some((t,n,r)=>!isNaN(Number(t))&&e.has(r.slice(0,n).join(`.`))),u=e=>{let t=e.constructor&&e.constructor.prototype;return s(t)&&t.hasOwnProperty(`isPrototypeOf`)},d=typeof window<`u`&&window.HTMLElement!==void 0&&typeof document<`u`;function f(e){if(e instanceof Date)return new Date(e);let t=typeof FileList<`u`&&e instanceof FileList;if(d&&(e instanceof Blob||t))return e;let n=Array.isArray(e);if(!n&&!(s(e)&&u(e)))return e;let r=n?[]:Object.create(Object.getPrototypeOf(e));for(let t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=f(e[t]));return r}var p={BLUR:`blur`,FOCUS_OUT:`focusout`,CHANGE:`change`,SUBMIT:`submit`,TRIGGER:`trigger`,VALID:`valid`},m={onBlur:`onBlur`,onChange:`onChange`,onSubmit:`onSubmit`,onTouched:`onTouched`,all:`all`},h={max:`max`,min:`min`,maxLength:`maxLength`,minLength:`minLength`,pattern:`pattern`,required:`required`,validate:`validate`},g=`root`,_=[`__proto__`,`constructor`,`prototype`],v=/^\w*$/,y=e=>v.test(e),b=e=>e===void 0,x=/[.[\]'"]/,S=e=>e.split(x).filter(Boolean),C=(e,t,n)=>{if(!t||!s(e))return n;let r=y(t)?[t]:S(t);if(r.some(e=>_.includes(e)))return n;let i=r.reduce((e,t)=>a(e)?void 0:e[t],e);return b(i)||i===e?b(e[t])?n:e[t]:i},w=e=>typeof e==`boolean`,T=e=>typeof e==`function`,E=(e,t,n)=>{let r=-1,i=y(t)?[t]:S(t),a=i.length,o=a-1;for(;++r<a;){let t=i[r],a=n;if(r!==o){let n=e[t];a=s(n)||Array.isArray(n)?n:isNaN(+i[r+1])?{}:[]}if(_.includes(t))return;e[t]=a,e=e[t]}},D=n.createContext(null);D.displayName=`HookFormControlContext`;var O=()=>n.useContext(D),k=(e,t,n,r=!0)=>{let i={};for(let a in e)Object.defineProperty(i,a,{get:()=>{let i=a;return t._proxyFormState[i]!==m.all&&(t._proxyFormState[i]=!r||m.all),n&&(n[i]=!0),e[i]}});return i},A=d?n.useLayoutEffect:n.useEffect;function j(e){let t=O(),{control:r=t,disabled:i,name:a,exact:o}=e||{},[s,c]=n.useState(()=>({...r._formState,defaultValues:r._defaultValues})),l=n.useRef({isDirty:!1,isLoading:!1,dirtyFields:!1,touchedFields:!1,validatingFields:!1,isValidating:!1,isValid:!1,errors:!1});return A(()=>r._subscribe({name:a,formState:l.current,exact:o,callback:e=>{!i&&c({...r._formState,...e,defaultValues:r._defaultValues})}}),[a,i,o]),n.useEffect(()=>{l.current.isValid&&r._setValid(!0)},[r]),n.useMemo(()=>k(s,r,l.current,!1),[s,r])}var M=e=>typeof e==`string`,N=(e,t,n,r,i)=>M(e)?(r&&t.watch.add(e),C(n,e,i)):Array.isArray(e)?e.map(e=>(r&&t.watch.add(e),C(n,e))):(r&&(t.watchAll=!0),n),P=e=>a(e)||!o(e),F=(e,t)=>t.length===0&&!Array.isArray(e)&&!u(e);function I(e,t,n=new WeakMap){if(e===t)return!0;if(P(e)||P(t))return Object.is(e,t);if(i(e)&&i(t))return Object.is(e.getTime(),t.getTime());let r=Object.keys(e),a=Object.keys(t);if(r.length!==a.length)return!1;if(F(e,r)||F(t,a))return Object.is(e,t);if(!r.length&&Array.isArray(e)!==Array.isArray(t))return!1;let o=n.get(e);if(o&&o.has(t))return!0;if(o)o.add(t);else{let r=new WeakSet;r.add(t),n.set(e,r)}for(let a of r){let r=e[a];if(!(a in t))return!1;if(a!==`ref`){let e=t[a];if(i(r)&&i(e)||(s(r)||Array.isArray(r))&&(s(e)||Array.isArray(e))?!I(r,e,n):!Object.is(r,e))return!1}}return!0}function L(e){let t=O(),{control:r=t,name:i,defaultValue:a,disabled:o,exact:s,compute:c}=e||{},l=n.useRef(a),u=n.useRef(c),d=n.useRef(void 0),f=n.useRef(r),p=n.useRef(i);u.current=c;let[m,h]=n.useState(()=>{let e=r._getWatch(i,l.current);return u.current?u.current(e):e}),g=n.useCallback(e=>{let t=N(i,r._names,e||r._formValues,!1,l.current);return u.current?u.current(t):t},[r._formValues,r._names,i]),_=n.useCallback(e=>{if(!o){let t=N(i,r._names,e||r._formValues,!1,l.current);if(u.current){let e=u.current(t);I(e,d.current)||(h(e),d.current=e)}else h(t)}},[r._formValues,r._names,o,i]);A(()=>((f.current!==r||!I(p.current,i))&&(f.current=r,p.current=i,_()),r._subscribe({name:i,formState:{values:!0},exact:s,callback:e=>{_(e.values)}})),[r,s,i,_]),n.useEffect(()=>r._removeUnmounted());let v=f.current!==r,y=p.current,b=n.useMemo(()=>{if(o)return null;let e=!v&&!I(y,i);return v||e?g():null},[o,v,i,y,g]);return b===null?m:b}function R(e){let t=O(),{name:r,disabled:i,control:a=t,shouldUnregister:o,defaultValue:s,exact:u=!0}=e,d=l(a._names.array,r),m=L({control:a,name:r,defaultValue:n.useMemo(()=>C(a._formValues,r,C(a._defaultValues,r,s)),[a,r,s]),exact:u}),h=j({control:a,name:r,exact:u}),g=n.useRef(e),_=n.useRef(null),v=n.useRef(a.register(r,{...e.rules,value:m,...w(e.disabled)?{disabled:e.disabled}:{}}));g.current=e;let y=n.useMemo(()=>Object.defineProperties({},{invalid:{enumerable:!0,get:()=>!!C(h.errors,r)},isDirty:{enumerable:!0,get:()=>!!C(h.dirtyFields,r)},isTouched:{enumerable:!0,get:()=>!!C(h.touchedFields,r)},isValidating:{enumerable:!0,get:()=>!!C(h.validatingFields,r)},error:{enumerable:!0,get:()=>C(h.errors,r)}}),[h,r]),x=n.useCallback(e=>{let t=c(e);return C(a._fields,r)||(v.current=a.register(r,{...g.current.rules,value:t})),v.current.onChange({target:{value:c(e),name:r},type:p.CHANGE})},[r,a]),S=n.useCallback(()=>v.current.onBlur({target:{value:C(a._formValues,r),name:r},type:p.BLUR}),[r,a._formValues]),D=n.useCallback(e=>{e&&(_.current={focus:()=>T(e.focus)&&e.focus(),select:()=>T(e.select)&&e.select(),setCustomValidity:t=>T(e.setCustomValidity)&&e.setCustomValidity(t),reportValidity:()=>T(e.reportValidity)&&e.reportValidity()});let t=C(a._fields,r);t&&t._f&&e&&(t._f.ref=_.current)},[a._fields,r]),k=n.useMemo(()=>({name:r,value:m,...w(i)||h.disabled?{disabled:h.disabled||i}:{},onChange:x,onBlur:S,ref:D}),[r,i,h.disabled,x,S,D,m]);return n.useEffect(()=>{let e=a._options.shouldUnregister||o;a.register(r,{...g.current.rules,...w(g.current.disabled)?{disabled:g.current.disabled}:{}});let t=(e,t)=>{let n=C(a._fields,e);n&&n._f&&(n._f.mount=t)};if(t(r,!0),e){let e=f(C(o?a._defaultValues:a._options.values||a._defaultValues,r,C(a._options.defaultValues,r,g.current.defaultValue)));E(a._defaultValues,r,e),b(C(a._formValues,r))&&E(a._formValues,r,e)}if(!d&&a.register(r),_.current){let e=C(a._fields,r);e&&e._f&&(e._f.ref=_.current)}return()=>{(d?e&&!a._state.action:e)?a.unregister(r):t(r,!1)}},[r,a,d,o]),n.useEffect(()=>{a._setDisabledField({disabled:i,name:r})},[i,r,a]),n.useMemo(()=>({field:k,formState:h,fieldState:y}),[k,h,y])}var ee=e=>e.render(R(e)),te=e=>{let t={};for(let n of Object.keys(e))if(o(e[n])&&e[n]!==null&&!i(e[n])){let r=te(e[n]);for(let e of Object.keys(r))t[`${n}.${e}`]=r[e]}else t[n]=e[n];return t},ne=n.createContext(null);ne.displayName=`HookFormContext`;var z=(e,t,n,r,i)=>t?{...n[e],types:{...n[e]&&n[e].types?n[e].types:{},[r]:i||!0}}:{},re=e=>Array.isArray(e)?e.filter(Boolean):[],ie=e=>Array.isArray(e)?e:[e],ae=()=>{let e=[];return{get observers(){return e},next:t=>{for(let n of e)n.next&&n.next(t)},subscribe:t=>(e.push(t),{unsubscribe:()=>{e=e.filter(e=>e!==t)}}),unsubscribe:()=>{e=[]}}};function oe(e,t){let n={};for(let r in e)if(e.hasOwnProperty(r)){let i=e[r],a=t[r];if(i&&s(i)&&a){let e=oe(i,a);s(e)&&(n[r]=e)}else e[r]&&(n[r]=a)}return n}var B=e=>s(e)&&!Object.keys(e).length,se=e=>e.type===`file`,ce=e=>{if(!d)return!1;let t=e?e.ownerDocument:0;return e instanceof(t&&t.defaultView?t.defaultView.HTMLElement:HTMLElement)},le=e=>e.type===`select-multiple`,V=e=>e.type===`radio`,ue=e=>V(e)||r(e),de=e=>ce(e)&&e.isConnected;function fe(e,t){let n=t.slice(0,-1).length,r=0;for(;r<n;){if(a(e)){e=void 0;break}e=e[t[r]],r++}return e}function pe(e){for(let t in e)if(e.hasOwnProperty(t)&&!b(e[t]))return!1;return!0}function H(e,t){if(M(t)&&Object.prototype.hasOwnProperty.call(e,t))return delete e[t],e;let n=Array.isArray(t)?t:y(t)?[t]:S(t);if(n.some(e=>_.includes(String(e))))return e;let r=n.length===1?e:fe(e,n),i=n.length-1,a=n[i];return r&&delete r[a],i!==0&&(s(r)&&B(r)||Array.isArray(r)&&pe(r))&&H(e,n.slice(0,-1)),e}var me=e=>{for(let t in e)if(T(e[t]))return!0;return!1};function he(e){return Array.isArray(e)||s(e)&&!me(e)}function U(e,t={}){for(let n in e){let r=e[n];he(r)?(t[n]=Array.isArray(r)?[]:{},U(r,t[n])):b(r)||(t[n]=!0)}return t}function W(e){if(e!==!1){if(e===!0)return!0;if(Array.isArray(e)){let t=e.map(e=>W(e));return t.some(e=>e!==void 0)?t:void 0}if(s(e)){let t={};for(let n in e){let r=W(e[n]);b(r)||(t[n]=r)}return Object.keys(t).length?t:void 0}}}function G(e,t,n){n||=U(t);for(let r in e){let i=e[r];if(he(i))b(t)||P(n[r])?n[r]=U(i,Array.isArray(i)?[]:{}):G(i,a(t)?{}:t[r],n[r]);else{let e=t[r];n[r]=!I(i,e)}}return W(n)||{}}var ge={value:!1,isValid:!1},_e={value:!0,isValid:!0},K=e=>{if(Array.isArray(e)){if(e.length>1){let t=e.filter(e=>e&&e.checked&&!e.disabled).map(e=>e.value);return{value:t,isValid:!!t.length}}return e[0].checked&&!e[0].disabled?e[0].attributes&&!b(e[0].attributes.value)?b(e[0].value)||e[0].value===``?_e:{value:e[0].value,isValid:!0}:_e:ge}return ge},ve=(e,{valueAsNumber:t,valueAsDate:n,setValueAs:r})=>b(e)?e:t?e===``?NaN:e&&+e:n&&M(e)?new Date(e):r?r(e):e,ye={isValid:!1,value:null},be=e=>Array.isArray(e)?e.reduce((e,t)=>t&&t.checked&&!t.disabled?{isValid:!0,value:t.value}:e,ye):ye;function xe(e){let t=e.ref;return se(t)?t.files:V(t)?be(e.refs).value:le(t)?[...t.selectedOptions].map(({value:e})=>e):r(t)?K(e.refs).value:ve(b(t.value)?e.ref.value:t.value,e)}var Se=(e,t,n,r)=>{let i={};for(let n of e){let e=C(t,n);e&&E(i,n,e._f)}return{criteriaMode:n,names:[...e],fields:i,shouldUseNativeValidation:r}},q=e=>e instanceof RegExp,J=e=>b(e)?e:q(e)?e.source:s(e)?q(e.value)?e.value.source:e.value:e,Ce=e=>({isOnSubmit:!e||e===m.onSubmit,isOnBlur:e===m.onBlur,isOnChange:e===m.onChange,isOnAll:e===m.all,isOnTouch:e===m.onTouched}),we=`AsyncFunction`,Te=e=>{if(!e||!e.validate)return!1;if(T(e.validate))return e.validate.constructor.name===we;if(s(e.validate)){for(let t in e.validate)if(e.validate[t].constructor.name===we)return!0}return!1},Ee=e=>e.mount&&(e.required||e.min||e.max||e.maxLength||e.minLength||e.pattern||e.validate),De=(e,t,n)=>{if(n)return!1;if(t.watchAll||t.watch.has(e))return!0;for(let n of t.watch)if(e.startsWith(n)&&e.charAt(n.length)===`.`)return!0;return!1},Y=(e,t,n,r)=>{for(let i of n||Object.keys(e)){let n=C(e,i);if(n){let{_f:e,...a}=n;if(e){if(e.refs&&e.refs[0]&&t(e.refs[0],i)&&!r||e.ref&&t(e.ref,e.name)&&!r)return!0;if(Y(a,t))break}else if(s(a)&&Y(a,t))break}}};function Oe(e,t,n){let r=C(e,n);if(r||y(n))return{error:r,name:n};let i=n.split(`.`);for(;i.length;){let r=i.join(`.`),a=C(t,r),o=C(e,r);if(a&&!Array.isArray(a)&&n!==r)return{name:n};if(o&&o.type)return{name:r,error:o};if(o&&o.root&&o.root.type)return{name:`${r}.root`,error:o.root};i.pop()}return{name:n}}var ke=(e,t,n,r)=>{n(e);let{name:i,...a}=e,o=Object.keys(a);return!o.length||r&&o.length>=Object.keys(t).length||o.find(e=>t[e]===(!r||m.all))},Ae=(e,t,n)=>!e||!t||e===t||ie(e).some(e=>e&&(n?e===t||e.startsWith(t+`.`):e.startsWith(t)||t.startsWith(e))),je=(e,t,n,r,i)=>i.isOnAll?!1:!n&&i.isOnTouch?!(t||e):(n?r.isOnBlur:i.isOnBlur)?!e:(n?r.isOnChange:i.isOnChange)?e:!0,Me=(e,t)=>!re(C(e,t)).length&&H(e,t),Ne=(e,t,n)=>{let r=C(e,n),i=Array.isArray(r)?r:[];return E(i,g,t[n]),E(e,n,i),e};function X(e,t,n=`validate`){if(M(e)||Array.isArray(e)&&e.every(M)||w(e)&&!e)return{type:n,message:M(e)?e:``,ref:t}}var Z=e=>s(e)&&!q(e)?e:{value:e,message:``},Pe=async(e,t,n,i,o,c)=>{let{ref:l,refs:u,required:d,maxLength:f,minLength:p,min:m,max:g,pattern:_,validate:v,name:y,valueAsNumber:x,mount:S}=e._f,E=C(n,y);if(!S||t.has(y))return{};let D=u?u[0]:l,O=e=>{if(o&&D.reportValidity){let t=w(e)?``:e||``;u?u.forEach(e=>e.setCustomValidity(t)):D.setCustomValidity(t),D.reportValidity()}},k={},A=V(l),j=r(l),N=A||j,P=(x||se(l))&&b(l.value)&&b(E)||ce(l)&&l.value===``||E===``||Array.isArray(E)&&!E.length,F=z.bind(null,y,i,k),I=(e,t,n,r=h.maxLength,i=h.minLength)=>{let a=e?t:n;k[y]={type:e?r:i,message:a,ref:l,...F(e?r:i,a)}};if(c?!Array.isArray(E)||!E.length:d&&(!N&&(P||a(E))||w(E)&&!E||j&&!K(u).isValid||A&&!be(u).isValid)){let{value:e,message:t}=M(d)?{value:!!d,message:d}:Z(d);if(e&&(k[y]={type:h.required,message:t,ref:D,...F(h.required,t)},!i))return O(t),k}if(!P&&(!a(m)||!a(g))){let e,t,n=Z(g),r=Z(m);if(!a(E)&&!isNaN(E)){let i=l.valueAsNumber||E&&+E;a(n.value)||(e=i>n.value),a(r.value)||(t=i<r.value)}else{let i=l.valueAsDate||new Date(E),a=e=>new Date(new Date().toDateString()+` `+e),o=l.type==`time`,s=l.type==`week`;M(n.value)&&E&&(e=o?a(E)>a(n.value):s?E>n.value:i>new Date(n.value)),M(r.value)&&E&&(t=o?a(E)<a(r.value):s?E<r.value:i<new Date(r.value))}if((e||t)&&(I(!!e,n.message,r.message,h.max,h.min),!i))return O(k[y].message),k}if((f||p)&&!P&&(M(E)||c&&Array.isArray(E))){let e=Z(f),t=Z(p),n=!a(e.value)&&E.length>+e.value,r=!a(t.value)&&E.length<+t.value;if((n||r)&&(I(n,e.message,t.message),!i))return O(k[y].message),k}if(_&&!P&&M(E)){let{value:e,message:t}=Z(_);if(q(e)&&!E.match(e)&&(k[y]={type:h.pattern,message:t,ref:l,...F(h.pattern,t)},!i))return O(t),k}if(v){if(T(v)){let e=X(await v(E,n),D);if(e&&(k[y]={...e,...F(h.validate,e.message)},!i))return O(e.message),k}else if(s(v)){let e={};for(let t in v){if(!B(e)&&!i)break;let r=X(await v[t](E,n),D,t);r&&(e={...r,...F(t,r.message)},O(r.message),i&&(k[y]=e))}if(!B(e)&&(k[y]={ref:D,...e},!i))return k}}return O(!0),k},Fe={mode:m.onSubmit,reValidateMode:m.onChange,shouldFocusError:!0},Ie=`form`,Le={submitCount:0,isDirty:!1,isReady:!1,isValidating:!1,isSubmitted:!1,isSubmitting:!1,isSubmitSuccessful:!1,isValid:!1,touchedFields:{},dirtyFields:{},validatingFields:{}};function Re(e={}){let t={...Fe,...e},n={...f(Le),isLoading:T(t.defaultValues),errors:t.errors||{},disabled:t.disabled||!1},o={},u=(s(t.defaultValues)||s(t.values))&&f(t.defaultValues||t.values)||{},_=t.shouldUnregister?{}:f(u),v={action:!1,mount:!1,watch:!1,keepIsValid:!1},x={mount:new Set,disabled:new Set,unMount:new Set,array:new Set,watch:new Set,registerName:new Set},D,O=0,k=0,A=Ce(t.mode),j=Ce(t.reValidateMode),P={isDirty:!1,dirtyFields:!1,validatingFields:!1,touchedFields:!1,isValidating:!1,isValid:!1,errors:!1},F={...P},L={...F},R={array:ae(),state:ae()},ee=t.criteriaMode===m.all,ne=e=>t=>{clearTimeout(O),O=setTimeout(e,t)},z=async e=>{if(!v.keepIsValid&&!t.disabled&&(F.isValid||L.isValid||e)){let e;t.resolver?(e=B((await K()).errors),V()):e=await q({fields:o,onlyCheckValid:!0,eventType:p.VALID}),e!==n.isValid&&R.state.next({isValid:e})}},V=(e,r)=>{!t.disabled&&(F.isValidating||F.validatingFields||L.isValidating||L.validatingFields)&&((e||Array.from(x.mount)).forEach(e=>{e&&(r?E(n.validatingFields,e,r):H(n.validatingFields,e))}),R.state.next({validatingFields:n.validatingFields,isValidating:!B(n.validatingFields)}))},fe=()=>{n.dirtyFields=G(u,_)},pe=(e,r=[],i,a,s=!0,c=!0)=>{if(a&&i&&!t.disabled){if(v.action=!0,c&&Array.isArray(C(o,e))){let t=i(C(o,e),a.argA,a.argB);s&&E(o,e,t)}if(c&&Array.isArray(C(n.errors,e))){let t=i(C(n.errors,e),a.argA,a.argB);s&&E(n.errors,e,t),Me(n.errors,e)}if((F.touchedFields||L.touchedFields)&&c&&Array.isArray(C(n.touchedFields,e))){let t=i(C(n.touchedFields,e),a.argA,a.argB);s&&E(n.touchedFields,e,t)}(F.dirtyFields||L.dirtyFields)&&fe(),R.state.next({name:e,isDirty:X(e,r),dirtyFields:n.dirtyFields,errors:n.errors,isValid:n.isValid})}else E(_,e,r)},me=(e,t)=>{E(n.errors,e,t),n.errors={...n.errors},R.state.next({errors:n.errors})},he=e=>{n.errors=e,R.state.next({errors:n.errors,isValid:!1})},U=e=>{let t=y(e)?[e]:S(e),n=_,r=u;for(let e=0;e<t.length-1;e++){let i=t[e];if(n=a(n)?n:n[i],r=a(r)?r:r[i],n===null&&r!==null)return!0}return!1},W=(t,r,i,a)=>{let s=C(o,t);if(s){if(U(t))return;let o=b(C(_,t)),c=C(_,t,b(i)?C(u,t):i);b(c)||a&&a.defaultChecked||r?E(_,t,r?c:xe(s._f)):ze(t,c),v.mount&&!v.action&&(z(),o&&n.isDirty&&(F.isDirty||L.isDirty)&&(X()||(n.isDirty=!1,R.state.next({...n}))),e.shouldUnregister&&o&&!b(C(_,t))&&De(t,x)&&(v.watch=!0))}},ge=(e,r,i,a,o)=>{let s=!1,c=!1,l={name:e};if(!t.disabled){if(!i||a){let t=I(C(u,e),r);(F.isDirty||L.isDirty)&&(c=n.isDirty,n.isDirty=l.isDirty=!t||X(),s=c!==l.isDirty),c=!!C(n.dirtyFields,e),t===n.isDirty?t?H(n.dirtyFields,e):E(n.dirtyFields,e,!0):n.dirtyFields=G(u,_),l.dirtyFields=n.dirtyFields,s||=(F.dirtyFields||L.dirtyFields)&&c!==!t}if(i){let t=C(n.touchedFields,e);t||(E(n.touchedFields,e,i),l.touchedFields=n.touchedFields,s||=(F.touchedFields||L.touchedFields)&&t!==i)}s&&o&&R.state.next(l)}return s?l:{}},_e=(e,r,i,a)=>{let o=C(n.errors,e),s=(F.isValid||L.isValid)&&w(r)&&n.isValid!==r;if(t.delayError&&i?(D=ne(()=>me(e,i)),D(t.delayError)):(clearTimeout(O),D=null,i?E(n.errors,e,i):H(n.errors,e),n.errors={...n.errors}),(i?!I(o,i):o)||!B(a)||s){let t={...a,...s&&w(r)?{isValid:r}:{},errors:n.errors,name:e};n={...n,...t},R.state.next(t)}},K=async e=>(V(e,!0),await t.resolver(_,t.context,Se(e||x.mount,o,t.criteriaMode,t.shouldUseNativeValidation))),ye=async e=>{let{errors:t}=await K(e);if(V(e),e){for(let r of e){let e=C(t,r);e?x.array.has(r)&&s(e)&&!Object.keys(e).some(e=>!Number.isNaN(Number(e)))?Ne(n.errors,{[r]:e},r):E(n.errors,r,e):H(n.errors,r)}n.errors={...n.errors}}else n.errors=t;return t},be=async({name:t,eventType:r})=>{if(e.validate){let i=await e.validate({formValues:_,formState:n,name:t,eventType:r});if(s(i))for(let e in i){let t=i[e];t&&Je(`${Ie}.${e}`,{message:M(t.message)?t.message:``,type:t.type||h.validate})}else M(i)||!i?Je(Ie,{message:i||``,type:h.validate}):qe(Ie);return i}return!0},q=async({fields:r,onlyCheckValid:i,name:a,eventType:o,context:s={valid:!0,runRootValidation:!1}})=>{if(e.validate&&(s.runRootValidation=!0,!await be({name:a,eventType:o})&&(s.valid=!1,i)))return s.valid;for(let a in r){let c=r[a];if(c){let{_f:r,...l}=c;if(r){let a=x.array.has(r.name),o=c._f&&Te(c._f),l=F.validatingFields||F.isValidating||L.validatingFields||L.isValidating;o&&l&&V([r.name],!0);let u=await Pe(c,x.disabled,_,ee,t.shouldUseNativeValidation&&!i,a);if(o&&l&&V([r.name]),u[r.name]&&(s.valid=!1,i)||(!i&&(C(u,r.name)?a?Ne(n.errors,u,r.name):E(n.errors,r.name,u[r.name]):H(n.errors,r.name)),e.shouldUseNativeValidation&&u[r.name]))break}!B(l)&&await q({context:s,onlyCheckValid:i,fields:l,name:a,eventType:o})}}return s.valid},we=()=>{for(let e of x.unMount){let t=C(o,e);t&&(t._f.refs?t._f.refs.every(e=>!de(e)):!de(t._f.ref))&&Qe(e)}x.unMount=new Set},X=(e,n)=>!t.disabled&&(e&&n&&E(_,e,n),!I(v.mount?_:u,u)),Z=(e,t,n)=>N(e,x,{...v.mount?_:b(t)?u:M(e)?{[e]:t}:t},n,t),Re=e=>re(C(v.mount?_:u,e,t.shouldUnregister?C(u,e,[]):[])),ze=(e,t,n={},i=!1,s=!1)=>{let c=C(o,e),l=t;if(c){let n=c._f;n&&(!n.disabled&&E(_,e,ve(t,n)),l=ce(n.ref)&&a(t)?``:t,le(n.ref)?[...n.ref.options].forEach(e=>e.selected=l.includes(e.value)):n.refs?r(n.ref)?n.refs.forEach(e=>{(!e.defaultChecked||!e.disabled)&&(Array.isArray(l)?e.checked=!!l.find(t=>t===e.value):e.checked=l===e.value||!!l)}):n.refs.forEach(e=>e.checked=e.value===l):se(n.ref)?n.ref.value=``:(n.ref.value=l,!n.ref.type&&!s&&R.state.next({name:e,values:i?_:f(_)})))}(n.shouldDirty||n.shouldTouch)&&ge(e,l,n.shouldTouch,n.shouldDirty,!s),n.shouldValidate&&$(e)},Be=(e,t,n,r=!1,a=!1)=>{for(let c in t){if(!t.hasOwnProperty(c))return;let l=t[c],u=e+`.`+c,d=C(o,u);(x.array.has(e)||s(l)||d&&!d._f)&&!i(l)?Be(u,l,n,r,a):ze(u,l,n,r,a)}},Ve=(e,t,r,i,s=!1)=>{let c=C(o,e),l=x.array.has(e),u=i?t:f(t),d=I(C(_,e),u);if(d||E(_,e,u),l)R.array.next({name:e,values:i?_:f(_)}),(F.isDirty||F.dirtyFields||L.isDirty||L.dirtyFields)&&r.shouldDirty&&(fe(),s||R.state.next({name:e,dirtyFields:n.dirtyFields,isDirty:X(e,u)}));else{let t=Array.isArray(u)&&!u.length||B(u);!c||c._f||a(u)||t?ze(e,u,r,i,s):Be(e,u,r,i,s)}if(!d&&!s){let t=De(e,x),r=i?_:f(_);R.state.next({...t&&n,name:v.mount||t?e:void 0,values:r})}},Q=(e,t,n={})=>Ve(e,t,n,!1),He=(e,t={})=>{let r=T(e)?e(_):e;if(!I(_,r)){_={..._,...r};let e=te(r);for(let n of x.mount)n in e&&Ve(n,e[n],t,!0,!0);R.state.next({...n,name:void 0,type:void 0,...k?{values:_}:{}}),t.shouldValidate&&z()}},Ue=async r=>{v.mount=!0;let a=r.target,s=a.name,l=!0,u=C(o,s),d=e=>{l=Number.isNaN(e)||i(e)&&isNaN(e.getTime())||I(e,C(_,s,e))};if(u){let i,m,h=a.type?xe(u._f):c(r),g=r.type===p.BLUR||r.type===p.FOCUS_OUT,v=!Ee(u._f)&&!e.validate&&!t.resolver&&!C(n.errors,s)&&!u._f.deps,y=v||je(g,C(n.touchedFields,s),n.isSubmitted,j,A),b=De(s,x,g);E(_,s,h),g?(!a||!a.readOnly)&&(u._f.onBlur&&u._f.onBlur(r),D&&D(0)):u._f.onChange&&u._f.onChange(r);let S=ge(s,h,g),w=!B(S)||b;if(!g&&R.state.next({name:s,type:r.type,...k?{values:f(_)}:{}}),y)return(!v||!n.isValid)&&(F.isValid||L.isValid)&&(t.mode===`onBlur`?g&&z():g||z()),w&&R.state.next({name:s,...b?{}:S});if(!t.resolver&&e.validate&&await be({name:s,eventType:r.type}),!g&&b&&R.state.next({...n}),t.resolver){let{errors:e}=await K([s]);if(V([s]),d(h),!l){!B(S)&&R.state.next(S);return}let t=Oe(n.errors,o,s),r=Oe(e,o,t.name||s);i=r.error,s=r.name,m=B(e)}else V([s],!0),i=(await Pe(u,x.disabled,_,ee,t.shouldUseNativeValidation))[s],V([s]),d(h),l&&(i?m=!1:(F.isValid||L.isValid)&&(m=await q({fields:o,onlyCheckValid:!0,name:s,eventType:r.type})));l&&(u._f.deps&&(!Array.isArray(u._f.deps)||u._f.deps.length>0)&&$(u._f.deps),_e(s,m,i,S))}},We=(e,t)=>{if(C(n.errors,t)&&e.focus)return e.focus(),1},$=async(e,r={})=>{let i,a,s=ie(e);if(t.resolver){let t=await ye(b(e)?e:s);i=B(t),a=e?!s.some(e=>C(t,e)):i}else e?(a=(await Promise.all(s.map(async e=>{let t=C(o,e);return await q({fields:t&&t._f?{[e]:t}:t,eventType:p.TRIGGER})}))).every(Boolean),!(!a&&!n.isValid)&&z()):a=i=await q({fields:o,name:e,eventType:p.TRIGGER});return R.state.next({...!M(e)||(F.isValid||L.isValid)&&i!==n.isValid?{}:{name:e},...t.resolver||!e?{isValid:i}:{},errors:n.errors}),r.shouldFocus&&!a&&Y(o,We,e?s:x.mount),a},Ge=(e,t)=>{let r={...v.mount?_:u};return t&&(r=oe(t.dirtyFields?n.dirtyFields:n.touchedFields,r)),b(e)?r:M(e)?C(r,e):e.map(e=>C(r,e))},Ke=(e,t)=>({invalid:!!C((t||n).errors,e),isDirty:!!C((t||n).dirtyFields,e),error:C((t||n).errors,e),isValidating:!!C(n.validatingFields,e),isTouched:!!C((t||n).touchedFields,e)}),qe=e=>{let t=e?ie(e):void 0;t?.forEach(e=>H(n.errors,e)),t?t.forEach(e=>{R.state.next({name:e,errors:n.errors})}):R.state.next({errors:{}})},Je=(e,t,r)=>{let i=(C(o,e,{_f:{}})._f||{}).ref,{ref:a,message:s,type:c,...l}=C(n.errors,e)||{};E(n.errors,e,{...l,...t,ref:i}),R.state.next({name:e,errors:n.errors,isValid:!1}),r&&r.shouldFocus&&i&&i.focus&&i.focus()},Ye=(e,t)=>{if(T(e)){k++;let{unsubscribe:n}=R.state.subscribe({next:n=>`values`in n&&e(n.values||Z(void 0,t),n)}),r=!1;return{unsubscribe:()=>{r||(r=!0,k--,n())}}}return Z(e,t,!0)},Xe=e=>{let t=!!e.formState?.values;t&&k++;let{unsubscribe:r}=R.state.subscribe({next:t=>{if(Ae(e.name,t.name,e.exact)&&ke(t,e.formState||F,ct,e.reRenderRoot)){let r={..._};e.callback({values:r,...n,...t,defaultValues:u})}}});if(!t)return r;let i=!1;return()=>{i||(i=!0,k--,r())}},Ze=e=>(v.mount=!0,L={...L,...e.formState},Xe({...e,formState:{...P,...e.formState}})),Qe=(e,r={})=>{for(let i of e?ie(e):x.mount)x.mount.delete(i),x.array.delete(i),r.keepValue||(H(o,i),H(_,i)),!r.keepError&&H(n.errors,i),!r.keepDirty&&H(n.dirtyFields,i),!r.keepTouched&&H(n.touchedFields,i),!r.keepIsValidating&&H(n.validatingFields,i),!t.shouldUnregister&&!r.keepDefaultValue&&H(u,i);R.state.next({values:f(_)}),R.state.next({...n,...r.keepDirty?{isDirty:X()}:{}}),!r.keepIsValid&&z()},$e=({disabled:e,name:t})=>{if(w(e)&&v.mount||e||x.disabled.has(t)){let n=x.disabled.has(t)!==!!e;e?x.disabled.add(t):x.disabled.delete(t),n&&v.mount&&!v.action&&z()}},et=(e,n={})=>{let r=C(o,e),i=w(n.disabled)||w(t.disabled),a=!x.registerName.has(e)&&r&&r._f&&!r._f.mount;return E(o,e,{...r||{},_f:{...r&&r._f?r._f:{ref:{name:e}},name:e,mount:!0,...n}}),x.mount.add(e),r&&!a?$e({disabled:w(n.disabled)?n.disabled:t.disabled,name:e}):W(e,!0,n.value),{...i?{disabled:n.disabled||t.disabled}:{},...t.progressive?{required:!!n.required,min:J(n.min),max:J(n.max),minLength:J(n.minLength),maxLength:J(n.maxLength),pattern:J(n.pattern)}:{},name:e,onChange:Ue,onBlur:Ue,ref:i=>{if(i){x.registerName.add(e),et(e,n),x.registerName.delete(e),r=C(o,e);let t=b(i.value)&&i.querySelectorAll&&i.querySelectorAll(`input,select,textarea`)[0]||i,a=ue(t),s=r._f.refs||[];if(a?s.find(e=>e===t):t===r._f.ref)return;E(o,e,{_f:{...r._f,...a?{refs:[...s.filter(de),t,...Array.isArray(C(u,e))?[{}]:[]],ref:{type:t.type,name:e}}:{ref:t}}}),W(e,!1,void 0,t)}else r=C(o,e,{}),r._f&&(r._f.mount=!1),(t.shouldUnregister||n.shouldUnregister)&&!(l(x.array,e)&&v.action)&&x.unMount.add(e)}}},tt=()=>t.shouldFocusError&&!t.shouldUseNativeValidation&&Y(o,We,x.mount),nt=e=>{w(e)&&(R.state.next({disabled:e}),Y(o,(t,n)=>{let r=C(o,n);r&&(t.disabled=r._f.disabled||e,Array.isArray(r._f.refs)&&r._f.refs.forEach(t=>{t.disabled=r._f.disabled||e}))},0,!1))},rt=(e,r)=>async i=>{let a;i&&(i.preventDefault&&i.preventDefault(),i.persist&&i.persist());let s=f(_);if(R.state.next({isSubmitting:!0}),t.resolver){let{errors:e,values:t}=await K();V(),n.errors=e,s=f(t)}else await q({fields:o,eventType:p.SUBMIT});if(x.disabled.size)for(let e of x.disabled)H(s,e);if(H(n.errors,g),B(n.errors)){R.state.next({errors:{}});try{await e(s,i)}catch(e){a=e}}else r&&await r({...n.errors},i),tt(),setTimeout(tt);if(R.state.next({isSubmitted:!0,isSubmitting:!1,isSubmitSuccessful:B(n.errors)&&!a,submitCount:n.submitCount+1,errors:n.errors}),a)throw a},it=(e,t={})=>{C(o,e)&&(b(t.defaultValue)?Q(e,f(C(u,e))):(Q(e,t.defaultValue),E(u,e,f(t.defaultValue))),t.keepTouched||H(n.touchedFields,e),t.keepDirty||(H(n.dirtyFields,e),n.isDirty=t.defaultValue?X(e,f(C(u,e))):X()),t.keepError||(H(n.errors,e),F.isValid&&z()),R.state.next({...n}))},at=(e,r={})=>{let i=e?f(e):u,a=f(i),s=B(e),c=a;if(r.keepDefaultValues||(u=i),!r.keepValues){if(r.keepDirtyValues){let e=new Set([...x.mount,...Object.keys(G(u,_))]);for(let t of Array.from(e)){let e=C(n.dirtyFields,t),r=C(_,t),i=C(c,t);e&&!b(r)?E(c,t,r):!e&&!b(i)&&Q(t,i)}}else{if(d&&b(e))for(let e of x.mount){let t=C(o,e);if(t&&t._f){let e=Array.isArray(t._f.refs)?t._f.refs[0]:t._f.ref;if(ce(e)){let t=e.closest(`form`);if(t){t.reset();break}}}}if(r.keepFieldsRef)for(let e of x.mount)Q(e,C(c,e));else o={}}if(t.shouldUnregister){if(_=r.keepDefaultValues?f(u):{},r.keepFieldsRef)for(let e of x.mount)E(_,e,C(c,e))}else _=f(c);R.array.next({values:{...c}}),R.state.next({name:void 0,type:void 0,values:{...c}})}x={mount:r.keepDirtyValues?x.mount:new Set,unMount:new Set,array:new Set,registerName:new Set,disabled:new Set,watch:new Set,watchAll:!1,focus:``},v.mount=!F.isValid||!!r.keepIsValid||!!r.keepDirtyValues||!t.shouldUnregister&&!B(c),v.watch=!!t.shouldUnregister,v.keepIsValid=!!r.keepIsValid,v.action=!1,r.keepErrors||(n.errors={}),R.state.next({submitCount:r.keepSubmitCount?n.submitCount:0,isDirty:s?!1:r.keepDirty?n.isDirty:r.keepValues?X():!!(r.keepDefaultValues&&!I(e,u)),isSubmitted:r.keepIsSubmitted?n.isSubmitted:!1,dirtyFields:s?{}:r.keepDirtyValues?r.keepDefaultValues&&_?G(u,_):n.dirtyFields:r.keepDefaultValues&&e?G(u,e):r.keepDirty?n.dirtyFields:{},touchedFields:r.keepTouched?n.touchedFields:{},errors:r.keepErrors?n.errors:{},isSubmitSuccessful:r.keepIsSubmitSuccessful?n.isSubmitSuccessful:!1,isSubmitting:!1,defaultValues:u})},ot=(e,n)=>at(T(e)?e(_):e,{...t.resetOptions,...n}),st=(e,t={})=>{let n=C(o,e),r=n&&n._f;if(r){let e=r.refs?r.refs[0]:r.ref;e.focus&&setTimeout(()=>{e.focus(),t.shouldSelect&&T(e.select)&&e.select()})}},ct=e=>{let{name:t,type:r,values:i,...a}=e;n={...n,...a}},lt={control:{register:et,unregister:Qe,getFieldState:Ke,handleSubmit:rt,setError:Je,_subscribe:Xe,_runSchema:K,_updateIsValidating:V,_focusError:tt,_getWatch:Z,_getDirty:X,_setValid:z,_setFieldArray:pe,_setDisabledField:$e,_setErrors:he,_getFieldArray:Re,_reset:at,_resetDefaultValues:()=>T(t.defaultValues)&&t.defaultValues().then(e=>{ot(e,t.resetOptions),R.state.next({isLoading:!1})}),_removeUnmounted:we,_disableForm:nt,_subjects:R,_proxyFormState:F,get _fields(){return o},get _formValues(){return _},get _state(){return v},set _state(e){v=e},get _defaultValues(){return u},get _names(){return x},set _names(e){x=e},get _formState(){return n},get _options(){return t},set _options(e){t={...t,...e},A=Ce(t.mode),j=Ce(t.reValidateMode)}},subscribe:Ze,trigger:$,register:et,handleSubmit:rt,watch:Ye,setValue:Q,setValues:He,getValues:Ge,reset:ot,resetField:it,resetDefaultValues:(e,t={})=>{if(u=f(e),!t.keepDirty){let e=G(u,_);n.dirtyFields=e,n.isDirty=!B(e)}t.keepIsValid||z(),R.state.next({...n,defaultValues:u})},clearErrors:qe,unregister:Qe,setError:Je,setFocus:st,getFieldState:Ke};return{...lt,formControl:lt}}function ze(e={}){let t=n.useRef(void 0),r=n.useRef(void 0),i=n.useRef(e.formControl),[a,o]=n.useState(()=>({...f(Le),isLoading:T(e.defaultValues),errors:e.errors||{},disabled:e.disabled||!1,defaultValues:T(e.defaultValues)?void 0:e.defaultValues}));if(!t.current||e.formControl&&i.current!==e.formControl)if(i.current=e.formControl,e.formControl)t.current={...e.formControl,formState:a},e.defaultValues&&!T(e.defaultValues)&&e.formControl.reset(e.defaultValues,e.resetOptions);else{let{formControl:n,...r}=Re(e);t.current={...r,formState:a}}let s=t.current.control;return s._options=e,A(()=>{let e=s._subscribe({formState:s._proxyFormState,callback:()=>o({...s._formState,defaultValues:s._defaultValues}),reRenderRoot:!0});return o(e=>({...e,isReady:!0})),s._formState.isReady=!0,e},[s]),n.useEffect(()=>s._disableForm(e.disabled),[s,e.disabled]),n.useEffect(()=>{e.mode&&(s._options.mode=e.mode),e.reValidateMode&&(s._options.reValidateMode=e.reValidateMode)},[s,e.mode,e.reValidateMode]),n.useEffect(()=>{e.errors&&(s._setErrors(e.errors),s._focusError())},[s,e.errors]),n.useEffect(()=>{e.shouldUnregister&&s._subjects.state.next({values:s._getWatch()})},[s,e.shouldUnregister]),n.useEffect(()=>{if(s._proxyFormState.isDirty){let e=s._getDirty();e!==a.isDirty&&s._subjects.state.next({isDirty:e})}},[s,a.isDirty]),n.useEffect(()=>{e.values&&!I(e.values,r.current)?(s._reset(e.values,{keepFieldsRef:!0,...s._options.resetOptions}),s._options.resetOptions?.keepIsValid||s._setValid(),r.current=e.values,o(e=>({...e}))):s._resetDefaultValues()},[s,e.values]),n.useEffect(()=>{s._state.mount||(s._setValid(),s._state.mount=!0),s._state.watch&&(s._state.watch=!1,s._subjects.state.next({...s._formState})),s._removeUnmounted()}),t.current.formState=n.useMemo(()=>k(a,s),[s,a]),t.current}var Be=(e,t,n)=>{if(e&&`reportValidity`in e){let r=C(n,t);e.setCustomValidity(r&&r.message||``),e.reportValidity()}},Ve=(e,t)=>{for(let n in t.fields){let r=t.fields[n];r&&r.ref&&`reportValidity`in r.ref?Be(r.ref,n,e):r&&r.refs&&r.refs.forEach(t=>Be(t,n,e))}},Q=(e,t)=>{t.shouldUseNativeValidation&&Ve(e,t);let n={};for(let r in e){let i=C(t.fields,r),a=Object.assign(e[r]||{},{ref:i&&i.ref});if(He(t.names||Object.keys(e),r)){let e=Object.assign({},C(n,r));E(e,`root`,a),E(n,r,e)}else E(n,r,a)}return n},He=(e,t)=>{let n=Ue(t).replace(/[.*+?^${}()|\\]/g,`\\$&`);return e.some(e=>Ue(e).match(`^${n}\\.\\d+`))};function Ue(e){return e.replace(/[\[\]]/g,``)}function We(e){if(e.path?.length){let t=``;for(let n of e.path){let e=typeof n==`object`?n.key:n;if(typeof e==`string`||typeof e==`number`)t?t+=`.${e}`:t+=e;else return null}return t}return null}function $(){return $=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},$.apply(null,arguments)}function Ge(e,t,n){return n===void 0&&(n={}),function(t,r,i){try{var a=function(){return o.issues?{values:{},errors:Q(function(e,t){for(var n={},r=0;r<e.length;r++){var i=e[r],a=We(i);if(a&&(n[a]||(n[a]={message:i.message,type:``}),t)){var o,s=n[a].types||{};n[a].types=$({},s,((o={})[Object.keys(s).length]=i.message,o))}}return n}(o.issues,!i.shouldUseNativeValidation&&i.criteriaMode===`all`),i)}:(i.shouldUseNativeValidation&&Ve({},i),{values:n.raw?Object.assign({},t):o.value,errors:{}})},o=e[`~standard`].validate(t),s=function(){if(o instanceof Promise)return Promise.resolve(o).then(function(e){o=e})}();return Promise.resolve(s&&s.then?s.then(a):a())}catch(e){return Promise.reject(e)}}}export{L as i,ee as n,ze as r,Ge as t};
2
- //# sourceMappingURL=standard-schema-e8gtSzGE.js.map
@@ -1,2 +0,0 @@
1
- import{q as e}from"./createLucideIcon-BPpAIXR_.js";import{I as t}from"./index-CKpnrw9M.js";var n=e();function r(e){return(0,n.jsx)(t,{...e,onUnauthorized:()=>{window.location.href=`/login`}})}export{r as errorComponent};
2
- //# sourceMappingURL=terms-BHPL9Px_.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terms-BHPL9Px_.js","names":["RouteErrorFallback","TermsError","props","ErrorComponentProps","window","location","href","errorComponent"],"sources":["../../../frontend/src/routes/terms/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport {\n createFileRoute,\n type ErrorComponentProps,\n redirect,\n useRouter,\n} from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TriangleAlertIcon } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport {\n TermsCheckboxList,\n type TermsConsentsField,\n} from '#frontend/components/terms/terms-checkbox-list.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { OAuthSearchSchema } from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n getTermsQueryOptions,\n type TermsConsentItem,\n termsConsentMutationOptions,\n} from '#frontend/queries/terms.ts';\n\nconst TermsSearchSchema = OAuthSearchSchema.extend({\n redirect: z.string().optional(),\n lang: z.string().optional(),\n mode: z.enum(['normal', 'complete_registration']).optional(),\n registration_token: z.string().optional(),\n});\n\nfunction TermsError(props: ErrorComponentProps) {\n return (\n <RouteErrorFallback\n {...props}\n onUnauthorized={() => {\n window.location.href = '/login';\n }}\n />\n );\n}\n\nexport const Route = createFileRoute('/terms/')({\n component: Terms,\n errorComponent: TermsError,\n validateSearch: TermsSearchSchema,\n beforeLoad: async ({ context, search }) => {\n // When mode=complete_registration, user is completing OAuth signup.\n // The registration_token in the URL references a DB record with OAuth data.\n // Skip auth check — backend will validate the token on consent submission.\n if (search.mode === 'complete_registration') {\n return;\n }\n\n // Standard mode: requires authentication\n // Users are redirected here after OAuth login when they need to agree to terms\n if (!context.user) {\n throw redirect({\n to: '/login',\n });\n }\n },\n loaderDeps: ({ search }) => ({\n lang: search.lang,\n }),\n loader: async ({ context, deps }) => {\n const lang = deps.lang ?? context.i18n.language;\n await Promise.all([\n context.queryClient.ensureQueryData(getTermsQueryOptions(lang)),\n context.queryClient.ensureQueryData(appConfigQueryOptions),\n ]);\n },\n});\n\nfunction Terms() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n const lang = search.lang ?? i18n.language;\n const termsQuery = useSuspenseQuery(getTermsQueryOptions(lang));\n const implicitNotice =\n configData.registration.signup_notice?.[lang] ??\n configData.registration.signup_notice?.[configData.i18n.fallback_language];\n\n // Separate explicit and implicit terms\n const explicitTerms = useMemo(\n () =>\n termsQuery.data.terms.filter((term) => term.consentMode === 'explicit'),\n [termsQuery.data.terms],\n );\n\n const implicitTerms = useMemo(\n () =>\n termsQuery.data.terms.filter((term) => term.consentMode === 'implicit'),\n [termsQuery.data.terms],\n );\n\n const hasExplicitTerms = explicitTerms.length > 0;\n\n // Schema only validates explicit terms (implicit are auto-agreed)\n const termsSchema = useMemo(\n () =>\n z.object({\n termsConsents: z.object(\n Object.fromEntries(\n explicitTerms.map((term) => [\n term.id,\n term.required\n ? z.literal(true, {\n message: t('validation.terms.required'),\n })\n : z.boolean(),\n ]),\n ),\n ),\n }),\n [t, explicitTerms],\n );\n\n type TermsFormValues = TermsConsentsField;\n\n const {\n handleSubmit,\n control,\n setValue,\n formState: { errors },\n } = useForm<TermsFormValues>({\n defaultValues: {\n termsConsents: Object.fromEntries(\n explicitTerms.map((term) => [\n term.id,\n !!(term.userConsent?.agreed && !term.userConsent.requiresUpdate),\n ]),\n ),\n },\n resolver: standardSchemaResolver(termsSchema),\n mode: 'onChange',\n });\n\n const consentMutation = useMutation({\n ...termsConsentMutationOptions,\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n await queryClient.fetchQuery(getSessionQueryOptions);\n await tick();\n\n // Redirect after successful consent\n if (search.redirect) {\n window.location.href = search.redirect;\n } else {\n router.navigate({ to: '/profile' });\n }\n },\n });\n\n const onSubmit = (values: TermsFormValues) => {\n const explicitConsents = Object.entries(\n values.termsConsents,\n ).map<TermsConsentItem>(([termsId, agreed]) => ({\n termsId,\n agreed,\n consentType: 'explicit',\n }));\n\n const implicitConsents = implicitTerms.map<TermsConsentItem>((term) => ({\n termsId: term.id,\n agreed: true,\n consentType: 'implicit',\n }));\n\n consentMutation.mutate({\n consents: [...explicitConsents, ...implicitConsents],\n ...(search.registration_token && {\n registrationToken: search.registration_token,\n }),\n });\n };\n\n return (\n <AuthLayout width=\"wide\">\n <AuthPageHeader title={t('terms.title')} />\n\n {implicitNotice && (\n <div\n className=\"prose prose-sm text-center text-tinyrack-text-muted text-tinyrack-xs! **:text-tinyrack-xs!\"\n dangerouslySetInnerHTML={{ __html: implicitNotice }}\n />\n )}\n\n {implicitNotice && hasExplicitTerms && (\n <LabeledSeparator label={t('terms.additionalOptionalConsent')} />\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Explicit terms with checkboxes */}\n {hasExplicitTerms && (\n <TermsCheckboxList\n control={control}\n disabled={consentMutation.isPending}\n errors={errors}\n setValue={setValue}\n terms={explicitTerms}\n />\n )}\n\n {/* Error message */}\n {consentMutation.isError && (\n <Alert icon={TriangleAlertIcon} type=\"error\">\n {t('terms.error.submitFailed')}\n </Alert>\n )}\n\n {/*\n Sticky, like consent: a long list of terms would otherwise push the\n only action off the bottom of the screen.\n */}\n <div className=\"sticky bottom-0 flex gap-tinyrack-sm border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface/80 py-tinyrack-md backdrop-blur-sm\">\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={consentMutation.isPending}\n loadingLabel={t('terms.submit')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('terms.submit')}\n </TRButton>\n </div>\n </form>\n </AuthLayout>\n );\n}\n"],"mappings":"qGA4CA,SAASC,EAAWC,EAA4B,CAC9C,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,GAAIA,EACJ,mBAAsB,CACpBE,OAAOC,SAASC,KAAO,QACzB,CAAE,CAAA,CAGR"}
@@ -1,2 +0,0 @@
1
- import{J as e,Z as t,i as n,q as r,s as i}from"./createLucideIcon-BPpAIXR_.js";import{On as a,Sr as o,t as s}from"./config-DTQCUlfZ.js";import{t as c}from"./useMutation-BWZ0G4Td.js";import{nt as l}from"./shell-header-bar-JcFhS7mb.js";import{t as u}from"./triangle-alert-CqNn0kPs.js";import{a as d,o as f,r as p}from"./zod-C87S6Tec.js";import{A as m,O as h,S as g,k as _}from"./index-CKpnrw9M.js";import{t as v}from"./auth-page-header-DgGAaIiP.js";import{t as y}from"./alert-leqyvHOp.js";import{t as b}from"./auth-layout-CiNn2-Nb.js";import{t as x}from"./promise-OpBtq8tG.js";import{r as S,t as C}from"./standard-schema-e8gtSzGE.js";import{t as w}from"./terms-checkbox-list-DNOq4Pb2.js";import{t as T}from"./labeled-separator-CV7nb0XW.js";var E=t(e()),D=r();function O(){let{t:e,i18n:t}=n(),r=a(),O=o(),k=h.useSearch(),{data:A}=l(s),j=k.lang??t.language,M=l(_(j)),N=A.registration.signup_notice?.[j]??A.registration.signup_notice?.[A.i18n.fallback_language],P=(0,E.useMemo)(()=>M.data.terms.filter(e=>e.consentMode===`explicit`),[M.data.terms]),F=(0,E.useMemo)(()=>M.data.terms.filter(e=>e.consentMode===`implicit`),[M.data.terms]),I=P.length>0,L=(0,E.useMemo)(()=>f({termsConsents:f(Object.fromEntries(P.map(t=>[t.id,t.required?d(!0,{message:e(`validation.terms.required`)}):p()])))}),[e,P]),{handleSubmit:R,control:z,setValue:B,formState:{errors:V}}=S({defaultValues:{termsConsents:Object.fromEntries(P.map(e=>[e.id,!!(e.userConsent?.agreed&&!e.userConsent.requiresUpdate)]))},resolver:C(L),mode:`onChange`}),H=c({...m,onSuccess:async()=>{await O.invalidateQueries({queryKey:g.queryKey}),await O.fetchQuery(g),await x(),k.redirect?window.location.href=k.redirect:r.navigate({to:`/profile`})}});return(0,D.jsxs)(b,{width:`wide`,children:[(0,D.jsx)(v,{title:e(`terms.title`)}),N&&(0,D.jsx)(`div`,{className:`prose prose-sm text-center text-tinyrack-text-muted text-tinyrack-xs! **:text-tinyrack-xs!`,dangerouslySetInnerHTML:{__html:N}}),N&&I&&(0,D.jsx)(T,{label:e(`terms.additionalOptionalConsent`)}),(0,D.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:R(e=>{let t=Object.entries(e.termsConsents).map(([e,t])=>({termsId:e,agreed:t,consentType:`explicit`})),n=F.map(e=>({termsId:e.id,agreed:!0,consentType:`implicit`}));H.mutate({consents:[...t,...n],...k.registration_token&&{registrationToken:k.registration_token}})}),children:[I&&(0,D.jsx)(w,{control:z,disabled:H.isPending,errors:V,setValue:B,terms:P}),H.isError&&(0,D.jsx)(y,{icon:u,type:`error`,children:e(`terms.error.submitFailed`)}),(0,D.jsx)(`div`,{className:`sticky bottom-0 flex gap-tinyrack-sm border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface/80 py-tinyrack-md backdrop-blur-sm`,children:(0,D.jsx)(i,{className:`w-full`,intent:`primary`,loading:H.isPending,loadingLabel:e(`terms.submit`),type:`submit`,uiSize:`lg`,children:e(`terms.submit`)})})]})]})}export{O as component};
2
- //# sourceMappingURL=terms-BjwMWDFp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terms-BjwMWDFp.js","names":["standardSchemaResolver","useMutation","useQueryClient","useSuspenseQuery","useRouter","TRButton","TriangleAlertIcon","useMemo","useForm","useTranslation","z","AuthPageHeader","TermsCheckboxList","Alert","LabeledSeparator","AuthLayout","tick","appConfigQueryOptions","getSessionQueryOptions","getTermsQueryOptions","termsConsentMutationOptions","Route","Terms","t","i18n","router","queryClient","search","useSearch","data","configData","lang","language","termsQuery","implicitNotice","registration","signup_notice","fallback_language","explicitTerms","terms","filter","term","consentMode","implicitTerms","hasExplicitTerms","length","termsSchema","object","termsConsents","Object","fromEntries","map","id","required","literal","message","boolean","TermsFormValues","TermsConsentsField","handleSubmit","control","setValue","formState","errors","defaultValues","userConsent","agreed","requiresUpdate","resolver","mode","consentMutation","onSuccess","invalidateQueries","queryKey","fetchQuery","redirect","window","location","href","navigate","to","onSubmit","values","explicitConsents","entries","TermsConsentItem","termsId","consentType","implicitConsents","mutate","consents","registration_token","registrationToken","__html","isPending","isError","component"],"sources":["../../../frontend/src/routes/terms/index.tsx?tsr-split=component"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport {\n createFileRoute,\n type ErrorComponentProps,\n redirect,\n useRouter,\n} from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TriangleAlertIcon } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport {\n TermsCheckboxList,\n type TermsConsentsField,\n} from '#frontend/components/terms/terms-checkbox-list.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { OAuthSearchSchema } from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n getTermsQueryOptions,\n type TermsConsentItem,\n termsConsentMutationOptions,\n} from '#frontend/queries/terms.ts';\n\nconst TermsSearchSchema = OAuthSearchSchema.extend({\n redirect: z.string().optional(),\n lang: z.string().optional(),\n mode: z.enum(['normal', 'complete_registration']).optional(),\n registration_token: z.string().optional(),\n});\n\nfunction TermsError(props: ErrorComponentProps) {\n return (\n <RouteErrorFallback\n {...props}\n onUnauthorized={() => {\n window.location.href = '/login';\n }}\n />\n );\n}\n\nexport const Route = createFileRoute('/terms/')({\n component: Terms,\n errorComponent: TermsError,\n validateSearch: TermsSearchSchema,\n beforeLoad: async ({ context, search }) => {\n // When mode=complete_registration, user is completing OAuth signup.\n // The registration_token in the URL references a DB record with OAuth data.\n // Skip auth check — backend will validate the token on consent submission.\n if (search.mode === 'complete_registration') {\n return;\n }\n\n // Standard mode: requires authentication\n // Users are redirected here after OAuth login when they need to agree to terms\n if (!context.user) {\n throw redirect({\n to: '/login',\n });\n }\n },\n loaderDeps: ({ search }) => ({\n lang: search.lang,\n }),\n loader: async ({ context, deps }) => {\n const lang = deps.lang ?? context.i18n.language;\n await Promise.all([\n context.queryClient.ensureQueryData(getTermsQueryOptions(lang)),\n context.queryClient.ensureQueryData(appConfigQueryOptions),\n ]);\n },\n});\n\nfunction Terms() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n const lang = search.lang ?? i18n.language;\n const termsQuery = useSuspenseQuery(getTermsQueryOptions(lang));\n const implicitNotice =\n configData.registration.signup_notice?.[lang] ??\n configData.registration.signup_notice?.[configData.i18n.fallback_language];\n\n // Separate explicit and implicit terms\n const explicitTerms = useMemo(\n () =>\n termsQuery.data.terms.filter((term) => term.consentMode === 'explicit'),\n [termsQuery.data.terms],\n );\n\n const implicitTerms = useMemo(\n () =>\n termsQuery.data.terms.filter((term) => term.consentMode === 'implicit'),\n [termsQuery.data.terms],\n );\n\n const hasExplicitTerms = explicitTerms.length > 0;\n\n // Schema only validates explicit terms (implicit are auto-agreed)\n const termsSchema = useMemo(\n () =>\n z.object({\n termsConsents: z.object(\n Object.fromEntries(\n explicitTerms.map((term) => [\n term.id,\n term.required\n ? z.literal(true, {\n message: t('validation.terms.required'),\n })\n : z.boolean(),\n ]),\n ),\n ),\n }),\n [t, explicitTerms],\n );\n\n type TermsFormValues = TermsConsentsField;\n\n const {\n handleSubmit,\n control,\n setValue,\n formState: { errors },\n } = useForm<TermsFormValues>({\n defaultValues: {\n termsConsents: Object.fromEntries(\n explicitTerms.map((term) => [\n term.id,\n !!(term.userConsent?.agreed && !term.userConsent.requiresUpdate),\n ]),\n ),\n },\n resolver: standardSchemaResolver(termsSchema),\n mode: 'onChange',\n });\n\n const consentMutation = useMutation({\n ...termsConsentMutationOptions,\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n await queryClient.fetchQuery(getSessionQueryOptions);\n await tick();\n\n // Redirect after successful consent\n if (search.redirect) {\n window.location.href = search.redirect;\n } else {\n router.navigate({ to: '/profile' });\n }\n },\n });\n\n const onSubmit = (values: TermsFormValues) => {\n const explicitConsents = Object.entries(\n values.termsConsents,\n ).map<TermsConsentItem>(([termsId, agreed]) => ({\n termsId,\n agreed,\n consentType: 'explicit',\n }));\n\n const implicitConsents = implicitTerms.map<TermsConsentItem>((term) => ({\n termsId: term.id,\n agreed: true,\n consentType: 'implicit',\n }));\n\n consentMutation.mutate({\n consents: [...explicitConsents, ...implicitConsents],\n ...(search.registration_token && {\n registrationToken: search.registration_token,\n }),\n });\n };\n\n return (\n <AuthLayout width=\"wide\">\n <AuthPageHeader title={t('terms.title')} />\n\n {implicitNotice && (\n <div\n className=\"prose prose-sm text-center text-tinyrack-text-muted text-tinyrack-xs! **:text-tinyrack-xs!\"\n dangerouslySetInnerHTML={{ __html: implicitNotice }}\n />\n )}\n\n {implicitNotice && hasExplicitTerms && (\n <LabeledSeparator label={t('terms.additionalOptionalConsent')} />\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n {/* Explicit terms with checkboxes */}\n {hasExplicitTerms && (\n <TermsCheckboxList\n control={control}\n disabled={consentMutation.isPending}\n errors={errors}\n setValue={setValue}\n terms={explicitTerms}\n />\n )}\n\n {/* Error message */}\n {consentMutation.isError && (\n <Alert icon={TriangleAlertIcon} type=\"error\">\n {t('terms.error.submitFailed')}\n </Alert>\n )}\n\n {/*\n Sticky, like consent: a long list of terms would otherwise push the\n only action off the bottom of the screen.\n */}\n <div className=\"sticky bottom-0 flex gap-tinyrack-sm border-tinyrack-border border-t-tinyrack-default bg-tinyrack-surface/80 py-tinyrack-md backdrop-blur-sm\">\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={consentMutation.isPending}\n loadingLabel={t('terms.submit')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('terms.submit')}\n </TRButton>\n </div>\n </form>\n </AuthLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{J as e,Z as t,i as n,q as r,s as i}from"./createLucideIcon-BPpAIXR_.js";import{t as a}from"./badge-CsOfUji0.js";import{t as o}from"./checkbox-C90dDDza.js";import{t as s}from"./modal-tByFpy18.js";import{t as c}from"./link-C-WdTj3F.js";import{i as l,n as u}from"./standard-schema-e8gtSzGE.js";var d=t(e(),1),f=r();function p({isOpen:e,onClose:t,title:n,content:r}){return(0,f.jsx)(s,{isOpen:e,onClose:t,size:`lg`,title:n,children:(0,f.jsx)(`div`,{className:`prose prose-sm mt-tinyrack-md max-h-dvh overflow-y-auto`,dangerouslySetInnerHTML:{__html:r}})})}function m({terms:e,control:t,setValue:r,errors:s,disabled:m=!1}){let{t:g}=n(),[_,v]=(0,d.useState)(null),y=l({control:t,name:`termsConsents`}),b=t=>{for(let n of e)r(`termsConsents.${n.id}`,t,{shouldValidate:!0})},x=e.every(e=>y?.[e.id]),S=e.some(e=>!e.required),C=s?.termsConsents,w=e=>e.title===e.id?h(e.id):e.title;return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(`div`,{className:`space-y-tinyrack-xs`,children:[e.length>1&&(0,f.jsxs)(`div`,{className:`flex cursor-pointer items-center gap-tinyrack-sm py-[calc(var(--tinyrack-space-3xs)*2)]`,children:[(0,f.jsx)(o.Root,{"aria-labelledby":`terms-all-label`,checked:x,"data-testid":`terms-checkbox`,disabled:m,onCheckedChange:b,uiSize:`lg`,children:(0,f.jsx)(o.Indicator,{})}),(0,f.jsx)(`span`,{className:`font-tinyrack-medium text-tinyrack-xs`,id:`terms-all-label`,children:g(`terms.agreeAll`)}),S&&(0,f.jsx)(`span`,{className:`text-tinyrack-text-muted text-tinyrack-xs`,children:g(`terms.agreeAllOptionalIncluded`)})]}),e.map(e=>(0,f.jsx)(u,{control:t,name:`termsConsents.${e.id}`,render:({field:t})=>(0,f.jsxs)(`div`,{children:[(0,f.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm py-[calc(var(--tinyrack-space-3xs)*2)]`,children:[(0,f.jsxs)(`div`,{className:`flex min-w-0 flex-1 items-center gap-tinyrack-sm`,children:[(0,f.jsx)(o.Root,{"aria-labelledby":`term-label-${e.id}`,checked:t.value===!0,"data-testid":`terms-checkbox`,disabled:m,onCheckedChange:e=>t.onChange(e===!0),uiSize:`lg`,children:(0,f.jsx)(o.Indicator,{})}),(0,f.jsx)(`span`,{className:`truncate text-tinyrack-xs`,id:`term-label-${e.id}`,children:w(e)}),(0,f.jsx)(a,{"data-testid":e.required?`terms-badge-required`:`terms-badge-optional`,uiSize:`md`,variant:e.required?`danger`:`neutral`,children:e.required?g(`terms.required`):g(`terms.optional`)})]}),e.type===`link`&&e.content&&(0,f.jsx)(c,{"aria-label":g(`terms.viewSpecific`,{title:w(e)}),className:`shrink-0 text-tinyrack-xs`,href:e.content,rel:`noopener noreferrer`,target:`_blank`,children:g(`terms.view`)}),e.type===`text`&&e.content&&(0,f.jsx)(i,{appearance:`ghost`,"aria-label":g(`terms.viewSpecific`,{title:w(e)}),className:`shrink-0 text-tinyrack-xs`,onClick:()=>v(e),type:`button`,uiSize:`sm`,children:g(`terms.view`)})]}),e.userConsent?.requiresUpdate&&(0,f.jsx)(`p`,{className:`ml-tinyrack-xl text-tinyrack-warning-foreground text-tinyrack-xs`,children:g(`terms.versionUpdated`)}),C?.[e.id]&&(0,f.jsx)(`p`,{className:`ml-tinyrack-xl text-tinyrack-danger-foreground text-tinyrack-xs`,"data-testid":`terms-field-error`,children:C[e.id]?.message})]})},e.id))]}),(0,f.jsx)(p,{content:_?.content??``,isOpen:_!==null,onClose:()=>v(null),title:_?.title??``})]})}function h(e){return e.replaceAll(`-`,` `).replaceAll(`_`,` `).replace(/([a-zA-Z])(\d)/g,`$1 $2`).split(` `).filter(e=>e.length>0).map(e=>`${e.charAt(0).toUpperCase()}${e.slice(1)}`).join(` `)}export{m as t};
2
- //# sourceMappingURL=terms-checkbox-list-DNOq4Pb2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terms-checkbox-list-DNOq4Pb2.js","names":[],"sources":["../../../frontend/src/components/terms/terms-content-modal.tsx","../../../frontend/src/components/terms/terms-checkbox-list.tsx"],"sourcesContent":["import { Modal } from '#frontend/components/ui/modal.tsx';\n\ntype TermsContentModalProps = {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n content: string;\n};\n\nexport function TermsContentModal({\n isOpen,\n onClose,\n title,\n content,\n}: TermsContentModalProps) {\n return (\n <Modal isOpen={isOpen} onClose={onClose} size=\"lg\" title={title}>\n <div\n className=\"prose prose-sm mt-tinyrack-md max-h-dvh overflow-y-auto\"\n dangerouslySetInnerHTML={{ __html: content }}\n />\n </Modal>\n );\n}\n","import { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRLink } from '@tinyrack/ui/components/link';\nimport { useState } from 'react';\nimport {\n type Control,\n Controller,\n type FieldErrors,\n type FieldValues,\n type Path,\n type PathValue,\n type UseFormSetValue,\n useWatch,\n} from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\n\nimport type { TermItem } from '#frontend/queries/terms.ts';\nimport { TermsContentModal } from './terms-content-modal.tsx';\n\nexport type TermsConsentsField = {\n termsConsents: Record<string, boolean>;\n};\n\ntype TermsCheckboxListProps<T extends FieldValues & TermsConsentsField> = {\n terms: TermItem[];\n control: Control<T>;\n setValue: UseFormSetValue<T>;\n errors?: FieldErrors<T>;\n disabled?: boolean;\n};\n\nexport function TermsCheckboxList<T extends FieldValues & TermsConsentsField>({\n terms,\n control,\n setValue,\n errors,\n disabled = false,\n}: TermsCheckboxListProps<T>) {\n const { t } = useTranslation();\n const [modalTerm, setModalTerm] = useState<TermItem | null>(null);\n\n const termsConsents = useWatch({\n control,\n name: 'termsConsents' as Path<T>,\n }) as Record<string, boolean> | undefined;\n\n const handleAllChange = (checked: boolean) => {\n for (const term of terms) {\n setValue(\n `termsConsents.${term.id}` as Path<T>,\n checked as PathValue<T, Path<T>>,\n { shouldValidate: true },\n );\n }\n };\n\n const allChecked = terms.every((term) => termsConsents?.[term.id]);\n\n const hasOptionalTerms = terms.some((term) => !term.required);\n\n const termsConsentsErrors = errors?.termsConsents as\n | Record<string, { message?: string }>\n | undefined;\n\n const getTermTitle = (term: TermItem) => {\n if (term.title !== term.id) {\n return term.title;\n }\n\n return humanizeTermId(term.id);\n };\n\n return (\n <>\n <div className=\"space-y-tinyrack-xs\">\n {terms.length > 1 && (\n <div className=\"flex cursor-pointer items-center gap-tinyrack-sm py-[calc(var(--tinyrack-space-3xs)*2)]\">\n <TRCheckbox.Root\n aria-labelledby=\"terms-all-label\"\n checked={allChecked}\n data-testid=\"terms-checkbox\"\n disabled={disabled}\n onCheckedChange={handleAllChange}\n uiSize=\"lg\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <span\n className=\"font-tinyrack-medium text-tinyrack-xs\"\n id=\"terms-all-label\"\n >\n {t('terms.agreeAll')}\n </span>\n {hasOptionalTerms && (\n <span className=\"text-tinyrack-text-muted text-tinyrack-xs\">\n {t('terms.agreeAllOptionalIncluded')}\n </span>\n )}\n </div>\n )}\n\n {terms.map((term) => (\n <Controller\n control={control}\n key={term.id}\n name={`termsConsents.${term.id}` as Path<T>}\n render={({ field }) => (\n <div>\n <div className=\"flex items-center gap-tinyrack-sm py-[calc(var(--tinyrack-space-3xs)*2)]\">\n <div className=\"flex min-w-0 flex-1 items-center gap-tinyrack-sm\">\n <TRCheckbox.Root\n aria-labelledby={`term-label-${term.id}`}\n checked={field.value === true}\n data-testid=\"terms-checkbox\"\n disabled={disabled}\n onCheckedChange={(checked) =>\n field.onChange(checked === true)\n }\n uiSize=\"lg\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <span\n className=\"truncate text-tinyrack-xs\"\n id={`term-label-${term.id}`}\n >\n {getTermTitle(term)}\n </span>\n <TRBadge\n data-testid={\n term.required\n ? 'terms-badge-required'\n : 'terms-badge-optional'\n }\n uiSize=\"md\"\n variant={term.required ? 'danger' : 'neutral'}\n >\n {term.required\n ? t('terms.required')\n : t('terms.optional')}\n </TRBadge>\n </div>\n {term.type === 'link' && term.content && (\n <TRLink\n aria-label={t('terms.viewSpecific', {\n title: getTermTitle(term),\n })}\n className=\"shrink-0 text-tinyrack-xs\"\n href={term.content}\n rel=\"noopener noreferrer\"\n target=\"_blank\"\n >\n {t('terms.view')}\n </TRLink>\n )}\n {term.type === 'text' && term.content && (\n <TRButton\n appearance=\"ghost\"\n aria-label={t('terms.viewSpecific', {\n title: getTermTitle(term),\n })}\n className=\"shrink-0 text-tinyrack-xs\"\n onClick={() => setModalTerm(term)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('terms.view')}\n </TRButton>\n )}\n </div>\n {term.userConsent?.requiresUpdate && (\n <p className=\"ml-tinyrack-xl text-tinyrack-warning-foreground text-tinyrack-xs\">\n {t('terms.versionUpdated')}\n </p>\n )}\n {termsConsentsErrors?.[term.id] && (\n <p\n className=\"ml-tinyrack-xl text-tinyrack-danger-foreground text-tinyrack-xs\"\n data-testid=\"terms-field-error\"\n >\n {termsConsentsErrors[term.id]?.message}\n </p>\n )}\n </div>\n )}\n />\n ))}\n </div>\n\n <TermsContentModal\n content={modalTerm?.content ?? ''}\n isOpen={modalTerm !== null}\n onClose={() => setModalTerm(null)}\n title={modalTerm?.title ?? ''}\n />\n </>\n );\n}\n\nfunction humanizeTermId(id: string): string {\n const words = id\n .replaceAll('-', ' ')\n .replaceAll('_', ' ')\n .replace(/([a-zA-Z])(\\d)/g, '$1 $2')\n .split(' ')\n .filter((word) => word.length > 0);\n\n return words\n .map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`)\n .join(' ');\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{J as e,Z as t,i as n,q as r,r as i,s as a}from"./createLucideIcon-BPpAIXR_.js";import{On as o,Sn as s,Sr as c}from"./config-DTQCUlfZ.js";import{t as l}from"./useMutation-BWZ0G4Td.js";import{c as u,o as d}from"./zod-C87S6Tec.js";import{F as f,N as p,R as m,S as h,h as g,j as _}from"./index-CKpnrw9M.js";import{t as v}from"./auth-page-header-DgGAaIiP.js";import{t as y}from"./alert-leqyvHOp.js";import{t as b}from"./auth-layout-CiNn2-Nb.js";import{t as x}from"./promise-OpBtq8tG.js";import{n as S,t as C}from"./auth-footer-Cz5ivsDc.js";import{r as w,t as T}from"./standard-schema-e8gtSzGE.js";import{o as E}from"./totp-BNZ904Zm.js";import{t as D}from"./pin-input-CITrr-Yc.js";import{t as O}from"./labeled-separator-CV7nb0XW.js";var k=t(e()),A=r(),j={SECOND_FACTOR_SESSION_EXPIRED:`SECOND_FACTOR_SESSION_EXPIRED`,INVALID_TOTP_CODE:`INVALID_TOTP_CODE`,TOTP_NOT_ENABLED:`TOTP_NOT_ENABLED`},M=5;function N(){let{t:e}=n(),t=o(),r=c(),N=g.useSearch(),P=(0,k.useRef)(null),[F,I]=(0,k.useState)(!1),[L,R]=(0,k.useState)(M),z=(0,k.useMemo)(()=>d({code:u().length(6,e(`validation.totp.length`)).regex(/^\d{6}$/,e(`validation.totp.digits`))}),[e]),B=l({...E,onSuccess:async e=>{r.setQueryData(h.queryKey,{user:e.user}),await x(),f(N)?window.location.href=_(N):t.navigate({to:`/profile`})},onSettled:()=>{r.invalidateQueries({queryKey:h.queryKey})}}),{setValue:V,setError:H,handleSubmit:U,watch:W,formState:{errors:G}}=w({defaultValues:{code:``},resolver:T(z)}),K=W(`code`),q=(0,k.useCallback)(()=>{t.navigate({to:`/login`,search:p(N)})},[t,N]);(0,k.useEffect)(()=>{if(!F)return;let e=setInterval(()=>{R(t=>t<=1?(clearInterval(e),q(),0):t-1)},1e3);return()=>clearInterval(e)},[F,q]);let J=async t=>{try{await B.mutateAsync(t)}catch(t){if(t instanceof i)switch(t.code){case j.SECOND_FACTOR_SESSION_EXPIRED:I(!0),R(M);return;case j.TOTP_NOT_ENABLED:q();return;case j.INVALID_TOTP_CODE:H(`code`,{type:`manual`,message:e(`verifyTotp.error.invalid`)}),V(`code`,``),P.current?.focus();return}H(`code`,{type:`manual`,message:e(`verifyTotp.error.invalid`)}),V(`code`,``),P.current?.focus()}};return(0,A.jsxs)(b,{children:[(0,A.jsx)(v,{subtitle:e(`verifyTotp.subtitle`),title:e(`verifyTotp.title`)}),F&&(0,A.jsx)(y,{"data-testid":`totp-verify-session-expired`,icon:m,type:`warning`,children:(0,A.jsxs)(`span`,{className:`flex flex-col items-start gap-tinyrack-3xs`,children:[(0,A.jsx)(`span`,{children:e(`verifyTotp.error.expired`)}),(0,A.jsx)(`span`,{className:`text-tinyrack-sm opacity-tinyrack-hover`,children:e(`verifyTotp.redirecting`,{seconds:L})}),(0,A.jsx)(a,{appearance:`ghost`,intent:`neutral`,onClick:q,type:`button`,uiSize:`sm`,children:e(`verifyTotp.redirectNow`)})]})}),(0,A.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:U(J),children:[(0,A.jsx)(D,{autoFocus:!0,disabled:F,error:G.code,length:6,onChange:e=>V(`code`,e),onComplete:()=>U(J)(),ref:P,value:K}),F?(0,A.jsx)(a,{className:`w-full`,disabled:!0,intent:`primary`,type:`button`,uiSize:`lg`,children:e(`verifyTotp.submit`)}):(0,A.jsx)(a,{className:`w-full`,intent:`primary`,loading:B.isPending,loadingLabel:e(`verifyTotp.submitting`),type:`submit`,uiSize:`lg`,children:e(`verifyTotp.submit`)})]}),(0,A.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-md`,children:[(0,A.jsx)(O,{label:e(`common.or`)}),(0,A.jsx)(a,{appearance:`ghost`,className:`w-full`,"data-testid":`totp-verify-recovery-link`,intent:`neutral`,onClick:()=>t.navigate({to:`/verify/totp/recovery`,search:p(N)}),type:`button`,uiSize:`lg`,children:e(`verifyTotp.useRecoveryCode`)})]}),(0,A.jsx)(C,{children:(0,A.jsx)(S,{link:(0,A.jsx)(s,{search:p(N),to:`/login`,children:e(`verifyTotp.backToLogin`)})})})]})}export{N as component};
2
- //# sourceMappingURL=totp-D_EWG1h8.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"totp-D_EWG1h8.js","names":["standardSchemaResolver","useMutation","useQueryClient","Link","useRouter","TRButton","CircleAlertIcon","useCallback","useEffect","useMemo","useRef","useState","useForm","useTranslation","z","AuthFooter","AuthFooterLink","AuthPageHeader","Alert","LabeledSeparator","PinInput","AuthLayout","IssuaryError","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","getSessionQueryOptions","verifyTotpLoginMutationOptions","ERROR_CODES","SECOND_FACTOR_SESSION_EXPIRED","INVALID_TOTP_CODE","TOTP_NOT_ENABLED","const","Route","VerifyTotpFormValues","code","REDIRECT_COUNTDOWN_SECONDS","VerifyTotp","t","router","queryClient","search","useSearch","pinInputRef","PinInputRef","sessionExpired","setSessionExpired","redirectCountdown","setRedirectCountdown","verifySchema","object","string","length","regex","verifyMutation","onSuccess","data","setQueryData","queryKey","user","window","location","href","navigate","to","onSettled","invalidateQueries","setValue","setError","handleSubmit","watch","formState","errors","defaultValues","resolver","codeValue","redirectToLogin","timer","setInterval","prev","clearInterval","onSubmit","values","mutateAsync","error","type","message","current","focus","seconds","value","isPending","component"],"sources":["../../../frontend/src/routes/verify/totp/index.tsx?tsr-split=component"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { CircleAlertIcon } from 'lucide-react';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport {\n PinInput,\n type PinInputRef,\n} from '#frontend/components/ui/pin-input.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { IssuaryError } from '#frontend/libs/error.ts';\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport { verifyTotpLoginMutationOptions } from '#frontend/queries/totp.ts';\n\n/** Error codes from backend */\nconst ERROR_CODES = {\n SECOND_FACTOR_SESSION_EXPIRED: 'SECOND_FACTOR_SESSION_EXPIRED',\n INVALID_TOTP_CODE: 'INVALID_TOTP_CODE',\n TOTP_NOT_ENABLED: 'TOTP_NOT_ENABLED',\n} as const;\n\nconst SearchSchema = OAuthSearchSchema;\n\nexport const Route = createFileRoute('/verify/totp/')({\n component: VerifyTotp,\n validateSearch: SearchSchema,\n});\n\ntype VerifyTotpFormValues = {\n code: string;\n};\n\n/** Auto redirect countdown seconds */\nconst REDIRECT_COUNTDOWN_SECONDS = 5;\n\nfunction VerifyTotp() {\n const { t } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const pinInputRef = useRef<PinInputRef>(null);\n\n const [sessionExpired, setSessionExpired] = useState(false);\n const [redirectCountdown, setRedirectCountdown] = useState(\n REDIRECT_COUNTDOWN_SECONDS,\n );\n\n const verifySchema = useMemo(\n () =>\n z.object({\n code: z\n .string()\n .length(6, t('validation.totp.length'))\n .regex(/^\\d{6}$/, t('validation.totp.digits')),\n }),\n [t],\n );\n\n const verifyMutation = useMutation({\n ...verifyTotpLoginMutationOptions,\n onSuccess: async (data) => {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: data.user,\n });\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const {\n setValue,\n setError,\n handleSubmit,\n watch,\n formState: { errors },\n } = useForm<VerifyTotpFormValues>({\n defaultValues: {\n code: '',\n },\n resolver: standardSchemaResolver(verifySchema),\n });\n\n const codeValue = watch('code');\n\n // Auto redirect when session expires\n const redirectToLogin = useCallback(() => {\n router.navigate({\n to: '/login',\n search: extractOAuthParams(search),\n });\n }, [router, search]);\n\n useEffect(() => {\n if (!sessionExpired) return;\n\n const timer = setInterval(() => {\n setRedirectCountdown((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n redirectToLogin();\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [sessionExpired, redirectToLogin]);\n\n const onSubmit = async (values: VerifyTotpFormValues) => {\n try {\n await verifyMutation.mutateAsync(values);\n } catch (error) {\n if (error instanceof IssuaryError) {\n switch (error.code) {\n case ERROR_CODES.SECOND_FACTOR_SESSION_EXPIRED:\n // Session expired - show alert and start auto redirect\n setSessionExpired(true);\n setRedirectCountdown(REDIRECT_COUNTDOWN_SECONDS);\n return;\n\n case ERROR_CODES.TOTP_NOT_ENABLED:\n // TOTP not enabled - redirect to login\n redirectToLogin();\n return;\n\n case ERROR_CODES.INVALID_TOTP_CODE:\n // Invalid code - show specific error and clear input\n setError('code', {\n type: 'manual',\n message: t('verifyTotp.error.invalid'),\n });\n setValue('code', '');\n pinInputRef.current?.focus();\n return;\n }\n }\n\n // Generic error fallback\n setError('code', {\n type: 'manual',\n message: t('verifyTotp.error.invalid'),\n });\n setValue('code', '');\n pinInputRef.current?.focus();\n }\n };\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verifyTotp.subtitle')}\n title={t('verifyTotp.title')}\n />\n\n {sessionExpired && (\n <Alert\n data-testid=\"totp-verify-session-expired\"\n icon={CircleAlertIcon}\n type=\"warning\"\n >\n <span className=\"flex flex-col items-start gap-tinyrack-3xs\">\n <span>{t('verifyTotp.error.expired')}</span>\n <span className=\"text-tinyrack-sm opacity-tinyrack-hover\">\n {t('verifyTotp.redirecting', { seconds: redirectCountdown })}\n </span>\n <TRButton\n appearance=\"ghost\"\n intent=\"neutral\"\n onClick={redirectToLogin}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('verifyTotp.redirectNow')}\n </TRButton>\n </span>\n </Alert>\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <PinInput\n autoFocus\n disabled={sessionExpired}\n error={errors.code}\n length={6}\n onChange={(value) => setValue('code', value)}\n onComplete={() => handleSubmit(onSubmit)()}\n ref={pinInputRef}\n value={codeValue}\n />\n\n {sessionExpired ? (\n <TRButton\n className=\"w-full\"\n disabled\n intent=\"primary\"\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyTotp.submit')}\n </TRButton>\n ) : (\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={verifyMutation.isPending}\n loadingLabel={t('verifyTotp.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('verifyTotp.submit')}\n </TRButton>\n )}\n </form>\n\n {/*\n The recovery code is the way out when the authenticator is gone, so it\n sits below the rule rather than in the footer with the navigation.\n */}\n <div className=\"flex flex-col gap-tinyrack-md\">\n <LabeledSeparator label={t('common.or')} />\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"totp-verify-recovery-link\"\n intent=\"neutral\"\n onClick={() =>\n router.navigate({\n to: '/verify/totp/recovery',\n search: extractOAuthParams(search),\n })\n }\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyTotp.useRecoveryCode')}\n </TRButton>\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={extractOAuthParams(search)} to=\"/login\">\n {t('verifyTotp.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{J as e,U as t,Z as n,i as r,n as i,q as a,r as o,s,t as c}from"./createLucideIcon-BPpAIXR_.js";import{On as ee,Sn as te,Sr as l}from"./config-DTQCUlfZ.js";import{a as u,i as d,n as f,r as p,t as m}from"./use-totp-setup-DtlgPUPJ.js";import{t as h}from"./shield-check-D_p8H0ni.js";import{F as g,N as _,R as ne,S as re,d as ie,j as v}from"./index-CKpnrw9M.js";import{t as y}from"./auth-page-header-DgGAaIiP.js";import{n as b,t as x}from"./alert-leqyvHOp.js";import{t as S}from"./auth-layout-CiNn2-Nb.js";import{t as C}from"./promise-OpBtq8tG.js";import{n as w,t as T}from"./auth-footer-Cz5ivsDc.js";var ae=c(`circle-x`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),E=n(e()),D=a();function oe({steps:e,current:t,progressLabel:n}){return(0,D.jsxs)(`div`,{className:`flex w-full flex-col gap-tinyrack-xs`,children:[(0,D.jsxs)(`div`,{className:`flex items-baseline justify-between gap-tinyrack-sm`,children:[(0,D.jsx)(i,{color:`muted`,variant:`label`,children:n}),(0,D.jsx)(i,{color:`muted`,variant:`caption`,children:e[t]})]}),(0,D.jsx)(`div`,{"aria-label":n,"aria-valuemax":e.length,"aria-valuemin":1,"aria-valuenow":t+1,className:`flex gap-tinyrack-xs`,role:`progressbar`,children:e.map((e,n)=>(0,D.jsx)(`span`,{"aria-hidden":!0,className:`h-tinyrack-xs flex-1 rounded-tinyrack-full transition-colors duration-tinyrack-normal ease-tinyrack-standard ${n<=t?`bg-tinyrack-primary`:`bg-tinyrack-surface-hover`}`},e))})]})}var O={TOTP_ALREADY_ENABLED:`TOTP_ALREADY_ENABLED`,TOTP_NOT_SETUP:`TOTP_NOT_SETUP`,INVALID_TOTP_CODE:`INVALID_TOTP_CODE`,UNAUTHORIZED:`UNAUTHORIZED`,SECOND_FACTOR_SESSION_EXPIRED:`SECOND_FACTOR_SESSION_EXPIRED`},k=5;function A(){let{t:e}=r(),n=ee(),i=l(),a=ie.useSearch(),[c,A]=(0,E.useState)(`generic`),[j,M]=(0,E.useState)(k),N=(0,E.useCallback)(()=>{n.navigate({to:`/login`,search:_(a)})},[n,a]),P=(0,E.useCallback)(()=>{n.navigate({to:`/profile`})},[n]),{step:F,setupData:I,recoveryCodes:L,isSetupPending:R,isVerifyPending:z,isConfirmPending:B,startSetup:V,verify:H,goToQr:U,goToVerify:W,confirmRecoveryCodes:G}=m({autoStart:!0,onSetupError:(0,E.useCallback)(e=>{if(e instanceof o)switch(e.code){case O.TOTP_ALREADY_ENABLED:A(`already_enabled`);break;case O.UNAUTHORIZED:case O.SECOND_FACTOR_SESSION_EXPIRED:A(`session_expired`),M(k);break;default:A(`generic`)}else A(`generic`)},[]),onVerifySuccess:(0,E.useCallback)(async e=>{await C()},[]),onConfirmSuccess:(0,E.useCallback)(async e=>{i.setQueryData(re.queryKey,{user:e.user}),await C(),g(a)?window.location.href=v(a):n.navigate({to:`/profile`})},[i,n,a]),onVerifyError:e=>{if(e instanceof o)switch(e.code){case O.TOTP_ALREADY_ENABLED:P();break;case O.UNAUTHORIZED:case O.SECOND_FACTOR_SESSION_EXPIRED:A(`session_expired`),M(k);break;case O.TOTP_NOT_SETUP:V();break}}});(0,E.useEffect)(()=>{if(c!==`session_expired`||F!==`error`)return;let e=setInterval(()=>{M(t=>t<=1?(clearInterval(e),N(),0):t-1)},1e3);return()=>clearInterval(e)},[c,F,N]);let K=(0,E.useCallback)(async e=>{await H(e)},[H]),q=F===`recovery`&&L.length>0,J=F===`qr`&&I!==null,Y=F!==`loading`&&F!==`error`,X=1;q?X=2:J&&(X=0);let Z=e(`setupTotp.title`),Q=e(`setupTotp.subtitle`);q?Z=e(`setupTotp.recoveryCodes.title`):Y&&!J&&(Z=e(`setupTotp.verifyTitle`),Q=e(`setupTotp.verifySubtitle`));let se=F===`error`||J,$;return $=F===`loading`?(0,D.jsx)(`div`,{className:`flex justify-center py-tinyrack-xl`,"data-testid":`totp-setup-loading`,children:(0,D.jsx)(t,{uiSize:`lg`,variant:`primary`})}):F===`error`&&c===`session_expired`?(0,D.jsxs)(b.Root,{"data-testid":`totp-setup-session-expired`,variant:`warning`,children:[(0,D.jsx)(ne,{"aria-hidden":!0,className:`size-tinyrack-xl`}),(0,D.jsx)(b.Title,{children:e(`setupTotp.error.expired`)}),(0,D.jsx)(b.Description,{children:e(`setupTotp.redirecting`,{seconds:j})}),(0,D.jsx)(b.Actions,{children:(0,D.jsx)(s,{appearance:`ghost`,intent:`neutral`,onClick:N,type:`button`,uiSize:`sm`,children:e(`setupTotp.redirectNow`)})})]}):F===`error`&&c===`already_enabled`?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(x,{icon:u,type:`info`,children:e(`setupTotp.error.alreadyEnabled`)}),(0,D.jsx)(s,{className:`w-full`,intent:`primary`,onClick:P,type:`button`,uiSize:`lg`,children:e(`setupTotp.goToProfile`)})]}):F===`error`?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(x,{icon:ae,type:`error`,children:e(`setupTotp.error.setupFailed`)}),(0,D.jsx)(s,{className:`w-full`,disabled:R,intent:`primary`,loading:R,onClick:V,type:`button`,uiSize:`lg`,children:e(`setupTotp.retry`)})]}):q?(0,D.jsx)(d,{isLoading:B,onConfirm:G,recoveryCodes:L}):J&&I?(0,D.jsxs)(D.Fragment,{children:[(0,D.jsx)(x,{icon:h,type:`info`,children:e(`setupTotp.required`)}),(0,D.jsx)(f,{onNext:W,setupData:I})]}):(0,D.jsx)(p,{isPending:z,onBack:U,onSubmit:K}),(0,D.jsxs)(S,{width:q?`wide`:`form`,children:[(0,D.jsx)(y,{eyebrow:Y?(0,D.jsx)(oe,{current:X,progressLabel:e(`setupTotp.stepProgress`,{current:X+1,total:3}),steps:[e(`setupTotp.steps.scan`),e(`setupTotp.steps.verify`),e(`setupTotp.steps.saveCodes`)]}):void 0,subtitle:Q,title:Z}),(0,D.jsx)(`div`,{className:`auth-enter flex flex-col gap-tinyrack-lg`,children:$},F),se&&(0,D.jsx)(T,{children:(0,D.jsx)(w,{link:(0,D.jsx)(te,{search:_(a),to:`/login`,children:e(`setupTotp.backToLogin`)})})})]})}export{A as component};
2
- //# sourceMappingURL=totp-DetFwOkk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"totp-DetFwOkk.js","names":["useQueryClient","Link","useRouter","TRAlert","TRButton","TRSpinner","CircleAlertIcon","CircleXIcon","InfoIcon","ShieldCheckIcon","useCallback","useEffect","useState","useTranslation","AuthFooter","AuthFooterLink","AuthPageHeader","AuthSteps","QrStep","RecoveryCodesStep","VerifyStep","Alert","AuthLayout","useTotpSetup","IssuaryError","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","getSessionQueryOptions","ERROR_CODES","TOTP_ALREADY_ENABLED","TOTP_NOT_SETUP","INVALID_TOTP_CODE","UNAUTHORIZED","SECOND_FACTOR_SESSION_EXPIRED","const","Route","ErrorType","REDIRECT_COUNTDOWN_SECONDS","SetupTotp","t","router","queryClient","search","useSearch","errorType","setErrorType","redirectCountdown","setRedirectCountdown","redirectToLogin","navigate","to","redirectToProfile","handleSetupError","error","Error","code","handleVerifySuccess","_data","TotpSetupVerifyResponse","handleConfirmSuccess","data","TotpConfirmResponse","setQueryData","queryKey","user","window","location","href","step","setupData","recoveryCodes","isSetupPending","isVerifyPending","isConfirmPending","startSetup","verify","goToQr","goToVerify","confirmRecoveryCodes","autoStart","onSetupError","onVerifySuccess","onConfirmSuccess","onVerifyError","timer","setInterval","prev","clearInterval","handleVerify","isRecoveryStep","length","isQrStep","isWizardStep","wizardIndex","title","subtitle","showFooter","body","React","ReactNode","seconds","current","total","undefined","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/circle-x.mjs","../../../frontend/src/components/auth/auth-steps.tsx","../../../frontend/src/routes/setup/totp/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n];\nconst CircleX = createLucideIcon(\"circle-x\", __iconNode);\n\nexport { __iconNode, CircleX as default };\n//# sourceMappingURL=circle-x.mjs.map\n","import { TRText } from '@tinyrack/ui/components/text';\n\ntype AuthStepsProps = {\n /** Ordered step labels. The current one is announced to assistive tech. */\n steps: string[];\n /** Zero-based index of the step being shown. */\n current: number;\n /** e.g. \"Step {{current}} of {{total}}\" — already interpolated by the caller. */\n progressLabel: string;\n};\n\n/**\n * Progress indicator for the multi-step auth wizards.\n *\n * Not built on `TRSteps`: that component is a vertical, docs-prose ordered\n * list with an inline-start rail and absolutely positioned counters, and it\n * has no notion of a current or completed step. Forcing it horizontal would\n * mean overriding most of its CSS. A stateful, orientable stepper is worth\n * proposing upstream; until then this is a small token-only composition.\n *\n * Renders as a labelled group rather than a list, because the segments are\n * decorative — the text label carries the information.\n */\nexport function AuthSteps({ steps, current, progressLabel }: AuthStepsProps) {\n return (\n <div className=\"flex w-full flex-col gap-tinyrack-xs\">\n <div className=\"flex items-baseline justify-between gap-tinyrack-sm\">\n <TRText color=\"muted\" variant=\"label\">\n {progressLabel}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {steps[current]}\n </TRText>\n </div>\n <div\n aria-label={progressLabel}\n aria-valuemax={steps.length}\n aria-valuemin={1}\n aria-valuenow={current + 1}\n className=\"flex gap-tinyrack-xs\"\n role=\"progressbar\"\n >\n {steps.map((step, index) => (\n <span\n aria-hidden\n className={`h-tinyrack-xs flex-1 rounded-tinyrack-full transition-colors duration-tinyrack-normal ease-tinyrack-standard ${\n index <= current\n ? 'bg-tinyrack-primary'\n : 'bg-tinyrack-surface-hover'\n }`}\n key={step}\n />\n ))}\n </div>\n </div>\n );\n}\n","import { useQueryClient } from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { TRAlert } from '@tinyrack/ui/components/alert';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport {\n CircleAlertIcon,\n CircleXIcon,\n InfoIcon,\n ShieldCheckIcon,\n} from 'lucide-react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { AuthSteps } from '#frontend/components/auth/auth-steps.tsx';\nimport { QrStep } from '#frontend/components/totp/qr-step.tsx';\nimport { RecoveryCodesStep } from '#frontend/components/totp/recovery-codes-step.tsx';\nimport { VerifyStep } from '#frontend/components/totp/verify-step.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { useTotpSetup } from '#frontend/features/totp/use-totp-setup.ts';\nimport { IssuaryError } from '#frontend/libs/error.ts';\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport type {\n TotpConfirmResponse,\n TotpSetupVerifyResponse,\n} from '#frontend/queries/totp.ts';\n\n/** Error codes from backend */\nconst ERROR_CODES = {\n TOTP_ALREADY_ENABLED: 'TOTP_ALREADY_ENABLED',\n TOTP_NOT_SETUP: 'TOTP_NOT_SETUP',\n INVALID_TOTP_CODE: 'INVALID_TOTP_CODE',\n UNAUTHORIZED: 'UNAUTHORIZED',\n SECOND_FACTOR_SESSION_EXPIRED: 'SECOND_FACTOR_SESSION_EXPIRED',\n} as const;\n\nconst SearchSchema = OAuthSearchSchema;\n\nexport const Route = createFileRoute('/setup/totp/')({\n component: SetupTotp,\n validateSearch: SearchSchema,\n});\n\ntype ErrorType = 'generic' | 'already_enabled' | 'session_expired';\n\n/** Auto redirect countdown seconds */\nconst REDIRECT_COUNTDOWN_SECONDS = 5;\n\nfunction SetupTotp() {\n const { t } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const [errorType, setErrorType] = useState<ErrorType>('generic');\n const [redirectCountdown, setRedirectCountdown] = useState(\n REDIRECT_COUNTDOWN_SECONDS,\n );\n\n const redirectToLogin = useCallback(() => {\n router.navigate({\n to: '/login',\n search: extractOAuthParams(search),\n });\n }, [router, search]);\n\n const redirectToProfile = useCallback(() => {\n router.navigate({ to: '/profile' });\n }, [router]);\n\n const handleSetupError = useCallback((error: Error) => {\n if (error instanceof IssuaryError) {\n switch (error.code) {\n case ERROR_CODES.TOTP_ALREADY_ENABLED:\n setErrorType('already_enabled');\n break;\n case ERROR_CODES.UNAUTHORIZED:\n case ERROR_CODES.SECOND_FACTOR_SESSION_EXPIRED:\n setErrorType('session_expired');\n setRedirectCountdown(REDIRECT_COUNTDOWN_SECONDS);\n break;\n default:\n setErrorType('generic');\n }\n } else {\n setErrorType('generic');\n }\n }, []);\n\n const handleVerifySuccess = useCallback(\n async (_data: TotpSetupVerifyResponse) => {\n // Recovery codes step is handled by useTotpSetup hook\n // (step transitions to 'recovery' automatically)\n // Session update happens after confirm, not here\n await tick();\n },\n [],\n );\n\n const handleConfirmSuccess = useCallback(\n async (data: TotpConfirmResponse) => {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: data.user,\n });\n await tick();\n // Navigate after successful confirm\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n },\n [queryClient, router, search],\n );\n\n const {\n step,\n setupData,\n recoveryCodes,\n isSetupPending,\n isVerifyPending,\n isConfirmPending,\n startSetup,\n verify,\n goToQr,\n goToVerify,\n confirmRecoveryCodes,\n } = useTotpSetup({\n autoStart: true,\n onSetupError: handleSetupError,\n onVerifySuccess: handleVerifySuccess,\n onConfirmSuccess: handleConfirmSuccess,\n onVerifyError: (error) => {\n if (error instanceof IssuaryError) {\n switch (error.code) {\n case ERROR_CODES.TOTP_ALREADY_ENABLED:\n redirectToProfile();\n break;\n case ERROR_CODES.UNAUTHORIZED:\n case ERROR_CODES.SECOND_FACTOR_SESSION_EXPIRED:\n setErrorType('session_expired');\n setRedirectCountdown(REDIRECT_COUNTDOWN_SECONDS);\n break;\n case ERROR_CODES.TOTP_NOT_SETUP:\n startSetup();\n break;\n }\n }\n },\n });\n\n // Auto redirect when session expires\n useEffect(() => {\n if (errorType !== 'session_expired' || step !== 'error') return;\n\n const timer = setInterval(() => {\n setRedirectCountdown((prev) => {\n if (prev <= 1) {\n clearInterval(timer);\n redirectToLogin();\n return 0;\n }\n return prev - 1;\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, [errorType, step, redirectToLogin]);\n\n const handleVerify = useCallback(\n async (code: string) => {\n await verify(code);\n },\n [verify],\n );\n\n const isRecoveryStep = step === 'recovery' && recoveryCodes.length > 0;\n const isQrStep = step === 'qr' && setupData !== null;\n // `loading` and `error` are not points on the journey, so the wizard's\n // progress is hidden there rather than showing a misleading step.\n const isWizardStep = step !== 'loading' && step !== 'error';\n\n let wizardIndex = 1;\n if (isRecoveryStep) {\n wizardIndex = 2;\n } else if (isQrStep) {\n wizardIndex = 0;\n }\n\n let title = t('setupTotp.title');\n let subtitle: string | undefined = t('setupTotp.subtitle');\n if (isRecoveryStep) {\n title = t('setupTotp.recoveryCodes.title');\n } else if (isWizardStep && !isQrStep) {\n title = t('setupTotp.verifyTitle');\n subtitle = t('setupTotp.verifySubtitle');\n }\n\n // Where the original screens offered a way out: the wizard's later steps\n // deliberately do not, so nobody leaves before saving their codes.\n const showFooter = step === 'error' || isQrStep;\n\n let body: React.ReactNode;\n if (step === 'loading') {\n body = (\n <div\n className=\"flex justify-center py-tinyrack-xl\"\n data-testid=\"totp-setup-loading\"\n >\n <TRSpinner uiSize=\"lg\" variant=\"primary\" />\n </div>\n );\n } else if (step === 'error' && errorType === 'session_expired') {\n body = (\n <TRAlert.Root data-testid=\"totp-setup-session-expired\" variant=\"warning\">\n <CircleAlertIcon aria-hidden className=\"size-tinyrack-xl\" />\n <TRAlert.Title>{t('setupTotp.error.expired')}</TRAlert.Title>\n <TRAlert.Description>\n {t('setupTotp.redirecting', {\n seconds: redirectCountdown,\n })}\n </TRAlert.Description>\n <TRAlert.Actions>\n <TRButton\n appearance=\"ghost\"\n intent=\"neutral\"\n onClick={redirectToLogin}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('setupTotp.redirectNow')}\n </TRButton>\n </TRAlert.Actions>\n </TRAlert.Root>\n );\n } else if (step === 'error' && errorType === 'already_enabled') {\n body = (\n <>\n <Alert icon={InfoIcon} type=\"info\">\n {t('setupTotp.error.alreadyEnabled')}\n </Alert>\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n onClick={redirectToProfile}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.goToProfile')}\n </TRButton>\n </>\n );\n } else if (step === 'error') {\n body = (\n <>\n <Alert icon={CircleXIcon} type=\"error\">\n {t('setupTotp.error.setupFailed')}\n </Alert>\n <TRButton\n className=\"w-full\"\n disabled={isSetupPending}\n intent=\"primary\"\n loading={isSetupPending}\n onClick={startSetup}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.retry')}\n </TRButton>\n </>\n );\n } else if (isRecoveryStep) {\n body = (\n <RecoveryCodesStep\n isLoading={isConfirmPending}\n onConfirm={confirmRecoveryCodes}\n recoveryCodes={recoveryCodes}\n />\n );\n } else if (isQrStep && setupData) {\n body = (\n <>\n <Alert icon={ShieldCheckIcon} type=\"info\">\n {t('setupTotp.required')}\n </Alert>\n <QrStep onNext={goToVerify} setupData={setupData} />\n </>\n );\n } else {\n body = (\n <VerifyStep\n isPending={isVerifyPending}\n onBack={goToQr}\n onSubmit={handleVerify}\n />\n );\n }\n\n /*\n One shell, one header. The seven `AuthLayout` blocks this replaced meant\n the header remounted on every transition, so the title flashed and the\n progress had nowhere to live.\n */\n return (\n <AuthLayout width={isRecoveryStep ? 'wide' : 'form'}>\n <AuthPageHeader\n eyebrow={\n isWizardStep ? (\n <AuthSteps\n current={wizardIndex}\n progressLabel={t('setupTotp.stepProgress', {\n current: wizardIndex + 1,\n total: 3,\n })}\n steps={[\n t('setupTotp.steps.scan'),\n t('setupTotp.steps.verify'),\n t('setupTotp.steps.saveCodes'),\n ]}\n />\n ) : undefined\n }\n subtitle={subtitle}\n title={title}\n />\n\n {/* Keyed so each step animates in rather than swapping in place. */}\n <div className=\"auth-enter flex flex-col gap-tinyrack-lg\" key={step}>\n {body}\n </div>\n\n {showFooter && (\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={extractOAuthParams(search)} to=\"/login\">\n {t('setupTotp.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n )}\n </AuthLayout>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import{J as e,M as t,Z as n,b as r,c as i,h as a,i as o,l as s,m as c,q as l,s as u,t as d,v as f,x as p}from"./createLucideIcon-BPpAIXR_.js";import{P as m,Sr as h,Y as g,_t as _,bn as v,dn as y,et as b,f as x,gt as S,k as C,mt as w,pn as T,pt as E}from"./config-DTQCUlfZ.js";import{t as D}from"./useMutation-BWZ0G4Td.js";import{A as O,Z as k,w as A}from"./shell-header-bar-JcFhS7mb.js";import{t as j}from"./triangle-alert-CqNn0kPs.js";import{c as M,o as N}from"./zod-C87S6Tec.js";import{S as P}from"./index-CKpnrw9M.js";import{t as F}from"./alert-leqyvHOp.js";import{t as I}from"./checkbox-C90dDDza.js";import{t as L}from"./field-BMT214_m.js";import{r as R,t as z}from"./standard-schema-e8gtSzGE.js";import{i as B,s as V,t as H}from"./totp-BNZ904Zm.js";import{t as U}from"./pin-input-CITrr-Yc.js";var ee=d(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]),te=d(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),W=n(e(),1),G=l();function ne({recoveryCodes:e,onConfirm:t,isLoading:n=!1,className:r=``}){let{t:i}=o(),a=x.useToastManager(),[s,c]=(0,W.useState)(!1),l=(0,W.useCallback)(async()=>{await navigator.clipboard.writeText(e.join(`
2
- `)),a.add({title:i(`setupTotp.recoveryCodes.copied`),type:`success`})},[e,a,i]);return(0,G.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg ${r}`,children:[(0,G.jsx)(`p`,{className:`text-tinyrack-sm text-tinyrack-text-muted`,children:i(`setupTotp.recoveryCodes.description`)}),(0,G.jsx)(`div`,{className:`grid grid-cols-2 gap-tinyrack-sm rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg`,"data-testid":`recovery-codes-grid`,children:e.map(e=>(0,G.jsx)(`code`,{className:`rounded-tinyrack-sm bg-tinyrack-surface-muted px-tinyrack-sm py-tinyrack-3xs text-center font-tinyrack-mono text-tinyrack-sm text-tinyrack-text`,children:e},e))}),(0,G.jsx)(F,{icon:j,type:`warning`,children:i(`setupTotp.recoveryCodes.warning`)}),(0,G.jsxs)(u,{appearance:`outline`,className:`w-full gap-tinyrack-sm`,intent:`neutral`,onClick:l,type:`button`,uiSize:`lg`,children:[(0,G.jsx)(ee,{"aria-hidden":!0,className:`size-tinyrack-lg`}),i(`setupTotp.recoveryCodes.copy`)]}),(0,G.jsx)(L.Root,{children:(0,G.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,G.jsx)(I.Root,{checked:s,"data-testid":`recovery-codes-confirm`,disabled:n,onCheckedChange:e=>c(e===!0),uiSize:`lg`,children:(0,G.jsx)(I.Indicator,{})}),(0,G.jsx)(L.Label,{className:`cursor-pointer`,children:i(`setupTotp.recoveryCodes.confirmCheckbox`)})]})}),(0,G.jsx)(u,{className:`w-full`,"data-testid":`recovery-codes-submit`,disabled:!s||n,intent:`primary`,loading:n,onClick:t,type:`button`,uiSize:`lg`,children:i(`setupTotp.recoveryCodes.confirm`)})]})}function re({onSubmit:e,onBack:t,isPending:n,invalidMessage:r,submitLabel:i,pendingText:a,backLabel:s,className:c=``}){let{t:l}=o(),d=(0,W.useRef)(null),{setValue:f,setError:p,handleSubmit:m,watch:h,formState:{errors:g}}=R({defaultValues:{code:``},resolver:z((0,W.useMemo)(()=>N({code:M().length(6,l(`validation.totp.length`)).regex(/^\d{6}$/,l(`validation.totp.digits`))}),[l]))}),_=h(`code`),v=(0,W.useCallback)(async t=>{try{await e(t.code)}catch{p(`code`,{type:`manual`,message:r??l(`setupTotp.error.invalid`)}),f(`code`,``),d.current?.focus()}},[r,e,p,f,l]);return(0,G.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg ${c}`,children:[(0,G.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:m(v),children:[(0,G.jsx)(U,{autoFocus:!0,error:g.code,length:6,onChange:e=>f(`code`,e),onComplete:()=>m(v)(),ref:d,value:_}),(0,G.jsx)(u,{className:`w-full`,intent:`primary`,loading:n,loadingLabel:a??l(`setupTotp.verifying`),type:`submit`,uiSize:`lg`,children:i??l(`setupTotp.verify`)})]}),t&&(0,G.jsx)(u,{appearance:`ghost`,className:`w-full`,"data-testid":`totp-verify-back`,disabled:n,intent:`neutral`,onClick:t,type:`button`,uiSize:`lg`,children:s??l(`setupTotp.back`)})]})}function ie(e){let{open:t,defaultOpen:n,onOpenChange:r,disabled:i}=e,[a,o]=O({controlled:t,default:n,name:`Collapsible`,state:`open`}),{mounted:s,setMounted:c,transitionStatus:l}=k(a,!0,!0),u=A(),[d,f]=W.useState(),h=d===null?void 0:d??u,g=p(e=>{let t=!a,n=m(b,e.nativeEvent);r(t,n),!n.isCanceled&&o(t)});return W.useMemo(()=>({defaultPanelId:u,disabled:i,handleTrigger:g,mounted:s,open:a,panelId:h,setMounted:c,setOpen:o,setPanelIdState:f,transitionStatus:l}),[u,i,g,s,a,h,c,o,f,l])}var K=W.createContext(void 0);function q(){let e=W.useContext(K);if(e===void 0)throw Error(f(15));return e}var J=function(e){return e.open=`data-open`,e.closed=`data-closed`,e[e.startingStyle=S.startingStyle]=`startingStyle`,e[e.endingStyle=S.endingStyle]=`endingStyle`,e}({}),ae=function(e){return e.panelOpen=`data-panel-open`,e}({}),oe={[J.open]:``},se={[J.closed]:``},ce={open(e){return e?{[ae.panelOpen]:``}:null}},Y={open(e){return e?oe:se},..._},le=W.forwardRef(function(e,t){let{render:n,className:r,defaultOpen:a=!1,disabled:o=!1,onOpenChange:s,open:c,style:l,...u}=e,d=p(s),f=ie({open:c,defaultOpen:a,onOpenChange:d,disabled:o}),m=W.useMemo(()=>({open:f.open,disabled:f.disabled,transitionStatus:f.transitionStatus}),[f.open,f.disabled,f.transitionStatus]),h=W.useMemo(()=>({...f,onOpenChange:d,state:m}),[f,d,m]),g=i(`div`,e,{state:m,ref:t,props:u,stateAttributesMapping:Y});return(0,G.jsx)(K.Provider,{value:h,children:g})}),ue={...ce,..._},de=W.forwardRef(function(e,t){let{panelId:n,open:r,handleTrigger:o,state:s,disabled:c}=q(),{className:l,disabled:u=c,render:d,nativeButton:f=!0,style:p,...m}=e,{getButtonProps:h,buttonRef:g}=a({disabled:u,focusableWhenDisabled:!0,native:f});return i(`button`,e,{state:s,ref:[t,g],props:[{"aria-controls":r?n:void 0,"aria-expanded":r,onClick:o},m,h],stateAttributesMapping:ue})}),X={height:void 0,width:void 0};function fe(e){let{externalRef:t,hiddenUntilFound:n,id:i,keepMounted:a,mounted:o,onOpenChange:s,open:l,setMounted:u,setOpen:d,transitionStatus:f}=e,h=W.useRef(null),_=W.useRef(null),[v,b]=W.useState(X),x=W.useRef(X),S=W.useRef(!1),D=W.useRef(l),O=W.useRef(!1),[k,A]=W.useState(!1),j=W.useRef(null),M=c(t,h),N=C(l),P=w(h),F=!l&&!o,I=k?`idle`:f,L=l&&(D.current||O.current),R=!l&&o&&_.current===`css-animation`&&v.height===void 0&&v.width===void 0?x.current:v,z=n&&F&&_.current!==`css-animation`,B=p((e,t=!0)=>{t&&(x.current=e),b(e)}),V=p(()=>{j.current?.(),j.current=null}),H=p(e=>{V(),j.current=()=>{j.current=null,e()}}),U=p(()=>{l&&o&&_.current===`css-animation`&&(O.current=!0)});r(()=>{!k||f===`starting`||A(!1)},[k,f]),W.useEffect(()=>()=>{U(),V()},[U,V]),r(()=>{let e=h.current;if(!e)return;!l&&j.current&&V();let t=pe(e,L);if(_.current=t,l&&f===`idle`&&D.current&&t===`css-animation`){x.current=Z(e);return}if(l&&f===`starting`){let n=S.current;if(S.current=!1,t===`none`){B(Z(e)),A(!0);return}if(t===`css-transition`){let t=he(e);if(B(Z(e)),!n)return t;let r=Q(e,`transition-duration`,`0s`);return H(r),A(!0),t}B(Z(e));let r=Q(e,`animation-name`,`none`);if(!n){r();return}let i=Q(e,`animation-duration`,`0s`);r(),H(i),A(!0);return}if(!l&&o&&(f===`idle`||f===`starting`)){if(D.current=!1,O.current=!1,t===`none`){B(X,!1),u(!1);return}B(Z(e));return}if(f!==`ending`)return;if(t===`none`){u(!1);return}let n=Z(e);if(!(n.height>0||n.width>0)){u(!1);return}B(n),t===`css-animation`&&Q(e,`animation-name`,`none`)()},[o,l,V,B,u,H,L,f]),E({enabled:l&&o&&I===`idle`,open:!0,ref:h,onComplete(){l&&B(X,!1)}}),W.useEffect(()=>{if(l||!o||I!==`ending`||!h.current)return;let e=new AbortController,t=-1;function n(){N.current||(u(!1),B(X,!1))}return t=y.request(()=>{P(n,e.signal)}),()=>{y.cancel(t),e.abort()}},[N,o,l,I,P,B,u]),r(()=>{let e=h.current;!e||!n||!F||e.setAttribute(`hidden`,`until-found`)},[F,n]),W.useEffect(function(){let e=h.current;if(!e)return;function t(e){let t=m(g,e);s(!0,t),!t.isCanceled&&(S.current=!0,d(!0))}return T(e,`beforematch`,t)},[s,d]);let ee=a||n||o||l;return{height:R.height,props:{...z?{[J.startingStyle]:``}:void 0,hidden:F,id:i},ref:M,shouldPreventOpenAnimation:L,shouldRender:ee,transitionStatus:I,width:R.width}}function Z(e){return{height:e.scrollHeight,width:e.scrollWidth}}function pe(e,n){let r=t(e).getComputedStyle(e),i=(r.animationName.split(`,`).map(e=>e.trim()).some(e=>e!==``&&e!==`none`)||n)&&me(r.animationDuration),a=me(r.transitionDuration);return i&&a||a?`css-transition`:i?`css-animation`:`none`}function me(e){return e.split(`,`).map(e=>e.trim()).some(e=>e!==``&&Number.parseFloat(e)>0)}function Q(e,t,n){let r=e.style.getPropertyValue(t),i=e.style.getPropertyPriority(t);return e.style.setProperty(t,n),()=>{if(r===``){e.style.removeProperty(t);return}e.style.setProperty(t,r,i)}}function he(e){let t={"justify-content":e.style.justifyContent,"align-items":e.style.alignItems,"align-content":e.style.alignContent,"justify-items":e.style.justifyItems};Object.keys(t).forEach(t=>{e.style.setProperty(t,`initial`,`important`)});function n(){Object.entries(t).forEach(([t,n])=>{if(n===``){e.style.removeProperty(t);return}e.style.setProperty(t,n)})}let r=y.request(n);return()=>{y.cancel(r),n()}}var ge=function(e){return e.collapsiblePanelHeight=`--collapsible-panel-height`,e.collapsiblePanelWidth=`--collapsible-panel-width`,e}({}),_e=v(W.forwardRef(function(e,t){let{className:n,hiddenUntilFound:a,keepMounted:o,render:c,id:l,style:u,...d}=e,{defaultPanelId:f,mounted:p,onOpenChange:m,open:h,setMounted:g,setPanelIdState:_,setOpen:v,state:y,transitionStatus:b}=q(),x=a??!1,S=o??!1,C=l||void 0,w=C??f;r(()=>(_(e=>C??(e===null?void 0:e)),()=>{_(e=>e===C?null:e)}),[C,_]);let{height:T,props:E,ref:D,shouldPreventOpenAnimation:O,shouldRender:k,transitionStatus:A,width:j}=fe({externalRef:t,hiddenUntilFound:x,id:w,keepMounted:S,mounted:p,onOpenChange:m,open:h,setMounted:g,setOpen:v,transitionStatus:b}),M={...y,transitionStatus:A},N=s(u,M),P=i(`div`,{...e,style:void 0},{state:M,ref:D,props:[E,{style:{[ge.collapsiblePanelHeight]:T===void 0?`auto`:`${T}px`,[ge.collapsiblePanelWidth]:j===void 0?`auto`:`${j}px`}},d,N?{style:N}:void 0,O?{style:{animationName:`none`}}:void 0],stateAttributesMapping:Y});return k?P:null}),`tr-collapsible-content`),$={Root:v(le,`tr-collapsible`),Trigger:v(de,`tr-collapsible-summary`),Panel:_e};function ve({setupData:e,onNext:t,additionalActions:n,className:r=``}){let{t:i}=o();return(0,G.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg ${r}`,children:[(0,G.jsx)(`p`,{className:`text-center text-tinyrack-sm text-tinyrack-text-muted`,children:i(`setupTotp.qrDescription`)}),(0,G.jsx)(`div`,{className:`flex justify-center`,children:(0,G.jsx)(`div`,{className:`rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg`,children:(0,G.jsx)(`img`,{alt:`TOTP QR Code`,className:`block size-tinyrack-measure-sm`,src:e.qr_code})})}),(0,G.jsxs)($.Root,{children:[(0,G.jsx)($.Trigger,{children:i(`setupTotp.manualEntry`)}),(0,G.jsx)($.Panel,{children:(0,G.jsx)(`code`,{className:`mt-tinyrack-xs block break-all rounded-tinyrack-sm bg-tinyrack-surface-muted p-tinyrack-sm text-tinyrack-sm text-tinyrack-text`,children:e.secret})})]}),(0,G.jsx)(u,{className:`w-full`,"data-testid":`totp-qr-next`,intent:`primary`,onClick:t,type:`button`,uiSize:`lg`,children:i(`setupTotp.next`)}),n]})}function ye(e={}){let{onSetupSuccess:t,onSetupError:n,onVerifySuccess:r,onVerifyError:i,onConfirmSuccess:a,onConfirmError:o,autoStart:s=!1}=e,c=h(),[l,u]=(0,W.useState)(s?`loading`:`qr`),[d,f]=(0,W.useState)(null),[p,m]=(0,W.useState)([]),g=(0,W.useRef)(!1),_=D({...B,onSuccess:e=>{f(e),u(`qr`),t?.(e)},onError:e=>{u(`error`),n?.(e)}}),v=D({...V,onSuccess:e=>{m(e.recovery_codes),u(`recovery`),r?.(e)},onError:e=>{i?.(e)}}),y=D({...H,onSuccess:e=>{c.invalidateQueries({queryKey:P.queryKey}),a?.(e)},onError:e=>{o?.(e)}}),b=(0,W.useCallback)(()=>{g.current=!0,u(`loading`),_.mutate()},[_]),x=(0,W.useCallback)(async e=>v.mutateAsync({code:e}),[v]),S=(0,W.useCallback)(()=>{u(`qr`)},[]),C=(0,W.useCallback)(()=>{u(`verify`)},[]),w=(0,W.useCallback)(async()=>y.mutateAsync(),[y]),T=(0,W.useCallback)(()=>{u(s?`loading`:`qr`),f(null),m([]),g.current=!1,_.reset(),v.reset(),y.reset()},[s,_,v,y]);return(0,W.useEffect)(()=>{s&&!g.current&&l===`loading`&&(g.current=!0,_.mutate())},[s,l,_]),{step:l,setupData:d,recoveryCodes:p,isSetupPending:_.isPending,isVerifyPending:v.isPending,isConfirmPending:y.isPending,isPending:_.isPending||v.isPending||y.isPending,setupError:_.error,verifyError:v.error,confirmError:y.error,startSetup:b,verify:x,goToQr:S,goToVerify:C,confirmRecoveryCodes:w,reset:T}}export{te as a,ne as i,ve as n,re as r,ye as t};
3
- //# sourceMappingURL=use-totp-setup-DtlgPUPJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-totp-setup-DtlgPUPJ.js","names":["__iconNode","REASONS.triggerPress","_formatErrorMessage","baseMapping","REASONS.none","ownerWindow","Collapsible.Panel","Collapsible.Root","Collapsible.Trigger"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/copy.mjs","../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/info.mjs","../../../frontend/src/components/totp/recovery-codes-step.tsx","../../../frontend/src/components/totp/verify-step.tsx","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/root/useCollapsibleRoot.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/root/CollapsibleRootContext.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/panel/CollapsiblePanelDataAttributes.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/trigger/CollapsibleTriggerDataAttributes.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/utils/collapsibleOpenStateMapping.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/root/stateAttributesMapping.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/root/CollapsibleRoot.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/trigger/CollapsibleTrigger.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/panel/useCollapsiblePanel.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/panel/CollapsiblePanelCssVars.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/collapsible/panel/CollapsiblePanel.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/collapsible-panel.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/collapsible-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/collapsible-trigger.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/collapsible/index.js","../../../frontend/src/components/totp/qr-step.tsx","../../../frontend/src/features/totp/use-totp-setup.ts"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"14\", height: \"14\", x: \"8\", y: \"8\", rx: \"2\", ry: \"2\", key: \"17jyea\" }],\n [\"path\", { d: \"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\", key: \"zix9uf\" }]\n];\nconst Copy = createLucideIcon(\"copy\", __iconNode);\n\nexport { __iconNode, Copy as default };\n//# sourceMappingURL=copy.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n];\nconst Info = createLucideIcon(\"info\", __iconNode);\n\nexport { __iconNode, Info as default };\n//# sourceMappingURL=info.mjs.map\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CopyIcon, TriangleAlertIcon } from 'lucide-react';\nimport { useCallback, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\n\nexport interface RecoveryCodesStepProps {\n recoveryCodes: string[];\n onConfirm: () => void;\n isLoading?: boolean;\n className?: string;\n}\n\nexport function RecoveryCodesStep({\n recoveryCodes,\n onConfirm,\n isLoading = false,\n className = '',\n}: RecoveryCodesStepProps) {\n const { t } = useTranslation();\n const toast = TRToast.useToastManager();\n const [confirmed, setConfirmed] = useState(false);\n\n // The toast manager owns the dismissal timer, so this no longer keeps a\n // \"copied\" flag alive with its own setTimeout.\n const handleCopy = useCallback(async () => {\n await navigator.clipboard.writeText(recoveryCodes.join('\\n'));\n toast.add({ title: t('setupTotp.recoveryCodes.copied'), type: 'success' });\n }, [recoveryCodes, toast, t]);\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <p className=\"text-tinyrack-sm text-tinyrack-text-muted\">\n {t('setupTotp.recoveryCodes.description')}\n </p>\n\n {/*\n Two columns so a full set of codes stays on one screen without\n scrolling — this is the only time the user will ever see them.\n */}\n <div\n className=\"grid grid-cols-2 gap-tinyrack-sm rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg\"\n data-testid=\"recovery-codes-grid\"\n >\n {recoveryCodes.map((code) => (\n <code\n className=\"rounded-tinyrack-sm bg-tinyrack-surface-muted px-tinyrack-sm py-tinyrack-3xs text-center font-tinyrack-mono text-tinyrack-sm text-tinyrack-text\"\n key={code}\n >\n {code}\n </code>\n ))}\n </div>\n\n <Alert icon={TriangleAlertIcon} type=\"warning\">\n {t('setupTotp.recoveryCodes.warning')}\n </Alert>\n\n <TRButton\n appearance=\"outline\"\n className=\"w-full gap-tinyrack-sm\"\n intent=\"neutral\"\n onClick={handleCopy}\n type=\"button\"\n uiSize=\"lg\"\n >\n <CopyIcon aria-hidden className=\"size-tinyrack-lg\" />\n {t('setupTotp.recoveryCodes.copy')}\n </TRButton>\n\n {/*\n `TRField.Root` owns the label/control association, so the checkbox\n keeps its own focus ring instead of being swallowed by a wrapping\n `<label>` that had none.\n */}\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRCheckbox.Root\n checked={confirmed}\n data-testid=\"recovery-codes-confirm\"\n disabled={isLoading}\n onCheckedChange={(checked) => setConfirmed(checked === true)}\n uiSize=\"lg\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('setupTotp.recoveryCodes.confirmCheckbox')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <TRButton\n className=\"w-full\"\n data-testid=\"recovery-codes-submit\"\n disabled={!confirmed || isLoading}\n intent=\"primary\"\n loading={isLoading}\n onClick={onConfirm}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.recoveryCodes.confirm')}\n </TRButton>\n </div>\n );\n}\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { useCallback, useMemo, useRef } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport {\n PinInput,\n type PinInputRef,\n} from '#frontend/components/ui/pin-input.tsx';\n\nexport interface VerifyStepProps {\n onSubmit: (code: string) => Promise<void>;\n onBack?: (() => void) | undefined;\n isPending: boolean;\n invalidMessage?: string | undefined;\n submitLabel?: string | undefined;\n pendingText?: string | undefined;\n backLabel?: string | undefined;\n className?: string;\n}\n\ntype VerifyFormValues = {\n code: string;\n};\n\nexport function VerifyStep({\n onSubmit,\n onBack,\n isPending,\n invalidMessage,\n submitLabel,\n pendingText,\n backLabel,\n className = '',\n}: VerifyStepProps) {\n const { t } = useTranslation();\n const pinInputRef = useRef<PinInputRef>(null);\n\n const verifySchema = useMemo(\n () =>\n z.object({\n code: z\n .string()\n .length(6, t('validation.totp.length'))\n .regex(/^\\d{6}$/, t('validation.totp.digits')),\n }),\n [t],\n );\n\n const {\n setValue,\n setError,\n handleSubmit,\n watch,\n formState: { errors },\n } = useForm<VerifyFormValues>({\n defaultValues: { code: '' },\n resolver: standardSchemaResolver(verifySchema),\n });\n\n const codeValue = watch('code');\n\n const handleFormSubmit = useCallback(\n async (values: VerifyFormValues) => {\n try {\n await onSubmit(values.code);\n } catch {\n setError('code', {\n type: 'manual',\n message: invalidMessage ?? t('setupTotp.error.invalid'),\n });\n setValue('code', '');\n pinInputRef.current?.focus();\n }\n },\n [invalidMessage, onSubmit, setError, setValue, t],\n );\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(handleFormSubmit)}\n >\n <PinInput\n autoFocus\n error={errors.code}\n length={6}\n onChange={(value) => setValue('code', value)}\n onComplete={() => handleSubmit(handleFormSubmit)()}\n ref={pinInputRef}\n value={codeValue}\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={isPending}\n loadingLabel={pendingText ?? t('setupTotp.verifying')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {submitLabel ?? t('setupTotp.verify')}\n </TRButton>\n </form>\n\n {onBack && (\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"totp-verify-back\"\n disabled={isPending}\n intent=\"neutral\"\n onClick={onBack}\n type=\"button\"\n uiSize=\"lg\"\n >\n {backLabel ?? t('setupTotp.back')}\n </TRButton>\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\nexport function useCollapsibleRoot(parameters) {\n const {\n open: openParam,\n defaultOpen,\n onOpenChange,\n disabled\n } = parameters;\n const [open, setOpen] = useControlled({\n controlled: openParam,\n default: defaultOpen,\n name: 'Collapsible',\n state: 'open'\n });\n const {\n mounted,\n setMounted,\n transitionStatus\n } = useTransitionStatus(open, true, true);\n const defaultPanelId = useBaseUiId();\n // `undefined` uses the initial generated fallback; `null` means the panel unmounted.\n const [registeredPanelId, setPanelIdState] = React.useState();\n const panelId = registeredPanelId === null ? undefined : registeredPanelId ?? defaultPanelId;\n const handleTrigger = useStableCallback(event => {\n const nextOpen = !open;\n const eventDetails = createChangeEventDetails(REASONS.triggerPress, event.nativeEvent);\n onOpenChange(nextOpen, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n setOpen(nextOpen);\n });\n return React.useMemo(() => ({\n defaultPanelId,\n disabled,\n handleTrigger,\n mounted,\n open,\n panelId,\n setMounted,\n setOpen,\n setPanelIdState,\n transitionStatus\n }), [defaultPanelId, disabled, handleTrigger, mounted, open, panelId, setMounted, setOpen, setPanelIdState, transitionStatus]);\n}","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const CollapsibleRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") CollapsibleRootContext.displayName = \"CollapsibleRootContext\";\nexport function useCollapsibleRootContext() {\n const context = React.useContext(CollapsibleRootContext);\n if (context === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: CollapsibleRootContext is missing. Collapsible parts must be placed within <Collapsible.Root>.' : _formatErrorMessage(15));\n }\n return context;\n}","import { TransitionStatusDataAttributes } from \"../../internals/stateAttributesMapping.mjs\";\nexport let CollapsiblePanelDataAttributes = function (CollapsiblePanelDataAttributes) {\n /**\n * Present when the collapsible panel is open.\n */\n CollapsiblePanelDataAttributes[\"open\"] = \"data-open\";\n /**\n * Present when the collapsible panel is closed.\n */\n CollapsiblePanelDataAttributes[\"closed\"] = \"data-closed\";\n /**\n * Present when the panel begins animating in.\n */\n CollapsiblePanelDataAttributes[CollapsiblePanelDataAttributes[\"startingStyle\"] = TransitionStatusDataAttributes.startingStyle] = \"startingStyle\";\n /**\n * Present when the panel is animating out.\n */\n CollapsiblePanelDataAttributes[CollapsiblePanelDataAttributes[\"endingStyle\"] = TransitionStatusDataAttributes.endingStyle] = \"endingStyle\";\n return CollapsiblePanelDataAttributes;\n}({});","export let CollapsibleTriggerDataAttributes = /*#__PURE__*/function (CollapsibleTriggerDataAttributes) {\n /**\n * Present when the collapsible panel is open.\n */\n CollapsibleTriggerDataAttributes[\"panelOpen\"] = \"data-panel-open\";\n return CollapsibleTriggerDataAttributes;\n}({});","import { CollapsiblePanelDataAttributes } from \"../collapsible/panel/CollapsiblePanelDataAttributes.mjs\";\nimport { CollapsibleTriggerDataAttributes } from \"../collapsible/trigger/CollapsibleTriggerDataAttributes.mjs\";\nconst PANEL_OPEN_HOOK = {\n [CollapsiblePanelDataAttributes.open]: ''\n};\nconst PANEL_CLOSED_HOOK = {\n [CollapsiblePanelDataAttributes.closed]: ''\n};\nexport const triggerOpenStateMapping = {\n open(value) {\n if (value) {\n return {\n [CollapsibleTriggerDataAttributes.panelOpen]: ''\n };\n }\n return null;\n }\n};\nexport const collapsibleOpenStateMapping = {\n open(value) {\n if (value) {\n return PANEL_OPEN_HOOK;\n }\n return PANEL_CLOSED_HOOK;\n }\n};","import { collapsibleOpenStateMapping as baseMapping } from \"../../utils/collapsibleOpenStateMapping.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nexport const collapsibleStateAttributesMapping = {\n ...baseMapping,\n ...transitionStatusMapping\n};","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useCollapsibleRoot } from \"./useCollapsibleRoot.mjs\";\nimport { CollapsibleRootContext } from \"./CollapsibleRootContext.mjs\";\nimport { collapsibleStateAttributesMapping } from \"./stateAttributesMapping.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n/**\n * Groups all parts of the collapsible.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsibleRoot = /*#__PURE__*/React.forwardRef(function CollapsibleRoot(componentProps, forwardedRef) {\n const {\n render,\n className,\n defaultOpen = false,\n disabled = false,\n onOpenChange: onOpenChangeProp,\n open,\n style,\n ...elementProps\n } = componentProps;\n const onOpenChange = useStableCallback(onOpenChangeProp);\n const collapsible = useCollapsibleRoot({\n open,\n defaultOpen,\n onOpenChange,\n disabled\n });\n const state = React.useMemo(() => ({\n open: collapsible.open,\n disabled: collapsible.disabled,\n transitionStatus: collapsible.transitionStatus\n }), [collapsible.open, collapsible.disabled, collapsible.transitionStatus]);\n const contextValue = React.useMemo(() => ({\n ...collapsible,\n onOpenChange,\n state\n }), [collapsible, onOpenChange, state]);\n const element = useRenderElement('div', componentProps, {\n state,\n ref: forwardedRef,\n props: elementProps,\n stateAttributesMapping: collapsibleStateAttributesMapping\n });\n return /*#__PURE__*/_jsx(CollapsibleRootContext.Provider, {\n value: contextValue,\n children: element\n });\n});\nif (process.env.NODE_ENV !== \"production\") CollapsibleRoot.displayName = \"CollapsibleRoot\";","'use client';\n\nimport * as React from 'react';\nimport { triggerOpenStateMapping } from \"../../utils/collapsibleOpenStateMapping.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useButton } from \"../../internals/use-button/index.mjs\";\nimport { useCollapsibleRootContext } from \"../root/CollapsibleRootContext.mjs\";\nconst stateAttributesMapping = {\n ...triggerOpenStateMapping,\n ...transitionStatusMapping\n};\n\n/**\n * A button that opens and closes the collapsible panel.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsibleTrigger = /*#__PURE__*/React.forwardRef(function CollapsibleTrigger(componentProps, forwardedRef) {\n const {\n panelId,\n open,\n handleTrigger,\n state,\n disabled: contextDisabled\n } = useCollapsibleRootContext();\n const {\n className,\n disabled = contextDisabled,\n render,\n nativeButton = true,\n style,\n ...elementProps\n } = componentProps;\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n focusableWhenDisabled: true,\n native: nativeButton\n });\n const element = useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [{\n 'aria-controls': open ? panelId : undefined,\n 'aria-expanded': open,\n onClick: handleTrigger\n }, elementProps, getButtonProps],\n stateAttributesMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") CollapsibleTrigger.displayName = \"CollapsibleTrigger\";","'use client';\n\nimport * as React from 'react';\nimport { addEventListener } from '@base-ui/utils/addEventListener';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useMergedRefs } from '@base-ui/utils/useMergedRefs';\nimport { AnimationFrame } from '@base-ui/utils/useAnimationFrame';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useValueAsRef } from '@base-ui/utils/useValueAsRef';\nimport { warn } from '@base-ui/utils/warn';\nimport { ownerWindow } from '@base-ui/utils/owner';\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { useAnimationsFinished } from \"../../internals/useAnimationsFinished.mjs\";\nimport { CollapsiblePanelDataAttributes } from \"./CollapsiblePanelDataAttributes.mjs\";\nconst EMPTY_DIMENSIONS = {\n height: undefined,\n width: undefined\n};\nexport function useCollapsiblePanel(parameters) {\n const {\n externalRef,\n hiddenUntilFound,\n id: idParam,\n keepMounted,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setOpen,\n transitionStatus\n } = parameters;\n const panelRef = React.useRef(null);\n const animationTypeRef = React.useRef(null);\n const [dimensions, setDimensionsUnwrapped] = React.useState(EMPTY_DIMENSIONS);\n const lastMeasuredDimensionsRef = React.useRef(EMPTY_DIMENSIONS);\n // `beforematch` should reveal the matched content immediately, so the next\n // open cycle skips author-defined motion once and then returns to normal.\n const shouldSkipNextOpenRef = React.useRef(false);\n // Keyframe mount animations on initially open panels cause a visible layout\n // shift during the server-rendered first paint, so suppress that first open\n // lifecycle until the panel has been closed once.\n const shouldPreventMountAnimationRef = React.useRef(open);\n // React.Activity tears down Effects while preserving state, so revealing an\n // already-open panel would otherwise replay its CSS keyframe open animation.\n const shouldPreventActivityResumeAnimationRef = React.useRef(false);\n // Some open paths intentionally bypass motion, but the shared root transition\n // status still advances asynchronously. Override the panel to idle so its data\n // attributes and dimension cleanup reflect the immediate open state.\n const [forcePanelIdle, setForcePanelIdle] = React.useState(false);\n const pendingTemporaryStyleRestoreRef = React.useRef(null);\n const mergedPanelRef = useMergedRefs(externalRef, panelRef);\n const latestOpenRef = useValueAsRef(open);\n // Only used to handle panel close\n const runOnceCloseAnimationsFinish = useAnimationsFinished(panelRef);\n const hidden = !open && !mounted;\n const panelTransitionStatus = forcePanelIdle ? 'idle' : transitionStatus;\n const shouldPreventOpenAnimation = open && (\n // These 2 refs are safe to read in render, they are only written from committed\n // layout/effect paths and gate one-shot motion suppression for the next open\n // lifecycle. They intentionally expose the last committed motion snapshot.\n shouldPreventMountAnimationRef.current || shouldPreventActivityResumeAnimationRef.current);\n const renderedDimensions = !open && mounted &&\n // These 2 refs are also safe to read in render, both hold the last committed\n // animation mode and measurement. This fallback only restores a previously\n // measured pixel size after the live dimensions state has been reset back to `auto`.\n animationTypeRef.current === 'css-animation' && dimensions.height === undefined && dimensions.width === undefined ? lastMeasuredDimensionsRef.current : dimensions;\n const shouldPersistHiddenTransitionStyles = hiddenUntilFound && hidden && animationTypeRef.current !== 'css-animation';\n\n // Most measured dimensions are reused later when CSS keyframe closes need a\n // pixel size after the rendered dimensions have been reset back to `auto`.\n // Passing `false` is only for clearing the current dimensions state.\n const setDimensions = useStableCallback((nextDimensions, shouldCacheMeasurement = true) => {\n if (shouldCacheMeasurement) {\n lastMeasuredDimensionsRef.current = nextDimensions;\n }\n setDimensionsUnwrapped(nextDimensions);\n });\n const restorePendingTemporaryStyle = useStableCallback(() => {\n pendingTemporaryStyleRestoreRef.current?.();\n pendingTemporaryStyleRestoreRef.current = null;\n });\n const setPendingTemporaryStyleRestore = useStableCallback(restore => {\n restorePendingTemporaryStyle();\n pendingTemporaryStyleRestoreRef.current = () => {\n pendingTemporaryStyleRestoreRef.current = null;\n restore();\n };\n });\n\n // React.Activity unmounts Effects while preserving component state. If that\n // teardown happens while an already-open keyframe panel is visible, remember\n // to suppress the replayed open animation on the next committed reveal.\n const markActivityResumeAnimationSuppressed = useStableCallback(() => {\n if (open && mounted && animationTypeRef.current === 'css-animation') {\n shouldPreventActivityResumeAnimationRef.current = true;\n }\n });\n useIsoLayoutEffect(() => {\n // `forcePanelIdle` is only a temporary override for open paths that skip\n // motion. Keep it active while the shared root still reports `starting`,\n // then drop it once the root transition state catches up.\n if (!forcePanelIdle || transitionStatus === 'starting') {\n return;\n }\n setForcePanelIdle(false);\n }, [forcePanelIdle, transitionStatus]);\n React.useEffect(() => {\n return () => {\n markActivityResumeAnimationSuppressed();\n restorePendingTemporaryStyle();\n };\n }, [markActivityResumeAnimationSuppressed, restorePendingTemporaryStyle]);\n useIsoLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n\n // `beforematch` can temporarily force a `0s` motion duration so the matched\n // content reveals immediately. Restore the authored duration before detecting\n // the next close animation type, otherwise that first close is misread as\n // \"no motion\" and the close transition or keyframe gets skipped.\n if (!open && pendingTemporaryStyleRestoreRef.current) {\n restorePendingTemporaryStyle();\n }\n const animationType = getAnimationType(panel, shouldPreventOpenAnimation);\n animationTypeRef.current = animationType;\n\n // Initially open keyframe panels skip their first paint animation to avoid\n // layout shift, but we still need to cache the expanded size so the first\n // close animation can start from pixels instead of `auto`.\n if (open && transitionStatus === 'idle' && shouldPreventMountAnimationRef.current && animationType === 'css-animation') {\n lastMeasuredDimensionsRef.current = getDimensions(panel);\n return undefined;\n }\n\n // Handle the opening pass: measure the expanded size and, when necessary,\n // neutralize author-defined motion so the panel can open immediately.\n if (open && transitionStatus === 'starting') {\n // `beforematch` opens should reveal the panel immediately so find-in-page\n // does not wait for the author-defined transition or animation to finish.\n const skipNextOpen = shouldSkipNextOpenRef.current;\n shouldSkipNextOpenRef.current = false;\n if (animationType === 'none') {\n setDimensions(getDimensions(panel));\n setForcePanelIdle(true);\n return undefined;\n }\n if (animationType === 'css-transition') {\n const restoreLayoutStyles = resetLayoutStyles(panel);\n setDimensions(getDimensions(panel));\n if (!skipNextOpen) {\n return restoreLayoutStyles;\n }\n const restoreTransitionDuration = setTemporaryStyle(panel, 'transition-duration', '0s');\n setPendingTemporaryStyleRestore(restoreTransitionDuration);\n setForcePanelIdle(true);\n return restoreLayoutStyles;\n }\n setDimensions(getDimensions(panel));\n const restoreAnimationName = setTemporaryStyle(panel, 'animation-name', 'none');\n if (!skipNextOpen) {\n restoreAnimationName();\n return undefined;\n }\n const restoreAnimationDuration = setTemporaryStyle(panel, 'animation-duration', '0s');\n restoreAnimationName();\n setPendingTemporaryStyleRestore(restoreAnimationDuration);\n setForcePanelIdle(true);\n return undefined;\n }\n\n // Capture the current size as soon as close is requested, before the\n // deferred ending phase applies closed styles. This keeps close transitions\n // starting from a measured pixel value, including interrupted opens.\n if (!open && mounted && (transitionStatus === 'idle' || transitionStatus === 'starting')) {\n shouldPreventMountAnimationRef.current = false;\n shouldPreventActivityResumeAnimationRef.current = false;\n if (animationType === 'none') {\n setDimensions(EMPTY_DIMENSIONS, false);\n setMounted(false);\n return undefined;\n }\n setDimensions(getDimensions(panel));\n return undefined;\n }\n if (transitionStatus !== 'ending') {\n return undefined;\n }\n\n // Reachable when `transitionStatus` already flipped to `ending` before this effect ran, so\n // the close branch above was skipped. Without motion there is nothing to wait for, so unmount\n // here instead of deferring to the animation-finished path below.\n if (animationType === 'none') {\n setMounted(false);\n return undefined;\n }\n const nextDimensions = getDimensions(panel);\n const hasMeasuredSize = nextDimensions.height > 0 || nextDimensions.width > 0;\n if (!hasMeasuredSize) {\n setMounted(false);\n return undefined;\n }\n setDimensions(nextDimensions);\n if (animationType === 'css-animation') {\n const restoreAnimationName = setTemporaryStyle(panel, 'animation-name', 'none');\n restoreAnimationName();\n }\n return undefined;\n }, [mounted, open, restorePendingTemporaryStyle, setDimensions, setMounted, setPendingTemporaryStyleRestore, shouldPreventOpenAnimation, transitionStatus]);\n useOpenChangeComplete({\n enabled: open && mounted && panelTransitionStatus === 'idle',\n open: true,\n ref: panelRef,\n onComplete() {\n // `useOpenChangeComplete` only aborts from its effect cleanup, which React runs in the\n // post-paint passive flush. An animation's `finished` microtask can resolve after the render\n // that set `open` to `false` but before that cleanup, so re-check the latest value here.\n // Clearing the measured size in that window would make the close transition start from\n // `height: 0` instead of the expanded pixel height.\n if (!open) {\n return;\n }\n setDimensions(EMPTY_DIMENSIONS, false);\n }\n });\n\n // Closing panels need extra sequencing beyond `useOpenChangeComplete`.\n // This passive effect runs after the `ending` render has committed, so\n // `[data-ending-style]` is already present. Chrome can still register the\n // exit transition one frame later when an Accordion closes one item while\n // opening another, so wait one frame before watching animations.\n // See https://github.com/mui/base-ui/issues/3099\n React.useEffect(() => {\n if (open || !mounted || panelTransitionStatus !== 'ending') {\n return undefined;\n }\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n const abortController = new AbortController();\n let endingStyleFrame = -1;\n function handleComplete() {\n // Same post-paint race as the `useOpenChangeComplete` callback above, except `open` is\n // captured by this effect's closure and always `false` here, so read the latest value from\n // a ref. Unmounting a panel that has already reopened would drop it from the DOM.\n if (latestOpenRef.current) {\n return;\n }\n setMounted(false);\n setDimensions(EMPTY_DIMENSIONS, false);\n }\n endingStyleFrame = AnimationFrame.request(() => {\n runOnceCloseAnimationsFinish(handleComplete, abortController.signal);\n });\n return () => {\n AnimationFrame.cancel(endingStyleFrame);\n abortController.abort();\n };\n }, [latestOpenRef, mounted, open, panelTransitionStatus, runOnceCloseAnimationsFinish, setDimensions, setMounted]);\n useIsoLayoutEffect(() => {\n const panel = panelRef.current;\n if (!panel || !hiddenUntilFound || !hidden) {\n return;\n }\n\n // React only supports a boolean for the `hidden` attribute and forces\n // legit string values to booleans so we have to force it back in the DOM\n // when necessary: https://github.com/react/react/issues/24740\n panel.setAttribute('hidden', 'until-found');\n }, [hidden, hiddenUntilFound]);\n React.useEffect(function registerBeforeMatchListener() {\n const panel = panelRef.current;\n if (!panel) {\n return undefined;\n }\n function handleBeforeMatch(event) {\n const eventDetails = createChangeEventDetails(REASONS.none, event);\n onOpenChange(true, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n shouldSkipNextOpenRef.current = true;\n setOpen(true);\n }\n return addEventListener(panel, 'beforematch', handleBeforeMatch);\n }, [onOpenChange, setOpen]);\n const shouldRender = keepMounted || hiddenUntilFound || mounted || open;\n return {\n height: renderedDimensions.height,\n props: {\n ...(shouldPersistHiddenTransitionStyles ? {\n [CollapsiblePanelDataAttributes.startingStyle]: ''\n } : undefined),\n hidden,\n id: idParam\n },\n ref: mergedPanelRef,\n shouldPreventOpenAnimation,\n shouldRender,\n transitionStatus: panelTransitionStatus,\n width: renderedDimensions.width\n };\n}\nfunction getDimensions(element) {\n return {\n height: element.scrollHeight,\n width: element.scrollWidth\n };\n}\nfunction getAnimationType(element, hasSuppressedMountAnimation) {\n const panelStyles = ownerWindow(element).getComputedStyle(element);\n const hasAnimation = (panelStyles.animationName.split(',').map(name => name.trim()).some(name => name !== '' && name !== 'none') || hasSuppressedMountAnimation) && hasNonZeroDuration(panelStyles.animationDuration);\n const hasTransition = hasNonZeroDuration(panelStyles.transitionDuration);\n if (hasAnimation && hasTransition) {\n /* istanbul ignore else -- `process.env.NODE_ENV` is a build-time constant under test */\n if (process.env.NODE_ENV !== 'production') {\n warn('CSS transitions and CSS animations both detected on Collapsible or Accordion panel.', 'Only one of either animation type should be used.');\n }\n return 'css-transition';\n }\n if (hasTransition) {\n return 'css-transition';\n }\n if (hasAnimation) {\n return 'css-animation';\n }\n return 'none';\n}\nfunction hasNonZeroDuration(value) {\n return value.split(',').map(part => part.trim()).some(part => part !== '' && Number.parseFloat(part) > 0);\n}\n\n/**\n * Temporarily overrides an inline style property and returns a cleanup that\n * restores the previous inline value and priority.\n * @param element - The element whose inline style should be updated.\n * @param property - The CSS property name to override.\n * @param value - The temporary value to assign.\n * @returns A cleanup function that restores the original inline style state.\n */\nfunction setTemporaryStyle(element, property, value) {\n const previousValue = element.style.getPropertyValue(property);\n const previousPriority = element.style.getPropertyPriority(property);\n element.style.setProperty(property, value);\n return () => {\n if (previousValue === '') {\n element.style.removeProperty(property);\n return;\n }\n element.style.setProperty(property, previousValue, previousPriority);\n };\n}\n\n/**\n * Temporarily resets inline alignment styles that can distort scroll-based\n * size measurements, then restores them on the next animation frame.\n * @param element - The panel element being measured.\n * @returns A cleanup function that cancels the scheduled restore and reapplies\n * the original inline layout styles immediately.\n */\nfunction resetLayoutStyles(element) {\n const originalLayoutStyles = {\n 'justify-content': element.style.justifyContent,\n 'align-items': element.style.alignItems,\n 'align-content': element.style.alignContent,\n 'justify-items': element.style.justifyItems\n };\n Object.keys(originalLayoutStyles).forEach(key => {\n element.style.setProperty(key, 'initial', 'important');\n });\n function restoreLayoutStyles() {\n Object.entries(originalLayoutStyles).forEach(([key, value]) => {\n if (value === '') {\n element.style.removeProperty(key);\n return;\n }\n element.style.setProperty(key, value);\n });\n }\n const frame = AnimationFrame.request(restoreLayoutStyles);\n return () => {\n AnimationFrame.cancel(frame);\n restoreLayoutStyles();\n };\n}","export let CollapsiblePanelCssVars = /*#__PURE__*/function (CollapsiblePanelCssVars) {\n /**\n * The collapsible panel's height.\n * @type {number}\n */\n CollapsiblePanelCssVars[\"collapsiblePanelHeight\"] = \"--collapsible-panel-height\";\n /**\n * The collapsible panel's width.\n * @type {number}\n */\n CollapsiblePanelCssVars[\"collapsiblePanelWidth\"] = \"--collapsible-panel-width\";\n return CollapsiblePanelCssVars;\n}({});","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { warn } from '@base-ui/utils/warn';\nimport { resolveStyle } from \"../../utils/resolveStyle.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useCollapsibleRootContext } from \"../root/CollapsibleRootContext.mjs\";\nimport { collapsibleStateAttributesMapping } from \"../root/stateAttributesMapping.mjs\";\nimport { useCollapsiblePanel } from \"./useCollapsiblePanel.mjs\";\nimport { CollapsiblePanelCssVars } from \"./CollapsiblePanelCssVars.mjs\";\n/**\n * A panel with the collapsible contents.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Collapsible](https://base-ui.com/react/components/collapsible)\n */\nexport const CollapsiblePanel = /*#__PURE__*/React.forwardRef(function CollapsiblePanel(componentProps, forwardedRef) {\n const {\n className,\n hiddenUntilFound: hiddenUntilFoundProp,\n keepMounted: keepMountedProp,\n render,\n id: idProp,\n style,\n ...elementProps\n } = componentProps;\n\n /* istanbul ignore else -- `process.env.NODE_ENV` is a build-time constant under test */\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (hiddenUntilFoundProp && keepMountedProp === false) {\n warn('The `keepMounted={false}` prop on `Collapsible.Panel` is ignored when `hiddenUntilFound` is enabled, since the panel must remain mounted while closed.');\n }\n }, [hiddenUntilFoundProp, keepMountedProp]);\n }\n const {\n defaultPanelId,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setPanelIdState,\n setOpen,\n state,\n transitionStatus\n } = useCollapsibleRootContext();\n const hiddenUntilFound = hiddenUntilFoundProp ?? false;\n const keepMounted = keepMountedProp ?? false;\n const registeredId = idProp || undefined;\n const id = registeredId ?? defaultPanelId;\n useIsoLayoutEffect(() => {\n setPanelIdState(currentId => registeredId ?? (currentId === null ? undefined : currentId));\n return () => {\n setPanelIdState(currentId => currentId === registeredId ? null : currentId);\n };\n }, [registeredId, setPanelIdState]);\n const {\n height,\n props,\n ref,\n shouldPreventOpenAnimation,\n shouldRender,\n transitionStatus: panelTransitionStatus,\n width\n } = useCollapsiblePanel({\n externalRef: forwardedRef,\n hiddenUntilFound,\n id,\n keepMounted,\n mounted,\n onOpenChange,\n open,\n setMounted,\n setOpen,\n transitionStatus\n });\n const panelState = {\n ...state,\n transitionStatus: panelTransitionStatus\n };\n const resolvedStyle = resolveStyle(style, panelState);\n const element = useRenderElement('div', {\n ...componentProps,\n style: undefined\n }, {\n state: panelState,\n ref,\n props: [props, {\n style: {\n [CollapsiblePanelCssVars.collapsiblePanelHeight]: height === undefined ? 'auto' : `${height}px`,\n [CollapsiblePanelCssVars.collapsiblePanelWidth]: width === undefined ? 'auto' : `${width}px`\n }\n }, elementProps, resolvedStyle ? {\n style: resolvedStyle\n } : undefined,\n // Resolve the public `style` prop so temporary `animationName: 'none'`\n // can still win after user's inline styles have been merged.\n shouldPreventOpenAnimation ? {\n style: {\n animationName: 'none'\n }\n } : undefined],\n stateAttributesMapping: collapsibleStateAttributesMapping\n });\n if (!shouldRender) {\n return null;\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") CollapsiblePanel.displayName = \"CollapsiblePanel\";","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-panel.tsx\nconst TRCollapsiblePanel = createComponentPart(Collapsible.Panel, \"tr-collapsible-content\");\n//#endregion\nexport { TRCollapsiblePanel };\n\n//# sourceMappingURL=collapsible-panel.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-root.tsx\nconst TRCollapsibleRoot = createComponentPart(Collapsible.Root, \"tr-collapsible\");\n//#endregion\nexport { TRCollapsibleRoot };\n\n//# sourceMappingURL=collapsible-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Collapsible } from \"@base-ui/react/collapsible\";\n//#region src/components/collapsible/collapsible-trigger.tsx\nconst TRCollapsibleTrigger = createComponentPart(Collapsible.Trigger, \"tr-collapsible-summary\");\n//#endregion\nexport { TRCollapsibleTrigger };\n\n//# sourceMappingURL=collapsible-trigger.js.map","import { TRCollapsiblePanel } from \"./collapsible-panel.js\";\nimport { TRCollapsibleRoot } from \"./collapsible-root.js\";\nimport { TRCollapsibleTrigger } from \"./collapsible-trigger.js\";\n//#region src/components/collapsible/index.tsx\nconst TRCollapsible = {\n\tRoot: TRCollapsibleRoot,\n\tTrigger: TRCollapsibleTrigger,\n\tPanel: TRCollapsiblePanel\n};\n//#endregion\nexport { TRCollapsible, TRCollapsiblePanel, TRCollapsibleRoot, TRCollapsibleTrigger };\n\n//# sourceMappingURL=index.js.map","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCollapsible } from '@tinyrack/ui/components/collapsible';\nimport type { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport type { TotpSetupData } from '#frontend/features/totp/use-totp-setup.ts';\n\nexport interface QrStepProps {\n setupData: TotpSetupData;\n onNext: () => void;\n additionalActions?: ReactNode;\n className?: string;\n}\n\nexport function QrStep({\n setupData,\n onNext,\n additionalActions,\n className = '',\n}: QrStepProps) {\n const { t } = useTranslation();\n\n return (\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <p className=\"text-center text-tinyrack-sm text-tinyrack-text-muted\">\n {t('setupTotp.qrDescription')}\n </p>\n\n {/*\n The QR sits on its own light surface with padding for the quiet zone.\n Rendered straight onto the canvas it inherited the dark theme's\n background, and scanners need the margin and the contrast to lock on.\n */}\n <div className=\"flex justify-center\">\n <div className=\"rounded-tinyrack-lg border border-tinyrack-border bg-tinyrack-surface p-tinyrack-lg\">\n <img\n alt=\"TOTP QR Code\"\n className=\"block size-tinyrack-measure-sm\"\n src={setupData.qr_code}\n />\n </div>\n </div>\n\n <TRCollapsible.Root>\n <TRCollapsible.Trigger>\n {t('setupTotp.manualEntry')}\n </TRCollapsible.Trigger>\n <TRCollapsible.Panel>\n <code className=\"mt-tinyrack-xs block break-all rounded-tinyrack-sm bg-tinyrack-surface-muted p-tinyrack-sm text-tinyrack-sm text-tinyrack-text\">\n {setupData.secret}\n </code>\n </TRCollapsible.Panel>\n </TRCollapsible.Root>\n\n <TRButton\n className=\"w-full\"\n data-testid=\"totp-qr-next\"\n intent=\"primary\"\n onClick={onNext}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupTotp.next')}\n </TRButton>\n\n {additionalActions}\n </div>\n );\n}\n","import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n confirmTotpSetupMutationOptions,\n startTotpSetupMutationOptions,\n type TotpConfirmResponse,\n type TotpSetupResponse,\n type TotpSetupVerifyResponse,\n verifyTotpMutationOptions,\n} from '#frontend/queries/totp.ts';\n\nexport type TotpSetupStep = 'loading' | 'qr' | 'verify' | 'recovery' | 'error';\n\nexport interface TotpSetupData {\n qr_code: string;\n secret: string;\n}\n\nexport interface UseTotpSetupOptions {\n onSetupSuccess?: (data: TotpSetupResponse) => void;\n onSetupError?: (error: Error) => void;\n onVerifySuccess?: (data: TotpSetupVerifyResponse) => void;\n onVerifyError?: (error: Error) => void;\n onConfirmSuccess?: (data: TotpConfirmResponse) => void;\n onConfirmError?: (error: Error) => void;\n autoStart?: boolean;\n}\n\nexport interface UseTotpSetupReturn {\n step: TotpSetupStep;\n setupData: TotpSetupResponse | null;\n recoveryCodes: string[];\n isSetupPending: boolean;\n isVerifyPending: boolean;\n isConfirmPending: boolean;\n isPending: boolean;\n setupError: Error | null;\n verifyError: Error | null;\n confirmError: Error | null;\n startSetup: () => void;\n verify: (code: string) => Promise<TotpSetupVerifyResponse>;\n goToQr: () => void;\n goToVerify: () => void;\n confirmRecoveryCodes: () => Promise<TotpConfirmResponse>;\n reset: () => void;\n}\n\nexport function useTotpSetup(\n options: UseTotpSetupOptions = {},\n): UseTotpSetupReturn {\n const {\n onSetupSuccess,\n onSetupError,\n onVerifySuccess,\n onVerifyError,\n onConfirmSuccess,\n onConfirmError,\n autoStart = false,\n } = options;\n\n const queryClient = useQueryClient();\n const [step, setStep] = useState<TotpSetupStep>(autoStart ? 'loading' : 'qr');\n const [setupData, setSetupData] = useState<TotpSetupResponse | null>(null);\n const [recoveryCodes, setRecoveryCodes] = useState<string[]>([]);\n const setupInitiatedRef = useRef(false);\n\n const setupMutation = useMutation({\n ...startTotpSetupMutationOptions,\n onSuccess: (data) => {\n setSetupData(data);\n setStep('qr');\n onSetupSuccess?.(data);\n },\n onError: (error) => {\n setStep('error');\n onSetupError?.(error);\n },\n });\n\n const verifyMutation = useMutation({\n ...verifyTotpMutationOptions,\n onSuccess: (data) => {\n // Do NOT invalidate session here - TOTP is not fully enabled yet\n setRecoveryCodes(data.recovery_codes);\n setStep('recovery');\n onVerifySuccess?.(data);\n },\n onError: (error) => {\n onVerifyError?.(error);\n },\n });\n\n const confirmMutation = useMutation({\n ...confirmTotpSetupMutationOptions,\n onSuccess: (data) => {\n // Now TOTP is fully enabled, invalidate session\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n onConfirmSuccess?.(data);\n },\n onError: (error) => {\n onConfirmError?.(error);\n },\n });\n\n const startSetup = useCallback(() => {\n setupInitiatedRef.current = true;\n setStep('loading');\n setupMutation.mutate();\n }, [setupMutation]);\n\n const verify = useCallback(\n async (code: string) => {\n return verifyMutation.mutateAsync({ code });\n },\n [verifyMutation],\n );\n\n const goToQr = useCallback(() => {\n setStep('qr');\n }, []);\n\n const goToVerify = useCallback(() => {\n setStep('verify');\n }, []);\n\n const confirmRecoveryCodes = useCallback(async () => {\n return confirmMutation.mutateAsync();\n }, [confirmMutation]);\n\n const reset = useCallback(() => {\n setStep(autoStart ? 'loading' : 'qr');\n setSetupData(null);\n setRecoveryCodes([]);\n setupInitiatedRef.current = false;\n setupMutation.reset();\n verifyMutation.reset();\n confirmMutation.reset();\n }, [autoStart, setupMutation, verifyMutation, confirmMutation]);\n\n // Auto start setup on mount if enabled\n useEffect(() => {\n if (autoStart && !setupInitiatedRef.current && step === 'loading') {\n setupInitiatedRef.current = true;\n setupMutation.mutate();\n }\n }, [autoStart, step, setupMutation]);\n\n return {\n step,\n setupData,\n recoveryCodes,\n isSetupPending: setupMutation.isPending,\n isVerifyPending: verifyMutation.isPending,\n isConfirmPending: confirmMutation.isPending,\n isPending:\n setupMutation.isPending ||\n verifyMutation.isPending ||\n confirmMutation.isPending,\n setupError: setupMutation.error,\n verifyError: verifyMutation.error,\n confirmError: confirmMutation.error,\n startSetup,\n verify,\n goToQr,\n goToVerify,\n confirmRecoveryCodes,\n reset,\n };\n}\n"],"x_google_ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{J as e,Z as t,b as n}from"./createLucideIcon-BPpAIXR_.js";import{w as r}from"./shell-header-bar-JcFhS7mb.js";var i=t(e(),1);function a(e,t,a,s=!0,c){let[l,u]=i.useState(),d=r(c?`${c}-label`:void 0),f=e??t??l;return n(()=>{let n=e||t||!s?void 0:o(a.current,d);l!==n&&u(n)}),f}function o(e,t){let n=s(e);if(n)return!n.id&&t&&(n.id=t),n.id||void 0}function s(e){if(!e)return;let t=e.parentElement;if(t&&t.tagName===`LABEL`)return t;let n=e.id;if(n){let t=e.nextElementSibling;if(t&&t.htmlFor===n)return t}let r=e.labels;return r&&r[0]}export{a as t};
2
- //# sourceMappingURL=useAriaLabelledBy-IIwdHUss.js.map
@@ -1,2 +0,0 @@
1
- import{J as e,Z as t}from"./createLucideIcon-BPpAIXR_.js";import{Br as n,Fr as r,Or as i,Sr as a,Ur as o,jr as s,zr as c}from"./config-DTQCUlfZ.js";import{r as l}from"./mutationOptions-DyYFUbyn.js";var u=class extends o{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),c(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&s(t.mutationKey)!==s(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??l();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){i.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},d=t(e(),1);function f(e,t){let o=a(t),[s]=d.useState(()=>new u(o,e));d.useEffect(()=>{s.setOptions(e)},[s,e]);let c=d.useSyncExternalStore(d.useCallback(e=>s.subscribe(i.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),l=d.useCallback((e,t)=>{s.mutate(e,t).catch(r)},[s]);if(c.error&&n(s.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:l,mutateAsync:c.mutate}}export{f as t};
2
- //# sourceMappingURL=useMutation-BWZ0G4Td.js.map
@@ -1,2 +0,0 @@
1
- import{Cr as e}from"./config-DTQCUlfZ.js";import{rt as t}from"./shell-header-bar-JcFhS7mb.js";function n(n,r){return t(n,e,r)}export{n as t};
2
- //# sourceMappingURL=useQuery-Ccv_nzQl.js.map