@tinyrack/issuary-server 0.26.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/dist/entities/terms-content.entity.d.ts +9 -0
  2. package/dist/entities/terms-content.entity.d.ts.map +1 -1
  3. package/dist/entities/terms.entity.d.ts +9 -0
  4. package/dist/entities/terms.entity.d.ts.map +1 -1
  5. package/dist/entities/terms.entity.js +4 -0
  6. package/dist/entities/terms.entity.js.map +1 -1
  7. package/dist/entities/user-terms-consent.entity.d.ts +9 -0
  8. package/dist/entities/user-terms-consent.entity.d.ts.map +1 -1
  9. package/dist/entrypoints/app.d.ts +598 -3
  10. package/dist/entrypoints/app.d.ts.map +1 -1
  11. package/dist/entrypoints/database/postgres/compiled-functions.d.ts +19 -16
  12. package/dist/entrypoints/database/postgres/compiled-functions.d.ts.map +1 -1
  13. package/dist/entrypoints/database/postgres/compiled-functions.js +133 -76
  14. package/dist/entrypoints/database/postgres/compiled-functions.js.map +1 -1
  15. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts +19 -16
  16. package/dist/entrypoints/database/sqlite/compiled-functions.d.ts.map +1 -1
  17. package/dist/entrypoints/database/sqlite/compiled-functions.js +133 -76
  18. package/dist/entrypoints/database/sqlite/compiled-functions.js.map +1 -1
  19. package/dist/lib/config/branding.d.ts +5 -0
  20. package/dist/lib/config/branding.d.ts.map +1 -1
  21. package/dist/lib/config/branding.js +23 -1
  22. package/dist/lib/config/branding.js.map +1 -1
  23. package/dist/lib/config/resolved.d.ts +3 -0
  24. package/dist/lib/config/resolved.d.ts.map +1 -1
  25. package/dist/lib/interpolate-html.d.ts +3 -3
  26. package/dist/lib/interpolate-html.js +3 -3
  27. package/dist/lib/interpolate-html.js.map +1 -1
  28. package/dist/migrations/postgres/Migration20260827090000_archive_terms.d.ts +6 -0
  29. package/dist/migrations/postgres/Migration20260827090000_archive_terms.d.ts.map +1 -0
  30. package/dist/migrations/postgres/Migration20260827090000_archive_terms.js +12 -0
  31. package/dist/migrations/postgres/Migration20260827090000_archive_terms.js.map +1 -0
  32. package/dist/migrations/postgres/index.d.ts.map +1 -1
  33. package/dist/migrations/postgres/index.js +2 -0
  34. package/dist/migrations/postgres/index.js.map +1 -1
  35. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.d.ts +6 -0
  36. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.d.ts.map +1 -0
  37. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.js +12 -0
  38. package/dist/migrations/sqlite/Migration20260827090000_archive_terms.js.map +1 -0
  39. package/dist/migrations/sqlite/index.d.ts.map +1 -1
  40. package/dist/migrations/sqlite/index.js +2 -0
  41. package/dist/migrations/sqlite/index.js.map +1 -1
  42. package/dist/repositories/terms.repository.d.ts.map +1 -1
  43. package/dist/repositories/terms.repository.js +1 -1
  44. package/dist/repositories/terms.repository.js.map +1 -1
  45. package/dist/routes/api/admin/console/index.d.ts +523 -0
  46. package/dist/routes/api/admin/console/index.d.ts.map +1 -0
  47. package/dist/routes/api/admin/console/index.js +212 -0
  48. package/dist/routes/api/admin/console/index.js.map +1 -0
  49. package/dist/routes/api/admin/index.d.ts +584 -0
  50. package/dist/routes/api/admin/index.d.ts.map +1 -1
  51. package/dist/routes/api/admin/index.js +3 -1
  52. package/dist/routes/api/admin/index.js.map +1 -1
  53. package/dist/routes/api/admin/users/index.d.ts +64 -0
  54. package/dist/routes/api/admin/users/index.d.ts.map +1 -1
  55. package/dist/routes/api/admin/users/index.js +47 -0
  56. package/dist/routes/api/admin/users/index.js.map +1 -1
  57. package/dist/routes/api/config/get.d.ts +10 -3
  58. package/dist/routes/api/config/get.d.ts.map +1 -1
  59. package/dist/routes/api/config/get.js +3 -0
  60. package/dist/routes/api/config/get.js.map +1 -1
  61. package/dist/routes/api/config/index.d.ts +10 -3
  62. package/dist/routes/api/config/index.d.ts.map +1 -1
  63. package/dist/routes/api/index.d.ts +594 -3
  64. package/dist/routes/api/index.d.ts.map +1 -1
  65. package/dist/routes/index.d.ts +594 -3
  66. package/dist/routes/index.d.ts.map +1 -1
  67. package/dist/schemas/response.d.ts +4 -1
  68. package/dist/schemas/response.d.ts.map +1 -1
  69. package/dist/schemas/response.js +11 -2
  70. package/dist/schemas/response.js.map +1 -1
  71. package/dist/services/admin-console.service.d.ts +407 -0
  72. package/dist/services/admin-console.service.d.ts.map +1 -0
  73. package/dist/services/admin-console.service.js +377 -0
  74. package/dist/services/admin-console.service.js.map +1 -0
  75. package/dist/services/container.d.ts +5 -0
  76. package/dist/services/container.d.ts.map +1 -1
  77. package/dist/services/container.js +3 -0
  78. package/dist/services/container.js.map +1 -1
  79. package/dist/services/user.service.d.ts +21 -0
  80. package/dist/services/user.service.d.ts.map +1 -1
  81. package/dist/services/user.service.js +65 -1
  82. package/dist/services/user.service.js.map +1 -1
  83. package/package.json +1 -1
  84. package/public/assets/2fa-BowFczF7.js +2 -0
  85. package/public/assets/2fa-BowFczF7.js.map +1 -0
  86. package/public/assets/2fa-C_pA-n2i.js +2 -0
  87. package/public/assets/{2fa-DFTcWEMb.js.map → 2fa-C_pA-n2i.js.map} +1 -1
  88. package/public/assets/2fa-Cpfhakvn.js +2 -0
  89. package/public/assets/{2fa-huNZDYU9.js.map → 2fa-Cpfhakvn.js.map} +1 -1
  90. package/public/assets/2fa-o1a13VHx.js +2 -0
  91. package/public/assets/2fa-o1a13VHx.js.map +1 -0
  92. package/public/assets/FieldControl-ShLuCjvG.js +2 -0
  93. package/public/assets/FieldControl-ShLuCjvG.js.map +1 -0
  94. package/public/assets/Separator-C6MmGAmP.js +2 -0
  95. package/public/assets/Separator-C6MmGAmP.js.map +1 -0
  96. package/public/assets/admin-_jFLs8Ve.js +2 -0
  97. package/public/assets/admin-_jFLs8Ve.js.map +1 -0
  98. package/public/assets/admin-shell-B91U4-Ro.js +2 -0
  99. package/public/assets/admin-shell-B91U4-Ro.js.map +1 -0
  100. package/public/assets/alert-D3aaK-_3.js +2 -0
  101. package/public/assets/alert-D3aaK-_3.js.map +1 -0
  102. package/public/assets/alert-kRxM1xsM.js +2 -0
  103. package/public/assets/alert-kRxM1xsM.js.map +1 -0
  104. package/public/assets/auth-choice-row-h4heOMHs.js +2 -0
  105. package/public/assets/auth-choice-row-h4heOMHs.js.map +1 -0
  106. package/public/assets/auth-field-BpJ4AHtU.js +2 -0
  107. package/public/assets/{auth-field-CWyXGKoC.js.map → auth-field-BpJ4AHtU.js.map} +1 -1
  108. package/public/assets/auth-footer-Du6S-oDG.js +2 -0
  109. package/public/assets/auth-footer-Du6S-oDG.js.map +1 -0
  110. package/public/assets/auth-layout-BdRRr0vT.js +2 -0
  111. package/public/assets/auth-layout-BdRRr0vT.js.map +1 -0
  112. package/public/assets/auth-page-header-ChaCNNrn.js +2 -0
  113. package/public/assets/{auth-page-header-DgGAaIiP.js.map → auth-page-header-ChaCNNrn.js.map} +1 -1
  114. package/public/assets/authorization-context-banner-zVxGX5e8.js +2 -0
  115. package/public/assets/{authorization-context-banner-DznMDPOX.js.map → authorization-context-banner-zVxGX5e8.js.map} +1 -1
  116. package/public/assets/avatar-BxTPQIDp.js +2 -0
  117. package/public/assets/{avatar-D-FRGa1m.js.map → avatar-BxTPQIDp.js.map} +1 -1
  118. package/public/assets/badge-B8D0Q2qq.js +2 -0
  119. package/public/assets/{badge-CsOfUji0.js.map → badge-B8D0Q2qq.js.map} +1 -1
  120. package/public/assets/checkbox-DTPGfvmq.js +2 -0
  121. package/public/assets/{checkbox-C90dDDza.js.map → checkbox-DTPGfvmq.js.map} +1 -1
  122. package/public/assets/{circle-check-6QTLhwM_.js → circle-check-Cnzuu7xR.js} +2 -2
  123. package/public/assets/{circle-check-6QTLhwM_.js.map → circle-check-Cnzuu7xR.js.map} +1 -1
  124. package/public/assets/clients-DLqy7K3N.js +5 -0
  125. package/public/assets/clients-DLqy7K3N.js.map +1 -0
  126. package/public/assets/config-C18-l7z7.js +2 -0
  127. package/public/assets/config-C18-l7z7.js.map +1 -0
  128. package/public/assets/{consent-RtCi_85E.js → consent-BWniDzI3.js} +2 -2
  129. package/public/assets/{consent-RtCi_85E.js.map → consent-BWniDzI3.js.map} +1 -1
  130. package/public/assets/consent-r_tX8DTb.js +2 -0
  131. package/public/assets/{consent-B9sQEyO8.js.map → consent-r_tX8DTb.js.map} +1 -1
  132. package/public/assets/{createLucideIcon-BPpAIXR_.js → createLucideIcon-D-yizrWN.js} +2 -2
  133. package/public/assets/{createLucideIcon-BPpAIXR_.js.map → createLucideIcon-D-yizrWN.js.map} +1 -1
  134. package/public/assets/design-system-rich-text-B3NzIRoJ.js +2 -0
  135. package/public/assets/design-system-rich-text-B3NzIRoJ.js.map +1 -0
  136. package/public/assets/email-Bx9JlWp3.js +2 -0
  137. package/public/assets/email-Bx9JlWp3.js.map +1 -0
  138. package/public/assets/email-Cpfhakvn.js +2 -0
  139. package/public/assets/email-Cpfhakvn.js.map +1 -0
  140. package/public/assets/error-DDY8m_Px.js +2 -0
  141. package/public/assets/error-DDY8m_Px.js.map +1 -0
  142. package/public/assets/field-CsrUbl__.js +3 -0
  143. package/public/assets/field-CsrUbl__.js.map +1 -0
  144. package/public/assets/{fingerprint-pattern-DP62Vk8x.js → fingerprint-pattern-BwUoN1_w.js} +2 -2
  145. package/public/assets/{fingerprint-pattern-DP62Vk8x.js.map → fingerprint-pattern-BwUoN1_w.js.map} +1 -1
  146. package/public/assets/forgot-Cpfhakvn.js +2 -0
  147. package/public/assets/forgot-Cpfhakvn.js.map +1 -0
  148. package/public/assets/forgot-u52JMu6e.js +2 -0
  149. package/public/assets/forgot-u52JMu6e.js.map +1 -0
  150. package/public/assets/form-sJw-V9wb.js +2 -0
  151. package/public/assets/form-sJw-V9wb.js.map +1 -0
  152. package/public/assets/index-8mX6CKcW.css +2 -0
  153. package/public/assets/index-lTEyHSus.js +11 -0
  154. package/public/assets/index-lTEyHSus.js.map +1 -0
  155. package/public/assets/initial-avatar-WMjxW3Zz.js +2 -0
  156. package/public/assets/initial-avatar-WMjxW3Zz.js.map +1 -0
  157. package/public/assets/input-QvBxPgy5.js +2 -0
  158. package/public/assets/{input-CxVeC8Pn.js.map → input-QvBxPgy5.js.map} +1 -1
  159. package/public/assets/{key-round-CdvHb8vT.js → key-round-BxWppK6h.js} +2 -2
  160. package/public/assets/{key-round-CdvHb8vT.js.map → key-round-BxWppK6h.js.map} +1 -1
  161. package/public/assets/labeled-separator-DdkyYDWH.js +2 -0
  162. package/public/assets/labeled-separator-DdkyYDWH.js.map +1 -0
  163. package/public/assets/link-BHmn75Zo.js +2 -0
  164. package/public/assets/{link-C-WdTj3F.js.map → link-BHmn75Zo.js.map} +1 -1
  165. package/public/assets/{lock-7NRyvXBS.js → lock-8wpR2C78.js} +2 -2
  166. package/public/assets/{lock-7NRyvXBS.js.map → lock-8wpR2C78.js.map} +1 -1
  167. package/public/assets/login-Cpfhakvn.js +2 -0
  168. package/public/assets/login-Cpfhakvn.js.map +1 -0
  169. package/public/assets/login-DRcHjJ2-.js +2 -0
  170. package/public/assets/login-DRcHjJ2-.js.map +1 -0
  171. package/public/assets/logout-Dphj1d_0.js +2 -0
  172. package/public/assets/logout-Dphj1d_0.js.map +1 -0
  173. package/public/assets/{mail-D0B_1Dzd.js → mail-DVP_XMUi.js} +2 -2
  174. package/public/assets/{mail-D0B_1Dzd.js.map → mail-DVP_XMUi.js.map} +1 -1
  175. package/public/assets/modal-JuaLVSyx.js +2 -0
  176. package/public/assets/modal-JuaLVSyx.js.map +1 -0
  177. package/public/assets/mutationOptions-Cv_vJkJn.js +2 -0
  178. package/public/assets/{mutationOptions-DyYFUbyn.js.map → mutationOptions-Cv_vJkJn.js.map} +1 -1
  179. package/public/assets/passkey-CObBlfKK.js +2 -0
  180. package/public/assets/passkey-CObBlfKK.js.map +1 -0
  181. package/public/assets/{passkey-J1qnYp9A.js → passkey-CWTjw19S.js} +2 -2
  182. package/public/assets/{passkey-J1qnYp9A.js.map → passkey-CWTjw19S.js.map} +1 -1
  183. package/public/assets/passkey-CavITajY.js +2 -0
  184. package/public/assets/passkey-CavITajY.js.map +1 -0
  185. package/public/assets/passkey-Cpfhakvn.js +2 -0
  186. package/public/assets/passkey-Cpfhakvn.js.map +1 -0
  187. package/public/assets/{passkey-error-ZqqPQUta.js → passkey-error-CZ26Ss-I.js} +2 -2
  188. package/public/assets/{passkey-error-ZqqPQUta.js.map → passkey-error-CZ26Ss-I.js.map} +1 -1
  189. package/public/assets/password-Cpfhakvn.js +2 -0
  190. package/public/assets/password-Cpfhakvn.js.map +1 -0
  191. package/public/assets/password-Dk8PwtZN.js +2 -0
  192. package/public/assets/password-Dk8PwtZN.js.map +1 -0
  193. package/public/assets/password-reset-BcFpGOop.js +2 -0
  194. package/public/assets/{password-reset-sU5KkBKi.js.map → password-reset-BcFpGOop.js.map} +1 -1
  195. package/public/assets/password-strength-Bgvy7kz6.js +2 -0
  196. package/public/assets/{password-strength-BIPcWiM_.js.map → password-strength-Bgvy7kz6.js.map} +1 -1
  197. package/public/assets/pin-input-DhsRO4Ei.js +2 -0
  198. package/public/assets/{pin-input-CITrr-Yc.js.map → pin-input-DhsRO4Ei.js.map} +1 -1
  199. package/public/assets/profile-PjXEnzA-.js +2 -0
  200. package/public/assets/profile-PjXEnzA-.js.map +1 -0
  201. package/public/assets/profile-k66ruDWl.js +2 -0
  202. package/public/assets/{profile-BHPL9Px_.js.map → profile-k66ruDWl.js.map} +1 -1
  203. package/public/assets/provider-mark-CeYazOfu.js +2 -0
  204. package/public/assets/provider-mark-CeYazOfu.js.map +1 -0
  205. package/public/assets/recovery-hdRyezmb.js +2 -0
  206. package/public/assets/recovery-hdRyezmb.js.map +1 -0
  207. package/public/assets/register-Cpfhakvn.js +2 -0
  208. package/public/assets/register-Cpfhakvn.js.map +1 -0
  209. package/public/assets/register-DMgKT_fm.js +2 -0
  210. package/public/assets/register-DMgKT_fm.js.map +1 -0
  211. package/public/assets/reset-Cpfhakvn.js +2 -0
  212. package/public/assets/reset-Cpfhakvn.js.map +1 -0
  213. package/public/assets/reset-DBu3wYpE.js +2 -0
  214. package/public/assets/reset-DBu3wYpE.js.map +1 -0
  215. package/public/assets/select-5LheSsRl.js +2 -0
  216. package/public/assets/select-5LheSsRl.js.map +1 -0
  217. package/public/assets/select-Cpfhakvn.js +2 -0
  218. package/public/assets/{select-huNZDYU9.js.map → select-Cpfhakvn.js.map} +1 -1
  219. package/public/assets/separator-CMGc2Y1q.js +2 -0
  220. package/public/assets/separator-CMGc2Y1q.js.map +1 -0
  221. package/public/assets/settings-BVe4k3kJ.js +2 -0
  222. package/public/assets/settings-BVe4k3kJ.js.map +1 -0
  223. package/public/assets/shell-header-bar-CdOEWmCT.js +2 -0
  224. package/public/assets/shell-header-bar-CdOEWmCT.js.map +1 -0
  225. package/public/assets/{shield-check-D_p8H0ni.js → shield-check-DpYF8yeI.js} +2 -2
  226. package/public/assets/{shield-check-D_p8H0ni.js.map → shield-check-DpYF8yeI.js.map} +1 -1
  227. package/public/assets/standard-schema-C50nwAaQ.js +2 -0
  228. package/public/assets/{standard-schema-e8gtSzGE.js.map → standard-schema-C50nwAaQ.js.map} +1 -1
  229. package/public/assets/system-BoUqxc5h.js +2 -0
  230. package/public/assets/system-BoUqxc5h.js.map +1 -0
  231. package/public/assets/table-Dl89o43x.js +2 -0
  232. package/public/assets/table-Dl89o43x.js.map +1 -0
  233. package/public/assets/terms-B2wWfx1d.js +2 -0
  234. package/public/assets/terms-B2wWfx1d.js.map +1 -0
  235. package/public/assets/terms-COr3cDw5.js +2 -0
  236. package/public/assets/terms-COr3cDw5.js.map +1 -0
  237. package/public/assets/terms-checkbox-list-C9TkDC8Y.js +2 -0
  238. package/public/assets/terms-checkbox-list-C9TkDC8Y.js.map +1 -0
  239. package/public/assets/terms-k66ruDWl.js +2 -0
  240. package/public/assets/terms-k66ruDWl.js.map +1 -0
  241. package/public/assets/totp-BJycMMTC.js +2 -0
  242. package/public/assets/totp-BJycMMTC.js.map +1 -0
  243. package/public/assets/{totp-BNZ904Zm.js → totp-BhElob6P.js} +2 -2
  244. package/public/assets/{totp-BNZ904Zm.js.map → totp-BhElob6P.js.map} +1 -1
  245. package/public/assets/totp-C1ba10Is.js +2 -0
  246. package/public/assets/totp-C1ba10Is.js.map +1 -0
  247. package/public/assets/{trash-2-DZdKBLvC.js → trash-2-B3NVE8pR.js} +2 -2
  248. package/public/assets/{trash-2-DZdKBLvC.js.map → trash-2-B3NVE8pR.js.map} +1 -1
  249. package/public/assets/{triangle-alert-CqNn0kPs.js → triangle-alert-DATO9o3k.js} +2 -2
  250. package/public/assets/{triangle-alert-CqNn0kPs.js.map → triangle-alert-DATO9o3k.js.map} +1 -1
  251. package/public/assets/use-admin-selection-D2b7jnym.js +2 -0
  252. package/public/assets/use-admin-selection-D2b7jnym.js.map +1 -0
  253. package/public/assets/use-totp-setup-KOVNS2DC.js +3 -0
  254. package/public/assets/use-totp-setup-KOVNS2DC.js.map +1 -0
  255. package/public/assets/useAriaLabelledBy-CF3crxLc.js +2 -0
  256. package/public/assets/{useAriaLabelledBy-IIwdHUss.js.map → useAriaLabelledBy-CF3crxLc.js.map} +1 -1
  257. package/public/assets/useMutation-DqIIIiBW.js +2 -0
  258. package/public/assets/{useMutation-BWZ0G4Td.js.map → useMutation-DqIIIiBW.js.map} +1 -1
  259. package/public/assets/useQuery-CLr9TaKA.js +2 -0
  260. package/public/assets/{useQuery-Ccv_nzQl.js.map → useQuery-CLr9TaKA.js.map} +1 -1
  261. package/public/assets/users-BQQQm353.js +2 -0
  262. package/public/assets/users-BQQQm353.js.map +1 -0
  263. package/public/assets/{zod-C87S6Tec.js → zod-Dszyrytb.js} +2 -2
  264. package/public/assets/{zod-C87S6Tec.js.map → zod-Dszyrytb.js.map} +1 -1
  265. package/public/index.html +6 -6
  266. package/public/issuary-app-icon-512.png +0 -0
  267. package/public/issuary-app-icon.svg +8 -0
  268. package/public/assets/2fa-C9wUlSBS.js +0 -2
  269. package/public/assets/2fa-C9wUlSBS.js.map +0 -1
  270. package/public/assets/2fa-DFTcWEMb.js +0 -2
  271. package/public/assets/2fa-TtshNxXv.js +0 -2
  272. package/public/assets/2fa-TtshNxXv.js.map +0 -1
  273. package/public/assets/2fa-huNZDYU9.js +0 -2
  274. package/public/assets/DialogHandle-DICBMcjK.js +0 -2
  275. package/public/assets/DialogHandle-DICBMcjK.js.map +0 -1
  276. package/public/assets/FieldItemContext-BeNfhOsU.js +0 -2
  277. package/public/assets/FieldItemContext-BeNfhOsU.js.map +0 -1
  278. package/public/assets/admin-CFZaO1bM.js +0 -2
  279. package/public/assets/admin-CFZaO1bM.js.map +0 -1
  280. package/public/assets/admin-users-BK_BN8jm.js +0 -2
  281. package/public/assets/admin-users-BK_BN8jm.js.map +0 -1
  282. package/public/assets/alert-leqyvHOp.js +0 -2
  283. package/public/assets/alert-leqyvHOp.js.map +0 -1
  284. package/public/assets/auth-choice-row-CXuyJgkR.js +0 -2
  285. package/public/assets/auth-choice-row-CXuyJgkR.js.map +0 -1
  286. package/public/assets/auth-field-CWyXGKoC.js +0 -2
  287. package/public/assets/auth-footer-Cz5ivsDc.js +0 -2
  288. package/public/assets/auth-footer-Cz5ivsDc.js.map +0 -1
  289. package/public/assets/auth-layout-CiNn2-Nb.js +0 -2
  290. package/public/assets/auth-layout-CiNn2-Nb.js.map +0 -1
  291. package/public/assets/auth-page-header-DgGAaIiP.js +0 -2
  292. package/public/assets/authorization-context-banner-DznMDPOX.js +0 -2
  293. package/public/assets/avatar-D-FRGa1m.js +0 -2
  294. package/public/assets/badge-CsOfUji0.js +0 -2
  295. package/public/assets/checkbox-C90dDDza.js +0 -2
  296. package/public/assets/chevron-right-CN0jUyV0.js +0 -2
  297. package/public/assets/chevron-right-CN0jUyV0.js.map +0 -1
  298. package/public/assets/config-DTQCUlfZ.js +0 -2
  299. package/public/assets/config-DTQCUlfZ.js.map +0 -1
  300. package/public/assets/consent-B9sQEyO8.js +0 -2
  301. package/public/assets/email-8RKQzeig.js +0 -2
  302. package/public/assets/email-8RKQzeig.js.map +0 -1
  303. package/public/assets/email-huNZDYU9.js +0 -2
  304. package/public/assets/email-huNZDYU9.js.map +0 -1
  305. package/public/assets/error-BYe3gUMO.js +0 -2
  306. package/public/assets/error-BYe3gUMO.js.map +0 -1
  307. package/public/assets/field-BMT214_m.js +0 -3
  308. package/public/assets/field-BMT214_m.js.map +0 -1
  309. package/public/assets/forgot-BenoOUxC.js +0 -2
  310. package/public/assets/forgot-BenoOUxC.js.map +0 -1
  311. package/public/assets/forgot-huNZDYU9.js +0 -2
  312. package/public/assets/forgot-huNZDYU9.js.map +0 -1
  313. package/public/assets/index-CKpnrw9M.js +0 -11
  314. package/public/assets/index-CKpnrw9M.js.map +0 -1
  315. package/public/assets/index-Ct9o0oCZ.css +0 -2
  316. package/public/assets/initial-avatar-E5DK9Igm.js +0 -2
  317. package/public/assets/initial-avatar-E5DK9Igm.js.map +0 -1
  318. package/public/assets/input-CxVeC8Pn.js +0 -2
  319. package/public/assets/labeled-separator-CV7nb0XW.js +0 -2
  320. package/public/assets/labeled-separator-CV7nb0XW.js.map +0 -1
  321. package/public/assets/link-C-WdTj3F.js +0 -2
  322. package/public/assets/login-1YuiZD30.js +0 -2
  323. package/public/assets/login-1YuiZD30.js.map +0 -1
  324. package/public/assets/login-huNZDYU9.js +0 -2
  325. package/public/assets/login-huNZDYU9.js.map +0 -1
  326. package/public/assets/logout-B5T52P8u.js +0 -2
  327. package/public/assets/logout-B5T52P8u.js.map +0 -1
  328. package/public/assets/modal-tByFpy18.js +0 -2
  329. package/public/assets/modal-tByFpy18.js.map +0 -1
  330. package/public/assets/mutationOptions-DyYFUbyn.js +0 -2
  331. package/public/assets/passkey-CgAHaQ1p.js +0 -2
  332. package/public/assets/passkey-CgAHaQ1p.js.map +0 -1
  333. package/public/assets/passkey-huNZDYU9.js +0 -2
  334. package/public/assets/passkey-huNZDYU9.js.map +0 -1
  335. package/public/assets/passkey-v9Pzv-4A.js +0 -2
  336. package/public/assets/passkey-v9Pzv-4A.js.map +0 -1
  337. package/public/assets/password-Cuh9Hnjp.js +0 -2
  338. package/public/assets/password-Cuh9Hnjp.js.map +0 -1
  339. package/public/assets/password-huNZDYU9.js +0 -2
  340. package/public/assets/password-huNZDYU9.js.map +0 -1
  341. package/public/assets/password-reset-sU5KkBKi.js +0 -2
  342. package/public/assets/password-strength-BIPcWiM_.js +0 -2
  343. package/public/assets/pin-input-CITrr-Yc.js +0 -2
  344. package/public/assets/plus-DSBBSrgj.js +0 -2
  345. package/public/assets/plus-DSBBSrgj.js.map +0 -1
  346. package/public/assets/profile-BHPL9Px_.js +0 -2
  347. package/public/assets/profile-C8KaELVe.js +0 -2
  348. package/public/assets/profile-C8KaELVe.js.map +0 -1
  349. package/public/assets/provider-logos-u1YURWQr.js +0 -2
  350. package/public/assets/provider-logos-u1YURWQr.js.map +0 -1
  351. package/public/assets/recovery-CVROV9nj.js +0 -2
  352. package/public/assets/recovery-CVROV9nj.js.map +0 -1
  353. package/public/assets/register-cpxjX3qr.js +0 -2
  354. package/public/assets/register-cpxjX3qr.js.map +0 -1
  355. package/public/assets/register-huNZDYU9.js +0 -2
  356. package/public/assets/register-huNZDYU9.js.map +0 -1
  357. package/public/assets/reset-huNZDYU9.js +0 -2
  358. package/public/assets/reset-huNZDYU9.js.map +0 -1
  359. package/public/assets/reset-iNqYdsoa.js +0 -2
  360. package/public/assets/reset-iNqYdsoa.js.map +0 -1
  361. package/public/assets/select-DdjQtcLJ.js +0 -2
  362. package/public/assets/select-DdjQtcLJ.js.map +0 -1
  363. package/public/assets/select-huNZDYU9.js +0 -2
  364. package/public/assets/separator-B0Bvh1he.js +0 -2
  365. package/public/assets/separator-B0Bvh1he.js.map +0 -1
  366. package/public/assets/shell-header-bar-JcFhS7mb.js +0 -2
  367. package/public/assets/shell-header-bar-JcFhS7mb.js.map +0 -1
  368. package/public/assets/standard-schema-e8gtSzGE.js +0 -2
  369. package/public/assets/terms-BHPL9Px_.js +0 -2
  370. package/public/assets/terms-BHPL9Px_.js.map +0 -1
  371. package/public/assets/terms-BjwMWDFp.js +0 -2
  372. package/public/assets/terms-BjwMWDFp.js.map +0 -1
  373. package/public/assets/terms-checkbox-list-DNOq4Pb2.js +0 -2
  374. package/public/assets/terms-checkbox-list-DNOq4Pb2.js.map +0 -1
  375. package/public/assets/totp-D_EWG1h8.js +0 -2
  376. package/public/assets/totp-D_EWG1h8.js.map +0 -1
  377. package/public/assets/totp-DetFwOkk.js +0 -2
  378. package/public/assets/totp-DetFwOkk.js.map +0 -1
  379. package/public/assets/use-totp-setup-DtlgPUPJ.js +0 -3
  380. package/public/assets/use-totp-setup-DtlgPUPJ.js.map +0 -1
  381. package/public/assets/useAriaLabelledBy-IIwdHUss.js +0 -2
  382. package/public/assets/useMutation-BWZ0G4Td.js +0 -2
  383. package/public/assets/useQuery-Ccv_nzQl.js +0 -2
  384. package/public/assets/users-B1gvPM_x.js +0 -2
  385. package/public/assets/users-B1gvPM_x.js.map +0 -1
  386. package/public/vite.svg +0 -1
