@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-admin-selection-D2b7jnym.js","names":["__iconNode"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/arrow-down.mjs","../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/arrow-up.mjs","../../../frontend/src/features/admin/admin-data-table.tsx","../../../frontend/src/features/admin/use-admin-selection.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 [\"path\", { d: \"M12 5v14\", key: \"s699le\" }],\n [\"path\", { d: \"m19 12-7 7-7-7\", key: \"1idqje\" }]\n];\nconst ArrowDown = createLucideIcon(\"arrow-down\", __iconNode);\n\nexport { __iconNode, ArrowDown as default };\n//# sourceMappingURL=arrow-down.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 [\"path\", { d: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n];\nconst ArrowUp = createLucideIcon(\"arrow-up\", __iconNode);\n\nexport { __iconNode, ArrowUp as default };\n//# sourceMappingURL=arrow-up.mjs.map\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRForm } from '@tinyrack/ui/components/form';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRTable } from '@tinyrack/ui/components/table';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport {\n ArrowDownIcon,\n ArrowUpIcon,\n CheckIcon,\n ChevronDownIcon,\n SearchIcon,\n XIcon,\n} from 'lucide-react';\nimport type { FormEvent, ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nexport function AdminListToolbar({\n title,\n total,\n query,\n onQueryChange,\n onSearch,\n onCreate,\n children,\n}: {\n title: string;\n total: number;\n query: string;\n onQueryChange: (value: string) => void;\n onSearch: () => void;\n onCreate?: (() => void) | undefined;\n children?: ReactNode;\n}) {\n const { t } = useTranslation();\n const submit = (event: FormEvent) => {\n event.preventDefault();\n onSearch();\n };\n return (\n // tinyrack-check-ignore-next-line components/no-native-text -- Structural list toolbar; visible descendants use design-system components.\n <div\n className=\"flex shrink-0 flex-col bg-tinyrack-surface\"\n data-testid=\"admin-list-toolbar\"\n >\n {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural toolbar row; visible descendants use design-system typography. */}\n <div className=\"flex items-center justify-between gap-tinyrack-md py-tinyrack-md\">\n <div className=\"flex min-w-0 items-baseline gap-tinyrack-sm\">\n <TRText as=\"h1\" variant=\"headingMd\" weight=\"heading\">\n {title}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t('admin.table.total', { count: total })}\n </TRText>\n </div>\n {onCreate ? (\n <TRButton\n intent=\"primary\"\n onClick={onCreate}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.table.create')}\n </TRButton>\n ) : null}\n </div>\n <TRForm\n className=\"flex flex-wrap items-center gap-tinyrack-sm py-tinyrack-sm\"\n onSubmit={submit}\n >\n <TRInput.Group className=\"w-full flex-none sm:w-auto sm:min-w-tinyrack-measure-sm sm:flex-1\">\n <TRInput.Adornment>\n <SearchIcon aria-hidden />\n </TRInput.Adornment>\n <TRInput\n aria-label={t('admin.table.search')}\n onChange={(event) => onQueryChange(event.target.value)}\n placeholder={t('admin.table.searchPlaceholder')}\n uiSize=\"sm\"\n value={query}\n />\n </TRInput.Group>\n {children}\n <TRButton appearance=\"outline\" type=\"submit\" uiSize=\"sm\">\n {t('admin.table.search')}\n </TRButton>\n </TRForm>\n </div>\n );\n}\n\nexport function AdminTableFrame({ children }: { children: ReactNode }) {\n return (\n // tinyrack-check-ignore-next-line components/no-native-text -- Structural table frame; its caller owns descendant typography.\n <div\n className=\"flex min-h-0 w-full min-w-0 flex-1 flex-col\"\n data-layout=\"table\"\n >\n {children}\n </div>\n );\n}\n\nexport function AdminTable({\n children,\n label,\n}: {\n children: ReactNode;\n label: string;\n}) {\n return (\n <TRTable.Root\n aria-label={label}\n containerClassName=\"min-h-0 max-w-full flex-1 overflow-auto\"\n density=\"compact\"\n layout=\"wide\"\n >\n {children}\n </TRTable.Root>\n );\n}\n\nexport function AdminSelectAll({\n checked,\n indeterminate,\n onChange,\n}: {\n checked: boolean;\n indeterminate: boolean;\n onChange: (checked: boolean) => void;\n}) {\n const { t } = useTranslation();\n return (\n <TRCheckbox.Root\n aria-label={t('admin.selection.page')}\n checked={checked}\n indeterminate={indeterminate}\n onCheckedChange={(value) => onChange(value === true)}\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n );\n}\n\nexport function AdminRowCheckbox({\n checked,\n label,\n onChange,\n}: {\n checked: boolean;\n label: string;\n onChange: (checked: boolean) => void;\n}) {\n return (\n <TRCheckbox.Root\n aria-label={label}\n checked={checked}\n onCheckedChange={(value) => onChange(value === true)}\n uiSize=\"md\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n );\n}\n\nexport function AdminStickySelectCell({\n children,\n header = false,\n selected = false,\n}: {\n children: ReactNode;\n header?: boolean;\n selected?: boolean;\n}) {\n const Component = header ? TRTable.Head : TRTable.Cell;\n return (\n <Component\n className={`sticky left-0 z-tinyrack-component-raised w-tinyrack-measure-xs ${selected ? 'admin-sticky-selected' : header ? 'bg-tinyrack-surface-muted' : 'bg-tinyrack-surface'}`}\n >\n {children}\n </Component>\n );\n}\n\nexport function AdminStickyIdentityCell({\n children,\n header = false,\n selected = false,\n}: {\n children: ReactNode;\n header?: boolean;\n selected?: boolean;\n}) {\n const Component = header ? TRTable.Head : TRTable.Cell;\n return (\n <Component\n className={`sticky left-tinyrack-measure-xs z-tinyrack-component-raised min-w-tinyrack-measure-lg ${selected ? 'admin-sticky-selected' : header ? 'bg-tinyrack-surface-muted' : 'bg-tinyrack-surface'}`}\n >\n {children}\n </Component>\n );\n}\n\nexport function AdminStickyActionCell({\n children,\n header = false,\n selected = false,\n}: {\n children: ReactNode;\n header?: boolean;\n selected?: boolean;\n}) {\n const Component = header ? TRTable.Head : TRTable.Cell;\n return (\n <Component\n className={`sticky right-0 z-tinyrack-component-raised text-right ${selected ? 'admin-sticky-selected' : header ? 'bg-tinyrack-surface-muted' : 'bg-tinyrack-surface'}`}\n >\n {children}\n </Component>\n );\n}\n\nexport function AdminSortButton({\n label,\n direction,\n onClick,\n}: {\n label: string;\n direction?: 'asc' | 'desc' | undefined;\n onClick: () => void;\n}) {\n const Icon = direction === 'desc' ? ArrowDownIcon : ArrowUpIcon;\n return (\n <TRButton appearance=\"ghost\" onClick={onClick} type=\"button\" uiSize=\"sm\">\n {label}\n {direction ? <Icon aria-hidden className=\"size-tinyrack-md\" /> : null}\n </TRButton>\n );\n}\n\nexport function AdminFilterSelect({\n label,\n value,\n options,\n onChange,\n}: {\n label: string;\n value: string;\n options: Array<[string, string]>;\n onChange: (value: string) => void;\n}) {\n return (\n <TRSelect.Root\n onValueChange={(nextValue) => {\n if (typeof nextValue === 'string') onChange(nextValue);\n }}\n value={value}\n >\n <TRSelect.Trigger aria-label={label} uiSize=\"sm\">\n <TRSelect.Value>\n {options.find(([option]) => option === value)?.[1] ?? value}\n </TRSelect.Value>\n <TRSelect.Icon>\n <ChevronDownIcon aria-hidden />\n </TRSelect.Icon>\n </TRSelect.Trigger>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {options.map(([option, text]) => (\n <TRSelect.Item key={option} value={option}>\n <TRSelect.ItemText>{text}</TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon aria-hidden />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Root>\n );\n}\n\nexport function AdminPagination({\n page,\n pageSize,\n total,\n onPageChange,\n onPageSizeChange,\n}: {\n page: number;\n pageSize: number;\n total: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (pageSize: number) => void;\n}) {\n const { t } = useTranslation();\n const lastPage = Math.max(Math.ceil(total / pageSize), 1);\n return (\n <div className=\"flex shrink-0 items-center justify-between gap-tinyrack-md py-tinyrack-sm\">\n <AdminFilterSelect\n label={t('admin.table.pageSize')}\n onChange={(value) => onPageSizeChange(Number(value))}\n options={['20', '50', '100'].map((size) => [size, size])}\n value={String(pageSize)}\n />\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TRButton\n appearance=\"ghost\"\n disabled={page <= 1}\n onClick={() => onPageChange(page - 1)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.table.previous')}\n </TRButton>\n <TRText color=\"muted\" variant=\"caption\">\n {t('admin.table.page', { page, total: lastPage })}\n </TRText>\n <TRButton\n appearance=\"ghost\"\n disabled={page >= lastPage}\n onClick={() => onPageChange(page + 1)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.table.next')}\n </TRButton>\n </div>\n </div>\n );\n}\n\nexport function AdminBulkBar({\n selected,\n total,\n filterSelected,\n canExpand,\n onExpand,\n onClear,\n onActivate,\n onDeactivate,\n pending,\n}: {\n selected: number;\n total: number;\n filterSelected: boolean;\n canExpand: boolean;\n onExpand: () => void;\n onClear: () => void;\n onActivate: () => void;\n onDeactivate: () => void;\n pending: boolean;\n}) {\n const { t } = useTranslation();\n return (\n // tinyrack-check-ignore-next-line components/no-native-text -- Structural bulk-action bar; all visible copy uses design-system components.\n <div\n className=\"fixed right-tinyrack-lg bottom-tinyrack-lg z-tinyrack-dropdown flex max-w-[calc(100vw-var(--tinyrack-space-lg)*2)] flex-wrap items-center gap-tinyrack-sm rounded-tinyrack-lg bg-tinyrack-surface px-tinyrack-lg py-tinyrack-sm shadow-tinyrack-overlay\"\n data-testid=\"admin-bulk-bar\"\n >\n <TRText variant=\"bodySm\" weight=\"strong\">\n {t('admin.selection.selected', {\n count: filterSelected ? total : selected,\n })}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t(\n filterSelected\n ? 'admin.selection.filterScope'\n : 'admin.selection.pageScope',\n )}\n </TRText>\n {canExpand && !filterSelected ? (\n <TRButton\n appearance=\"ghost\"\n onClick={onExpand}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.selection.selectAll', { count: total })}\n </TRButton>\n ) : null}\n <TRButton\n disabled={pending}\n onClick={onActivate}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.selection.activate')}\n </TRButton>\n <TRButton\n disabled={pending}\n intent=\"danger\"\n onClick={onDeactivate}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.selection.deactivate')}\n </TRButton>\n <TRButton\n appearance=\"ghost\"\n aria-label={t('admin.selection.clear')}\n onClick={onClear}\n type=\"button\"\n uiSize=\"sm\"\n >\n <XIcon aria-hidden />\n </TRButton>\n </div>\n );\n}\n","import { useMemo, useState } from 'react';\n\ntype ExplicitSelection = { kind: 'ids'; ids: Set<string> };\ntype FilterSelection = { kind: 'filter' };\nexport type AdminSelection = ExplicitSelection | FilterSelection;\n\nexport function useAdminSelection(pageIds: string[]) {\n const [selection, setSelection] = useState<AdminSelection>(() => ({\n kind: 'ids',\n ids: new Set(),\n }));\n\n const selectedOnPage = useMemo(() => {\n if (selection.kind === 'filter') return pageIds.length;\n return pageIds.filter((id) => selection.ids.has(id)).length;\n }, [pageIds, selection]);\n\n const clear = () => setSelection({ kind: 'ids', ids: new Set() });\n\n const togglePage = (checked: boolean) => {\n setSelection({\n kind: 'ids',\n ids: checked ? new Set(pageIds) : new Set(),\n });\n };\n\n const toggleOne = (id: string, checked: boolean) => {\n setSelection((current) => {\n const next =\n current.kind === 'filter' ? new Set(pageIds) : new Set(current.ids);\n if (checked) next.add(id);\n else next.delete(id);\n return { kind: 'ids', ids: next };\n });\n };\n\n return {\n selection,\n selectedOnPage,\n allOnPage: pageIds.length > 0 && selectedOnPage === pageIds.length,\n someOnPage: selectedOnPage > 0 && selectedOnPage < pageIds.length,\n selectedCount: selection.kind === 'ids' ? selection.ids.size : undefined,\n isSelected: (id: string) =>\n selection.kind === 'filter' || selection.ids.has(id),\n selectFilter: () => setSelection({ kind: 'filter' }),\n clear,\n togglePage,\n toggleOne,\n };\n}\n"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import{C as e,F as t,X as n,Z as r,c as i,et as a,h as o,i as s,l as c,m as l,n as u,s as d,t as f,w as p,x as m}from"./createLucideIcon-D-yizrWN.js";import{$ as h,Ar as g,N as _,On as v,R as y,St as b,at as x,f as S,vt as C,xn as w,xt as T,yn as E,yt as D}from"./config-C18-l7z7.js";import{t as O}from"./useMutation-DqIIIiBW.js";import{G as k,xt as A,z as j}from"./shell-header-bar-CdOEWmCT.js";import{t as M}from"./triangle-alert-DATO9o3k.js";import{c as N,o as P}from"./zod-Dszyrytb.js";import{E as F,W as I}from"./index-lTEyHSus.js";import{t as L}from"./alert-D3aaK-_3.js";import{t as R}from"./checkbox-DTPGfvmq.js";import{t as ee}from"./form-sJw-V9wb.js";import{t as z}from"./field-CsrUbl__.js";import{r as B,t as V}from"./standard-schema-C50nwAaQ.js";import{i as H,s as U,t as te}from"./totp-BhElob6P.js";import{t as ne}from"./pin-input-DhsRO4Ei.js";var re=f(`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`}]]),ie=f(`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=a(r(),1),G=n();function ae({recoveryCodes:e,onConfirm:t,isLoading:n=!1,className:r=``}){let{t:i}=s(),a=S.useToastManager(),[o,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)(u,{as:`p`,color:`muted`,variant:`bodySm`,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)(I,{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)(L,{icon:M,type:`warning`,children:i(`setupTotp.recoveryCodes.warning`)}),(0,G.jsxs)(d,{appearance:`outline`,className:`w-full gap-tinyrack-sm`,intent:`neutral`,onClick:l,type:`button`,uiSize:`lg`,children:[(0,G.jsx)(re,{"aria-hidden":!0,className:`size-tinyrack-lg`}),i(`setupTotp.recoveryCodes.copy`)]}),(0,G.jsx)(z.Root,{children:(0,G.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,G.jsx)(R.Root,{checked:o,"data-testid":`recovery-codes-confirm`,disabled:n,onCheckedChange:e=>c(e===!0),uiSize:`lg`,children:(0,G.jsx)(R.Indicator,{})}),(0,G.jsx)(z.Label,{className:`cursor-pointer`,children:i(`setupTotp.recoveryCodes.confirmCheckbox`)})]})}),(0,G.jsx)(d,{className:`w-full`,"data-testid":`recovery-codes-submit`,disabled:!o||n,intent:`primary`,loading:n,onClick:t,type:`button`,uiSize:`lg`,children:i(`setupTotp.recoveryCodes.confirm`)})]})}function oe({onSubmit:e,onBack:t,isPending:n,invalidMessage:r,submitLabel:i,pendingText:a,backLabel:o,className:c=``}){let{t:l}=s(),u=(0,W.useRef)(null),{setValue:f,setError:p,handleSubmit:m,watch:h,formState:{errors:g}}=B({defaultValues:{code:``},resolver:V((0,W.useMemo)(()=>P({code:N().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`,``),u.current?.focus()}},[r,e,p,f,l]);return(0,G.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg ${c}`,children:[(0,G.jsxs)(ee,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:m(v),children:[(0,G.jsx)(ne,{autoFocus:!0,error:g.code,length:6,onChange:e=>f(`code`,e),onComplete:()=>m(v)(),ref:u,value:_}),(0,G.jsx)(d,{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)(d,{appearance:`ghost`,className:`w-full`,"data-testid":`totp-verify-back`,disabled:n,intent:`neutral`,onClick:t,type:`button`,uiSize:`lg`,children:o??l(`setupTotp.back`)})]})}function se(e){let{open:t,defaultOpen:n,onOpenChange:r,disabled:i}=e,[a,o]=k({controlled:t,default:n,name:`Collapsible`,state:`open`}),{mounted:s,setMounted:c,transitionStatus:l}=A(a,!0,!0),u=j(),[d,f]=W.useState(),m=d===null?void 0:d??u,h=p(e=>{let t=!a,n=y(x,e.nativeEvent);r(t,n),!n.isCanceled&&o(t)});return W.useMemo(()=>({defaultPanelId:u,disabled:i,handleTrigger:h,mounted:s,open:a,panelId:m,setMounted:c,setOpen:o,setPanelIdState:f,transitionStatus:l}),[u,i,h,s,a,m,c,o,f,l])}var K=W.createContext(void 0);function q(){let e=W.useContext(K);if(e===void 0)throw Error(m(15));return e}var J=function(e){return e.open=`data-open`,e.closed=`data-closed`,e[e.startingStyle=T.startingStyle]=`startingStyle`,e[e.endingStyle=T.endingStyle]=`endingStyle`,e}({}),ce=function(e){return e.panelOpen=`data-panel-open`,e}({}),le={[J.open]:``},ue={[J.closed]:``},de={open(e){return e?{[ce.panelOpen]:``}:null}},Y={open(e){return e?le:ue},...b},fe=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=se({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})}),pe={...de,...b},me=W.forwardRef(function(e,t){let{panelId:n,open:r,handleTrigger:a,state:s,disabled:c}=q(),{className:l,disabled:u=c,render:d,nativeButton:f=!0,style:p,...m}=e,{getButtonProps:h,buttonRef:g}=o({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:a},m,h],stateAttributesMapping:pe})}),X={height:void 0,width:void 0};function he(t){let{externalRef:n,hiddenUntilFound:r,id:i,keepMounted:a,mounted:o,onOpenChange:s,open:c,setMounted:u,setOpen:d,transitionStatus:f}=t,m=W.useRef(null),g=W.useRef(null),[v,b]=W.useState(X),x=W.useRef(X),S=W.useRef(!1),T=W.useRef(c),O=W.useRef(!1),[k,A]=W.useState(!1),j=W.useRef(null),M=l(n,m),N=_(c),P=D(m),F=!c&&!o,I=k?`idle`:f,L=c&&(T.current||O.current),R=!c&&o&&g.current===`css-animation`&&v.height===void 0&&v.width===void 0?x.current:v,ee=r&&F&&g.current!==`css-animation`,z=p((e,t=!0)=>{t&&(x.current=e),b(e)}),B=p(()=>{j.current?.(),j.current=null}),V=p(e=>{B(),j.current=()=>{j.current=null,e()}}),H=p(()=>{c&&o&&g.current===`css-animation`&&(O.current=!0)});e(()=>{!k||f===`starting`||A(!1)},[k,f]),W.useEffect(()=>()=>{H(),B()},[H,B]),e(()=>{let e=m.current;if(!e)return;!c&&j.current&&B();let t=ge(e,L);if(g.current=t,c&&f===`idle`&&T.current&&t===`css-animation`){x.current=Z(e);return}if(c&&f===`starting`){let n=S.current;if(S.current=!1,t===`none`){z(Z(e)),A(!0);return}if(t===`css-transition`){let t=ve(e);if(z(Z(e)),!n)return t;let r=Q(e,`transition-duration`,`0s`);return V(r),A(!0),t}z(Z(e));let r=Q(e,`animation-name`,`none`);if(!n){r();return}let i=Q(e,`animation-duration`,`0s`);r(),V(i),A(!0);return}if(!c&&o&&(f===`idle`||f===`starting`)){if(T.current=!1,O.current=!1,t===`none`){z(X,!1),u(!1);return}z(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}z(n),t===`css-animation`&&Q(e,`animation-name`,`none`)()},[o,c,B,z,u,V,L,f]),C({enabled:c&&o&&I===`idle`,open:!0,ref:m,onComplete(){c&&z(X,!1)}}),W.useEffect(()=>{if(c||!o||I!==`ending`||!m.current)return;let e=new AbortController,t=-1;function n(){N.current||(u(!1),z(X,!1))}return t=E.request(()=>{P(n,e.signal)}),()=>{E.cancel(t),e.abort()}},[N,o,c,I,P,z,u]),e(()=>{let e=m.current;!e||!r||!F||e.setAttribute(`hidden`,`until-found`)},[F,r]),W.useEffect(function(){let e=m.current;if(!e)return;function t(e){let t=y(h,e);s(!0,t),!t.isCanceled&&(S.current=!0,d(!0))}return w(e,`beforematch`,t)},[s,d]);let U=a||r||o||c;return{height:R.height,props:{...ee?{[J.startingStyle]:``}:void 0,hidden:F,id:i},ref:M,shouldPreventOpenAnimation:L,shouldRender:U,transitionStatus:I,width:R.width}}function Z(e){return{height:e.scrollHeight,width:e.scrollWidth}}function ge(e,n){let r=t(e).getComputedStyle(e),i=(r.animationName.split(`,`).map(e=>e.trim()).some(e=>e!==``&&e!==`none`)||n)&&_e(r.animationDuration),a=_e(r.transitionDuration);return i&&a||a?`css-transition`:i?`css-animation`:`none`}function _e(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 ve(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=E.request(n);return()=>{E.cancel(r),n()}}var ye=function(e){return e.collapsiblePanelHeight=`--collapsible-panel-height`,e.collapsiblePanelWidth=`--collapsible-panel-width`,e}({}),be=v(W.forwardRef(function(t,n){let{className:r,hiddenUntilFound:a,keepMounted:o,render:s,id:l,style:u,...d}=t,{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;e(()=>(_(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}=he({externalRef:n,hiddenUntilFound:x,id:w,keepMounted:S,mounted:p,onOpenChange:m,open:h,setMounted:g,setOpen:v,transitionStatus:b}),M={...y,transitionStatus:A},N=c(u,M),P=i(`div`,{...t,style:void 0},{state:M,ref:D,props:[E,{style:{[ye.collapsiblePanelHeight]:T===void 0?`auto`:`${T}px`,[ye.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(fe,`tr-collapsible`),Trigger:v(me,`tr-collapsible-summary`),Panel:be};function xe({setupData:e,onNext:t,additionalActions:n,className:r=``}){let{t:i}=s();return(0,G.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-lg ${r}`,children:[(0,G.jsx)(u,{align:`center`,as:`p`,color:`muted`,variant:`bodySm`,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)(I,{className:`mt-tinyrack-xs block break-all rounded-tinyrack-sm bg-tinyrack-surface-muted p-tinyrack-sm`,children:e.secret})})]}),(0,G.jsx)(d,{className:`w-full`,"data-testid":`totp-qr-next`,intent:`primary`,onClick:t,type:`button`,uiSize:`lg`,children:i(`setupTotp.next`)}),n]})}function Se(e={}){let{onSetupSuccess:t,onSetupError:n,onVerifySuccess:r,onVerifyError:i,onConfirmSuccess:a,onConfirmError:o,autoStart:s=!1}=e,c=g(),[l,u]=(0,W.useState)(s?`loading`:`qr`),[d,f]=(0,W.useState)(null),[p,m]=(0,W.useState)([]),h=(0,W.useRef)(!1),_=O({...H,onSuccess:e=>{f(e),u(`qr`),t?.(e)},onError:e=>{u(`error`),n?.(e)}}),v=O({...U,onSuccess:e=>{m(e.recovery_codes),u(`recovery`),r?.(e)},onError:e=>{i?.(e)}}),y=O({...te,onSuccess:e=>{c.invalidateQueries({queryKey:F.queryKey}),a?.(e)},onError:e=>{o?.(e)}}),b=(0,W.useCallback)(()=>{h.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([]),h.current=!1,_.reset(),v.reset(),y.reset()},[s,_,v,y]);return(0,W.useEffect)(()=>{s&&!h.current&&l===`loading`&&(h.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{ie as a,ae as i,xe as n,oe as r,Se as t};
3
+ //# sourceMappingURL=use-totp-setup-KOVNS2DC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-totp-setup-KOVNS2DC.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.31.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.31.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.31.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.31.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 { TRCode } from '@tinyrack/ui/components/code';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRText } from '@tinyrack/ui/components/text';\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 /* tinyrack-check-ignore-next-line components/no-native-text -- Structural recovery stack; copy uses TRText/TRCode and remaining children are DS controls. */\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <TRText as=\"p\" color=\"muted\" variant=\"bodySm\">\n {t('setupTotp.recoveryCodes.description')}\n </TRText>\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 {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural grid containing TRCode items. */}\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 <TRCode\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 </TRCode>\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 { TRForm } from '@tinyrack/ui/components/form';\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 /* tinyrack-check-ignore-next-line components/no-native-text -- Structural verification stack containing a TRForm and DS controls. */\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <TRForm\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 </TRForm>\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 { TRCode } from '@tinyrack/ui/components/code';\nimport { TRCollapsible } from '@tinyrack/ui/components/collapsible';\nimport { TRText } from '@tinyrack/ui/components/text';\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 /* tinyrack-check-ignore-next-line components/no-native-text -- Structural setup stack; copy uses TRText/TRCode and QR is an approved image. */\n <div className={`flex flex-col gap-tinyrack-lg ${className}`}>\n <TRText align=\"center\" as=\"p\" color=\"muted\" variant=\"bodySm\">\n {t('setupTotp.qrDescription')}\n </TRText>\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 <TRCode className=\"mt-tinyrack-xs block break-all rounded-tinyrack-sm bg-tinyrack-surface-muted p-tinyrack-sm\">\n {setupData.secret}\n </TRCode>\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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"}
@@ -0,0 +1,2 @@
1
+ import{C as e,Z as t,et as n}from"./createLucideIcon-D-yizrWN.js";import{z as r}from"./shell-header-bar-CdOEWmCT.js";var i=n(t(),1);function a(t,n,a,s=!0,c){let[l,u]=i.useState(),d=r(c?`${c}-label`:void 0),f=t??n??l;return e(()=>{let e=t||n||!s?void 0:o(a.current,d);l!==e&&u(e)}),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-CF3crxLc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAriaLabelledBy-IIwdHUss.js","names":[],"sources":["../../../../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/internals/labelable-provider/useAriaLabelledBy.mjs"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useBaseUiId } from \"../useBaseUiId.mjs\";\nexport function useAriaLabelledBy(explicitAriaLabelledBy, labelId, labelSourceRef, enableFallback = true, labelSourceId) {\n const [fallbackAriaLabelledBy, setFallbackAriaLabelledBy] = React.useState();\n const generatedLabelId = useBaseUiId(labelSourceId ? `${labelSourceId}-label` : undefined);\n const ariaLabelledBy = explicitAriaLabelledBy ?? labelId ?? fallbackAriaLabelledBy;\n\n // Fallback for <span> controls labelled by wrapping/sibling native <label>.\n // Run after every commit so DOM association changes (e.g. label mount/unmount)\n // are reflected even when props/state deps are unchanged.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useIsoLayoutEffect(() => {\n const nextAriaLabelledBy = explicitAriaLabelledBy || labelId || !enableFallback ? undefined : getAriaLabelledBy(labelSourceRef.current, generatedLabelId);\n if (fallbackAriaLabelledBy !== nextAriaLabelledBy) {\n setFallbackAriaLabelledBy(nextAriaLabelledBy);\n }\n });\n return ariaLabelledBy;\n}\nfunction getAriaLabelledBy(labelSource, generatedLabelId) {\n const label = findAssociatedLabel(labelSource);\n if (!label) {\n return undefined;\n }\n if (!label.id && generatedLabelId) {\n label.id = generatedLabelId;\n }\n return label.id || undefined;\n}\nfunction findAssociatedLabel(labelSource) {\n if (!labelSource) {\n return undefined;\n }\n\n // Fast path before the expensive `.labels` read.\n const parent = labelSource.parentElement;\n if (parent && parent.tagName === 'LABEL') {\n return parent;\n }\n const controlId = labelSource.id;\n if (controlId) {\n const nextSibling = labelSource.nextElementSibling;\n if (nextSibling && nextSibling.htmlFor === controlId) {\n return nextSibling;\n }\n }\n const labels = labelSource.labels;\n return labels && labels[0];\n}"],"x_google_ignoreList":[0],"mappings":"mIAKA,SAAgB,EAAkB,EAAwB,EAAS,EAAgB,EAAiB,GAAM,EAAe,CACvH,GAAM,CAAC,EAAwB,GAAA,EAAmC,SAAS,EACrE,EAAmB,EAAY,EAAgB,GAAG,EAAc,QAAU,IAAA,EAAS,EACnF,EAAiB,GAA0B,GAAW,EAY5D,OANA,MAAyB,CACvB,IAAM,EAAqB,GAA0B,GAAW,CAAC,EAAiB,IAAA,GAAY,EAAkB,EAAe,QAAS,CAAgB,EACpJ,IAA2B,GAC7B,EAA0B,CAAkB,CAEhD,CAAC,EACM,CACT,CACA,SAAS,EAAkB,EAAa,EAAkB,CACxD,IAAM,EAAQ,EAAoB,CAAW,EACxC,KAML,MAHI,CAAC,EAAM,IAAM,IACf,EAAM,GAAK,GAEN,EAAM,IAAM,IAAA,EACrB,CACA,SAAS,EAAoB,EAAa,CACxC,GAAI,CAAC,EACH,OAIF,IAAM,EAAS,EAAY,cAC3B,GAAI,GAAU,EAAO,UAAY,QAC/B,OAAO,EAET,IAAM,EAAY,EAAY,GAC9B,GAAI,EAAW,CACb,IAAM,EAAc,EAAY,mBAChC,GAAI,GAAe,EAAY,UAAY,EACzC,OAAO,CAEX,CACA,IAAM,EAAS,EAAY,OAC3B,OAAO,GAAU,EAAO,EAC1B"}
1
+ {"version":3,"file":"useAriaLabelledBy-CF3crxLc.js","names":[],"sources":["../../../../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/internals/labelable-provider/useAriaLabelledBy.mjs"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useBaseUiId } from \"../useBaseUiId.mjs\";\nexport function useAriaLabelledBy(explicitAriaLabelledBy, labelId, labelSourceRef, enableFallback = true, labelSourceId) {\n const [fallbackAriaLabelledBy, setFallbackAriaLabelledBy] = React.useState();\n const generatedLabelId = useBaseUiId(labelSourceId ? `${labelSourceId}-label` : undefined);\n const ariaLabelledBy = explicitAriaLabelledBy ?? labelId ?? fallbackAriaLabelledBy;\n\n // Fallback for <span> controls labelled by wrapping/sibling native <label>.\n // Run after every commit so DOM association changes (e.g. label mount/unmount)\n // are reflected even when props/state deps are unchanged.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useIsoLayoutEffect(() => {\n const nextAriaLabelledBy = explicitAriaLabelledBy || labelId || !enableFallback ? undefined : getAriaLabelledBy(labelSourceRef.current, generatedLabelId);\n if (fallbackAriaLabelledBy !== nextAriaLabelledBy) {\n setFallbackAriaLabelledBy(nextAriaLabelledBy);\n }\n });\n return ariaLabelledBy;\n}\nfunction getAriaLabelledBy(labelSource, generatedLabelId) {\n const label = findAssociatedLabel(labelSource);\n if (!label) {\n return undefined;\n }\n if (!label.id && generatedLabelId) {\n label.id = generatedLabelId;\n }\n return label.id || undefined;\n}\nfunction findAssociatedLabel(labelSource) {\n if (!labelSource) {\n return undefined;\n }\n\n // Fast path before the expensive `.labels` read.\n const parent = labelSource.parentElement;\n if (parent && parent.tagName === 'LABEL') {\n return parent;\n }\n const controlId = labelSource.id;\n if (controlId) {\n const nextSibling = labelSource.nextElementSibling;\n if (nextSibling && nextSibling.htmlFor === controlId) {\n return nextSibling;\n }\n }\n const labels = labelSource.labels;\n return labels && labels[0];\n}"],"x_google_ignoreList":[0],"mappings":"oIAKA,SAAgB,EAAkB,EAAwB,EAAS,EAAgB,EAAiB,GAAM,EAAe,CACvH,GAAM,CAAC,EAAwB,GAAA,EAAmC,SAAS,EACrE,EAAmB,EAAY,EAAgB,GAAG,EAAc,QAAU,IAAA,EAAS,EACnF,EAAiB,GAA0B,GAAW,EAY5D,OANA,MAAyB,CACvB,IAAM,EAAqB,GAA0B,GAAW,CAAC,EAAiB,IAAA,GAAY,EAAkB,EAAe,QAAS,CAAgB,EACpJ,IAA2B,GAC7B,EAA0B,CAAkB,CAEhD,CAAC,EACM,CACT,CACA,SAAS,EAAkB,EAAa,EAAkB,CACxD,IAAM,EAAQ,EAAoB,CAAW,EACxC,KAML,MAHI,CAAC,EAAM,IAAM,IACf,EAAM,GAAK,GAEN,EAAM,IAAM,IAAA,EACrB,CACA,SAAS,EAAoB,EAAa,CACxC,GAAI,CAAC,EACH,OAIF,IAAM,EAAS,EAAY,cAC3B,GAAI,GAAU,EAAO,UAAY,QAC/B,OAAO,EAET,IAAM,EAAY,EAAY,GAC9B,GAAI,EAAW,CACb,IAAM,EAAc,EAAY,mBAChC,GAAI,GAAe,EAAY,UAAY,EACzC,OAAO,CAEX,CACA,IAAM,EAAS,EAAY,OAC3B,OAAO,GAAU,EAAO,EAC1B"}
@@ -0,0 +1,2 @@
1
+ import{Z as e,et as t}from"./createLucideIcon-D-yizrWN.js";import{Ar as n,Ir as r,Jr as i,Ur as a,Zr as o,qr as s,zr as c}from"./config-C18-l7z7.js";import{r as l}from"./mutationOptions-Cv_vJkJn.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),s(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&c(t.mutationKey)!==c(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){r.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=n(t),[s]=d.useState(()=>new u(o,e));d.useEffect(()=>{s.setOptions(e)},[s,e]);let c=d.useSyncExternalStore(d.useCallback(e=>s.subscribe(r.batchCalls(e)),[s]),()=>s.getCurrentResult(),()=>s.getCurrentResult()),l=d.useCallback((e,t)=>{s.mutate(e,t).catch(a)},[s]);if(c.error&&i(s.options.throwOnError,[c.error]))throw c.error;return{...c,mutate:l,mutateAsync:c.mutate}}export{f as t};
2
+ //# sourceMappingURL=useMutation-DqIIIiBW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMutation-BWZ0G4Td.js","names":["#client","#updateResult","#currentMutation","#notify","#currentResult","#mutateOptions"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutationObserver.js","../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/useMutation.js"],"sourcesContent":["// src/mutationObserver.ts\nimport { getDefaultState } from \"./mutation.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { hashKey, shallowEqualObjects } from \"./utils.js\";\nvar MutationObserver = class extends Subscribable {\n #client;\n #currentResult = void 0;\n #currentMutation;\n #mutateOptions;\n constructor(client, options) {\n super();\n this.#client = client;\n this.setOptions(options);\n this.bindMethods();\n this.#updateResult();\n }\n bindMethods() {\n this.mutate = this.mutate.bind(this);\n this.reset = this.reset.bind(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n this.options = this.#client.defaultMutationOptions(options);\n if (!shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getMutationCache().notify({\n type: \"observerOptionsUpdated\",\n mutation: this.#currentMutation,\n observer: this\n });\n }\n if (prevOptions?.mutationKey && this.options.mutationKey && hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)) {\n this.reset();\n } else if (this.#currentMutation?.state.status === \"pending\") {\n this.#currentMutation.setOptions(this.options);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#currentMutation?.removeObserver(this);\n }\n }\n onMutationUpdate(action) {\n this.#updateResult();\n this.#notify(action);\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n reset() {\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = void 0;\n this.#updateResult();\n this.#notify();\n }\n mutate(variables, options) {\n this.#mutateOptions = options;\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = this.#client.getMutationCache().build(this.#client, this.options);\n this.#currentMutation.addObserver(this);\n return this.#currentMutation.execute(variables);\n }\n #updateResult() {\n const state = this.#currentMutation?.state ?? getDefaultState();\n this.#currentResult = {\n ...state,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n isIdle: state.status === \"idle\",\n mutate: this.mutate,\n reset: this.reset\n };\n }\n #notify(action) {\n notifyManager.batch(() => {\n if (this.#mutateOptions && this.hasListeners()) {\n const variables = this.#currentResult.variables;\n const onMutateResult = this.#currentResult.context;\n const context = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n if (action?.type === \"success\") {\n try {\n this.#mutateOptions.onSuccess?.(\n action.data,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n action.data,\n null,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n } else if (action?.type === \"error\") {\n try {\n this.#mutateOptions.onError?.(\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n void 0,\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n }\n }\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n });\n }\n};\nexport {\n MutationObserver\n};\n//# sourceMappingURL=mutationObserver.js.map","\"use client\";\n\n// src/useMutation.ts\nimport * as React from \"react\";\nimport {\n MutationObserver,\n noop,\n notifyManager,\n shouldThrowError\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nfunction useMutation(options, queryClient) {\n const client = useQueryClient(queryClient);\n const [observer] = React.useState(\n () => new MutationObserver(\n client,\n options\n )\n );\n React.useEffect(() => {\n observer.setOptions(options);\n }, [observer, options]);\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n const mutate = React.useCallback(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop);\n },\n [observer]\n );\n if (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) {\n throw result.error;\n }\n return { ...result, mutate, mutateAsync: result.mutate };\n}\nexport {\n useMutation\n};\n//# sourceMappingURL=useMutation.js.map"],"x_google_ignoreList":[0,1],"mappings":"sMAKA,IAAI,EAAmB,cAAc,CAAa,CAChD,GACA,GAAiB,IAAK,GACtB,GACA,GACA,YAAY,EAAQ,EAAS,CAC3B,MAAM,EACN,KAAKA,GAAU,EACf,KAAK,WAAW,CAAO,EACvB,KAAK,YAAY,EACjB,KAAKC,GAAc,CACrB,CACA,aAAc,CACZ,KAAK,OAAS,KAAK,OAAO,KAAK,IAAI,EACnC,KAAK,MAAQ,KAAK,MAAM,KAAK,IAAI,CACnC,CACA,WAAW,EAAS,CAClB,IAAM,EAAc,KAAK,QACzB,KAAK,QAAU,KAAKD,GAAQ,uBAAuB,CAAO,EACrD,EAAoB,KAAK,QAAS,CAAW,GAChD,KAAKA,GAAQ,iBAAiB,CAAC,CAAC,OAAO,CACrC,KAAM,yBACN,SAAU,KAAKE,GACf,SAAU,IACZ,CAAC,EAEC,GAAa,aAAe,KAAK,QAAQ,aAAe,EAAQ,EAAY,WAAW,IAAM,EAAQ,KAAK,QAAQ,WAAW,EAC/H,KAAK,MAAM,EACF,KAAKA,IAAkB,MAAM,SAAW,WACjD,KAAKA,GAAiB,WAAW,KAAK,OAAO,CAEjD,CACA,eAAgB,CACT,KAAK,aAAa,GACrB,KAAKA,IAAkB,eAAe,IAAI,CAE9C,CACA,iBAAiB,EAAQ,CACvB,KAAKD,GAAc,EACnB,KAAKE,GAAQ,CAAM,CACrB,CACA,kBAAmB,CACjB,OAAO,KAAKC,EACd,CACA,OAAQ,CACN,KAAKF,IAAkB,eAAe,IAAI,EAC1C,KAAKA,GAAmB,IAAK,GAC7B,KAAKD,GAAc,EACnB,KAAKE,GAAQ,CACf,CACA,OAAO,EAAW,EAAS,CAKzB,MAJA,MAAKE,GAAiB,EACtB,KAAKH,IAAkB,eAAe,IAAI,EAC1C,KAAKA,GAAmB,KAAKF,GAAQ,iBAAiB,CAAC,CAAC,MAAM,KAAKA,GAAS,KAAK,OAAO,EACxF,KAAKE,GAAiB,YAAY,IAAI,EAC/B,KAAKA,GAAiB,QAAQ,CAAS,CAChD,CACA,IAAgB,CACd,IAAM,EAAQ,KAAKA,IAAkB,OAAS,EAAgB,EAC9D,KAAKE,GAAiB,CACpB,GAAG,EACH,UAAW,EAAM,SAAW,UAC5B,UAAW,EAAM,SAAW,UAC5B,QAAS,EAAM,SAAW,QAC1B,OAAQ,EAAM,SAAW,OACzB,OAAQ,KAAK,OACb,MAAO,KAAK,KACd,CACF,CACA,GAAQ,EAAQ,CACd,EAAc,UAAY,CACxB,GAAI,KAAKC,IAAkB,KAAK,aAAa,EAAG,CAC9C,IAAM,EAAY,KAAKD,GAAe,UAChC,EAAiB,KAAKA,GAAe,QACrC,EAAU,CACd,OAAQ,KAAKJ,GACb,KAAM,KAAK,QAAQ,KACnB,YAAa,KAAK,QAAQ,WAC5B,EACA,GAAI,GAAQ,OAAS,UAAW,CAC9B,GAAI,CACF,KAAKK,GAAe,YAClB,EAAO,KACP,EACA,EACA,CACF,CACF,OAAS,EAAG,CACV,QAAa,OAAO,CAAC,CACvB,CACA,GAAI,CACF,KAAKA,GAAe,YAClB,EAAO,KACP,KACA,EACA,EACA,CACF,CACF,OAAS,EAAG,CACV,QAAa,OAAO,CAAC,CACvB,CACF,MAAO,GAAI,GAAQ,OAAS,QAAS,CACnC,GAAI,CACF,KAAKA,GAAe,UAClB,EAAO,MACP,EACA,EACA,CACF,CACF,OAAS,EAAG,CACV,QAAa,OAAO,CAAC,CACvB,CACA,GAAI,CACF,KAAKA,GAAe,YAClB,IAAK,GACL,EAAO,MACP,EACA,EACA,CACF,CACF,OAAS,EAAG,CACV,QAAa,OAAO,CAAC,CACvB,CACF,CACF,CACA,KAAK,UAAU,QAAS,GAAa,CACnC,EAAS,KAAKD,EAAc,CAC9B,CAAC,CACH,CAAC,CACH,CACF,aC5HA,SAAS,EAAY,EAAS,EAAa,CACzC,IAAM,EAAS,EAAe,CAAW,EACnC,CAAC,GAAA,EAAkB,aACjB,IAAI,EACR,EACA,CACF,CACF,EACA,EAAM,cAAgB,CACpB,EAAS,WAAW,CAAO,CAC7B,EAAG,CAAC,EAAU,CAAO,CAAC,EACtB,IAAM,EAAA,EAAe,qBAAA,EACb,YACH,GAAkB,EAAS,UAAU,EAAc,WAAW,CAAa,CAAC,EAC7E,CAAC,CAAQ,CACX,MACM,EAAS,iBAAiB,MAC1B,EAAS,iBAAiB,CAClC,EACM,EAAA,EAAe,aAClB,EAAW,IAAkB,CAC5B,EAAS,OAAO,EAAW,CAAa,CAAC,CAAC,MAAM,CAAI,CACtD,EACA,CAAC,CAAQ,CACX,EACA,GAAI,EAAO,OAAS,EAAiB,EAAS,QAAQ,aAAc,CAAC,EAAO,KAAK,CAAC,EAChF,MAAM,EAAO,MAEf,MAAO,CAAE,GAAG,EAAQ,SAAQ,YAAa,EAAO,MAAO,CACzD"}
1
+ {"version":3,"file":"useMutation-DqIIIiBW.js","names":["#client","#updateResult","#currentMutation","#notify","#currentResult","#mutateOptions"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutationObserver.js","../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/useMutation.js"],"sourcesContent":["// src/mutationObserver.ts\nimport { getDefaultState } from \"./mutation.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { hashKey, shallowEqualObjects } from \"./utils.js\";\nvar MutationObserver = class extends Subscribable {\n #client;\n #currentResult = void 0;\n #currentMutation;\n #mutateOptions;\n constructor(client, options) {\n super();\n this.#client = client;\n this.setOptions(options);\n this.bindMethods();\n this.#updateResult();\n }\n bindMethods() {\n this.mutate = this.mutate.bind(this);\n this.reset = this.reset.bind(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n this.options = this.#client.defaultMutationOptions(options);\n if (!shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getMutationCache().notify({\n type: \"observerOptionsUpdated\",\n mutation: this.#currentMutation,\n observer: this\n });\n }\n if (prevOptions?.mutationKey && this.options.mutationKey && hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)) {\n this.reset();\n } else if (this.#currentMutation?.state.status === \"pending\") {\n this.#currentMutation.setOptions(this.options);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#currentMutation?.removeObserver(this);\n }\n }\n onMutationUpdate(action) {\n this.#updateResult();\n this.#notify(action);\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n reset() {\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = void 0;\n this.#updateResult();\n this.#notify();\n }\n mutate(variables, options) {\n this.#mutateOptions = options;\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = this.#client.getMutationCache().build(this.#client, this.options);\n this.#currentMutation.addObserver(this);\n return this.#currentMutation.execute(variables);\n }\n #updateResult() {\n const state = this.#currentMutation?.state ?? getDefaultState();\n this.#currentResult = {\n ...state,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n isIdle: state.status === \"idle\",\n mutate: this.mutate,\n reset: this.reset\n };\n }\n #notify(action) {\n notifyManager.batch(() => {\n if (this.#mutateOptions && this.hasListeners()) {\n const variables = this.#currentResult.variables;\n const onMutateResult = this.#currentResult.context;\n const context = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n if (action?.type === \"success\") {\n try {\n this.#mutateOptions.onSuccess?.(\n action.data,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n action.data,\n null,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n } else if (action?.type === \"error\") {\n try {\n this.#mutateOptions.onError?.(\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n this.#mutateOptions.onSettled?.(\n void 0,\n action.error,\n variables,\n onMutateResult,\n context\n );\n } catch (e) {\n void Promise.reject(e);\n }\n }\n }\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n });\n }\n};\nexport {\n MutationObserver\n};\n//# sourceMappingURL=mutationObserver.js.map","\"use client\";\n\n// src/useMutation.ts\nimport * as React from \"react\";\nimport {\n MutationObserver,\n noop,\n notifyManager,\n shouldThrowError\n} from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nfunction useMutation(options, queryClient) {\n const client = useQueryClient(queryClient);\n const [observer] = React.useState(\n () => new MutationObserver(\n client,\n options\n )\n );\n React.useEffect(() => {\n observer.setOptions(options);\n }, [observer, options]);\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n const mutate = React.useCallback(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop);\n },\n [observer]\n );\n if (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) {\n throw result.error;\n }\n return { ...result, mutate, mutateAsync: result.mutate };\n}\nexport {\n useMutation\n};\n//# sourceMappingURL=useMutation.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{jr as e}from"./config-C18-l7z7.js";import{Ot as t}from"./shell-header-bar-CdOEWmCT.js";function n(n,r){return t(n,e,r)}export{n as t};
2
+ //# sourceMappingURL=useQuery-CLr9TaKA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQuery-Ccv_nzQl.js","names":[],"sources":["../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/useQuery.js"],"sourcesContent":["\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n useQuery\n};\n//# sourceMappingURL=useQuery.js.map"],"x_google_ignoreList":[0],"mappings":"8FAKA,SAAS,EAAS,EAAS,EAAa,CACtC,OAAO,EAAa,EAAS,EAAe,CAAW,CACzD"}
1
+ {"version":3,"file":"useQuery-CLr9TaKA.js","names":[],"sources":["../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/useQuery.js"],"sourcesContent":["\"use client\";\n\n// src/useQuery.ts\nimport { QueryObserver } from \"@tanstack/query-core\";\nimport { useBaseQuery } from \"./useBaseQuery.js\";\nfunction useQuery(options, queryClient) {\n return useBaseQuery(options, QueryObserver, queryClient);\n}\nexport {\n useQuery\n};\n//# sourceMappingURL=useQuery.js.map"],"x_google_ignoreList":[0],"mappings":"8FAKA,SAAS,EAAS,EAAS,EAAa,CACtC,OAAO,EAAa,EAAS,EAAe,CAAW,CACzD"}
@@ -0,0 +1,2 @@
1
+ import{X as e,Z as t,et as n,i as r,n as i,s as a}from"./createLucideIcon-D-yizrWN.js";import{Ar as o,i as s,r as c,t as l,vr as u}from"./config-C18-l7z7.js";import{t as d}from"./useMutation-DqIIIiBW.js";import{Dt as f,Q as p,X as m,c as h}from"./shell-header-bar-CdOEWmCT.js";import{a as g,c as _,d as v,f as ee,i as te,l as y,n as b,o as x,p as S,r as C,s as w,t as T,u as E}from"./use-admin-selection-D2b7jnym.js";import{h as D,m as O,p as k,t as A}from"./admin-shell-B91U4-Ro.js";import{t as j}from"./triangle-alert-DATO9o3k.js";import{u as M}from"./index-lTEyHSus.js";import{t as N}from"./badge-B8D0Q2qq.js";import{t as P}from"./alert-kRxM1xsM.js";import{t as F}from"./checkbox-DTPGfvmq.js";import{t as I}from"./form-sJw-V9wb.js";import{t as L}from"./field-CsrUbl__.js";import{t as R}from"./input-QvBxPgy5.js";import{t as z}from"./table-Dl89o43x.js";import{n as B,t as V}from"./modal-JuaLVSyx.js";var H=n(t(),1);function U(e){return e===`admin`?`admin`:`user`}var W=e();function G({modal:e,isMutating:t,onClose:n,onCreate:o,onUpdate:s,onDelete:c}){let{t:l}=r(),u=(0,H.useMemo)(()=>e?.type===`edit`?e.user:null,[e]);if(!e)return null;if(e.type===`delete`)return(0,W.jsxs)(V,{isOpen:!0,onClose:n,title:l(`admin.users.deleteTitle`,{email:e.user.email}),variant:`destructive`,children:[(0,W.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-xs rounded-tinyrack-md border border-tinyrack-danger-border bg-tinyrack-danger-surface p-tinyrack-lg text-tinyrack-danger-foreground`,children:[(0,W.jsxs)(`div`,{className:`flex items-center gap-tinyrack-sm`,children:[(0,W.jsx)(j,{"aria-hidden":!0,className:`size-tinyrack-lg`}),(0,W.jsx)(i,{as:`p`,weight:`medium`,children:l(`admin.users.deleteWarning`)})]}),(0,W.jsx)(i,{as:`p`,variant:`bodySm`,children:l(`admin.users.deleteDescription`)})]}),(0,W.jsxs)(B,{children:[(0,W.jsx)(a,{disabled:t,onClick:n,type:`button`,uiSize:`sm`,children:l(`admin.users.cancel`)}),(0,W.jsx)(a,{disabled:t,intent:`danger`,onClick:()=>c(e.user.sub),type:`button`,uiSize:`sm`,children:l(`admin.users.deleteConfirm`)})]})]});let d=e.type===`create`?l(`admin.users.create`):l(`admin.users.editTitle`),f=e.type===`create`?l(`admin.users.createSubmit`):l(`admin.users.save`);return(0,W.jsx)(V,{description:e.type===`create`?l(`admin.users.createHint`):l(`admin.users.editHint`),isOpen:!0,onClose:n,title:d,children:(0,W.jsxs)(I,{className:`mt-tinyrack-lg flex flex-col gap-tinyrack-lg`,onSubmit:t=>{t.preventDefault();let n=new FormData(t.currentTarget),r={email:String(n.get(`email`)??``),role:U(n.get(`role`)),email_verified:n.get(`email_verified`)===`on`};e.type===`create`?o({...r,password:String(n.get(`password`)??``)}):s({sub:e.user.sub,...r})},children:[(0,W.jsxs)(L.Root,{children:[(0,W.jsx)(L.Label,{htmlFor:`admin-user-email`,children:l(`profile.email.label`)}),(0,W.jsx)(R,{defaultValue:u?.email??``,id:`admin-user-email`,name:`email`,required:!0,type:`email`,uiSize:`sm`})]}),e.type===`create`?(0,W.jsxs)(L.Root,{children:[(0,W.jsx)(L.Label,{htmlFor:`admin-user-password`,children:l(`admin.users.password`)}),(0,W.jsx)(R,{id:`admin-user-password`,name:`password`,required:!0,type:`password`,uiSize:`sm`})]}):null,(0,W.jsxs)(L.Root,{children:[(0,W.jsx)(L.Label,{htmlFor:`admin-user-role`,children:l(`admin.users.role`)}),(0,W.jsxs)(h.Root,{defaultValue:u?.role??`user`,name:`role`,children:[(0,W.jsx)(h.Trigger,{id:`admin-user-role`,uiSize:`sm`,children:(0,W.jsx)(h.Value,{})}),(0,W.jsx)(h.Positioner,{children:(0,W.jsx)(h.Popup,{children:(0,W.jsx)(h.List,{children:[`user`,`admin`].map(e=>(0,W.jsxs)(h.Item,{value:e,children:[(0,W.jsx)(h.ItemText,{children:l(`admin.users.role${e===`user`?`User`:`Admin`}`)}),(0,W.jsx)(h.ItemIndicator,{children:(0,W.jsx)(p,{"aria-hidden":!0})})]},e))})})})]})]}),(0,W.jsx)(L.Root,{children:(0,W.jsxs)(`div`,{className:`flex items-center gap-tinyrack-md rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm`,children:[(0,W.jsx)(F.Root,{"aria-label":l(`admin.users.emailVerified`),defaultChecked:u?.email_verified??!1,name:`email_verified`,uiSize:`lg`,value:`on`,children:(0,W.jsx)(F.Indicator,{})}),(0,W.jsx)(L.Label,{className:`cursor-pointer`,children:l(`admin.users.emailVerified`)})]})}),(0,W.jsxs)(B,{children:[(0,W.jsx)(a,{disabled:t,onClick:n,type:`button`,uiSize:`sm`,children:l(`admin.users.cancel`)}),(0,W.jsx)(a,{disabled:t,intent:`primary`,type:`submit`,uiSize:`sm`,children:f})]})]})})}function K({notice:e,onDismiss:t}){let{t:n}=r(),i=e.tone===`success`;return(0,W.jsxs)(P.Root,{"aria-live":i?`polite`:`assertive`,role:i?`status`:`alert`,variant:i?`success`:`danger`,children:[i?(0,W.jsx)(p,{"aria-hidden":!0,className:`size-tinyrack-xl`}):(0,W.jsx)(j,{"aria-hidden":!0,className:`size-tinyrack-xl`}),(0,W.jsx)(P.Title,{children:e.message}),(0,W.jsx)(a,{appearance:`ghost`,"aria-label":n(`common.close`),className:`ms-auto`,onClick:t,type:`button`,uiSize:`sm`,children:(0,W.jsx)(m,{"aria-hidden":!0,className:`size-tinyrack-lg`})})]})}var q={query:``,page:1,pageSize:20,includeDeleted:!1,sort:`email`,direction:`asc`};function J(e={}){return{...q,...e}}async function Y({query:e,page:t,pageSize:n,includeDeleted:r,managedBy:i,role:a,emailVerified:o,twoFactor:l,sort:u,direction:d}){return s(await c.api.admin.users.$get({query:{query:e,page:String(t),page_size:String(n),include_deleted:String(r),managed_by:i,role:a,email_verified:o===void 0?void 0:String(o),two_factor:l===void 0?void 0:String(l),sort:u,direction:d}}))}async function ne(e){return s(await c.api.admin.users.$post({json:e}))}async function re({sub:e,...t}){return s(await c.api.admin.users[`:sub`].$patch({param:{sub:e},json:t}))}async function ie(e){return s(await c.api.admin.users[`:sub`].$delete({param:{sub:e}}))}async function ae(e){return s(await c.api.admin.users[`:sub`].restore.$post({param:{sub:e}}))}async function oe(e){return s(await c.api.admin.users[`bulk-status`].$post({json:e}))}var se=(e={})=>{let t=J(e);return u({queryKey:[`admin`,`users`,t],queryFn:async()=>Y(t)})};function X(){let e=M.useRouteContext({select:e=>e.user});return e?.role===`admin`?(0,W.jsx)(Z,{user:e}):(0,W.jsx)(D,{reason:`access-required`})}function Z({user:e}){let{data:t}=f(l);return t.admin.enabled?(0,W.jsx)(Q,{user:e}):(0,W.jsx)(D,{reason:`console-disabled`})}function Q({user:e}){let{t}=r(),n=o(),[s,c]=(0,H.useState)(``),[l,u]=(0,H.useState)(()=>J()),[p,m]=(0,H.useState)(null),[h,D]=(0,H.useState)(null),[j,M]=(0,H.useState)(null),{data:P}=f(se(l)),F=T(P.users.map(e=>e.sub)),I=()=>n.invalidateQueries({queryKey:[`admin`]}),L=()=>m({tone:`error`,message:t(`admin.users.operationFailed`)}),R=e=>m({tone:`success`,message:e}),U=d({mutationFn:ne,onSuccess:({user:e})=>{I(),R(t(`admin.users.createdNotice`,{email:e.email})),D(null)},onError:L}),q=d({mutationFn:re,onSuccess:({user:e})=>{I(),R(t(`admin.users.updatedNotice`,{email:e.email})),D(null)},onError:L}),Y=d({mutationFn:ie,onSuccess:({user:e})=>{I(),R(t(`admin.users.deletedNotice`,{email:e.email})),D(null)},onError:L}),X=d({mutationFn:ae,onSuccess:({user:e})=>{I(),R(t(`admin.users.restoredNotice`,{email:e.email}))},onError:L}),Z=d({mutationFn:oe,onSuccess:e=>{I(),F.clear(),M(null),R(t(`admin.selection.result`,e))},onError:L}),Q=e=>{F.clear(),u(e)},ce=()=>Q({...l,query:s.trim(),page:1}),le=F.selection.kind===`filter`?{kind:`filter`,filter:{query:l.query||void 0,include_deleted:l.includeDeleted,managed_by:l.managedBy,role:l.role,email_verified:l.emailVerified}}:{kind:`ids`,ids:[...F.selection.ids]},$=F.selection.kind===`filter`?P.pagination.total:F.selectedCount??0,ue=U.isPending||q.isPending||Y.isPending;return(0,W.jsxs)(A,{current:`users`,title:t(`admin.users.title`),user:e,children:[p?(0,W.jsx)(K,{notice:p,onDismiss:()=>m(null)}):null,(0,W.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col`,"data-testid":`admin-users-directory`,children:[(0,W.jsxs)(te,{onCreate:()=>D({type:`create`}),onQueryChange:c,onSearch:ce,query:s,title:t(`admin.users.title`),total:P.pagination.total,children:[(0,W.jsx)(C,{label:t(`admin.users.managedBy`),onChange:e=>Q({...l,managedBy:e===`database`?`database`:e===`config`?`config`:void 0,page:1}),options:[[`all`,t(`admin.filter.allSources`)],[`database`,t(`admin.source.database`)],[`config`,t(`admin.source.config`)]],value:l.managedBy??`all`}),(0,W.jsx)(C,{label:t(`admin.users.role`),onChange:e=>Q({...l,role:e===`user`?`user`:e===`admin`?`admin`:void 0,page:1}),options:[[`all`,t(`admin.filter.allRoles`)],[`user`,t(`admin.users.roleUser`)],[`admin`,t(`admin.users.roleAdmin`)]],value:l.role??`all`}),(0,W.jsx)(C,{label:t(`admin.table.status`),onChange:e=>Q({...l,includeDeleted:e===`all`,page:1}),options:[[`active`,t(`admin.status.active`)],[`all`,t(`admin.filter.includeInactive`)]],value:l.includeDeleted?`all`:`active`})]}),(0,W.jsxs)(S,{children:[(0,W.jsxs)(ee,{label:t(`admin.users.title`),children:[(0,W.jsx)(z.Header,{className:`sticky top-0 z-tinyrack-component-raised`,children:(0,W.jsxs)(z.Row,{children:[(0,W.jsx)(v,{header:!0,children:(0,W.jsx)(w,{checked:F.allOnPage,indeterminate:F.someOnPage,onChange:F.togglePage})}),(0,W.jsx)(E,{header:!0,children:(0,W.jsx)(_,{direction:l.sort===`email`?l.direction:void 0,label:t(`admin.users.email`),onClick:()=>Q({...l,sort:`email`,direction:l.sort===`email`&&l.direction===`asc`?`desc`:`asc`,page:1})})}),(0,W.jsx)(z.Head,{children:(0,W.jsx)(_,{direction:l.sort===`role`?l.direction:void 0,label:t(`admin.users.role`),onClick:()=>Q({...l,sort:`role`,direction:l.sort===`role`&&l.direction===`asc`?`desc`:`asc`,page:1})})}),(0,W.jsx)(z.Head,{children:t(`admin.users.managedBy`)}),(0,W.jsx)(z.Head,{children:t(`admin.users.emailVerified`)}),(0,W.jsx)(z.Head,{children:t(`admin.users.twoFactor`)}),(0,W.jsx)(z.Head,{children:t(`admin.table.status`)}),(0,W.jsx)(z.Head,{children:t(`admin.users.sub`)}),(0,W.jsx)(y,{header:!0,children:t(`admin.table.actions`)})]})}),(0,W.jsx)(z.Body,{children:P.users.length===0?(0,W.jsx)(z.Row,{children:(0,W.jsx)(z.Cell,{className:`py-tinyrack-3xl text-center`,colSpan:9,children:t(`admin.table.empty`)})}):P.users.map(n=>(0,W.jsxs)(z.Row,{className:F.isSelected(n.sub)?`bg-tinyrack-surface-selected`:void 0,"data-selected":F.isSelected(n.sub)?``:void 0,children:[(0,W.jsx)(v,{selected:F.isSelected(n.sub),children:(0,W.jsx)(x,{checked:F.isSelected(n.sub),label:t(`admin.selection.row`,{name:n.email}),onChange:e=>F.toggleOne(n.sub,e)})}),(0,W.jsx)(E,{selected:F.isSelected(n.sub),children:(0,W.jsx)(i,{as:`p`,truncate:!0,variant:`bodySm`,weight:`medium`,children:n.email})}),(0,W.jsx)(z.Cell,{children:(0,W.jsx)(N,{variant:n.role===`admin`?`info`:`neutral`,children:k(t,n.role)})}),(0,W.jsx)(z.Cell,{children:O(t,n.managed_by)}),(0,W.jsx)(z.Cell,{children:t(n.email_verified?`common.yes`:`common.no`)}),(0,W.jsx)(z.Cell,{children:t(n.totp_registered||n.passkey_count>0?`common.yes`:`common.no`)}),(0,W.jsx)(z.Cell,{children:(0,W.jsx)(N,{className:`whitespace-nowrap`,variant:n.deleted_at?`neutral`:`success`,children:t(n.deleted_at?`admin.status.inactive`:`admin.status.active`)})}),(0,W.jsx)(z.Cell,{children:(0,W.jsx)(i,{as:`span`,variant:`code`,children:n.sub})}),(0,W.jsx)(y,{selected:F.isSelected(n.sub),children:n.deleted_at?(0,W.jsx)(a,{disabled:n.managed_by===`config`,onClick:()=>X.mutate(n.sub),type:`button`,uiSize:`sm`,children:t(`admin.actions.restore`)}):(0,W.jsxs)(`div`,{className:`flex justify-end gap-tinyrack-xs`,children:[(0,W.jsx)(a,{appearance:`ghost`,disabled:n.managed_by===`config`,onClick:()=>D({type:`edit`,user:n}),type:`button`,uiSize:`sm`,children:t(`admin.actions.edit`)}),(0,W.jsx)(a,{appearance:`ghost`,disabled:n.managed_by===`config`||n.sub===e.sub,onClick:()=>D({type:`delete`,user:n}),type:`button`,uiSize:`sm`,children:t(`admin.actions.deactivate`)})]})})]},n.sub))})]}),(0,W.jsx)(g,{onPageChange:e=>{F.clear(),u({...l,page:e})},onPageSizeChange:e=>Q({...l,page:1,pageSize:e}),page:l.page,pageSize:l.pageSize,total:P.pagination.total})]})]}),$>0?(0,W.jsx)(b,{canExpand:F.allOnPage&&P.pagination.total>P.users.length,filterSelected:F.selection.kind===`filter`,onActivate:()=>M(!0),onClear:F.clear,onDeactivate:()=>M(!1),onExpand:F.selectFilter,pending:Z.isPending,selected:$,total:P.pagination.total}):null,(0,W.jsx)(V,{isOpen:j!==null,onClose:()=>M(null),title:t(j?`admin.bulk.activateTitle`:`admin.bulk.deactivateTitle`),children:(0,W.jsxs)(`div`,{className:`pt-tinyrack-lg`,children:[(0,W.jsx)(i,{color:`muted`,variant:`bodySm`,children:t(`admin.bulk.confirm`,{count:$,scope:t(F.selection.kind===`filter`?`admin.selection.filterScope`:`admin.selection.pageScope`)})}),(0,W.jsxs)(B,{children:[(0,W.jsx)(a,{onClick:()=>M(null),type:`button`,children:t(`common.dismiss`)}),(0,W.jsx)(a,{intent:j?`primary`:`danger`,onClick:()=>Z.mutate({target:le,active:j??!0}),type:`button`,children:t(`admin.bulk.run`)})]})]})}),(0,W.jsx)(G,{isMutating:ue,modal:h,onClose:()=>D(null),onCreate:e=>U.mutate(e),onDelete:e=>Y.mutate(e),onUpdate:e=>q.mutate(e)})]})}export{X as component};
2
+ //# sourceMappingURL=users-BQQQm353.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users-BQQQm353.js","names":["useMutation","useQueryClient","useSuspenseQuery","TRBadge","TRButton","TRTable","TRText","useState","useTranslation","Modal","ModalActions","AdminBulkBar","AdminFilterSelect","AdminListToolbar","AdminPagination","AdminRowCheckbox","AdminSelectAll","AdminSortButton","AdminStickyActionCell","AdminStickyIdentityCell","AdminStickySelectCell","AdminTable","AdminTableFrame","AdminGateScreen","AdminShell","formatAdminRole","formatManagedBy","useAdminSelection","AdminUserFormModal","AdminUsersNotice","adminUsersQueryOptions","bulkSetAdminUsersActive","createAdminUser","deleteAdminUser","normalizeAdminUsersQuery","restoreAdminUser","updateAdminUser","appConfigQueryOptions","Route","AdminUsersPage","user","useRouteContext","select","context","role","AdminUsersGate","SessionUser","data","config","admin","enabled","AdminUsersContent","t","queryClient","draftQuery","setDraftQuery","filters","setFilters","notice","setNotice","NoticeState","modal","setModal","UserModalState","bulkActive","setBulkActive","selection","users","map","managedUser","sub","invalidate","invalidateQueries","queryKey","noticeFail","tone","message","noticeOn","createMutation","mutationFn","onSuccess","next","email","onError","updateMutation","deleteMutation","restoreMutation","bulkMutation","result","clear","resetSelectionAndSet","applySearch","query","trim","page","target","AdminBulkTarget","kind","filter","undefined","include_deleted","includeDeleted","managed_by","managedBy","email_verified","emailVerified","ids","selected","pagination","total","selectedCount","mutating","isPending","type","value","allOnPage","someOnPage","togglePage","sort","direction","length","isSelected","name","checked","toggleOne","totp_registered","passkey_count","deleted_at","mutate","pageSize","selectFilter","count","scope","active","values","component"],"sources":["../../../frontend/src/features/admin/users/admin-users-filters.ts","../../../frontend/src/features/admin/users/admin-user-form-modal.tsx","../../../frontend/src/features/admin/users/admin-users-notice.tsx","../../../frontend/src/queries/admin-users.ts","../../../frontend/src/routes/admin/users/index.tsx?tsr-split=component"],"sourcesContent":["import type {\n AdminUser,\n normalizeAdminUsersQuery,\n} from '#frontend/queries/admin-users.ts';\n\nexport type QuickFilter = 'all' | 'database' | 'config' | 'admins';\n\nexport type NoticeState = {\n tone: 'success' | 'error';\n message: string;\n} | null;\n\nexport type UserModalState =\n | { type: 'create' }\n | { type: 'edit'; user: AdminUser }\n | { type: 'delete'; user: AdminUser }\n | null;\n\nexport function parseUserRole(\n value: FormDataEntryValue | null,\n): 'user' | 'admin' {\n return value === 'admin' ? 'admin' : 'user';\n}\n\nexport function getActiveQuickFilter(\n filters: ReturnType<typeof normalizeAdminUsersQuery>,\n): QuickFilter {\n if (filters.role === 'admin') return 'admins';\n if (filters.managedBy === 'database') return 'database';\n if (filters.managedBy === 'config') return 'config';\n return 'all';\n}\n","import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRCheckbox } from '@tinyrack/ui/components/checkbox';\nimport { TRField } from '@tinyrack/ui/components/field';\nimport { TRForm } from '@tinyrack/ui/components/form';\nimport { TRInput } from '@tinyrack/ui/components/input';\nimport { TRSelect } from '@tinyrack/ui/components/select';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CheckIcon, TriangleAlertIcon } from 'lucide-react';\nimport type { FormEvent } from 'react';\nimport { useMemo } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Modal, ModalActions } from '#frontend/components/ui/modal.tsx';\nimport {\n parseUserRole,\n type UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUserFormModalProps = {\n modal: UserModalState;\n isMutating: boolean;\n onClose: () => void;\n onCreate: (values: {\n email: string;\n password: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onUpdate: (values: {\n sub: string;\n email: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n }) => void;\n onDelete: (sub: string) => void;\n};\n\nexport function AdminUserFormModal({\n modal,\n isMutating,\n onClose,\n onCreate,\n onUpdate,\n onDelete,\n}: AdminUserFormModalProps) {\n const { t } = useTranslation();\n const defaultValues = useMemo(\n () => (modal?.type === 'edit' ? modal.user : null),\n [modal],\n );\n\n if (!modal) return null;\n\n if (modal.type === 'delete') {\n return (\n <Modal\n isOpen\n onClose={onClose}\n title={t('admin.users.deleteTitle', { email: modal.user.email })}\n variant=\"destructive\"\n >\n <div className=\"flex flex-col gap-tinyrack-xs rounded-tinyrack-md border border-tinyrack-danger-border bg-tinyrack-danger-surface p-tinyrack-lg text-tinyrack-danger-foreground\">\n <div className=\"flex items-center gap-tinyrack-sm\">\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-lg\" />\n <TRText as=\"p\" weight=\"medium\">\n {t('admin.users.deleteWarning')}\n </TRText>\n </div>\n <TRText as=\"p\" variant=\"bodySm\">\n {t('admin.users.deleteDescription')}\n </TRText>\n </div>\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"danger\"\n onClick={() => onDelete(modal.user.sub)}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.deleteConfirm')}\n </TRButton>\n </ModalActions>\n </Modal>\n );\n }\n\n const title =\n modal.type === 'create'\n ? t('admin.users.create')\n : t('admin.users.editTitle');\n const submit =\n modal.type === 'create'\n ? t('admin.users.createSubmit')\n : t('admin.users.save');\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const formData = new FormData(event.currentTarget);\n const values = {\n email: String(formData.get('email') ?? ''),\n role: parseUserRole(formData.get('role')),\n email_verified: formData.get('email_verified') === 'on',\n };\n if (modal.type === 'create') {\n onCreate({\n ...values,\n password: String(formData.get('password') ?? ''),\n });\n } else {\n onUpdate({ sub: modal.user.sub, ...values });\n }\n };\n\n return (\n <Modal\n description={\n modal.type === 'create'\n ? t('admin.users.createHint')\n : t('admin.users.editHint')\n }\n isOpen\n onClose={onClose}\n title={title}\n >\n <TRForm\n className=\"mt-tinyrack-lg flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit}\n >\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-email\">\n {t('profile.email.label')}\n </TRField.Label>\n <TRInput\n defaultValue={defaultValues?.email ?? ''}\n id=\"admin-user-email\"\n name=\"email\"\n required\n type=\"email\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n\n {modal.type === 'create' ? (\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-password\">\n {t('admin.users.password')}\n </TRField.Label>\n <TRInput\n id=\"admin-user-password\"\n name=\"password\"\n required\n type=\"password\"\n uiSize=\"sm\"\n />\n </TRField.Root>\n ) : null}\n\n <TRField.Root>\n <TRField.Label htmlFor=\"admin-user-role\">\n {t('admin.users.role')}\n </TRField.Label>\n <TRSelect.Root\n defaultValue={defaultValues?.role ?? 'user'}\n name=\"role\"\n >\n <TRSelect.Trigger id=\"admin-user-role\" uiSize=\"sm\">\n <TRSelect.Value />\n </TRSelect.Trigger>\n <TRSelect.Positioner>\n <TRSelect.Popup>\n <TRSelect.List>\n {['user', 'admin'].map((role) => (\n <TRSelect.Item key={role} value={role}>\n <TRSelect.ItemText>\n {t(\n `admin.users.role${role === 'user' ? 'User' : 'Admin'}`,\n )}\n </TRSelect.ItemText>\n <TRSelect.ItemIndicator>\n <CheckIcon aria-hidden />\n </TRSelect.ItemIndicator>\n </TRSelect.Item>\n ))}\n </TRSelect.List>\n </TRSelect.Popup>\n </TRSelect.Positioner>\n </TRSelect.Root>\n </TRField.Root>\n\n <TRField.Root>\n <div className=\"flex items-center gap-tinyrack-md rounded-tinyrack-md border border-tinyrack-border bg-tinyrack-surface px-tinyrack-md py-tinyrack-sm\">\n <TRCheckbox.Root\n aria-label={t('admin.users.emailVerified')}\n defaultChecked={defaultValues?.email_verified ?? false}\n name=\"email_verified\"\n uiSize=\"lg\"\n value=\"on\"\n >\n <TRCheckbox.Indicator />\n </TRCheckbox.Root>\n <TRField.Label className=\"cursor-pointer\">\n {t('admin.users.emailVerified')}\n </TRField.Label>\n </div>\n </TRField.Root>\n\n <ModalActions>\n <TRButton\n disabled={isMutating}\n onClick={onClose}\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.users.cancel')}\n </TRButton>\n <TRButton\n disabled={isMutating}\n intent=\"primary\"\n type=\"submit\"\n uiSize=\"sm\"\n >\n {submit}\n </TRButton>\n </ModalActions>\n </TRForm>\n </Modal>\n );\n}\n","import { TRAlert } from '@tinyrack/ui/components/alert';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { CheckIcon, TriangleAlertIcon, XIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport type { NoticeState } from '#frontend/features/admin/users/admin-users-filters.ts';\n\ntype AdminUsersNoticeProps = {\n notice: NonNullable<NoticeState>;\n onDismiss: () => void;\n};\n\n/**\n * Result of the last create/update/delete.\n *\n * Stays an inline banner rather than becoming a toast now that the shell\n * mounts a viewport: Base UI renders toasts as `dialog`/`alertdialog` inside a\n * `region`, never as a live `status`, so a toast would silently drop the\n * polite announcement this makes.\n */\nexport function AdminUsersNotice({ notice, onDismiss }: AdminUsersNoticeProps) {\n const { t } = useTranslation();\n const isSuccess = notice.tone === 'success';\n\n return (\n <TRAlert.Root\n aria-live={isSuccess ? 'polite' : 'assertive'}\n role={isSuccess ? 'status' : 'alert'}\n variant={isSuccess ? 'success' : 'danger'}\n >\n {isSuccess ? (\n <CheckIcon aria-hidden className=\"size-tinyrack-xl\" />\n ) : (\n <TriangleAlertIcon aria-hidden className=\"size-tinyrack-xl\" />\n )}\n <TRAlert.Title>{notice.message}</TRAlert.Title>\n <TRButton\n appearance=\"ghost\"\n aria-label={t('common.close')}\n className=\"ms-auto\"\n onClick={onDismiss}\n type=\"button\"\n uiSize=\"sm\"\n >\n <XIcon aria-hidden className=\"size-tinyrack-lg\" />\n </TRButton>\n </TRAlert.Root>\n );\n}\n","import { queryOptions } from '@tanstack/react-query';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport type AdminUsersQuery = {\n query?: string;\n page?: number;\n pageSize?: number;\n includeDeleted?: boolean;\n managedBy?: 'database' | 'config';\n role?: 'user' | 'admin';\n emailVerified?: boolean;\n twoFactor?: boolean;\n sort?: 'email' | 'role' | 'created_at';\n direction?: 'asc' | 'desc';\n};\n\nexport type CreateAdminUserInput = {\n email: string;\n password: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n};\n\nexport type UpdateAdminUserInput = {\n sub: string;\n email: string;\n role: 'user' | 'admin';\n email_verified: boolean;\n};\n\ntype NormalizedAdminUsersQuery = {\n query: string;\n page: number;\n pageSize: number;\n includeDeleted: boolean;\n managedBy?: 'database' | 'config' | undefined;\n role?: 'user' | 'admin' | undefined;\n emailVerified?: boolean | undefined;\n twoFactor?: boolean | undefined;\n sort: 'email' | 'role' | 'created_at';\n direction: 'asc' | 'desc';\n};\n\nconst DEFAULT_ADMIN_USERS_QUERY = {\n query: '',\n page: 1,\n pageSize: 20,\n includeDeleted: false,\n sort: 'email',\n direction: 'asc',\n} satisfies NormalizedAdminUsersQuery;\n\nexport function normalizeAdminUsersQuery(\n input: AdminUsersQuery = {},\n): NormalizedAdminUsersQuery {\n return { ...DEFAULT_ADMIN_USERS_QUERY, ...input };\n}\n\nasync function fetchAdminUsers({\n query,\n page,\n pageSize,\n includeDeleted,\n managedBy,\n role,\n emailVerified,\n twoFactor,\n sort,\n direction,\n}: NormalizedAdminUsersQuery) {\n return jsonOk(\n await client.api.admin.users.$get({\n query: {\n query,\n page: String(page),\n page_size: String(pageSize),\n include_deleted: String(includeDeleted),\n managed_by: managedBy,\n role,\n email_verified:\n emailVerified === undefined ? undefined : String(emailVerified),\n two_factor: twoFactor === undefined ? undefined : String(twoFactor),\n sort,\n direction,\n },\n }),\n );\n}\n\nexport async function createAdminUser(values: CreateAdminUserInput) {\n return jsonOk(\n await client.api.admin.users.$post({\n json: values,\n }),\n );\n}\n\nexport async function updateAdminUser({\n sub,\n ...values\n}: UpdateAdminUserInput) {\n return jsonOk(\n await client.api.admin.users[':sub'].$patch({\n param: { sub },\n json: values,\n }),\n );\n}\n\nexport async function deleteAdminUser(sub: string) {\n return jsonOk(\n await client.api.admin.users[':sub'].$delete({\n param: { sub },\n }),\n );\n}\n\nexport async function restoreAdminUser(sub: string) {\n return jsonOk(\n await client.api.admin.users[':sub'].restore.$post({ param: { sub } }),\n );\n}\n\nexport type AdminBulkTarget =\n | { kind: 'ids'; ids: string[] }\n | {\n kind: 'filter';\n filter: {\n query?: string | undefined;\n include_deleted: boolean;\n managed_by?: 'database' | 'config' | undefined;\n role?: 'user' | 'admin' | undefined;\n email_verified?: boolean | undefined;\n };\n };\n\nexport async function bulkSetAdminUsersActive(input: {\n target: AdminBulkTarget;\n active: boolean;\n}) {\n return jsonOk(\n await client.api.admin.users['bulk-status'].$post({ json: input }),\n );\n}\n\nexport const adminUsersQueryOptions = (input: AdminUsersQuery = {}) => {\n const params = normalizeAdminUsersQuery(input);\n return queryOptions({\n queryKey: ['admin', 'users', params],\n queryFn: async () => fetchAdminUsers(params),\n });\n};\n\nexport type AdminUsersResponse = Awaited<ReturnType<typeof fetchAdminUsers>>;\nexport type AdminUser = AdminUsersResponse['users'][number];\nexport type AdminUserResponse = Awaited<ReturnType<typeof createAdminUser>>;\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect } from '@tanstack/react-router';\nimport { TRBadge } from '@tinyrack/ui/components/badge';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRTable } from '@tinyrack/ui/components/table';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Modal, ModalActions } from '#frontend/components/ui/modal.tsx';\nimport {\n AdminBulkBar,\n AdminFilterSelect,\n AdminListToolbar,\n AdminPagination,\n AdminRowCheckbox,\n AdminSelectAll,\n AdminSortButton,\n AdminStickyActionCell,\n AdminStickyIdentityCell,\n AdminStickySelectCell,\n AdminTable,\n AdminTableFrame,\n} from '#frontend/features/admin/admin-data-table.tsx';\nimport { AdminGateScreen } from '#frontend/features/admin/admin-gate-screen.tsx';\nimport { AdminShell } from '#frontend/features/admin/admin-shell.tsx';\nimport {\n formatAdminRole,\n formatManagedBy,\n} from '#frontend/features/admin/format-admin-user.ts';\nimport { useAdminSelection } from '#frontend/features/admin/use-admin-selection.ts';\nimport { AdminUserFormModal } from '#frontend/features/admin/users/admin-user-form-modal.tsx';\nimport type {\n NoticeState,\n UserModalState,\n} from '#frontend/features/admin/users/admin-users-filters.ts';\nimport { AdminUsersNotice } from '#frontend/features/admin/users/admin-users-notice.tsx';\nimport {\n type AdminBulkTarget,\n adminUsersQueryOptions,\n bulkSetAdminUsersActive,\n createAdminUser,\n deleteAdminUser,\n normalizeAdminUsersQuery,\n restoreAdminUser,\n updateAdminUser,\n} from '#frontend/queries/admin-users.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport type { SessionUser } from '#frontend/queries/session.ts';\n\nexport const Route = createFileRoute('/admin/users/')({\n component: AdminUsersPage,\n beforeLoad: async ({ context }) => {\n if (!context.user) throw redirect({ to: '/login' });\n },\n});\n\nfunction AdminUsersPage() {\n const user = Route.useRouteContext({ select: (context) => context.user });\n if (user?.role !== 'admin')\n return <AdminGateScreen reason=\"access-required\" />;\n return <AdminUsersGate user={user} />;\n}\n\nfunction AdminUsersGate({ user }: { user: SessionUser }) {\n const { data: config } = useSuspenseQuery(appConfigQueryOptions);\n if (!config.admin.enabled)\n return <AdminGateScreen reason=\"console-disabled\" />;\n return <AdminUsersContent user={user} />;\n}\n\nfunction AdminUsersContent({ user }: { user: SessionUser }) {\n const { t } = useTranslation();\n const queryClient = useQueryClient();\n const [draftQuery, setDraftQuery] = useState('');\n const [filters, setFilters] = useState(() => normalizeAdminUsersQuery());\n const [notice, setNotice] = useState<NoticeState>(null);\n const [modal, setModal] = useState<UserModalState>(null);\n const [bulkActive, setBulkActive] = useState<boolean | null>(null);\n const { data } = useSuspenseQuery(adminUsersQueryOptions(filters));\n const selection = useAdminSelection(\n data.users.map((managedUser) => managedUser.sub),\n );\n const invalidate = () =>\n queryClient.invalidateQueries({ queryKey: ['admin'] });\n const noticeFail = () =>\n setNotice({ tone: 'error', message: t('admin.users.operationFailed') });\n const noticeOn = (message: string) => setNotice({ tone: 'success', message });\n\n const createMutation = useMutation({\n mutationFn: createAdminUser,\n onSuccess: ({ user: next }) => {\n void invalidate();\n noticeOn(t('admin.users.createdNotice', { email: next.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n const updateMutation = useMutation({\n mutationFn: updateAdminUser,\n onSuccess: ({ user: next }) => {\n void invalidate();\n noticeOn(t('admin.users.updatedNotice', { email: next.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n const deleteMutation = useMutation({\n mutationFn: deleteAdminUser,\n onSuccess: ({ user: next }) => {\n void invalidate();\n noticeOn(t('admin.users.deletedNotice', { email: next.email }));\n setModal(null);\n },\n onError: noticeFail,\n });\n const restoreMutation = useMutation({\n mutationFn: restoreAdminUser,\n onSuccess: ({ user: next }) => {\n void invalidate();\n noticeOn(t('admin.users.restoredNotice', { email: next.email }));\n },\n onError: noticeFail,\n });\n const bulkMutation = useMutation({\n mutationFn: bulkSetAdminUsersActive,\n onSuccess: (result) => {\n void invalidate();\n selection.clear();\n setBulkActive(null);\n noticeOn(t('admin.selection.result', result));\n },\n onError: noticeFail,\n });\n\n const resetSelectionAndSet = (next: typeof filters) => {\n selection.clear();\n setFilters(next);\n };\n const applySearch = () =>\n resetSelectionAndSet({ ...filters, query: draftQuery.trim(), page: 1 });\n const target: AdminBulkTarget =\n selection.selection.kind === 'filter'\n ? {\n kind: 'filter',\n filter: {\n query: filters.query || undefined,\n include_deleted: filters.includeDeleted,\n managed_by: filters.managedBy,\n role: filters.role,\n email_verified: filters.emailVerified,\n },\n }\n : { kind: 'ids', ids: [...selection.selection.ids] };\n const selected =\n selection.selection.kind === 'filter'\n ? data.pagination.total\n : (selection.selectedCount ?? 0);\n const mutating =\n createMutation.isPending ||\n updateMutation.isPending ||\n deleteMutation.isPending;\n\n return (\n <AdminShell current=\"users\" title={t('admin.users.title')} user={user}>\n {notice ? (\n <AdminUsersNotice notice={notice} onDismiss={() => setNotice(null)} />\n ) : null}\n <div\n className=\"flex min-h-0 min-w-0 flex-1 flex-col\"\n data-testid=\"admin-users-directory\"\n >\n <AdminListToolbar\n onCreate={() => setModal({ type: 'create' })}\n onQueryChange={setDraftQuery}\n onSearch={applySearch}\n query={draftQuery}\n title={t('admin.users.title')}\n total={data.pagination.total}\n >\n <AdminFilterSelect\n label={t('admin.users.managedBy')}\n onChange={(value) =>\n resetSelectionAndSet({\n ...filters,\n managedBy:\n value === 'database'\n ? 'database'\n : value === 'config'\n ? 'config'\n : undefined,\n page: 1,\n })\n }\n options={[\n ['all', t('admin.filter.allSources')],\n ['database', t('admin.source.database')],\n ['config', t('admin.source.config')],\n ]}\n value={filters.managedBy ?? 'all'}\n />\n <AdminFilterSelect\n label={t('admin.users.role')}\n onChange={(value) =>\n resetSelectionAndSet({\n ...filters,\n role:\n value === 'user'\n ? 'user'\n : value === 'admin'\n ? 'admin'\n : undefined,\n page: 1,\n })\n }\n options={[\n ['all', t('admin.filter.allRoles')],\n ['user', t('admin.users.roleUser')],\n ['admin', t('admin.users.roleAdmin')],\n ]}\n value={filters.role ?? 'all'}\n />\n <AdminFilterSelect\n label={t('admin.table.status')}\n onChange={(value) =>\n resetSelectionAndSet({\n ...filters,\n includeDeleted: value === 'all',\n page: 1,\n })\n }\n options={[\n ['active', t('admin.status.active')],\n ['all', t('admin.filter.includeInactive')],\n ]}\n value={filters.includeDeleted ? 'all' : 'active'}\n />\n </AdminListToolbar>\n <AdminTableFrame>\n <AdminTable label={t('admin.users.title')}>\n <TRTable.Header className=\"sticky top-0 z-tinyrack-component-raised\">\n <TRTable.Row>\n <AdminStickySelectCell header>\n <AdminSelectAll\n checked={selection.allOnPage}\n indeterminate={selection.someOnPage}\n onChange={selection.togglePage}\n />\n </AdminStickySelectCell>\n <AdminStickyIdentityCell header>\n <AdminSortButton\n direction={\n filters.sort === 'email' ? filters.direction : undefined\n }\n label={t('admin.users.email')}\n onClick={() =>\n resetSelectionAndSet({\n ...filters,\n sort: 'email',\n direction:\n filters.sort === 'email' &&\n filters.direction === 'asc'\n ? 'desc'\n : 'asc',\n page: 1,\n })\n }\n />\n </AdminStickyIdentityCell>\n <TRTable.Head>\n <AdminSortButton\n direction={\n filters.sort === 'role' ? filters.direction : undefined\n }\n label={t('admin.users.role')}\n onClick={() =>\n resetSelectionAndSet({\n ...filters,\n sort: 'role',\n direction:\n filters.sort === 'role' && filters.direction === 'asc'\n ? 'desc'\n : 'asc',\n page: 1,\n })\n }\n />\n </TRTable.Head>\n <TRTable.Head>{t('admin.users.managedBy')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.emailVerified')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.twoFactor')}</TRTable.Head>\n <TRTable.Head>{t('admin.table.status')}</TRTable.Head>\n <TRTable.Head>{t('admin.users.sub')}</TRTable.Head>\n <AdminStickyActionCell header>\n {t('admin.table.actions')}\n </AdminStickyActionCell>\n </TRTable.Row>\n </TRTable.Header>\n <TRTable.Body>\n {data.users.length === 0 ? (\n <TRTable.Row>\n <TRTable.Cell\n className=\"py-tinyrack-3xl text-center\"\n colSpan={9}\n >\n {t('admin.table.empty')}\n </TRTable.Cell>\n </TRTable.Row>\n ) : (\n data.users.map((managedUser) => (\n <TRTable.Row\n className={\n selection.isSelected(managedUser.sub)\n ? 'bg-tinyrack-surface-selected'\n : undefined\n }\n data-selected={\n selection.isSelected(managedUser.sub) ? '' : undefined\n }\n key={managedUser.sub}\n >\n <AdminStickySelectCell\n selected={selection.isSelected(managedUser.sub)}\n >\n <AdminRowCheckbox\n checked={selection.isSelected(managedUser.sub)}\n label={t('admin.selection.row', {\n name: managedUser.email,\n })}\n onChange={(checked) =>\n selection.toggleOne(managedUser.sub, checked)\n }\n />\n </AdminStickySelectCell>\n <AdminStickyIdentityCell\n selected={selection.isSelected(managedUser.sub)}\n >\n <TRText as=\"p\" truncate variant=\"bodySm\" weight=\"medium\">\n {managedUser.email}\n </TRText>\n </AdminStickyIdentityCell>\n <TRTable.Cell>\n <TRBadge\n variant={\n managedUser.role === 'admin' ? 'info' : 'neutral'\n }\n >\n {formatAdminRole(t, managedUser.role)}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n {formatManagedBy(t, managedUser.managed_by)}\n </TRTable.Cell>\n <TRTable.Cell>\n {t(\n managedUser.email_verified ? 'common.yes' : 'common.no',\n )}\n </TRTable.Cell>\n <TRTable.Cell>\n {t(\n managedUser.totp_registered ||\n managedUser.passkey_count > 0\n ? 'common.yes'\n : 'common.no',\n )}\n </TRTable.Cell>\n <TRTable.Cell>\n <TRBadge\n className=\"whitespace-nowrap\"\n variant={managedUser.deleted_at ? 'neutral' : 'success'}\n >\n {t(\n managedUser.deleted_at\n ? 'admin.status.inactive'\n : 'admin.status.active',\n )}\n </TRBadge>\n </TRTable.Cell>\n <TRTable.Cell>\n <TRText as=\"span\" variant=\"code\">\n {managedUser.sub}\n </TRText>\n </TRTable.Cell>\n <AdminStickyActionCell\n selected={selection.isSelected(managedUser.sub)}\n >\n {managedUser.deleted_at ? (\n <TRButton\n disabled={managedUser.managed_by === 'config'}\n onClick={() =>\n restoreMutation.mutate(managedUser.sub)\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.actions.restore')}\n </TRButton>\n ) : (\n <div className=\"flex justify-end gap-tinyrack-xs\">\n <TRButton\n appearance=\"ghost\"\n disabled={managedUser.managed_by === 'config'}\n onClick={() =>\n setModal({ type: 'edit', user: managedUser })\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.actions.edit')}\n </TRButton>\n <TRButton\n appearance=\"ghost\"\n disabled={\n managedUser.managed_by === 'config' ||\n managedUser.sub === user.sub\n }\n onClick={() =>\n setModal({ type: 'delete', user: managedUser })\n }\n type=\"button\"\n uiSize=\"sm\"\n >\n {t('admin.actions.deactivate')}\n </TRButton>\n </div>\n )}\n </AdminStickyActionCell>\n </TRTable.Row>\n ))\n )}\n </TRTable.Body>\n </AdminTable>\n <AdminPagination\n onPageChange={(page) => {\n selection.clear();\n setFilters({ ...filters, page });\n }}\n onPageSizeChange={(pageSize) =>\n resetSelectionAndSet({ ...filters, page: 1, pageSize })\n }\n page={filters.page}\n pageSize={filters.pageSize}\n total={data.pagination.total}\n />\n </AdminTableFrame>\n </div>\n {selected > 0 ? (\n <AdminBulkBar\n canExpand={\n selection.allOnPage && data.pagination.total > data.users.length\n }\n filterSelected={selection.selection.kind === 'filter'}\n onActivate={() => setBulkActive(true)}\n onClear={selection.clear}\n onDeactivate={() => setBulkActive(false)}\n onExpand={selection.selectFilter}\n pending={bulkMutation.isPending}\n selected={selected}\n total={data.pagination.total}\n />\n ) : null}\n <Modal\n isOpen={bulkActive !== null}\n onClose={() => setBulkActive(null)}\n title={t(\n bulkActive\n ? 'admin.bulk.activateTitle'\n : 'admin.bulk.deactivateTitle',\n )}\n >\n <div className=\"pt-tinyrack-lg\">\n <TRText color=\"muted\" variant=\"bodySm\">\n {t('admin.bulk.confirm', {\n count: selected,\n scope: t(\n selection.selection.kind === 'filter'\n ? 'admin.selection.filterScope'\n : 'admin.selection.pageScope',\n ),\n })}\n </TRText>\n <ModalActions>\n <TRButton onClick={() => setBulkActive(null)} type=\"button\">\n {t('common.dismiss')}\n </TRButton>\n <TRButton\n intent={bulkActive ? 'primary' : 'danger'}\n onClick={() =>\n bulkMutation.mutate({ target, active: bulkActive ?? true })\n }\n type=\"button\"\n >\n {t('admin.bulk.run')}\n </TRButton>\n </ModalActions>\n </div>\n </Modal>\n <AdminUserFormModal\n isMutating={mutating}\n modal={modal}\n onClose={() => setModal(null)}\n onCreate={(values) => createMutation.mutate(values)}\n onDelete={(sub) => deleteMutation.mutate(sub)}\n onUpdate={(values) => updateMutation.mutate(values)}\n />\n </AdminShell>\n );\n}\n"],"mappings":"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"}