@tinyrack/issuary-server 0.23.0 → 0.25.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 (170) hide show
  1. package/dist/entrypoints/app.d.ts +0 -6
  2. package/dist/entrypoints/app.d.ts.map +1 -1
  3. package/dist/lib/config/branding.d.ts +0 -4
  4. package/dist/lib/config/branding.d.ts.map +1 -1
  5. package/dist/lib/config/branding.js +0 -14
  6. package/dist/lib/config/branding.js.map +1 -1
  7. package/dist/lib/config/resolved.d.ts +0 -2
  8. package/dist/lib/config/resolved.d.ts.map +1 -1
  9. package/dist/routes/api/config/get.d.ts +0 -4
  10. package/dist/routes/api/config/get.d.ts.map +1 -1
  11. package/dist/routes/api/config/get.js +0 -2
  12. package/dist/routes/api/config/get.js.map +1 -1
  13. package/dist/routes/api/config/index.d.ts +0 -4
  14. package/dist/routes/api/config/index.d.ts.map +1 -1
  15. package/dist/routes/api/index.d.ts +0 -4
  16. package/dist/routes/api/index.d.ts.map +1 -1
  17. package/dist/routes/index.d.ts +0 -4
  18. package/dist/routes/index.d.ts.map +1 -1
  19. package/dist/schemas/response.d.ts +0 -2
  20. package/dist/schemas/response.d.ts.map +1 -1
  21. package/dist/schemas/response.js +0 -5
  22. package/dist/schemas/response.js.map +1 -1
  23. package/dist/services/container.d.ts +0 -2
  24. package/dist/services/container.d.ts.map +1 -1
  25. package/package.json +2 -1
  26. package/public/assets/2fa-BlpDkf-r.js +2 -0
  27. package/public/assets/{2fa-CCOTIHDZ.js.map → 2fa-BlpDkf-r.js.map} +1 -1
  28. package/public/assets/{2fa-B5vLgDXQ.js → 2fa-DIpGlpoI.js} +2 -2
  29. package/public/assets/{2fa-B5vLgDXQ.js.map → 2fa-DIpGlpoI.js.map} +1 -1
  30. package/public/assets/2fa-tzTSqiOS.js +2 -0
  31. package/public/assets/{2fa-C5vUVgr_.js.map → 2fa-tzTSqiOS.js.map} +1 -1
  32. package/public/assets/{2fa-BqsM_D-X.js → 2fa-waFAdIa0.js} +2 -2
  33. package/public/assets/{2fa-BqsM_D-X.js.map → 2fa-waFAdIa0.js.map} +1 -1
  34. package/public/assets/DialogHandle-ChG5Sj7T.js +2 -0
  35. package/public/assets/{DialogHandle-BmtK2pRn.js.map → DialogHandle-ChG5Sj7T.js.map} +1 -1
  36. package/public/assets/admin-Ii29X08B.js +2 -0
  37. package/public/assets/admin-Ii29X08B.js.map +1 -0
  38. package/public/assets/{admin-users-DvPbw1Vq.js → admin-users-d7tT-cjc.js} +2 -2
  39. package/public/assets/{admin-users-DvPbw1Vq.js.map → admin-users-d7tT-cjc.js.map} +1 -1
  40. package/public/assets/alert-leqyvHOp.js.map +1 -1
  41. package/public/assets/{auth-choice-row-BCGjuedo.js → auth-choice-row-DUvFyo7b.js} +2 -2
  42. package/public/assets/{auth-choice-row-BCGjuedo.js.map → auth-choice-row-DUvFyo7b.js.map} +1 -1
  43. package/public/assets/{auth-field-DD8kvl--.js → auth-field-BSlAWkbx.js} +2 -2
  44. package/public/assets/{auth-field-DD8kvl--.js.map → auth-field-BSlAWkbx.js.map} +1 -1
  45. package/public/assets/auth-layout-CcJy6dVY.js +2 -0
  46. package/public/assets/auth-layout-CcJy6dVY.js.map +1 -0
  47. package/public/assets/{auth-page-header-CIn2E4zI.js → auth-page-header-ZLhtQ7Et.js} +2 -2
  48. package/public/assets/auth-page-header-ZLhtQ7Et.js.map +1 -0
  49. package/public/assets/authorization-context-banner-DfkjwE93.js +2 -0
  50. package/public/assets/authorization-context-banner-DfkjwE93.js.map +1 -0
  51. package/public/assets/{avatar-BEQjf2x6.js → avatar-D-70MKp8.js} +2 -2
  52. package/public/assets/{avatar-BEQjf2x6.js.map → avatar-D-70MKp8.js.map} +1 -1
  53. package/public/assets/badge-CsOfUji0.js.map +1 -1
  54. package/public/assets/checkbox-C3UmXoKz.js +2 -0
  55. package/public/assets/{checkbox-gdHnSFQ-.js.map → checkbox-C3UmXoKz.js.map} +1 -1
  56. package/public/assets/config-DTQCUlfZ.js.map +1 -1
  57. package/public/assets/{consent-CfRbz2R7.js → consent-BJgO9pEV.js} +2 -2
  58. package/public/assets/{consent-CfRbz2R7.js.map → consent-BJgO9pEV.js.map} +1 -1
  59. package/public/assets/{consent-BqqFDdsr.js → consent-D_yGE8TR.js} +2 -2
  60. package/public/assets/{consent-BqqFDdsr.js.map → consent-D_yGE8TR.js.map} +1 -1
  61. package/public/assets/createLucideIcon-BPpAIXR_.js.map +1 -1
  62. package/public/assets/{email-CKKakxPJ.js → email-DAa8JGoC.js} +2 -2
  63. package/public/assets/{email-CKKakxPJ.js.map → email-DAa8JGoC.js.map} +1 -1
  64. package/public/assets/email-tzTSqiOS.js +2 -0
  65. package/public/assets/{email-C5vUVgr_.js.map → email-tzTSqiOS.js.map} +1 -1
  66. package/public/assets/{error-BMXxpgfR.js → error-Dj4QQ8vW.js} +2 -2
  67. package/public/assets/{error-BMXxpgfR.js.map → error-Dj4QQ8vW.js.map} +1 -1
  68. package/public/assets/field-CEs4ugVJ.js +3 -0
  69. package/public/assets/{field-Cn4H1CUj.js.map → field-CEs4ugVJ.js.map} +1 -1
  70. package/public/assets/{forgot-rO9sByfV.js → forgot-CYMAWPVu.js} +2 -2
  71. package/public/assets/{forgot-rO9sByfV.js.map → forgot-CYMAWPVu.js.map} +1 -1
  72. package/public/assets/forgot-tzTSqiOS.js +2 -0
  73. package/public/assets/{forgot-C5vUVgr_.js.map → forgot-tzTSqiOS.js.map} +1 -1
  74. package/public/assets/{index-CS23Ozt6.js → index-H6CJKjiN.js} +3 -3
  75. package/public/assets/{index-CS23Ozt6.js.map → index-H6CJKjiN.js.map} +1 -1
  76. package/public/assets/{index-DZyHRhbQ.css → index-kD9gQA-w.css} +1 -1
  77. package/public/assets/{initial-avatar-CtuDUz_W.js → initial-avatar-DjSqgENY.js} +2 -2
  78. package/public/assets/{initial-avatar-CtuDUz_W.js.map → initial-avatar-DjSqgENY.js.map} +1 -1
  79. package/public/assets/{input-CzQki7k6.js → input-BHPUSlfp.js} +2 -2
  80. package/public/assets/{input-CzQki7k6.js.map → input-BHPUSlfp.js.map} +1 -1
  81. package/public/assets/link-C-WdTj3F.js.map +1 -1
  82. package/public/assets/{login-nukebli4.js → login-CBinfk4L.js} +2 -2
  83. package/public/assets/{login-nukebli4.js.map → login-CBinfk4L.js.map} +1 -1
  84. package/public/assets/login-tzTSqiOS.js +2 -0
  85. package/public/assets/{login-C5vUVgr_.js.map → login-tzTSqiOS.js.map} +1 -1
  86. package/public/assets/{modal-BDQFucjz.js → modal-CwoBUXp3.js} +2 -2
  87. package/public/assets/{modal-BDQFucjz.js.map → modal-CwoBUXp3.js.map} +1 -1
  88. package/public/assets/{passkey-CynCz1Dt.js → passkey-Jw2CRzJp.js} +2 -2
  89. package/public/assets/{passkey-CynCz1Dt.js.map → passkey-Jw2CRzJp.js.map} +1 -1
  90. package/public/assets/{passkey-BE9JvJOP.js → passkey-V_tav53p.js} +2 -2
  91. package/public/assets/{passkey-BE9JvJOP.js.map → passkey-V_tav53p.js.map} +1 -1
  92. package/public/assets/passkey-tzTSqiOS.js +2 -0
  93. package/public/assets/{passkey-C5vUVgr_.js.map → passkey-tzTSqiOS.js.map} +1 -1
  94. package/public/assets/{password-RkUttbhD.js → password-6QOqTV_s.js} +2 -2
  95. package/public/assets/{password-RkUttbhD.js.map → password-6QOqTV_s.js.map} +1 -1
  96. package/public/assets/{password-strength-BeSOu_Ga.js → password-strength-DtGMHOD-.js} +2 -2
  97. package/public/assets/{password-strength-BeSOu_Ga.js.map → password-strength-DtGMHOD-.js.map} +1 -1
  98. package/public/assets/password-tzTSqiOS.js +2 -0
  99. package/public/assets/{password-C5vUVgr_.js.map → password-tzTSqiOS.js.map} +1 -1
  100. package/public/assets/pin-input-DdhzDNy9.js +2 -0
  101. package/public/assets/{pin-input-Cc-VkrQ3.js.map → pin-input-DdhzDNy9.js.map} +1 -1
  102. package/public/assets/{profile-B5NaJfeS.js → profile-DVjIWt8X.js} +2 -2
  103. package/public/assets/{profile-B5NaJfeS.js.map → profile-DVjIWt8X.js.map} +1 -1
  104. package/public/assets/profile-SHr6F-7b.js +2 -0
  105. package/public/assets/profile-SHr6F-7b.js.map +1 -0
  106. package/public/assets/provider-logos-u1YURWQr.js.map +1 -1
  107. package/public/assets/{recovery-PnUATiUi.js → recovery-CvNl-yt9.js} +2 -2
  108. package/public/assets/{recovery-PnUATiUi.js.map → recovery-CvNl-yt9.js.map} +1 -1
  109. package/public/assets/{register-DQXhru0_.js → register-SFXa5EeL.js} +2 -2
  110. package/public/assets/{register-DQXhru0_.js.map → register-SFXa5EeL.js.map} +1 -1
  111. package/public/assets/register-tzTSqiOS.js +2 -0
  112. package/public/assets/{register-C5vUVgr_.js.map → register-tzTSqiOS.js.map} +1 -1
  113. package/public/assets/{reset-CQgIa3yf.js → reset-l-pLzjwe.js} +2 -2
  114. package/public/assets/{reset-CQgIa3yf.js.map → reset-l-pLzjwe.js.map} +1 -1
  115. package/public/assets/reset-tzTSqiOS.js +2 -0
  116. package/public/assets/{reset-C5vUVgr_.js.map → reset-tzTSqiOS.js.map} +1 -1
  117. package/public/assets/{select-DqZynXSt.js → select-D2H87qXJ.js} +2 -2
  118. package/public/assets/{select-DqZynXSt.js.map → select-D2H87qXJ.js.map} +1 -1
  119. package/public/assets/select-tzTSqiOS.js +2 -0
  120. package/public/assets/{select-C5vUVgr_.js.map → select-tzTSqiOS.js.map} +1 -1
  121. package/public/assets/separator-B0Bvh1he.js.map +1 -1
  122. package/public/assets/shell-header-bar-BPgCjFPv.js +2 -0
  123. package/public/assets/shell-header-bar-BPgCjFPv.js.map +1 -0
  124. package/public/assets/{terms-BHDAgn-H.js → terms-D5rfQhog.js} +2 -2
  125. package/public/assets/{terms-BHDAgn-H.js.map → terms-D5rfQhog.js.map} +1 -1
  126. package/public/assets/{terms-B5NaJfeS.js → terms-DVjIWt8X.js} +2 -2
  127. package/public/assets/{terms-B5NaJfeS.js.map → terms-DVjIWt8X.js.map} +1 -1
  128. package/public/assets/{terms-checkbox-list-6jteUTIZ.js → terms-checkbox-list-BKJcS2pJ.js} +2 -2
  129. package/public/assets/{terms-checkbox-list-6jteUTIZ.js.map → terms-checkbox-list-BKJcS2pJ.js.map} +1 -1
  130. package/public/assets/{totp-ECvOUcFx.js → totp-BbQi-gsF.js} +2 -2
  131. package/public/assets/{totp-ECvOUcFx.js.map → totp-BbQi-gsF.js.map} +1 -1
  132. package/public/assets/{totp-CJtfVNEq.js → totp-wY0Zji8E.js} +2 -2
  133. package/public/assets/{totp-CJtfVNEq.js.map → totp-wY0Zji8E.js.map} +1 -1
  134. package/public/assets/{use-totp-setup-BbS3XcZA.js → use-totp-setup-OH_GTMxA.js} +3 -3
  135. package/public/assets/{use-totp-setup-BbS3XcZA.js.map → use-totp-setup-OH_GTMxA.js.map} +1 -1
  136. package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js → useAriaLabelledBy-9o83pv9X.js} +2 -2
  137. package/public/assets/{useAriaLabelledBy-ByuMi3Ry.js.map → useAriaLabelledBy-9o83pv9X.js.map} +1 -1
  138. package/public/assets/useQuery-CI5Ukuae.js +2 -0
  139. package/public/assets/{useQuery-Ckxjmvtl.js.map → useQuery-CI5Ukuae.js.map} +1 -1
  140. package/public/assets/users-DqCnblEo.js +2 -0
  141. package/public/assets/users-DqCnblEo.js.map +1 -0
  142. package/public/index.html +2 -2
  143. package/public/assets/2fa-C5vUVgr_.js +0 -2
  144. package/public/assets/2fa-CCOTIHDZ.js +0 -2
  145. package/public/assets/DialogHandle-BmtK2pRn.js +0 -2
  146. package/public/assets/admin-BPijkLw-.js +0 -2
  147. package/public/assets/admin-BPijkLw-.js.map +0 -1
  148. package/public/assets/auth-layout-VtpryDof.js +0 -2
  149. package/public/assets/auth-layout-VtpryDof.js.map +0 -1
  150. package/public/assets/auth-page-header-CIn2E4zI.js.map +0 -1
  151. package/public/assets/authorization-context-banner-SOuBHWIb.js +0 -2
  152. package/public/assets/authorization-context-banner-SOuBHWIb.js.map +0 -1
  153. package/public/assets/checkbox-gdHnSFQ-.js +0 -2
  154. package/public/assets/email-C5vUVgr_.js +0 -2
  155. package/public/assets/field-Cn4H1CUj.js +0 -3
  156. package/public/assets/forgot-C5vUVgr_.js +0 -2
  157. package/public/assets/login-C5vUVgr_.js +0 -2
  158. package/public/assets/passkey-C5vUVgr_.js +0 -2
  159. package/public/assets/password-C5vUVgr_.js +0 -2
  160. package/public/assets/pin-input-Cc-VkrQ3.js +0 -2
  161. package/public/assets/profile-BcjsVYOx.js +0 -2
  162. package/public/assets/profile-BcjsVYOx.js.map +0 -1
  163. package/public/assets/register-C5vUVgr_.js +0 -2
  164. package/public/assets/reset-C5vUVgr_.js +0 -2
  165. package/public/assets/select-C5vUVgr_.js +0 -2
  166. package/public/assets/shell-header-bar-CjG5qvPg.js +0 -2
  167. package/public/assets/shell-header-bar-CjG5qvPg.js.map +0 -1
  168. package/public/assets/useQuery-Ckxjmvtl.js +0 -2
  169. package/public/assets/users-CmFxrCQT.js +0 -2
  170. package/public/assets/users-CmFxrCQT.js.map +0 -1
