@tinyrack/issuary-server 0.22.0 → 0.23.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 (306) hide show
  1. package/dist/entities/oauth-client.entity.d.ts +0 -18
  2. package/dist/entities/oauth-client.entity.d.ts.map +1 -1
  3. package/dist/entities/oauth-code.entity.d.ts +0 -18
  4. package/dist/entities/oauth-code.entity.d.ts.map +1 -1
  5. package/dist/entities/oauth-device-code.entity.d.ts +0 -18
  6. package/dist/entities/oauth-device-code.entity.d.ts.map +1 -1
  7. package/dist/entities/revoked-token.entity.d.ts +0 -18
  8. package/dist/entities/revoked-token.entity.d.ts.map +1 -1
  9. package/dist/entities/terms-content.entity.d.ts +0 -9
  10. package/dist/entities/terms-content.entity.d.ts.map +1 -1
  11. package/dist/entities/terms.entity.d.ts +0 -9
  12. package/dist/entities/terms.entity.d.ts.map +1 -1
  13. package/dist/entities/user-consent.entity.d.ts +0 -18
  14. package/dist/entities/user-consent.entity.d.ts.map +1 -1
  15. package/dist/entities/user-terms-consent.entity.d.ts +0 -9
  16. package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
  17. package/dist/entities/user-totp-recovery-code.entity.d.ts +0 -9
  18. package/dist/entities/user-totp-recovery-code.entity.d.ts.map +1 -1
  19. package/dist/entities/user-totp.entity.d.ts +0 -9
  20. package/dist/entities/user-totp.entity.d.ts.map +1 -1
  21. package/dist/entities/user.entity.d.ts +0 -9
  22. package/dist/entities/user.entity.d.ts.map +1 -1
  23. package/dist/entities/user.entity.js +0 -4
  24. package/dist/entities/user.entity.js.map +1 -1
  25. package/dist/entrypoints/app.d.ts +0 -53
  26. package/dist/entrypoints/app.d.ts.map +1 -1
  27. package/dist/entrypoints/database/postgres/compiled-functions.d.ts +20 -23
  28. package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
  29. package/dist/entrypoints/database/postgres/compiled-functions.js +104 -134
  30. package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
  31. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +20 -23
  32. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
  33. package/dist/entrypoints/database/sqlite/compiled-functions.js +104 -134
  34. package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
  35. package/dist/lib/config/resolved.d.ts +0 -1
  36. package/dist/lib/config/resolved.d.ts.map +1 -1
  37. package/dist/lib/config/security.d.ts +0 -2
  38. package/dist/lib/config/security.d.ts.map +1 -1
  39. package/dist/lib/config/security.js +0 -5
  40. package/dist/lib/config/security.js.map +1 -1
  41. package/dist/middleware/auth.d.ts +0 -8
  42. package/dist/middleware/auth.d.ts.map +1 -1
  43. package/dist/middleware/auth.js +0 -64
  44. package/dist/middleware/auth.js.map +1 -1
  45. package/dist/middleware/session.d.ts +0 -9
  46. package/dist/middleware/session.d.ts.map +1 -1
  47. package/dist/middleware/session.js +0 -18
  48. package/dist/middleware/session.js.map +1 -1
  49. package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.d.ts +6 -0
  50. package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.d.ts.map +1 -0
  51. package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.js +19 -0
  52. package/dist/migrations/postgres/Migration20260825140000_drop_password_reset_required.js.map +1 -0
  53. package/dist/migrations/postgres/index.d.ts.map +1 -1
  54. package/dist/migrations/postgres/index.js +2 -0
  55. package/dist/migrations/postgres/index.js.map +1 -1
  56. package/dist/migrations/sqlite/Migration20260825140000_drop_password_reset_required.d.ts +6 -0
  57. package/dist/migrations/sqlite/Migration20260825140000_drop_password_reset_required.d.ts.map +1 -0
  58. package/dist/migrations/sqlite/Migration20260825140000_drop_password_reset_required.js +19 -0
  59. package/dist/migrations/sqlite/Migration20260825140000_drop_password_reset_required.js.map +1 -0
  60. package/dist/migrations/sqlite/index.d.ts.map +1 -1
  61. package/dist/migrations/sqlite/index.js +2 -0
  62. package/dist/migrations/sqlite/index.js.map +1 -1
  63. package/dist/repositories/oauth-code.repository.d.ts +2 -2
  64. package/dist/repositories/oauth-code.repository.d.ts.map +1 -1
  65. package/dist/repositories/oauth-code.repository.js +3 -7
  66. package/dist/repositories/oauth-code.repository.js.map +1 -1
  67. package/dist/repositories/oauth-device-code.repository.d.ts +4 -4
  68. package/dist/repositories/oauth-device-code.repository.d.ts.map +1 -1
  69. package/dist/repositories/oauth-device-code.repository.js +6 -18
  70. package/dist/repositories/oauth-device-code.repository.js.map +1 -1
  71. package/dist/repositories/user-totp-recovery-code.repository.d.ts +1 -7
  72. package/dist/repositories/user-totp-recovery-code.repository.d.ts.map +1 -1
  73. package/dist/repositories/user-totp-recovery-code.repository.js +1 -2
  74. package/dist/repositories/user-totp-recovery-code.repository.js.map +1 -1
  75. package/dist/repositories/user-totp.repository.d.ts +0 -9
  76. package/dist/repositories/user-totp.repository.d.ts.map +1 -1
  77. package/dist/routes/api/auth/index.d.ts +0 -52
  78. package/dist/routes/api/auth/index.d.ts.map +1 -1
  79. package/dist/routes/api/auth/index.js +0 -2
  80. package/dist/routes/api/auth/index.js.map +1 -1
  81. package/dist/routes/api/auth/passkey/verify/post.d.ts +0 -37
  82. package/dist/routes/api/auth/passkey/verify/post.d.ts.map +1 -1
  83. package/dist/routes/api/auth/passkey/verify/post.js +2 -8
  84. package/dist/routes/api/auth/passkey/verify/post.js.map +1 -1
  85. package/dist/routes/api/index.d.ts +0 -52
  86. package/dist/routes/api/index.d.ts.map +1 -1
  87. package/dist/routes/index.d.ts +0 -52
  88. package/dist/routes/index.d.ts.map +1 -1
  89. package/dist/routes/oauth/device/get-post.js +5 -5
  90. package/dist/routes/oauth/device/get-post.js.map +1 -1
  91. package/dist/schemas/error.d.ts +0 -25
  92. package/dist/schemas/error.d.ts.map +1 -1
  93. package/dist/schemas/error.js +0 -1
  94. package/dist/schemas/error.js.map +1 -1
  95. package/dist/schemas/response.d.ts +0 -22
  96. package/dist/schemas/response.d.ts.map +1 -1
  97. package/dist/schemas/response.js +0 -8
  98. package/dist/schemas/response.js.map +1 -1
  99. package/dist/seeders/config.seeder.js +0 -1
  100. package/dist/seeders/config.seeder.js.map +1 -1
  101. package/dist/services/container.d.ts +0 -1
  102. package/dist/services/container.d.ts.map +1 -1
  103. package/dist/services/container.js +0 -15
  104. package/dist/services/container.js.map +1 -1
  105. package/dist/services/oauth-client.service.d.ts +0 -1
  106. package/dist/services/oauth-client.service.d.ts.map +1 -1
  107. package/dist/services/oauth-client.service.js +2 -17
  108. package/dist/services/oauth-client.service.js.map +1 -1
  109. package/dist/services/oauth-connect.service.d.ts.map +1 -1
  110. package/dist/services/oauth-connect.service.js +0 -4
  111. package/dist/services/oauth-connect.service.js.map +1 -1
  112. package/dist/services/oauth-token.service.d.ts.map +1 -1
  113. package/dist/services/oauth-token.service.js +4 -4
  114. package/dist/services/oauth-token.service.js.map +1 -1
  115. package/dist/services/password-auth.service.d.ts.map +1 -1
  116. package/dist/services/password-auth.service.js +3 -12
  117. package/dist/services/password-auth.service.js.map +1 -1
  118. package/dist/services/security.service.d.ts +0 -8
  119. package/dist/services/security.service.d.ts.map +1 -1
  120. package/dist/services/security.service.js +21 -82
  121. package/dist/services/security.service.js.map +1 -1
  122. package/dist/services/totp.service.js +2 -2
  123. package/dist/services/totp.service.js.map +1 -1
  124. package/package.json +1 -1
  125. package/public/assets/2fa-B5vLgDXQ.js +2 -0
  126. package/public/assets/{2fa-BgveHSB_.js.map → 2fa-B5vLgDXQ.js.map} +1 -1
  127. package/public/assets/2fa-BqsM_D-X.js +2 -0
  128. package/public/assets/{2fa-kiqzGSz2.js.map → 2fa-BqsM_D-X.js.map} +1 -1
  129. package/public/assets/2fa-C5vUVgr_.js +2 -0
  130. package/public/assets/{2fa-UL_cNRnQ.js.map → 2fa-C5vUVgr_.js.map} +1 -1
  131. package/public/assets/2fa-CCOTIHDZ.js +2 -0
  132. package/public/assets/{2fa-C37MUkye.js.map → 2fa-CCOTIHDZ.js.map} +1 -1
  133. package/public/assets/{DialogHandle-Zvz8SgS0.js → DialogHandle-BmtK2pRn.js} +2 -2
  134. package/public/assets/{DialogHandle-Zvz8SgS0.js.map → DialogHandle-BmtK2pRn.js.map} +1 -1
  135. package/public/assets/admin-BPijkLw-.js +2 -0
  136. package/public/assets/{admin-DbDuu6AI.js.map → admin-BPijkLw-.js.map} +1 -1
  137. package/public/assets/admin-users-DvPbw1Vq.js +2 -0
  138. package/public/assets/{admin-users-CwTJdiih.js.map → admin-users-DvPbw1Vq.js.map} +1 -1
  139. package/public/assets/{auth-choice-row-BlSsUI7d.js → auth-choice-row-BCGjuedo.js} +2 -2
  140. package/public/assets/{auth-choice-row-BlSsUI7d.js.map → auth-choice-row-BCGjuedo.js.map} +1 -1
  141. package/public/assets/{auth-field-HwxENJnB.js → auth-field-DD8kvl--.js} +2 -2
  142. package/public/assets/{auth-field-HwxENJnB.js.map → auth-field-DD8kvl--.js.map} +1 -1
  143. package/public/assets/{auth-layout-CoeqNhTT.js → auth-layout-VtpryDof.js} +2 -2
  144. package/public/assets/{auth-layout-CoeqNhTT.js.map → auth-layout-VtpryDof.js.map} +1 -1
  145. package/public/assets/{auth-page-header-CIs08f5Y.js → auth-page-header-CIn2E4zI.js} +2 -2
  146. package/public/assets/{auth-page-header-CIs08f5Y.js.map → auth-page-header-CIn2E4zI.js.map} +1 -1
  147. package/public/assets/{authorization-context-banner-BbtQmMYH.js → authorization-context-banner-SOuBHWIb.js} +2 -2
  148. package/public/assets/{authorization-context-banner-BbtQmMYH.js.map → authorization-context-banner-SOuBHWIb.js.map} +1 -1
  149. package/public/assets/{avatar-CttWiIv3.js → avatar-BEQjf2x6.js} +2 -2
  150. package/public/assets/{avatar-CttWiIv3.js.map → avatar-BEQjf2x6.js.map} +1 -1
  151. package/public/assets/{checkbox-CJrRV8S1.js → checkbox-gdHnSFQ-.js} +2 -2
  152. package/public/assets/{checkbox-CJrRV8S1.js.map → checkbox-gdHnSFQ-.js.map} +1 -1
  153. package/public/assets/config-DTQCUlfZ.js +2 -0
  154. package/public/assets/config-DTQCUlfZ.js.map +1 -0
  155. package/public/assets/{consent-BIhxtXHx.js → consent-BqqFDdsr.js} +2 -2
  156. package/public/assets/{consent-BIhxtXHx.js.map → consent-BqqFDdsr.js.map} +1 -1
  157. package/public/assets/{consent-DRmENn26.js → consent-CfRbz2R7.js} +2 -2
  158. package/public/assets/{consent-DRmENn26.js.map → consent-CfRbz2R7.js.map} +1 -1
  159. package/public/assets/email-C5vUVgr_.js +2 -0
  160. package/public/assets/{email-UL_cNRnQ.js.map → email-C5vUVgr_.js.map} +1 -1
  161. package/public/assets/{email-CVRDeJ78.js → email-CKKakxPJ.js} +2 -2
  162. package/public/assets/{email-CVRDeJ78.js.map → email-CKKakxPJ.js.map} +1 -1
  163. package/public/assets/error-BMXxpgfR.js +2 -0
  164. package/public/assets/{error-2VPY5w8V.js.map → error-BMXxpgfR.js.map} +1 -1
  165. package/public/assets/{field-DDt6F9TZ.js → field-Cn4H1CUj.js} +2 -2
  166. package/public/assets/{field-DDt6F9TZ.js.map → field-Cn4H1CUj.js.map} +1 -1
  167. package/public/assets/forgot-C5vUVgr_.js +2 -0
  168. package/public/assets/{forgot-UL_cNRnQ.js.map → forgot-C5vUVgr_.js.map} +1 -1
  169. package/public/assets/forgot-rO9sByfV.js +2 -0
  170. package/public/assets/{forgot-DzDcduho.js.map → forgot-rO9sByfV.js.map} +1 -1
  171. package/public/assets/index-CS23Ozt6.js +11 -0
  172. package/public/assets/index-CS23Ozt6.js.map +1 -0
  173. package/public/assets/{initial-avatar-CZzHAPm3.js → initial-avatar-CtuDUz_W.js} +2 -2
  174. package/public/assets/{initial-avatar-CZzHAPm3.js.map → initial-avatar-CtuDUz_W.js.map} +1 -1
  175. package/public/assets/{input-CNRpSR08.js → input-CzQki7k6.js} +2 -2
  176. package/public/assets/{input-CNRpSR08.js.map → input-CzQki7k6.js.map} +1 -1
  177. package/public/assets/{labeled-separator-fnKySKv2.js → labeled-separator-CV7nb0XW.js} +2 -2
  178. package/public/assets/{labeled-separator-fnKySKv2.js.map → labeled-separator-CV7nb0XW.js.map} +1 -1
  179. package/public/assets/login-C5vUVgr_.js +2 -0
  180. package/public/assets/login-C5vUVgr_.js.map +1 -0
  181. package/public/assets/login-nukebli4.js +2 -0
  182. package/public/assets/login-nukebli4.js.map +1 -0
  183. package/public/assets/{logout-CHdmF_16.js → logout-B5T52P8u.js} +2 -2
  184. package/public/assets/{logout-CHdmF_16.js.map → logout-B5T52P8u.js.map} +1 -1
  185. package/public/assets/{modal-sCM_zT82.js → modal-BDQFucjz.js} +2 -2
  186. package/public/assets/{modal-sCM_zT82.js.map → modal-BDQFucjz.js.map} +1 -1
  187. package/public/assets/{mutationOptions-CrswitPs.js → mutationOptions-DyYFUbyn.js} +2 -2
  188. package/public/assets/{mutationOptions-CrswitPs.js.map → mutationOptions-DyYFUbyn.js.map} +1 -1
  189. package/public/assets/passkey-BE9JvJOP.js +2 -0
  190. package/public/assets/{passkey-CU8x9J2w.js.map → passkey-BE9JvJOP.js.map} +1 -1
  191. package/public/assets/passkey-C5vUVgr_.js +2 -0
  192. package/public/assets/{passkey-UL_cNRnQ.js.map → passkey-C5vUVgr_.js.map} +1 -1
  193. package/public/assets/passkey-CynCz1Dt.js +2 -0
  194. package/public/assets/{passkey-CEx1VZ5R.js.map → passkey-CynCz1Dt.js.map} +1 -1
  195. package/public/assets/passkey-J1qnYp9A.js +2 -0
  196. package/public/assets/{passkey-B2Blw47e.js.map → passkey-J1qnYp9A.js.map} +1 -1
  197. package/public/assets/password-C5vUVgr_.js +2 -0
  198. package/public/assets/password-C5vUVgr_.js.map +1 -0
  199. package/public/assets/password-RkUttbhD.js +2 -0
  200. package/public/assets/password-RkUttbhD.js.map +1 -0
  201. package/public/assets/password-reset-sU5KkBKi.js +2 -0
  202. package/public/assets/{password-reset-CIacHnvA.js.map → password-reset-sU5KkBKi.js.map} +1 -1
  203. package/public/assets/{password-strength-C0Zkrrct.js → password-strength-BeSOu_Ga.js} +2 -2
  204. package/public/assets/{password-strength-C0Zkrrct.js.map → password-strength-BeSOu_Ga.js.map} +1 -1
  205. package/public/assets/{pin-input-BlD4tPZJ.js → pin-input-Cc-VkrQ3.js} +2 -2
  206. package/public/assets/{pin-input-BlD4tPZJ.js.map → pin-input-Cc-VkrQ3.js.map} +1 -1
  207. package/public/assets/{profile-D43Yq-6S.js → profile-B5NaJfeS.js} +2 -2
  208. package/public/assets/{profile-D43Yq-6S.js.map → profile-B5NaJfeS.js.map} +1 -1
  209. package/public/assets/{profile-D1cEjfs8.js → profile-BcjsVYOx.js} +2 -2
  210. package/public/assets/{profile-D1cEjfs8.js.map → profile-BcjsVYOx.js.map} +1 -1
  211. package/public/assets/recovery-PnUATiUi.js +2 -0
  212. package/public/assets/{recovery-CLExnfYX.js.map → recovery-PnUATiUi.js.map} +1 -1
  213. package/public/assets/register-C5vUVgr_.js +2 -0
  214. package/public/assets/{register-UL_cNRnQ.js.map → register-C5vUVgr_.js.map} +1 -1
  215. package/public/assets/register-DQXhru0_.js +2 -0
  216. package/public/assets/{register-CZUyWXRO.js.map → register-DQXhru0_.js.map} +1 -1
  217. package/public/assets/reset-C5vUVgr_.js +2 -0
  218. package/public/assets/{reset-UL_cNRnQ.js.map → reset-C5vUVgr_.js.map} +1 -1
  219. package/public/assets/reset-CQgIa3yf.js +2 -0
  220. package/public/assets/reset-CQgIa3yf.js.map +1 -0
  221. package/public/assets/select-C5vUVgr_.js +2 -0
  222. package/public/assets/{select-UL_cNRnQ.js.map → select-C5vUVgr_.js.map} +1 -1
  223. package/public/assets/{select-CWdSzsVo.js → select-DqZynXSt.js} +2 -2
  224. package/public/assets/{select-CWdSzsVo.js.map → select-DqZynXSt.js.map} +1 -1
  225. package/public/assets/{separator-BWGym8uM.js → separator-B0Bvh1he.js} +2 -2
  226. package/public/assets/{separator-BWGym8uM.js.map → separator-B0Bvh1he.js.map} +1 -1
  227. package/public/assets/shell-header-bar-CjG5qvPg.js +2 -0
  228. package/public/assets/{shell-header-bar-C9AB5lT-.js.map → shell-header-bar-CjG5qvPg.js.map} +1 -1
  229. package/public/assets/{terms-D43Yq-6S.js → terms-B5NaJfeS.js} +2 -2
  230. package/public/assets/{terms-D43Yq-6S.js.map → terms-B5NaJfeS.js.map} +1 -1
  231. package/public/assets/{terms-COVFmzyl.js → terms-BHDAgn-H.js} +2 -2
  232. package/public/assets/{terms-COVFmzyl.js.map → terms-BHDAgn-H.js.map} +1 -1
  233. package/public/assets/{terms-checkbox-list-Cw0zB-lO.js → terms-checkbox-list-6jteUTIZ.js} +2 -2
  234. package/public/assets/{terms-checkbox-list-Cw0zB-lO.js.map → terms-checkbox-list-6jteUTIZ.js.map} +1 -1
  235. package/public/assets/{totp-BfCm6IWl.js → totp-BNZ904Zm.js} +2 -2
  236. package/public/assets/{totp-BfCm6IWl.js.map → totp-BNZ904Zm.js.map} +1 -1
  237. package/public/assets/totp-CJtfVNEq.js +2 -0
  238. package/public/assets/{totp-BFJEXxk0.js.map → totp-CJtfVNEq.js.map} +1 -1
  239. package/public/assets/totp-ECvOUcFx.js +2 -0
  240. package/public/assets/{totp-MINhsVxT.js.map → totp-ECvOUcFx.js.map} +1 -1
  241. package/public/assets/use-totp-setup-BbS3XcZA.js +3 -0
  242. package/public/assets/{use-totp-setup-C7Zk_2IY.js.map → use-totp-setup-BbS3XcZA.js.map} +1 -1
  243. package/public/assets/{useAriaLabelledBy-CiOCg6X5.js → useAriaLabelledBy-ByuMi3Ry.js} +2 -2
  244. package/public/assets/{useAriaLabelledBy-CiOCg6X5.js.map → useAriaLabelledBy-ByuMi3Ry.js.map} +1 -1
  245. package/public/assets/{useMutation-ZLFeJg75.js → useMutation-BWZ0G4Td.js} +2 -2
  246. package/public/assets/{useMutation-ZLFeJg75.js.map → useMutation-BWZ0G4Td.js.map} +1 -1
  247. package/public/assets/useQuery-Ckxjmvtl.js +2 -0
  248. package/public/assets/{useQuery-BvMz34BW.js.map → useQuery-Ckxjmvtl.js.map} +1 -1
  249. package/public/assets/{users-COM7u3A-.js → users-CmFxrCQT.js} +2 -2
  250. package/public/assets/{users-COM7u3A-.js.map → users-CmFxrCQT.js.map} +1 -1
  251. package/public/index.html +3 -4
  252. package/dist/routes/api/auth/password/reset-required/post.d.ts +0 -18
  253. package/dist/routes/api/auth/password/reset-required/post.d.ts.map +0 -1
  254. package/dist/routes/api/auth/password/reset-required/post.js +0 -39
  255. package/dist/routes/api/auth/password/reset-required/post.js.map +0 -1
  256. package/dist/services/legacy-credential-retirement.service.d.ts +0 -20
  257. package/dist/services/legacy-credential-retirement.service.d.ts.map +0 -1
  258. package/dist/services/legacy-credential-retirement.service.js +0 -90
  259. package/dist/services/legacy-credential-retirement.service.js.map +0 -1
  260. package/public/assets/2fa-BgveHSB_.js +0 -2
  261. package/public/assets/2fa-C37MUkye.js +0 -2
  262. package/public/assets/2fa-UL_cNRnQ.js +0 -2
  263. package/public/assets/2fa-kiqzGSz2.js +0 -2
  264. package/public/assets/admin-DbDuu6AI.js +0 -2
  265. package/public/assets/admin-users-CwTJdiih.js +0 -2
  266. package/public/assets/config-v3-oy_ef.js +0 -2
  267. package/public/assets/config-v3-oy_ef.js.map +0 -1
  268. package/public/assets/email-UL_cNRnQ.js +0 -2
  269. package/public/assets/error-2VPY5w8V.js +0 -2
  270. package/public/assets/forgot-DzDcduho.js +0 -2
  271. package/public/assets/forgot-UL_cNRnQ.js +0 -2
  272. package/public/assets/index-gliHKncz.js +0 -11
  273. package/public/assets/index-gliHKncz.js.map +0 -1
  274. package/public/assets/link-BN90emXr.js +0 -2
  275. package/public/assets/link-BN90emXr.js.map +0 -1
  276. package/public/assets/lock-keyhole-Cz72xkCn.js +0 -2
  277. package/public/assets/lock-keyhole-Cz72xkCn.js.map +0 -1
  278. package/public/assets/login-C6m2qSUt.js +0 -2
  279. package/public/assets/login-C6m2qSUt.js.map +0 -1
  280. package/public/assets/login-UL_cNRnQ.js +0 -2
  281. package/public/assets/login-UL_cNRnQ.js.map +0 -1
  282. package/public/assets/passkey-B2Blw47e.js +0 -2
  283. package/public/assets/passkey-CEx1VZ5R.js +0 -2
  284. package/public/assets/passkey-CU8x9J2w.js +0 -2
  285. package/public/assets/passkey-UL_cNRnQ.js +0 -2
  286. package/public/assets/password-BhU_a0cR.js +0 -2
  287. package/public/assets/password-BhU_a0cR.js.map +0 -1
  288. package/public/assets/password-UL_cNRnQ.js +0 -2
  289. package/public/assets/password-UL_cNRnQ.js.map +0 -1
  290. package/public/assets/password-reset-CIacHnvA.js +0 -2
  291. package/public/assets/recovery-CLExnfYX.js +0 -2
  292. package/public/assets/register-CZUyWXRO.js +0 -2
  293. package/public/assets/register-UL_cNRnQ.js +0 -2
  294. package/public/assets/reset-N3RQTYEB.js +0 -2
  295. package/public/assets/reset-N3RQTYEB.js.map +0 -1
  296. package/public/assets/reset-UL_cNRnQ.js +0 -2
  297. package/public/assets/reset-required-Cv5edDS6.js +0 -2
  298. package/public/assets/reset-required-Cv5edDS6.js.map +0 -1
  299. package/public/assets/reset-required-UL_cNRnQ.js +0 -2
  300. package/public/assets/reset-required-UL_cNRnQ.js.map +0 -1
  301. package/public/assets/select-UL_cNRnQ.js +0 -2
  302. package/public/assets/shell-header-bar-C9AB5lT-.js +0 -2
  303. package/public/assets/totp-BFJEXxk0.js +0 -2
  304. package/public/assets/totp-MINhsVxT.js +0 -2
  305. package/public/assets/use-totp-setup-C7Zk_2IY.js +0 -3
  306. package/public/assets/useQuery-BvMz34BW.js +0 -2