@@ -0,0 +1,2 @@
1
+ import{X as e}from"./createLucideIcon-D-yizrWN.js";import{t}from"./avatar-BxTPQIDp.js";var n=e(),r={sm:`md`,md:`xl`,lg:`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`,uiSize:r[i],children:(0,n.jsx)(t.Fallback,{children:a})})}export{i as t};
2
+ //# sourceMappingURL=initial-avatar-WMjxW3Zz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initial-avatar-WMjxW3Zz.js","names":[],"sources":["../../../frontend/src/components/ui/initial-avatar.tsx"],"sourcesContent":["import { TRAvatar } from '@tinyrack/ui/components/avatar';\n\ntype InitialAvatarProps = {\n email: string;\n size?: 'sm' | 'md' | 'lg';\n};\n\nconst uiSizeBySize: Record<\n NonNullable<InitialAvatarProps['size']>,\n 'md' | 'xl' | '2xl'\n> = {\n sm: 'md',\n md: 'xl',\n lg: '2xl',\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 uiSize={uiSizeBySize[size]}\n >\n <TRAvatar.Fallback>{initial}</TRAvatar.Fallback>\n </TRAvatar.Root>\n );\n}\n"],"mappings":"iGAOM,EAGF,CACF,GAAI,KACJ,GAAI,KACJ,GAAI,KACN,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,OAAQ,EAAa,aAErB,EAAA,EAAA,IAAA,CAAC,EAAS,SAAV,CAAA,SAAoB,CAA2B,CAAA,CAClC,CAAA,CAEnB"}
@@ -0,0 +1,2 @@
1
+ import{J as e,X as t,Z as n,et as r,q as i}from"./createLucideIcon-D-yizrWN.js";import{kn as a}from"./config-C18-l7z7.js";import{t as o}from"./FieldControl-ShLuCjvG.js";var s=t(),c=r(n(),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`,...n}){return(0,s.jsx)(`button`,{...n,className:i(`tr-input-group-action`,e),type:t})}function m({className:e,side:t=`start`,...n}){return(0,s.jsx)(`span`,{...n,className:i(`tr-input-group-adornment`,e),"data-side":t})}function h({children:e,className:t,uiSize:n=`md`,...r}){return a(),(0,s.jsx)(`div`,{...r,className:i(`tr-input-group`,t),"data-ui-size":n,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-QvBxPgy5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"input-CxVeC8Pn.js","names":["Field.Control","TRInput"],"sources":["../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/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.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-action.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-adornment.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-group.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/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-QvBxPgy5.js","names":["Field.Control","TRInput"],"sources":["../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/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.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-action.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-adornment.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/input/input-group.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/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":"8LASA,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{t as e}from"./createLucideIcon-BPpAIXR_.js";var t=e(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]);export{t};
2
- //# sourceMappingURL=key-round-CdvHb8vT.js.map
1
+ import{t as e}from"./createLucideIcon-D-yizrWN.js";var t=e(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]);export{t};
2
+ //# sourceMappingURL=key-round-BxWppK6h.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"key-round-CdvHb8vT.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/key-round.mjs"],"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: \"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\n key: \"1s6t7t\"\n }\n ],\n [\"circle\", { cx: \"16.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"w0ekpg\" }]\n];\nconst KeyRound = createLucideIcon(\"key-round\", __iconNode);\n\nexport { __iconNode, KeyRound as default };\n//# sourceMappingURL=key-round.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAmBA,IAAM,EAAW,EAAiB,YAAa,CAT7C,CACE,OACA,CACE,EAAG,6KACH,IAAK,QACP,CACF,EACA,CAAC,SAAU,CAAE,GAAI,OAAQ,GAAI,MAAO,EAAG,KAAM,KAAM,eAAgB,IAAK,QAAS,CAAC,CAErC,CAAU"}
1
+ {"version":3,"file":"key-round-BxWppK6h.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/key-round.mjs"],"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: \"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\",\n key: \"1s6t7t\"\n }\n ],\n [\"circle\", { cx: \"16.5\", cy: \"7.5\", r: \".5\", fill: \"currentColor\", key: \"w0ekpg\" }]\n];\nconst KeyRound = createLucideIcon(\"key-round\", __iconNode);\n\nexport { __iconNode, KeyRound as default };\n//# sourceMappingURL=key-round.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAmBA,IAAM,EAAW,EAAiB,YAAa,CAT7C,CACE,OACA,CACE,EAAG,6KACH,IAAK,QACP,CACF,EACA,CAAC,SAAU,CAAE,GAAI,OAAQ,GAAI,MAAO,EAAG,KAAM,KAAM,eAAgB,IAAK,QAAS,CAAC,CAErC,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{X as e,n as t}from"./createLucideIcon-D-yizrWN.js";import{t as n}from"./separator-CMGc2Y1q.js";var r=e();function i({label:e,className:i=``}){return e?(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)(t,{color:`muted`,variant:`caption`,children:e}),(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-DdkyYDWH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labeled-separator-DdkyYDWH.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 /* tinyrack-check-ignore-next-line components/no-native-text -- Structural separator row; label is rendered by TRText. */\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,GAMH,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,KArBE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAwB,YAAW,YAAY,YAAc,CAAA,CAuBxE"}
@@ -0,0 +1,2 @@
1
+ import{Z as e,et as t,o as n,q as r}from"./createLucideIcon-D-yizrWN.js";var i=t(e(),1);function a({className:e,disabled:t=!1,href:a,onClick:o,onKeyDown:s,ref:c,render:l,underline:u=`hover`,variant:d=`default`,...f}){let p=t&&(0,i.isValidElement)(l)?(0,i.cloneElement)(l,{href:void 0}):l;return n({defaultTagName:`a`,props:{...f,"aria-disabled":t||void 0,className:r(`tr-link`,e),"data-disabled":t?``:void 0,"data-underline":u,"data-variant":d,href:t?void 0:a,onClick(e){if(t){e.preventDefault(),e.stopPropagation();return}o?.(e)},onKeyDown(e){if(t&&(e.key===`Enter`||e.key===` `)){e.preventDefault(),e.stopPropagation();return}s?.(e)},tabIndex:t?-1:f.tabIndex},ref:c,render:p})}export{a as t};
2
+ //# sourceMappingURL=link-BHmn75Zo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"link-C-WdTj3F.js","names":[],"sources":["../../../../node_modules/.pnpm/@tinyrack+ui@0.29.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/link/link.js"],"sourcesContent":["\"use client\";\nimport { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { cloneElement, isValidElement } from \"react\";\nimport { useRender } from \"@base-ui/react/use-render\";\n//#region src/components/link/link.tsx\nfunction TRLink({ className, disabled = false, href, onClick, onKeyDown, ref, render, underline = \"hover\", variant = \"default\", ...props }) {\n\tconst resolvedRender = disabled && isValidElement(render) ? cloneElement(render, { href: void 0 }) : render;\n\treturn useRender({\n\t\tdefaultTagName: \"a\",\n\t\tprops: {\n\t\t\t...props,\n\t\t\t\"aria-disabled\": disabled || void 0,\n\t\t\tclassName: mergeClassNames(\"tr-link\", className),\n\t\t\t\"data-disabled\": disabled ? \"\" : void 0,\n\t\t\t\"data-underline\": underline,\n\t\t\t\"data-variant\": variant,\n\t\t\thref: disabled ? void 0 : href,\n\t\t\tonClick(event) {\n\t\t\t\tif (disabled) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(event);\n\t\t\t},\n\t\t\tonKeyDown(event) {\n\t\t\t\tif (disabled && (event.key === \"Enter\" || event.key === \" \")) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(event);\n\t\t\t},\n\t\t\ttabIndex: disabled ? -1 : props.tabIndex\n\t\t},\n\t\tref,\n\t\trender: resolvedRender\n\t});\n}\n//#endregion\nexport { TRLink };\n\n//# sourceMappingURL=link.js.map"],"x_google_ignoreList":[0],"mappings":"uFAKA,SAAS,EAAO,CAAE,YAAW,WAAW,GAAO,OAAM,UAAS,YAAW,MAAK,SAAQ,YAAY,QAAS,UAAU,UAAW,GAAG,GAAS,CAC3I,IAAM,EAAiB,IAAA,EAAA,EAAA,eAAA,CAA2B,CAAM,GAAA,EAAA,EAAA,aAAA,CAAiB,EAAQ,CAAE,KAAM,IAAK,EAAE,CAAC,EAAI,EACrG,OAAO,EAAU,CAChB,eAAgB,IAChB,MAAO,CACN,GAAG,EACH,gBAAiB,GAAY,IAAK,GAClC,UAAW,EAAgB,UAAW,CAAS,EAC/C,gBAAiB,EAAW,GAAK,IAAK,GACtC,iBAAkB,EAClB,eAAgB,EAChB,KAAM,EAAW,IAAK,GAAI,EAC1B,QAAQ,EAAO,CACd,GAAI,EAAU,CACb,EAAM,eAAe,EACrB,EAAM,gBAAgB,EACtB,MACD,CACA,IAAU,CAAK,CAChB,EACA,UAAU,EAAO,CAChB,GAAI,IAAa,EAAM,MAAQ,SAAW,EAAM,MAAQ,KAAM,CAC7D,EAAM,eAAe,EACrB,EAAM,gBAAgB,EACtB,MACD,CACA,IAAY,CAAK,CAClB,EACA,SAAU,EAAW,GAAK,EAAM,QACjC,EACA,MACA,OAAQ,CACT,CAAC,CACF"}
1
+ {"version":3,"file":"link-BHmn75Zo.js","names":[],"sources":["../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/link/link.js"],"sourcesContent":["\"use client\";\nimport { mergeClassNames } from \"../../internal/component-class-name.js\";\nimport { cloneElement, isValidElement } from \"react\";\nimport { useRender } from \"@base-ui/react/use-render\";\n//#region src/components/link/link.tsx\nfunction TRLink({ className, disabled = false, href, onClick, onKeyDown, ref, render, underline = \"hover\", variant = \"default\", ...props }) {\n\tconst resolvedRender = disabled && isValidElement(render) ? cloneElement(render, { href: void 0 }) : render;\n\treturn useRender({\n\t\tdefaultTagName: \"a\",\n\t\tprops: {\n\t\t\t...props,\n\t\t\t\"aria-disabled\": disabled || void 0,\n\t\t\tclassName: mergeClassNames(\"tr-link\", className),\n\t\t\t\"data-disabled\": disabled ? \"\" : void 0,\n\t\t\t\"data-underline\": underline,\n\t\t\t\"data-variant\": variant,\n\t\t\thref: disabled ? void 0 : href,\n\t\t\tonClick(event) {\n\t\t\t\tif (disabled) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonClick?.(event);\n\t\t\t},\n\t\t\tonKeyDown(event) {\n\t\t\t\tif (disabled && (event.key === \"Enter\" || event.key === \" \")) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonKeyDown?.(event);\n\t\t\t},\n\t\t\ttabIndex: disabled ? -1 : props.tabIndex\n\t\t},\n\t\tref,\n\t\trender: resolvedRender\n\t});\n}\n//#endregion\nexport { TRLink };\n\n//# sourceMappingURL=link.js.map"],"x_google_ignoreList":[0],"mappings":"wFAKA,SAAS,EAAO,CAAE,YAAW,WAAW,GAAO,OAAM,UAAS,YAAW,MAAK,SAAQ,YAAY,QAAS,UAAU,UAAW,GAAG,GAAS,CAC3I,IAAM,EAAiB,IAAA,EAAA,EAAA,eAAA,CAA2B,CAAM,GAAA,EAAA,EAAA,aAAA,CAAiB,EAAQ,CAAE,KAAM,IAAK,EAAE,CAAC,EAAI,EACrG,OAAO,EAAU,CAChB,eAAgB,IAChB,MAAO,CACN,GAAG,EACH,gBAAiB,GAAY,IAAK,GAClC,UAAW,EAAgB,UAAW,CAAS,EAC/C,gBAAiB,EAAW,GAAK,IAAK,GACtC,iBAAkB,EAClB,eAAgB,EAChB,KAAM,EAAW,IAAK,GAAI,EAC1B,QAAQ,EAAO,CACd,GAAI,EAAU,CACb,EAAM,eAAe,EACrB,EAAM,gBAAgB,EACtB,MACD,CACA,IAAU,CAAK,CAChB,EACA,UAAU,EAAO,CAChB,GAAI,IAAa,EAAM,MAAQ,SAAW,EAAM,MAAQ,KAAM,CAC7D,EAAM,eAAe,EACrB,EAAM,gBAAgB,EACtB,MACD,CACA,IAAY,CAAK,CAClB,EACA,SAAU,EAAW,GAAK,EAAM,QACjC,EACA,MACA,OAAQ,CACT,CAAC,CACF"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./createLucideIcon-BPpAIXR_.js";var t=e(`lock`,[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`,key:`fwvmzm`}]]);export{t};
2
- //# sourceMappingURL=lock-7NRyvXBS.js.map
1
+ import{t as e}from"./createLucideIcon-D-yizrWN.js";var t=e(`lock`,[[`rect`,{width:`18`,height:`11`,x:`3`,y:`11`,rx:`2`,ry:`2`,key:`1w4ew1`}],[`path`,{d:`M7 11V7a5 5 0 0 1 10 0v4`,key:`fwvmzm`}]]);export{t};
2
+ //# sourceMappingURL=lock-8wpR2C78.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lock-7NRyvXBS.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/lock.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAO,EAAiB,OAAQ,CAHpC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,KAAM,GAAI,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EACxF,CAAC,OAAQ,CAAE,EAAG,2BAA4B,IAAK,QAAS,CAAC,CAErB,CAAU"}
1
+ {"version":3,"file":"lock-8wpR2C78.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/lock.mjs"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAO,EAAiB,OAAQ,CAHpC,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,KAAM,GAAI,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EACxF,CAAC,OAAQ,CAAE,EAAG,2BAA4B,IAAK,QAAS,CAAC,CAErB,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{B as e}from"./index-lTEyHSus.js";var t=e;export{t as errorComponent};
2
+ //# sourceMappingURL=login-Cpfhakvn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-Cpfhakvn.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 { TRText } from '@tinyrack/ui/components/text';\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 { AuthorizationContextBanner } from '#frontend/components/auth/authorization-context-banner.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { DesignSystemRichText } from '#frontend/components/ui/design-system-rich-text.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { useBranding } from '#frontend/features/layout/use-branding.ts';\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 const { loginMethodDescription } = useBranding();\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 showBrandSubtitle>\n {loginMethodDescription && (\n <TRText as=\"p\" className=\"-mb-tinyrack-sm\" color=\"muted\" variant=\"body\">\n {loginMethodDescription}\n </TRText>\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 {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural method list; AuthMethodTile owns visible typography. */}\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 <DesignSystemRichText html={implicitNotice} variant=\"notice\" />\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"wCAesF,IAAAC,EAA7ED"}
@@ -0,0 +1,2 @@
1
+ import{X as e,Z as t,et as n,i as r,n as i,s as a}from"./createLucideIcon-D-yizrWN.js";import{Ar as o,In as s,t as c}from"./config-C18-l7z7.js";import{t as l}from"./useMutation-DqIIIiBW.js";import{Dt as u,J as d}from"./shell-header-bar-CdOEWmCT.js";import{t as f}from"./fingerprint-pattern-BwUoN1_w.js";import{t as p}from"./authorization-context-banner-zVxGX5e8.js";import{n as m,t as h}from"./provider-mark-CeYazOfu.js";import{t as g}from"./mail-DVP_XMUi.js";import{E as _,F as v,H as y,L as b,U as x,w as S,z as C}from"./index-lTEyHSus.js";import{t as w}from"./alert-D3aaK-_3.js";import{t as T}from"./auth-layout-BdRRr0vT.js";import{t as E}from"./promise-OpBtq8tG.js";import{t as D}from"./design-system-rich-text-B3NzIRoJ.js";import{t as O}from"./passkey-error-CZ26Ss-I.js";import{t as k}from"./passkey-CWTjw19S.js";var A=n(t()),j=e(),M={google:(0,j.jsx)(h,{"aria-hidden":!0,className:`size-tinyrack-xl`,provider:`google`}),github:(0,j.jsx)(h,{"aria-hidden":!0,className:`size-tinyrack-xl`,provider:`github`}),apple:(0,j.jsx)(h,{"aria-hidden":!0,className:`size-tinyrack-xl`,provider:`apple`})};function N({icon:e,label:t,providerType:n,render:r,onClick:o,isLoading:s,disabled:c}){let l;l=n&&n!==`generic_oauth`?M[n]:typeof e==`string`&&e.length>0?(0,j.jsx)(`img`,{alt:``,className:`size-tinyrack-xl`,src:e}):e||(0,j.jsx)(m,{"aria-hidden":!0,className:`size-tinyrack-xl`});let u=(0,j.jsxs)(j.Fragment,{children:[(0,j.jsx)(`span`,{className:`flex size-tinyrack-xl shrink-0 items-center justify-center`,children:l}),(0,j.jsx)(i,{truncate:!0,variant:`body`,children:t})]}),d=`w-full justify-start gap-tinyrack-md transition-colors duration-tinyrack-fast ease-tinyrack-standard`;return r?(0,j.jsx)(x,{appearance:`outline`,className:`cursor-pointer ${d}`,intent:`neutral`,render:r,uiSize:`lg`,children:u}):(0,j.jsx)(a,{appearance:`outline`,className:d,disabled:c,intent:`neutral`,loading:s,onClick:o,type:`button`,uiSize:`lg`,children:u})}var P={access_denied:`oauth.error.accessDenied`,temporarily_unavailable:`oauth.error.temporarilyUnavailable`,server_error:`oauth.error.serverError`,registration_email_not_allowed:`oauth.error.registrationEmailNotAllowed`};function F(){let{t:e,i18n:t}=r(),n=s(),a=o(),m=S.useSearch(),h=m.lang??t.language,{data:x}=u(c),{loginMethodDescription:M}=d(),F=x.registration.signup_notice?.[h]??x.registration.signup_notice?.[x.i18n.fallback_language],I=x.identity_providers,L=m.oauth_error,R=L?e(P[L]??`oauth.error.failed`):void 0,z=x.auth.password.enabled,B=x.auth.passkey.enabled,[V,H]=(0,A.useState)(null),U=async e=>{e.user&&(a.setQueryData(_.queryKey,e),await E(),C(m)?window.location.href=v(m):n.navigate({to:`/profile`})),a.invalidateQueries({queryKey:_.queryKey})},W=l({...k,onSuccess:e=>{H(null),U(e)},onError:t=>{if(O(t)===`unsupported`){H(e(`login.passkey.error.unsupported`));return}H(e(`login.passkey.error.failed`))},onSettled:()=>{a.invalidateQueries({queryKey:_.queryKey})}}),G=e=>{let t=`/api/oauth/${e}/authorize?mode=login`;if(C(m)){let e=new URL(v(m)),n=`${e.pathname}${e.search}${e.hash}`;t+=`&return_url=${encodeURIComponent(n)}`}return t};return(0,j.jsxs)(T,{showBrandSubtitle:!0,children:[M&&(0,j.jsx)(i,{as:`p`,className:`-mb-tinyrack-sm`,color:`muted`,variant:`body`,children:M}),(0,j.jsx)(p,{search:m}),R&&(0,j.jsx)(w,{icon:y,type:`error`,children:R}),V&&(0,j.jsx)(w,{icon:y,type:`error`,children:V}),(0,j.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-sm`,children:[I.map(e=>(0,j.jsx)(N,{icon:e.icon_url,label:e.display_name,providerType:e.type,render:(0,j.jsx)(`a`,{href:G(e.id)})},e.id)),z&&(0,j.jsx)(N,{icon:(0,j.jsx)(g,{"aria-hidden":!0,className:`size-tinyrack-xl`}),label:e(`login.method.password`),render:(0,j.jsx)(`a`,{href:(()=>{let e=new URLSearchParams;for(let[t,n]of Object.entries(b(m)))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`})()})}),B&&(0,j.jsx)(N,{disabled:W.isPending,icon:(0,j.jsx)(f,{"aria-hidden":!0,className:`size-tinyrack-xl`}),isLoading:W.isPending,label:e(`login.method.passkey`),onClick:()=>{H(null),W.mutate()}})]}),F&&(0,j.jsx)(D,{html:F,variant:`notice`})]})}export{F as component};
2
+ //# sourceMappingURL=login-DRcHjJ2-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-DRcHjJ2-.js","names":["useMutation","useQueryClient","useSuspenseQuery","useRouter","TRText","CircleAlertIcon","FingerprintIcon","MailIcon","useState","useTranslation","AuthMethodTile","AuthorizationContextBanner","Alert","DesignSystemRichText","AuthLayout","useBranding","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","loginMethodDescription","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","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 { TRProviderMark } from '@tinyrack/ui/components/provider-mark';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { LinkIcon } from 'lucide-react';\nimport type { ReactElement, ReactNode } from 'react';\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: (\n <TRProviderMark\n aria-hidden\n className=\"size-tinyrack-xl\"\n provider=\"google\"\n />\n ),\n github: (\n <TRProviderMark\n aria-hidden\n className=\"size-tinyrack-xl\"\n provider=\"github\"\n />\n ),\n apple: (\n <TRProviderMark aria-hidden className=\"size-tinyrack-xl\" provider=\"apple\" />\n ),\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' && icon.length > 0) {\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 {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural icon host; provider marks and deployment images are approved assets. */}\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 { TRText } from '@tinyrack/ui/components/text';\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 { AuthorizationContextBanner } from '#frontend/components/auth/authorization-context-banner.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { DesignSystemRichText } from '#frontend/components/ui/design-system-rich-text.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\nimport { useBranding } from '#frontend/features/layout/use-branding.ts';\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 const { loginMethodDescription } = useBranding();\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 showBrandSubtitle>\n {loginMethodDescription && (\n <TRText as=\"p\" className=\"-mb-tinyrack-sm\" color=\"muted\" variant=\"body\">\n {loginMethodDescription}\n </TRText>\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 {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural method list; AuthMethodTile owns visible typography. */}\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 <DesignSystemRichText html={implicitNotice} variant=\"notice\" />\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{t as e}from"./createLucideIcon-D-yizrWN.js";import{i as t,r as n}from"./config-C18-l7z7.js";import{t as r}from"./mutationOptions-Cv_vJkJn.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=e(`settings`,[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),o=r({mutationFn:async()=>t(await n.api.auth.logout.$post())});export{a as n,i as r,o as t};
2
+ //# sourceMappingURL=logout-Dphj1d_0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout-Dphj1d_0.js","names":["__iconNode"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/log-out.mjs","../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/settings.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","/**\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: \"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\",\n key: \"1i5ecw\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n];\nconst Settings = createLucideIcon(\"settings\", __iconNode);\n\nexport { __iconNode, Settings as default };\n//# sourceMappingURL=settings.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,1],"mappings":"qJAcA,IAAM,EAAS,EAAiB,UAAWA,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/BA,CAAU,ECK/C,EAAW,EAAiB,WAAY,CAT5C,CACE,OACA,CACE,EAAG,0UACH,IAAK,QACP,CACF,EACA,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAS,CAAC,CAEZ,CAAU,EChB3C,EAAwB,EAAgB,CACnD,WAAY,SAEH,EAAO,MADI,EAAO,IAAI,KAAK,OAAO,MAAM,CAC9B,CAErB,CAAC"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./createLucideIcon-BPpAIXR_.js";var t=e(`mail`,[[`path`,{d:`m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7`,key:`132q7q`}],[`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`,key:`izxlao`}]]);export{t};
2
- //# sourceMappingURL=mail-D0B_1Dzd.js.map
1
+ import{t as e}from"./createLucideIcon-D-yizrWN.js";var t=e(`mail`,[[`path`,{d:`m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7`,key:`132q7q`}],[`rect`,{x:`2`,y:`4`,width:`20`,height:`16`,rx:`2`,key:`izxlao`}]]);export{t};
2
+ //# sourceMappingURL=mail-DVP_XMUi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mail-D0B_1Dzd.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/mail.mjs"],"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: \"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\", key: \"132q7q\" }],\n [\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\", key: \"izxlao\" }]\n];\nconst Mail = createLucideIcon(\"mail\", __iconNode);\n\nexport { __iconNode, Mail as default };\n//# sourceMappingURL=mail.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAO,EAAiB,OAAQ,CAHpC,CAAC,OAAQ,CAAE,EAAG,0CAA2C,IAAK,QAAS,CAAC,EACxE,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,KAAM,OAAQ,KAAM,GAAI,IAAK,IAAK,QAAS,CAAC,CAE1C,CAAU"}
1
+ {"version":3,"file":"mail-DVP_XMUi.js","names":[],"sources":["../../../../node_modules/.pnpm/lucide-react@1.25.0_react@19.2.7/node_modules/lucide-react/dist/esm/icons/mail.mjs"],"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: \"m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7\", key: \"132q7q\" }],\n [\"rect\", { x: \"2\", y: \"4\", width: \"20\", height: \"16\", rx: \"2\", key: \"izxlao\" }]\n];\nconst Mail = createLucideIcon(\"mail\", __iconNode);\n\nexport { __iconNode, Mail as default };\n//# sourceMappingURL=mail.mjs.map\n"],"x_google_ignoreList":[0],"mappings":"mDAaA,IAAM,EAAO,EAAiB,OAAQ,CAHpC,CAAC,OAAQ,CAAE,EAAG,0CAA2C,IAAK,QAAS,CAAC,EACxE,CAAC,OAAQ,CAAE,EAAG,IAAK,EAAG,IAAK,MAAO,KAAM,OAAQ,KAAM,GAAI,IAAK,IAAK,QAAS,CAAC,CAE1C,CAAU"}
@@ -0,0 +1,2 @@
1
+ import{C as e,J as t,X as n,Z as r,c as i,et as a,h as o,x as s}from"./createLucideIcon-D-yizrWN.js";import{Cn as c,Ct as l,F as u,K as d,On as f,R as p,St as m,V as h,_ as g,an as _,g as v,ht as y,in as b,vt as x,w as S,y as C}from"./config-C18-l7z7.js";import{Ct as w,Et as T,M as E,T as D,Tt as O,X as k,_t as A,a as j,at as ee,ct as M,ft as te,gt as ne,h as re,ht as ie,lt as ae,mt as oe,ot as se,pt as ce,st as le,ut as ue,vt as de,w as fe,wt as pe,yt as me,z as N}from"./shell-header-bar-CdOEWmCT.js";var P=a(r(),1),F=P.createContext(void 0);function I(e){let t=P.useContext(F);if(!e&&t===void 0)throw Error(s(27));return t}var he=P.forwardRef(function(e,t){let{render:n,className:r,style:a,forceRender:o=!1,...s}=e,c=I(),l=c.useState(`open`),u=c.useState(`nested`),d=c.useState(`mounted`);return i(`div`,e,{state:{open:l,transitionStatus:c.useState(`transitionStatus`)},ref:[c.context.backdropRef,t],stateAttributesMapping:g,props:[{role:`presentation`,hidden:!d,style:{userSelect:`none`,WebkitUserSelect:`none`}},s],enabled:o||!u})}),L=P.forwardRef(function(e,t){let{render:n,className:r,style:a,disabled:s=!1,nativeButton:c=!0,...l}=e,u=I(),d=u.useState(`open`),{getButtonProps:f,buttonRef:m}=o({disabled:s,native:c}),g={disabled:s};function _(e){d&&u.setOpen(!1,p(h,e.nativeEvent))}return i(`button`,e,{state:g,ref:[t,m],props:[{onClick:_},l,f]})}),R=P.forwardRef(function(e,t){let{render:n,className:r,style:a,id:o,...s}=e,c=I(),l=N(o);return c.useSyncedValueWithCleanup(`descriptionElementId`,l),i(`p`,e,{ref:t,props:[{id:l},s]})}),z=P.createContext(void 0);function B(){let e=P.useContext(z);if(e===void 0)throw Error(s(26));return e}var V={...v,...m,nestedDialogOpen(e){return e?{"data-nested-dialog-open":``}:null}},H=n(),ge=P.forwardRef(function(e,t){let{render:n,className:r,style:a,finalFocus:o,initialFocus:s,...c}=e,l=I(),u=l.useState(`descriptionElementId`),d=l.useState(`disablePointerDismissal`),f=l.useState(`floatingRootContext`),p=l.useState(`popupProps`),m=l.useState(`modal`),h=l.useState(`mounted`),g=l.useState(`nested`),_=l.useState(`nestedOpenDialogCount`),v=l.useState(`open`),y=l.useState(`openMethod`),b=l.useState(`titleElementId`),S=l.useState(`transitionStatus`),C=l.useState(`role`),w=f.useState(`floatingId`);B(),x({open:v,ref:l.context.popupRef,onComplete(){v&&l.context.onOpenChangeComplete?.(!0)}});let E=s===void 0?te(l.context.popupRef):s,D=_>0,O=l.useStateSetter(`popupElement`),k=i(`div`,e,{state:{open:v,nested:g,transitionStatus:S,nestedDialogOpen:D},props:[p,{id:w,"aria-labelledby":b,"aria-describedby":u,role:C,...ae,hidden:!h,onKeyDown(e){re.has(e.key)&&e.stopPropagation()},style:{"--nested-dialogs":_}},c],ref:[t,l.context.popupRef,O],stateAttributesMapping:V});return(0,H.jsx)(T,{context:f,openInteractionType:y,disabled:!h,closeOnFocusOut:!d,initialFocus:E,returnFocus:o,modal:m!==!1,restoreFocus:`popup`,children:k})}),U=P.forwardRef(function(e,t){let{keepMounted:n=!1,...r}=e,i=I(),a=i.useState(`mounted`),o=i.useState(`modal`),s=i.useState(`open`);return a||n?(0,H.jsx)(z.Provider,{value:n,children:(0,H.jsxs)(u,{ref:t,...r,children:[a&&o===!0&&(0,H.jsx)(D,{ref:i.context.internalBackdropRef,inert:l(!s)}),e.children]})}):null});function _e({store:t,parentContext:n,isDrawer:r}){let i=t.useState(`open`),a=t.useState(`disablePointerDismissal`),o=t.useState(`modal`),s=t.useState(`popupElement`),c=t.useState(`floatingRootContext`),[l,u]=P.useState(0),[d,f]=P.useState(0),p=l===0,m=pe(c,{outsidePressEvent(){return t.context.internalBackdropRef.current||t.context.backdropRef.current?`intentional`:{mouse:o===`trap-focus`?`sloppy`:`intentional`,touch:`sloppy`}},outsidePress(e){if(!t.context.outsidePressEnabledRef.current||`button`in e&&e.button!==0)return!1;if(`touches`in e){if(e.type===`touchend`){if(e.changedTouches.length!==1||e.touches.length!==0)return!1}else if(e.touches.length!==1)return!1}let n=_(e);if(p&&!a){if(o){let e=t.context.internalBackdropRef.current,r=t.context.backdropRef.current;return e||r?e===n||r===n||b(n,s)&&!n?.hasAttribute(`data-base-ui-portal`):!0}return!0}return!1},escapeKey:p});return fe(i&&o===!0,s),t.useContextCallback(`onNestedDialogOpen`,(e,t)=>{u(e),f(t)}),e(()=>(n?.onNestedDialogOpen&&(i?n.onNestedDialogOpen(l+1,d+ +!!r):n.onNestedDialogOpen(0,0)),()=>{n?.onNestedDialogOpen&&i&&n.onNestedDialogOpen(0,0)}),[r,i,l,d,n]),ne(t,{activeTriggerProps:m.reference,inactiveTriggerProps:m.trigger,popupProps:m.floating,nestedOpenDialogCount:l,nestedOpenDrawerCount:d}),null}var W={...M,modal:e=>e.modal,nested:e=>e.nested,nestedOpenDialogCount:e=>e.nestedOpenDialogCount,nestedOpenDrawerCount:e=>e.nestedOpenDrawerCount,disablePointerDismissal:e=>e.disablePointerDismissal,openMethod:e=>e.openMethod,descriptionElementId:e=>e.descriptionElementId,titleElementId:e=>e.titleElementId,viewportElement:e=>e.viewportElement,role:e=>e.role},ve=class extends c{constructor(e,t,n){let r=new S,i=G(e,r,t,n);super(i,K(r),W)}setOpen=(e,t)=>{if(t.preventUnmountOnClose=()=>{this.set(`preventUnmountingOnClose`,!0)},!e&&t.trigger==null&&this.state.activeTriggerId!=null&&(t.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,t),t.isCanceled)return;this.state.floatingRootContext.dispatchOpenChange(e,t);let n={open:e};ce(n,e,t.trigger),this.update(n)}};function ye(){let e=new S;return new j(Object.freeze(G(void 0,e)),Object.freeze(K(e)),W)}function G(e,t,n,r=!1){let i={...se(),modal:!0,disablePointerDismissal:!1,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,nestedOpenDrawerCount:0,role:`dialog`,...e};return i.floatingRootContext=le(t,n,r),i}function K(e){return{popupRef:P.createRef(),backdropRef:P.createRef(),internalBackdropRef:P.createRef(),outsidePressEnabledRef:{current:!0},triggerElements:e,onOpenChange:void 0,onOpenChangeComplete:void 0}}function q(e,t){let{children:n,open:r,defaultOpen:i=!1,onOpenChange:a,onOpenChangeComplete:o,disablePointerDismissal:s=!1,modal:c=!0,actionsRef:l,handle:u,triggerId:f,defaultTriggerId:m=null}=t,h=e===`drawer`,g=e===`alert-dialog`,_=g?!0:c,v=g||s,y=g?`alertdialog`:`dialog`,b=I(!0),x={modal:_,disablePointerDismissal:v,nested:b!=null,role:y},S=A((e,t)=>new ve({open:i,openProp:r,activeTriggerId:m,triggerIdProp:f,...x},e,t),!0);S.useControlledProp(`openProp`,r),S.useControlledProp(`triggerIdProp`,f),S.useSyncedValues(x),S.useContextCallback(`onOpenChange`,a),S.useContextCallback(`onOpenChangeComplete`,o);let C=S.useState(`open`),w=S.useState(`mounted`),T=S.useState(`payload`);de(S,C),oe(S);let{forceUnmount:E}=ie(C,S);P.useImperativeHandle(l,()=>({unmount:E,close:()=>S.setOpen(!1,p(d))}),[E,S]);let D=C||w;return(0,H.jsxs)(F.Provider,{value:S,children:[u&&(0,H.jsx)(ue,{handle:u,store:S}),D&&(0,H.jsx)(_e,{store:S,parentContext:b?.context,isDrawer:h}),typeof n==`function`?n({payload:T}):n]})}function be(e){return q(`dialog`,e)}var J=P.forwardRef(function(e,t){let{render:n,className:r,style:a,children:o,...s}=e,c=B(),l=I(),u=l.useState(`open`),d=l.useState(`nested`),f=l.useState(`transitionStatus`),p=l.useState(`nestedOpenDialogCount`),m=l.useState(`mounted`),h=l.useStateSetter(`viewportElement`);return i(`div`,e,{enabled:c||m,state:{open:u,nested:d,transitionStatus:f,nestedDialogOpen:p>0},ref:[t,h],stateAttributesMapping:V,props:[{role:`presentation`,hidden:!m,style:{pointerEvents:u?void 0:`none`},children:o},s]})}),Y=P.forwardRef(function(e,t){let{render:n,className:r,style:a,id:o,...s}=e,c=I(),l=N(o);return c.useSyncedValueWithCleanup(`titleElementId`,l),i(`h2`,e,{ref:t,props:[{id:l},s]})}),X=P.forwardRef(function(e,t){let{render:n,className:r,style:a,disabled:c=!1,nativeButton:l=!0,id:u,payload:d,handle:f,...p}=e,m=I(!0),h=ee(f)??m;if(!h)throw Error(s(79));let g=N(u),_=h.useState(`floatingRootContext`),v=h.useState(`isOpenedByTrigger`,g),b=h.useState(`triggerPopupId`,g),x=P.useRef(null),{registerTrigger:S,isMountedByThisTrigger:w}=me(g,x,h,{payload:d}),{getButtonProps:T,buttonRef:D}=o({disabled:c,native:l}),k=O(_),A=E(()=>h.select(`open`),e=>{h.set(`openMethod`,e)}),j={disabled:c,open:v},M=h.useState(`triggerProps`,w);return i(`button`,e,{state:j,ref:[D,t,S,x],props:[k.reference,M,A,{[y]:``,id:g,"aria-haspopup":`dialog`,"aria-expanded":v,"aria-controls":b},p,T],stateAttributesMapping:C})}),Z=class extends w{constructor(){super(ye(),`Dialog`,!1)}open(e){this.openByTrigger(e)}openWithPayload(e){let t=this.attachedStore;t!==null&&(t.set(`payload`,e),t.setOpen(!0,p(d)))}close(){this.closePopup()}get isOpen(){return this.attachedStore?.select(`open`)??!1}};function xe(){return new Z}var Se=f(he,`tr-layer-backdrop tr-dialog-backdrop`),Ce=f(L,`tr-dialog-close`),we=f(R,`tr-dialog-description`);function Te(){return xe()}function Ee({className:e,placement:n=`middle`,...r}){return(0,H.jsx)(ge,{...r,className:t(`tr-dialog tr-dialog-box`,e),"data-placement":n})}var De=f(U);function Q(e){return(0,H.jsx)(be,{...e})}var Oe=f(Y,`tr-dialog-title`),ke=f(X,`tr-dialog-trigger`),$={Backdrop:Se,Close:Ce,Description:we,Popup:Ee,Portal:De,Root:Q,Viewport:f(J,`tr-layer-viewport tr-dialog-viewport`),Title:Oe,Trigger:ke,createHandle:Te},Ae={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)]`},je={default:`bg-tinyrack-surface-muted text-tinyrack-text`,destructive:`bg-tinyrack-danger-surface text-tinyrack-danger-foreground`};function Me({isOpen:e,onClose:t,title:n,description:r,children:i,size:a=`md`,preventClose:o=!1,icon:s,variant:c=`default`}){return(0,P.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,H.jsx)($.Root,{defaultOpen:!0,disablePointerDismissal:o,onOpenChange:e=>{!e&&!o&&t()},children:(0,H.jsx)($.Portal,{children:(0,H.jsxs)($.Viewport,{children:[(0,H.jsx)($.Backdrop,{}),(0,H.jsxs)($.Popup,{className:Ae[a],children:[(0,H.jsxs)(`div`,{className:`flex items-start gap-tinyrack-md`,children:[s&&(0,H.jsx)(`div`,{className:`flex size-tinyrack-2xl shrink-0 items-center justify-center rounded-tinyrack-full ${je[c]}`,children:(0,H.jsx)(s,{"aria-hidden":!0,className:`size-tinyrack-lg`})}),(0,H.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-tinyrack-3xs`,children:[(0,H.jsx)($.Title,{children:n}),r&&(0,H.jsx)($.Description,{className:`text-tinyrack-text-muted text-tinyrack-xs`,children:r})]}),!o&&(0,H.jsx)($.Close,{"aria-label":`Close`,className:`shrink-0`,"data-testid":`modal-close`,children:(0,H.jsx)(k,{"aria-hidden":!0,className:`size-tinyrack-lg`})})]}),i]})]})})}):null}function Ne({children:e}){return(0,H.jsx)(`div`,{className:`flex justify-end gap-tinyrack-sm pt-tinyrack-lg`,children:e})}export{Y as a,U as c,L as d,I as f,X as i,B as l,Ne as n,J as o,Z as r,q as s,Me as t,R as u};
2
+ //# sourceMappingURL=modal-JuaLVSyx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-JuaLVSyx.js","names":["_formatErrorMessage","REASONS.closePress","_formatErrorMessage","REASONS.imperativeAction","_formatErrorMessage","REASONS.imperativeAction","createDialogHandle","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/root/DialogRootContext.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/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/close/DialogClose.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/description/DialogDescription.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/portal/DialogPortalContext.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/utils/stateAttributesMapping.mjs","../../../../node_modules/.pnpm/@base-ui+react@1.7.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7/node_modules/@base-ui/react/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/portal/DialogPortal.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/useDialogRoot.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/store/DialogStore.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/useRenderDialogRoot.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/@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/viewport/DialogViewport.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/title/DialogTitle.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/trigger/DialogTrigger.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/store/DialogHandle.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-backdrop.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-close.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-description.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-handle.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-popup.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-portal.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-title.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-trigger.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/dialog-viewport.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.31.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.4.2_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/dialog/index.js","../../../frontend/src/components/ui/modal.tsx"],"sourcesContent":["'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const DialogRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") DialogRootContext.displayName = \"DialogRootContext\";\nexport function useDialogRootContext(optional) {\n const store = React.useContext(DialogRootContext);\n if (!optional && store === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: DialogRootContext is missing. Dialog parts must be placed within <Dialog.Root>.' : _formatErrorMessage(27));\n }\n return store;\n}","'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 { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useButton } from \"../../internals/use-button/index.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\n\n/**\n * A button that closes the dialog.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogClose = /*#__PURE__*/React.forwardRef(function DialogClose(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled = false,\n nativeButton = true,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const open = store.useState('open');\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton\n });\n const state = {\n disabled\n };\n function handleClick(event) {\n if (open) {\n store.setOpen(false, createChangeEventDetails(REASONS.closePress, event.nativeEvent));\n }\n }\n return useRenderElement('button', componentProps, {\n state,\n ref: [forwardedRef, buttonRef],\n props: [{\n onClick: handleClick\n }, elementProps, getButtonProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogClose.displayName = \"DialogClose\";","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\n/**\n * A paragraph with additional information about the dialog.\n * Renders a `<p>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogDescription = /*#__PURE__*/React.forwardRef(function DialogDescription(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const id = useBaseUiId(idProp);\n store.useSyncedValueWithCleanup('descriptionElementId', id);\n return useRenderElement('p', componentProps, {\n ref: forwardedRef,\n props: [{\n id\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogDescription.displayName = \"DialogDescription\";","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const DialogPortalContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") DialogPortalContext.displayName = \"DialogPortalContext\";\nexport function useDialogPortalContext() {\n const value = React.useContext(DialogPortalContext);\n if (value === undefined) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: <Dialog.Portal> is missing.' : _formatErrorMessage(26));\n }\n return value;\n}","import { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { popupStateMapping } from \"../../utils/popupStateMapping.mjs\";\n/**\n * Shared by `Dialog.Popup` and `Dialog.Viewport`, whose states have the same shape.\n * `nested` is not mapped: unmapped `true` booleans already render as `data-nested`.\n */\nexport const dialogStateAttributesMapping = {\n ...popupStateMapping,\n ...transitionStatusMapping,\n nestedDialogOpen(value) {\n return value ? {\n 'data-nested-dialog-open': ''\n } : null;\n }\n};","'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 * as React from 'react';\nimport { inertValue } from '@base-ui/utils/inertValue';\nimport { FloatingPortal } from \"../../floating-ui-react/index.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { DialogPortalContext } from \"./DialogPortalContext.mjs\";\nimport { InternalBackdrop } from \"../../utils/InternalBackdrop.mjs\";\n\n/**\n * A portal element that moves the popup to a different part of the DOM.\n * By default, the portal element is appended to `<body>`.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport const DialogPortal = /*#__PURE__*/React.forwardRef(function DialogPortal(props, forwardedRef) {\n const {\n keepMounted = false,\n ...portalProps\n } = props;\n const store = useDialogRootContext();\n const mounted = store.useState('mounted');\n const modal = store.useState('modal');\n const open = store.useState('open');\n const shouldRender = mounted || keepMounted;\n if (!shouldRender) {\n return null;\n }\n return /*#__PURE__*/_jsx(DialogPortalContext.Provider, {\n value: keepMounted,\n children: /*#__PURE__*/_jsxs(FloatingPortal, {\n ref: forwardedRef,\n ...portalProps,\n children: [mounted && modal === true && /*#__PURE__*/_jsx(InternalBackdrop, {\n ref: store.context.internalBackdropRef,\n inert: inertValue(!open)\n }), props.children]\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogPortal.displayName = \"DialogPortal\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useScrollLock } from '@base-ui/utils/useScrollLock';\nimport { useDismiss } from \"../../floating-ui-react/index.mjs\";\nimport { contains, getTarget } from \"../../floating-ui-react/utils.mjs\";\nimport { usePopupInteractionProps } from \"../../utils/popups/index.mjs\";\nexport function DialogInteractions({\n store,\n parentContext,\n isDrawer\n}) {\n const open = store.useState('open');\n const disablePointerDismissal = store.useState('disablePointerDismissal');\n const modal = store.useState('modal');\n const popupElement = store.useState('popupElement');\n const floatingRootContext = store.useState('floatingRootContext');\n const [ownNestedOpenDialogs, setOwnNestedOpenDialogs] = React.useState(0);\n const [ownNestedOpenDrawers, setOwnNestedOpenDrawers] = React.useState(0);\n const isTopmost = ownNestedOpenDialogs === 0;\n const dismiss = useDismiss(floatingRootContext, {\n outsidePressEvent() {\n if (store.context.internalBackdropRef.current || store.context.backdropRef.current) {\n return 'intentional';\n }\n // Ensure `aria-hidden` on outside elements is removed immediately\n // on outside press when trapping focus.\n return {\n mouse: modal === 'trap-focus' ? 'sloppy' : 'intentional',\n touch: 'sloppy'\n };\n },\n outsidePress(event) {\n if (!store.context.outsidePressEnabledRef.current) {\n return false;\n }\n\n // For mouse events, only accept left button (button 0)\n // For touch events, a single touch is equivalent to left button\n if ('button' in event && event.button !== 0) {\n return false;\n }\n if ('touches' in event) {\n // Outside press can be handled on `touchend`, where the lifted point is\n // reported in `changedTouches` and `touches` contains any remaining\n // active points. Treat it as a single-finger tap only when exactly one\n // touch ended and no other fingers are still down.\n if (event.type === 'touchend') {\n if (event.changedTouches.length !== 1 || event.touches.length !== 0) {\n return false;\n }\n } else if (event.touches.length !== 1) {\n return false;\n }\n }\n const target = getTarget(event);\n if (isTopmost && !disablePointerDismissal) {\n // Only close if the click occurred on the dialog's owning backdrop.\n // This supports multiple modal dialogs that aren't nested in the React tree:\n // https://github.com/mui/base-ui/issues/1320\n if (modal) {\n const internalBackdrop = store.context.internalBackdropRef.current;\n const backdrop = store.context.backdropRef.current;\n return internalBackdrop || backdrop ? internalBackdrop === target || backdrop === target || contains(target, popupElement) && !target?.hasAttribute('data-base-ui-portal') : true;\n }\n return true;\n }\n return false;\n },\n escapeKey: isTopmost\n });\n useScrollLock(open && modal === true, popupElement);\n\n // Listen for nested open/close events on this store to maintain the counts.\n // A close notification is an open notification with zeroed counts.\n store.useContextCallback('onNestedDialogOpen', (dialogCount, drawerCount) => {\n setOwnNestedOpenDialogs(dialogCount);\n setOwnNestedOpenDrawers(drawerCount);\n });\n\n // Notify parent of our open/close state using parent callbacks, if any\n useIsoLayoutEffect(() => {\n if (parentContext?.onNestedDialogOpen) {\n if (open) {\n parentContext.onNestedDialogOpen(ownNestedOpenDialogs + 1, ownNestedOpenDrawers + (isDrawer ? 1 : 0));\n } else {\n parentContext.onNestedDialogOpen(0, 0);\n }\n }\n return () => {\n if (parentContext?.onNestedDialogOpen && open) {\n parentContext.onNestedDialogOpen(0, 0);\n }\n };\n }, [isDrawer, open, ownNestedOpenDialogs, ownNestedOpenDrawers, parentContext]);\n usePopupInteractionProps(store, {\n // `enabled` is not passed to `useDismiss`, so its props are always defined,\n // and `trigger` is the same object as `reference`.\n activeTriggerProps: dismiss.reference,\n inactiveTriggerProps: dismiss.trigger,\n // DialogPopup and DrawerPopup spread `FOCUSABLE_POPUP_PROPS` directly, so\n // this only needs to carry the dismiss handlers.\n popupProps: dismiss.floating,\n nestedOpenDialogCount: ownNestedOpenDialogs,\n nestedOpenDrawerCount: ownNestedOpenDrawers\n });\n return null;\n}","import * as React from 'react';\nimport { ReactStore } from '@base-ui/utils/store';\nimport { NullStore } from \"../../utils/NullStore.mjs\";\nimport { createPopupFloatingRootContext, createInitialPopupStoreState, popupStoreSelectors, PopupTriggerMap, setPopupOpenState } from \"../../utils/popups/index.mjs\";\nconst selectors = {\n ...popupStoreSelectors,\n modal: state => state.modal,\n nested: state => state.nested,\n nestedOpenDialogCount: state => state.nestedOpenDialogCount,\n nestedOpenDrawerCount: state => state.nestedOpenDrawerCount,\n disablePointerDismissal: state => state.disablePointerDismissal,\n openMethod: state => state.openMethod,\n descriptionElementId: state => state.descriptionElementId,\n titleElementId: state => state.titleElementId,\n viewportElement: state => state.viewportElement,\n role: state => state.role\n};\n\n/**\n * The subset of `DialogStore` that detached handle-backed triggers rely on. Both the real\n * `DialogStore` and the inert fallback store satisfy it, so a trigger can read from whichever\n * store the handle currently exposes.\n */\n\nexport class DialogStore extends ReactStore {\n constructor(initialState, floatingId, nested) {\n const triggerElements = new PopupTriggerMap();\n const state = createInitialState(initialState, triggerElements, floatingId, nested);\n super(state, createInitialContext(triggerElements), selectors);\n }\n setOpen = (nextOpen, eventDetails) => {\n eventDetails.preventUnmountOnClose = () => {\n this.set('preventUnmountingOnClose', true);\n };\n if (!nextOpen && eventDetails.trigger == null && this.state.activeTriggerId != null) {\n // When closing the dialog, pass the old trigger to the onOpenChange event\n // so it's not reset too early (potentially causing focus issues in controlled scenarios).\n eventDetails.trigger = this.state.activeTriggerElement ?? undefined;\n }\n this.context.onOpenChange?.(nextOpen, eventDetails);\n if (eventDetails.isCanceled) {\n return;\n }\n this.state.floatingRootContext.dispatchOpenChange(nextOpen, eventDetails);\n const updatedState = {\n open: nextOpen\n };\n setPopupOpenState(updatedState, nextOpen, eventDetails.trigger);\n this.update(updatedState);\n };\n}\n\n/**\n * Creates the inert fallback store used by detached handle-backed triggers while no\n * `Dialog.Root` is attached. It preserves a dialog-specific trigger registry in context so\n * detached triggers can register before migrating to the live root store.\n */\nexport function createNullDialogStore() {\n const triggerElements = new PopupTriggerMap();\n return new NullStore(Object.freeze(createInitialState(undefined, triggerElements)), Object.freeze(createInitialContext(triggerElements)), selectors);\n}\nfunction createInitialState(initialState, triggerElements, floatingId, nested = false) {\n const state = {\n ...createInitialPopupStoreState(),\n modal: true,\n disablePointerDismissal: false,\n viewportElement: null,\n descriptionElementId: undefined,\n titleElementId: undefined,\n openMethod: null,\n nested: false,\n nestedOpenDialogCount: 0,\n nestedOpenDrawerCount: 0,\n role: 'dialog',\n ...initialState\n };\n state.floatingRootContext = createPopupFloatingRootContext(triggerElements, floatingId, nested);\n return state;\n}\nfunction createInitialContext(triggerElements) {\n return {\n popupRef: /*#__PURE__*/React.createRef(),\n backdropRef: /*#__PURE__*/React.createRef(),\n internalBackdropRef: /*#__PURE__*/React.createRef(),\n outsidePressEnabledRef: {\n current: true\n },\n triggerElements,\n onOpenChange: undefined,\n onOpenChangeComplete: undefined\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { DialogInteractions } from \"./useDialogRoot.mjs\";\nimport { DialogRootContext, useDialogRootContext } from \"./DialogRootContext.mjs\";\nimport { DialogStore } from \"../store/DialogStore.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { useImplicitActiveTrigger, useOpenStateTransitions, PopupHandleAttachment, usePopupRootStore, usePopupRootSync } from \"../../utils/popups/index.mjs\";\nimport { jsx as _jsx, jsxs as _jsxs } from \"react/jsx-runtime\";\nexport function useRenderDialogRoot(mode, props) {\n const {\n children,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onOpenChangeComplete,\n disablePointerDismissal: disablePointerDismissalProp = false,\n modal: modalProp = true,\n actionsRef,\n handle,\n triggerId: triggerIdProp,\n defaultTriggerId: defaultTriggerIdProp = null\n } = props;\n const isDrawer = mode === 'drawer';\n const isAlertDialog = mode === 'alert-dialog';\n const modal = isAlertDialog ? true : modalProp;\n const disablePointerDismissal = isAlertDialog || disablePointerDismissalProp;\n const role = isAlertDialog ? 'alertdialog' : 'dialog';\n const parentStore = useDialogRootContext(true);\n const nested = parentStore != null;\n const rootState = {\n modal,\n disablePointerDismissal,\n nested,\n role\n };\n\n // The store is owned by this Root instance and created exactly once. It is not tied to the handle:\n // the handle attaches to it, so swapping the handle re-attaches rather than recreating state.\n // Default values are only initial values; controlled values and root state are synced after creation.\n // Dialogs pass the popup element to Floating UI as the floating element (`treatPopupAsFloatingElement`).\n const store = usePopupRootStore((floatingId, floatingNested) => new DialogStore({\n open: defaultOpen,\n openProp,\n activeTriggerId: defaultTriggerIdProp,\n triggerIdProp,\n ...rootState\n }, floatingId, floatingNested), true);\n store.useControlledProp('openProp', openProp);\n store.useControlledProp('triggerIdProp', triggerIdProp);\n store.useSyncedValues(rootState);\n store.useContextCallback('onOpenChange', onOpenChange);\n store.useContextCallback('onOpenChangeComplete', onOpenChangeComplete);\n const open = store.useState('open');\n const mounted = store.useState('mounted');\n const payload = store.useState('payload');\n usePopupRootSync(store, open);\n useImplicitActiveTrigger(store);\n const {\n forceUnmount\n } = useOpenStateTransitions(open, store);\n React.useImperativeHandle(actionsRef, () => ({\n unmount: forceUnmount,\n close: () => store.setOpen(false, createChangeEventDetails(REASONS.imperativeAction))\n }), [forceUnmount, store]);\n const shouldRenderInteractions = open || mounted;\n return /*#__PURE__*/_jsxs(DialogRootContext.Provider, {\n value: store,\n children: [handle && /*#__PURE__*/_jsx(PopupHandleAttachment, {\n handle: handle,\n store: store\n }), shouldRenderInteractions && /*#__PURE__*/_jsx(DialogInteractions, {\n store: store,\n parentContext: parentStore?.context,\n isDrawer: isDrawer\n }), typeof children === 'function' ? children({\n payload\n }) : children]\n });\n}","'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';\n\nimport * as React from 'react';\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useDialogPortalContext } from \"../portal/DialogPortalContext.mjs\";\nimport { dialogStateAttributesMapping } from \"../utils/stateAttributesMapping.mjs\";\n\n/**\n * A positioning container for the dialog popup that can be made scrollable.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogViewport = /*#__PURE__*/React.forwardRef(function DialogViewport(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n children,\n ...elementProps\n } = componentProps;\n const keepMounted = useDialogPortalContext();\n const store = useDialogRootContext();\n const open = store.useState('open');\n const nested = store.useState('nested');\n const transitionStatus = store.useState('transitionStatus');\n const nestedOpenDialogCount = store.useState('nestedOpenDialogCount');\n const mounted = store.useState('mounted');\n const setViewportElement = store.useStateSetter('viewportElement');\n const nestedDialogOpen = nestedOpenDialogCount > 0;\n const state = {\n open,\n nested,\n transitionStatus,\n nestedDialogOpen\n };\n const shouldRender = keepMounted || mounted;\n return useRenderElement('div', componentProps, {\n enabled: shouldRender,\n state,\n ref: [forwardedRef, setViewportElement],\n stateAttributesMapping: dialogStateAttributesMapping,\n props: [{\n role: 'presentation',\n hidden: !mounted,\n style: {\n pointerEvents: !open ? 'none' : undefined\n },\n children\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogViewport.displayName = \"DialogViewport\";","'use client';\n\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\n/**\n * A heading that labels the dialog.\n * Renders an `<h2>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogTitle = /*#__PURE__*/React.forwardRef(function DialogTitle(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n ...elementProps\n } = componentProps;\n const store = useDialogRootContext();\n const id = useBaseUiId(idProp);\n store.useSyncedValueWithCleanup('titleElementId', id);\n return useRenderElement('h2', componentProps, {\n ref: forwardedRef,\n props: [{\n id\n }, elementProps]\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogTitle.displayName = \"DialogTitle\";","'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nimport { useDialogRootContext } from \"../root/DialogRootContext.mjs\";\nimport { useButton } from \"../../internals/use-button/useButton.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { triggerOpenStateMapping } from \"../../utils/popupStateMapping.mjs\";\nimport { CLICK_TRIGGER_IDENTIFIER } from \"../../internals/constants.mjs\";\nimport { usePopupHandleStore, useTriggerDataForwarding } from \"../../utils/popups/index.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useClick } from \"../../floating-ui-react/index.mjs\";\nimport { useOpenMethodTriggerProps } from \"../../utils/useOpenInteractionType.mjs\";\n\n/**\n * A button that opens the dialog.\n * Renders a `<button>` element.\n *\n * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog)\n */\nexport const DialogTrigger = /*#__PURE__*/React.forwardRef(function DialogTrigger(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled = false,\n nativeButton = true,\n id: idProp,\n payload,\n handle,\n ...elementProps\n } = componentProps;\n const dialogRootStore = useDialogRootContext(true);\n const handleStore = usePopupHandleStore(handle);\n const store = handleStore ?? dialogRootStore;\n if (!store) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: <Dialog.Trigger> must be used within <Dialog.Root> or provided with a handle.' : _formatErrorMessage(79));\n }\n const thisTriggerId = useBaseUiId(idProp);\n const floatingContext = store.useState('floatingRootContext');\n const isOpenedByThisTrigger = store.useState('isOpenedByTrigger', thisTriggerId);\n const popupId = store.useState('triggerPopupId', thisTriggerId);\n const triggerElementRef = React.useRef(null);\n const {\n registerTrigger,\n isMountedByThisTrigger\n } = useTriggerDataForwarding(thisTriggerId, triggerElementRef, store, {\n payload\n });\n const {\n getButtonProps,\n buttonRef\n } = useButton({\n disabled,\n native: nativeButton\n });\n const click = useClick(floatingContext);\n const interactionTypeProps = useOpenMethodTriggerProps(() => store.select('open'), interactionType => {\n store.set('openMethod', interactionType);\n });\n const state = {\n disabled,\n open: isOpenedByThisTrigger\n };\n const rootTriggerProps = store.useState('triggerProps', isMountedByThisTrigger);\n return useRenderElement('button', componentProps, {\n state,\n ref: [buttonRef, forwardedRef, registerTrigger, triggerElementRef],\n props: [click.reference, rootTriggerProps, interactionTypeProps, {\n [CLICK_TRIGGER_IDENTIFIER]: '',\n id: thisTriggerId,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': isOpenedByThisTrigger,\n 'aria-controls': popupId\n }, elementProps, getButtonProps],\n stateAttributesMapping: triggerOpenStateMapping\n });\n});\nif (process.env.NODE_ENV !== \"production\") DialogTrigger.displayName = \"DialogTrigger\";","import { createNullDialogStore } from \"./DialogStore.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { BasePopupHandle } from \"../../utils/popups/popupHandle.mjs\";\n\n/**\n * Controls a Dialog imperatively and associates detached `Dialog.Trigger` components with a\n * `Dialog.Root`. Create one with `Dialog.createHandle()` and pass it to the `handle` prop of the\n * root and of any triggers rendered outside of it.\n *\n * The imperative methods take effect only while a root using this handle is mounted; calls made\n * before a root attaches (or after it unmounts) are ignored.\n */\nexport class DialogHandle extends BasePopupHandle {\n constructor() {\n super(createNullDialogStore(), 'Dialog', false);\n }\n\n /**\n * Opens the dialog, optionally associating it with a trigger.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n *\n * @param triggerId ID of the trigger to associate with the dialog. The trigger must be a matching\n * `Dialog.Trigger` with this handle passed as a prop. Pass `null` to open without associating any trigger.\n */\n open(triggerId) {\n this.openByTrigger(triggerId);\n }\n\n /**\n * Opens the dialog with the given payload, without associating it with any trigger.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n *\n * @param payload Payload to set when opening the dialog. It is exposed to the root's render-prop children.\n */\n openWithPayload(payload) {\n const attachedStore = this.attachedStore;\n if (attachedStore === null) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('Base UI: DialogHandle.openWithPayload() was called while no root using this handle is mounted. ' + 'The call and its payload were ignored; mount a root with this handle before opening it imperatively.');\n }\n return;\n }\n attachedStore.set('payload', payload);\n attachedStore.setOpen(true, createChangeEventDetails(REASONS.imperativeAction));\n }\n\n /**\n * Closes the dialog.\n *\n * This method should only be called in an event handler or an effect (not during rendering).\n */\n close() {\n this.closePopup();\n }\n\n /**\n * Whether the dialog is currently open. Returns `false` while no root is attached to the handle.\n */\n get isOpen() {\n return this.attachedStore?.select('open') ?? false;\n }\n}\n\n/**\n * Creates a new handle to connect a Dialog.Root with detached Dialog.Trigger components.\n */\nexport function createDialogHandle() {\n return new DialogHandle();\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-foreground',\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 {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural dialog header; title and description are DS dialog text parts. */}\n <div className=\"flex items-start gap-tinyrack-md\">\n {IconComponent && (\n /* tinyrack-check-ignore-next-line components/no-native-text -- Structural icon host. */\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 {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural DS dialog text stack. */}\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 /* tinyrack-check-ignore-next-line components/no-native-text -- Structural dialog action slot containing DS controls. */\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,14,15,16,17,18,19,20,21,22,23,24,25,26],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{Ir as e,Nr as t,Pr as n}from"./config-C18-l7z7.js";var r=class extends t{#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(e){let t=()=>{this.#i({type:`continue`})},r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};this.#r=n({fn:()=>this.options.mutationFn?this.options.mutationFn(e,r):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,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)t();else{this.#i({type:`pending`,variables:e,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,r);let t=await this.options.onMutate?.(e,r);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:a})}let n=await this.#r.start();return await this.#n.config.onSuccess?.(n,e,this.state.context,this,r),await this.options.onSuccess?.(n,e,this.state.context,r),await this.#n.config.onSettled?.(n,null,this.state.variables,this.state.context,this,r),await this.options.onSettled?.(n,null,e,this.state.context,r),this.#i({type:`success`,data:n}),n}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,r)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,r)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,r)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,r)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#n.runNext(this)}}#i(t){let n=e=>{switch(t.type){case`failed`:return{...e,failureCount:t.failureCount,failureReason:t.error};case`pause`:return{...e,isPaused:!0};case`continue`:return{...e,isPaused:!1};case`pending`:return{...e,context:t.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:t.isPaused,status:`pending`,variables:t.variables,submittedAt:Date.now()};case`success`:return{...e,data:t.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...e,data:void 0,error:t.error,failureCount:e.failureCount+1,failureReason:t.error,isPaused:!1,status:`error`}}};this.state=n(this.state),e.batch(()=>{this.#t.forEach(e=>{e.onMutationUpdate(t)}),this.#n.notify({mutation:this,type:`updated`,action:t})})}};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-Cv_vJkJn.js.map
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"mutationOptions-Cv_vJkJn.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{K as e,X as t,Z as n,et as r,i,n as a,s as o}from"./createLucideIcon-D-yizrWN.js";import{An as s,Ar as c,In as l,i as u,n as d,r as f,vr as p}from"./config-C18-l7z7.js";import{t as m}from"./useMutation-DqIIIiBW.js";import{t as h}from"./useQuery-CLr9TaKA.js";import{t as g}from"./fingerprint-pattern-BwUoN1_w.js";import{E as _,F as v,H as y,L as b,U as x,v as S,z as C}from"./index-lTEyHSus.js";import{t as w}from"./auth-page-header-ChaCNNrn.js";import{t as T}from"./alert-D3aaK-_3.js";import{t as E}from"./auth-layout-BdRRr0vT.js";import{t as D}from"./promise-OpBtq8tG.js";import{n as O,t as k}from"./auth-footer-Du6S-oDG.js";import{t as A}from"./passkey-error-CZ26Ss-I.js";import{t as j}from"./passkey-CWTjw19S.js";var M=r(n()),N=p({queryKey:d.pendingSecondFactorMethods(),queryFn:async()=>u(await f.api.auth[`2fa`].methods.$get()),retry:!1}),P=t();function F(){let{t}=i(),n=l(),r=c(),u=S.useSearch(),[d,f]=(0,M.useState)(null),p=(0,M.useRef)(!1),F=h({...N,enabled:d!==null}).data?.methods.includes(`totp`)??!1,I=e=>{switch(e){case`unsupported`:return t(`verifyPasskey.error.unsupported`);case`not_allowed`:return t(`verifyPasskey.error.notAllowed`);case`expired`:return t(`verifyPasskey.error.expired`);case`user_mismatch`:return t(`verifyPasskey.error.userMismatch`);case`verification_failed`:return t(`verifyPasskey.error.failed`)}},L=m({...j,onSuccess:async e=>{e.user&&(r.setQueryData(_.queryKey,{user:e.user}),await D(),C(u)?window.location.href=v(u):n.navigate({to:`/profile`}))},onError:async e=>{let t=A(e);f({message:I(t),reason:t})},onSettled:()=>{r.invalidateQueries({queryKey:_.queryKey})}});return(0,M.useEffect)(()=>{p.current||(p.current=!0,L.mutate())},[L]),(0,P.jsxs)(E,{children:[(0,P.jsx)(w,{align:`center`,subtitle:t(`verifyPasskey.subtitle`),title:t(`verifyPasskey.title`)}),(0,P.jsxs)(`div`,{className:`flex flex-col items-center gap-tinyrack-lg`,children:[(0,P.jsx)(`div`,{className:`flex size-tinyrack-3xl items-center justify-center rounded-tinyrack-full bg-tinyrack-surface-muted`,children:(0,P.jsx)(g,{"aria-hidden":!0,className:`size-tinyrack-2xl text-tinyrack-text-muted`})}),L.isPending&&(0,P.jsxs)(`div`,{className:`flex flex-col items-center gap-tinyrack-sm`,children:[(0,P.jsx)(e,{uiSize:`md`}),(0,P.jsx)(a,{align:`center`,as:`p`,color:`muted`,variant:`bodySm`,children:t(`verifyPasskey.waiting`)})]}),d&&(0,P.jsxs)(`div`,{className:`flex w-full flex-col items-center gap-tinyrack-md`,children:[(0,P.jsx)(T,{className:`w-full`,icon:y,type:`error`,children:d.message}),F&&(0,P.jsx)(x,{className:`w-full`,intent:`primary`,render:(0,P.jsx)(s,{search:b(u),to:`/verify/totp`}),uiSize:`lg`,children:t(`verifyPasskey.useTotp`)}),(0,P.jsx)(o,{appearance:F?`outline`:`solid`,className:`w-full`,intent:F?`neutral`:`primary`,onClick:()=>{f(null),L.mutate()},type:`button`,uiSize:`lg`,children:t(`verifyPasskey.retry`)})]})]}),(0,P.jsx)(k,{children:(0,P.jsx)(O,{link:(0,P.jsx)(s,{search:u,to:`/login`,children:t(`verifyPasskey.backToLogin`)})})})]})}export{F as component};
2
+ //# sourceMappingURL=passkey-CObBlfKK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passkey-CObBlfKK.js","names":["useMutation","useQuery","useQueryClient","Link","useRouter","TRButton","TRLinkButton","TRSpinner","TRText","CircleAlertIcon","FingerprintIcon","useEffect","useRef","useState","useTranslation","AuthFooter","AuthFooterLink","AuthPageHeader","Alert","AuthLayout","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","classifyPasskeyError","tick","authenticateWithPasskeyMutationOptions","getPendingSecondFactorMethodsQueryOptions","getSessionQueryOptions","Route","VerifyPasskey","t","router","queryClient","search","useSearch","error","setError","message","reason","PasskeyErrorReason","hasStarted","pendingMethodsQuery","enabled","canUseTotp","data","methods","includes","getErrorMessage","verifyMutation","onSuccess","user","setQueryData","queryKey","window","location","href","navigate","to","onError","err","onSettled","invalidateQueries","current","mutate","isPending","component"],"sources":["../../../frontend/src/queries/second-factor.ts","../../../frontend/src/routes/verify/passkey/index.tsx?tsr-split=component"],"sourcesContent":["import { queryOptions } from '@tanstack/react-query';\nimport type { InferResponseType } from 'hono/client';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\nimport { queryKeys } from './keys';\n\nexport type PendingSecondFactorMethodsResponse = InferResponseType<\n (typeof client.api.auth)['2fa']['methods']['$get'],\n 200\n>;\n\nexport const getPendingSecondFactorMethodsQueryOptions = queryOptions({\n queryKey: queryKeys.pendingSecondFactorMethods(),\n queryFn: async () => {\n const res = await client.api.auth['2fa'].methods.$get();\n return jsonOk(res);\n },\n retry: false,\n});\n","import { useMutation, useQuery, useQueryClient } 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 { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CircleAlertIcon, FingerprintIcon } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.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 {\n classifyPasskeyError,\n type PasskeyErrorReason,\n} from '#frontend/libs/passkey-error.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { authenticateWithPasskeyMutationOptions } from '#frontend/queries/passkey.ts';\nimport { getPendingSecondFactorMethodsQueryOptions } from '#frontend/queries/second-factor.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\n\nconst SearchSchema = OAuthSearchSchema;\n\nexport const Route = createFileRoute('/verify/passkey/')({\n component: VerifyPasskey,\n validateSearch: SearchSchema,\n});\n\nfunction VerifyPasskey() {\n const { t } = useTranslation();\n const router = useRouter();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const [error, setError] = useState<{\n message: string;\n reason: PasskeyErrorReason;\n } | null>(null);\n const hasStarted = useRef(false);\n const pendingMethodsQuery = useQuery({\n ...getPendingSecondFactorMethodsQueryOptions,\n enabled: error !== null,\n });\n const canUseTotp =\n pendingMethodsQuery.data?.methods.includes('totp') ?? false;\n\n const getErrorMessage = (reason: PasskeyErrorReason) => {\n switch (reason) {\n case 'unsupported':\n return t('verifyPasskey.error.unsupported');\n case 'not_allowed':\n return t('verifyPasskey.error.notAllowed');\n case 'expired':\n return t('verifyPasskey.error.expired');\n case 'user_mismatch':\n return t('verifyPasskey.error.userMismatch');\n case 'verification_failed':\n return t('verifyPasskey.error.failed');\n }\n };\n\n const verifyMutation = useMutation({\n ...authenticateWithPasskeyMutationOptions,\n onSuccess: async (data) => {\n if (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 }\n },\n onError: async (err) => {\n const reason = classifyPasskeyError(err);\n setError({\n message: getErrorMessage(reason),\n reason,\n });\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n // Auto-start passkey authentication on mount (with guard for StrictMode)\n useEffect(() => {\n if (hasStarted.current) return;\n hasStarted.current = true;\n verifyMutation.mutate();\n }, [verifyMutation]);\n\n return (\n <AuthLayout>\n {/*\n Centred: this screen has no form to scan, only a device prompt to wait\n on, so the eye has nothing to follow down a left edge.\n */}\n <AuthPageHeader\n align=\"center\"\n subtitle={t('verifyPasskey.subtitle')}\n title={t('verifyPasskey.title')}\n />\n\n {/* tinyrack-check-ignore-next-line components/no-native-text -- Structural verification state; descendants own visible typography. */}\n <div className=\"flex flex-col items-center gap-tinyrack-lg\">\n <div className=\"flex size-tinyrack-3xl items-center justify-center rounded-tinyrack-full bg-tinyrack-surface-muted\">\n <FingerprintIcon\n aria-hidden\n className=\"size-tinyrack-2xl text-tinyrack-text-muted\"\n />\n </div>\n\n {verifyMutation.isPending && (\n <div className=\"flex flex-col items-center gap-tinyrack-sm\">\n <TRSpinner uiSize=\"md\" />\n <TRText align=\"center\" as=\"p\" color=\"muted\" variant=\"bodySm\">\n {t('verifyPasskey.waiting')}\n </TRText>\n </div>\n )}\n\n {error && (\n // tinyrack-check-ignore-next-line components/no-native-text -- Structural error actions; descendants own visible typography.\n <div className=\"flex w-full flex-col items-center gap-tinyrack-md\">\n <Alert className=\"w-full\" icon={CircleAlertIcon} type=\"error\">\n {error.message}\n </Alert>\n {canUseTotp && (\n <TRLinkButton\n className=\"w-full\"\n intent=\"primary\"\n render={\n <Link search={extractOAuthParams(search)} to=\"/verify/totp\" />\n }\n uiSize=\"lg\"\n >\n {t('verifyPasskey.useTotp')}\n </TRLinkButton>\n )}\n <TRButton\n appearance={canUseTotp ? 'outline' : 'solid'}\n className=\"w-full\"\n intent={canUseTotp ? 'neutral' : 'primary'}\n onClick={() => {\n setError(null);\n verifyMutation.mutate();\n }}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyPasskey.retry')}\n </TRButton>\n </div>\n )}\n </div>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <Link search={search} to=\"/login\">\n {t('verifyPasskey.backToLogin')}\n </Link>\n }\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"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"}