@@ -1,2 +1,2 @@
1
- import{J as e,U as t,Z as n,i as r,n as i,q as a,s as o}from"./createLucideIcon-BPpAIXR_.js";import{Sr as s,f as c,i as l,r as u,t as d}from"./config-DTQCUlfZ.js";import{t as f}from"./mutationOptions-DyYFUbyn.js";import{t as p}from"./useMutation-BWZ0G4Td.js";import{tt as m}from"./shell-header-bar-CjG5qvPg.js";import{t as h}from"./circle-check-6QTLhwM_.js";import{t as g}from"./auth-field-DD8kvl--.js";import{t as _}from"./key-round-CdvHb8vT.js";import{t as v}from"./mail-D0B_1Dzd.js";import{c as y,o as b}from"./zod-C87S6Tec.js";import{F as x,L as S,N as C,S as w,V as T,j as E,p as D}from"./index-CS23Ozt6.js";import{t as O}from"./auth-page-header-CIn2E4zI.js";import{t as k}from"./alert-leqyvHOp.js";import{t as A}from"./auth-layout-VtpryDof.js";import{t as j}from"./promise-OpBtq8tG.js";import{r as M,t as N}from"./standard-schema-e8gtSzGE.js";import{t as P}from"./labeled-separator-CV7nb0XW.js";var F=n(e()),I=f({mutationFn:async e=>l(await u.api.auth.email.verify.$post({json:e}))}),L=f({mutationFn:async e=>l(await u.api.auth.email.resend.$post({json:e,header:{}}))}),R=a();function z(){let{t:e}=r(),n=T(),a=s(),l=D.useSearch(),{token:u,email:f}=l,[z,B]=(0,F.useState)(!1),[V,H]=(0,F.useState)(!1),U=c.useToastManager(),{data:W}=m(d),G=(0,F.useMemo)(()=>b({token:y().min(1,e(`validation.token.required`))}),[e]),K=p({...I,onSuccess:async e=>{let t=e.user;if(a.setQueryData(w.queryKey,{user:t}),await j(),t.second_factor_required){let e=[];return W.auth.password.totp.enabled&&e.push(`totp`),W.auth.passkey.enabled&&e.push(`passkey`),e.length===1?e[0]===`totp`?n({to:`/setup/totp`,search:C(l)}):n({to:`/setup/passkey`,search:C(l)}):n({to:`/setup/2fa`,search:C(l)})}x(l)?window.location.href=E(l):B(!0)},onSettled:()=>{a.invalidateQueries({queryKey:w.queryKey})}}),q=p({...L,onSuccess:()=>{U.add({title:e(`verifyEmail.resendSuccess`),type:`success`}),H(!0),setTimeout(()=>H(!1),5e3)}}),{register:J,setError:Y,handleSubmit:X,formState:{errors:Z}}=M({defaultValues:{token:u||``},resolver:N(G)}),Q=async t=>{try{await K.mutateAsync(t)}catch{Y(`token`,{type:`manual`,message:e(`verifyEmail.error.invalidToken`)})}},$=async()=>{if(f)try{await q.mutateAsync({email:f})}catch{}};return z?(0,R.jsx)(A,{children:(0,R.jsx)(`div`,{"data-testid":`alert-success`,children:(0,R.jsx)(S,{description:(0,R.jsxs)(R.Fragment,{children:[e(`verifyEmail.success.subtitle`),(0,R.jsx)(`br`,{}),e(`verifyEmail.success.description`)]}),icon:h,title:e(`verifyEmail.success.title`),tone:`success`,children:(0,R.jsx)(o,{className:`w-full`,"data-testid":`email-verify-go-profile`,intent:`primary`,onClick:()=>n({to:`/profile`}),type:`button`,uiSize:`lg`,children:e(`verifyEmail.success.goToProfile`)})})})}):(0,R.jsxs)(A,{children:[(0,R.jsx)(O,{subtitle:e(`verifyEmail.subtitle`),title:e(`verifyEmail.title`)}),f&&(0,R.jsx)(k,{icon:v,type:`info`,children:(0,R.jsxs)(`span`,{className:`flex flex-col gap-tinyrack-3xs text-left`,children:[(0,R.jsx)(i,{variant:`body`,weight:`strong`,children:e(`register.success.subtitle`)}),(0,R.jsx)(i,{color:`muted`,variant:`caption`,children:e(`register.success.description`,{email:f})})]})}),(0,R.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:X(Q),children:[(0,R.jsx)(g,{error:Z.token,icon:_,label:e(`verifyEmail.token.label`),placeholder:e(`verifyEmail.token.placeholder`),...J(`token`),type:`text`}),(0,R.jsx)(o,{className:`w-full`,intent:`primary`,loading:K.isPending,loadingLabel:e(`verifyEmail.submitting`),type:`submit`,uiSize:`lg`,children:e(`verifyEmail.submit`)})]}),f&&(0,R.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-md`,children:[(0,R.jsx)(P,{}),(0,R.jsx)(o,{appearance:`ghost`,className:`w-full`,"data-testid":`email-verify-resend`,disabled:q.isPending||V,intent:`neutral`,onClick:$,type:`button`,children:q.isPending?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(t,{uiSize:`sm`}),e(`verifyEmail.resending`)]}):e(`verifyEmail.resend`)})]})]})}export{z as component};
2
- //# sourceMappingURL=email-CKKakxPJ.js.map
1
+ import{J as e,U as t,Z as n,i as r,n as i,q as a,s as o}from"./createLucideIcon-BPpAIXR_.js";import{Sr as s,f as c,i as l,r as u,t as d}from"./config-DTQCUlfZ.js";import{t as f}from"./mutationOptions-DyYFUbyn.js";import{t as p}from"./useMutation-BWZ0G4Td.js";import{nt as m}from"./shell-header-bar-BPgCjFPv.js";import{t as h}from"./circle-check-6QTLhwM_.js";import{t as g}from"./auth-field-BSlAWkbx.js";import{t as _}from"./key-round-CdvHb8vT.js";import{t as v}from"./mail-D0B_1Dzd.js";import{c as y,o as b}from"./zod-C87S6Tec.js";import{F as x,L as S,N as C,S as w,V as T,j as E,p as D}from"./index-H6CJKjiN.js";import{t as O}from"./auth-page-header-ZLhtQ7Et.js";import{t as k}from"./alert-leqyvHOp.js";import{t as A}from"./auth-layout-CcJy6dVY.js";import{t as j}from"./promise-OpBtq8tG.js";import{r as M,t as N}from"./standard-schema-e8gtSzGE.js";import{t as P}from"./labeled-separator-CV7nb0XW.js";var F=n(e()),I=f({mutationFn:async e=>l(await u.api.auth.email.verify.$post({json:e}))}),L=f({mutationFn:async e=>l(await u.api.auth.email.resend.$post({json:e,header:{}}))}),R=a();function z(){let{t:e}=r(),n=T(),a=s(),l=D.useSearch(),{token:u,email:f}=l,[z,B]=(0,F.useState)(!1),[V,H]=(0,F.useState)(!1),U=c.useToastManager(),{data:W}=m(d),G=(0,F.useMemo)(()=>b({token:y().min(1,e(`validation.token.required`))}),[e]),K=p({...I,onSuccess:async e=>{let t=e.user;if(a.setQueryData(w.queryKey,{user:t}),await j(),t.second_factor_required){let e=[];return W.auth.password.totp.enabled&&e.push(`totp`),W.auth.passkey.enabled&&e.push(`passkey`),e.length===1?e[0]===`totp`?n({to:`/setup/totp`,search:C(l)}):n({to:`/setup/passkey`,search:C(l)}):n({to:`/setup/2fa`,search:C(l)})}x(l)?window.location.href=E(l):B(!0)},onSettled:()=>{a.invalidateQueries({queryKey:w.queryKey})}}),q=p({...L,onSuccess:()=>{U.add({title:e(`verifyEmail.resendSuccess`),type:`success`}),H(!0),setTimeout(()=>H(!1),5e3)}}),{register:J,setError:Y,handleSubmit:X,formState:{errors:Z}}=M({defaultValues:{token:u||``},resolver:N(G)}),Q=async t=>{try{await K.mutateAsync(t)}catch{Y(`token`,{type:`manual`,message:e(`verifyEmail.error.invalidToken`)})}},$=async()=>{if(f)try{await q.mutateAsync({email:f})}catch{}};return z?(0,R.jsx)(A,{children:(0,R.jsx)(`div`,{"data-testid":`alert-success`,children:(0,R.jsx)(S,{description:(0,R.jsxs)(R.Fragment,{children:[e(`verifyEmail.success.subtitle`),(0,R.jsx)(`br`,{}),e(`verifyEmail.success.description`)]}),icon:h,title:e(`verifyEmail.success.title`),tone:`success`,children:(0,R.jsx)(o,{className:`w-full`,"data-testid":`email-verify-go-profile`,intent:`primary`,onClick:()=>n({to:`/profile`}),type:`button`,uiSize:`lg`,children:e(`verifyEmail.success.goToProfile`)})})})}):(0,R.jsxs)(A,{children:[(0,R.jsx)(O,{subtitle:e(`verifyEmail.subtitle`),title:e(`verifyEmail.title`)}),f&&(0,R.jsx)(k,{icon:v,type:`info`,children:(0,R.jsxs)(`span`,{className:`flex flex-col gap-tinyrack-3xs text-left`,children:[(0,R.jsx)(i,{variant:`body`,weight:`strong`,children:e(`register.success.subtitle`)}),(0,R.jsx)(i,{color:`muted`,variant:`caption`,children:e(`register.success.description`,{email:f})})]})}),(0,R.jsxs)(`form`,{className:`flex flex-col gap-tinyrack-lg`,onSubmit:X(Q),children:[(0,R.jsx)(g,{error:Z.token,icon:_,label:e(`verifyEmail.token.label`),placeholder:e(`verifyEmail.token.placeholder`),...J(`token`),type:`text`}),(0,R.jsx)(o,{className:`w-full`,intent:`primary`,loading:K.isPending,loadingLabel:e(`verifyEmail.submitting`),type:`submit`,uiSize:`lg`,children:e(`verifyEmail.submit`)})]}),f&&(0,R.jsxs)(`div`,{className:`flex flex-col gap-tinyrack-md`,children:[(0,R.jsx)(P,{}),(0,R.jsx)(o,{appearance:`ghost`,className:`w-full`,"data-testid":`email-verify-resend`,disabled:q.isPending||V,intent:`neutral`,onClick:$,type:`button`,children:q.isPending?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(t,{uiSize:`sm`}),e(`verifyEmail.resending`)]}):e(`verifyEmail.resend`)})]})]})}export{z as component};
2
+ //# sourceMappingURL=email-DAa8JGoC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"email-CKKakxPJ.js","names":["standardSchemaResolver","useMutation","useQueryClient","useSuspenseQuery","useNavigate","TRButton","TRSpinner","TRText","TRToast","CircleCheckIcon","KeyRoundIcon","MailIcon","useMemo","useState","useForm","useTranslation","z","AuthField","AuthOutcome","AuthPageHeader","Alert","LabeledSeparator","AuthLayout","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","appConfigQueryOptions","getSessionQueryOptions","resendVerificationMutationOptions","verifyEmailMutationOptions","Route","VerifyEmailFormValues","token","VerifyEmail","t","navigate","queryClient","search","useSearch","queryToken","email","verified","setVerified","resendCooldown","setResendCooldown","toast","useToastManager","data","appConfig","verifyEmailSchema","object","string","min","verifyEmailMutation","onSuccess","user","setQueryData","queryKey","second_factor_required","available_2fa_methods","SecondFactorMethod","auth","password","totp","enabled","push","passkey","length","method","to","window","location","href","onSettled","invalidateQueries","resendVerificationMutation","add","title","type","setTimeout","register","setError","handleSubmit","formState","errors","defaultValues","resolver","onSubmit","values","mutateAsync","_error","message","handleResend","isPending","component"],"sources":["../../../frontend/src/queries/verify-email.ts","../../../frontend/src/routes/verify/email/index.tsx?tsr-split=component"],"sourcesContent":["import { mutationOptions } from '@tanstack/react-query';\nimport type { InferRequestType, InferResponseType } from 'hono/client';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport type VerifyEmailParams = InferRequestType<\n (typeof client.api.auth.email.verify)['$post']\n>['json'];\n\nexport type VerifyEmailResponse = InferResponseType<\n (typeof client.api.auth.email.verify)['$post'],\n 200\n>;\n\nexport const verifyEmailMutationOptions = mutationOptions({\n mutationFn: async (values: VerifyEmailParams) => {\n const res = await client.api.auth.email.verify.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n\nexport type ResendVerificationParams = InferRequestType<\n (typeof client.api.auth.email.resend)['$post']\n>['json'];\n\nexport type ResendVerificationResponse = InferResponseType<\n (typeof client.api.auth.email.resend)['$post'],\n 200\n>;\n\nexport const resendVerificationMutationOptions = mutationOptions({\n mutationFn: async (values: ResendVerificationParams) => {\n const res = await client.api.auth.email.resend.$post({\n json: values,\n header: {},\n });\n return jsonOk(res);\n },\n});\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useNavigate } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CircleCheckIcon, KeyRoundIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n resendVerificationMutationOptions,\n verifyEmailMutationOptions,\n} from '#frontend/queries/verify-email.ts';\n\nconst SearchSchema = z.object({\n ...OAuthSearchSchema.shape,\n token: z.string().default(''),\n email: z.string().default(''),\n});\n\nexport const Route = createFileRoute('/verify/email/')({\n component: VerifyEmail,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype VerifyEmailFormValues = {\n token: string;\n};\n\nfunction VerifyEmail() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { token: queryToken, email } = search;\n const [verified, setVerified] = useState(false);\n const [resendCooldown, setResendCooldown] = useState(false);\n const toast = TRToast.useToastManager();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const verifyEmailSchema = useMemo(\n () =>\n z.object({\n token: z.string().min(1, t('validation.token.required')),\n }),\n [t],\n );\n\n const verifyEmailMutation = useMutation({\n ...verifyEmailMutationOptions,\n onSuccess: async (data) => {\n const user = data.user;\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n if (user.second_factor_required) {\n const available_2fa_methods: SecondFactorMethod[] = [];\n if (appConfig.auth.password.totp.enabled) {\n available_2fa_methods.push('totp');\n }\n if (appConfig.auth.passkey.enabled) {\n available_2fa_methods.push('passkey');\n }\n\n if (available_2fa_methods.length === 1) {\n const method = available_2fa_methods[0];\n if (method === 'totp') {\n return navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return navigate({\n to: '/setup/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n return navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n }\n }\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n setVerified(true);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const resendVerificationMutation = useMutation({\n ...resendVerificationMutationOptions,\n onSuccess: () => {\n toast.add({ title: t('verifyEmail.resendSuccess'), type: 'success' });\n // Separate from the message: a short cooldown so the button cannot be\n // used to spam the address with mail.\n setResendCooldown(true);\n setTimeout(() => setResendCooldown(false), 5000);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<VerifyEmailFormValues>({\n defaultValues: {\n token: queryToken || '',\n },\n resolver: standardSchemaResolver(verifyEmailSchema),\n });\n\n const onSubmit = async (values: VerifyEmailFormValues) => {\n try {\n await verifyEmailMutation.mutateAsync(values);\n } catch (_error) {\n setError('token', {\n type: 'manual',\n message: t('verifyEmail.error.invalidToken'),\n });\n }\n };\n\n const handleResend = async () => {\n if (!email) {\n return;\n }\n try {\n await resendVerificationMutation.mutateAsync({ email });\n } catch (_error) {}\n };\n\n if (verified) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('verifyEmail.success.subtitle')}\n <br />\n {t('verifyEmail.success.description')}\n </>\n }\n icon={CircleCheckIcon}\n title={t('verifyEmail.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n data-testid=\"email-verify-go-profile\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/profile' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.success.goToProfile')}\n </TRButton>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verifyEmail.subtitle')}\n title={t('verifyEmail.title')}\n />\n\n {email && (\n <Alert icon={MailIcon} type=\"info\">\n <span className=\"flex flex-col gap-tinyrack-3xs text-left\">\n <TRText variant=\"body\" weight=\"strong\">\n {t('register.success.subtitle')}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t('register.success.description', { email })}\n </TRText>\n </span>\n </Alert>\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.token}\n icon={KeyRoundIcon}\n label={t('verifyEmail.token.label')}\n placeholder={t('verifyEmail.token.placeholder')}\n {...register('token')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={verifyEmailMutation.isPending}\n loadingLabel={t('verifyEmail.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.submit')}\n </TRButton>\n </form>\n\n {email && (\n <div className=\"flex flex-col gap-tinyrack-md\">\n <LabeledSeparator />\n\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"email-verify-resend\"\n disabled={resendVerificationMutation.isPending || resendCooldown}\n intent=\"neutral\"\n onClick={handleResend}\n type=\"button\"\n >\n {resendVerificationMutation.isPending ? (\n <>\n <TRSpinner uiSize=\"sm\" />\n {t('verifyEmail.resending')}\n </>\n ) : (\n t('verifyEmail.resend')\n )}\n </TRButton>\n </div>\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"email-DAa8JGoC.js","names":["standardSchemaResolver","useMutation","useQueryClient","useSuspenseQuery","useNavigate","TRButton","TRSpinner","TRText","TRToast","CircleCheckIcon","KeyRoundIcon","MailIcon","useMemo","useState","useForm","useTranslation","z","AuthField","AuthOutcome","AuthPageHeader","Alert","LabeledSeparator","AuthLayout","buildAuthenticatedAuthorizeUrl","extractOAuthParams","isOAuthFlow","tick","appConfigQueryOptions","getSessionQueryOptions","resendVerificationMutationOptions","verifyEmailMutationOptions","Route","VerifyEmailFormValues","token","VerifyEmail","t","navigate","queryClient","search","useSearch","queryToken","email","verified","setVerified","resendCooldown","setResendCooldown","toast","useToastManager","data","appConfig","verifyEmailSchema","object","string","min","verifyEmailMutation","onSuccess","user","setQueryData","queryKey","second_factor_required","available_2fa_methods","SecondFactorMethod","auth","password","totp","enabled","push","passkey","length","method","to","window","location","href","onSettled","invalidateQueries","resendVerificationMutation","add","title","type","setTimeout","register","setError","handleSubmit","formState","errors","defaultValues","resolver","onSubmit","values","mutateAsync","_error","message","handleResend","isPending","component"],"sources":["../../../frontend/src/queries/verify-email.ts","../../../frontend/src/routes/verify/email/index.tsx?tsr-split=component"],"sourcesContent":["import { mutationOptions } from '@tanstack/react-query';\nimport type { InferRequestType, InferResponseType } from 'hono/client';\nimport { client, jsonOk } from '#frontend/libs/api.ts';\n\nexport type VerifyEmailParams = InferRequestType<\n (typeof client.api.auth.email.verify)['$post']\n>['json'];\n\nexport type VerifyEmailResponse = InferResponseType<\n (typeof client.api.auth.email.verify)['$post'],\n 200\n>;\n\nexport const verifyEmailMutationOptions = mutationOptions({\n mutationFn: async (values: VerifyEmailParams) => {\n const res = await client.api.auth.email.verify.$post({\n json: values,\n });\n return jsonOk(res);\n },\n});\n\nexport type ResendVerificationParams = InferRequestType<\n (typeof client.api.auth.email.resend)['$post']\n>['json'];\n\nexport type ResendVerificationResponse = InferResponseType<\n (typeof client.api.auth.email.resend)['$post'],\n 200\n>;\n\nexport const resendVerificationMutationOptions = mutationOptions({\n mutationFn: async (values: ResendVerificationParams) => {\n const res = await client.api.auth.email.resend.$post({\n json: values,\n header: {},\n });\n return jsonOk(res);\n },\n});\n","import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useNavigate } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CircleCheckIcon, KeyRoundIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n resendVerificationMutationOptions,\n verifyEmailMutationOptions,\n} from '#frontend/queries/verify-email.ts';\n\nconst SearchSchema = z.object({\n ...OAuthSearchSchema.shape,\n token: z.string().default(''),\n email: z.string().default(''),\n});\n\nexport const Route = createFileRoute('/verify/email/')({\n component: VerifyEmail,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype VerifyEmailFormValues = {\n token: string;\n};\n\nfunction VerifyEmail() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { token: queryToken, email } = search;\n const [verified, setVerified] = useState(false);\n const [resendCooldown, setResendCooldown] = useState(false);\n const toast = TRToast.useToastManager();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const verifyEmailSchema = useMemo(\n () =>\n z.object({\n token: z.string().min(1, t('validation.token.required')),\n }),\n [t],\n );\n\n const verifyEmailMutation = useMutation({\n ...verifyEmailMutationOptions,\n onSuccess: async (data) => {\n const user = data.user;\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n if (user.second_factor_required) {\n const available_2fa_methods: SecondFactorMethod[] = [];\n if (appConfig.auth.password.totp.enabled) {\n available_2fa_methods.push('totp');\n }\n if (appConfig.auth.passkey.enabled) {\n available_2fa_methods.push('passkey');\n }\n\n if (available_2fa_methods.length === 1) {\n const method = available_2fa_methods[0];\n if (method === 'totp') {\n return navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return navigate({\n to: '/setup/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n return navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n }\n }\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n setVerified(true);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const resendVerificationMutation = useMutation({\n ...resendVerificationMutationOptions,\n onSuccess: () => {\n toast.add({ title: t('verifyEmail.resendSuccess'), type: 'success' });\n // Separate from the message: a short cooldown so the button cannot be\n // used to spam the address with mail.\n setResendCooldown(true);\n setTimeout(() => setResendCooldown(false), 5000);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<VerifyEmailFormValues>({\n defaultValues: {\n token: queryToken || '',\n },\n resolver: standardSchemaResolver(verifyEmailSchema),\n });\n\n const onSubmit = async (values: VerifyEmailFormValues) => {\n try {\n await verifyEmailMutation.mutateAsync(values);\n } catch (_error) {\n setError('token', {\n type: 'manual',\n message: t('verifyEmail.error.invalidToken'),\n });\n }\n };\n\n const handleResend = async () => {\n if (!email) {\n return;\n }\n try {\n await resendVerificationMutation.mutateAsync({ email });\n } catch (_error) {}\n };\n\n if (verified) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('verifyEmail.success.subtitle')}\n <br />\n {t('verifyEmail.success.description')}\n </>\n }\n icon={CircleCheckIcon}\n title={t('verifyEmail.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n data-testid=\"email-verify-go-profile\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/profile' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.success.goToProfile')}\n </TRButton>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verifyEmail.subtitle')}\n title={t('verifyEmail.title')}\n />\n\n {email && (\n <Alert icon={MailIcon} type=\"info\">\n <span className=\"flex flex-col gap-tinyrack-3xs text-left\">\n <TRText variant=\"body\" weight=\"strong\">\n {t('register.success.subtitle')}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t('register.success.description', { email })}\n </TRText>\n </span>\n </Alert>\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.token}\n icon={KeyRoundIcon}\n label={t('verifyEmail.token.label')}\n placeholder={t('verifyEmail.token.placeholder')}\n {...register('token')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={verifyEmailMutation.isPending}\n loadingLabel={t('verifyEmail.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.submit')}\n </TRButton>\n </form>\n\n {email && (\n <div className=\"flex flex-col gap-tinyrack-md\">\n <LabeledSeparator />\n\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"email-verify-resend\"\n disabled={resendVerificationMutation.isPending || resendCooldown}\n intent=\"neutral\"\n onClick={handleResend}\n type=\"button\"\n >\n {resendVerificationMutation.isPending ? (\n <>\n <TRSpinner uiSize=\"sm\" />\n {t('verifyEmail.resending')}\n </>\n ) : (\n t('verifyEmail.resend')\n )}\n </TRButton>\n </div>\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{I as e}from"./index-H6CJKjiN.js";var t=e;export{t as errorComponent};
2
+ //# sourceMappingURL=email-tzTSqiOS.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"email-C5vUVgr_.js","names":["RouteErrorFallback","VerifyEmailFormValues","token","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/verify/email/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useNavigate } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CircleCheckIcon, KeyRoundIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n resendVerificationMutationOptions,\n verifyEmailMutationOptions,\n} from '#frontend/queries/verify-email.ts';\n\nconst SearchSchema = z.object({\n ...OAuthSearchSchema.shape,\n token: z.string().default(''),\n email: z.string().default(''),\n});\n\nexport const Route = createFileRoute('/verify/email/')({\n component: VerifyEmail,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype VerifyEmailFormValues = {\n token: string;\n};\n\nfunction VerifyEmail() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { token: queryToken, email } = search;\n const [verified, setVerified] = useState(false);\n const [resendCooldown, setResendCooldown] = useState(false);\n const toast = TRToast.useToastManager();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const verifyEmailSchema = useMemo(\n () =>\n z.object({\n token: z.string().min(1, t('validation.token.required')),\n }),\n [t],\n );\n\n const verifyEmailMutation = useMutation({\n ...verifyEmailMutationOptions,\n onSuccess: async (data) => {\n const user = data.user;\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n if (user.second_factor_required) {\n const available_2fa_methods: SecondFactorMethod[] = [];\n if (appConfig.auth.password.totp.enabled) {\n available_2fa_methods.push('totp');\n }\n if (appConfig.auth.passkey.enabled) {\n available_2fa_methods.push('passkey');\n }\n\n if (available_2fa_methods.length === 1) {\n const method = available_2fa_methods[0];\n if (method === 'totp') {\n return navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return navigate({\n to: '/setup/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n return navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n }\n }\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n setVerified(true);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const resendVerificationMutation = useMutation({\n ...resendVerificationMutationOptions,\n onSuccess: () => {\n toast.add({ title: t('verifyEmail.resendSuccess'), type: 'success' });\n // Separate from the message: a short cooldown so the button cannot be\n // used to spam the address with mail.\n setResendCooldown(true);\n setTimeout(() => setResendCooldown(false), 5000);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<VerifyEmailFormValues>({\n defaultValues: {\n token: queryToken || '',\n },\n resolver: standardSchemaResolver(verifyEmailSchema),\n });\n\n const onSubmit = async (values: VerifyEmailFormValues) => {\n try {\n await verifyEmailMutation.mutateAsync(values);\n } catch (_error) {\n setError('token', {\n type: 'manual',\n message: t('verifyEmail.error.invalidToken'),\n });\n }\n };\n\n const handleResend = async () => {\n if (!email) {\n return;\n }\n try {\n await resendVerificationMutation.mutateAsync({ email });\n } catch (_error) {}\n };\n\n if (verified) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('verifyEmail.success.subtitle')}\n <br />\n {t('verifyEmail.success.description')}\n </>\n }\n icon={CircleCheckIcon}\n title={t('verifyEmail.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n data-testid=\"email-verify-go-profile\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/profile' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.success.goToProfile')}\n </TRButton>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verifyEmail.subtitle')}\n title={t('verifyEmail.title')}\n />\n\n {email && (\n <Alert icon={MailIcon} type=\"info\">\n <span className=\"flex flex-col gap-tinyrack-3xs text-left\">\n <TRText variant=\"body\" weight=\"strong\">\n {t('register.success.subtitle')}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t('register.success.description', { email })}\n </TRText>\n </span>\n </Alert>\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.token}\n icon={KeyRoundIcon}\n label={t('verifyEmail.token.label')}\n placeholder={t('verifyEmail.token.placeholder')}\n {...register('token')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={verifyEmailMutation.isPending}\n loadingLabel={t('verifyEmail.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.submit')}\n </TRButton>\n </form>\n\n {email && (\n <div className=\"flex flex-col gap-tinyrack-md\">\n <LabeledSeparator />\n\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"email-verify-resend\"\n disabled={resendVerificationMutation.isPending || resendCooldown}\n intent=\"neutral\"\n onClick={handleResend}\n type=\"button\"\n >\n {resendVerificationMutation.isPending ? (\n <>\n <TRSpinner uiSize=\"sm\" />\n {t('verifyEmail.resending')}\n </>\n ) : (\n t('verifyEmail.resend')\n )}\n </TRButton>\n </div>\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"wCAiEE,IAAAG,EA5COH"}
1
+ {"version":3,"file":"email-tzTSqiOS.js","names":["RouteErrorFallback","VerifyEmailFormValues","token","SplitErrorComponent","errorComponent"],"sources":["../../../frontend/src/routes/verify/email/index.tsx?tsr-split=errorComponent"],"sourcesContent":["import { standardSchemaResolver } from '@hookform/resolvers/standard-schema';\nimport {\n useMutation,\n useQueryClient,\n useSuspenseQuery,\n} from '@tanstack/react-query';\nimport { createFileRoute, redirect, useNavigate } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRSpinner } from '@tinyrack/ui/components/spinner';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { TRToast } from '@tinyrack/ui/components/toast';\nimport { CircleCheckIcon, KeyRoundIcon, MailIcon } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport { AuthField } from '#frontend/components/auth/auth-field.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthPageHeader } from '#frontend/components/auth/auth-page-header.tsx';\nimport { Alert } from '#frontend/components/ui/alert.tsx';\nimport { LabeledSeparator } from '#frontend/components/ui/labeled-separator.tsx';\nimport { RouteErrorFallback } from '#frontend/components/ui/route-error-fallback.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nimport {\n buildAuthenticatedAuthorizeUrl,\n extractOAuthParams,\n isOAuthFlow,\n OAuthSearchSchema,\n type SecondFactorMethod,\n} from '#frontend/libs/oauth-search.ts';\nimport { tick } from '#frontend/libs/promise.ts';\nimport { appConfigQueryOptions } from '#frontend/queries/config.ts';\nimport { getSessionQueryOptions } from '#frontend/queries/session.ts';\nimport {\n resendVerificationMutationOptions,\n verifyEmailMutationOptions,\n} from '#frontend/queries/verify-email.ts';\n\nconst SearchSchema = z.object({\n ...OAuthSearchSchema.shape,\n token: z.string().default(''),\n email: z.string().default(''),\n});\n\nexport const Route = createFileRoute('/verify/email/')({\n component: VerifyEmail,\n errorComponent: RouteErrorFallback,\n validateSearch: SearchSchema,\n beforeLoad: async ({ context }) => {\n const config = await context.queryClient.ensureQueryData(\n appConfigQueryOptions,\n );\n const isPasswordAuthEnabled = config.auth.password.enabled;\n if (!isPasswordAuthEnabled) {\n throw redirect({ to: '/login' });\n }\n },\n loader: async ({ context }) => {\n await context.queryClient.ensureQueryData(appConfigQueryOptions);\n },\n});\n\ntype VerifyEmailFormValues = {\n token: string;\n};\n\nfunction VerifyEmail() {\n const { t } = useTranslation();\n const navigate = useNavigate();\n const queryClient = useQueryClient();\n const search = Route.useSearch();\n const { token: queryToken, email } = search;\n const [verified, setVerified] = useState(false);\n const [resendCooldown, setResendCooldown] = useState(false);\n const toast = TRToast.useToastManager();\n const { data: appConfig } = useSuspenseQuery(appConfigQueryOptions);\n\n const verifyEmailSchema = useMemo(\n () =>\n z.object({\n token: z.string().min(1, t('validation.token.required')),\n }),\n [t],\n );\n\n const verifyEmailMutation = useMutation({\n ...verifyEmailMutationOptions,\n onSuccess: async (data) => {\n const user = data.user;\n\n queryClient.setQueryData(getSessionQueryOptions.queryKey, {\n user: user,\n });\n await tick();\n\n if (user.second_factor_required) {\n const available_2fa_methods: SecondFactorMethod[] = [];\n if (appConfig.auth.password.totp.enabled) {\n available_2fa_methods.push('totp');\n }\n if (appConfig.auth.passkey.enabled) {\n available_2fa_methods.push('passkey');\n }\n\n if (available_2fa_methods.length === 1) {\n const method = available_2fa_methods[0];\n if (method === 'totp') {\n return navigate({\n to: '/setup/totp',\n search: extractOAuthParams(search),\n });\n } else {\n return navigate({\n to: '/setup/passkey',\n search: extractOAuthParams(search),\n });\n }\n } else {\n return navigate({\n to: '/setup/2fa',\n search: extractOAuthParams(search),\n });\n }\n }\n\n if (isOAuthFlow(search)) {\n window.location.href = buildAuthenticatedAuthorizeUrl(search);\n } else {\n setVerified(true);\n }\n },\n onSettled: () => {\n queryClient.invalidateQueries({\n queryKey: getSessionQueryOptions.queryKey,\n });\n },\n });\n\n const resendVerificationMutation = useMutation({\n ...resendVerificationMutationOptions,\n onSuccess: () => {\n toast.add({ title: t('verifyEmail.resendSuccess'), type: 'success' });\n // Separate from the message: a short cooldown so the button cannot be\n // used to spam the address with mail.\n setResendCooldown(true);\n setTimeout(() => setResendCooldown(false), 5000);\n },\n });\n\n const {\n register,\n setError,\n handleSubmit,\n formState: { errors },\n } = useForm<VerifyEmailFormValues>({\n defaultValues: {\n token: queryToken || '',\n },\n resolver: standardSchemaResolver(verifyEmailSchema),\n });\n\n const onSubmit = async (values: VerifyEmailFormValues) => {\n try {\n await verifyEmailMutation.mutateAsync(values);\n } catch (_error) {\n setError('token', {\n type: 'manual',\n message: t('verifyEmail.error.invalidToken'),\n });\n }\n };\n\n const handleResend = async () => {\n if (!email) {\n return;\n }\n try {\n await resendVerificationMutation.mutateAsync({ email });\n } catch (_error) {}\n };\n\n if (verified) {\n return (\n <AuthLayout>\n {/*\n The testid stays on a wrapper: e2e treats \"the success alert\" as the\n whole terminal state, which is now the outcome block rather than a\n banner stacked above a header.\n */}\n <div data-testid=\"alert-success\">\n <AuthOutcome\n description={\n <>\n {t('verifyEmail.success.subtitle')}\n <br />\n {t('verifyEmail.success.description')}\n </>\n }\n icon={CircleCheckIcon}\n title={t('verifyEmail.success.title')}\n tone=\"success\"\n >\n <TRButton\n className=\"w-full\"\n data-testid=\"email-verify-go-profile\"\n intent=\"primary\"\n onClick={() => navigate({ to: '/profile' })}\n type=\"button\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.success.goToProfile')}\n </TRButton>\n </AuthOutcome>\n </div>\n </AuthLayout>\n );\n }\n\n return (\n <AuthLayout>\n <AuthPageHeader\n subtitle={t('verifyEmail.subtitle')}\n title={t('verifyEmail.title')}\n />\n\n {email && (\n <Alert icon={MailIcon} type=\"info\">\n <span className=\"flex flex-col gap-tinyrack-3xs text-left\">\n <TRText variant=\"body\" weight=\"strong\">\n {t('register.success.subtitle')}\n </TRText>\n <TRText color=\"muted\" variant=\"caption\">\n {t('register.success.description', { email })}\n </TRText>\n </span>\n </Alert>\n )}\n\n <form\n className=\"flex flex-col gap-tinyrack-lg\"\n onSubmit={handleSubmit(onSubmit)}\n >\n <AuthField\n error={errors.token}\n icon={KeyRoundIcon}\n label={t('verifyEmail.token.label')}\n placeholder={t('verifyEmail.token.placeholder')}\n {...register('token')}\n type=\"text\"\n />\n\n <TRButton\n className=\"w-full\"\n intent=\"primary\"\n loading={verifyEmailMutation.isPending}\n loadingLabel={t('verifyEmail.submitting')}\n type=\"submit\"\n uiSize=\"lg\"\n >\n {t('verifyEmail.submit')}\n </TRButton>\n </form>\n\n {email && (\n <div className=\"flex flex-col gap-tinyrack-md\">\n <LabeledSeparator />\n\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n data-testid=\"email-verify-resend\"\n disabled={resendVerificationMutation.isPending || resendCooldown}\n intent=\"neutral\"\n onClick={handleResend}\n type=\"button\"\n >\n {resendVerificationMutation.isPending ? (\n <>\n <TRSpinner uiSize=\"sm\" />\n {t('verifyEmail.resending')}\n </>\n ) : (\n t('verifyEmail.resend')\n )}\n </TRButton>\n </div>\n )}\n </AuthLayout>\n );\n}\n"],"mappings":"wCAiEE,IAAAG,EA5COH"}
@@ -1,2 +1,2 @@
1
- import{i as e,n as t,q as n,s as r}from"./createLucideIcon-BPpAIXR_.js";import{Sn as i,wn as a}from"./config-DTQCUlfZ.js";import{L as o,R as s,z as c}from"./index-CS23Ozt6.js";import{t as l}from"./auth-layout-VtpryDof.js";import{n as u,t as d}from"./auth-footer-Cz5ivsDc.js";var f=n();function p(){let{t:n}=e(),p=a({from:`/error/`}),m=p.code||`UNKNOWN_ERROR`;return(0,f.jsxs)(l,{children:[(0,f.jsxs)(o,{description:p.message||n(`error.defaultMessage`),icon:s,title:n(`error.subtitle`),tone:`danger`,children:[(0,f.jsxs)(t,{color:`muted`,variant:`caption`,children:[n(`error.codeLabel`),` `,(0,f.jsx)(`span`,{className:`font-tinyrack-mono`,"data-testid":`error-code`,children:m})]}),(0,f.jsx)(c,{className:`w-full`,intent:`primary`,render:(0,f.jsx)(i,{to:`/login`}),uiSize:`lg`,children:n(`error.goToLogin`)}),(0,f.jsx)(r,{appearance:`ghost`,className:`w-full`,intent:`neutral`,onClick:()=>window.history.back(),type:`button`,children:n(`error.goBack`)})]}),(0,f.jsx)(d,{children:(0,f.jsx)(u,{link:(0,f.jsx)(`a`,{href:`mailto:support@example.com`,children:n(`error.footer.contactSupport`)}),text:n(`error.footer.needHelp`)})})]})}export{p as component};
2
- //# sourceMappingURL=error-BMXxpgfR.js.map
1
+ import{i as e,n as t,q as n,s as r}from"./createLucideIcon-BPpAIXR_.js";import{Sn as i,wn as a}from"./config-DTQCUlfZ.js";import{L as o,R as s,z as c}from"./index-H6CJKjiN.js";import{t as l}from"./auth-layout-CcJy6dVY.js";import{n as u,t as d}from"./auth-footer-Cz5ivsDc.js";var f=n();function p(){let{t:n}=e(),p=a({from:`/error/`}),m=p.code||`UNKNOWN_ERROR`;return(0,f.jsxs)(l,{children:[(0,f.jsxs)(o,{description:p.message||n(`error.defaultMessage`),icon:s,title:n(`error.subtitle`),tone:`danger`,children:[(0,f.jsxs)(t,{color:`muted`,variant:`caption`,children:[n(`error.codeLabel`),` `,(0,f.jsx)(`span`,{className:`font-tinyrack-mono`,"data-testid":`error-code`,children:m})]}),(0,f.jsx)(c,{className:`w-full`,intent:`primary`,render:(0,f.jsx)(i,{to:`/login`}),uiSize:`lg`,children:n(`error.goToLogin`)}),(0,f.jsx)(r,{appearance:`ghost`,className:`w-full`,intent:`neutral`,onClick:()=>window.history.back(),type:`button`,children:n(`error.goBack`)})]}),(0,f.jsx)(d,{children:(0,f.jsx)(u,{link:(0,f.jsx)(`a`,{href:`mailto:support@example.com`,children:n(`error.footer.contactSupport`)}),text:n(`error.footer.needHelp`)})})]})}export{p as component};
2
+ //# sourceMappingURL=error-Dj4QQ8vW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-BMXxpgfR.js","names":["Link","useSearch","TRButton","TRLinkButton","TRText","CircleAlertIcon","useTranslation","AuthFooter","AuthFooterLink","AuthOutcome","AuthLayout","ErrorPage","t","search","from","errorCode","code","errorMessage","message","window","history","back","component"],"sources":["../../../frontend/src/routes/error/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Link, useSearch } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CircleAlertIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nconst errorSearchSchema = z.object({\n code: z.string().optional(),\n message: z.string().optional(),\n});\n\nexport const Route = createFileRoute('/error/')({\n component: ErrorPage,\n validateSearch: errorSearchSchema,\n});\n\nfunction ErrorPage() {\n const { t } = useTranslation();\n const search = useSearch({ from: '/error/' });\n\n const errorCode = search.code || 'UNKNOWN_ERROR';\n const errorMessage = search.message || t('error.defaultMessage');\n\n return (\n <AuthLayout>\n {/*\n Nothing to do here but report what happened, so this is the shared\n terminal-state composition rather than an alert stacked on a header.\n */}\n <AuthOutcome\n description={errorMessage}\n icon={CircleAlertIcon}\n title={t('error.subtitle')}\n tone=\"danger\"\n >\n {/*\n Mono on the code itself, not the label: a font utility on `TRText`\n loses to the component's own per-variant `font-family` rule, and only\n the identifier needs fixed-width anyway.\n */}\n <TRText color=\"muted\" variant=\"caption\">\n {t('error.codeLabel')}{' '}\n <span className=\"font-tinyrack-mono\" data-testid=\"error-code\">\n {errorCode}\n </span>\n </TRText>\n\n <TRLinkButton\n className=\"w-full\"\n intent=\"primary\"\n render={<Link to=\"/login\" />}\n uiSize=\"lg\"\n >\n {t('error.goToLogin')}\n </TRLinkButton>\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n intent=\"neutral\"\n onClick={() => window.history.back()}\n type=\"button\"\n >\n {t('error.goBack')}\n </TRButton>\n </AuthOutcome>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <a href=\"mailto:support@example.com\">\n {t('error.footer.contactSupport')}\n </a>\n }\n text={t('error.footer.needHelp')}\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"6RAwBA,SAASW,GAAY,CACnB,GAAM,CAAEC,KAAMN,EAAe,EACvBO,EAASZ,EAAU,CAAEa,KAAM,SAAU,CAAC,EAEtCC,EAAYF,EAAOG,MAAQ,gBAGjC,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EAKE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,YATeH,EAAOK,SAAWN,EAAE,sBAAsB,EAUzD,KAAMP,EACN,MAAOO,EAAE,gBAAgB,EACzB,KAAK,kBAJP,EAWE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,mBAA9B,CACGA,EAAE,iBAAiB,EAAG,KACvB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAqB,cAAY,sBAC9CG,CACG,CAAA,CACA,KAER,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,SACV,OAAO,UACP,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,QAAQ,CAAA,EACzB,OAAO,cAENH,EAAE,iBAAiB,CACR,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,QACX,UAAU,SACV,OAAO,UACP,YAAeO,OAAOC,QAAQC,KAAK,EACnC,KAAK,kBAEJT,EAAE,cAAc,CACT,CAAA,CACC,KAEb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,KAAK,sCACLA,EAAE,6BAA6B,CAC/B,CAAA,EAEL,KAAMA,EAAE,uBAAuB,CAAE,CAAA,CAEzB,CAAA,CACF,CAAA,CAAA,CAEhB"}
1
+ {"version":3,"file":"error-Dj4QQ8vW.js","names":["Link","useSearch","TRButton","TRLinkButton","TRText","CircleAlertIcon","useTranslation","AuthFooter","AuthFooterLink","AuthOutcome","AuthLayout","ErrorPage","t","search","from","errorCode","code","errorMessage","message","window","history","back","component"],"sources":["../../../frontend/src/routes/error/index.tsx?tsr-split=component"],"sourcesContent":["import { createFileRoute, Link, useSearch } from '@tanstack/react-router';\nimport { TRButton } from '@tinyrack/ui/components/button';\nimport { TRLinkButton } from '@tinyrack/ui/components/link-button';\nimport { TRText } from '@tinyrack/ui/components/text';\nimport { CircleAlertIcon } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { z } from 'zod';\nimport {\n AuthFooter,\n AuthFooterLink,\n} from '#frontend/components/auth/auth-footer.tsx';\nimport { AuthOutcome } from '#frontend/components/auth/auth-outcome.tsx';\nimport { AuthLayout } from '#frontend/features/layout/auth-layout.tsx';\n\nconst errorSearchSchema = z.object({\n code: z.string().optional(),\n message: z.string().optional(),\n});\n\nexport const Route = createFileRoute('/error/')({\n component: ErrorPage,\n validateSearch: errorSearchSchema,\n});\n\nfunction ErrorPage() {\n const { t } = useTranslation();\n const search = useSearch({ from: '/error/' });\n\n const errorCode = search.code || 'UNKNOWN_ERROR';\n const errorMessage = search.message || t('error.defaultMessage');\n\n return (\n <AuthLayout>\n {/*\n Nothing to do here but report what happened, so this is the shared\n terminal-state composition rather than an alert stacked on a header.\n */}\n <AuthOutcome\n description={errorMessage}\n icon={CircleAlertIcon}\n title={t('error.subtitle')}\n tone=\"danger\"\n >\n {/*\n Mono on the code itself, not the label: a font utility on `TRText`\n loses to the component's own per-variant `font-family` rule, and only\n the identifier needs fixed-width anyway.\n */}\n <TRText color=\"muted\" variant=\"caption\">\n {t('error.codeLabel')}{' '}\n <span className=\"font-tinyrack-mono\" data-testid=\"error-code\">\n {errorCode}\n </span>\n </TRText>\n\n <TRLinkButton\n className=\"w-full\"\n intent=\"primary\"\n render={<Link to=\"/login\" />}\n uiSize=\"lg\"\n >\n {t('error.goToLogin')}\n </TRLinkButton>\n <TRButton\n appearance=\"ghost\"\n className=\"w-full\"\n intent=\"neutral\"\n onClick={() => window.history.back()}\n type=\"button\"\n >\n {t('error.goBack')}\n </TRButton>\n </AuthOutcome>\n\n <AuthFooter>\n <AuthFooterLink\n link={\n <a href=\"mailto:support@example.com\">\n {t('error.footer.contactSupport')}\n </a>\n }\n text={t('error.footer.needHelp')}\n />\n </AuthFooter>\n </AuthLayout>\n );\n}\n"],"mappings":"6RAwBA,SAASW,GAAY,CACnB,GAAM,CAAEC,KAAMN,EAAe,EACvBO,EAASZ,EAAU,CAAEa,KAAM,SAAU,CAAC,EAEtCC,EAAYF,EAAOG,MAAQ,gBAGjC,OACE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAA,SAAA,EAKE,EAAA,EAAA,KAAA,CAAC,EAAD,CACE,YATeH,EAAOK,SAAWN,EAAE,sBAAsB,EAUzD,KAAMP,EACN,MAAOO,EAAE,gBAAgB,EACzB,KAAK,kBAJP,EAWE,EAAA,EAAA,KAAA,CAAC,EAAD,CAAQ,MAAM,QAAQ,QAAQ,mBAA9B,CACGA,EAAE,iBAAiB,EAAG,KACvB,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,qBAAqB,cAAY,sBAC9CG,CACG,CAAA,CACA,KAER,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,SACV,OAAO,UACP,QAAQ,EAAA,EAAA,IAAA,CAAC,EAAD,CAAM,GAAG,QAAQ,CAAA,EACzB,OAAO,cAENH,EAAE,iBAAiB,CACR,CAAA,GACd,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,WAAW,QACX,UAAU,SACV,OAAO,UACP,YAAeO,OAAOC,QAAQC,KAAK,EACnC,KAAK,kBAEJT,EAAE,cAAc,CACT,CAAA,CACC,KAEb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAA,UACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,KAAK,sCACLA,EAAE,6BAA6B,CAC/B,CAAA,EAEL,KAAMA,EAAE,uBAAuB,CAAE,CAAA,CAEzB,CAAA,CACF,CAAA,CAAA,CAEhB"}
@@ -0,0 +1,3 @@
1
+ import{G as e,J as t,S as n,Z as r,_ as i,b as a,c as o,d as s,q as c,v as l,x as u,y as d}from"./createLucideIcon-BPpAIXR_.js";import{P as f,Xt as p,Y as m,_t as h,bn as g,pt as _,un as v,xn as y}from"./config-DTQCUlfZ.js";import{A as b,C as x,D as S,E as C,O as w,S as T,T as E,Z as D,b as O,h as k,k as A,w as j,x as M}from"./shell-header-bar-BPgCjFPv.js";import{n as N,t as P}from"./FieldItemContext-BeNfhOsU.js";var F=c(),I=r(t(),1),L=I.createContext(void 0);function R(e=!1){let t=I.useContext(L);if(!t&&!e)throw Error(l(86));return t}var z=function(e){let t=j(),r=e.controlId===void 0?t:e.controlId,[i,a]=I.useState(r),[o,s]=I.useState(e.labelId),[c,l]=I.useState([]),d=n(()=>new Map),{messageIds:f}=x(),p=u((e,t)=>{let n=d.current;if(t===void 0){n.delete(e);return}n.set(e,t),a(e=>{if(n.size===0)return;let t;for(let r of n.values()){if(e!==void 0&&r===e)return e;t===void 0&&(t=r)}return t})}),m=I.useCallback(e=>{let t=e[`aria-describedby`]?e[`aria-describedby`].split(` `):[];return t.push(...f,...c),{...e,"aria-describedby":Array.from(new Set(t)).join(` `)||void 0}},[f,c]),h=I.useMemo(()=>({controlId:i,registerControlId:p,labelId:o,setLabelId:s,messageIds:c,setMessageIds:l,getDescriptionProps:m}),[i,p,o,s,c,l,m]);return(0,F.jsx)(T.Provider,{value:h,children:e.children})};function B(e,t){return{...e,state:{...e.state,valid:!t&&e.state.valid}}}var V=Object.keys(w);function H(e,t){return e.matches(`:disabled`)?!1:!t||e.form===t?!0:e.form===null&&!e.hasAttribute(`form`)}function U(e,t){let n=null;for(let r of e.keys())if(H(r,t)){if(!r.validity.valid)return r;n??=r}return n}function W(e,t){for(let e of t.keys())e.setCustomValidity(``);e?.setCustomValidity(``)}function ee(e){let{elementRef:t,formRef:r}=O(),{setValidityData:i,validate:a,validityData:o,validationDebounceTime:c,invalid:l,markedDirtyRef:f,state:p,shouldValidateOnChange:m,registeredFieldIdRef:h}=e,{controlId:g,getDescriptionProps:_}=x(),y=v(),b=I.useRef(null),S=n(()=>new Map).current,C=I.useRef(0),T=I.useCallback((e,t)=>(S.set(e,t),()=>{S.delete(e)}),[S]),E=u(()=>{let e=U(S,t.current);return e&&S.get(e)?.controlRef.current||null}),D=u(async(e,n=!1)=>{C.current+=1;let s=C.current;function c(e,t=l){let n=h.current??g;if(n==null)return;let i=r.current.fields.get(n);if(!i)return;let a=B(e,t);r.current.fields.set(n,{...i,validityData:a})}function u(t,n){let r={value:e,state:{...w,valid:!0},error:``,errors:[],initialValue:o.initialValue};W(t,S),c(r,n),i(r)}let d=S.size>0?U(S,t.current):b.current;if(n){if(p.valid!==!1||!d)return;let e=d.validity;if(!e.valueMissing){u(d,!1);return}for(let t of V)if(t!==`valid`&&t!==`valueMissing`&&t!==`customError`&&e[t])return}function _(e){let t=V.reduce((t,n)=>(t[n]=e.validity[n],t),{}),n=!1;for(let e of V)if(e!==`valid`){if(e===`valueMissing`&&t[e])n=!0;else if(t[e])return t}return n&&!f.current&&(t.valid=!0,t.valueMissing=!1),t}y.clear();let v=null,x=[],T=d?_(d):{...w,valid:!0},E,D=m();if(d&&d.validationMessage&&!D)E=d.validationMessage,x=[d.validationMessage];else{let t=Array.from(r.current.fields.values()).reduce((e,t)=>(t.name&&(e[t.name]=t.getValue()),e),{}),n=a(e,t);if(typeof n==`object`&&n&&`then`in n){if(v=await n,s!==C.current)return}else v=n;v===null?D&&(W(d,S),T.customError=!1,d&&d.validationMessage?(E=d.validationMessage,x=[d.validationMessage]):(!d||d.validity.valid)&&!T.valid&&(T.valid=!0)):(T.valid=!1,T.customError=!0,Array.isArray(v)?(x=v,d?.setCustomValidity(v.join(`
2
+ `))):v&&(x=[v],d?.setCustomValidity(v)))}let O={value:e,state:T,error:E??(Array.isArray(v)?v[0]:v??``),errors:x,initialValue:o.initialValue};c(O),i(O)}),k=u(e=>{y.clear();let t=m();t&&e!==``&&c?(C.current+=1,y.start(c,()=>{D(e)})):D(e,!t)}),A=I.useCallback((e,t={})=>d(_(t),p.valid===!1&&!p.disabled&&!e?{"aria-invalid":!0}:s),[_,p.disabled,p.valid]);return I.useMemo(()=>({getValidationProps:A,inputRef:b,registeredInputs:S,registerInput:T,getInputControl:E,commit:D,change:k}),[A,S,T,E,D,k])}function te(e){let{commit:t,invalid:n,markedDirtyRef:r,name:i,setRegisteredFieldName:o,registeredFieldIdRef:s,setValidityData:c,validityData:l}=e,{formRef:d}=O(),f=I.useRef(null),p=I.useRef(null),m=I.useRef(!1),h=u(()=>{let e=p.current;if(e)return e.getValue?e.getValue():e.value});function g(e){return e.value===void 0?h():e.value}let _=u(()=>{let e=p.current;if(r.current=!0,!e){t(l.value);return}t(g(e))});function v(){let e=p.current;!e||!e.id||d.current.fields.set(e.id,{getValue:h,name:i??e.name,controlRef:e.controlRef,validityData:B(l,n),validate:_})}function y(e=p.current?.id){e&&d.current.fields.delete(e)}function b(e){if(m.current)return;m.current=!0;let t=g(e);c(e=>e.initialValue===t?e:{...e,initialValue:t})}return a(()=>{let e=p.current;!e||!e.id||(o(i?void 0:e.name),d.current.fields.set(e.id,{getValue:h,name:i??e.name,controlRef:e.controlRef,validityData:B(l,n),validate:_}))},[d,h,n,i,o,_,l]),a(()=>{let e=d.current.fields;return()=>{let t=p.current?.id;t&&e.delete(t)}},[d]),[_,u((e,t)=>{if(!t){f.current===e&&(f.current=null,y(),p.current=null,o(void 0),s.current=void 0);return}let n=p.current?.id;f.current=e,p.current=t,i||o(t.name),s.current=t.id,n&&n!==t.id&&y(n),b(t),v()})]}var G=I.forwardRef(function(e,t){let{errors:n,validationMode:r,submitAttemptedRef:i}=O(),{render:s,className:c,validate:l,validationDebounceTime:d=0,validationMode:f=r,name:p,disabled:m=!1,invalid:h,dirty:g,touched:_,actionsRef:v,style:y,...b}=e,x=R(!0)?.disabled,S=u(l||(()=>null)),T=x||m,[E,D]=I.useState(!1),[k,j]=I.useState(!1),[M,N]=I.useState(!1),[P,L]=I.useState(!1),z=g??k,B=_??E,V=I.useRef(z),H=I.useRef(void 0),[U,W]=I.useState(),G=p??U;a(()=>{g!==void 0&&(V.current=g)},[g]);let K=u(e=>{g===void 0&&(e&&(V.current=!0),j(e))}),ne=u(e=>{_===void 0&&D(e)}),q=u(()=>f===`onChange`||f===`onSubmit`&&i.current),J=G&&Object.hasOwn(n,G)?n[G]:null,re=!!(Array.isArray(J)?J.length:J),Y=h===!0||re,[X,Z]=I.useState({state:w,error:``,errors:[],value:null,initialValue:null}),ie=!Y&&(T?null:X.state.valid),Q=I.useMemo(()=>({disabled:T,touched:B,dirty:z,valid:ie,filled:M,focused:P}),[T,B,z,ie,M,P]),$=ee({setValidityData:Z,validate:S,validityData:X,validationDebounceTime:d,invalid:Y,markedDirtyRef:V,state:Q,shouldValidateOnChange:q,registeredFieldIdRef:H}),[ae,oe]=te({commit:$.commit,invalid:Y,markedDirtyRef:V,name:p,setRegisteredFieldName:W,registeredFieldIdRef:H,setValidityData:Z,validityData:X});I.useImperativeHandle(v,()=>({validate:ae}),[ae]);let se=I.useMemo(()=>({invalid:Y,name:G,validityData:X,setValidityData:Z,disabled:T,setTouched:ne,setDirty:K,setFilled:N,setFocused:L,validationMode:f,shouldValidateOnChange:q,state:Q,registerFieldControl:oe,validation:$}),[Y,G,X,T,ne,K,N,L,f,q,Q,oe,$]),ce=o(`div`,e,{ref:t,state:Q,props:b,stateAttributesMapping:A});return(0,F.jsx)(C.Provider,{value:se,children:ce})}),K=I.forwardRef(function(e,t){return(0,F.jsx)(z,{children:(0,F.jsx)(G,{...e,ref:t})})}),ne=I.forwardRef(function(e,t){let{render:n,className:r,style:i,id:a,nativeLabel:s=!0,...c}=e,l=S(!1),u=N(),{labelId:d}=x(),f={...l.state,disabled:l.disabled||u.disabled},p=I.useRef(null),m=k({id:d??a,native:s});return o(`label`,e,{ref:[t,p],state:f,props:[m,c],stateAttributesMapping:A})}),q={...A,...h},J=I.forwardRef(function(e,t){let{render:n,id:r,className:i,match:s,style:c,...l}=e,u=j(r),{validityData:d,state:f,name:p}=S(!1),{setMessageIds:m}=x(),{errors:h}=O(),g=p&&Object.hasOwn(h,p)?h[p]:null,v=!!(Array.isArray(g)?g.length:g),y=typeof s==`string`,b=!1;b=s===!0?!0:f.disabled?!1:y?!!d.state[s]:v||d.state.valid===!1;let{mounted:C,transitionStatus:w,setMounted:T}=D(b);a(()=>{if(!(!b||!u))return m(e=>e.concat(u)),()=>{m(e=>e.filter(e=>e!==u))}},[b,u,m]);let E=I.useRef(null),[k,A]=I.useState(null),[M,N]=I.useState(null),P=d.error;!y&&v?P=g:d.errors.length>1&&(P=d.errors);let L=P;Array.isArray(P)&&(L=P.length>1?(0,F.jsx)(`ul`,{children:P.map(e=>(0,F.jsx)(`li`,{children:e},e))}):P[0]);let R=Array.isArray(P)?JSON.stringify(P):P;b&&R!==M&&(N(R),A(L)),_({open:b,ref:E,onComplete(){b||T(!1)}});let z={...f,transitionStatus:w},B=o(`div`,e,{ref:[t,E],state:z,props:[{id:u,children:b?L:k},l],stateAttributesMapping:q,enabled:C});return C?B:null}),re=I.forwardRef(function(e,t){let{render:n,id:r,className:i,style:s,...c}=e,l=j(r),u=S(!1),d=N(),{setMessageIds:f}=x(),p={...u.state,disabled:u.disabled||d.disabled};return a(()=>{if(l)return f(e=>e.concat(l)),()=>{f(e=>e.filter(e=>e!==l))}},[l,f]),o(`p`,e,{ref:t,state:p,props:[{id:l},c],stateAttributesMapping:A})}),Y=I.forwardRef(function(e,t){let{render:n,className:r,id:s,name:c,value:l,disabled:d=!1,onValueChange:h,defaultValue:g,autoFocus:_=!1,style:v,...y}=e,{state:C,name:w,disabled:T,setTouched:D,setDirty:k,validityData:j,setFocused:N,setFilled:P,validationMode:F,validation:L}=S(),{clearErrors:R}=O(),z=T||d,B=w??c,V={...C,disabled:z},{labelId:H}=x(),U=M({id:s});a(()=>{let e=l!=null;L.inputRef.current?.value||e&&l!==``?P(!0):e&&l===``&&P(!1)},[L.inputRef,P,l]);let W=I.useRef(null);a(()=>{_&&W.current===p(i(W.current))&&N(!0)},[_,N]);let[ee]=b({controlled:l,default:g,name:`FieldControl`,state:`value`}),te=l!==void 0,G=te?ee:void 0,K=u(()=>L.inputRef.current?.value);return E(L.inputRef,U,G,K,!z,c),o(`input`,e,{ref:[t,W],state:V,props:[{id:U,disabled:z,name:B,ref:L.inputRef,"aria-labelledby":H,autoFocus:_,...te?{value:G}:{defaultValue:g},onChange(e){let t=e.currentTarget.value;h?.(t,f(m,e.nativeEvent)),k(t!==(j.initialValue??``)),P(t!==``),e.nativeEvent.defaultPrevented||(R(B),L.change(t))},onFocus(){N(!0)},onBlur(e){D(!0),N(!1),F===`onBlur`&&L.commit(e.currentTarget.value)},onKeyDown(e){e.currentTarget.tagName===`INPUT`&&e.key===`Enter`&&(D(!0),L.commit(e.currentTarget.value))}},y,e=>L.getValidationProps(z,e)],stateAttributesMapping:A})}),X=function(e){let{children:t}=e,{validityData:n,invalid:r}=S(!1),i=I.useMemo(()=>B(n,r),[n,r]),{transitionStatus:a}=D(i.state.valid===!1),o=I.useMemo(()=>({...i,validity:i.state,transitionStatus:a}),[i,a]);return(0,F.jsx)(I.Fragment,{children:t(o)})},Z=I.forwardRef(function(e,t){let{render:n,className:r,style:i,disabled:a=!1,...s}=e,{state:c,disabled:l}=S(!1),u=l||a,d={...c,disabled:u},f=I.useMemo(()=>({disabled:u}),[u]),p=o(`div`,e,{ref:t,state:d,props:s,stateAttributesMapping:A});return(0,F.jsx)(z,{children:(0,F.jsx)(P.Provider,{value:f,children:p})})});function ie({className:t,uiSize:n=`md`,...r}){return y(),(0,F.jsx)(Y,{...r,className:e(`tr-field-control`,t),"data-ui-size":n})}var Q=g(re,`tr-field-description`),$=g(J,`tr-field-error`),ae=g(Z,`tr-field-item`),oe=g(ne,`tr-label`);function se({className:t,...n}){return(0,F.jsx)(K,{...n,className:e(`tr-field`,t)})}var ce={Root:se,Label:oe,Error:$,Description:Q,Control:ie,Validity:g(X,`tr-field-validity`),Item:ae};export{Y as n,ce as t};
3
+ //# sourceMappingURL=field-CEs4ugVJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-Cn4H1CUj.js","names":["_formatErrorMessage","REASONS.none","Field.Control","Field.Description","Field.Error","Field.Item","Field.Label","Field.Root","Field.Validity"],"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/fieldset/root/FieldsetRootContext.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/internals/labelable-provider/LabelableProvider.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/field/utils/getCombinedFieldValidityData.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/field/root/useFieldValidation.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/internals/field-register-control/useFieldControlRegistration.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/field/root/FieldRoot.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/field/label/FieldLabel.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/field/error/FieldError.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/field/description/FieldDescription.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/field/control/FieldControl.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/field/validity/FieldValidity.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/field/item/FieldItem.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-control.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-description.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-error.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-item.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-label.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/field-validity.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.25.0_@types+react@19.2.17_react-dom@19.2.7_react@19.2.7__react@19.2.7_shiki@4.3.1_tailwindcss@4.3.2/node_modules/@tinyrack/ui/dist/components/field/index.js"],"sourcesContent":["'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const FieldsetRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") FieldsetRootContext.displayName = \"FieldsetRootContext\";\nexport function useFieldsetRootContext(optional = false) {\n const context = React.useContext(FieldsetRootContext);\n if (!context && !optional) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: FieldsetRootContext is missing. Fieldset parts must be placed within <Fieldset.Root>.' : _formatErrorMessage(86));\n }\n return context;\n}","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRefWithInit } from '@base-ui/utils/useRefWithInit';\nimport { useBaseUiId } from \"../useBaseUiId.mjs\";\nimport { LabelableContext, useLabelableContext } from \"./LabelableContext.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const LabelableProvider = function LabelableProvider(props) {\n const defaultId = useBaseUiId();\n const initialControlId = props.controlId === undefined ? defaultId : props.controlId;\n const [controlId, setControlIdState] = React.useState(initialControlId);\n const [labelId, setLabelId] = React.useState(props.labelId);\n const [messageIds, setMessageIds] = React.useState([]);\n const registrationsRef = useRefWithInit(() => new Map());\n const {\n messageIds: parentMessageIds\n } = useLabelableContext();\n const registerControlId = useStableCallback((source, nextId) => {\n const registrations = registrationsRef.current;\n if (nextId === undefined) {\n registrations.delete(source);\n return;\n }\n registrations.set(source, nextId);\n\n // Only flush when registering, not when unregistering.\n // This prevents loops during rapid unmount/remount cycles (e.g. React Activity).\n // The next registration will pick up the correct state.\n setControlIdState(prev => {\n if (registrations.size === 0) {\n return undefined;\n }\n let nextControlId;\n for (const id of registrations.values()) {\n if (prev !== undefined && id === prev) {\n return prev;\n }\n if (nextControlId === undefined) {\n nextControlId = id;\n }\n }\n return nextControlId;\n });\n });\n const getDescriptionProps = React.useCallback(externalProps => {\n const ids = externalProps['aria-describedby'] ? externalProps['aria-describedby'].split(' ') : [];\n ids.push(...parentMessageIds, ...messageIds);\n return {\n ...externalProps,\n 'aria-describedby': Array.from(new Set(ids)).join(' ') || undefined\n };\n }, [parentMessageIds, messageIds]);\n const contextValue = React.useMemo(() => ({\n controlId,\n registerControlId,\n labelId,\n setLabelId,\n messageIds,\n setMessageIds,\n getDescriptionProps\n }), [controlId, registerControlId, labelId, setLabelId, messageIds, setMessageIds, getDescriptionProps]);\n return /*#__PURE__*/_jsx(LabelableContext.Provider, {\n value: contextValue,\n children: props.children\n });\n};\nif (process.env.NODE_ENV !== \"production\") LabelableProvider.displayName = \"LabelableProvider\";","/**\n * Combines the field's client-side, stateful validity data with the external invalid state to\n * determine the field's true validity.\n */\nexport function getCombinedFieldValidityData(validityData, invalid) {\n return {\n ...validityData,\n state: {\n ...validityData.state,\n valid: !invalid && validityData.state.valid\n }\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { EMPTY_OBJECT } from '@base-ui/utils/empty';\nimport { useTimeout } from '@base-ui/utils/useTimeout';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRefWithInit } from '@base-ui/utils/useRefWithInit';\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { mergeProps } from \"../../merge-props/index.mjs\";\nimport { DEFAULT_VALIDITY_STATE } from \"../../internals/field-constants/constants.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { getCombinedFieldValidityData } from \"../utils/getCombinedFieldValidityData.mjs\";\nconst validityKeys = Object.keys(DEFAULT_VALIDITY_STATE);\n/**\n * Whether an input participates in the surrounding Base UI Form. Inputs that are effectively\n * disabled, or whose `form` attribute explicitly associates them with another form, are excluded.\n * DOM position only matters when it associates the input with a different form. Otherwise, field\n * registration is context-driven, so portaled inputs (for example inside a dialog) still belong to\n * the form for both validation and values projected into `onFormSubmit`.\n */\nexport function isEligibleInput(input, formElement) {\n if (input.matches(':disabled')) {\n return false;\n }\n if (!formElement || input.form === formElement) {\n return true;\n }\n\n // React context crosses portal boundaries. An unassociated portaled input still participates in\n // contextual validation, unless an explicit `form` attribute opts it out of the surrounding Form.\n return input.form === null && !input.hasAttribute('form');\n}\n\n/**\n * Picks the input whose native validity should represent a field that owns several inputs (such as a\n * checkbox or radio group). Prefers the first eligible currently-invalid input, where \"first\" follows\n * registration order (mount order), and otherwise returns the first eligible input.\n */\nfunction findRepresentativeInput(inputs, formElement) {\n let fallback = null;\n for (const input of inputs.keys()) {\n if (!isEligibleInput(input, formElement)) {\n continue;\n }\n if (!input.validity.valid) {\n return input;\n }\n fallback ??= input;\n }\n return fallback;\n}\nfunction clearCustomValidity(element, inputs) {\n for (const input of inputs.keys()) {\n input.setCustomValidity('');\n }\n element?.setCustomValidity('');\n}\nexport function useFieldValidation(params) {\n const {\n elementRef,\n formRef\n } = useFormContext();\n const {\n setValidityData,\n validate,\n validityData,\n validationDebounceTime,\n invalid,\n markedDirtyRef,\n state,\n shouldValidateOnChange,\n registeredFieldIdRef\n } = params;\n const {\n controlId,\n getDescriptionProps\n } = useLabelableContext();\n const timeout = useTimeout();\n const inputRef = React.useRef(null);\n const registeredInputs = useRefWithInit(() => new Map()).current;\n const validationCommitIdRef = React.useRef(0);\n\n // Groups register several inputs against a single field so focus, validation, and form-value\n // projection can use the same live controls. This also ensures a `required` checkbox can't be\n // satisfied by another input in the group, matching native per-checkbox behavior.\n const registerInput = React.useCallback((element, registration) => {\n registeredInputs.set(element, registration);\n return () => {\n registeredInputs.delete(element);\n };\n }, [registeredInputs]);\n const getInputControl = useStableCallback(() => {\n const element = findRepresentativeInput(registeredInputs, elementRef.current);\n return element && registeredInputs.get(element)?.controlRef.current || null;\n });\n const commit = useStableCallback(async (value, revalidate = false) => {\n validationCommitIdRef.current += 1;\n const validationCommitId = validationCommitIdRef.current;\n function updateRegisteredFieldValidity(nextValidityData, externalInvalid = invalid) {\n const fieldId = registeredFieldIdRef.current ?? controlId;\n if (fieldId == null) {\n return;\n }\n const currentFieldData = formRef.current.fields.get(fieldId);\n if (!currentFieldData) {\n return;\n }\n const validityDataWithFormErrors = getCombinedFieldValidityData(nextValidityData, externalInvalid);\n formRef.current.fields.set(fieldId, {\n ...currentFieldData,\n validityData: validityDataWithFormErrors\n });\n }\n function publishAllValid(input, externalInvalid) {\n const nextValidityData = {\n value,\n state: {\n ...DEFAULT_VALIDITY_STATE,\n valid: true\n },\n error: '',\n errors: [],\n initialValue: validityData.initialValue\n };\n clearCustomValidity(input, registeredInputs);\n updateRegisteredFieldValidity(nextValidityData, externalInvalid);\n setValidityData(nextValidityData);\n }\n\n // A field can own several inputs (such as a checkbox or radio group), but only the last-mounted\n // one wins the shared `inputRef`. Validate against the registry instead so every input counts;\n // `inputRef` is the fallback only when no inputs are registered.\n const element = registeredInputs.size > 0 ? findRepresentativeInput(registeredInputs, elementRef.current) : inputRef.current;\n // A field with no eligible input has no native constraint, but its custom validator still\n // applies to the logical value at the configured validation boundary.\n\n if (revalidate) {\n if (state.valid !== false || !element) {\n return;\n }\n const currentNativeValidity = element.validity;\n if (!currentNativeValidity.valueMissing) {\n // The 'valueMissing' (required) condition has been resolved by the user typing.\n // Temporarily mark the field as valid for this onChange event.\n // Other native errors (e.g., typeMismatch) will be caught by full validation on blur or submit.\n // The required value is now present; ignore stale external invalid state for this pass.\n publishAllValid(element, false);\n return;\n }\n\n // A stale custom error can coexist with valueMissing, but defer any other native errors.\n for (const key of validityKeys) {\n if (key !== 'valid' && key !== 'valueMissing' && key !== 'customError' && currentNativeValidity[key]) {\n return;\n }\n }\n\n // Value is still missing: publish the current native state so valueMissing and the changed\n // value are observable immediately. Full custom validation still waits for its boundary.\n }\n function getState(el) {\n const computedState = validityKeys.reduce((acc, key) => {\n acc[key] = el.validity[key];\n return acc;\n }, {});\n let hasOnlyValueMissingError = false;\n for (const key of validityKeys) {\n if (key === 'valid') {\n continue;\n }\n if (key === 'valueMissing' && computedState[key]) {\n hasOnlyValueMissingError = true;\n } else if (computedState[key]) {\n return computedState;\n }\n }\n\n // Only make `valueMissing` mark the field invalid if it's been changed\n // to reduce error noise.\n if (hasOnlyValueMissingError && !markedDirtyRef.current) {\n computedState.valid = true;\n computedState.valueMissing = false;\n }\n return computedState;\n }\n timeout.clear();\n let result = null;\n let validationErrors = [];\n\n // With no representative input the field carries no native constraint, so start from an\n // all-valid native state and let the custom `validate` result below decide the outcome.\n const nextState = element ? getState(element) : {\n ...DEFAULT_VALIDITY_STATE,\n valid: true\n };\n let defaultValidationMessage;\n const isValidatingOnChange = shouldValidateOnChange();\n if (element && element.validationMessage && !isValidatingOnChange) {\n // not validating on change, if there is a `validationMessage` from\n // native validity, set errors and skip calling the custom validate fn\n defaultValidationMessage = element.validationMessage;\n validationErrors = [element.validationMessage];\n } else {\n // call the validate function because either\n // - validating on change, or\n // - native constraint validations passed, custom validity check is next\n const formValues = Array.from(formRef.current.fields.values()).reduce((acc, field) => {\n if (field.name) {\n acc[field.name] = field.getValue();\n }\n return acc;\n }, {});\n const resultOrPromise = validate(value, formValues);\n if (typeof resultOrPromise === 'object' && resultOrPromise !== null && 'then' in resultOrPromise) {\n result = await resultOrPromise;\n if (validationCommitId !== validationCommitIdRef.current) {\n return;\n }\n } else {\n result = resultOrPromise;\n }\n if (result !== null) {\n nextState.valid = false;\n nextState.customError = true;\n if (Array.isArray(result)) {\n validationErrors = result;\n element?.setCustomValidity(result.join('\\n'));\n } else if (result) {\n validationErrors = [result];\n element?.setCustomValidity(result);\n }\n } else if (isValidatingOnChange) {\n // validate function returned no errors, if validating on change\n // we need to clear the custom validity state\n clearCustomValidity(element, registeredInputs);\n nextState.customError = false;\n if (element && element.validationMessage) {\n defaultValidationMessage = element.validationMessage;\n validationErrors = [element.validationMessage];\n } else if ((!element || element.validity.valid) && !nextState.valid) {\n nextState.valid = true;\n }\n }\n }\n const nextValidityData = {\n value,\n state: nextState,\n error: defaultValidationMessage ?? (Array.isArray(result) ? result[0] : result ?? ''),\n errors: validationErrors,\n initialValue: validityData.initialValue\n };\n\n // Keep Form-level errors part of overall field validity for submit blocking/focus logic.\n updateRegisteredFieldValidity(nextValidityData);\n setValidityData(nextValidityData);\n });\n const change = useStableCallback(value => {\n timeout.clear();\n const validateOnChange = shouldValidateOnChange();\n if (validateOnChange && value !== '' && validationDebounceTime) {\n validationCommitIdRef.current += 1;\n timeout.start(validationDebounceTime, () => {\n commit(value);\n });\n } else {\n commit(value, !validateOnChange);\n }\n });\n const getValidationProps = React.useCallback((disabled, externalProps = {}) => mergeProps(getDescriptionProps(externalProps), state.valid === false && !state.disabled && !disabled ? {\n 'aria-invalid': true\n } : EMPTY_OBJECT), [getDescriptionProps, state.disabled, state.valid]);\n return React.useMemo(() => ({\n getValidationProps,\n inputRef,\n registeredInputs,\n registerInput,\n getInputControl,\n commit,\n change\n }), [getValidationProps, registeredInputs, registerInput, getInputControl, commit, change]);\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { getCombinedFieldValidityData } from \"../../field/utils/getCombinedFieldValidityData.mjs\";\nimport { useFormContext } from \"../form-context/FormContext.mjs\";\nexport function useFieldControlRegistration(params) {\n const {\n commit,\n invalid,\n markedDirtyRef,\n name,\n setRegisteredFieldName,\n registeredFieldIdRef,\n setValidityData,\n validityData\n } = params;\n const {\n formRef\n } = useFormContext();\n const activeFieldControlSourceRef = React.useRef(null);\n const registrationRef = React.useRef(null);\n const initialValueCapturedRef = React.useRef(false);\n const getValueForForm = useStableCallback(() => {\n const registration = registrationRef.current;\n if (!registration) {\n return undefined;\n }\n if (registration.getValue) {\n return registration.getValue();\n }\n return registration.value;\n });\n function getRegistrationValue(registration) {\n return registration.value === undefined ? getValueForForm() : registration.value;\n }\n const validate = useStableCallback(() => {\n const registration = registrationRef.current;\n markedDirtyRef.current = true;\n if (!registration) {\n commit(validityData.value);\n return;\n }\n commit(getRegistrationValue(registration));\n });\n function refreshRegistration() {\n const registration = registrationRef.current;\n if (!registration || !registration.id) {\n return;\n }\n formRef.current.fields.set(registration.id, {\n getValue: getValueForForm,\n name: name ?? registration.name,\n controlRef: registration.controlRef,\n validityData: getCombinedFieldValidityData(validityData, invalid),\n validate\n });\n }\n function deleteRegistration(id = registrationRef.current?.id) {\n if (id) {\n formRef.current.fields.delete(id);\n }\n }\n\n // The baseline belongs to the field, not to a control instance: registration re-runs on every\n // value change, and a control that unmounts and remounts (or is swapped for another one) comes\n // back as a brand new registration. Capturing more than once would turn whichever value the\n // control happens to hold at that point into the initial value, so a modified field would read\n // pristine and its real initial value would read dirty. Consumers that want a fresh baseline\n // remount or key `<Field.Root>` itself.\n function captureInitialValue(registration) {\n if (initialValueCapturedRef.current) {\n return;\n }\n initialValueCapturedRef.current = true;\n const initialValue = getRegistrationValue(registration);\n setValidityData(prev => prev.initialValue === initialValue ? prev : {\n ...prev,\n initialValue\n });\n }\n useIsoLayoutEffect(() => {\n const registration = registrationRef.current;\n if (!registration || !registration.id) {\n return;\n }\n setRegisteredFieldName(name ? undefined : registration.name);\n formRef.current.fields.set(registration.id, {\n getValue: getValueForForm,\n name: name ?? registration.name,\n controlRef: registration.controlRef,\n validityData: getCombinedFieldValidityData(validityData, invalid),\n validate\n });\n }, [formRef, getValueForForm, invalid, name, setRegisteredFieldName, validate, validityData]);\n useIsoLayoutEffect(() => {\n const fields = formRef.current.fields;\n return () => {\n const id = registrationRef.current?.id;\n if (id) {\n fields.delete(id);\n }\n };\n }, [formRef]);\n const register = useStableCallback((source, registration) => {\n if (!registration) {\n if (activeFieldControlSourceRef.current === source) {\n activeFieldControlSourceRef.current = null;\n deleteRegistration();\n registrationRef.current = null;\n setRegisteredFieldName(undefined);\n registeredFieldIdRef.current = undefined;\n }\n return;\n }\n const previousId = registrationRef.current?.id;\n activeFieldControlSourceRef.current = source;\n registrationRef.current = registration;\n if (!name) {\n setRegisteredFieldName(registration.name);\n }\n registeredFieldIdRef.current = registration.id;\n if (previousId && previousId !== registration.id) {\n deleteRegistration(previousId);\n }\n captureInitialValue(registration);\n refreshRegistration();\n });\n return [validate, register];\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { FieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { DEFAULT_VALIDITY_STATE, fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useFieldsetRootContext } from \"../../fieldset/root/FieldsetRootContext.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { LabelableProvider } from \"../../internals/labelable-provider/index.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useFieldValidation } from \"./useFieldValidation.mjs\";\nimport { useFieldControlRegistration } from \"../../internals/field-register-control/useFieldControlRegistration.mjs\";\n\n/**\n * @internal\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FieldRootInner = /*#__PURE__*/React.forwardRef(function FieldRootInner(componentProps, forwardedRef) {\n const {\n errors,\n validationMode: formValidationMode,\n submitAttemptedRef\n } = useFormContext();\n const {\n render,\n className,\n validate: validateProp,\n validationDebounceTime = 0,\n validationMode = formValidationMode,\n name,\n disabled: disabledProp = false,\n invalid: invalidProp,\n dirty: dirtyProp,\n touched: touchedProp,\n actionsRef,\n style,\n ...elementProps\n } = componentProps;\n const disabledFieldset = useFieldsetRootContext(true)?.disabled;\n const validate = useStableCallback(validateProp || (() => null));\n const disabled = disabledFieldset || disabledProp;\n const [touchedState, setTouchedUnwrapped] = React.useState(false);\n const [dirtyState, setDirtyUnwrapped] = React.useState(false);\n const [filled, setFilled] = React.useState(false);\n const [focused, setFocused] = React.useState(false);\n const dirty = dirtyProp ?? dirtyState;\n const touched = touchedProp ?? touchedState;\n const markedDirtyRef = React.useRef(dirty);\n const registeredFieldIdRef = React.useRef(undefined);\n const [registeredFieldName, setRegisteredFieldName] = React.useState();\n const effectiveName = name ?? registeredFieldName;\n useIsoLayoutEffect(() => {\n if (dirtyProp !== undefined) {\n markedDirtyRef.current = dirtyProp;\n }\n }, [dirtyProp]);\n const setDirty = useStableCallback(value => {\n if (dirtyProp !== undefined) {\n return;\n }\n if (value) {\n markedDirtyRef.current = true;\n }\n setDirtyUnwrapped(value);\n });\n const setTouched = useStableCallback(value => {\n if (touchedProp !== undefined) {\n return;\n }\n setTouchedUnwrapped(value);\n });\n const shouldValidateOnChange = useStableCallback(() => validationMode === 'onChange' || validationMode === 'onSubmit' && submitAttemptedRef.current);\n const formError = effectiveName && Object.hasOwn(errors, effectiveName) ? errors[effectiveName] : null;\n const hasFormError = !!(Array.isArray(formError) ? formError.length : formError);\n const invalid = invalidProp === true || hasFormError;\n const [validityData, setValidityData] = React.useState({\n state: DEFAULT_VALIDITY_STATE,\n error: '',\n errors: [],\n value: null,\n initialValue: null\n });\n\n // App-controlled invalidity (the `invalid` prop and `<Form>` errors) keeps the field marked\n // invalid even while disabled. Only computed validity (native constraints and `validate`)\n // is suppressed when disabled, matching `:disabled` not participating in constraint validation.\n const valid = !invalid && (disabled ? null : validityData.state.valid);\n const state = React.useMemo(() => ({\n disabled,\n touched,\n dirty,\n valid,\n filled,\n focused\n }), [disabled, touched, dirty, valid, filled, focused]);\n const validation = useFieldValidation({\n setValidityData,\n validate,\n validityData,\n validationDebounceTime,\n invalid,\n markedDirtyRef,\n state,\n shouldValidateOnChange,\n registeredFieldIdRef\n });\n const [validateFieldControl, registerFieldControl] = useFieldControlRegistration({\n commit: validation.commit,\n invalid,\n markedDirtyRef,\n name,\n setRegisteredFieldName,\n registeredFieldIdRef,\n setValidityData,\n validityData\n });\n React.useImperativeHandle(actionsRef, () => ({\n validate: validateFieldControl\n }), [validateFieldControl]);\n const contextValue = React.useMemo(() => ({\n invalid,\n name: effectiveName,\n validityData,\n setValidityData,\n disabled,\n setTouched,\n setDirty,\n setFilled,\n setFocused,\n validationMode,\n shouldValidateOnChange,\n state,\n registerFieldControl,\n validation\n }), [invalid, effectiveName, validityData, disabled, setTouched, setDirty, setFilled, setFocused, validationMode, shouldValidateOnChange, state, registerFieldControl, validation]);\n const element = useRenderElement('div', componentProps, {\n ref: forwardedRef,\n state,\n props: elementProps,\n stateAttributesMapping: fieldValidityMapping\n });\n return /*#__PURE__*/_jsx(FieldRootContext.Provider, {\n value: contextValue,\n children: element\n });\n});\n\n/**\n * Groups all parts of the field.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nif (process.env.NODE_ENV !== \"production\") FieldRootInner.displayName = \"FieldRootInner\";\nexport const FieldRoot = /*#__PURE__*/React.forwardRef(function FieldRoot(componentProps, forwardedRef) {\n return /*#__PURE__*/_jsx(LabelableProvider, {\n children: /*#__PURE__*/_jsx(FieldRootInner, {\n ...componentProps,\n ref: forwardedRef\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") FieldRoot.displayName = \"FieldRoot\";","'use client';\n\nimport * as React from 'react';\nimport { error } from '@base-ui/utils/error';\nimport { SafeReact } from '@base-ui/utils/safeReact';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { useLabel } from \"../../internals/labelable-provider/useLabel.mjs\";\nimport { useFieldItemContext } from \"../item/FieldItemContext.mjs\";\n\n/**\n * An accessible label that is automatically associated with the field control.\n * Renders a `<label>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n nativeLabel = true,\n ...elementProps\n } = componentProps;\n const fieldRootContext = useFieldRootContext(false);\n const fieldItemContext = useFieldItemContext();\n const {\n labelId\n } = useLabelableContext();\n const state = {\n ...fieldRootContext.state,\n disabled: fieldRootContext.disabled || fieldItemContext.disabled\n };\n const labelRef = React.useRef(null);\n const labelProps = useLabel({\n id: labelId ?? idProp,\n native: nativeLabel\n });\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (!labelRef.current) {\n return;\n }\n const isLabelTag = labelRef.current.tagName === 'LABEL';\n if (nativeLabel) {\n if (!isLabelTag) {\n const ownerStackMessage = SafeReact.captureOwnerStack?.() || '';\n const message = '<Field.Label> expected a <label> element because the `nativeLabel` prop is true. ' + 'Rendering a non-<label> disables native label association, so `htmlFor` will not ' + 'work. Use a real <label> in the `render` prop, or set `nativeLabel` to `false`.';\n error(`${message}${ownerStackMessage}`);\n }\n } else if (isLabelTag) {\n const ownerStackMessage = SafeReact.captureOwnerStack?.() || '';\n const message = '<Field.Label> expected a non-<label> element because the `nativeLabel` prop is false. ' + 'Rendering a <label> assumes native label behavior while Base UI treats it as ' + 'non-native, which can cause unexpected pointer behavior. Use a non-<label> in the ' + '`render` prop, or set `nativeLabel` to `true`.';\n error(`${message}${ownerStackMessage}`);\n }\n }, [nativeLabel]);\n }\n const element = useRenderElement('label', componentProps, {\n ref: [forwardedRef, labelRef],\n state,\n props: [labelProps, elementProps],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldLabel.displayName = \"FieldLabel\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst stateAttributesMapping = {\n ...fieldValidityMapping,\n ...transitionStatusMapping\n};\n\n/**\n * An error message displayed if the field control fails validation.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldError = /*#__PURE__*/React.forwardRef(function FieldError(componentProps, forwardedRef) {\n const {\n render,\n id: idProp,\n className,\n match,\n style,\n ...elementProps\n } = componentProps;\n const id = useBaseUiId(idProp);\n const {\n validityData,\n state: fieldState,\n name\n } = useFieldRootContext(false);\n const {\n setMessageIds\n } = useLabelableContext();\n const {\n errors\n } = useFormContext();\n const formError = name && Object.hasOwn(errors, name) ? errors[name] : null;\n const hasFormError = !!(Array.isArray(formError) ? formError.length : formError);\n const hasSpecificMatch = typeof match === 'string';\n let rendered = false;\n if (match === true) {\n rendered = true;\n } else if (fieldState.disabled) {\n rendered = false;\n } else if (hasSpecificMatch) {\n rendered = Boolean(validityData.state[match]);\n } else {\n rendered = hasFormError || validityData.state.valid === false;\n }\n const {\n mounted,\n transitionStatus,\n setMounted\n } = useTransitionStatus(rendered);\n useIsoLayoutEffect(() => {\n if (!rendered || !id) {\n return undefined;\n }\n setMessageIds(v => v.concat(id));\n return () => {\n setMessageIds(v => v.filter(item => item !== id));\n };\n }, [rendered, id, setMessageIds]);\n const errorRef = React.useRef(null);\n const [lastRenderedMessage, setLastRenderedMessage] = React.useState(null);\n const [lastRenderedMessageKey, setLastRenderedMessageKey] = React.useState(null);\n let error = validityData.error;\n if (!hasSpecificMatch && hasFormError) {\n error = formError;\n } else if (validityData.errors.length > 1) {\n error = validityData.errors;\n }\n let errorMessage = error;\n if (Array.isArray(error)) {\n errorMessage = error.length > 1 ? /*#__PURE__*/_jsx(\"ul\", {\n children: error.map(message => /*#__PURE__*/_jsx(\"li\", {\n children: message\n }, message))\n }) : error[0];\n }\n const errorKey = Array.isArray(error) ? JSON.stringify(error) : error;\n if (rendered && errorKey !== lastRenderedMessageKey) {\n setLastRenderedMessageKey(errorKey);\n setLastRenderedMessage(errorMessage);\n }\n useOpenChangeComplete({\n open: rendered,\n ref: errorRef,\n onComplete() {\n if (!rendered) {\n setMounted(false);\n }\n }\n });\n const state = {\n ...fieldState,\n transitionStatus\n };\n const element = useRenderElement('div', componentProps, {\n ref: [forwardedRef, errorRef],\n state,\n props: [{\n id,\n children: rendered ? errorMessage : lastRenderedMessage\n }, elementProps],\n stateAttributesMapping,\n enabled: mounted\n });\n if (!mounted) {\n return null;\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldError.displayName = \"FieldError\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useFieldItemContext } from \"../item/FieldItemContext.mjs\";\n\n/**\n * A paragraph with additional information about the field.\n * Renders a `<p>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldDescription = /*#__PURE__*/React.forwardRef(function FieldDescription(componentProps, forwardedRef) {\n const {\n render,\n id: idProp,\n className,\n style,\n ...elementProps\n } = componentProps;\n const id = useBaseUiId(idProp);\n const fieldRootContext = useFieldRootContext(false);\n const fieldItemContext = useFieldItemContext();\n const {\n setMessageIds\n } = useLabelableContext();\n const state = {\n ...fieldRootContext.state,\n disabled: fieldRootContext.disabled || fieldItemContext.disabled\n };\n useIsoLayoutEffect(() => {\n if (!id) {\n return undefined;\n }\n setMessageIds(v => v.concat(id));\n return () => {\n setMessageIds(v => v.filter(item => item !== id));\n };\n }, [id, setMessageIds]);\n const element = useRenderElement('p', componentProps, {\n ref: forwardedRef,\n state,\n props: [{\n id\n }, elementProps],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldDescription.displayName = \"FieldDescription\";","'use client';\n\nimport * as React from 'react';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { ownerDocument } from '@base-ui/utils/owner';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useRegisterFieldControl } from \"../../internals/field-register-control/useRegisterFieldControl.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { useLabelableId } from \"../../internals/labelable-provider/useLabelableId.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { activeElement } from \"../../floating-ui-react/utils.mjs\";\n\n/**\n * The form control to label and validate.\n * Renders an `<input>` element.\n *\n * You can omit this part and use any Base UI input component instead. For example,\n * [Input](https://base-ui.com/react/components/input), [Checkbox](https://base-ui.com/react/components/checkbox),\n * or [Select](https://base-ui.com/react/components/select), among others, will work with Field out of the box.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldControl = /*#__PURE__*/React.forwardRef(function FieldControl(componentProps, forwardedRef) {\n const {\n render,\n className,\n id: idProp,\n name: nameProp,\n value: valueProp,\n disabled: disabledProp = false,\n onValueChange,\n defaultValue,\n autoFocus = false,\n style,\n ...elementProps\n } = componentProps;\n const {\n state: fieldState,\n name: fieldName,\n disabled: fieldDisabled,\n setTouched,\n setDirty,\n validityData,\n setFocused,\n setFilled,\n validationMode,\n validation\n } = useFieldRootContext();\n const {\n clearErrors\n } = useFormContext();\n const disabled = fieldDisabled || disabledProp;\n const name = fieldName ?? nameProp;\n const state = {\n ...fieldState,\n disabled\n };\n const {\n labelId\n } = useLabelableContext();\n const id = useLabelableId({\n id: idProp\n });\n useIsoLayoutEffect(() => {\n const hasExternalValue = valueProp != null;\n if (validation.inputRef.current?.value || hasExternalValue && valueProp !== '') {\n setFilled(true);\n } else if (hasExternalValue && valueProp === '') {\n setFilled(false);\n }\n }, [validation.inputRef, setFilled, valueProp]);\n const inputRef = React.useRef(null);\n useIsoLayoutEffect(() => {\n if (autoFocus && inputRef.current === activeElement(ownerDocument(inputRef.current))) {\n setFocused(true);\n }\n }, [autoFocus, setFocused]);\n const [valueUnwrapped] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: 'FieldControl',\n state: 'value'\n });\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueUnwrapped : undefined;\n const getValueFromInput = useStableCallback(() => validation.inputRef.current?.value);\n useRegisterFieldControl(validation.inputRef, id, value, getValueFromInput, !disabled, nameProp);\n const element = useRenderElement('input', componentProps, {\n ref: [forwardedRef, inputRef],\n state,\n props: [{\n id,\n disabled,\n name,\n ref: validation.inputRef,\n 'aria-labelledby': labelId,\n autoFocus,\n ...(isControlled ? {\n value\n } : {\n defaultValue\n }),\n onChange(event) {\n const inputValue = event.currentTarget.value;\n onValueChange?.(inputValue, createChangeEventDetails(REASONS.none, event.nativeEvent));\n // `validation.change` reads `markedDirtyRef`, so update dirty before validating.\n setDirty(inputValue !== (validityData.initialValue ?? ''));\n setFilled(inputValue !== '');\n\n // Workaround for https://github.com/react/react/issues/9023\n if (!event.nativeEvent.defaultPrevented) {\n clearErrors(name);\n validation.change(inputValue);\n }\n },\n onFocus() {\n setFocused(true);\n },\n onBlur(event) {\n setTouched(true);\n setFocused(false);\n if (validationMode === 'onBlur') {\n validation.commit(event.currentTarget.value);\n }\n },\n onKeyDown(event) {\n if (event.currentTarget.tagName === 'INPUT' && event.key === 'Enter') {\n setTouched(true);\n validation.commit(event.currentTarget.value);\n }\n }\n }, elementProps, props => validation.getValidationProps(disabled, props)],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldControl.displayName = \"FieldControl\";","'use client';\n\nimport * as React from 'react';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { getCombinedFieldValidityData } from \"../utils/getCombinedFieldValidityData.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\n\n/**\n * Used to display a custom message based on the field's validity.\n * Requires `children` to be a function that accepts field validity state as an argument.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const FieldValidity = function FieldValidity(props) {\n const {\n children\n } = props;\n const {\n validityData,\n invalid\n } = useFieldRootContext(false);\n const combinedFieldValidityData = React.useMemo(() => getCombinedFieldValidityData(validityData, invalid), [validityData, invalid]);\n const isInvalid = combinedFieldValidityData.state.valid === false;\n const {\n transitionStatus\n } = useTransitionStatus(isInvalid);\n\n // `fieldValidityState` is handed straight to a public render prop, so its identity is observable:\n // consumers can pass it to a memoized child. Keep it stable across unrelated field-state changes\n // (focus, dirty, filled) so those children don't rerender when the validity itself is unchanged.\n const fieldValidityState = React.useMemo(() => {\n return {\n ...combinedFieldValidityData,\n validity: combinedFieldValidityData.state,\n transitionStatus\n };\n }, [combinedFieldValidityData, transitionStatus]);\n return /*#__PURE__*/_jsx(React.Fragment, {\n children: children(fieldValidityState)\n });\n};\nif (process.env.NODE_ENV !== \"production\") FieldValidity.displayName = \"FieldValidity\";","'use client';\n\nimport * as React from 'react';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { FieldItemContext } from \"./FieldItemContext.mjs\";\nimport { LabelableProvider } from \"../../internals/labelable-provider/index.mjs\";\n\n/**\n * Groups individual items in a checkbox group or radio group with a label and description.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const FieldItem = /*#__PURE__*/React.forwardRef(function FieldItem(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled: disabledProp = false,\n ...elementProps\n } = componentProps;\n const {\n state: fieldState,\n disabled: rootDisabled\n } = useFieldRootContext(false);\n const disabled = rootDisabled || disabledProp;\n const state = {\n ...fieldState,\n disabled\n };\n const fieldItemContext = React.useMemo(() => ({\n disabled\n }), [disabled]);\n const element = useRenderElement('div', componentProps, {\n ref: forwardedRef,\n state,\n props: elementProps,\n stateAttributesMapping: fieldValidityMapping\n });\n return /*#__PURE__*/_jsx(LabelableProvider, {\n children: /*#__PURE__*/_jsx(FieldItemContext.Provider, {\n value: fieldItemContext,\n children: element\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") FieldItem.displayName = \"FieldItem\";","\"use client\";\nimport { useTinyrackFocusModality } from \"../../providers/focus-modality/focus-modality-provider.js\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-control.tsx\nfunction TRFieldControl({ className, uiSize = \"md\", ...props }) {\n\tuseTinyrackFocusModality();\n\treturn /* @__PURE__ */ jsx(Field.Control, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-field-control\", className),\n\t\t\"data-ui-size\": uiSize\n\t});\n}\n//#endregion\nexport { TRFieldControl };\n\n//# sourceMappingURL=field-control.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-description.tsx\nconst TRFieldDescription = createComponentPart(Field.Description, \"tr-field-description\");\n//#endregion\nexport { TRFieldDescription };\n\n//# sourceMappingURL=field-description.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-error.tsx\nconst TRFieldError = createComponentPart(Field.Error, \"tr-field-error\");\n//#endregion\nexport { TRFieldError };\n\n//# sourceMappingURL=field-error.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-item.tsx\nconst TRFieldItem = createComponentPart(Field.Item, \"tr-field-item\");\n//#endregion\nexport { TRFieldItem };\n\n//# sourceMappingURL=field-item.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-label.tsx\nconst TRFieldLabel = createComponentPart(Field.Label, \"tr-label\");\n//#endregion\nexport { TRFieldLabel };\n\n//# sourceMappingURL=field-label.js.map","\"use client\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-root.tsx\nfunction TRFieldRoot({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(Field.Root, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-field\", className)\n\t});\n}\n//#endregion\nexport { TRFieldRoot };\n\n//# sourceMappingURL=field-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-validity.tsx\nconst TRFieldValidity = createComponentPart(Field.Validity, \"tr-field-validity\");\n//#endregion\nexport { TRFieldValidity };\n\n//# sourceMappingURL=field-validity.js.map","import { TRFieldControl } from \"./field-control.js\";\nimport { TRFieldDescription } from \"./field-description.js\";\nimport { TRFieldError } from \"./field-error.js\";\nimport { TRFieldItem } from \"./field-item.js\";\nimport { TRFieldLabel } from \"./field-label.js\";\nimport { TRFieldRoot } from \"./field-root.js\";\nimport { TRFieldValidity } from \"./field-validity.js\";\n//#region src/components/field/index.tsx\nconst TRField = {\n\tRoot: TRFieldRoot,\n\tLabel: TRFieldLabel,\n\tError: TRFieldError,\n\tDescription: TRFieldDescription,\n\tControl: TRFieldControl,\n\tValidity: TRFieldValidity,\n\tItem: TRFieldItem\n};\n//#endregion\nexport { TRField, TRFieldControl, TRFieldDescription, TRFieldError, TRFieldItem, TRFieldLabel, TRFieldRoot, TRFieldValidity };\n\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"mappings":"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"}
1
+ {"version":3,"file":"field-CEs4ugVJ.js","names":["_formatErrorMessage","REASONS.none","Field.Control","Field.Description","Field.Error","Field.Item","Field.Label","Field.Root","Field.Validity"],"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/fieldset/root/FieldsetRootContext.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/internals/labelable-provider/LabelableProvider.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/field/utils/getCombinedFieldValidityData.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/field/root/useFieldValidation.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/internals/field-register-control/useFieldControlRegistration.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/field/root/FieldRoot.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/field/label/FieldLabel.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/field/error/FieldError.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/field/description/FieldDescription.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/field/control/FieldControl.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/field/validity/FieldValidity.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/field/item/FieldItem.mjs","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/field-control.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/field-description.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/field-error.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/field-item.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/field-label.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/field-root.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/field-validity.js","../../../../node_modules/.pnpm/@tinyrack+ui@0.27.1_@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/field/index.js"],"sourcesContent":["'use client';\n\nimport _formatErrorMessage from \"@base-ui/utils/formatErrorMessage\";\nimport * as React from 'react';\nexport const FieldsetRootContext = /*#__PURE__*/React.createContext(undefined);\nif (process.env.NODE_ENV !== \"production\") FieldsetRootContext.displayName = \"FieldsetRootContext\";\nexport function useFieldsetRootContext(optional = false) {\n const context = React.useContext(FieldsetRootContext);\n if (!context && !optional) {\n throw new Error(process.env.NODE_ENV !== \"production\" ? 'Base UI: FieldsetRootContext is missing. Fieldset parts must be placed within <Fieldset.Root>.' : _formatErrorMessage(86));\n }\n return context;\n}","'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRefWithInit } from '@base-ui/utils/useRefWithInit';\nimport { useBaseUiId } from \"../useBaseUiId.mjs\";\nimport { LabelableContext, useLabelableContext } from \"./LabelableContext.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const LabelableProvider = function LabelableProvider(props) {\n const defaultId = useBaseUiId();\n const initialControlId = props.controlId === undefined ? defaultId : props.controlId;\n const [controlId, setControlIdState] = React.useState(initialControlId);\n const [labelId, setLabelId] = React.useState(props.labelId);\n const [messageIds, setMessageIds] = React.useState([]);\n const registrationsRef = useRefWithInit(() => new Map());\n const {\n messageIds: parentMessageIds\n } = useLabelableContext();\n const registerControlId = useStableCallback((source, nextId) => {\n const registrations = registrationsRef.current;\n if (nextId === undefined) {\n registrations.delete(source);\n return;\n }\n registrations.set(source, nextId);\n\n // Only flush when registering, not when unregistering.\n // This prevents loops during rapid unmount/remount cycles (e.g. React Activity).\n // The next registration will pick up the correct state.\n setControlIdState(prev => {\n if (registrations.size === 0) {\n return undefined;\n }\n let nextControlId;\n for (const id of registrations.values()) {\n if (prev !== undefined && id === prev) {\n return prev;\n }\n if (nextControlId === undefined) {\n nextControlId = id;\n }\n }\n return nextControlId;\n });\n });\n const getDescriptionProps = React.useCallback(externalProps => {\n const ids = externalProps['aria-describedby'] ? externalProps['aria-describedby'].split(' ') : [];\n ids.push(...parentMessageIds, ...messageIds);\n return {\n ...externalProps,\n 'aria-describedby': Array.from(new Set(ids)).join(' ') || undefined\n };\n }, [parentMessageIds, messageIds]);\n const contextValue = React.useMemo(() => ({\n controlId,\n registerControlId,\n labelId,\n setLabelId,\n messageIds,\n setMessageIds,\n getDescriptionProps\n }), [controlId, registerControlId, labelId, setLabelId, messageIds, setMessageIds, getDescriptionProps]);\n return /*#__PURE__*/_jsx(LabelableContext.Provider, {\n value: contextValue,\n children: props.children\n });\n};\nif (process.env.NODE_ENV !== \"production\") LabelableProvider.displayName = \"LabelableProvider\";","/**\n * Combines the field's client-side, stateful validity data with the external invalid state to\n * determine the field's true validity.\n */\nexport function getCombinedFieldValidityData(validityData, invalid) {\n return {\n ...validityData,\n state: {\n ...validityData.state,\n valid: !invalid && validityData.state.valid\n }\n };\n}","'use client';\n\nimport * as React from 'react';\nimport { EMPTY_OBJECT } from '@base-ui/utils/empty';\nimport { useTimeout } from '@base-ui/utils/useTimeout';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useRefWithInit } from '@base-ui/utils/useRefWithInit';\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { mergeProps } from \"../../merge-props/index.mjs\";\nimport { DEFAULT_VALIDITY_STATE } from \"../../internals/field-constants/constants.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { getCombinedFieldValidityData } from \"../utils/getCombinedFieldValidityData.mjs\";\nconst validityKeys = Object.keys(DEFAULT_VALIDITY_STATE);\n/**\n * Whether an input participates in the surrounding Base UI Form. Inputs that are effectively\n * disabled, or whose `form` attribute explicitly associates them with another form, are excluded.\n * DOM position only matters when it associates the input with a different form. Otherwise, field\n * registration is context-driven, so portaled inputs (for example inside a dialog) still belong to\n * the form for both validation and values projected into `onFormSubmit`.\n */\nexport function isEligibleInput(input, formElement) {\n if (input.matches(':disabled')) {\n return false;\n }\n if (!formElement || input.form === formElement) {\n return true;\n }\n\n // React context crosses portal boundaries. An unassociated portaled input still participates in\n // contextual validation, unless an explicit `form` attribute opts it out of the surrounding Form.\n return input.form === null && !input.hasAttribute('form');\n}\n\n/**\n * Picks the input whose native validity should represent a field that owns several inputs (such as a\n * checkbox or radio group). Prefers the first eligible currently-invalid input, where \"first\" follows\n * registration order (mount order), and otherwise returns the first eligible input.\n */\nfunction findRepresentativeInput(inputs, formElement) {\n let fallback = null;\n for (const input of inputs.keys()) {\n if (!isEligibleInput(input, formElement)) {\n continue;\n }\n if (!input.validity.valid) {\n return input;\n }\n fallback ??= input;\n }\n return fallback;\n}\nfunction clearCustomValidity(element, inputs) {\n for (const input of inputs.keys()) {\n input.setCustomValidity('');\n }\n element?.setCustomValidity('');\n}\nexport function useFieldValidation(params) {\n const {\n elementRef,\n formRef\n } = useFormContext();\n const {\n setValidityData,\n validate,\n validityData,\n validationDebounceTime,\n invalid,\n markedDirtyRef,\n state,\n shouldValidateOnChange,\n registeredFieldIdRef\n } = params;\n const {\n controlId,\n getDescriptionProps\n } = useLabelableContext();\n const timeout = useTimeout();\n const inputRef = React.useRef(null);\n const registeredInputs = useRefWithInit(() => new Map()).current;\n const validationCommitIdRef = React.useRef(0);\n\n // Groups register several inputs against a single field so focus, validation, and form-value\n // projection can use the same live controls. This also ensures a `required` checkbox can't be\n // satisfied by another input in the group, matching native per-checkbox behavior.\n const registerInput = React.useCallback((element, registration) => {\n registeredInputs.set(element, registration);\n return () => {\n registeredInputs.delete(element);\n };\n }, [registeredInputs]);\n const getInputControl = useStableCallback(() => {\n const element = findRepresentativeInput(registeredInputs, elementRef.current);\n return element && registeredInputs.get(element)?.controlRef.current || null;\n });\n const commit = useStableCallback(async (value, revalidate = false) => {\n validationCommitIdRef.current += 1;\n const validationCommitId = validationCommitIdRef.current;\n function updateRegisteredFieldValidity(nextValidityData, externalInvalid = invalid) {\n const fieldId = registeredFieldIdRef.current ?? controlId;\n if (fieldId == null) {\n return;\n }\n const currentFieldData = formRef.current.fields.get(fieldId);\n if (!currentFieldData) {\n return;\n }\n const validityDataWithFormErrors = getCombinedFieldValidityData(nextValidityData, externalInvalid);\n formRef.current.fields.set(fieldId, {\n ...currentFieldData,\n validityData: validityDataWithFormErrors\n });\n }\n function publishAllValid(input, externalInvalid) {\n const nextValidityData = {\n value,\n state: {\n ...DEFAULT_VALIDITY_STATE,\n valid: true\n },\n error: '',\n errors: [],\n initialValue: validityData.initialValue\n };\n clearCustomValidity(input, registeredInputs);\n updateRegisteredFieldValidity(nextValidityData, externalInvalid);\n setValidityData(nextValidityData);\n }\n\n // A field can own several inputs (such as a checkbox or radio group), but only the last-mounted\n // one wins the shared `inputRef`. Validate against the registry instead so every input counts;\n // `inputRef` is the fallback only when no inputs are registered.\n const element = registeredInputs.size > 0 ? findRepresentativeInput(registeredInputs, elementRef.current) : inputRef.current;\n // A field with no eligible input has no native constraint, but its custom validator still\n // applies to the logical value at the configured validation boundary.\n\n if (revalidate) {\n if (state.valid !== false || !element) {\n return;\n }\n const currentNativeValidity = element.validity;\n if (!currentNativeValidity.valueMissing) {\n // The 'valueMissing' (required) condition has been resolved by the user typing.\n // Temporarily mark the field as valid for this onChange event.\n // Other native errors (e.g., typeMismatch) will be caught by full validation on blur or submit.\n // The required value is now present; ignore stale external invalid state for this pass.\n publishAllValid(element, false);\n return;\n }\n\n // A stale custom error can coexist with valueMissing, but defer any other native errors.\n for (const key of validityKeys) {\n if (key !== 'valid' && key !== 'valueMissing' && key !== 'customError' && currentNativeValidity[key]) {\n return;\n }\n }\n\n // Value is still missing: publish the current native state so valueMissing and the changed\n // value are observable immediately. Full custom validation still waits for its boundary.\n }\n function getState(el) {\n const computedState = validityKeys.reduce((acc, key) => {\n acc[key] = el.validity[key];\n return acc;\n }, {});\n let hasOnlyValueMissingError = false;\n for (const key of validityKeys) {\n if (key === 'valid') {\n continue;\n }\n if (key === 'valueMissing' && computedState[key]) {\n hasOnlyValueMissingError = true;\n } else if (computedState[key]) {\n return computedState;\n }\n }\n\n // Only make `valueMissing` mark the field invalid if it's been changed\n // to reduce error noise.\n if (hasOnlyValueMissingError && !markedDirtyRef.current) {\n computedState.valid = true;\n computedState.valueMissing = false;\n }\n return computedState;\n }\n timeout.clear();\n let result = null;\n let validationErrors = [];\n\n // With no representative input the field carries no native constraint, so start from an\n // all-valid native state and let the custom `validate` result below decide the outcome.\n const nextState = element ? getState(element) : {\n ...DEFAULT_VALIDITY_STATE,\n valid: true\n };\n let defaultValidationMessage;\n const isValidatingOnChange = shouldValidateOnChange();\n if (element && element.validationMessage && !isValidatingOnChange) {\n // not validating on change, if there is a `validationMessage` from\n // native validity, set errors and skip calling the custom validate fn\n defaultValidationMessage = element.validationMessage;\n validationErrors = [element.validationMessage];\n } else {\n // call the validate function because either\n // - validating on change, or\n // - native constraint validations passed, custom validity check is next\n const formValues = Array.from(formRef.current.fields.values()).reduce((acc, field) => {\n if (field.name) {\n acc[field.name] = field.getValue();\n }\n return acc;\n }, {});\n const resultOrPromise = validate(value, formValues);\n if (typeof resultOrPromise === 'object' && resultOrPromise !== null && 'then' in resultOrPromise) {\n result = await resultOrPromise;\n if (validationCommitId !== validationCommitIdRef.current) {\n return;\n }\n } else {\n result = resultOrPromise;\n }\n if (result !== null) {\n nextState.valid = false;\n nextState.customError = true;\n if (Array.isArray(result)) {\n validationErrors = result;\n element?.setCustomValidity(result.join('\\n'));\n } else if (result) {\n validationErrors = [result];\n element?.setCustomValidity(result);\n }\n } else if (isValidatingOnChange) {\n // validate function returned no errors, if validating on change\n // we need to clear the custom validity state\n clearCustomValidity(element, registeredInputs);\n nextState.customError = false;\n if (element && element.validationMessage) {\n defaultValidationMessage = element.validationMessage;\n validationErrors = [element.validationMessage];\n } else if ((!element || element.validity.valid) && !nextState.valid) {\n nextState.valid = true;\n }\n }\n }\n const nextValidityData = {\n value,\n state: nextState,\n error: defaultValidationMessage ?? (Array.isArray(result) ? result[0] : result ?? ''),\n errors: validationErrors,\n initialValue: validityData.initialValue\n };\n\n // Keep Form-level errors part of overall field validity for submit blocking/focus logic.\n updateRegisteredFieldValidity(nextValidityData);\n setValidityData(nextValidityData);\n });\n const change = useStableCallback(value => {\n timeout.clear();\n const validateOnChange = shouldValidateOnChange();\n if (validateOnChange && value !== '' && validationDebounceTime) {\n validationCommitIdRef.current += 1;\n timeout.start(validationDebounceTime, () => {\n commit(value);\n });\n } else {\n commit(value, !validateOnChange);\n }\n });\n const getValidationProps = React.useCallback((disabled, externalProps = {}) => mergeProps(getDescriptionProps(externalProps), state.valid === false && !state.disabled && !disabled ? {\n 'aria-invalid': true\n } : EMPTY_OBJECT), [getDescriptionProps, state.disabled, state.valid]);\n return React.useMemo(() => ({\n getValidationProps,\n inputRef,\n registeredInputs,\n registerInput,\n getInputControl,\n commit,\n change\n }), [getValidationProps, registeredInputs, registerInput, getInputControl, commit, change]);\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { getCombinedFieldValidityData } from \"../../field/utils/getCombinedFieldValidityData.mjs\";\nimport { useFormContext } from \"../form-context/FormContext.mjs\";\nexport function useFieldControlRegistration(params) {\n const {\n commit,\n invalid,\n markedDirtyRef,\n name,\n setRegisteredFieldName,\n registeredFieldIdRef,\n setValidityData,\n validityData\n } = params;\n const {\n formRef\n } = useFormContext();\n const activeFieldControlSourceRef = React.useRef(null);\n const registrationRef = React.useRef(null);\n const initialValueCapturedRef = React.useRef(false);\n const getValueForForm = useStableCallback(() => {\n const registration = registrationRef.current;\n if (!registration) {\n return undefined;\n }\n if (registration.getValue) {\n return registration.getValue();\n }\n return registration.value;\n });\n function getRegistrationValue(registration) {\n return registration.value === undefined ? getValueForForm() : registration.value;\n }\n const validate = useStableCallback(() => {\n const registration = registrationRef.current;\n markedDirtyRef.current = true;\n if (!registration) {\n commit(validityData.value);\n return;\n }\n commit(getRegistrationValue(registration));\n });\n function refreshRegistration() {\n const registration = registrationRef.current;\n if (!registration || !registration.id) {\n return;\n }\n formRef.current.fields.set(registration.id, {\n getValue: getValueForForm,\n name: name ?? registration.name,\n controlRef: registration.controlRef,\n validityData: getCombinedFieldValidityData(validityData, invalid),\n validate\n });\n }\n function deleteRegistration(id = registrationRef.current?.id) {\n if (id) {\n formRef.current.fields.delete(id);\n }\n }\n\n // The baseline belongs to the field, not to a control instance: registration re-runs on every\n // value change, and a control that unmounts and remounts (or is swapped for another one) comes\n // back as a brand new registration. Capturing more than once would turn whichever value the\n // control happens to hold at that point into the initial value, so a modified field would read\n // pristine and its real initial value would read dirty. Consumers that want a fresh baseline\n // remount or key `<Field.Root>` itself.\n function captureInitialValue(registration) {\n if (initialValueCapturedRef.current) {\n return;\n }\n initialValueCapturedRef.current = true;\n const initialValue = getRegistrationValue(registration);\n setValidityData(prev => prev.initialValue === initialValue ? prev : {\n ...prev,\n initialValue\n });\n }\n useIsoLayoutEffect(() => {\n const registration = registrationRef.current;\n if (!registration || !registration.id) {\n return;\n }\n setRegisteredFieldName(name ? undefined : registration.name);\n formRef.current.fields.set(registration.id, {\n getValue: getValueForForm,\n name: name ?? registration.name,\n controlRef: registration.controlRef,\n validityData: getCombinedFieldValidityData(validityData, invalid),\n validate\n });\n }, [formRef, getValueForForm, invalid, name, setRegisteredFieldName, validate, validityData]);\n useIsoLayoutEffect(() => {\n const fields = formRef.current.fields;\n return () => {\n const id = registrationRef.current?.id;\n if (id) {\n fields.delete(id);\n }\n };\n }, [formRef]);\n const register = useStableCallback((source, registration) => {\n if (!registration) {\n if (activeFieldControlSourceRef.current === source) {\n activeFieldControlSourceRef.current = null;\n deleteRegistration();\n registrationRef.current = null;\n setRegisteredFieldName(undefined);\n registeredFieldIdRef.current = undefined;\n }\n return;\n }\n const previousId = registrationRef.current?.id;\n activeFieldControlSourceRef.current = source;\n registrationRef.current = registration;\n if (!name) {\n setRegisteredFieldName(registration.name);\n }\n registeredFieldIdRef.current = registration.id;\n if (previousId && previousId !== registration.id) {\n deleteRegistration(previousId);\n }\n captureInitialValue(registration);\n refreshRegistration();\n });\n return [validate, register];\n}","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { FieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { DEFAULT_VALIDITY_STATE, fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useFieldsetRootContext } from \"../../fieldset/root/FieldsetRootContext.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { LabelableProvider } from \"../../internals/labelable-provider/index.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useFieldValidation } from \"./useFieldValidation.mjs\";\nimport { useFieldControlRegistration } from \"../../internals/field-register-control/useFieldControlRegistration.mjs\";\n\n/**\n * @internal\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FieldRootInner = /*#__PURE__*/React.forwardRef(function FieldRootInner(componentProps, forwardedRef) {\n const {\n errors,\n validationMode: formValidationMode,\n submitAttemptedRef\n } = useFormContext();\n const {\n render,\n className,\n validate: validateProp,\n validationDebounceTime = 0,\n validationMode = formValidationMode,\n name,\n disabled: disabledProp = false,\n invalid: invalidProp,\n dirty: dirtyProp,\n touched: touchedProp,\n actionsRef,\n style,\n ...elementProps\n } = componentProps;\n const disabledFieldset = useFieldsetRootContext(true)?.disabled;\n const validate = useStableCallback(validateProp || (() => null));\n const disabled = disabledFieldset || disabledProp;\n const [touchedState, setTouchedUnwrapped] = React.useState(false);\n const [dirtyState, setDirtyUnwrapped] = React.useState(false);\n const [filled, setFilled] = React.useState(false);\n const [focused, setFocused] = React.useState(false);\n const dirty = dirtyProp ?? dirtyState;\n const touched = touchedProp ?? touchedState;\n const markedDirtyRef = React.useRef(dirty);\n const registeredFieldIdRef = React.useRef(undefined);\n const [registeredFieldName, setRegisteredFieldName] = React.useState();\n const effectiveName = name ?? registeredFieldName;\n useIsoLayoutEffect(() => {\n if (dirtyProp !== undefined) {\n markedDirtyRef.current = dirtyProp;\n }\n }, [dirtyProp]);\n const setDirty = useStableCallback(value => {\n if (dirtyProp !== undefined) {\n return;\n }\n if (value) {\n markedDirtyRef.current = true;\n }\n setDirtyUnwrapped(value);\n });\n const setTouched = useStableCallback(value => {\n if (touchedProp !== undefined) {\n return;\n }\n setTouchedUnwrapped(value);\n });\n const shouldValidateOnChange = useStableCallback(() => validationMode === 'onChange' || validationMode === 'onSubmit' && submitAttemptedRef.current);\n const formError = effectiveName && Object.hasOwn(errors, effectiveName) ? errors[effectiveName] : null;\n const hasFormError = !!(Array.isArray(formError) ? formError.length : formError);\n const invalid = invalidProp === true || hasFormError;\n const [validityData, setValidityData] = React.useState({\n state: DEFAULT_VALIDITY_STATE,\n error: '',\n errors: [],\n value: null,\n initialValue: null\n });\n\n // App-controlled invalidity (the `invalid` prop and `<Form>` errors) keeps the field marked\n // invalid even while disabled. Only computed validity (native constraints and `validate`)\n // is suppressed when disabled, matching `:disabled` not participating in constraint validation.\n const valid = !invalid && (disabled ? null : validityData.state.valid);\n const state = React.useMemo(() => ({\n disabled,\n touched,\n dirty,\n valid,\n filled,\n focused\n }), [disabled, touched, dirty, valid, filled, focused]);\n const validation = useFieldValidation({\n setValidityData,\n validate,\n validityData,\n validationDebounceTime,\n invalid,\n markedDirtyRef,\n state,\n shouldValidateOnChange,\n registeredFieldIdRef\n });\n const [validateFieldControl, registerFieldControl] = useFieldControlRegistration({\n commit: validation.commit,\n invalid,\n markedDirtyRef,\n name,\n setRegisteredFieldName,\n registeredFieldIdRef,\n setValidityData,\n validityData\n });\n React.useImperativeHandle(actionsRef, () => ({\n validate: validateFieldControl\n }), [validateFieldControl]);\n const contextValue = React.useMemo(() => ({\n invalid,\n name: effectiveName,\n validityData,\n setValidityData,\n disabled,\n setTouched,\n setDirty,\n setFilled,\n setFocused,\n validationMode,\n shouldValidateOnChange,\n state,\n registerFieldControl,\n validation\n }), [invalid, effectiveName, validityData, disabled, setTouched, setDirty, setFilled, setFocused, validationMode, shouldValidateOnChange, state, registerFieldControl, validation]);\n const element = useRenderElement('div', componentProps, {\n ref: forwardedRef,\n state,\n props: elementProps,\n stateAttributesMapping: fieldValidityMapping\n });\n return /*#__PURE__*/_jsx(FieldRootContext.Provider, {\n value: contextValue,\n children: element\n });\n});\n\n/**\n * Groups all parts of the field.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nif (process.env.NODE_ENV !== \"production\") FieldRootInner.displayName = \"FieldRootInner\";\nexport const FieldRoot = /*#__PURE__*/React.forwardRef(function FieldRoot(componentProps, forwardedRef) {\n return /*#__PURE__*/_jsx(LabelableProvider, {\n children: /*#__PURE__*/_jsx(FieldRootInner, {\n ...componentProps,\n ref: forwardedRef\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") FieldRoot.displayName = \"FieldRoot\";","'use client';\n\nimport * as React from 'react';\nimport { error } from '@base-ui/utils/error';\nimport { SafeReact } from '@base-ui/utils/safeReact';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { useLabel } from \"../../internals/labelable-provider/useLabel.mjs\";\nimport { useFieldItemContext } from \"../item/FieldItemContext.mjs\";\n\n/**\n * An accessible label that is automatically associated with the field control.\n * Renders a `<label>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldLabel = /*#__PURE__*/React.forwardRef(function FieldLabel(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n id: idProp,\n nativeLabel = true,\n ...elementProps\n } = componentProps;\n const fieldRootContext = useFieldRootContext(false);\n const fieldItemContext = useFieldItemContext();\n const {\n labelId\n } = useLabelableContext();\n const state = {\n ...fieldRootContext.state,\n disabled: fieldRootContext.disabled || fieldItemContext.disabled\n };\n const labelRef = React.useRef(null);\n const labelProps = useLabel({\n id: labelId ?? idProp,\n native: nativeLabel\n });\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useEffect(() => {\n if (!labelRef.current) {\n return;\n }\n const isLabelTag = labelRef.current.tagName === 'LABEL';\n if (nativeLabel) {\n if (!isLabelTag) {\n const ownerStackMessage = SafeReact.captureOwnerStack?.() || '';\n const message = '<Field.Label> expected a <label> element because the `nativeLabel` prop is true. ' + 'Rendering a non-<label> disables native label association, so `htmlFor` will not ' + 'work. Use a real <label> in the `render` prop, or set `nativeLabel` to `false`.';\n error(`${message}${ownerStackMessage}`);\n }\n } else if (isLabelTag) {\n const ownerStackMessage = SafeReact.captureOwnerStack?.() || '';\n const message = '<Field.Label> expected a non-<label> element because the `nativeLabel` prop is false. ' + 'Rendering a <label> assumes native label behavior while Base UI treats it as ' + 'non-native, which can cause unexpected pointer behavior. Use a non-<label> in the ' + '`render` prop, or set `nativeLabel` to `true`.';\n error(`${message}${ownerStackMessage}`);\n }\n }, [nativeLabel]);\n }\n const element = useRenderElement('label', componentProps, {\n ref: [forwardedRef, labelRef],\n state,\n props: [labelProps, elementProps],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldLabel.displayName = \"FieldLabel\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useOpenChangeComplete } from \"../../internals/useOpenChangeComplete.mjs\";\nimport { transitionStatusMapping } from \"../../internals/stateAttributesMapping.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst stateAttributesMapping = {\n ...fieldValidityMapping,\n ...transitionStatusMapping\n};\n\n/**\n * An error message displayed if the field control fails validation.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldError = /*#__PURE__*/React.forwardRef(function FieldError(componentProps, forwardedRef) {\n const {\n render,\n id: idProp,\n className,\n match,\n style,\n ...elementProps\n } = componentProps;\n const id = useBaseUiId(idProp);\n const {\n validityData,\n state: fieldState,\n name\n } = useFieldRootContext(false);\n const {\n setMessageIds\n } = useLabelableContext();\n const {\n errors\n } = useFormContext();\n const formError = name && Object.hasOwn(errors, name) ? errors[name] : null;\n const hasFormError = !!(Array.isArray(formError) ? formError.length : formError);\n const hasSpecificMatch = typeof match === 'string';\n let rendered = false;\n if (match === true) {\n rendered = true;\n } else if (fieldState.disabled) {\n rendered = false;\n } else if (hasSpecificMatch) {\n rendered = Boolean(validityData.state[match]);\n } else {\n rendered = hasFormError || validityData.state.valid === false;\n }\n const {\n mounted,\n transitionStatus,\n setMounted\n } = useTransitionStatus(rendered);\n useIsoLayoutEffect(() => {\n if (!rendered || !id) {\n return undefined;\n }\n setMessageIds(v => v.concat(id));\n return () => {\n setMessageIds(v => v.filter(item => item !== id));\n };\n }, [rendered, id, setMessageIds]);\n const errorRef = React.useRef(null);\n const [lastRenderedMessage, setLastRenderedMessage] = React.useState(null);\n const [lastRenderedMessageKey, setLastRenderedMessageKey] = React.useState(null);\n let error = validityData.error;\n if (!hasSpecificMatch && hasFormError) {\n error = formError;\n } else if (validityData.errors.length > 1) {\n error = validityData.errors;\n }\n let errorMessage = error;\n if (Array.isArray(error)) {\n errorMessage = error.length > 1 ? /*#__PURE__*/_jsx(\"ul\", {\n children: error.map(message => /*#__PURE__*/_jsx(\"li\", {\n children: message\n }, message))\n }) : error[0];\n }\n const errorKey = Array.isArray(error) ? JSON.stringify(error) : error;\n if (rendered && errorKey !== lastRenderedMessageKey) {\n setLastRenderedMessageKey(errorKey);\n setLastRenderedMessage(errorMessage);\n }\n useOpenChangeComplete({\n open: rendered,\n ref: errorRef,\n onComplete() {\n if (!rendered) {\n setMounted(false);\n }\n }\n });\n const state = {\n ...fieldState,\n transitionStatus\n };\n const element = useRenderElement('div', componentProps, {\n ref: [forwardedRef, errorRef],\n state,\n props: [{\n id,\n children: rendered ? errorMessage : lastRenderedMessage\n }, elementProps],\n stateAttributesMapping,\n enabled: mounted\n });\n if (!mounted) {\n return null;\n }\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldError.displayName = \"FieldError\";","'use client';\n\nimport * as React from 'react';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useBaseUiId } from \"../../internals/useBaseUiId.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { useFieldItemContext } from \"../item/FieldItemContext.mjs\";\n\n/**\n * A paragraph with additional information about the field.\n * Renders a `<p>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldDescription = /*#__PURE__*/React.forwardRef(function FieldDescription(componentProps, forwardedRef) {\n const {\n render,\n id: idProp,\n className,\n style,\n ...elementProps\n } = componentProps;\n const id = useBaseUiId(idProp);\n const fieldRootContext = useFieldRootContext(false);\n const fieldItemContext = useFieldItemContext();\n const {\n setMessageIds\n } = useLabelableContext();\n const state = {\n ...fieldRootContext.state,\n disabled: fieldRootContext.disabled || fieldItemContext.disabled\n };\n useIsoLayoutEffect(() => {\n if (!id) {\n return undefined;\n }\n setMessageIds(v => v.concat(id));\n return () => {\n setMessageIds(v => v.filter(item => item !== id));\n };\n }, [id, setMessageIds]);\n const element = useRenderElement('p', componentProps, {\n ref: forwardedRef,\n state,\n props: [{\n id\n }, elementProps],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldDescription.displayName = \"FieldDescription\";","'use client';\n\nimport * as React from 'react';\nimport { useControlled } from '@base-ui/utils/useControlled';\nimport { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect';\nimport { ownerDocument } from '@base-ui/utils/owner';\nimport { useStableCallback } from '@base-ui/utils/useStableCallback';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { useRegisterFieldControl } from \"../../internals/field-register-control/useRegisterFieldControl.mjs\";\nimport { useFormContext } from \"../../internals/form-context/FormContext.mjs\";\nimport { useLabelableContext } from \"../../internals/labelable-provider/LabelableContext.mjs\";\nimport { useLabelableId } from \"../../internals/labelable-provider/useLabelableId.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { createChangeEventDetails } from \"../../internals/createBaseUIEventDetails.mjs\";\nimport { REASONS } from \"../../internals/reasons.mjs\";\nimport { activeElement } from \"../../floating-ui-react/utils.mjs\";\n\n/**\n * The form control to label and validate.\n * Renders an `<input>` element.\n *\n * You can omit this part and use any Base UI input component instead. For example,\n * [Input](https://base-ui.com/react/components/input), [Checkbox](https://base-ui.com/react/components/checkbox),\n * or [Select](https://base-ui.com/react/components/select), among others, will work with Field out of the box.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nexport const FieldControl = /*#__PURE__*/React.forwardRef(function FieldControl(componentProps, forwardedRef) {\n const {\n render,\n className,\n id: idProp,\n name: nameProp,\n value: valueProp,\n disabled: disabledProp = false,\n onValueChange,\n defaultValue,\n autoFocus = false,\n style,\n ...elementProps\n } = componentProps;\n const {\n state: fieldState,\n name: fieldName,\n disabled: fieldDisabled,\n setTouched,\n setDirty,\n validityData,\n setFocused,\n setFilled,\n validationMode,\n validation\n } = useFieldRootContext();\n const {\n clearErrors\n } = useFormContext();\n const disabled = fieldDisabled || disabledProp;\n const name = fieldName ?? nameProp;\n const state = {\n ...fieldState,\n disabled\n };\n const {\n labelId\n } = useLabelableContext();\n const id = useLabelableId({\n id: idProp\n });\n useIsoLayoutEffect(() => {\n const hasExternalValue = valueProp != null;\n if (validation.inputRef.current?.value || hasExternalValue && valueProp !== '') {\n setFilled(true);\n } else if (hasExternalValue && valueProp === '') {\n setFilled(false);\n }\n }, [validation.inputRef, setFilled, valueProp]);\n const inputRef = React.useRef(null);\n useIsoLayoutEffect(() => {\n if (autoFocus && inputRef.current === activeElement(ownerDocument(inputRef.current))) {\n setFocused(true);\n }\n }, [autoFocus, setFocused]);\n const [valueUnwrapped] = useControlled({\n controlled: valueProp,\n default: defaultValue,\n name: 'FieldControl',\n state: 'value'\n });\n const isControlled = valueProp !== undefined;\n const value = isControlled ? valueUnwrapped : undefined;\n const getValueFromInput = useStableCallback(() => validation.inputRef.current?.value);\n useRegisterFieldControl(validation.inputRef, id, value, getValueFromInput, !disabled, nameProp);\n const element = useRenderElement('input', componentProps, {\n ref: [forwardedRef, inputRef],\n state,\n props: [{\n id,\n disabled,\n name,\n ref: validation.inputRef,\n 'aria-labelledby': labelId,\n autoFocus,\n ...(isControlled ? {\n value\n } : {\n defaultValue\n }),\n onChange(event) {\n const inputValue = event.currentTarget.value;\n onValueChange?.(inputValue, createChangeEventDetails(REASONS.none, event.nativeEvent));\n // `validation.change` reads `markedDirtyRef`, so update dirty before validating.\n setDirty(inputValue !== (validityData.initialValue ?? ''));\n setFilled(inputValue !== '');\n\n // Workaround for https://github.com/react/react/issues/9023\n if (!event.nativeEvent.defaultPrevented) {\n clearErrors(name);\n validation.change(inputValue);\n }\n },\n onFocus() {\n setFocused(true);\n },\n onBlur(event) {\n setTouched(true);\n setFocused(false);\n if (validationMode === 'onBlur') {\n validation.commit(event.currentTarget.value);\n }\n },\n onKeyDown(event) {\n if (event.currentTarget.tagName === 'INPUT' && event.key === 'Enter') {\n setTouched(true);\n validation.commit(event.currentTarget.value);\n }\n }\n }, elementProps, props => validation.getValidationProps(disabled, props)],\n stateAttributesMapping: fieldValidityMapping\n });\n return element;\n});\nif (process.env.NODE_ENV !== \"production\") FieldControl.displayName = \"FieldControl\";","'use client';\n\nimport * as React from 'react';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { getCombinedFieldValidityData } from \"../utils/getCombinedFieldValidityData.mjs\";\nimport { useTransitionStatus } from \"../../internals/useTransitionStatus.mjs\";\n\n/**\n * Used to display a custom message based on the field's validity.\n * Requires `children` to be a function that accepts field validity state as an argument.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const FieldValidity = function FieldValidity(props) {\n const {\n children\n } = props;\n const {\n validityData,\n invalid\n } = useFieldRootContext(false);\n const combinedFieldValidityData = React.useMemo(() => getCombinedFieldValidityData(validityData, invalid), [validityData, invalid]);\n const isInvalid = combinedFieldValidityData.state.valid === false;\n const {\n transitionStatus\n } = useTransitionStatus(isInvalid);\n\n // `fieldValidityState` is handed straight to a public render prop, so its identity is observable:\n // consumers can pass it to a memoized child. Keep it stable across unrelated field-state changes\n // (focus, dirty, filled) so those children don't rerender when the validity itself is unchanged.\n const fieldValidityState = React.useMemo(() => {\n return {\n ...combinedFieldValidityData,\n validity: combinedFieldValidityData.state,\n transitionStatus\n };\n }, [combinedFieldValidityData, transitionStatus]);\n return /*#__PURE__*/_jsx(React.Fragment, {\n children: children(fieldValidityState)\n });\n};\nif (process.env.NODE_ENV !== \"production\") FieldValidity.displayName = \"FieldValidity\";","'use client';\n\nimport * as React from 'react';\nimport { useFieldRootContext } from \"../../internals/field-root-context/FieldRootContext.mjs\";\nimport { fieldValidityMapping } from \"../../internals/field-constants/constants.mjs\";\nimport { useRenderElement } from \"../../internals/useRenderElement.mjs\";\nimport { FieldItemContext } from \"./FieldItemContext.mjs\";\nimport { LabelableProvider } from \"../../internals/labelable-provider/index.mjs\";\n\n/**\n * Groups individual items in a checkbox group or radio group with a label and description.\n * Renders a `<div>` element.\n *\n * Documentation: [Base UI Field](https://base-ui.com/react/components/field)\n */\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const FieldItem = /*#__PURE__*/React.forwardRef(function FieldItem(componentProps, forwardedRef) {\n const {\n render,\n className,\n style,\n disabled: disabledProp = false,\n ...elementProps\n } = componentProps;\n const {\n state: fieldState,\n disabled: rootDisabled\n } = useFieldRootContext(false);\n const disabled = rootDisabled || disabledProp;\n const state = {\n ...fieldState,\n disabled\n };\n const fieldItemContext = React.useMemo(() => ({\n disabled\n }), [disabled]);\n const element = useRenderElement('div', componentProps, {\n ref: forwardedRef,\n state,\n props: elementProps,\n stateAttributesMapping: fieldValidityMapping\n });\n return /*#__PURE__*/_jsx(LabelableProvider, {\n children: /*#__PURE__*/_jsx(FieldItemContext.Provider, {\n value: fieldItemContext,\n children: element\n })\n });\n});\nif (process.env.NODE_ENV !== \"production\") FieldItem.displayName = \"FieldItem\";","\"use client\";\nimport { useTinyrackFocusModality } from \"../../providers/focus-modality/focus-modality-provider.js\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-control.tsx\nfunction TRFieldControl({ className, uiSize = \"md\", ...props }) {\n\tuseTinyrackFocusModality();\n\treturn /* @__PURE__ */ jsx(Field.Control, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-field-control\", className),\n\t\t\"data-ui-size\": uiSize\n\t});\n}\n//#endregion\nexport { TRFieldControl };\n\n//# sourceMappingURL=field-control.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-description.tsx\nconst TRFieldDescription = createComponentPart(Field.Description, \"tr-field-description\");\n//#endregion\nexport { TRFieldDescription };\n\n//# sourceMappingURL=field-description.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-error.tsx\nconst TRFieldError = createComponentPart(Field.Error, \"tr-field-error\");\n//#endregion\nexport { TRFieldError };\n\n//# sourceMappingURL=field-error.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-item.tsx\nconst TRFieldItem = createComponentPart(Field.Item, \"tr-field-item\");\n//#endregion\nexport { TRFieldItem };\n\n//# sourceMappingURL=field-item.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-label.tsx\nconst TRFieldLabel = createComponentPart(Field.Label, \"tr-label\");\n//#endregion\nexport { TRFieldLabel };\n\n//# sourceMappingURL=field-label.js.map","\"use client\";\nimport { mergeComponentClassName } from \"../../internal/component-class-name.js\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-root.tsx\nfunction TRFieldRoot({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(Field.Root, {\n\t\t...props,\n\t\tclassName: mergeComponentClassName(\"tr-field\", className)\n\t});\n}\n//#endregion\nexport { TRFieldRoot };\n\n//# sourceMappingURL=field-root.js.map","\"use client\";\nimport { createComponentPart } from \"../../internal/component-part.js\";\nimport { Field } from \"@base-ui/react/field\";\n//#region src/components/field/field-validity.tsx\nconst TRFieldValidity = createComponentPart(Field.Validity, \"tr-field-validity\");\n//#endregion\nexport { TRFieldValidity };\n\n//# sourceMappingURL=field-validity.js.map","import { TRFieldControl } from \"./field-control.js\";\nimport { TRFieldDescription } from \"./field-description.js\";\nimport { TRFieldError } from \"./field-error.js\";\nimport { TRFieldItem } from \"./field-item.js\";\nimport { TRFieldLabel } from \"./field-label.js\";\nimport { TRFieldRoot } from \"./field-root.js\";\nimport { TRFieldValidity } from \"./field-validity.js\";\n//#region src/components/field/index.tsx\nconst TRField = {\n\tRoot: TRFieldRoot,\n\tLabel: TRFieldLabel,\n\tError: TRFieldError,\n\tDescription: TRFieldDescription,\n\tControl: TRFieldControl,\n\tValidity: TRFieldValidity,\n\tItem: TRFieldItem\n};\n//#endregion\nexport { TRField, TRFieldControl, TRFieldDescription, TRFieldError, TRFieldItem, TRFieldLabel, TRFieldRoot, TRFieldValidity };\n\n//# sourceMappingURL=index.js.map"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"mappings":"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"}