@@ -1,2 +1,2 @@
1
- import{q as e}from"./createLucideIcon-BPpAIXR_.js";import{t}from"./avatar-CttWiIv3.js";var n=e(),r={sm:{"--tr-avatar-size":`2rem`,"--tr-avatar-font-size":`var(--tinyrack-text-sm)`},md:{"--tr-avatar-size":`3rem`,"--tr-avatar-font-size":`var(--tinyrack-text-xl)`},lg:{"--tr-avatar-size":`4rem`,"--tr-avatar-font-size":`var(--tinyrack-text-2xl)`}};function i({email:e,size:i=`md`}){let a=e.charAt(0).toUpperCase();return(0,n.jsx)(t.Root,{className:`shrink-0 font-tinyrack-bold`,shape:`circle`,style:{...r[i],"--tr-avatar-background":`var(--tinyrack-primary)`,"--tr-avatar-color":`var(--tinyrack-on-primary)`,"--tr-avatar-border":`transparent`},children:(0,n.jsx)(t.Fallback,{children:a})})}export{i as t};
2
- //# sourceMappingURL=initial-avatar-CZzHAPm3.js.map
1
+ import{q as e}from"./createLucideIcon-BPpAIXR_.js";import{t}from"./avatar-BEQjf2x6.js";var n=e(),r={sm:{"--tr-avatar-size":`2rem`,"--tr-avatar-font-size":`var(--tinyrack-text-sm)`},md:{"--tr-avatar-size":`3rem`,"--tr-avatar-font-size":`var(--tinyrack-text-xl)`},lg:{"--tr-avatar-size":`4rem`,"--tr-avatar-font-size":`var(--tinyrack-text-2xl)`}};function i({email:e,size:i=`md`}){let a=e.charAt(0).toUpperCase();return(0,n.jsx)(t.Root,{className:`shrink-0 font-tinyrack-bold`,shape:`circle`,style:{...r[i],"--tr-avatar-background":`var(--tinyrack-primary)`,"--tr-avatar-color":`var(--tinyrack-on-primary)`,"--tr-avatar-border":`transparent`},children:(0,n.jsx)(t.Fallback,{children:a})})}export{i as t};
2
+ //# sourceMappingURL=initial-avatar-CtuDUz_W.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initial-avatar-CZzHAPm3.js","names":[],"sources":["../../../frontend/src/components/ui/initial-avatar.tsx"],"sourcesContent":["import { TRAvatar } from '@tinyrack/ui/components/avatar';\nimport type { CSSProperties } from 'react';\n\ntype InitialAvatarProps = {\n email: string;\n size?: 'sm' | 'md' | 'lg';\n};\n\n/**\n * Brand-colored initial avatar built on the design system's `TRAvatar`.\n * Size, font size and the primary color pair are applied through the\n * component's own `--tr-avatar-*` custom properties so it composes the\n * design system rather than re-implementing an avatar.\n */\nconst sizeVars: Record<\n NonNullable<InitialAvatarProps['size']>,\n CSSProperties\n> = {\n sm: {\n '--tr-avatar-size': '2rem',\n '--tr-avatar-font-size': 'var(--tinyrack-text-sm)',\n } as CSSProperties,\n md: {\n '--tr-avatar-size': '3rem',\n '--tr-avatar-font-size': 'var(--tinyrack-text-xl)',\n } as CSSProperties,\n lg: {\n '--tr-avatar-size': '4rem',\n '--tr-avatar-font-size': 'var(--tinyrack-text-2xl)',\n } as CSSProperties,\n};\n\nexport function InitialAvatar({ email, size = 'md' }: InitialAvatarProps) {\n const initial = email.charAt(0).toUpperCase();\n\n return (\n <TRAvatar.Root\n className=\"shrink-0 font-tinyrack-bold\"\n shape=\"circle\"\n style={\n {\n ...sizeVars[size],\n '--tr-avatar-background': 'var(--tinyrack-primary)',\n '--tr-avatar-color': 'var(--tinyrack-on-primary)',\n '--tr-avatar-border': 'transparent',\n } as CSSProperties\n }\n >\n <TRAvatar.Fallback>{initial}</TRAvatar.Fallback>\n </TRAvatar.Root>\n );\n}\n"],"mappings":"iGAcM,EAGF,CACF,GAAI,CACF,mBAAoB,OACpB,wBAAyB,yBAC3B,EACA,GAAI,CACF,mBAAoB,OACpB,wBAAyB,yBAC3B,EACA,GAAI,CACF,mBAAoB,OACpB,wBAAyB,0BAC3B,CACF,EAEA,SAAgB,EAAc,CAAE,QAAO,OAAO,MAA4B,CACxE,IAAM,EAAU,EAAM,OAAO,CAAC,CAAC,CAAC,YAAY,EAE5C,OACE,EAAA,EAAA,IAAA,CAAC,EAAS,KAAV,CACE,UAAU,8BACV,MAAM,SACN,MACE,CACE,GAAG,EAAS,GACZ,yBAA0B,0BAC1B,oBAAqB,6BACrB,qBAAsB,aACxB,YAGF,EAAA,EAAA,IAAA,CAAC,EAAS,SAAV,CAAA,SAAoB,CAA2B,CAAA,CAClC,CAAA,CAEnB"}
1
+ {"version":3,"file":"initial-avatar-CtuDUz_W.js","names":[],"sources":["../../../frontend/src/components/ui/initial-avatar.tsx"],"sourcesContent":["import { TRAvatar } from '@tinyrack/ui/components/avatar';\nimport type { CSSProperties } from 'react';\n\ntype InitialAvatarProps = {\n email: string;\n size?: 'sm' | 'md' | 'lg';\n};\n\n/**\n * Brand-colored initial avatar built on the design system's `TRAvatar`.\n * Size, font size and the primary color pair are applied through the\n * component's own `--tr-avatar-*` custom properties so it composes the\n * design system rather than re-implementing an avatar.\n */\nconst sizeVars: Record<\n NonNullable<InitialAvatarProps['size']>,\n CSSProperties\n> = {\n sm: {\n '--tr-avatar-size': '2rem',\n '--tr-avatar-font-size': 'var(--tinyrack-text-sm)',\n } as CSSProperties,\n md: {\n '--tr-avatar-size': '3rem',\n '--tr-avatar-font-size': 'var(--tinyrack-text-xl)',\n } as CSSProperties,\n lg: {\n '--tr-avatar-size': '4rem',\n '--tr-avatar-font-size': 'var(--tinyrack-text-2xl)',\n } as CSSProperties,\n};\n\nexport function InitialAvatar({ email, size = 'md' }: InitialAvatarProps) {\n const initial = email.charAt(0).toUpperCase();\n\n return (\n <TRAvatar.Root\n className=\"shrink-0 font-tinyrack-bold\"\n shape=\"circle\"\n style={\n {\n ...sizeVars[size],\n '--tr-avatar-background': 'var(--tinyrack-primary)',\n '--tr-avatar-color': 'var(--tinyrack-on-primary)',\n '--tr-avatar-border': 'transparent',\n } as CSSProperties\n }\n >\n <TRAvatar.Fallback>{initial}</TRAvatar.Fallback>\n </TRAvatar.Root>\n );\n}\n"],"mappings":"iGAcM,EAGF,CACF,GAAI,CACF,mBAAoB,OACpB,wBAAyB,yBAC3B,EACA,GAAI,CACF,mBAAoB,OACpB,wBAAyB,yBAC3B,EACA,GAAI,CACF,mBAAoB,OACpB,wBAAyB,0BAC3B,CACF,EAEA,SAAgB,EAAc,CAAE,QAAO,OAAO,MAA4B,CACxE,IAAM,EAAU,EAAM,OAAO,CAAC,CAAC,CAAC,YAAY,EAE5C,OACE,EAAA,EAAA,IAAA,CAAC,EAAS,KAAV,CACE,UAAU,8BACV,MAAM,SACN,MACE,CACE,GAAG,EAAS,GACZ,yBAA0B,0BAC1B,oBAAqB,6BACrB,qBAAsB,aACxB,YAGF,EAAA,EAAA,IAAA,CAAC,EAAS,SAAV,CAAA,SAAoB,CAA2B,CAAA,CAClC,CAAA,CAEnB"}
@@ -1,2 +1,2 @@
1
- import{G as e,J as t,W as n,Z as r,q as i}from"./createLucideIcon-BPpAIXR_.js";import{xn as a}from"./config-v3-oy_ef.js";import{n as o}from"./field-DDt6F9TZ.js";var s=i(),c=r(t(),1),l=(0,c.createContext)(!1);function u(){return(0,c.useContext)(l)}var d=c.forwardRef(function(e,t){return(0,s.jsx)(o,{ref:t,...e})});function f({className:t,uiSize:n=`md`,appearance:r=`solid`,...i}){a();let o=u();return(0,s.jsx)(d,{...i,className:e(o?`tr-input tr-input-group-input`:`tr-input`,t),"data-appearance":r,"data-ui-size":n})}function p({className:e,type:t=`button`,...r}){return(0,s.jsx)(`button`,{...r,className:n(`tr-input-group-action`,e),type:t})}function m({className:e,side:t=`start`,...r}){return(0,s.jsx)(`span`,{...r,className:n(`tr-input-group-adornment`,e),"data-side":t})}function h({children:e,className:t,uiSize:r=`md`,...i}){return a(),(0,s.jsx)(`div`,{...i,className:n(`tr-input-group`,t),"data-ui-size":r,children:(0,s.jsx)(l,{value:!0,children:e})})}var g=Object.assign(f,{Group:h,Adornment:m,Action:p});export{g as t};
2
- //# sourceMappingURL=input-CNRpSR08.js.map
1
+ import{G as e,J as t,W as n,Z as r,q as i}from"./createLucideIcon-BPpAIXR_.js";import{xn as a}from"./config-DTQCUlfZ.js";import{n as o}from"./field-Cn4H1CUj.js";var s=i(),c=r(t(),1),l=(0,c.createContext)(!1);function u(){return(0,c.useContext)(l)}var d=c.forwardRef(function(e,t){return(0,s.jsx)(o,{ref:t,...e})});function f({className:t,uiSize:n=`md`,appearance:r=`solid`,...i}){a();let o=u();return(0,s.jsx)(d,{...i,className:e(o?`tr-input tr-input-group-input`:`tr-input`,t),"data-appearance":r,"data-ui-size":n})}function p({className:e,type:t=`button`,...r}){return(0,s.jsx)(`button`,{...r,className:n(`tr-input-group-action`,e),type:t})}function m({className:e,side:t=`start`,...r}){return(0,s.jsx)(`span`,{...r,className:n(`tr-input-group-adornment`,e),"data-side":t})}function h({children:e,className:t,uiSize:r=`md`,...i}){return a(),(0,s.jsx)(`div`,{...i,className:n(`tr-input-group`,t),"data-ui-size":r,children:(0,s.jsx)(l,{value:!0,children:e})})}var g=Object.assign(f,{Group:h,Adornment:m,Action:p});export{g as t};
2
+ //# sourceMappingURL=input-CzQki7k6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-CNRpSR08.js","names":["Field.Control","TRInput"],"sources":["../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-group-context.js","../../../../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/input/Input.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-action.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-adornment.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-group.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/index.js"],"sourcesContent":["\"use client\";\nimport { createContext, useContext } from \"react\";\n//#region src/components/input/input-group-context.ts\n/**\n* Lets an `Input` discover that it is rendered inside a `Group` so it can take\n* the group's control styling itself. Without it a caller would have to write\n* the internal `tr-input-group-input` class by hand, which is the thing the\n* group is meant to spare them.\n*/\nconst TRInputGroupContext = createContext(false);\nfunction useIsInsideTRInputGroup() {\n\treturn useContext(TRInputGroupContext);\n}\n//#endregion\nexport { TRInputGroupContext, useIsInsideTRInputGroup };\n\n//# sourceMappingURL=input-group-context.js.map","'use client';\n\nimport * as React from 'react';\nimport { Field } from \"../field/index.mjs\";\n\n/**\n * A native input element that automatically works with [Field](https://base-ui.com/react/components/field).\n * Renders an `<input>` element.\n *\n * Documentation: [Base UI Input](https://base-ui.com/react/components/input)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const Input = /*#__PURE__*/React.forwardRef(function Input(props, forwardedRef) {\n return /*#__PURE__*/_jsx(Field.Control, {\n ref: forwardedRef,\n ...props\n });\n});\nif (process.env.NODE_ENV !== \"production\") Input.displayName = \"Input\";","\"use client\";\nimport { useTinyrackFocusModality } from \"../../providers/focus-modality/focus-modality-provider.js\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { useIsInsideTRInputGroup } from \"./input-group-context.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Input } from \"@base-ui/react/input\";\n//#region src/components/input/input.tsx\nfunction TRInput({ className, uiSize = \"md\", appearance = \"solid\", ...props }) {\n\tuseTinyrackFocusModality();\n\tconst insideGroup = useIsInsideTRInputGroup();\n\treturn /* @__PURE__ */ jsx(Input, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(insideGroup ? \"tr-input tr-input-group-input\" : \"tr-input\", className),\n\t\t\"data-appearance\": appearance,\n\t\t\"data-ui-size\": uiSize\n\t});\n}\n//#endregion\nexport { TRInput };\n\n//# sourceMappingURL=input.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/input/input-action.tsx\n/**\n* A control at the edge of a `Group` — reveal a password, clear the value, run\n* a search.\n*\n* Defaults to `type=\"button\"` so it cannot accidentally submit the surrounding\n* form. It is a real button and stays in the tab order, so give it an\n* accessible name.\n*/\nfunction TRInputAction({ className, type = \"button\", ...props }) {\n\treturn /* @__PURE__ */ jsx(\"button\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-input-group-action\", className),\n\t\ttype\n\t});\n}\n//#endregion\nexport { TRInputAction };\n\n//# sourceMappingURL=input-action.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/input/input-adornment.tsx\n/**\n* Static content inside a `Group` — a leading icon, a unit, a prefix.\n*\n* Not interactive: it does not take pointer events, so clicking it still\n* focuses the input. Use `Action` for something the user can press, and mark\n* decorative icons `aria-hidden` so the field keeps a single accessible name.\n*/\nfunction TRInputAdornment({ className, side = \"start\", ...props }) {\n\treturn /* @__PURE__ */ jsx(\"span\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-input-group-adornment\", className),\n\t\t\"data-side\": side\n\t});\n}\n//#endregion\nexport { TRInputAdornment };\n\n//# sourceMappingURL=input-adornment.js.map","\"use client\";\nimport { useTinyrackFocusModality } from \"../../providers/focus-modality/focus-modality-provider.js\";\nimport { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { TRInputGroupContext } from \"./input-group-context.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/input/input-group.tsx\n/**\n* Frames an input together with adornments and actions so they read as one\n* control: the border, background, and focus ring belong to the group, and the\n* input inside it goes flat.\n*\n* The group owns the control height, so size it here rather than on the input.\n*/\nfunction TRInputGroup({ children, className, uiSize = \"md\", ...props }) {\n\tuseTinyrackFocusModality();\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-input-group\", className),\n\t\t\"data-ui-size\": uiSize,\n\t\tchildren: /* @__PURE__ */ jsx(TRInputGroupContext, {\n\t\t\tvalue: true,\n\t\t\tchildren\n\t\t})\n\t});\n}\n//#endregion\nexport { TRInputGroup };\n\n//# sourceMappingURL=input-group.js.map","import { TRInput as TRInput$1 } from \"./input.js\";\nimport { TRInputAction } from \"./input-action.js\";\nimport { TRInputAdornment } from \"./input-adornment.js\";\nimport { TRInputGroup } from \"./input-group.js\";\n//#region src/components/input/index.tsx\n/**\n* `TRInput` stays directly renderable for the common single-control case and\n* carries the group parts as a namespace, so adding an adornment never means\n* changing the element you already render.\n*/\nconst TRInput = Object.assign(TRInput$1, {\n\tGroup: TRInputGroup,\n\tAdornment: TRInputAdornment,\n\tAction: TRInputAction\n});\n//#endregion\nexport { TRInput, TRInputAction, TRInputAdornment, TRInputGroup };\n\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0,1,2,3,4,5,6],"mappings":"sLASA,GAAA,EAAA,EAAA,cAAA,CAAA,EAAA,EACA,SAAA,GAAA,0BAEA,CCAA,IAAa,EAAqB,EAAM,WAAW,SAAe,EAAO,EAAc,CACrF,OAAoB,EAAA,EAAA,IAAA,CAAKA,EAAe,CACtC,IAAK,EACL,GAAG,CACL,CAAC,CACH,CAAC,ECVD,SAASC,EAAQ,CAAE,YAAW,SAAS,KAAM,aAAa,QAAS,GAAG,GAAS,CAC9E,EAAyB,EACzB,IAAM,EAAc,EAAwB,EAC5C,OAAuB,EAAA,EAAA,IAAA,CAAI,EAAO,CACjC,GAAG,EACH,UAAW,EAAwB,EAAc,gCAAkC,WAAY,CAAS,EACxG,kBAAmB,EACnB,eAAgB,CACjB,CAAC,CACF,CCLA,SAAS,EAAc,CAAE,YAAW,OAAO,SAAU,GAAG,GAAS,CAChE,OAAuB,EAAA,EAAA,IAAA,CAAI,SAAU,CACpC,GAAG,EACH,UAAW,EAAgB,wBAAyB,CAAS,EAC7D,MACD,CAAC,CACF,CCPA,SAAS,EAAiB,CAAE,YAAW,OAAO,QAAS,GAAG,GAAS,CAClE,OAAuB,EAAA,EAAA,IAAA,CAAI,OAAQ,CAClC,GAAG,EACH,UAAW,EAAgB,2BAA4B,CAAS,EAChE,YAAa,CACd,CAAC,CACF,CCHA,SAAS,EAAa,CAAE,WAAU,YAAW,SAAS,KAAM,GAAG,GAAS,CAEvE,OADA,EAAyB,GACF,EAAA,EAAA,IAAA,CAAI,MAAO,CACjC,GAAG,EACH,UAAW,EAAgB,iBAAkB,CAAS,EACtD,eAAgB,EAChB,UAA0B,EAAA,EAAA,IAAA,CAAI,EAAqB,CAClD,MAAO,GACP,UACD,CAAC,CACF,CAAC,CACF,CCdA,IAAM,EAAU,OAAO,OAAO,EAAW,CACxC,MAAO,EACP,UAAW,EACX,OAAQ,CACT,CAAC"}
1
+ {"version":3,"file":"input-CzQki7k6.js","names":["Field.Control","TRInput"],"sources":["../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-group-context.js","../../../../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/input/Input.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-action.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-adornment.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-group.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/index.js"],"sourcesContent":["\"use client\";\nimport { createContext, useContext } from \"react\";\n//#region src/components/input/input-group-context.ts\n/**\n* Lets an `Input` discover that it is rendered inside a `Group` so it can take\n* the group's control styling itself. Without it a caller would have to write\n* the internal `tr-input-group-input` class by hand, which is the thing the\n* group is meant to spare them.\n*/\nconst TRInputGroupContext = createContext(false);\nfunction useIsInsideTRInputGroup() {\n\treturn useContext(TRInputGroupContext);\n}\n//#endregion\nexport { TRInputGroupContext, useIsInsideTRInputGroup };\n\n//# sourceMappingURL=input-group-context.js.map","'use client';\n\nimport * as React from 'react';\nimport { Field } from \"../field/index.mjs\";\n\n/**\n * A native input element that automatically works with [Field](https://base-ui.com/react/components/field).\n * Renders an `<input>` element.\n *\n * Documentation: [Base UI Input](https://base-ui.com/react/components/input)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const Input = /*#__PURE__*/React.forwardRef(function Input(props, forwardedRef) {\n return /*#__PURE__*/_jsx(Field.Control, {\n ref: forwardedRef,\n ...props\n });\n});\nif (process.env.NODE_ENV !== \"production\") Input.displayName = \"Input\";","\"use client\";\nimport { useTinyrackFocusModality } from \"../../providers/focus-modality/focus-modality-provider.js\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { useIsInsideTRInputGroup } from \"./input-group-context.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Input } from \"@base-ui/react/input\";\n//#region src/components/input/input.tsx\nfunction TRInput({ className, uiSize = \"md\", appearance = \"solid\", ...props }) {\n\tuseTinyrackFocusModality();\n\tconst insideGroup = useIsInsideTRInputGroup();\n\treturn /* @__PURE__ */ jsx(Input, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(insideGroup ? \"tr-input tr-input-group-input\" : \"tr-input\", className),\n\t\t\"data-appearance\": appearance,\n\t\t\"data-ui-size\": uiSize\n\t});\n}\n//#endregion\nexport { TRInput };\n\n//# sourceMappingURL=input.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/input/input-action.tsx\n/**\n* A control at the edge of a `Group` — reveal a password, clear the value, run\n* a search.\n*\n* Defaults to `type=\"button\"` so it cannot accidentally submit the surrounding\n* form. It is a real button and stays in the tab order, so give it an\n* accessible name.\n*/\nfunction TRInputAction({ className, type = \"button\", ...props }) {\n\treturn /* @__PURE__ */ jsx(\"button\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-input-group-action\", className),\n\t\ttype\n\t});\n}\n//#endregion\nexport { TRInputAction };\n\n//# sourceMappingURL=input-action.js.map","import { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/input/input-adornment.tsx\n/**\n* Static content inside a `Group` — a leading icon, a unit, a prefix.\n*\n* Not interactive: it does not take pointer events, so clicking it still\n* focuses the input. Use `Action` for something the user can press, and mark\n* decorative icons `aria-hidden` so the field keeps a single accessible name.\n*/\nfunction TRInputAdornment({ className, side = \"start\", ...props }) {\n\treturn /* @__PURE__ */ jsx(\"span\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-input-group-adornment\", className),\n\t\t\"data-side\": side\n\t});\n}\n//#endregion\nexport { TRInputAdornment };\n\n//# sourceMappingURL=input-adornment.js.map","\"use client\";\nimport { useTinyrackFocusModality } from \"../../providers/focus-modality/focus-modality-provider.js\";\nimport { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { TRInputGroupContext } from \"./input-group-context.js\";\nimport { jsx } from \"react/jsx-runtime\";\n//#region src/components/input/input-group.tsx\n/**\n* Frames an input together with adornments and actions so they read as one\n* control: the border, background, and focus ring belong to the group, and the\n* input inside it goes flat.\n*\n* The group owns the control height, so size it here rather than on the input.\n*/\nfunction TRInputGroup({ children, className, uiSize = \"md\", ...props }) {\n\tuseTinyrackFocusModality();\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t...props,\n\t\tclassName: mergeClassNames(\"tr-input-group\", className),\n\t\t\"data-ui-size\": uiSize,\n\t\tchildren: /* @__PURE__ */ jsx(TRInputGroupContext, {\n\t\t\tvalue: true,\n\t\t\tchildren\n\t\t})\n\t});\n}\n//#endregion\nexport { TRInputGroup };\n\n//# sourceMappingURL=input-group.js.map","import { TRInput as TRInput$1 } from \"./input.js\";\nimport { TRInputAction } from \"./input-action.js\";\nimport { TRInputAdornment } from \"./input-adornment.js\";\nimport { TRInputGroup } from \"./input-group.js\";\n//#region src/components/input/index.tsx\n/**\n* `TRInput` stays directly renderable for the common single-control case and\n* carries the group parts as a namespace, so adding an adornment never means\n* changing the element you already render.\n*/\nconst TRInput = Object.assign(TRInput$1, {\n\tGroup: TRInputGroup,\n\tAdornment: TRInputAdornment,\n\tAction: TRInputAction\n});\n//#endregion\nexport { TRInput, TRInputAction, TRInputAdornment, TRInputGroup };\n\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0,1,2,3,4,5,6],"mappings":"sLASA,GAAA,EAAA,EAAA,cAAA,CAAA,EAAA,EACA,SAAA,GAAA,0BAEA,CCAA,IAAa,EAAqB,EAAM,WAAW,SAAe,EAAO,EAAc,CACrF,OAAoB,EAAA,EAAA,IAAA,CAAKA,EAAe,CACtC,IAAK,EACL,GAAG,CACL,CAAC,CACH,CAAC,ECVD,SAASC,EAAQ,CAAE,YAAW,SAAS,KAAM,aAAa,QAAS,GAAG,GAAS,CAC9E,EAAyB,EACzB,IAAM,EAAc,EAAwB,EAC5C,OAAuB,EAAA,EAAA,IAAA,CAAI,EAAO,CACjC,GAAG,EACH,UAAW,EAAwB,EAAc,gCAAkC,WAAY,CAAS,EACxG,kBAAmB,EACnB,eAAgB,CACjB,CAAC,CACF,CCLA,SAAS,EAAc,CAAE,YAAW,OAAO,SAAU,GAAG,GAAS,CAChE,OAAuB,EAAA,EAAA,IAAA,CAAI,SAAU,CACpC,GAAG,EACH,UAAW,EAAgB,wBAAyB,CAAS,EAC7D,MACD,CAAC,CACF,CCPA,SAAS,EAAiB,CAAE,YAAW,OAAO,QAAS,GAAG,GAAS,CAClE,OAAuB,EAAA,EAAA,IAAA,CAAI,OAAQ,CAClC,GAAG,EACH,UAAW,EAAgB,2BAA4B,CAAS,EAChE,YAAa,CACd,CAAC,CACF,CCHA,SAAS,EAAa,CAAE,WAAU,YAAW,SAAS,KAAM,GAAG,GAAS,CAEvE,OADA,EAAyB,GACF,EAAA,EAAA,IAAA,CAAI,MAAO,CACjC,GAAG,EACH,UAAW,EAAgB,iBAAkB,CAAS,EACtD,eAAgB,EAChB,UAA0B,EAAA,EAAA,IAAA,CAAI,EAAqB,CAClD,MAAO,GACP,UACD,CAAC,CACF,CAAC,CACF,CCdA,IAAM,EAAU,OAAO,OAAO,EAAW,CACxC,MAAO,EACP,UAAW,EACX,OAAQ,CACT,CAAC"}
@@ -1,2 +1,2 @@
1
- import{n as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{t as n}from"./separator-BWGym8uM.js";var r=t();function i({label:t,className:i=``}){return t?(0,r.jsxs)(`div`,{className:`flex items-center gap-tinyrack-md ${i}`,children:[(0,r.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,r.jsx)(n,{orientation:`horizontal`})}),(0,r.jsx)(e,{color:`muted`,variant:`caption`,children:t}),(0,r.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,r.jsx)(n,{orientation:`horizontal`})})]}):(0,r.jsx)(n,{className:i,orientation:`horizontal`})}export{i as t};
2
- //# sourceMappingURL=labeled-separator-fnKySKv2.js.map
1
+ import{n as e,q as t}from"./createLucideIcon-BPpAIXR_.js";import{t as n}from"./separator-B0Bvh1he.js";var r=t();function i({label:t,className:i=``}){return t?(0,r.jsxs)(`div`,{className:`flex items-center gap-tinyrack-md ${i}`,children:[(0,r.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,r.jsx)(n,{orientation:`horizontal`})}),(0,r.jsx)(e,{color:`muted`,variant:`caption`,children:t}),(0,r.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,r.jsx)(n,{orientation:`horizontal`})})]}):(0,r.jsx)(n,{className:i,orientation:`horizontal`})}export{i as t};
2
+ //# sourceMappingURL=labeled-separator-CV7nb0XW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"labeled-separator-fnKySKv2.js","names":[],"sources":["../../../frontend/src/components/ui/labeled-separator.tsx"],"sourcesContent":["import { TRSeparator } from '@tinyrack/ui/components/separator';\nimport { TRText } from '@tinyrack/ui/components/text';\n\ntype LabeledSeparatorProps = {\n /** Omit for a plain rule. */\n label?: string;\n className?: string;\n};\n\n/**\n * A rule that can carry a centred label (\"or\", \"Terms\").\n *\n * Two separators flank the label so the line reads as continuous. Replaces\n * the old `Divider` plus two hand-rolled copies of the same markup in the\n * register and terms screens.\n */\nexport function LabeledSeparator({\n label,\n className = '',\n}: LabeledSeparatorProps) {\n if (!label) {\n return <TRSeparator className={className} orientation=\"horizontal\" />;\n }\n\n return (\n <div className={`flex items-center gap-tinyrack-md ${className}`}>\n {/*\n The rules are wrapped rather than flexed directly: TRSeparator sets its\n own `inline-size`, which a width utility on the element does not\n override, so each rule would demand the full container width and the\n row would overflow as soon as the label is more than a word or two.\n */}\n <div className=\"min-w-0 flex-1\">\n <TRSeparator orientation=\"horizontal\" />\n </div>\n <TRText color=\"muted\" variant=\"caption\">\n {label}\n </TRText>\n <div className=\"min-w-0 flex-1\">\n <TRSeparator orientation=\"horizontal\" />\n </div>\n </div>\n );\n}\n"],"mappings":"gHAgBA,SAAgB,EAAiB,CAC/B,QACA,YAAY,IACY,CAKxB,OAJK,GAKH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,qCAAqC,aAArD,EAOE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,2BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,YAAY,YAAc,CAAA,CACpC,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,mBAC3B,CACK,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,2BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,YAAY,YAAc,CAAA,CACpC,CAAA,CACF,KApBE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAwB,YAAW,YAAY,YAAc,CAAA,CAsBxE"}
1
+ {"version":3,"file":"labeled-separator-CV7nb0XW.js","names":[],"sources":["../../../frontend/src/components/ui/labeled-separator.tsx"],"sourcesContent":["import { TRSeparator } from '@tinyrack/ui/components/separator';\nimport { TRText } from '@tinyrack/ui/components/text';\n\ntype LabeledSeparatorProps = {\n /** Omit for a plain rule. */\n label?: string;\n className?: string;\n};\n\n/**\n * A rule that can carry a centred label (\"or\", \"Terms\").\n *\n * Two separators flank the label so the line reads as continuous. Replaces\n * the old `Divider` plus two hand-rolled copies of the same markup in the\n * register and terms screens.\n */\nexport function LabeledSeparator({\n label,\n className = '',\n}: LabeledSeparatorProps) {\n if (!label) {\n return <TRSeparator className={className} orientation=\"horizontal\" />;\n }\n\n return (\n <div className={`flex items-center gap-tinyrack-md ${className}`}>\n {/*\n The rules are wrapped rather than flexed directly: TRSeparator sets its\n own `inline-size`, which a width utility on the element does not\n override, so each rule would demand the full container width and the\n row would overflow as soon as the label is more than a word or two.\n */}\n <div className=\"min-w-0 flex-1\">\n <TRSeparator orientation=\"horizontal\" />\n </div>\n <TRText color=\"muted\" variant=\"caption\">\n {label}\n </TRText>\n <div className=\"min-w-0 flex-1\">\n <TRSeparator orientation=\"horizontal\" />\n </div>\n </div>\n );\n}\n"],"mappings":"gHAgBA,SAAgB,EAAiB,CAC/B,QACA,YAAY,IACY,CAKxB,OAJK,GAKH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,qCAAqC,aAArD,EAOE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,2BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,YAAY,YAAc,CAAA,CACpC,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,mBAC3B,CACK,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,2BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAa,YAAY,YAAc,CAAA,CACpC,CAAA,CACF,KApBE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAwB,YAAW,YAAY,YAAc,CAAA,CAsBxE"}
@@ -0,0 +1,2 @@
1
+ import{I as e}from"./index-CS23Ozt6.js";var t=e;export{t as errorComponent};
2
+ //# sourceMappingURL=login-C5vUVgr_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-C5vUVgr_.js","names":["RouteErrorFallback","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/login/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useRouter } from '@tanstack/react-router';\nimport { CircleAlertIcon, FingerprintIcon, MailIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthMethodTile } from '#frontend/components/auth/auth-method-tile.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { AuthorizationContextBanner } from '#frontend/components/auth/authorization-context-banner.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n hasAuthorizationContext,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { classifyPasskeyError } from '#frontend/libs/passkey-error.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { getAuthorizationContextQueryOptions } from '#frontend/queries/authorization-context.ts';\nimport {\n type AppConfigs,\n appConfigQueryOptions,\n} from '#frontend/queries/config.ts';\nimport { authenticateWithPasskeyMutationOptions } from '#frontend/queries/passkey.ts';\nimport {\n type AuthResponse,\n getSessionQueryOptions,\n} from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema.extend({\n oauth_error: z.string().optional(),\n oauth_error_description: z.string().optional(),\n});\n\nconst OAUTH_ERROR_I18N_MAP: Record<string, string> = {\n access_denied: 'oauth.error.accessDenied',\n temporarily_unavailable: 'oauth.error.temporarilyUnavailable',\n server_error: 'oauth.error.serverError',\n registration_email_not_allowed: 'oauth.error.registrationEmailNotAllowed',\n};\n\nexport const Route = createFileRoute('/login/')({\n component: Login,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n loaderDeps: ({ search }) => ({\n search,\n }),\n loader: async ({ context, deps }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n\n if (shouldRedirectToPassword(config, deps.search)) {\n throw redirect({\n to: '/login/password',\n search: extractOAuthParams(deps.search),\n replace: true,\n });\n }\n\n if (hasAuthorizationContext(deps.search)) {\n await context.queryClient.ensureQueryData(\n getAuthorizationContextQueryOptions(deps.search),\n );\n }\n },\n});\n\nfunction shouldRedirectToPassword(\n config: AppConfigs,\n search: z.infer<typeof SearchSchema>,\n): boolean {\n if (search.oauth_error) {\n return false;\n }\n\n return (\n config.auth.password.enabled &&\n !config.auth.passkey.enabled &&\n config.identity_providers.length === 0\n );\n}\n\nfunction Login() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const lang = search.lang ?? i18n.language;\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n\n // Get implicit notice from config for OAuth signup\n const implicitNotice =\n configData.registration.signup_notice?.[lang] ??\n configData.registration.signup_notice?.[configData.i18n.fallback_language];\n const oauthProviders = configData.identity_providers;\n\n const oauthError = search.oauth_error;\n const oauthErrorMessage = oauthError\n ? t(OAUTH_ERROR_I18N_MAP[oauthError] ?? 'oauth.error.failed')\n : undefined;\n\n const isPasswordAuthEnabled = configData.auth.password.enabled;\n const isPasskeyEnabled = configData.auth.passkey.enabled;\n const [passkeyError, setPasskeyError] = useState<string | null>(null);\n\n const handlePasskeySuccess = async (data: AuthResponse) => {\n if (data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, data);\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n }\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n };\n\n const passkeyLoginMutation = useMutation({\n ...authenticateWithPasskeyMutationOptions,\n onSuccess: (data) => {\n setPasskeyError(null);\n handlePasskeySuccess(data);\n },\n onError: (error) => {\n const reason = classifyPasskeyError(error);\n if (reason === 'unsupported') {\n setPasskeyError(t('login.passkey.error.unsupported'));\n return;\n }\n\n setPasskeyError(t('login.passkey.error.failed'));\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const buildOAuthUrl = (providerId: string) => {\n let oauthUrl = `/api/oauth/${providerId}/authorize?mode=login`;\n\n if (isOAuthFlow(search)) {\n const authUrl = new URL(buildAuthenticatedAuthorizeUrl(search));\n const returnUrl = `${authUrl.pathname}${authUrl.search}${authUrl.hash}`;\n oauthUrl += `&return_url=${encodeURIComponent(returnUrl)}`;\n }\n\n return oauthUrl;\n };\n\n const buildPasswordLoginHref = () => {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(extractOAuthParams(search))) {\n if (value !== undefined) {\n const stringValue = String(value);\n params.set(\n key,\n key === 'account_selected'\n ? decodeURIComponent(stringValue).replaceAll('\"', '')\n : stringValue,\n );\n }\n }\n const query = params.toString();\n return query ? `/login/password?${query}` : '/login/password';\n };\n\n return (\n <AuthLayout>\n {/*\n Branding title and subtitle are rendered once, by the brand panel in\n the layout. Repeating them here would give the page two copies of the\n product name and two heading nodes with the same text.\n */}\n <AuthPageHeader\n subtitle={t('login.selectMethod.subtitle') || undefined}\n title={t('login.title')}\n />\n\n <AuthorizationContextBanner search={search} />\n\n {oauthErrorMessage && (\n <Alert icon={CircleAlertIcon} type=\"error\">\n {oauthErrorMessage}\n </Alert>\n )}\n\n {passkeyError && (\n <Alert icon={CircleAlertIcon} type=\"error\">\n {passkeyError}\n </Alert>\n )}\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {oauthProviders.map((provider) => (\n <AuthMethodTile\n icon={provider.icon_url}\n key={provider.id}\n label={provider.display_name}\n providerType={provider.type}\n // Leaves the SPA for the provider, so a plain anchor rather than a\n // router link. No children here — the tile supplies them, and an\n // element passed to `render` would override them.\n render={<a href={buildOAuthUrl(provider.id)} />}\n />\n ))}\n\n {isPasswordAuthEnabled && (\n <AuthMethodTile\n icon={<MailIcon aria-hidden className=\"size-tinyrack-xl\" />}\n label={t('login.method.password')}\n render={<a href={buildPasswordLoginHref()} />}\n />\n )}\n\n {isPasskeyEnabled && (\n <AuthMethodTile\n disabled={passkeyLoginMutation.isPending}\n icon={<FingerprintIcon aria-hidden className=\"size-tinyrack-xl\" />}\n isLoading={passkeyLoginMutation.isPending}\n label={t('login.method.passkey')}\n onClick={() => {\n setPasskeyError(null);\n passkeyLoginMutation.mutate();\n }}\n />\n )}\n </div>\n\n {implicitNotice && (\n <div\n className=\"prose prose-sm text-center text-tinyrack-text-muted text-tinyrack-xs! **:text-tinyrack-xs!\"\n dangerouslySetInnerHTML={{ __html: implicitNotice }}\n />\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"wCAcsF,IAAAC,EAA7ED"}
@@ -0,0 +1,2 @@
1
+ import{J as e,Z as t,i as n,n as r,q as i,s as a}from"./createLucideIcon-BPpAIXR_.js";import{On as o,Sr as s,t as c}from"./config-DTQCUlfZ.js";import{t as l}from"./useMutation-BWZ0G4Td.js";import{tt as u}from"./shell-header-bar-CjG5qvPg.js";import{t as d}from"./fingerprint-pattern-DP62Vk8x.js";import{t as f}from"./authorization-context-banner-SOuBHWIb.js";import{a as p,n as m,r as h,t as g}from"./provider-logos-u1YURWQr.js";import{t as _}from"./mail-D0B_1Dzd.js";import{F as v,N as y,R as b,S as x,b as S,j as C,z as w}from"./index-CS23Ozt6.js";import{t as T}from"./auth-page-header-CIn2E4zI.js";import{t as E}from"./alert-leqyvHOp.js";import{t as D}from"./auth-layout-VtpryDof.js";import{t as O}from"./promise-OpBtq8tG.js";import{t as k}from"./passkey-error-ZqqPQUta.js";import{t as A}from"./passkey-J1qnYp9A.js";var j=t(e()),M=i(),N={google:(0,M.jsx)(h,{className:`size-tinyrack-xl`}),github:(0,M.jsx)(m,{className:`size-tinyrack-xl`}),apple:(0,M.jsx)(g,{className:`size-tinyrack-xl`})};function P({icon:e,label:t,providerType:n,render:i,onClick:o,isLoading:s,disabled:c}){let l;l=n&&n!==`generic_oauth`?N[n]:typeof e==`string`?(0,M.jsx)(`img`,{alt:``,className:`size-tinyrack-xl`,src:e}):e||(0,M.jsx)(p,{"aria-hidden":!0,className:`size-tinyrack-xl`});let u=(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`span`,{className:`flex size-tinyrack-xl shrink-0 items-center justify-center`,children:l}),(0,M.jsx)(r,{truncate:!0,variant:`body`,children:t})]}),d=`w-full justify-start gap-tinyrack-md transition-colors duration-tinyrack-fast ease-tinyrack-standard`;return i?(0,M.jsx)(w,{appearance:`outline`,className:`cursor-pointer ${d}`,intent:`neutral`,render:i,uiSize:`lg`,children:u}):(0,M.jsx)(a,{appearance:`outline`,className:d,disabled:c,intent:`neutral`,loading:s,onClick:o,type:`button`,uiSize:`lg`,children:u})}var F={access_denied:`oauth.error.accessDenied`,temporarily_unavailable:`oauth.error.temporarilyUnavailable`,server_error:`oauth.error.serverError`,registration_email_not_allowed:`oauth.error.registrationEmailNotAllowed`};function I(){let{t:e,i18n:t}=n(),r=o(),i=s(),a=S.useSearch(),p=a.lang??t.language,{data:m}=u(c),h=m.registration.signup_notice?.[p]??m.registration.signup_notice?.[m.i18n.fallback_language],g=m.identity_providers,w=a.oauth_error,N=w?e(F[w]??`oauth.error.failed`):void 0,I=m.auth.password.enabled,L=m.auth.passkey.enabled,[R,z]=(0,j.useState)(null),B=async e=>{e.user&&(i.setQueryData(x.queryKey,e),await O(),v(a)?window.location.href=C(a):r.navigate({to:`/profile`})),i.invalidateQueries({queryKey:x.queryKey})},V=l({...A,onSuccess:e=>{z(null),B(e)},onError:t=>{if(k(t)===`unsupported`){z(e(`login.passkey.error.unsupported`));return}z(e(`login.passkey.error.failed`))},onSettled:()=>{i.invalidateQueries({queryKey:x.queryKey})}}),H=e=>{let t=`/api/oauth/${e}/authorize?mode=login`;if(v(a)){let e=new URL(C(a)),n=`${e.pathname}${e.search}${e.hash}`;t+=`&return_url=${encodeURIComponent(n)}`}return t};return(0,M.jsxs)(D,{children:[(0,M.jsx)(T,{subtitle:e(`login.selectMethod.subtitle`)||void 0,title:e(`login.title`)}),(0,M.jsx)(f,{search:a}),N&&(0,M.jsx)(E,{icon:b,type:`error`,children:N}),R&&(0,M.jsx)(E,{icon:b,type:`error`,children:R}),(0,M.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[g.map(e=>(0,M.jsx)(P,{icon:e.icon_url,label:e.display_name,providerType:e.type,render:(0,M.jsx)(`a`,{href:H(e.id)})},e.id)),I&&(0,M.jsx)(P,{icon:(0,M.jsx)(_,{"aria-hidden":!0,className:`size-tinyrack-xl`}),label:e(`login.method.password`),render:(0,M.jsx)(`a`,{href:(()=>{let e=new URLSearchParams;for(let[t,n]of Object.entries(y(a)))if(n!==void 0){let r=String(n);e.set(t,t===`account_selected`?decodeURIComponent(r).replaceAll(`"`,``):r)}let t=e.toString();return t?`/login/password?${t}`:`/login/password`})()})}),L&&(0,M.jsx)(P,{disabled:V.isPending,icon:(0,M.jsx)(d,{"aria-hidden":!0,className:`size-tinyrack-xl`}),isLoading:V.isPending,label:e(`login.method.passkey`),onClick:()=>{z(null),V.mutate()}})]}),h&&(0,M.jsx)(`div`,{className:`prose prose-sm text-center text-tinyrack-text-muted text-tinyrack-xs! **:text-tinyrack-xs!`,dangerouslySetInnerHTML:{__html:h}})]})}export{I as component};
2
+ //# sourceMappingURL=login-nukebli4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-nukebli4.js","names":["useMutation","useQueryClient","useSuspenseQuery","useRouter","CircleAlertIcon","FingerprintIcon","MailIcon","useState","useTranslation","AuthMethodTile","AuthPageHeader","AuthorizationContextBanner","Alert","AuthLayout","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","classifyPasskeyError","tick","appConfigQueryOptions","authenticateWithPasskeyMutationOptions","getSessionQueryOptions","OAUTH_ERROR_I18N_MAP","Record","access_denied","temporarily_unavailable","server_error","registration_email_not_allowed","Route","Login","t","i18n","router","queryClient","search","useSearch","lang","language","data","configData","implicitNotice","registration","signup_notice","fallback_language","oauthProviders","identity_providers","oauthError","oauth_error","oauthErrorMessage","undefined","isPasswordAuthEnabled","auth","password","enabled","isPasskeyEnabled","passkey","passkeyError","setPasskeyError","handlePasskeySuccess","AuthResponse","user","setQueryData","queryKey","window","location","href","navigate","to","invalidateQueries","passkeyLoginMutation","onSuccess","onError","error","reason","onSettled","buildOAuthUrl","providerId","oauthUrl","authUrl","URL","returnUrl","pathname","hash","encodeURIComponent","buildPasswordLoginHref","params","URLSearchParams","key","value","Object","entries","stringValue","String","set","decodeURIComponent","replaceAll","query","toString","map","provider","icon_url","id","display_name","type","isPending","mutate","__html","component"],"sources":["../../../frontend/src/components/auth/auth-method-tile.tsx","../../../frontend/src/routes/login/index.tsx?tsr-split=component"],"sourcesContent":["import { TRButton } from '@tinyrack/ui/components/button';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { LinkIcon } from 'lucide-react';\nimport type { ReactElement, ReactNode } from 'react';\nimport {\n AppleLogo,\n GithubLogo,\n GoogleLogo,\n} from '#frontend/components/auth/provider-logos.tsx';\nimport type { OAuthProviderType } from '#frontend/queries/config.ts';\n\ntype AuthMethodTileBaseProps = {\n /** A provider icon URL, or a ready-made element. */\n icon?: string | ReactNode;\n label: string;\n providerType?: OAuthProviderType;\n};\n\ntype AuthMethodTileProps = AuthMethodTileBaseProps &\n (\n | {\n /** Navigating method (OAuth, or the email form). Must be a real anchor. */\n render: ReactElement;\n onClick?: never;\n isLoading?: never;\n disabled?: never;\n }\n | {\n render?: never;\n /** In-page method (passkey), which runs a ceremony instead of navigating. */\n onClick: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n }\n );\n\nconst PROVIDER_LOGOS: Record<\n Exclude<OAuthProviderType, 'generic_oauth'>,\n ReactNode\n> = {\n google: <GoogleLogo className=\"size-tinyrack-xl\" />,\n github: <GithubLogo className=\"size-tinyrack-xl\" />,\n apple: <AppleLogo className=\"size-tinyrack-xl\" />,\n};\n\n/**\n * One sign-in method on the method chooser.\n *\n * Full-width rows at every breakpoint. The previous three-across grid gave\n * each tile a third of the card, so provider names wrapped onto two lines and\n * the icons and labels never lined up between tiles.\n */\nexport function AuthMethodTile({\n icon,\n label,\n providerType,\n render,\n onClick,\n isLoading,\n disabled,\n}: AuthMethodTileProps) {\n let leading: ReactNode;\n if (providerType && providerType !== 'generic_oauth') {\n leading = PROVIDER_LOGOS[providerType];\n } else if (typeof icon === 'string') {\n leading = <img alt=\"\" className=\"size-tinyrack-xl\" src={icon} />;\n } else if (icon) {\n leading = icon;\n } else {\n leading = <LinkIcon aria-hidden className=\"size-tinyrack-xl\" />;\n }\n\n const content = (\n <>\n <span className=\"flex size-tinyrack-xl shrink-0 items-center justify-center\">\n {leading}\n </span>\n <TRText truncate variant=\"body\">\n {label}\n </TRText>\n </>\n );\n\n const className =\n 'w-full justify-start gap-tinyrack-md transition-colors duration-tinyrack-fast ease-tinyrack-standard';\n\n if (render) {\n return (\n <TRLinkButton\n appearance=\"outline\"\n className={`cursor-pointer ${className}`}\n intent=\"neutral\"\n render={render}\n uiSize=\"lg\"\n >\n {content}\n </TRLinkButton>\n );\n }\n\n return (\n <TRButton\n appearance=\"outline\"\n className={className}\n disabled={disabled}\n intent=\"neutral\"\n loading={isLoading}\n onClick={onClick}\n type=\"button\"\n uiSize=\"lg\"\n >\n {content}\n </TRButton>\n );\n}\n","import {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useRouter } from '@tanstack/react-router';\nimport { CircleAlertIcon, FingerprintIcon, MailIcon } from 'lucide-react';\nimport { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthMethodTile } from '#frontend/components/auth/auth-method-tile.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { AuthorizationContextBanner } from '#frontend/components/auth/authorization-context-banner.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n hasAuthorizationContext,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { classifyPasskeyError } from '#frontend/libs/passkey-error.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { getAuthorizationContextQueryOptions } from '#frontend/queries/authorization-context.ts';\nimport {\n type AppConfigs,\n appConfigQueryOptions,\n} from '#frontend/queries/config.ts';\nimport { authenticateWithPasskeyMutationOptions } from '#frontend/queries/passkey.ts';\nimport {\n type AuthResponse,\n getSessionQueryOptions,\n} from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema.extend({\n oauth_error: z.string().optional(),\n oauth_error_description: z.string().optional(),\n});\n\nconst OAUTH_ERROR_I18N_MAP: Record<string, string> = {\n access_denied: 'oauth.error.accessDenied',\n temporarily_unavailable: 'oauth.error.temporarilyUnavailable',\n server_error: 'oauth.error.serverError',\n registration_email_not_allowed: 'oauth.error.registrationEmailNotAllowed',\n};\n\nexport const Route = createFileRoute('/login/')({\n component: Login,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n loaderDeps: ({ search }) => ({\n search,\n }),\n loader: async ({ context, deps }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n\n if (shouldRedirectToPassword(config, deps.search)) {\n throw redirect({\n to: '/login/password',\n search: extractOAuthParams(deps.search),\n replace: true,\n });\n }\n\n if (hasAuthorizationContext(deps.search)) {\n await context.queryClient.ensureQueryData(\n getAuthorizationContextQueryOptions(deps.search),\n );\n }\n },\n});\n\nfunction shouldRedirectToPassword(\n config: AppConfigs,\n search: z.infer<typeof SearchSchema>,\n): boolean {\n if (search.oauth_error) {\n return false;\n }\n\n return (\n config.auth.password.enabled &&\n !config.auth.passkey.enabled &&\n config.identity_providers.length === 0\n );\n}\n\nfunction Login() {\n const { t, i18n } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n\n const lang = search.lang ?? i18n.language;\n const { data: configData } = useSuspenseQuery(appConfigQueryOptions);\n\n // Get implicit notice from config for OAuth signup\n const implicitNotice =\n configData.registration.signup_notice?.[lang] ??\n configData.registration.signup_notice?.[configData.i18n.fallback_language];\n const oauthProviders = configData.identity_providers;\n\n const oauthError = search.oauth_error;\n const oauthErrorMessage = oauthError\n ? t(OAUTH_ERROR_I18N_MAP[oauthError] ?? 'oauth.error.failed')\n : undefined;\n\n const isPasswordAuthEnabled = configData.auth.password.enabled;\n const isPasskeyEnabled = configData.auth.passkey.enabled;\n const [passkeyError, setPasskeyError] = useState<string | null>(null);\n\n const handlePasskeySuccess = async (data: AuthResponse) => {\n if (data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, data);\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n }\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n };\n\n const passkeyLoginMutation = useMutation({\n ...authenticateWithPasskeyMutationOptions,\n onSuccess: (data) => {\n setPasskeyError(null);\n handlePasskeySuccess(data);\n },\n onError: (error) => {\n const reason = classifyPasskeyError(error);\n if (reason === 'unsupported') {\n setPasskeyError(t('login.passkey.error.unsupported'));\n return;\n }\n\n setPasskeyError(t('login.passkey.error.failed'));\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const buildOAuthUrl = (providerId: string) => {\n let oauthUrl = `/api/oauth/${providerId}/authorize?mode=login`;\n\n if (isOAuthFlow(search)) {\n const authUrl = new URL(buildAuthenticatedAuthorizeUrl(search));\n const returnUrl = `${authUrl.pathname}${authUrl.search}${authUrl.hash}`;\n oauthUrl += `&return_url=${encodeURIComponent(returnUrl)}`;\n }\n\n return oauthUrl;\n };\n\n const buildPasswordLoginHref = () => {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(extractOAuthParams(search))) {\n if (value !== undefined) {\n const stringValue = String(value);\n params.set(\n key,\n key === 'account_selected'\n ? decodeURIComponent(stringValue).replaceAll('\"', '')\n : stringValue,\n );\n }\n }\n const query = params.toString();\n return query ? `/login/password?${query}` : '/login/password';\n };\n\n return (\n <AuthLayout>\n {/*\n Branding title and subtitle are rendered once, by the brand panel in\n the layout. Repeating them here would give the page two copies of the\n product name and two heading nodes with the same text.\n */}\n <AuthPageHeader\n subtitle={t('login.selectMethod.subtitle') || undefined}\n title={t('login.title')}\n />\n\n <AuthorizationContextBanner search={search} />\n\n {oauthErrorMessage && (\n <Alert icon={CircleAlertIcon} type=\"error\">\n {oauthErrorMessage}\n </Alert>\n )}\n\n {passkeyError && (\n <Alert icon={CircleAlertIcon} type=\"error\">\n {passkeyError}\n </Alert>\n )}\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {oauthProviders.map((provider) => (\n <AuthMethodTile\n icon={provider.icon_url}\n key={provider.id}\n label={provider.display_name}\n providerType={provider.type}\n // Leaves the SPA for the provider, so a plain anchor rather than a\n // router link. No children here — the tile supplies them, and an\n // element passed to `render` would override them.\n render={<a href={buildOAuthUrl(provider.id)} />}\n />\n ))}\n\n {isPasswordAuthEnabled && (\n <AuthMethodTile\n icon={<MailIcon aria-hidden className=\"size-tinyrack-xl\" />}\n label={t('login.method.password')}\n render={<a href={buildPasswordLoginHref()} />}\n />\n )}\n\n {isPasskeyEnabled && (\n <AuthMethodTile\n disabled={passkeyLoginMutation.isPending}\n icon={<FingerprintIcon aria-hidden className=\"size-tinyrack-xl\" />}\n isLoading={passkeyLoginMutation.isPending}\n label={t('login.method.passkey')}\n onClick={() => {\n setPasskeyError(null);\n passkeyLoginMutation.mutate();\n }}\n />\n )}\n </div>\n\n {implicitNotice && (\n <div\n className=\"prose prose-sm text-center text-tinyrack-text-muted text-tinyrack-xs! **:text-tinyrack-xs!\"\n dangerouslySetInnerHTML={{ __html: implicitNotice }}\n />\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./createLucideIcon-BPpAIXR_.js";import{i as t,r as n}from"./config-v3-oy_ef.js";import{t as r}from"./mutationOptions-CrswitPs.js";var i=e(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),a=r({mutationFn:async()=>t(await n.api.auth.logout.$post())});export{i as n,a as t};
2
- //# sourceMappingURL=logout-CHdmF_16.js.map
1
+ import{t as e}from"./createLucideIcon-BPpAIXR_.js";import{i as t,r as n}from"./config-DTQCUlfZ.js";import{t as r}from"./mutationOptions-DyYFUbyn.js";var i=e(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),a=r({mutationFn:async()=>t(await n.api.auth.logout.$post())});export{i as n,a as t};
2
+ //# sourceMappingURL=logout-B5T52P8u.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logout-CHdmF_16.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/log-out.mjs","../../../frontend/src/queries/logout.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: \"m16 17 5-5-5-5\", key: \"1bji2h\" }],\n [\"path\", { d: \"M21 12H9\", key: \"dn1m92\" }],\n [\"path\", { d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\", key: \"1uf3rs\" }]\n];\nconst LogOut = createLucideIcon(\"log-out\", __iconNode);\n\nexport { __iconNode, LogOut as default };\n//# sourceMappingURL=log-out.mjs.map\n","import { mutationOptions } from '@tanstack/react-query';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport const logoutMutationOptions = mutationOptions({\n mutationFn: async () => {\n const res = await client.api.auth.logout.$post();\n return jsonOk(res);\n },\n});\n"],"x_google_ignoreList":[0],"mappings":"qJAcA,IAAM,EAAS,EAAiB,UAAW,CAJzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAS,CAAC,EAC/C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,0CAA2C,IAAK,QAAS,CAAC,CAE/B,CAAU,ECXxC,EAAwB,EAAgB,CACnD,WAAY,SAEH,EAAO,MADI,EAAO,IAAI,KAAK,OAAO,MAAM,CAC9B,CAErB,CAAC"}
1
+ {"version":3,"file":"logout-B5T52P8u.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/log-out.mjs","../../../frontend/src/queries/logout.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: \"m16 17 5-5-5-5\", key: \"1bji2h\" }],\n [\"path\", { d: \"M21 12H9\", key: \"dn1m92\" }],\n [\"path\", { d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\", key: \"1uf3rs\" }]\n];\nconst LogOut = createLucideIcon(\"log-out\", __iconNode);\n\nexport { __iconNode, LogOut as default };\n//# sourceMappingURL=log-out.mjs.map\n","import { mutationOptions } from '@tanstack/react-query';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport const logoutMutationOptions = mutationOptions({\n mutationFn: async () => {\n const res = await client.api.auth.logout.$post();\n return jsonOk(res);\n },\n});\n"],"x_google_ignoreList":[0],"mappings":"qJAcA,IAAM,EAAS,EAAiB,UAAW,CAJzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAS,CAAC,EAC/C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,0CAA2C,IAAK,QAAS,CAAC,CAE/B,CAAU,ECXxC,EAAwB,EAAgB,CACnD,WAAY,SAEH,EAAO,MADI,EAAO,IAAI,KAAK,OAAO,MAAM,CAC9B,CAErB,CAAC"}
@@ -1,2 +1,2 @@
1
- import{G as e,J as t,Z as n,c as r,q as i}from"./createLucideIcon-BPpAIXR_.js";import{_ as a,bn as o,pt as s}from"./config-v3-oy_ef.js";import{N as c,V as l,et as u,o as d,z as f}from"./shell-header-bar-C9AB5lT-.js";import{a as p,c as m,d as h,f as g,i as _,l as v,n as y,o as b,r as x,s as S,u as C}from"./DialogHandle-Zvz8SgS0.js";var w=n(t(),1),T=w.forwardRef(function(e,t){let{render:n,className:i,style:o,forceRender:s=!1,...c}=e,l=g(),u=l.useState(`open`),d=l.useState(`nested`),f=l.useState(`mounted`);return r(`div`,e,{state:{open:u,transitionStatus:l.useState(`transitionStatus`)},ref:[l.context.backdropRef,t],stateAttributesMapping:a,props:[{role:`presentation`,hidden:!f,style:{userSelect:`none`,WebkitUserSelect:`none`}},c],enabled:s||!d})}),E=i(),D=w.forwardRef(function(e,t){let{render:n,className:i,style:a,finalFocus:o,initialFocus:c,...p}=e,m=g(),h=m.useState(`descriptionElementId`),y=m.useState(`disablePointerDismissal`),b=m.useState(`floatingRootContext`),x=m.useState(`popupProps`),S=m.useState(`modal`),C=m.useState(`mounted`),w=m.useState(`nested`),T=m.useState(`nestedOpenDialogCount`),D=m.useState(`open`),O=m.useState(`openMethod`),k=m.useState(`titleElementId`),A=m.useState(`transitionStatus`),j=m.useState(`role`),M=b.useState(`floatingId`);v(),s({open:D,ref:m.context.popupRef,onComplete(){D&&m.context.onOpenChangeComplete?.(!0)}});let N=c===void 0?l(m.context.popupRef):c,P=T>0,F=m.useStateSetter(`popupElement`),I=r(`div`,e,{state:{open:D,nested:w,transitionStatus:A,nestedDialogOpen:P},props:[x,{id:M,"aria-labelledby":k,"aria-describedby":h,role:j,...f,hidden:!C,onKeyDown(e){d.has(e.key)&&e.stopPropagation()},style:{"--nested-dialogs":T}},p],ref:[t,m.context.popupRef,F],stateAttributesMapping:_});return(0,E.jsx)(u,{context:b,openInteractionType:O,disabled:!C,closeOnFocusOut:!y,initialFocus:N,returnFocus:o,modal:S!==!1,restoreFocus:`popup`,children:I})});function O(e){return S(`dialog`,e)}var k=o(T,`tr-layer-backdrop tr-dialog-backdrop`),A=o(h,`tr-dialog-close`),j=o(C,`tr-dialog-description`);function M(){return y()}function N({className:t,placement:n=`middle`,...r}){return(0,E.jsx)(D,{...r,className:e(`tr-dialog tr-dialog-box`,t),"data-placement":n})}var P=o(m);function F(e){return(0,E.jsx)(O,{...e})}var I=o(b,`tr-dialog-title`),L=o(p,`tr-dialog-trigger`),R={Backdrop:k,Close:A,Description:j,Popup:N,Portal:P,Root:F,Viewport:o(x,`tr-layer-viewport tr-dialog-viewport`),Title:I,Trigger:L,createHandle:M},z={sm:`[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-sm)]`,md:`[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]`,lg:`[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]`},B={default:`bg-tinyrack-surface-muted text-tinyrack-text`,destructive:`bg-tinyrack-danger-surface text-tinyrack-danger`};function V({isOpen:e,onClose:t,title:n,description:r,children:i,size:a=`md`,preventClose:o=!1,icon:s,variant:l=`default`}){return(0,w.useEffect)(()=>{if(!e||o)return;let n=e=>{e.key===`Escape`&&t()};return document.addEventListener(`keydown`,n),()=>document.removeEventListener(`keydown`,n)},[e,o,t]),e?(0,E.jsx)(R.Root,{defaultOpen:!0,disablePointerDismissal:o,onOpenChange:e=>{!e&&!o&&t()},children:(0,E.jsx)(R.Portal,{children:(0,E.jsxs)(R.Viewport,{children:[(0,E.jsx)(R.Backdrop,{}),(0,E.jsxs)(R.Popup,{className:z[a],children:[(0,E.jsxs)(`div`,{className:`flex items-start gap-tinyrack-md`,children:[s&&(0,E.jsx)(`div`,{className:`flex size-tinyrack-2xl shrink-0 items-center justify-center rounded-tinyrack-full ${B[l]}`,children:(0,E.jsx)(s,{"aria-hidden":!0,className:`size-tinyrack-lg`})}),(0,E.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-tinyrack-3xs`,children:[(0,E.jsx)(R.Title,{children:n}),r&&(0,E.jsx)(R.Description,{className:`text-tinyrack-text-muted text-tinyrack-xs`,children:r})]}),!o&&(0,E.jsx)(R.Close,{"aria-label":`Close`,className:`shrink-0`,"data-testid":`modal-close`,children:(0,E.jsx)(c,{"aria-hidden":!0,className:`size-tinyrack-lg`})})]}),i]})]})})}):null}function H({children:e}){return(0,E.jsx)(`div`,{className:`flex justify-end gap-tinyrack-sm pt-tinyrack-lg`,children:e})}export{H as n,V as t};
2
- //# sourceMappingURL=modal-sCM_zT82.js.map
1
+ import{G as e,J as t,Z as n,c as r,q as i}from"./createLucideIcon-BPpAIXR_.js";import{_ as a,bn as o,pt as s}from"./config-DTQCUlfZ.js";import{N as c,V as l,et as u,o as d,z as f}from"./shell-header-bar-CjG5qvPg.js";import{a as p,c as m,d as h,f as g,i as _,l as v,n as y,o as b,r as x,s as S,u as C}from"./DialogHandle-BmtK2pRn.js";var w=n(t(),1),T=w.forwardRef(function(e,t){let{render:n,className:i,style:o,forceRender:s=!1,...c}=e,l=g(),u=l.useState(`open`),d=l.useState(`nested`),f=l.useState(`mounted`);return r(`div`,e,{state:{open:u,transitionStatus:l.useState(`transitionStatus`)},ref:[l.context.backdropRef,t],stateAttributesMapping:a,props:[{role:`presentation`,hidden:!f,style:{userSelect:`none`,WebkitUserSelect:`none`}},c],enabled:s||!d})}),E=i(),D=w.forwardRef(function(e,t){let{render:n,className:i,style:a,finalFocus:o,initialFocus:c,...p}=e,m=g(),h=m.useState(`descriptionElementId`),y=m.useState(`disablePointerDismissal`),b=m.useState(`floatingRootContext`),x=m.useState(`popupProps`),S=m.useState(`modal`),C=m.useState(`mounted`),w=m.useState(`nested`),T=m.useState(`nestedOpenDialogCount`),D=m.useState(`open`),O=m.useState(`openMethod`),k=m.useState(`titleElementId`),A=m.useState(`transitionStatus`),j=m.useState(`role`),M=b.useState(`floatingId`);v(),s({open:D,ref:m.context.popupRef,onComplete(){D&&m.context.onOpenChangeComplete?.(!0)}});let N=c===void 0?l(m.context.popupRef):c,P=T>0,F=m.useStateSetter(`popupElement`),I=r(`div`,e,{state:{open:D,nested:w,transitionStatus:A,nestedDialogOpen:P},props:[x,{id:M,"aria-labelledby":k,"aria-describedby":h,role:j,...f,hidden:!C,onKeyDown(e){d.has(e.key)&&e.stopPropagation()},style:{"--nested-dialogs":T}},p],ref:[t,m.context.popupRef,F],stateAttributesMapping:_});return(0,E.jsx)(u,{context:b,openInteractionType:O,disabled:!C,closeOnFocusOut:!y,initialFocus:N,returnFocus:o,modal:S!==!1,restoreFocus:`popup`,children:I})});function O(e){return S(`dialog`,e)}var k=o(T,`tr-layer-backdrop tr-dialog-backdrop`),A=o(h,`tr-dialog-close`),j=o(C,`tr-dialog-description`);function M(){return y()}function N({className:t,placement:n=`middle`,...r}){return(0,E.jsx)(D,{...r,className:e(`tr-dialog tr-dialog-box`,t),"data-placement":n})}var P=o(m);function F(e){return(0,E.jsx)(O,{...e})}var I=o(b,`tr-dialog-title`),L=o(p,`tr-dialog-trigger`),R={Backdrop:k,Close:A,Description:j,Popup:N,Portal:P,Root:F,Viewport:o(x,`tr-layer-viewport tr-dialog-viewport`),Title:I,Trigger:L,createHandle:M},z={sm:`[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-sm)]`,md:`[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]`,lg:`[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]`},B={default:`bg-tinyrack-surface-muted text-tinyrack-text`,destructive:`bg-tinyrack-danger-surface text-tinyrack-danger`};function V({isOpen:e,onClose:t,title:n,description:r,children:i,size:a=`md`,preventClose:o=!1,icon:s,variant:l=`default`}){return(0,w.useEffect)(()=>{if(!e||o)return;let n=e=>{e.key===`Escape`&&t()};return document.addEventListener(`keydown`,n),()=>document.removeEventListener(`keydown`,n)},[e,o,t]),e?(0,E.jsx)(R.Root,{defaultOpen:!0,disablePointerDismissal:o,onOpenChange:e=>{!e&&!o&&t()},children:(0,E.jsx)(R.Portal,{children:(0,E.jsxs)(R.Viewport,{children:[(0,E.jsx)(R.Backdrop,{}),(0,E.jsxs)(R.Popup,{className:z[a],children:[(0,E.jsxs)(`div`,{className:`flex items-start gap-tinyrack-md`,children:[s&&(0,E.jsx)(`div`,{className:`flex size-tinyrack-2xl shrink-0 items-center justify-center rounded-tinyrack-full ${B[l]}`,children:(0,E.jsx)(s,{"aria-hidden":!0,className:`size-tinyrack-lg`})}),(0,E.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-tinyrack-3xs`,children:[(0,E.jsx)(R.Title,{children:n}),r&&(0,E.jsx)(R.Description,{className:`text-tinyrack-text-muted text-tinyrack-xs`,children:r})]}),!o&&(0,E.jsx)(R.Close,{"aria-label":`Close`,className:`shrink-0`,"data-testid":`modal-close`,children:(0,E.jsx)(c,{"aria-hidden":!0,className:`size-tinyrack-lg`})})]}),i]})]})})}):null}function H({children:e}){return(0,E.jsx)(`div`,{className:`flex justify-end gap-tinyrack-sm pt-tinyrack-lg`,children:e})}export{H as n,V as t};
2
+ //# sourceMappingURL=modal-BDQFucjz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"modal-sCM_zT82.js","names":["Dialog.Backdrop","Dialog.Close","Dialog.Description","Dialog.createHandle","Dialog.Popup","Dialog.Portal","Dialog.Root","Dialog.Title","Dialog.Trigger","Dialog.Viewport"],"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/dialog/backdrop/DialogBackdrop.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/dialog/popup/DialogPopup.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/dialog/root/DialogRoot.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-backdrop.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-close.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-description.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-handle.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-popup.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-portal.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-title.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-trigger.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-viewport.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/index.js","../../../frontend/src/components/ui/modal.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { popupTransitionStateMapping } from \"../../utils/popupStateMapping.mjs\";\n\n/**\n * An overlay displayed beneath the popup.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogBackdrop = /*#__PURE__*/React.forwardRef(function DialogBackdrop(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n forceRender = false,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const open = store.useState('open');\n const nested = store.useState('nested');\n const mounted = store.useState('mounted');\n const transitionStatus = store.useState('transitionStatus');\n const state = {\n open,\n transitionStatus\n };\n return useRenderElement('div', componentProps, {\n state,\n ref: [store.context.backdropRef, forwardedRef],\n stateAttributesMapping: popupTransitionStateMapping,\n props: [{\n role: 'presentation',\n hidden: !mounted,\n style: {\n userSelect: 'none',\n WebkitUserSelect: 'none'\n }\n }, elementProps],\n enabled: forceRender || !nested\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogBackdrop.displayName = \"DialogBackdrop\";","'use client';\n\nimport * as React from 'react';\nimport { FloatingFocusManager } from \"../../floating-ui-react/index.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useDialogPortalContext } from \"../portal/DialogPortalContext.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { COMPOSITE_KEYS } from \"../../internals/composite/composite.mjs\";\nimport { FOCUSABLE_POPUP_PROPS, createDefaultInitialFocus } from \"../../utils/popups/index.mjs\";\nimport { dialogStateAttributesMapping } from \"../utils/stateAttributesMapping.mjs\";\n\n/**\n * A container for the dialog contents.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const DialogPopup = /*#__PURE__*/React.forwardRef(function DialogPopup(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n finalFocus,\n initialFocus,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const descriptionElementId = store.useState('descriptionElementId');\n const disablePointerDismissal = store.useState('disablePointerDismissal');\n const floatingRootContext = store.useState('floatingRootContext');\n const rootPopupProps = store.useState('popupProps');\n const modal = store.useState('modal');\n const mounted = store.useState('mounted');\n const nested = store.useState('nested');\n const nestedOpenDialogCount = store.useState('nestedOpenDialogCount');\n const open = store.useState('open');\n const openMethod = store.useState('openMethod');\n const titleElementId = store.useState('titleElementId');\n const transitionStatus = store.useState('transitionStatus');\n const role = store.useState('role');\n const floatingId = floatingRootContext.useState('floatingId');\n useDialogPortalContext();\n useOpenChangeComplete({\n open,\n ref: store.context.popupRef,\n onComplete() {\n if (open) {\n store.context.onOpenChangeComplete?.(true);\n }\n }\n });\n const resolvedInitialFocus = initialFocus === undefined ? createDefaultInitialFocus(store.context.popupRef) : initialFocus;\n const nestedDialogOpen = nestedOpenDialogCount > 0;\n const setPopupElement = store.useStateSetter('popupElement');\n const state = {\n open,\n nested,\n transitionStatus,\n nestedDialogOpen\n };\n const element = useRenderElement('div', componentProps, {\n state,\n props: [rootPopupProps, {\n id: floatingId,\n 'aria-labelledby': titleElementId,\n 'aria-describedby': descriptionElementId,\n role,\n ...FOCUSABLE_POPUP_PROPS,\n hidden: !mounted,\n onKeyDown(event) {\n if (COMPOSITE_KEYS.has(event.key)) {\n event.stopPropagation();\n }\n },\n style: {\n '--nested-dialogs': nestedOpenDialogCount\n }\n }, elementProps],\n ref: [forwardedRef, store.context.popupRef, setPopupElement],\n stateAttributesMapping: dialogStateAttributesMapping\n });\n return /*#__PURE__*/_jsx(FloatingFocusManager, {\n context: floatingRootContext,\n openInteractionType: openMethod,\n disabled: !mounted,\n closeOnFocusOut: !disablePointerDismissal,\n initialFocus: resolvedInitialFocus,\n returnFocus: finalFocus,\n modal: modal !== false,\n restoreFocus: \"popup\",\n children: element\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogPopup.displayName = \"DialogPopup\";","'use client';\n\nimport { useRenderDialogRoot } from \"./useRenderDialogRoot.mjs\";\n\n/**\n * Groups all parts of the dialog.\n * Doesn't render its own HTML element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport function DialogRoot(props) {\n return useRenderDialogRoot('dialog', props);\n}","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-backdrop.tsx\nconst TRDialogBackdrop = createComponentPart(Dialog.Backdrop, \"tr-layer-backdrop tr-dialog-backdrop\");\n//#endregion\nexport { TRDialogBackdrop };\n\n//# sourceMappingURL=dialog-backdrop.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-close.tsx\nconst TRDialogClose = createComponentPart(Dialog.Close, \"tr-dialog-close\");\n//#endregion\nexport { TRDialogClose };\n\n//# sourceMappingURL=dialog-close.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-description.tsx\nconst TRDialogDescription = createComponentPart(Dialog.Description, \"tr-dialog-description\");\n//#endregion\nexport { TRDialogDescription };\n\n//# sourceMappingURL=dialog-description.js.map","\"use client\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-handle.ts\nfunction createDialogHandle() {\n\treturn Dialog.createHandle();\n}\n//#endregion\nexport { createDialogHandle };\n\n//# sourceMappingURL=dialog-handle.js.map","\"use client\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-popup.tsx\nfunction TRDialogPopup({ className, placement = \"middle\", ...props }) {\n\treturn /* @__PURE__ */ jsx(Dialog.Popup, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-dialog tr-dialog-box\", className),\n\t\t\"data-placement\": placement\n\t});\n}\n//#endregion\nexport { TRDialogPopup };\n\n//# sourceMappingURL=dialog-popup.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-portal.tsx\nconst TRDialogPortal = createComponentPart(Dialog.Portal);\n//#endregion\nexport { TRDialogPortal };\n\n//# sourceMappingURL=dialog-portal.js.map","\"use client\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-root.tsx\nfunction TRDialogRoot(props) {\n\treturn /* @__PURE__ */ jsx(Dialog.Root, { ...props });\n}\n//#endregion\nexport { TRDialogRoot };\n\n//# sourceMappingURL=dialog-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-title.tsx\nconst TRDialogTitle = createComponentPart(Dialog.Title, \"tr-dialog-title\");\n//#endregion\nexport { TRDialogTitle };\n\n//# sourceMappingURL=dialog-title.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-trigger.tsx\nconst TRDialogTrigger = createComponentPart(Dialog.Trigger, \"tr-dialog-trigger\");\n//#endregion\nexport { TRDialogTrigger };\n\n//# sourceMappingURL=dialog-trigger.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-viewport.tsx\nconst TRDialogViewport = createComponentPart(Dialog.Viewport, \"tr-layer-viewport tr-dialog-viewport\");\n//#endregion\nexport { TRDialogViewport };\n\n//# sourceMappingURL=dialog-viewport.js.map","import { TRDialogBackdrop } from \"./dialog-backdrop.js\";\nimport { TRDialogClose } from \"./dialog-close.js\";\nimport { TRDialogDescription } from \"./dialog-description.js\";\nimport { createDialogHandle } from \"./dialog-handle.js\";\nimport { TRDialogPopup } from \"./dialog-popup.js\";\nimport { TRDialogPortal } from \"./dialog-portal.js\";\nimport { TRDialogRoot } from \"./dialog-root.js\";\nimport { TRDialogTitle } from \"./dialog-title.js\";\nimport { TRDialogTrigger } from \"./dialog-trigger.js\";\nimport { TRDialogViewport } from \"./dialog-viewport.js\";\n//#region src/components/dialog/index.tsx\nconst TRDialog = {\n\tBackdrop: TRDialogBackdrop,\n\tClose: TRDialogClose,\n\tDescription: TRDialogDescription,\n\tPopup: TRDialogPopup,\n\tPortal: TRDialogPortal,\n\tRoot: TRDialogRoot,\n\tViewport: TRDialogViewport,\n\tTitle: TRDialogTitle,\n\tTrigger: TRDialogTrigger,\n\tcreateHandle: createDialogHandle\n};\n//#endregion\nexport { TRDialog, TRDialogBackdrop, TRDialogClose, TRDialogDescription, TRDialogPopup, TRDialogPortal, TRDialogRoot, TRDialogTitle, TRDialogTrigger, TRDialogViewport, createDialogHandle };\n\n//# sourceMappingURL=index.js.map","import { TRDialog } from '@tinyrack/ui/components/dialog';\nimport type { LucideIcon } from 'lucide-react';\nimport { XIcon } from 'lucide-react';\nimport { type ReactNode, useEffect } from 'react';\n\ntype ModalVariant = 'default' | 'destructive';\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n description?: string;\n children: ReactNode;\n size?: 'sm' | 'md' | 'lg';\n preventClose?: boolean;\n icon?: LucideIcon;\n variant?: ModalVariant;\n}\n\n/*\n Set through `--tr-dialog-box-max-width`, the override hook `.tr-dialog-box`\n exposes, rather than a `max-w-*` utility. The box feeds that same custom\n property into its own `width: min(…)` calculation, so a utility would move\n the max-width while leaving the width computation on the old value.\n\n This is the current design system overlay scale (20/32rem), not Tailwind's\n width scale. The local `lg` compatibility option now resolves to the largest\n supported overlay token, and `md` remains the unstyled `TRDialog` default.\n*/\nconst sizeClasses = {\n sm: '[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-sm)]',\n md: '[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]',\n lg: '[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]',\n} as const;\n\nconst iconVariantClasses: Record<ModalVariant, string> = {\n default: 'bg-tinyrack-surface-muted text-tinyrack-text',\n destructive: 'bg-tinyrack-danger-surface text-tinyrack-danger',\n};\n\nexport function Modal({\n isOpen,\n onClose,\n title,\n description,\n children,\n size = 'md',\n preventClose = false,\n icon: IconComponent,\n variant = 'default',\n}: ModalProps) {\n useEffect(() => {\n if (!isOpen) return;\n if (preventClose) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, preventClose, onClose]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <TRDialog.Root\n defaultOpen\n disablePointerDismissal={preventClose}\n onOpenChange={(open) => {\n if (!open && !preventClose) {\n onClose();\n }\n }}\n >\n <TRDialog.Portal>\n <TRDialog.Viewport>\n <TRDialog.Backdrop />\n {/*\n No max-height here: `.tr-dialog-box` already clamps itself against\n `100dvh` minus the viewport gap, which is more correct than the\n `90vh`/`85vh` this used to override it with.\n */}\n <TRDialog.Popup className={sizeClasses[size]}>\n <div className=\"flex items-start gap-tinyrack-md\">\n {IconComponent && (\n <div\n className={`flex size-tinyrack-2xl shrink-0 items-center justify-center rounded-tinyrack-full ${iconVariantClasses[variant]}`}\n >\n <IconComponent aria-hidden className=\"size-tinyrack-lg\" />\n </div>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-tinyrack-3xs\">\n <TRDialog.Title>{title}</TRDialog.Title>\n {description && (\n <TRDialog.Description className=\"text-tinyrack-text-muted text-tinyrack-xs\">\n {description}\n </TRDialog.Description>\n )}\n </div>\n {!preventClose && (\n <TRDialog.Close\n aria-label=\"Close\"\n className=\"shrink-0\"\n data-testid=\"modal-close\"\n >\n <XIcon aria-hidden className=\"size-tinyrack-lg\" />\n </TRDialog.Close>\n )}\n </div>\n {children}\n </TRDialog.Popup>\n </TRDialog.Viewport>\n </TRDialog.Portal>\n </TRDialog.Root>\n );\n}\n\ninterface ModalActionsProps {\n children: ReactNode;\n}\n\nexport function ModalActions({ children }: ModalActionsProps) {\n return (\n <div className=\"flex justify-end gap-tinyrack-sm pt-tinyrack-lg\">\n {children}\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"mappings":"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"}
1
+ {"version":3,"file":"modal-BDQFucjz.js","names":["Dialog.Backdrop","Dialog.Close","Dialog.Description","Dialog.createHandle","Dialog.Popup","Dialog.Portal","Dialog.Root","Dialog.Title","Dialog.Trigger","Dialog.Viewport"],"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/dialog/backdrop/DialogBackdrop.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/dialog/popup/DialogPopup.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/dialog/root/DialogRoot.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-backdrop.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-close.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-description.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-handle.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-popup.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-portal.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-title.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-trigger.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-viewport.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/index.js","../../../frontend/src/components/ui/modal.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { popupTransitionStateMapping } from \"../../utils/popupStateMapping.mjs\";\n\n/**\n * An overlay displayed beneath the popup.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogBackdrop = /*#__PURE__*/React.forwardRef(function DialogBackdrop(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n forceRender = false,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const open = store.useState('open');\n const nested = store.useState('nested');\n const mounted = store.useState('mounted');\n const transitionStatus = store.useState('transitionStatus');\n const state = {\n open,\n transitionStatus\n };\n return useRenderElement('div', componentProps, {\n state,\n ref: [store.context.backdropRef, forwardedRef],\n stateAttributesMapping: popupTransitionStateMapping,\n props: [{\n role: 'presentation',\n hidden: !mounted,\n style: {\n userSelect: 'none',\n WebkitUserSelect: 'none'\n }\n }, elementProps],\n enabled: forceRender || !nested\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogBackdrop.displayName = \"DialogBackdrop\";","'use client';\n\nimport * as React from 'react';\nimport { FloatingFocusManager } from \"../../floating-ui-react/index.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useDialogPortalContext } from \"../portal/DialogPortalContext.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { COMPOSITE_KEYS } from \"../../internals/composite/composite.mjs\";\nimport { FOCUSABLE_POPUP_PROPS, createDefaultInitialFocus } from \"../../utils/popups/index.mjs\";\nimport { dialogStateAttributesMapping } from \"../utils/stateAttributesMapping.mjs\";\n\n/**\n * A container for the dialog contents.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const DialogPopup = /*#__PURE__*/React.forwardRef(function DialogPopup(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n finalFocus,\n initialFocus,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const descriptionElementId = store.useState('descriptionElementId');\n const disablePointerDismissal = store.useState('disablePointerDismissal');\n const floatingRootContext = store.useState('floatingRootContext');\n const rootPopupProps = store.useState('popupProps');\n const modal = store.useState('modal');\n const mounted = store.useState('mounted');\n const nested = store.useState('nested');\n const nestedOpenDialogCount = store.useState('nestedOpenDialogCount');\n const open = store.useState('open');\n const openMethod = store.useState('openMethod');\n const titleElementId = store.useState('titleElementId');\n const transitionStatus = store.useState('transitionStatus');\n const role = store.useState('role');\n const floatingId = floatingRootContext.useState('floatingId');\n useDialogPortalContext();\n useOpenChangeComplete({\n open,\n ref: store.context.popupRef,\n onComplete() {\n if (open) {\n store.context.onOpenChangeComplete?.(true);\n }\n }\n });\n const resolvedInitialFocus = initialFocus === undefined ? createDefaultInitialFocus(store.context.popupRef) : initialFocus;\n const nestedDialogOpen = nestedOpenDialogCount > 0;\n const setPopupElement = store.useStateSetter('popupElement');\n const state = {\n open,\n nested,\n transitionStatus,\n nestedDialogOpen\n };\n const element = useRenderElement('div', componentProps, {\n state,\n props: [rootPopupProps, {\n id: floatingId,\n 'aria-labelledby': titleElementId,\n 'aria-describedby': descriptionElementId,\n role,\n ...FOCUSABLE_POPUP_PROPS,\n hidden: !mounted,\n onKeyDown(event) {\n if (COMPOSITE_KEYS.has(event.key)) {\n event.stopPropagation();\n }\n },\n style: {\n '--nested-dialogs': nestedOpenDialogCount\n }\n }, elementProps],\n ref: [forwardedRef, store.context.popupRef, setPopupElement],\n stateAttributesMapping: dialogStateAttributesMapping\n });\n return /*#__PURE__*/_jsx(FloatingFocusManager, {\n context: floatingRootContext,\n openInteractionType: openMethod,\n disabled: !mounted,\n closeOnFocusOut: !disablePointerDismissal,\n initialFocus: resolvedInitialFocus,\n returnFocus: finalFocus,\n modal: modal !== false,\n restoreFocus: \"popup\",\n children: element\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogPopup.displayName = \"DialogPopup\";","'use client';\n\nimport { useRenderDialogRoot } from \"./useRenderDialogRoot.mjs\";\n\n/**\n * Groups all parts of the dialog.\n * Doesn't render its own HTML element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport function DialogRoot(props) {\n return useRenderDialogRoot('dialog', props);\n}","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-backdrop.tsx\nconst TRDialogBackdrop = createComponentPart(Dialog.Backdrop, \"tr-layer-backdrop tr-dialog-backdrop\");\n//#endregion\nexport { TRDialogBackdrop };\n\n//# sourceMappingURL=dialog-backdrop.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-close.tsx\nconst TRDialogClose = createComponentPart(Dialog.Close, \"tr-dialog-close\");\n//#endregion\nexport { TRDialogClose };\n\n//# sourceMappingURL=dialog-close.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-description.tsx\nconst TRDialogDescription = createComponentPart(Dialog.Description, \"tr-dialog-description\");\n//#endregion\nexport { TRDialogDescription };\n\n//# sourceMappingURL=dialog-description.js.map","\"use client\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-handle.ts\nfunction createDialogHandle() {\n\treturn Dialog.createHandle();\n}\n//#endregion\nexport { createDialogHandle };\n\n//# sourceMappingURL=dialog-handle.js.map","\"use client\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-popup.tsx\nfunction TRDialogPopup({ className, placement = \"middle\", ...props }) {\n\treturn /* @__PURE__ */ jsx(Dialog.Popup, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-dialog tr-dialog-box\", className),\n\t\t\"data-placement\": placement\n\t});\n}\n//#endregion\nexport { TRDialogPopup };\n\n//# sourceMappingURL=dialog-popup.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-portal.tsx\nconst TRDialogPortal = createComponentPart(Dialog.Portal);\n//#endregion\nexport { TRDialogPortal };\n\n//# sourceMappingURL=dialog-portal.js.map","\"use client\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-root.tsx\nfunction TRDialogRoot(props) {\n\treturn /* @__PURE__ */ jsx(Dialog.Root, { ...props });\n}\n//#endregion\nexport { TRDialogRoot };\n\n//# sourceMappingURL=dialog-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-title.tsx\nconst TRDialogTitle = createComponentPart(Dialog.Title, \"tr-dialog-title\");\n//#endregion\nexport { TRDialogTitle };\n\n//# sourceMappingURL=dialog-title.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-trigger.tsx\nconst TRDialogTrigger = createComponentPart(Dialog.Trigger, \"tr-dialog-trigger\");\n//#endregion\nexport { TRDialogTrigger };\n\n//# sourceMappingURL=dialog-trigger.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Dialog } from \"@base-ui/react/dialog\";\n//#region src/components/dialog/dialog-viewport.tsx\nconst TRDialogViewport = createComponentPart(Dialog.Viewport, \"tr-layer-viewport tr-dialog-viewport\");\n//#endregion\nexport { TRDialogViewport };\n\n//# sourceMappingURL=dialog-viewport.js.map","import { TRDialogBackdrop } from \"./dialog-backdrop.js\";\nimport { TRDialogClose } from \"./dialog-close.js\";\nimport { TRDialogDescription } from \"./dialog-description.js\";\nimport { createDialogHandle } from \"./dialog-handle.js\";\nimport { TRDialogPopup } from \"./dialog-popup.js\";\nimport { TRDialogPortal } from \"./dialog-portal.js\";\nimport { TRDialogRoot } from \"./dialog-root.js\";\nimport { TRDialogTitle } from \"./dialog-title.js\";\nimport { TRDialogTrigger } from \"./dialog-trigger.js\";\nimport { TRDialogViewport } from \"./dialog-viewport.js\";\n//#region src/components/dialog/index.tsx\nconst TRDialog = {\n\tBackdrop: TRDialogBackdrop,\n\tClose: TRDialogClose,\n\tDescription: TRDialogDescription,\n\tPopup: TRDialogPopup,\n\tPortal: TRDialogPortal,\n\tRoot: TRDialogRoot,\n\tViewport: TRDialogViewport,\n\tTitle: TRDialogTitle,\n\tTrigger: TRDialogTrigger,\n\tcreateHandle: createDialogHandle\n};\n//#endregion\nexport { TRDialog, TRDialogBackdrop, TRDialogClose, TRDialogDescription, TRDialogPopup, TRDialogPortal, TRDialogRoot, TRDialogTitle, TRDialogTrigger, TRDialogViewport, createDialogHandle };\n\n//# sourceMappingURL=index.js.map","import { TRDialog } from '@tinyrack/ui/components/dialog';\nimport type { LucideIcon } from 'lucide-react';\nimport { XIcon } from 'lucide-react';\nimport { type ReactNode, useEffect } from 'react';\n\ntype ModalVariant = 'default' | 'destructive';\n\ninterface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n description?: string;\n children: ReactNode;\n size?: 'sm' | 'md' | 'lg';\n preventClose?: boolean;\n icon?: LucideIcon;\n variant?: ModalVariant;\n}\n\n/*\n Set through `--tr-dialog-box-max-width`, the override hook `.tr-dialog-box`\n exposes, rather than a `max-w-*` utility. The box feeds that same custom\n property into its own `width: min(…)` calculation, so a utility would move\n the max-width while leaving the width computation on the old value.\n\n This is the current design system overlay scale (20/32rem), not Tailwind's\n width scale. The local `lg` compatibility option now resolves to the largest\n supported overlay token, and `md` remains the unstyled `TRDialog` default.\n*/\nconst sizeClasses = {\n sm: '[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-sm)]',\n md: '[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]',\n lg: '[--tr-dialog-box-max-width:var(--tinyrack-overlay-width-md)]',\n} as const;\n\nconst iconVariantClasses: Record<ModalVariant, string> = {\n default: 'bg-tinyrack-surface-muted text-tinyrack-text',\n destructive: 'bg-tinyrack-danger-surface text-tinyrack-danger',\n};\n\nexport function Modal({\n isOpen,\n onClose,\n title,\n description,\n children,\n size = 'md',\n preventClose = false,\n icon: IconComponent,\n variant = 'default',\n}: ModalProps) {\n useEffect(() => {\n if (!isOpen) return;\n if (preventClose) return;\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, preventClose, onClose]);\n\n if (!isOpen) {\n return null;\n }\n\n return (\n <TRDialog.Root\n defaultOpen\n disablePointerDismissal={preventClose}\n onOpenChange={(open) => {\n if (!open && !preventClose) {\n onClose();\n }\n }}\n >\n <TRDialog.Portal>\n <TRDialog.Viewport>\n <TRDialog.Backdrop />\n {/*\n No max-height here: `.tr-dialog-box` already clamps itself against\n `100dvh` minus the viewport gap, which is more correct than the\n `90vh`/`85vh` this used to override it with.\n */}\n <TRDialog.Popup className={sizeClasses[size]}>\n <div className=\"flex items-start gap-tinyrack-md\">\n {IconComponent && (\n <div\n className={`flex size-tinyrack-2xl shrink-0 items-center justify-center rounded-tinyrack-full ${iconVariantClasses[variant]}`}\n >\n <IconComponent aria-hidden className=\"size-tinyrack-lg\" />\n </div>\n )}\n <div className=\"flex min-w-0 flex-1 flex-col gap-tinyrack-3xs\">\n <TRDialog.Title>{title}</TRDialog.Title>\n {description && (\n <TRDialog.Description className=\"text-tinyrack-text-muted text-tinyrack-xs\">\n {description}\n </TRDialog.Description>\n )}\n </div>\n {!preventClose && (\n <TRDialog.Close\n aria-label=\"Close\"\n className=\"shrink-0\"\n data-testid=\"modal-close\"\n >\n <XIcon aria-hidden className=\"size-tinyrack-lg\" />\n </TRDialog.Close>\n )}\n </div>\n {children}\n </TRDialog.Popup>\n </TRDialog.Viewport>\n </TRDialog.Portal>\n </TRDialog.Root>\n );\n}\n\ninterface ModalActionsProps {\n children: ReactNode;\n}\n\nexport function ModalActions({ children }: ModalActionsProps) {\n return (\n <div className=\"flex justify-end gap-tinyrack-sm pt-tinyrack-lg\">\n {children}\n </div>\n );\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{dr as e,pr as t,ur as n}from"./config-v3-oy_ef.js";var r=class extends n{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||i(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(t){let n=()=>{this.#i({type:`continue`})},r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=e({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:n,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let i=this.state.status===`pending`,a=!this.#r.canStart();try{if(i)n();else{this.#i({type:`pending`,variables:t,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(t,this,r);let e=await this.options.onMutate?.(t,r);e!==this.state.context&&this.#i({type:`pending`,context:e,variables:t,isPaused:a})}let e=await this.#r.start();return await this.#n.config.onSuccess?.(e,t,this.state.context,this,r),await this.options.onSuccess?.(e,t,this.state.context,r),await this.#n.config.onSettled?.(e,null,this.state.variables,this.state.context,this,r),await this.options.onSettled?.(e,null,t,this.state.context,r),this.#i({type:`success`,data:e}),e}catch(e){try{await this.#n.config.onError?.(e,t,this.state.context,this,r)}catch(e){Promise.reject(e)}try{await this.options.onError?.(e,t,this.state.context,r)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,e,this.state.variables,this.state.context,this,r)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,e,t,this.state.context,r)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:e}),e}finally{this.#n.runNext(this)}}#i(e){let n=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=n(this.state),t.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function i(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}function a(e){return e}export{r as n,i as r,a as t};
2
- //# sourceMappingURL=mutationOptions-CrswitPs.js.map
1
+ import{Er as e,Or as t,Tr as n}from"./config-DTQCUlfZ.js";var r=class extends n{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||i(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??this.execute(this.state.variables)}async execute(t){let n=()=>{this.#i({type:`continue`})},r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=e({fn:()=>this.options.mutationFn?this.options.mutationFn(t,r):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:n,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)});let i=this.state.status===`pending`,a=!this.#r.canStart();try{if(i)n();else{this.#i({type:`pending`,variables:t,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(t,this,r);let e=await this.options.onMutate?.(t,r);e!==this.state.context&&this.#i({type:`pending`,context:e,variables:t,isPaused:a})}let e=await this.#r.start();return await this.#n.config.onSuccess?.(e,t,this.state.context,this,r),await this.options.onSuccess?.(e,t,this.state.context,r),await this.#n.config.onSettled?.(e,null,this.state.variables,this.state.context,this,r),await this.options.onSettled?.(e,null,t,this.state.context,r),this.#i({type:`success`,data:e}),e}catch(e){try{await this.#n.config.onError?.(e,t,this.state.context,this,r)}catch(e){Promise.reject(e)}try{await this.options.onError?.(e,t,this.state.context,r)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,e,this.state.variables,this.state.context,this,r)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,e,t,this.state.context,r)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:e}),e}finally{this.#n.runNext(this)}}#i(e){let n=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=n(this.state),t.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function i(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}function a(e){return e}export{r as n,i as r,a as t};
2
+ //# sourceMappingURL=mutationOptions-DyYFUbyn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mutationOptions-CrswitPs.js","names":["#client","#mutationCache","#observers","#retryer","#dispatch"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutation.js","../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/mutationOptions.js"],"sourcesContent":["// src/mutation.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Removable } from \"./removable.js\";\nimport { createRetryer } from \"./retryer.js\";\nvar Mutation = class extends Removable {\n #client;\n #observers;\n #mutationCache;\n #retryer;\n constructor(config) {\n super();\n this.#client = config.client;\n this.mutationId = config.mutationId;\n this.#mutationCache = config.mutationCache;\n this.#observers = [];\n this.state = config.state || getDefaultState();\n this.setOptions(config.options);\n this.scheduleGc();\n }\n setOptions(options) {\n this.options = options;\n this.updateGcTime(this.options.gcTime);\n }\n get meta() {\n return this.options.meta;\n }\n addObserver(observer) {\n if (!this.#observers.includes(observer)) {\n this.#observers.push(observer);\n this.clearGcTimeout();\n this.#mutationCache.notify({\n type: \"observerAdded\",\n mutation: this,\n observer\n });\n }\n }\n removeObserver(observer) {\n this.#observers = this.#observers.filter((x) => x !== observer);\n this.scheduleGc();\n this.#mutationCache.notify({\n type: \"observerRemoved\",\n mutation: this,\n observer\n });\n }\n optionalRemove() {\n if (!this.#observers.length) {\n if (this.state.status === \"pending\") {\n this.scheduleGc();\n } else {\n this.#mutationCache.remove(this);\n }\n }\n }\n continue() {\n return this.#retryer?.continue() ?? // continuing a mutation assumes that variables are set, mutation must have been dehydrated before\n this.execute(this.state.variables);\n }\n async execute(variables) {\n const onContinue = () => {\n this.#dispatch({ type: \"continue\" });\n };\n const mutationFnContext = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n this.#retryer = createRetryer({\n fn: () => {\n if (!this.options.mutationFn) {\n return Promise.reject(new Error(\"No mutationFn found\"));\n }\n return this.options.mutationFn(variables, mutationFnContext);\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: \"failed\", failureCount, error });\n },\n onPause: () => {\n this.#dispatch({ type: \"pause\" });\n },\n onContinue,\n retry: this.options.retry ?? 0,\n retryDelay: this.options.retryDelay,\n networkMode: this.options.networkMode,\n canRun: () => this.#mutationCache.canRun(this)\n });\n const restored = this.state.status === \"pending\";\n const isPaused = !this.#retryer.canStart();\n try {\n if (restored) {\n onContinue();\n } else {\n this.#dispatch({ type: \"pending\", variables, isPaused });\n if (this.#mutationCache.config.onMutate) {\n await this.#mutationCache.config.onMutate(\n variables,\n this,\n mutationFnContext\n );\n }\n const context = await this.options.onMutate?.(\n variables,\n mutationFnContext\n );\n if (context !== this.state.context) {\n this.#dispatch({\n type: \"pending\",\n context,\n variables,\n isPaused\n });\n }\n }\n const data = await this.#retryer.start();\n await this.#mutationCache.config.onSuccess?.(\n data,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSuccess?.(\n data,\n variables,\n this.state.context,\n mutationFnContext\n );\n await this.#mutationCache.config.onSettled?.(\n data,\n null,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSettled?.(\n data,\n null,\n variables,\n this.state.context,\n mutationFnContext\n );\n this.#dispatch({ type: \"success\", data });\n return data;\n } catch (error) {\n try {\n await this.#mutationCache.config.onError?.(\n error,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onError?.(\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.#mutationCache.config.onSettled?.(\n void 0,\n error,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onSettled?.(\n void 0,\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n this.#dispatch({ type: \"error\", error });\n throw error;\n } finally {\n this.#mutationCache.runNext(this);\n }\n }\n #dispatch(action) {\n const reducer = (state) => {\n switch (action.type) {\n case \"failed\":\n return {\n ...state,\n failureCount: action.failureCount,\n failureReason: action.error\n };\n case \"pause\":\n return {\n ...state,\n isPaused: true\n };\n case \"continue\":\n return {\n ...state,\n isPaused: false\n };\n case \"pending\":\n return {\n ...state,\n context: action.context,\n data: void 0,\n failureCount: 0,\n failureReason: null,\n error: null,\n isPaused: action.isPaused,\n status: \"pending\",\n variables: action.variables,\n submittedAt: Date.now()\n };\n case \"success\":\n return {\n ...state,\n data: action.data,\n failureCount: 0,\n failureReason: null,\n error: null,\n status: \"success\",\n isPaused: false\n };\n case \"error\":\n return {\n ...state,\n data: void 0,\n error: action.error,\n failureCount: state.failureCount + 1,\n failureReason: action.error,\n isPaused: false,\n status: \"error\"\n };\n }\n };\n this.state = reducer(this.state);\n notifyManager.batch(() => {\n this.#observers.forEach((observer) => {\n observer.onMutationUpdate(action);\n });\n this.#mutationCache.notify({\n mutation: this,\n type: \"updated\",\n action\n });\n });\n }\n};\nfunction getDefaultState() {\n return {\n context: void 0,\n data: void 0,\n error: null,\n failureCount: 0,\n failureReason: null,\n isPaused: false,\n status: \"idle\",\n variables: void 0,\n submittedAt: 0\n };\n}\nexport {\n Mutation,\n getDefaultState\n};\n//# sourceMappingURL=mutation.js.map","// src/mutationOptions.ts\nfunction mutationOptions(options) {\n return options;\n}\nexport {\n mutationOptions\n};\n//# sourceMappingURL=mutationOptions.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
1
+ {"version":3,"file":"mutationOptions-DyYFUbyn.js","names":["#client","#mutationCache","#observers","#retryer","#dispatch"],"sources":["../../../../node_modules/.pnpm/@tanstack+query-core@5.101.2/node_modules/@tanstack/query-core/build/modern/mutation.js","../../../../node_modules/.pnpm/@tanstack+react-query@5.101.2_react@19.2.7/node_modules/@tanstack/react-query/build/modern/mutationOptions.js"],"sourcesContent":["// src/mutation.ts\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Removable } from \"./removable.js\";\nimport { createRetryer } from \"./retryer.js\";\nvar Mutation = class extends Removable {\n #client;\n #observers;\n #mutationCache;\n #retryer;\n constructor(config) {\n super();\n this.#client = config.client;\n this.mutationId = config.mutationId;\n this.#mutationCache = config.mutationCache;\n this.#observers = [];\n this.state = config.state || getDefaultState();\n this.setOptions(config.options);\n this.scheduleGc();\n }\n setOptions(options) {\n this.options = options;\n this.updateGcTime(this.options.gcTime);\n }\n get meta() {\n return this.options.meta;\n }\n addObserver(observer) {\n if (!this.#observers.includes(observer)) {\n this.#observers.push(observer);\n this.clearGcTimeout();\n this.#mutationCache.notify({\n type: \"observerAdded\",\n mutation: this,\n observer\n });\n }\n }\n removeObserver(observer) {\n this.#observers = this.#observers.filter((x) => x !== observer);\n this.scheduleGc();\n this.#mutationCache.notify({\n type: \"observerRemoved\",\n mutation: this,\n observer\n });\n }\n optionalRemove() {\n if (!this.#observers.length) {\n if (this.state.status === \"pending\") {\n this.scheduleGc();\n } else {\n this.#mutationCache.remove(this);\n }\n }\n }\n continue() {\n return this.#retryer?.continue() ?? // continuing a mutation assumes that variables are set, mutation must have been dehydrated before\n this.execute(this.state.variables);\n }\n async execute(variables) {\n const onContinue = () => {\n this.#dispatch({ type: \"continue\" });\n };\n const mutationFnContext = {\n client: this.#client,\n meta: this.options.meta,\n mutationKey: this.options.mutationKey\n };\n this.#retryer = createRetryer({\n fn: () => {\n if (!this.options.mutationFn) {\n return Promise.reject(new Error(\"No mutationFn found\"));\n }\n return this.options.mutationFn(variables, mutationFnContext);\n },\n onFail: (failureCount, error) => {\n this.#dispatch({ type: \"failed\", failureCount, error });\n },\n onPause: () => {\n this.#dispatch({ type: \"pause\" });\n },\n onContinue,\n retry: this.options.retry ?? 0,\n retryDelay: this.options.retryDelay,\n networkMode: this.options.networkMode,\n canRun: () => this.#mutationCache.canRun(this)\n });\n const restored = this.state.status === \"pending\";\n const isPaused = !this.#retryer.canStart();\n try {\n if (restored) {\n onContinue();\n } else {\n this.#dispatch({ type: \"pending\", variables, isPaused });\n if (this.#mutationCache.config.onMutate) {\n await this.#mutationCache.config.onMutate(\n variables,\n this,\n mutationFnContext\n );\n }\n const context = await this.options.onMutate?.(\n variables,\n mutationFnContext\n );\n if (context !== this.state.context) {\n this.#dispatch({\n type: \"pending\",\n context,\n variables,\n isPaused\n });\n }\n }\n const data = await this.#retryer.start();\n await this.#mutationCache.config.onSuccess?.(\n data,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSuccess?.(\n data,\n variables,\n this.state.context,\n mutationFnContext\n );\n await this.#mutationCache.config.onSettled?.(\n data,\n null,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n await this.options.onSettled?.(\n data,\n null,\n variables,\n this.state.context,\n mutationFnContext\n );\n this.#dispatch({ type: \"success\", data });\n return data;\n } catch (error) {\n try {\n await this.#mutationCache.config.onError?.(\n error,\n variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onError?.(\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.#mutationCache.config.onSettled?.(\n void 0,\n error,\n this.state.variables,\n this.state.context,\n this,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n try {\n await this.options.onSettled?.(\n void 0,\n error,\n variables,\n this.state.context,\n mutationFnContext\n );\n } catch (e) {\n void Promise.reject(e);\n }\n this.#dispatch({ type: \"error\", error });\n throw error;\n } finally {\n this.#mutationCache.runNext(this);\n }\n }\n #dispatch(action) {\n const reducer = (state) => {\n switch (action.type) {\n case \"failed\":\n return {\n ...state,\n failureCount: action.failureCount,\n failureReason: action.error\n };\n case \"pause\":\n return {\n ...state,\n isPaused: true\n };\n case \"continue\":\n return {\n ...state,\n isPaused: false\n };\n case \"pending\":\n return {\n ...state,\n context: action.context,\n data: void 0,\n failureCount: 0,\n failureReason: null,\n error: null,\n isPaused: action.isPaused,\n status: \"pending\",\n variables: action.variables,\n submittedAt: Date.now()\n };\n case \"success\":\n return {\n ...state,\n data: action.data,\n failureCount: 0,\n failureReason: null,\n error: null,\n status: \"success\",\n isPaused: false\n };\n case \"error\":\n return {\n ...state,\n data: void 0,\n error: action.error,\n failureCount: state.failureCount + 1,\n failureReason: action.error,\n isPaused: false,\n status: \"error\"\n };\n }\n };\n this.state = reducer(this.state);\n notifyManager.batch(() => {\n this.#observers.forEach((observer) => {\n observer.onMutationUpdate(action);\n });\n this.#mutationCache.notify({\n mutation: this,\n type: \"updated\",\n action\n });\n });\n }\n};\nfunction getDefaultState() {\n return {\n context: void 0,\n data: void 0,\n error: null,\n failureCount: 0,\n failureReason: null,\n isPaused: false,\n status: \"idle\",\n variables: void 0,\n submittedAt: 0\n };\n}\nexport {\n Mutation,\n getDefaultState\n};\n//# sourceMappingURL=mutation.js.map","// src/mutationOptions.ts\nfunction mutationOptions(options) {\n return options;\n}\nexport {\n mutationOptions\n};\n//# sourceMappingURL=mutationOptions.js.map"],"x_google_ignoreList":[0,1],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{J as e,Z as t,i as n,n as r,q as i,s as a,t as o}from"./createLucideIcon-BPpAIXR_.js";import{On as s,Sn as c,Sr as l,t as u}from"./config-DTQCUlfZ.js";import{t as d}from"./useMutation-BWZ0G4Td.js";import{tt as f}from"./shell-header-bar-CjG5qvPg.js";import{t as p}from"./auth-field-DD8kvl--.js";import{t as m}from"./fingerprint-pattern-DP62Vk8x.js";import{t as h}from"./shield-check-D_p8H0ni.js";import{c as g,o as _}from"./zod-C87S6Tec.js";import{F as v,N as y,R as b,S as x,j as S,u as C,z as w}from"./index-CS23Ozt6.js";import{t as T}from"./auth-page-header-CIn2E4zI.js";import{t as E}from"./alert-leqyvHOp.js";import{t as D}from"./auth-layout-VtpryDof.js";import{t as O}from"./promise-OpBtq8tG.js";import{n as k,t as A}from"./auth-footer-Cz5ivsDc.js";import{t as j}from"./passkey-error-ZqqPQUta.js";import{i as M}from"./passkey-J1qnYp9A.js";import{r as N,t as P}from"./standard-schema-e8gtSzGE.js";var F=o(`tag`,[[`path`,{d:`M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z`,key:`vktsd0`}],[`circle`,{cx:`7.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`kqv944`}]]),I=t(e()),L=i();function R(){let{t:e}=n(),t=s(),i=l(),o=C.useSearch(),{data:R}=f(u),[z,B]=(0,I.useState)(o.passkey_name?`registering`:`form`),[V,H]=(0,I.useState)(``),U=(0,I.useRef)(!1),W=R.auth.password.enabled&&R.auth.password.two_factor.enrollment_required&&R.auth.password.totp.enabled,{register:G,handleSubmit:K,formState:{errors:q}}=N({defaultValues:{name:``},resolver:P((0,I.useMemo)(()=>_({name:g().max(100,e(`validation.passkey.name.max`))}),[e]))}),J=d({...M,onSuccess:async e=>{e.second_factor_setup_completed&&e.user?(i.setQueryData(x.queryKey,{user:e.user}),await O(),v(o)?window.location.href=S(o):t.navigate({to:`/profile`})):(i.invalidateQueries({queryKey:x.queryKey}),t.navigate({to:`/profile`}))},onError:t=>{switch(B(`error`),j(t)){case`unsupported`:H(e(`setupPasskey.error.unsupported`));return;case`not_allowed`:H(e(`setupPasskey.error.notAllowed`));return;case`expired`:H(e(`setupPasskey.error.expired`));return;case`user_mismatch`:case`verification_failed`:H(e(`setupPasskey.error.failed`));return}},onSettled:()=>{i.invalidateQueries({queryKey:x.queryKey})}});return(0,I.useEffect)(()=>{o.passkey_name&&!U.current&&(U.current=!0,J.mutate({name:o.passkey_name}))},[J,o.passkey_name]),z===`registering`?(0,L.jsxs)(D,{children:[(0,L.jsx)(T,{subtitle:e(`setupPasskey.subtitle`),title:e(`setupPasskey.title`)}),(0,L.jsxs)(`div`,{className:`flex flex-col items-center gap-tinyrack-lg py-tinyrack-xl`,children:[(0,L.jsx)(m,{"aria-hidden":!0,className:`size-tinyrack-3xl animate-pulse text-tinyrack-primary`}),(0,L.jsx)(r,{align:`center`,as:`p`,color:`muted`,variant:`body`,children:e(`setupPasskey.waiting`)})]})]}):z===`error`?(0,L.jsxs)(D,{children:[(0,L.jsx)(T,{subtitle:e(`setupPasskey.subtitle`),title:e(`setupPasskey.title`)}),(0,L.jsx)(E,{icon:b,type:`error`,children:V}),(0,L.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[W&&(0,L.jsxs)(w,{className:`w-full gap-tinyrack-sm`,intent:`primary`,render:(0,L.jsx)(c,{search:y(o),to:`/setup/totp`}),uiSize:`lg`,children:[(0,L.jsx)(h,{"aria-hidden":!0,className:`size-tinyrack-xl`}),e(`setupPasskey.useTotp`)]}),(0,L.jsx)(a,{appearance:W?`outline`:`solid`,className:`w-full`,intent:W?`neutral`:`primary`,onClick:()=>{o.passkey_name?(B(`registering`),H(``),J.mutate({name:o.passkey_name})):B(`form`)},type:`button`,uiSize:`lg`,children:e(`setupPasskey.retry`)})]}),(0,L.jsx)(A,{children:(0,L.jsx)(k,{link:(0,L.jsx)(c,{search:y(o),to:`/login`,children:e(`setupPasskey.backToLogin`)})})})]}):(0,L.jsxs)(D,{children:[(0,L.jsx)(T,{subtitle:e(`setupPasskey.subtitle`),title:e(`setupPasskey.title`)}),(0,L.jsx)(E,{icon:h,type:`info`,children:e(`setupPasskey.required`)}),(0,L.jsx)(r,{align:`center`,as:`p`,color:`muted`,variant:`bodySm`,children:e(`setupPasskey.description`)}),(0,L.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:K(e=>{B(`registering`),H(``),J.mutate({name:e.name||void 0})}),children:[(0,L.jsx)(p,{error:q.name,hint:e(`setupPasskey.name.hint`),icon:F,id:`passkey-name`,label:e(`setupPasskey.name.label`),placeholder:e(`setupPasskey.name.placeholder`),...G(`name`),type:`text`}),(0,L.jsx)(a,{className:`w-full`,intent:`primary`,loading:J.isPending,loadingLabel:e(`setupPasskey.registering`),type:`submit`,uiSize:`lg`,children:e(`setupPasskey.continue`)})]}),(0,L.jsx)(A,{children:(0,L.jsx)(k,{link:(0,L.jsx)(c,{search:y(o),to:`/login`,children:e(`setupPasskey.backToLogin`)})})})]})}export{R as component};
2
+ //# sourceMappingURL=passkey-BE9JvJOP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"passkey-CU8x9J2w.js","names":["standardSchemaResolver","useMutation","useQueryClient","useSuspenseQuery","Link","useRouter","TRButton","TRLinkButton","TRText","CircleAlertIcon","FingerprintIcon","ShieldCheckIcon","TagIcon","useEffect","useMemo","useRef","useState","useForm","useTranslation","z","AuthField","AuthFooter","AuthFooterLink","AuthPageHeader","Alert","AuthLayout","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","classifyPasskeyError","tick","appConfigQueryOptions","registerPasskeyMutationOptions","getSessionQueryOptions","Route","SetupStep","SetupPasskey","t","router","queryClient","search","useSearch","data","appConfig","step","setStep","passkey_name","errorMessage","setErrorMessage","autoRegisterCalledRef","canUseTotpSetup","auth","password","enabled","two_factor","enrollment_required","totp","formSchema","object","name","string","max","FormValues","infer","register","handleSubmit","formState","errors","defaultValues","resolver","registerMutation","onSuccess","second_factor_setup_completed","user","setQueryData","queryKey","window","location","href","navigate","to","invalidateQueries","onError","error","reason","onSettled","current","mutate","onSubmit","values","undefined","isPending","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/tag.mjs","../../../frontend/src/routes/setup/passkey/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\n key: \"vktsd0\"\n }\n ],\n [\"circle\", { cx: \"7.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"kqv944\" }]\n];\nconst Tag = createLucideIcon(\"tag\", __iconNode);\n\nexport { __iconNode, Tag as default };\n//# sourceMappingURL=tag.mjs.map\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport {\n CircleAlertIcon,\n FingerprintIcon,\n ShieldCheckIcon,\n TagIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { classifyPasskeyError } from '#frontend/libs/passkey-error.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { registerPasskeyMutationOptions } from '#frontend/queries/passkey.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema.extend({\n passkey_name: z.string().optional(),\n});\n\nexport const Route = createFileRoute('/setup/passkey/')({\n component: SetupPasskey,\n errorComponent: RouteErrorFallback,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n validateSearch: SearchSchema,\n});\n\ntype SetupStep = 'form' | 'registering' | 'error';\n\nfunction SetupPasskey() {\n const { t } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const [step, setStep] = useState<SetupStep>(\n search.passkey_name ? 'registering' : 'form',\n );\n const [errorMessage, setErrorMessage] = useState<string>('');\n const autoRegisterCalledRef = useRef(false);\n const canUseTotpSetup =\n appConfig.auth.password.enabled &&\n appConfig.auth.password.two_factor.enrollment_required &&\n appConfig.auth.password.totp.enabled;\n\n const formSchema = useMemo(\n () =>\n z.object({\n name: z.string().max(100, t('validation.passkey.name.max')),\n }),\n [t],\n );\n\n type FormValues = z.infer<typeof formSchema>;\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<FormValues>({\n defaultValues: { name: '' },\n resolver: standardSchemaResolver(formSchema),\n });\n\n const registerMutation = useMutation({\n ...registerPasskeyMutationOptions,\n onSuccess: async (data) => {\n if (data.second_factor_setup_completed && data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: data.user,\n });\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n } else {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n router.navigate({ to: '/profile' });\n }\n },\n onError: (error) => {\n setStep('error');\n const reason = classifyPasskeyError(error);\n\n switch (reason) {\n case 'unsupported':\n setErrorMessage(t('setupPasskey.error.unsupported'));\n return;\n case 'not_allowed':\n setErrorMessage(t('setupPasskey.error.notAllowed'));\n return;\n case 'expired':\n setErrorMessage(t('setupPasskey.error.expired'));\n return;\n case 'user_mismatch':\n case 'verification_failed':\n setErrorMessage(t('setupPasskey.error.failed'));\n return;\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n useEffect(() => {\n if (search.passkey_name && !autoRegisterCalledRef.current) {\n autoRegisterCalledRef.current = true;\n registerMutation.mutate({ name: search.passkey_name });\n }\n }, [registerMutation, search.passkey_name]);\n\n const onSubmit = (values: FormValues) => {\n setStep('registering');\n setErrorMessage('');\n registerMutation.mutate({ name: values.name || undefined });\n };\n\n // Registering state - waiting for WebAuthn\n if (step === 'registering') {\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setupPasskey.subtitle')}\n title={t('setupPasskey.title')}\n />\n <div className=\"flex flex-col items-center gap-tinyrack-lg py-tinyrack-xl\">\n <FingerprintIcon\n aria-hidden\n className=\"size-tinyrack-3xl animate-pulse text-tinyrack-primary\"\n />\n <TRText align=\"center\" as=\"p\" color=\"muted\" variant=\"body\">\n {t('setupPasskey.waiting')}\n </TRText>\n </div>\n </AuthLayout>\n );\n }\n\n // Error state\n if (step === 'error') {\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setupPasskey.subtitle')}\n title={t('setupPasskey.title')}\n />\n <Alert icon={CircleAlertIcon} type=\"error\">\n {errorMessage}\n </Alert>\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {canUseTotpSetup && (\n <TRLinkButton\n className=\"w-full gap-tinyrack-sm\"\n intent=\"primary\"\n render={\n <Link search={extractOAuthParams(search)} to=\"/setup/totp\" />\n }\n uiSize=\"lg\"\n >\n <ShieldCheckIcon aria-hidden className=\"size-tinyrack-xl\" />\n {t('setupPasskey.useTotp')}\n </TRLinkButton>\n )}\n <TRButton\n appearance={canUseTotpSetup ? 'outline' : 'solid'}\n className=\"w-full\"\n intent={canUseTotpSetup ? 'neutral' : 'primary'}\n onClick={() => {\n if (search.passkey_name) {\n setStep('registering');\n setErrorMessage('');\n registerMutation.mutate({ name: search.passkey_name });\n } else {\n setStep('form');\n }\n }}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupPasskey.retry')}\n </TRButton>\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={extractOAuthParams(search)} to=\"/login\">\n {t('setupPasskey.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n }\n\n // Form state\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setupPasskey.subtitle')}\n title={t('setupPasskey.title')}\n />\n\n <Alert icon={ShieldCheckIcon} type=\"info\">\n {t('setupPasskey.required')}\n </Alert>\n\n <TRText align=\"center\" as=\"p\" color=\"muted\" variant=\"bodySm\">\n {t('setupPasskey.description')}\n </TRText>\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.name}\n hint={t('setupPasskey.name.hint')}\n icon={TagIcon}\n id=\"passkey-name\"\n label={t('setupPasskey.name.label')}\n placeholder={t('setupPasskey.name.placeholder')}\n {...register('name')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={registerMutation.isPending}\n loadingLabel={t('setupPasskey.registering')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('setupPasskey.continue')}\n </TRButton>\n </form>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={extractOAuthParams(search)} to=\"/login\">\n {t('setupPasskey.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"passkey-BE9JvJOP.js","names":["standardSchemaResolver","useMutation","useQueryClient","useSuspenseQuery","Link","useRouter","TRButton","TRLinkButton","TRText","CircleAlertIcon","FingerprintIcon","ShieldCheckIcon","TagIcon","useEffect","useMemo","useRef","useState","useForm","useTranslation","z","AuthField","AuthFooter","AuthFooterLink","AuthPageHeader","Alert","AuthLayout","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","classifyPasskeyError","tick","appConfigQueryOptions","registerPasskeyMutationOptions","getSessionQueryOptions","Route","SetupStep","SetupPasskey","t","router","queryClient","search","useSearch","data","appConfig","step","setStep","passkey_name","errorMessage","setErrorMessage","autoRegisterCalledRef","canUseTotpSetup","auth","password","enabled","two_factor","enrollment_required","totp","formSchema","object","name","string","max","FormValues","infer","register","handleSubmit","formState","errors","defaultValues","resolver","registerMutation","onSuccess","second_factor_setup_completed","user","setQueryData","queryKey","window","location","href","navigate","to","invalidateQueries","onError","error","reason","onSettled","current","mutate","onSubmit","values","undefined","isPending","component"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/tag.mjs","../../../frontend/src/routes/setup/passkey/index.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M12.586 2.586A2 2 0 0 0 11.172 2H4a2 2 0 0 0-2 2v7.172a2 2 0 0 0 .586 1.414l8.704 8.704a2.426 2.426 0 0 0 3.42 0l6.58-6.58a2.426 2.426 0 0 0 0-3.42z\",\n key: \"vktsd0\"\n }\n ],\n [\"circle\", { cx: \"7.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"kqv944\" }]\n];\nconst Tag = createLucideIcon(\"tag\", __iconNode);\n\nexport { __iconNode, Tag as default };\n//# sourceMappingURL=tag.mjs.map\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, Link, useRouter } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport {\n CircleAlertIcon,\n FingerprintIcon,\n ShieldCheckIcon,\n TagIcon,\n} from 'lucide-react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n} from '#frontend/libs/oauth-search.ts';\nimport { classifyPasskeyError } from '#frontend/libs/passkey-error.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { registerPasskeyMutationOptions } from '#frontend/queries/passkey.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema.extend({\n passkey_name: z.string().optional(),\n});\n\nexport const Route = createFileRoute('/setup/passkey/')({\n component: SetupPasskey,\n errorComponent: RouteErrorFallback,\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n validateSearch: SearchSchema,\n});\n\ntype SetupStep = 'form' | 'registering' | 'error';\n\nfunction SetupPasskey() {\n const { t } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const [step, setStep] = useState<SetupStep>(\n search.passkey_name ? 'registering' : 'form',\n );\n const [errorMessage, setErrorMessage] = useState<string>('');\n const autoRegisterCalledRef = useRef(false);\n const canUseTotpSetup =\n appConfig.auth.password.enabled &&\n appConfig.auth.password.two_factor.enrollment_required &&\n appConfig.auth.password.totp.enabled;\n\n const formSchema = useMemo(\n () =>\n z.object({\n name: z.string().max(100, t('validation.passkey.name.max')),\n }),\n [t],\n );\n\n type FormValues = z.infer<typeof formSchema>;\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n } = useForm<FormValues>({\n defaultValues: { name: '' },\n resolver: standardSchemaResolver(formSchema),\n });\n\n const registerMutation = useMutation({\n ...registerPasskeyMutationOptions,\n onSuccess: async (data) => {\n if (data.second_factor_setup_completed && data.user) {\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: data.user,\n });\n await tick();\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n router.navigate({ to: '/profile' });\n }\n } else {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n router.navigate({ to: '/profile' });\n }\n },\n onError: (error) => {\n setStep('error');\n const reason = classifyPasskeyError(error);\n\n switch (reason) {\n case 'unsupported':\n setErrorMessage(t('setupPasskey.error.unsupported'));\n return;\n case 'not_allowed':\n setErrorMessage(t('setupPasskey.error.notAllowed'));\n return;\n case 'expired':\n setErrorMessage(t('setupPasskey.error.expired'));\n return;\n case 'user_mismatch':\n case 'verification_failed':\n setErrorMessage(t('setupPasskey.error.failed'));\n return;\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n useEffect(() => {\n if (search.passkey_name && !autoRegisterCalledRef.current) {\n autoRegisterCalledRef.current = true;\n registerMutation.mutate({ name: search.passkey_name });\n }\n }, [registerMutation, search.passkey_name]);\n\n const onSubmit = (values: FormValues) => {\n setStep('registering');\n setErrorMessage('');\n registerMutation.mutate({ name: values.name || undefined });\n };\n\n // Registering state - waiting for WebAuthn\n if (step === 'registering') {\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setupPasskey.subtitle')}\n title={t('setupPasskey.title')}\n />\n <div className=\"flex flex-col items-center gap-tinyrack-lg py-tinyrack-xl\">\n <FingerprintIcon\n aria-hidden\n className=\"size-tinyrack-3xl animate-pulse text-tinyrack-primary\"\n />\n <TRText align=\"center\" as=\"p\" color=\"muted\" variant=\"body\">\n {t('setupPasskey.waiting')}\n </TRText>\n </div>\n </AuthLayout>\n );\n }\n\n // Error state\n if (step === 'error') {\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setupPasskey.subtitle')}\n title={t('setupPasskey.title')}\n />\n <Alert icon={CircleAlertIcon} type=\"error\">\n {errorMessage}\n </Alert>\n\n <div className=\"flex flex-col gap-tinyrack-sm\">\n {canUseTotpSetup && (\n <TRLinkButton\n className=\"w-full gap-tinyrack-sm\"\n intent=\"primary\"\n render={\n <Link search={extractOAuthParams(search)} to=\"/setup/totp\" />\n }\n uiSize=\"lg\"\n >\n <ShieldCheckIcon aria-hidden className=\"size-tinyrack-xl\" />\n {t('setupPasskey.useTotp')}\n </TRLinkButton>\n )}\n <TRButton\n appearance={canUseTotpSetup ? 'outline' : 'solid'}\n className=\"w-full\"\n intent={canUseTotpSetup ? 'neutral' : 'primary'}\n onClick={() => {\n if (search.passkey_name) {\n setStep('registering');\n setErrorMessage('');\n registerMutation.mutate({ name: search.passkey_name });\n } else {\n setStep('form');\n }\n }}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('setupPasskey.retry')}\n </TRButton>\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={extractOAuthParams(search)} to=\"/login\">\n {t('setupPasskey.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n }\n\n // Form state\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('setupPasskey.subtitle')}\n title={t('setupPasskey.title')}\n />\n\n <Alert icon={ShieldCheckIcon} type=\"info\">\n {t('setupPasskey.required')}\n </Alert>\n\n <TRText align=\"center\" as=\"p\" color=\"muted\" variant=\"bodySm\">\n {t('setupPasskey.description')}\n </TRText>\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.name}\n hint={t('setupPasskey.name.hint')}\n icon={TagIcon}\n id=\"passkey-name\"\n label={t('setupPasskey.name.label')}\n placeholder={t('setupPasskey.name.placeholder')}\n {...register('name')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={registerMutation.isPending}\n loadingLabel={t('setupPasskey.registering')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('setupPasskey.continue')}\n </TRButton>\n </form>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={extractOAuthParams(search)} to=\"/login\">\n {t('setupPasskey.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{I as e}from"./index-CS23Ozt6.js";var t=e;export{t as errorComponent};
2
+ //# sourceMappingURL=passkey-C5vUVgr_.js.map