@alfadocs/ui-kit-debug 0.8.1 → 0.9.1

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 (304) hide show
  1. package/dist/_chunks/{agenda-card-CalZqycc.js → agenda-card-CsCm7hQv.js} +5 -5
  2. package/dist/_chunks/agenda-card-CsCm7hQv.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-3ffFDQZC.js → agenda-tray-B8QZ3wEp.js} +9 -9
  4. package/dist/_chunks/agenda-tray-B8QZ3wEp.js.map +1 -0
  5. package/dist/_chunks/{ai-prompt-input-DLgY8lrW.js → ai-prompt-input-bAJwYu84.js} +45 -45
  6. package/dist/_chunks/ai-prompt-input-bAJwYu84.js.map +1 -0
  7. package/dist/_chunks/{alert-CVMq99Cq.js → alert-pgdXrEO5.js} +2 -2
  8. package/dist/_chunks/{alert-CVMq99Cq.js.map → alert-pgdXrEO5.js.map} +1 -1
  9. package/dist/_chunks/{app-frame-CDJOgPXe.js → app-frame-BYx1gcV7.js} +2 -2
  10. package/dist/_chunks/{app-frame-CDJOgPXe.js.map → app-frame-BYx1gcV7.js.map} +1 -1
  11. package/dist/_chunks/{audio-recorder-cOl_Z_Pk.js → audio-recorder-BHBonrFf.js} +54 -54
  12. package/dist/_chunks/{audio-recorder-cOl_Z_Pk.js.map → audio-recorder-BHBonrFf.js.map} +1 -1
  13. package/dist/_chunks/{audio-visualiser-ByDEFLNm.js → audio-visualiser-I-T4Z7EU.js} +2 -2
  14. package/dist/_chunks/audio-visualiser-I-T4Z7EU.js.map +1 -0
  15. package/dist/_chunks/{autocomplete-D4oUZbsP.js → autocomplete-C34hbfKh.js} +6 -6
  16. package/dist/_chunks/autocomplete-C34hbfKh.js.map +1 -0
  17. package/dist/_chunks/{avatar-Dcr6XuDQ.js → avatar-I10iCDs8.js} +2 -2
  18. package/dist/_chunks/{avatar-Dcr6XuDQ.js.map → avatar-I10iCDs8.js.map} +1 -1
  19. package/dist/_chunks/{badge-DKFbntoa.js → badge-cLYVGlMh.js} +2 -2
  20. package/dist/_chunks/{badge-DKFbntoa.js.map → badge-cLYVGlMh.js.map} +1 -1
  21. package/dist/_chunks/{balance-cell-renderer-BuExGe6u.js → balance-cell-renderer-DWWtX-VM.js} +5 -5
  22. package/dist/_chunks/{balance-cell-renderer-BuExGe6u.js.map → balance-cell-renderer-DWWtX-VM.js.map} +1 -1
  23. package/dist/_chunks/{breadcrumb-D1snXjPb.js → breadcrumb--YI7lcHA.js} +4 -4
  24. package/dist/_chunks/breadcrumb--YI7lcHA.js.map +1 -0
  25. package/dist/_chunks/{button-group-CONver7M.js → button-group-Bh2g_Ng-.js} +2 -2
  26. package/dist/_chunks/button-group-Bh2g_Ng-.js.map +1 -0
  27. package/dist/_chunks/{chat-container-ClzsWXp2.js → chat-container-izziXViv.js} +4 -4
  28. package/dist/_chunks/chat-container-izziXViv.js.map +1 -0
  29. package/dist/_chunks/{chat-message-DoAhgUTj.js → chat-message-g3lxpXM_.js} +2 -2
  30. package/dist/_chunks/{chat-message-DoAhgUTj.js.map → chat-message-g3lxpXM_.js.map} +1 -1
  31. package/dist/_chunks/{checkbox-group-CarPLDIC.js → checkbox-group-Qkm3Rg1S.js} +6 -6
  32. package/dist/_chunks/checkbox-group-Qkm3Rg1S.js.map +1 -0
  33. package/dist/_chunks/{color-picker-CTIcHlDF.js → color-picker-BPfcByHH.js} +13 -13
  34. package/dist/_chunks/color-picker-BPfcByHH.js.map +1 -0
  35. package/dist/_chunks/{combobox-BLWruOxK.js → combobox-BHhnR3qm.js} +8 -12
  36. package/dist/_chunks/combobox-BHhnR3qm.js.map +1 -0
  37. package/dist/_chunks/{contact-card-DNyATxKv.js → contact-card-VJIUqKB2.js} +13 -13
  38. package/dist/_chunks/contact-card-VJIUqKB2.js.map +1 -0
  39. package/dist/_chunks/{date-picker-B1PO1ZQP.js → date-picker-BD5FYW08.js} +3 -3
  40. package/dist/_chunks/{date-picker-B1PO1ZQP.js.map → date-picker-BD5FYW08.js.map} +1 -1
  41. package/dist/_chunks/{date-range-picker-mix2nEVC.js → date-range-picker-BZLVgcXE.js} +27 -27
  42. package/dist/_chunks/date-range-picker-BZLVgcXE.js.map +1 -0
  43. package/dist/_chunks/{date-time-picker-Dnong_BY.js → date-time-picker-CCoRWX7R.js} +5 -5
  44. package/dist/_chunks/date-time-picker-CCoRWX7R.js.map +1 -0
  45. package/dist/_chunks/{description-list-BYA77Yud.js → description-list-y7Hk51KI.js} +16 -16
  46. package/dist/_chunks/description-list-y7Hk51KI.js.map +1 -0
  47. package/dist/_chunks/{dialog-W8uDfXD8.js → dialog-DRp6Dejy.js} +2 -2
  48. package/dist/_chunks/{dialog-W8uDfXD8.js.map → dialog-DRp6Dejy.js.map} +1 -1
  49. package/dist/_chunks/{file-upload-C947ACDK.js → file-upload-DIecAfC-.js} +82 -86
  50. package/dist/_chunks/file-upload-DIecAfC-.js.map +1 -0
  51. package/dist/_chunks/{floating-action-button-C8OYj8mE.js → floating-action-button-pojvb9gG.js} +6 -6
  52. package/dist/_chunks/{floating-action-button-C8OYj8mE.js.map → floating-action-button-pojvb9gG.js.map} +1 -1
  53. package/dist/_chunks/{form-field-Bmkeh7WY.js → form-field-BOm9hK35.js} +2 -2
  54. package/dist/_chunks/form-field-BOm9hK35.js.map +1 -0
  55. package/dist/_chunks/{freemium-paywall-B9kIDtm1.js → freemium-paywall-BTEiVkes.js} +29 -29
  56. package/dist/_chunks/freemium-paywall-BTEiVkes.js.map +1 -0
  57. package/dist/_chunks/{key-value-pair-CgWvAIGb.js → key-value-pair-AbrRwesr.js} +14 -14
  58. package/dist/_chunks/key-value-pair-AbrRwesr.js.map +1 -0
  59. package/dist/_chunks/{leo-sidebar-BWECDYpu.js → leo-sidebar-B054wsZm.js} +8 -8
  60. package/dist/_chunks/{leo-sidebar-BWECDYpu.js.map → leo-sidebar-B054wsZm.js.map} +1 -1
  61. package/dist/_chunks/{link-BcYW1eNM.js → link-BGpwaFik.js} +2 -2
  62. package/dist/_chunks/{link-BcYW1eNM.js.map → link-BGpwaFik.js.map} +1 -1
  63. package/dist/_chunks/{list-qP6p0NTw.js → list-DcjV0m5B.js} +2 -2
  64. package/dist/_chunks/list-DcjV0m5B.js.map +1 -0
  65. package/dist/_chunks/{message-card-DjvsB_3U.js → message-card-c6R0-qXq.js} +6 -6
  66. package/dist/_chunks/message-card-c6R0-qXq.js.map +1 -0
  67. package/dist/_chunks/{message-tray-BbnAzlLH.js → message-tray-Fsend-du.js} +21 -21
  68. package/dist/_chunks/message-tray-Fsend-du.js.map +1 -0
  69. package/dist/_chunks/{multi-select-wqqrgjUQ.js → multi-select-Bh-xR8kP.js} +10 -10
  70. package/dist/_chunks/multi-select-Bh-xR8kP.js.map +1 -0
  71. package/dist/_chunks/{navigation-menu-ClbHeawy.js → navigation-menu-Bav1d_wA.js} +2 -2
  72. package/dist/_chunks/navigation-menu-Bav1d_wA.js.map +1 -0
  73. package/dist/_chunks/{notification-card-uTPEvAQS.js → notification-card-ejOw5g6g.js} +3 -6
  74. package/dist/_chunks/notification-card-ejOw5g6g.js.map +1 -0
  75. package/dist/_chunks/{notification-tray-PGtMqXbP.js → notification-tray-C3dYdLAF.js} +21 -24
  76. package/dist/_chunks/notification-tray-C3dYdLAF.js.map +1 -0
  77. package/dist/_chunks/{number-input-Q7wkHnvQ.js → number-input-mpSLk-ld.js} +3 -3
  78. package/dist/_chunks/{number-input-Q7wkHnvQ.js.map → number-input-mpSLk-ld.js.map} +1 -1
  79. package/dist/_chunks/{otp-input-C9gUByF0.js → otp-input-CI-Zv5q6.js} +2 -2
  80. package/dist/_chunks/{otp-input-C9gUByF0.js.map → otp-input-CI-Zv5q6.js.map} +1 -1
  81. package/dist/_chunks/{pagination-3AC4zTsi.js → pagination-OQBlnb1H.js} +7 -7
  82. package/dist/_chunks/pagination-OQBlnb1H.js.map +1 -0
  83. package/dist/_chunks/{patient-shell-IhMULVrt.js → patient-shell-BS2V6V1b.js} +3 -3
  84. package/dist/_chunks/{patient-shell-IhMULVrt.js.map → patient-shell-BS2V6V1b.js.map} +1 -1
  85. package/dist/_chunks/{payment-form-C3HMAsGG.js → payment-form-CI77oIx1.js} +3 -3
  86. package/dist/_chunks/{payment-form-C3HMAsGG.js.map → payment-form-CI77oIx1.js.map} +1 -1
  87. package/dist/_chunks/{pdf-viewer-DO95bm2o.js → pdf-viewer-CNETPubN.js} +3 -3
  88. package/dist/_chunks/{pdf-viewer-DO95bm2o.js.map → pdf-viewer-CNETPubN.js.map} +1 -1
  89. package/dist/_chunks/{phone-input-CSHJOJ13.js → phone-input-DtBVs5fz.js} +7 -7
  90. package/dist/_chunks/phone-input-DtBVs5fz.js.map +1 -0
  91. package/dist/_chunks/{popover-DekUKNBk.js → popover--derJ_wq.js} +2 -2
  92. package/dist/_chunks/{popover-DekUKNBk.js.map → popover--derJ_wq.js.map} +1 -1
  93. package/dist/_chunks/{progress-C11tqhoI.js → progress-B-PSO5OS.js} +4 -4
  94. package/dist/_chunks/progress-B-PSO5OS.js.map +1 -0
  95. package/dist/_chunks/{recaptcha-widget-NyfOfLII.js → recaptcha-widget-Kp1XntuE.js} +3 -3
  96. package/dist/_chunks/recaptcha-widget-Kp1XntuE.js.map +1 -0
  97. package/dist/_chunks/{resizable-mpXXyIsN.js → resizable-COV-cnth.js} +3 -3
  98. package/dist/_chunks/resizable-COV-cnth.js.map +1 -0
  99. package/dist/_chunks/{search-bar-BTDfgYtg.js → search-bar-DmZZ9UvV.js} +2 -2
  100. package/dist/_chunks/{search-bar-BTDfgYtg.js.map → search-bar-DmZZ9UvV.js.map} +1 -1
  101. package/dist/_chunks/{search-input-CdJIEjFo.js → search-input-BBtSRH-Q.js} +4 -4
  102. package/dist/_chunks/{search-input-CdJIEjFo.js.map → search-input-BBtSRH-Q.js.map} +1 -1
  103. package/dist/_chunks/{select-BOU_Osnf.js → select-i9MwQeQy.js} +20 -20
  104. package/dist/_chunks/select-i9MwQeQy.js.map +1 -0
  105. package/dist/_chunks/{sheet-BAg7GY9j.js → sheet-BT0izeoI.js} +9 -9
  106. package/dist/_chunks/{sheet-BAg7GY9j.js.map → sheet-BT0izeoI.js.map} +1 -1
  107. package/dist/_chunks/{sidebar-Bx3wCDyy.js → sidebar-CoLHtVrP.js} +83 -83
  108. package/dist/_chunks/sidebar-CoLHtVrP.js.map +1 -0
  109. package/dist/_chunks/{sign-in-with-alfadocs-button-B9UrqOqH.js → sign-in-with-alfadocs-button-4zZC-I6y.js} +3 -3
  110. package/dist/_chunks/sign-in-with-alfadocs-button-4zZC-I6y.js.map +1 -0
  111. package/dist/_chunks/{skip-link-DmZ3c6cb.js → skip-link-BaSMtPwB.js} +2 -2
  112. package/dist/_chunks/{skip-link-DmZ3c6cb.js.map → skip-link-BaSMtPwB.js.map} +1 -1
  113. package/dist/_chunks/{slider-BT2bZWsy.js → slider-CkR6CLun.js} +3 -3
  114. package/dist/_chunks/slider-CkR6CLun.js.map +1 -0
  115. package/dist/_chunks/{sparkline-_gy8aJDG.js → sparkline-B5Ms55PZ.js} +16 -16
  116. package/dist/_chunks/sparkline-B5Ms55PZ.js.map +1 -0
  117. package/dist/_chunks/{spinner-DLaYfLPl.js → spinner-DirtWZNG.js} +2 -2
  118. package/dist/_chunks/spinner-DirtWZNG.js.map +1 -0
  119. package/dist/_chunks/{stat-B9PHSPbN.js → stat-CDQ_a0vk.js} +4 -4
  120. package/dist/_chunks/stat-CDQ_a0vk.js.map +1 -0
  121. package/dist/_chunks/{switch-C0psfIQF.js → switch-D916VW86.js} +2 -2
  122. package/dist/_chunks/{switch-C0psfIQF.js.map → switch-D916VW86.js.map} +1 -1
  123. package/dist/_chunks/{tabs-BZQy_Rmb.js → tabs-Cg794H0Q.js} +3 -3
  124. package/dist/_chunks/tabs-Cg794H0Q.js.map +1 -0
  125. package/dist/_chunks/{tag-DuLMjRbF.js → tag-CQmHRM4Y.js} +3 -3
  126. package/dist/_chunks/tag-CQmHRM4Y.js.map +1 -0
  127. package/dist/_chunks/{task-card-Dw_ZJDL8.js → task-card-BUVMh6HN.js} +2 -2
  128. package/dist/_chunks/task-card-BUVMh6HN.js.map +1 -0
  129. package/dist/_chunks/{task-tray-XlIW9ueh.js → task-tray-B3A2fRGR.js} +13 -13
  130. package/dist/_chunks/task-tray-B3A2fRGR.js.map +1 -0
  131. package/dist/_chunks/{text-area-CO9Dz0qX.js → text-area-DHtcpcLv.js} +13 -13
  132. package/dist/_chunks/{text-area-CO9Dz0qX.js.map → text-area-DHtcpcLv.js.map} +1 -1
  133. package/dist/_chunks/{text-input-DZwt9L8H.js → text-input-1oqFRbVI.js} +2 -2
  134. package/dist/_chunks/{text-input-DZwt9L8H.js.map → text-input-1oqFRbVI.js.map} +1 -1
  135. package/dist/_chunks/{theme-toggle-B3UR6ouK.js → theme-toggle-B3meAb3y.js} +14 -14
  136. package/dist/_chunks/theme-toggle-B3meAb3y.js.map +1 -0
  137. package/dist/_chunks/{time-picker-DvPUmHH-.js → time-picker-DeVZkIY2.js} +2 -2
  138. package/dist/_chunks/{time-picker-DvPUmHH-.js.map → time-picker-DeVZkIY2.js.map} +1 -1
  139. package/dist/_chunks/{timeline-BvmnQadS.js → timeline-rmls7dIh.js} +10 -10
  140. package/dist/_chunks/timeline-rmls7dIh.js.map +1 -0
  141. package/dist/_chunks/{toast.agent-DihA6MON.js → toast.agent-32WNQ-_x.js} +2 -2
  142. package/dist/_chunks/{toast.agent-DihA6MON.js.map → toast.agent-32WNQ-_x.js.map} +1 -1
  143. package/dist/_chunks/{transaction-chip-DE6DITun.js → transaction-chip-z9ENE50O.js} +3 -3
  144. package/dist/_chunks/{transaction-chip-DE6DITun.js.map → transaction-chip-z9ENE50O.js.map} +1 -1
  145. package/dist/_chunks/{transcript-panel-Bx5ANMsv.js → transcript-panel-BpJqPr7I.js} +8 -8
  146. package/dist/_chunks/transcript-panel-BpJqPr7I.js.map +1 -0
  147. package/dist/_chunks/{typing-indicator-BZ5jXZPn.js → typing-indicator-DHeVN4ob.js} +9 -9
  148. package/dist/_chunks/typing-indicator-DHeVN4ob.js.map +1 -0
  149. package/dist/_chunks/{use-password-requirements-DgEYdN4H.js → use-password-requirements-DbPZMfV9.js} +30 -33
  150. package/dist/_chunks/use-password-requirements-DbPZMfV9.js.map +1 -0
  151. package/dist/_chunks/{warning-stack-CdLIe534.js → warning-stack-CeRihME9.js} +15 -15
  152. package/dist/_chunks/warning-stack-CeRihME9.js.map +1 -0
  153. package/dist/_chunks/{workflow-map-CESZNNZe.js → workflow-map-D3MvrsZV.js} +4 -4
  154. package/dist/_chunks/{workflow-map-CESZNNZe.js.map → workflow-map-D3MvrsZV.js.map} +1 -1
  155. package/dist/agent-catalog.json +1 -1
  156. package/dist/components/agenda-card/index.js +1 -1
  157. package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
  158. package/dist/components/agenda-tray/index.js +1 -1
  159. package/dist/components/ai-prompt-input/index.js +1 -1
  160. package/dist/components/alert/index.js +1 -1
  161. package/dist/components/app-frame/index.js +1 -1
  162. package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
  163. package/dist/components/audio-recorder/index.js +1 -1
  164. package/dist/components/audio-visualiser/index.js +1 -1
  165. package/dist/components/autocomplete/index.js +1 -1
  166. package/dist/components/avatar/index.js +1 -1
  167. package/dist/components/badge/index.js +1 -1
  168. package/dist/components/breadcrumb/index.js +1 -1
  169. package/dist/components/button-group/index.js +1 -1
  170. package/dist/components/chat-container/index.js +1 -1
  171. package/dist/components/chat-message/index.js +1 -1
  172. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  173. package/dist/components/checkbox-group/index.js +1 -1
  174. package/dist/components/color-picker/index.js +1 -1
  175. package/dist/components/combobox/combobox.d.ts.map +1 -1
  176. package/dist/components/combobox/index.js +1 -1
  177. package/dist/components/contact-card/index.js +1 -1
  178. package/dist/components/data-table/index.js +1 -1
  179. package/dist/components/date-picker/index.js +1 -1
  180. package/dist/components/date-range-picker/index.js +1 -1
  181. package/dist/components/date-time-picker/index.js +1 -1
  182. package/dist/components/description-list/index.js +1 -1
  183. package/dist/components/dialog/index.js +1 -1
  184. package/dist/components/file-upload/file-upload.d.ts.map +1 -1
  185. package/dist/components/file-upload/index.js +1 -1
  186. package/dist/components/floating-action-button/index.js +1 -1
  187. package/dist/components/form-field/index.js +1 -1
  188. package/dist/components/freemium-paywall/freemium-paywall.d.ts +2 -2
  189. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  190. package/dist/components/freemium-paywall/index.js +1 -1
  191. package/dist/components/key-value-pair/index.js +1 -1
  192. package/dist/components/link/index.js +1 -1
  193. package/dist/components/list/index.js +1 -1
  194. package/dist/components/message-card/index.js +1 -1
  195. package/dist/components/message-tray/index.js +1 -1
  196. package/dist/components/multi-select/index.js +1 -1
  197. package/dist/components/navigation-menu/index.js +2 -2
  198. package/dist/components/notification-card/index.js +1 -1
  199. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  200. package/dist/components/notification-tray/index.js +1 -1
  201. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  202. package/dist/components/number-input/index.js +1 -1
  203. package/dist/components/otp-input/index.js +1 -1
  204. package/dist/components/pagination/index.js +1 -1
  205. package/dist/components/password-input/index.js +1 -1
  206. package/dist/components/password-input/password-input.d.ts.map +1 -1
  207. package/dist/components/payment-form/index.js +1 -1
  208. package/dist/components/pdf-viewer/index.js +1 -1
  209. package/dist/components/phone-input/index.js +1 -1
  210. package/dist/components/popover/index.js +1 -1
  211. package/dist/components/progress/index.js +1 -1
  212. package/dist/components/recaptcha-widget/index.js +1 -1
  213. package/dist/components/resizable/index.js +1 -1
  214. package/dist/components/search-bar/index.js +1 -1
  215. package/dist/components/search-input/index.js +1 -1
  216. package/dist/components/select/index.js +1 -1
  217. package/dist/components/sheet/index.js +1 -1
  218. package/dist/components/sidebar/index.js +1 -1
  219. package/dist/components/sidebar/sidebar.d.ts +1 -1
  220. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  221. package/dist/components/skip-link/index.js +1 -1
  222. package/dist/components/skip-link/skip-link.d.ts +1 -1
  223. package/dist/components/slider/index.js +1 -1
  224. package/dist/components/sparkline/index.js +1 -1
  225. package/dist/components/spinner/index.js +1 -1
  226. package/dist/components/stat/index.js +1 -1
  227. package/dist/components/switch/index.js +1 -1
  228. package/dist/components/tabs/index.js +1 -1
  229. package/dist/components/tag/index.js +1 -1
  230. package/dist/components/task-card/index.js +1 -1
  231. package/dist/components/task-tray/index.js +1 -1
  232. package/dist/components/text-area/index.js +1 -1
  233. package/dist/components/text-input/index.js +1 -1
  234. package/dist/components/theme-toggle/index.js +1 -1
  235. package/dist/components/time-picker/index.js +1 -1
  236. package/dist/components/timeline/index.js +1 -1
  237. package/dist/components/toast/index.js +1 -1
  238. package/dist/components/transaction-chip/index.js +1 -1
  239. package/dist/components/transcript-panel/index.js +1 -1
  240. package/dist/components/typing-indicator/index.js +1 -1
  241. package/dist/components/typing-indicator/typing-indicator.d.ts +1 -1
  242. package/dist/components/typing-indicator/typing-indicator.d.ts.map +1 -1
  243. package/dist/components/warning-stack/index.js +1 -1
  244. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  245. package/dist/components/workflow/index.js +1 -1
  246. package/dist/i18n/config.d.ts +2 -1
  247. package/dist/i18n/config.d.ts.map +1 -1
  248. package/dist/i18n/config.js +49 -31
  249. package/dist/i18n/config.js.map +1 -1
  250. package/dist/i18n/registerUiBundle.d.ts +15 -0
  251. package/dist/i18n/registerUiBundle.d.ts.map +1 -0
  252. package/dist/index.js +77 -77
  253. package/dist/patterns/leo-assistant/index.js +1 -1
  254. package/dist/patterns/patient-shell/index.js +1 -1
  255. package/dist/tokens.css +1 -1
  256. package/package.json +2 -1
  257. package/dist/_chunks/agenda-card-CalZqycc.js.map +0 -1
  258. package/dist/_chunks/agenda-tray-3ffFDQZC.js.map +0 -1
  259. package/dist/_chunks/ai-prompt-input-DLgY8lrW.js.map +0 -1
  260. package/dist/_chunks/audio-visualiser-ByDEFLNm.js.map +0 -1
  261. package/dist/_chunks/autocomplete-D4oUZbsP.js.map +0 -1
  262. package/dist/_chunks/breadcrumb-D1snXjPb.js.map +0 -1
  263. package/dist/_chunks/button-group-CONver7M.js.map +0 -1
  264. package/dist/_chunks/chat-container-ClzsWXp2.js.map +0 -1
  265. package/dist/_chunks/checkbox-group-CarPLDIC.js.map +0 -1
  266. package/dist/_chunks/color-picker-CTIcHlDF.js.map +0 -1
  267. package/dist/_chunks/combobox-BLWruOxK.js.map +0 -1
  268. package/dist/_chunks/contact-card-DNyATxKv.js.map +0 -1
  269. package/dist/_chunks/date-range-picker-mix2nEVC.js.map +0 -1
  270. package/dist/_chunks/date-time-picker-Dnong_BY.js.map +0 -1
  271. package/dist/_chunks/description-list-BYA77Yud.js.map +0 -1
  272. package/dist/_chunks/file-upload-C947ACDK.js.map +0 -1
  273. package/dist/_chunks/form-field-Bmkeh7WY.js.map +0 -1
  274. package/dist/_chunks/freemium-paywall-B9kIDtm1.js.map +0 -1
  275. package/dist/_chunks/key-value-pair-CgWvAIGb.js.map +0 -1
  276. package/dist/_chunks/list-qP6p0NTw.js.map +0 -1
  277. package/dist/_chunks/message-card-DjvsB_3U.js.map +0 -1
  278. package/dist/_chunks/message-tray-BbnAzlLH.js.map +0 -1
  279. package/dist/_chunks/multi-select-wqqrgjUQ.js.map +0 -1
  280. package/dist/_chunks/navigation-menu-ClbHeawy.js.map +0 -1
  281. package/dist/_chunks/notification-card-uTPEvAQS.js.map +0 -1
  282. package/dist/_chunks/notification-tray-PGtMqXbP.js.map +0 -1
  283. package/dist/_chunks/pagination-3AC4zTsi.js.map +0 -1
  284. package/dist/_chunks/phone-input-CSHJOJ13.js.map +0 -1
  285. package/dist/_chunks/progress-C11tqhoI.js.map +0 -1
  286. package/dist/_chunks/recaptcha-widget-NyfOfLII.js.map +0 -1
  287. package/dist/_chunks/resizable-mpXXyIsN.js.map +0 -1
  288. package/dist/_chunks/select-BOU_Osnf.js.map +0 -1
  289. package/dist/_chunks/sidebar-Bx3wCDyy.js.map +0 -1
  290. package/dist/_chunks/sign-in-with-alfadocs-button-B9UrqOqH.js.map +0 -1
  291. package/dist/_chunks/slider-BT2bZWsy.js.map +0 -1
  292. package/dist/_chunks/sparkline-_gy8aJDG.js.map +0 -1
  293. package/dist/_chunks/spinner-DLaYfLPl.js.map +0 -1
  294. package/dist/_chunks/stat-B9PHSPbN.js.map +0 -1
  295. package/dist/_chunks/tabs-BZQy_Rmb.js.map +0 -1
  296. package/dist/_chunks/tag-DuLMjRbF.js.map +0 -1
  297. package/dist/_chunks/task-card-Dw_ZJDL8.js.map +0 -1
  298. package/dist/_chunks/task-tray-XlIW9ueh.js.map +0 -1
  299. package/dist/_chunks/theme-toggle-B3UR6ouK.js.map +0 -1
  300. package/dist/_chunks/timeline-BvmnQadS.js.map +0 -1
  301. package/dist/_chunks/transcript-panel-Bx5ANMsv.js.map +0 -1
  302. package/dist/_chunks/typing-indicator-BZ5jXZPn.js.map +0 -1
  303. package/dist/_chunks/use-password-requirements-DgEYdN4H.js.map +0 -1
  304. package/dist/_chunks/warning-stack-CdLIe534.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"alert-CVMq99Cq.js","sources":["../../src/components/alert/alert.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n isValidElement,\n useCallback,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Info, CircleCheck, TriangleAlert, CircleX, X } from 'lucide-react';\n\nconst alertVariants = cva(\n [\n // Default `items-center` keeps the icon + dismiss optically aligned\n // with a single-line description. The `data-[has-title=true]`\n // selector flips to `items-start` when an `<Alert.Title>` is\n // present so the icon anchors to the heading's top instead of\n // floating against the centre of the title+description block.\n // For multi-line descriptions without a title, `items-center` still\n // looks right at 2–3 lines and matches Toast / Notification.\n 'ds:flex ds:items-center ds:data-[has-title=true]:items-start ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[length:var(--border-width-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:break-words',\n ].join(' '),\n {\n variants: {\n // Each variant paints `<Button intent=\"tonal\">` descendants via a\n // child selector — the button carries `data-intent=\"tonal\"`, the\n // Alert applies the matching tint (`*-foreground` for bg + the\n // surface `--background` for fg). Descendant selectors sidestep\n // custom-property inheritance and are rock-solid across themes.\n variant: {\n info: [\n 'ds:border-[color:var(--info)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_10%,transparent)]',\n 'ds:text-[var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n success: [\n 'ds:border-[color:var(--success)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_10%,transparent)]',\n 'ds:text-[var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n warning: [\n 'ds:border-[color:var(--warning)]',\n 'ds:bg-[color-mix(in_srgb,var(--warning)_10%,transparent)]',\n 'ds:text-[var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n error: [\n 'ds:border-[color:var(--error)]',\n 'ds:bg-[color-mix(in_srgb,var(--error)_10%,transparent)]',\n 'ds:text-[var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n },\n },\n defaultVariants: {\n variant: 'info',\n },\n },\n);\n\n// Icon stays `mt-0.5` only when an `<Alert.Title>` is present — that\n// offset compensates for the title's cap-height vs. line-box origin so\n// the glyph aligns with the heading's caps. Without a title, the\n// container uses `items-center` and the offset would push the icon\n// 2px off the optical axis.\nconst ICON_BASE = 'ds:shrink-0 ds:size-5';\nconst ICON_WITH_TITLE = `${ICON_BASE} ds:mt-0.5`;\n\nconst CLOSE_BUTTON_CLASSES = [\n 'ds:ms-auto ds:shrink-0 ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:-mt-[var(--spacing-xs)] ds:-me-[var(--spacing-xs)]',\n 'ds:text-current ds:opacity-70',\n 'ds:hover:opacity-100',\n 'ds:transition-opacity ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst VARIANT_CONFIG = {\n info: { icon: <Info aria-hidden=\"true\" />, role: 'status', live: 'polite' },\n success: {\n icon: <CircleCheck aria-hidden=\"true\" />,\n role: 'status',\n live: 'polite',\n },\n warning: {\n icon: <TriangleAlert aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n error: {\n icon: <CircleX aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n} as const;\n\ninterface AlertTitleProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';\n}\n\nconst AlertTitle = forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ as: Tag = 'h5', className, ...props }, ref) => (\n <Tag\n ref={ref}\n className={['type-title-item', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nAlertTitle.displayName = 'Alert.Title';\n\nconst AlertDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n // `mt` is gated on the root's `data-has-title=\"true\"` attribute so\n // the margin only paints when there's a Title above the\n // Description to separate from. Without this gate, a Description\n // rendered alone sits a few pixels below the icon + dismiss ×\n // optical centre — visible on the AlfaDocs marketing privacy\n // generator before HTP-4860's follow-up fix.\n className={[\n 'ds:[[data-has-title=true]_&]:mt-[var(--spacing-xs)] type-body-sm',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nAlertDescription.displayName = 'Alert.Description';\n\nconst AlertAction = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:mt-[var(--spacing-sm)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nAlertAction.displayName = 'Alert.Action';\n\nexport interface AlertProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role'>,\n VariantProps<typeof alertVariants> {\n variant?: 'info' | 'success' | 'warning' | 'error';\n dismissible?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n icon?: ReactNode;\n live?: 'assertive' | 'polite' | 'off';\n}\n\nexport type { AlertTitleProps };\n\nconst AlertRoot = forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n variant = 'info',\n dismissible = false,\n open: controlledOpen,\n onOpenChange,\n icon,\n live,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [internalOpen, setInternalOpen] = useState(true);\n const [isClosing, setIsClosing] = useState(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n if (!isOpen) return null;\n\n const config = VARIANT_CONFIG[variant];\n const effectiveIcon = icon !== undefined ? icon : config.icon;\n\n // Detect an `<Alert.Title>` anywhere in the immediate children so\n // the root can flip its cross-axis alignment. Nested wrappers\n // around a Title aren't supported — keep the API as flat as the\n // existing `Alert.Title` / `Alert.Description` convention.\n const hasTitle = Children.toArray(children).some(\n (child) => isValidElement(child) && child.type === AlertTitle,\n );\n\n const handleDismiss = () => {\n if (isClosing) return;\n setIsClosing(true);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n if (!isControlled) setInternalOpen(false);\n onOpenChange?.(false);\n }, animationDurationMs());\n };\n\n return (\n <div\n ref={ref}\n role={config.role}\n aria-live={live ?? config.live}\n data-component=\"alert\"\n data-has-title={hasTitle ? 'true' : 'false'}\n data-state={isClosing ? 'closing' : 'open'}\n className={[\n alertVariants({ variant, className }),\n // Entry: fade + slide-down on mount. Exit: fade + slide-up + slight\n // scale when dismissed. Driven by `tw-animate-css`. Respects\n // `prefers-reduced-motion` via `motion-safe:` and zeroes under the\n // accessible theme (`--animation-duration: 0ms`).\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-top-2',\n 'ds:motion-safe:data-[state=closing]:animate-out ds:motion-safe:data-[state=closing]:fade-out-0',\n 'ds:motion-safe:data-[state=closing]:slide-out-to-top-2 ds:motion-safe:data-[state=closing]:zoom-out-95',\n // Pin the exit's end-state until React unmounts. Without\n // `fill-mode-forwards` the element snaps back to opacity:1 for one\n // paint frame after the animation ends.\n 'ds:motion-safe:data-[state=closing]:fill-mode-forwards',\n 'ds:motion-safe:duration-[var(--animation-duration)]',\n ].join(' ')}\n {...props}\n >\n {effectiveIcon ? (\n <span className={hasTitle ? ICON_WITH_TITLE : ICON_BASE}>\n {effectiveIcon}\n </span>\n ) : null}\n\n <div className=\"ds:flex-1 ds:min-w-0\">{children}</div>\n\n {dismissible ? (\n <button\n type=\"button\"\n aria-label={t('ui.common.close', 'Close')}\n onClick={handleDismiss}\n className={CLOSE_BUTTON_CLASSES}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : null}\n </div>\n );\n },\n);\n\nAlertRoot.displayName = 'Alert';\n\nexport const Alert = Object.assign(AlertRoot, {\n Title: AlertTitle,\n Description: AlertDescription,\n Action: AlertAction,\n});\n"],"names":["alertVariants","cva","ICON_BASE","ICON_WITH_TITLE","CLOSE_BUTTON_CLASSES","VARIANT_CONFIG","jsx","Info","CircleCheck","TriangleAlert","CircleX","AlertTitle","forwardRef","Tag","className","props","ref","AlertDescription","AlertAction","AlertRoot","variant","dismissible","controlledOpen","onOpenChange","icon","live","children","t","useTranslation","internalOpen","setInternalOpen","useState","isClosing","setIsClosing","closeTimerRef","useRef","isControlled","isOpen","animationDurationMs","useCallback","raw","trimmed","n","config","effectiveIcon","hasTitle","Children","child","isValidElement","handleDismiss","jsxs","Alert"],"mappings":"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"}
1
+ {"version":3,"file":"alert-pgdXrEO5.js","sources":["../../src/components/alert/alert.tsx"],"sourcesContent":["import {\n Children,\n forwardRef,\n isValidElement,\n useCallback,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Info, CircleCheck, TriangleAlert, CircleX, X } from 'lucide-react';\n\nconst alertVariants = cva(\n [\n // Default `items-center` keeps the icon + dismiss optically aligned\n // with a single-line description. The `data-[has-title=true]`\n // selector flips to `items-start` when an `<Alert.Title>` is\n // present so the icon anchors to the heading's top instead of\n // floating against the centre of the title+description block.\n // For multi-line descriptions without a title, `items-center` still\n // looks right at 2–3 lines and matches Toast / Notification.\n 'ds:flex ds:items-center ds:data-[has-title=true]:items-start ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[length:var(--border-width-sm)]',\n 'ds:p-[var(--spacing-md)]',\n 'ds:break-words',\n ].join(' '),\n {\n variants: {\n // Each variant paints `<Button intent=\"tonal\">` descendants via a\n // child selector — the button carries `data-intent=\"tonal\"`, the\n // Alert applies the matching tint (`*-foreground` for bg + the\n // surface `--background` for fg). Descendant selectors sidestep\n // custom-property inheritance and are rock-solid across themes.\n variant: {\n info: [\n 'ds:border-[color:var(--info)]',\n 'ds:bg-[color-mix(in_srgb,var(--info)_10%,transparent)]',\n 'ds:text-[var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--info-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n success: [\n 'ds:border-[color:var(--success)]',\n 'ds:bg-[color-mix(in_srgb,var(--success)_10%,transparent)]',\n 'ds:text-[var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--success-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n warning: [\n 'ds:border-[color:var(--warning)]',\n 'ds:bg-[color-mix(in_srgb,var(--warning)_10%,transparent)]',\n 'ds:text-[var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--warning-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n error: [\n 'ds:border-[color:var(--error)]',\n 'ds:bg-[color-mix(in_srgb,var(--error)_10%,transparent)]',\n 'ds:text-[var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:bg-[color:var(--error-foreground)]',\n 'ds:[&_[data-intent=tonal]]:text-[color:var(--background)]',\n ].join(' '),\n },\n },\n defaultVariants: {\n variant: 'info',\n },\n },\n);\n\n// Icon stays `mt-0.5` only when an `<Alert.Title>` is present — that\n// offset compensates for the title's cap-height vs. line-box origin so\n// the glyph aligns with the heading's caps. Without a title, the\n// container uses `items-center` and the offset would push the icon\n// 2px off the optical axis.\nconst ICON_BASE = 'ds:shrink-0 ds:size-5';\nconst ICON_WITH_TITLE = `${ICON_BASE} ds:mt-0.5`;\n\nconst CLOSE_BUTTON_CLASSES = [\n 'ds:ms-auto ds:shrink-0 ds:inline-flex ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:-mt-[var(--spacing-xs)] ds:-me-[var(--spacing-xs)]',\n 'ds:text-current ds:opacity-70',\n 'ds:hover:opacity-100',\n 'ds:transition-opacity ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n].join(' ');\n\nconst VARIANT_CONFIG = {\n info: { icon: <Info aria-hidden=\"true\" />, role: 'status', live: 'polite' },\n success: {\n icon: <CircleCheck aria-hidden=\"true\" />,\n role: 'status',\n live: 'polite',\n },\n warning: {\n icon: <TriangleAlert aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n error: {\n icon: <CircleX aria-hidden=\"true\" />,\n role: 'alert',\n live: 'assertive',\n },\n} as const;\n\ninterface AlertTitleProps extends HTMLAttributes<HTMLHeadingElement> {\n as?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span';\n}\n\nconst AlertTitle = forwardRef<HTMLHeadingElement, AlertTitleProps>(\n ({ as: Tag = 'h5', className, ...props }, ref) => (\n <Tag\n ref={ref}\n className={['type-title-item', className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nAlertTitle.displayName = 'Alert.Title';\n\nconst AlertDescription = forwardRef<\n HTMLParagraphElement,\n HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n // `mt` is gated on the root's `data-has-title=\"true\"` attribute so\n // the margin only paints when there's a Title above the\n // Description to separate from. Without this gate, a Description\n // rendered alone sits a few pixels below the icon + dismiss ×\n // optical centre — visible on the AlfaDocs marketing privacy\n // generator before HTP-4860's follow-up fix.\n className={[\n 'ds:[[data-has-title=true]_&]:mt-[var(--spacing-xs)] type-body-sm',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nAlertDescription.displayName = 'Alert.Description';\n\nconst AlertAction = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:mt-[var(--spacing-sm)] ds:flex ds:flex-wrap ds:items-center ds:gap-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nAlertAction.displayName = 'Alert.Action';\n\nexport interface AlertProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'role'>,\n VariantProps<typeof alertVariants> {\n variant?: 'info' | 'success' | 'warning' | 'error';\n dismissible?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n icon?: ReactNode;\n live?: 'assertive' | 'polite' | 'off';\n}\n\nexport type { AlertTitleProps };\n\nconst AlertRoot = forwardRef<HTMLDivElement, AlertProps>(\n (\n {\n variant = 'info',\n dismissible = false,\n open: controlledOpen,\n onOpenChange,\n icon,\n live,\n className,\n children,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [internalOpen, setInternalOpen] = useState(true);\n const [isClosing, setIsClosing] = useState(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const animationDurationMs = useCallback((): number => {\n if (typeof window === 'undefined') return 200;\n const raw = window\n .getComputedStyle(document.documentElement)\n .getPropertyValue('--animation-duration');\n if (!raw) return 200;\n const trimmed = raw.trim();\n const n = parseFloat(trimmed);\n if (!Number.isFinite(n)) return 200;\n return trimmed.endsWith('ms') ? n : n * 1000;\n }, []);\n\n if (!isOpen) return null;\n\n const config = VARIANT_CONFIG[variant];\n const effectiveIcon = icon !== undefined ? icon : config.icon;\n\n // Detect an `<Alert.Title>` anywhere in the immediate children so\n // the root can flip its cross-axis alignment. Nested wrappers\n // around a Title aren't supported — keep the API as flat as the\n // existing `Alert.Title` / `Alert.Description` convention.\n const hasTitle = Children.toArray(children).some(\n (child) => isValidElement(child) && child.type === AlertTitle,\n );\n\n const handleDismiss = () => {\n if (isClosing) return;\n setIsClosing(true);\n if (closeTimerRef.current) clearTimeout(closeTimerRef.current);\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n if (!isControlled) setInternalOpen(false);\n onOpenChange?.(false);\n }, animationDurationMs());\n };\n\n return (\n <div\n ref={ref}\n role={config.role}\n aria-live={live ?? config.live}\n data-component=\"alert\"\n data-has-title={hasTitle ? 'true' : 'false'}\n data-state={isClosing ? 'closing' : 'open'}\n className={[\n alertVariants({ variant, className }),\n // Entry: fade + slide-down on mount. Exit: fade + slide-up + slight\n // scale when dismissed. Driven by `tw-animate-css`. Respects\n // `prefers-reduced-motion` via `motion-safe:` and zeroes under the\n // accessible theme (`--animation-duration: 0ms`).\n 'ds:motion-safe:animate-in ds:motion-safe:fade-in-0 ds:motion-safe:slide-in-from-top-2',\n 'ds:motion-safe:data-[state=closing]:animate-out ds:motion-safe:data-[state=closing]:fade-out-0',\n 'ds:motion-safe:data-[state=closing]:slide-out-to-top-2 ds:motion-safe:data-[state=closing]:zoom-out-95',\n // Pin the exit's end-state until React unmounts. Without\n // `fill-mode-forwards` the element snaps back to opacity:1 for one\n // paint frame after the animation ends.\n 'ds:motion-safe:data-[state=closing]:fill-mode-forwards',\n 'ds:motion-safe:duration-[var(--animation-duration)]',\n ].join(' ')}\n {...props}\n >\n {effectiveIcon ? (\n <span className={hasTitle ? ICON_WITH_TITLE : ICON_BASE}>\n {effectiveIcon}\n </span>\n ) : null}\n\n <div className=\"ds:flex-1 ds:min-w-0\">{children}</div>\n\n {dismissible ? (\n <button\n type=\"button\"\n aria-label={t('common.close', 'Close')}\n onClick={handleDismiss}\n className={CLOSE_BUTTON_CLASSES}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : null}\n </div>\n );\n },\n);\n\nAlertRoot.displayName = 'Alert';\n\nexport const Alert = Object.assign(AlertRoot, {\n Title: AlertTitle,\n Description: AlertDescription,\n Action: AlertAction,\n});\n"],"names":["alertVariants","cva","ICON_BASE","ICON_WITH_TITLE","CLOSE_BUTTON_CLASSES","VARIANT_CONFIG","jsx","Info","CircleCheck","TriangleAlert","CircleX","AlertTitle","forwardRef","Tag","className","props","ref","AlertDescription","AlertAction","AlertRoot","variant","dismissible","controlledOpen","onOpenChange","icon","live","children","t","useTranslation","internalOpen","setInternalOpen","useState","isClosing","setIsClosing","closeTimerRef","useRef","isControlled","isOpen","animationDurationMs","useCallback","raw","trimmed","n","config","effectiveIcon","hasTitle","Children","child","isValidElement","handleDismiss","jsxs","Alert"],"mappings":"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"}
@@ -72,7 +72,7 @@ const T = a(
72
72
  mainClassName: b,
73
73
  ...u
74
74
  }, h) => {
75
- const { t: v } = _(), x = m ?? v("ui.navigation.main.label", "Main content"), [w, g] = S(!1), j = V((k) => {
75
+ const { t: v } = _(), x = m ?? v("navigation.main.label", "Main content"), [w, g] = S(!1), j = V((k) => {
76
76
  const e = k.currentTarget.scrollTop > 0;
77
77
  g((o) => o === e ? o : e);
78
78
  }, []);
@@ -118,4 +118,4 @@ I.displayName = "AppFrame";
118
118
  export {
119
119
  I as A
120
120
  };
121
- //# sourceMappingURL=app-frame-CDJOgPXe.js.map
121
+ //# sourceMappingURL=app-frame-BYx1gcV7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-frame-CDJOgPXe.js","sources":["../../src/components/app-frame/app-frame.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* AppFrame — the always-present application shell. */\n/* */\n/* Layout */\n/* ------ */\n/* */\n/* ┌───────────────────────────────────────────────────────────┐ */\n/* │ Header (100% inline-size, block-start) │ */\n/* ├──────────┬──────────────────────────────────┬──────────────┤ */\n/* │ Sidebar │ Main (<main>) │ endSidebar │ */\n/* │ │ │ (optional) │ */\n/* │ │ │ │ */\n/* ├──────────┴──────────────────────────────────┴──────────────┤ */\n/* │ Footer (optional) │ */\n/* └───────────────────────────────────────────────────────────┘ */\n/* */\n/* Header spans the full inline-size of the shell. Sidebar sits beneath */\n/* the header on the inline-start edge and shares the row with <main>. */\n/* `endSidebar`, when provided, sits on the inline-end edge of the same */\n/* row — used for co-pilot / assistant panels (e.g. LeoSidebar) that */\n/* should dock opposite the nav rail. Footer, when provided, spans the */\n/* full inline-size at the block-end. */\n/* */\n/* Responsive behaviour */\n/* --------------------- */\n/* ≥ md viewports: the sidebar slot renders inline-start of the row */\n/* below the header, sticky to the header's block-end, full remaining */\n/* viewport height. */\n/* < md viewports: the sidebar slot is hidden from the inline flow. */\n/* Consumers should control their sidebar's `state` to `'overlay'` */\n/* on small viewports (the Sidebar portals via Radix Dialog so it */\n/* renders outside AppFrame's subtree in that mode) and wire the */\n/* `<HeaderMenuButton>` to toggle it. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type UIEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Canonical app-shell layout: the root is a VIEWPORT-SIZED flex-col with\n// its own overflow clamp. Header and the row fill it together. The only\n// element that scrolls is <main> — so the header never leaves the top\n// and the sidebar never needs position: sticky. This matches the way\n// Gmail / Linear / Notion frame their app surfaces and avoids the\n// flex-item-sticky edge cases that position: sticky has inside a\n// column-flex container.\n//\n// Because the viewport itself never scrolls in this model, the Header's\n// built-in IntersectionObserver (which watches a sentinel against the\n// viewport) cannot detect scroll. AppFrame instead tracks `<main>`'s\n// scrollTop, reflects it onto the root via `data-app-scrolled`, and the\n// descendant selectors below drive the `<header role=\"banner\">` border\n// and shadow — producing the same elevation the Header would show in a\n// viewport-scroll context.\nconst rootVariants = cva(\n [\n 'ds:h-dvh ds:w-full',\n 'ds:flex ds:flex-col',\n 'ds:overflow-hidden',\n 'ds:bg-[var(--background)] ds:text-[color:var(--foreground)]',\n // Elevation cascade driven by main's scrollTop (data-app-scrolled).\n // Mirrors the Header's native scroll-linked recipe (see `Brand/Shadows`\n // — one tier up from rest, never two) so the banner looks identical\n // whether it's in a viewport-scroll context (sticky) or slotted into\n // AppFrame where <main> owns the scroll.\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:shadow-[var(--shadow-md)]',\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n // Forced-colors: UA strips box-shadow, so the border is the only\n // separation cue. Always render it.\n 'ds:forced-colors:[&_[role=banner]]:[border-block-end-color:CanvasText]',\n // Print: strip shadow, keep border so the banner still reads on paper.\n 'ds:print:[&_[role=banner]]:shadow-none',\n 'ds:print:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n ].join(' '),\n);\n\nconst rowVariants = cva(\n ['ds:flex ds:flex-1 ds:items-stretch ds:min-h-0'].join(' '),\n);\n\nconst sidebarSlotVariants = cva(\n [\n // Hidden in the inline flow on mobile — consumers should flip their\n // Sidebar into overlay mode at narrow viewports, where it portals via\n // Radix Dialog and therefore renders outside AppFrame entirely.\n 'ds:hidden ds:md:flex',\n 'ds:shrink-0',\n // The rail fills the row's full height because the row is `flex\n // items-stretch`. No sticky needed — the row itself never scrolls.\n 'ds:h-full',\n ].join(' '),\n);\n\n// Inline-end slot — same hide-on-mobile behaviour as the nav rail because\n// a 22rem co-pilot panel can't share a phone viewport. Consuming apps\n// should flip Leo (or any inline-end panel) to its overlay/popout mode\n// at narrow viewports.\nconst endSidebarSlotVariants = cva(\n ['ds:hidden ds:md:flex', 'ds:shrink-0', 'ds:h-full'].join(' '),\n);\n\nconst mainVariants = cva(\n [\n // <main> owns the scroll: the viewport body never scrolls, but this\n // element does. That keeps the header + sidebar pinned as chrome.\n 'ds:flex-1 ds:min-w-0 ds:overflow-auto',\n // Focusable via the header's SkipLink — tabIndex={-1} is on the\n // element itself so keyboard users land inside the main region.\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n padded: {\n true: [\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n false: '',\n },\n },\n defaultVariants: { padded: true },\n },\n);\n\nconst footerSlotVariants = cva('ds:shrink-0');\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport interface AppFrameProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof mainVariants> {\n /** `<Header>` instance rendered full-width at the block-start of the shell. */\n header: ReactNode;\n /** `<Sidebar>` instance rendered inline-start of the row beneath the header on ≥ md viewports. */\n sidebar: ReactNode;\n /** Main content — rendered inside a `<main>` landmark. */\n children: ReactNode;\n /** Optional inline-end docked panel (typically `<LeoSidebar />`) sharing the same row as the main region on ≥ md viewports. Hidden on narrow viewports — consumers should flip to an overlay/popout mode there. */\n endSidebar?: ReactNode;\n /** Optional block-end footer — renders full-width below the sidebar + main row. */\n footer?: ReactNode;\n /**\n * Id applied to the `<main>` element so `<HeaderSkipLink href=\"#{mainId}\" />`\n * can target it. Must be a valid HTML id (letters, digits, `-`, `_`, no\n * spaces). Defaults to `'main-content'`.\n */\n mainId?: string;\n /**\n * Override the landmark's accessible name. Defaults to the i18n'd\n * `ui.navigation.main.label` (\"Main content\").\n */\n mainAriaLabel?: string;\n /** Extra classes applied to the `<main>` landmark. */\n mainClassName?: string;\n}\n\nexport const AppFrame = forwardRef<HTMLDivElement, AppFrameProps>(\n (\n {\n header,\n sidebar,\n children,\n endSidebar,\n footer,\n mainId = 'main-content',\n mainAriaLabel,\n padded = true,\n className,\n mainClassName,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const mainLabel =\n mainAriaLabel ?? t('ui.navigation.main.label', 'Main content');\n\n const [mainScrolled, setMainScrolled] = useState(false);\n const handleMainScroll = useCallback((event: UIEvent<HTMLElement>) => {\n const next = event.currentTarget.scrollTop > 0;\n setMainScrolled((prev) => (prev === next ? prev : next));\n }, []);\n\n return (\n <div\n ref={ref}\n data-app-scrolled={mainScrolled ? 'true' : undefined}\n data-component=\"app-frame\"\n className={rootVariants({ className })}\n {...rest}\n >\n {/* Header is rendered as a direct flex child — NOT wrapped in a slot\n div — so it sits at the block-start of the shell. The root's\n `overflow-hidden` keeps it pinned; no `position: sticky` needed. */}\n {header}\n <div className={rowVariants()} data-app-frame-slot=\"row\">\n <div className={sidebarSlotVariants()} data-app-frame-slot=\"sidebar\">\n {sidebar}\n </div>\n <main\n id={mainId}\n tabIndex={-1}\n aria-label={mainLabel}\n onScroll={handleMainScroll}\n className={mainVariants({ padded, className: mainClassName })}\n >\n {children}\n </main>\n {endSidebar ? (\n <div\n className={endSidebarSlotVariants()}\n data-app-frame-slot=\"end-sidebar\"\n >\n {endSidebar}\n </div>\n ) : null}\n </div>\n {footer ? (\n <div className={footerSlotVariants()} data-app-frame-slot=\"footer\">\n {footer}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAppFrame.displayName = 'AppFrame';\n"],"names":["rootVariants","cva","rowVariants","sidebarSlotVariants","endSidebarSlotVariants","mainVariants","footerSlotVariants","AppFrame","forwardRef","header","sidebar","children","endSidebar","footer","mainId","mainAriaLabel","padded","className","mainClassName","rest","ref","t","useTranslation","mainLabel","mainScrolled","setMainScrolled","useState","handleMainScroll","useCallback","event","next","prev","jsxs","jsx"],"mappings":";;;;AAiEA,MAAMA,IAAeC;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IAAcD;AAAA,EAClB,CAAC,+CAA+C,EAAE,KAAK,GAAG;AAC5D,GAEME,IAAsBF;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,IAIE;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAMMG,IAAyBH;AAAA,EAC7B,CAAC,wBAAwB,eAAe,WAAW,EAAE,KAAK,GAAG;AAC/D,GAEMI,IAAeJ;AAAA,EACnB;AAAA;AAAA;AAAA,IAGE;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB,EAAE,QAAQ,GAAA;AAAA,EAAK;AAEpC,GAEMK,IAAqBL,EAAI,aAAa,GAmC/BM,IAAWC;AAAA,EACtB,CACE;AAAA,IACE,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,YAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,eAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,WAAAC;AAAA,IACA,eAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IACJR,KAAiBM,EAAE,4BAA4B,cAAc,GAEzD,CAACG,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChDC,IAAmBC,EAAY,CAACC,MAAgC;AACpE,YAAMC,IAAOD,EAAM,cAAc,YAAY;AAC7C,MAAAJ,EAAgB,CAACM,MAAUA,MAASD,IAAOC,IAAOD,CAAK;AAAA,IACzD,GAAG,CAAA,CAAE;AAEL,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAZ;AAAA,QACA,qBAAmBI,IAAe,SAAS;AAAA,QAC3C,kBAAe;AAAA,QACf,WAAWxB,EAAa,EAAE,WAAAiB,GAAW;AAAA,QACpC,GAAGE;AAAA,QAKH,UAAA;AAAA,UAAAV;AAAA,4BACA,OAAA,EAAI,WAAWP,EAAA,GAAe,uBAAoB,OACjD,UAAA;AAAA,YAAA,gBAAA+B,EAAC,SAAI,WAAW9B,EAAA,GAAuB,uBAAoB,WACxD,UAAAO,GACH;AAAA,YACA,gBAAAuB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAInB;AAAA,gBACJ,UAAU;AAAA,gBACV,cAAYS;AAAA,gBACZ,UAAUI;AAAA,gBACV,WAAWtB,EAAa,EAAE,QAAAW,GAAQ,WAAWE,GAAe;AAAA,gBAE3D,UAAAP;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFC,IACC,gBAAAqB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW7B,EAAA;AAAA,gBACX,uBAAoB;AAAA,gBAEnB,UAAAQ;AAAA,cAAA;AAAA,YAAA,IAED;AAAA,UAAA,GACN;AAAA,UACCC,sBACE,OAAA,EAAI,WAAWP,KAAsB,uBAAoB,UACvD,UAAAO,EAAA,CACH,IACE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACAN,EAAS,cAAc;"}
1
+ {"version":3,"file":"app-frame-BYx1gcV7.js","sources":["../../src/components/app-frame/app-frame.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* AppFrame — the always-present application shell. */\n/* */\n/* Layout */\n/* ------ */\n/* */\n/* ┌───────────────────────────────────────────────────────────┐ */\n/* │ Header (100% inline-size, block-start) │ */\n/* ├──────────┬──────────────────────────────────┬──────────────┤ */\n/* │ Sidebar │ Main (<main>) │ endSidebar │ */\n/* │ │ │ (optional) │ */\n/* │ │ │ │ */\n/* ├──────────┴──────────────────────────────────┴──────────────┤ */\n/* │ Footer (optional) │ */\n/* └───────────────────────────────────────────────────────────┘ */\n/* */\n/* Header spans the full inline-size of the shell. Sidebar sits beneath */\n/* the header on the inline-start edge and shares the row with <main>. */\n/* `endSidebar`, when provided, sits on the inline-end edge of the same */\n/* row — used for co-pilot / assistant panels (e.g. LeoSidebar) that */\n/* should dock opposite the nav rail. Footer, when provided, spans the */\n/* full inline-size at the block-end. */\n/* */\n/* Responsive behaviour */\n/* --------------------- */\n/* ≥ md viewports: the sidebar slot renders inline-start of the row */\n/* below the header, sticky to the header's block-end, full remaining */\n/* viewport height. */\n/* < md viewports: the sidebar slot is hidden from the inline flow. */\n/* Consumers should control their sidebar's `state` to `'overlay'` */\n/* on small viewports (the Sidebar portals via Radix Dialog so it */\n/* renders outside AppFrame's subtree in that mode) and wire the */\n/* `<HeaderMenuButton>` to toggle it. */\n/* -------------------------------------------------------------------- */\n\nimport {\n forwardRef,\n useCallback,\n useState,\n type HTMLAttributes,\n type ReactNode,\n type UIEvent,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\n// Canonical app-shell layout: the root is a VIEWPORT-SIZED flex-col with\n// its own overflow clamp. Header and the row fill it together. The only\n// element that scrolls is <main> — so the header never leaves the top\n// and the sidebar never needs position: sticky. This matches the way\n// Gmail / Linear / Notion frame their app surfaces and avoids the\n// flex-item-sticky edge cases that position: sticky has inside a\n// column-flex container.\n//\n// Because the viewport itself never scrolls in this model, the Header's\n// built-in IntersectionObserver (which watches a sentinel against the\n// viewport) cannot detect scroll. AppFrame instead tracks `<main>`'s\n// scrollTop, reflects it onto the root via `data-app-scrolled`, and the\n// descendant selectors below drive the `<header role=\"banner\">` border\n// and shadow — producing the same elevation the Header would show in a\n// viewport-scroll context.\nconst rootVariants = cva(\n [\n 'ds:h-dvh ds:w-full',\n 'ds:flex ds:flex-col',\n 'ds:overflow-hidden',\n 'ds:bg-[var(--background)] ds:text-[color:var(--foreground)]',\n // Elevation cascade driven by main's scrollTop (data-app-scrolled).\n // Mirrors the Header's native scroll-linked recipe (see `Brand/Shadows`\n // — one tier up from rest, never two) so the banner looks identical\n // whether it's in a viewport-scroll context (sticky) or slotted into\n // AppFrame where <main> owns the scroll.\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:shadow-[var(--shadow-md)]',\n 'ds:data-[app-scrolled=true]:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n // Forced-colors: UA strips box-shadow, so the border is the only\n // separation cue. Always render it.\n 'ds:forced-colors:[&_[role=banner]]:[border-block-end-color:CanvasText]',\n // Print: strip shadow, keep border so the banner still reads on paper.\n 'ds:print:[&_[role=banner]]:shadow-none',\n 'ds:print:[&_[role=banner]]:[border-block-end-color:var(--border)]',\n ].join(' '),\n);\n\nconst rowVariants = cva(\n ['ds:flex ds:flex-1 ds:items-stretch ds:min-h-0'].join(' '),\n);\n\nconst sidebarSlotVariants = cva(\n [\n // Hidden in the inline flow on mobile — consumers should flip their\n // Sidebar into overlay mode at narrow viewports, where it portals via\n // Radix Dialog and therefore renders outside AppFrame entirely.\n 'ds:hidden ds:md:flex',\n 'ds:shrink-0',\n // The rail fills the row's full height because the row is `flex\n // items-stretch`. No sticky needed — the row itself never scrolls.\n 'ds:h-full',\n ].join(' '),\n);\n\n// Inline-end slot — same hide-on-mobile behaviour as the nav rail because\n// a 22rem co-pilot panel can't share a phone viewport. Consuming apps\n// should flip Leo (or any inline-end panel) to its overlay/popout mode\n// at narrow viewports.\nconst endSidebarSlotVariants = cva(\n ['ds:hidden ds:md:flex', 'ds:shrink-0', 'ds:h-full'].join(' '),\n);\n\nconst mainVariants = cva(\n [\n // <main> owns the scroll: the viewport body never scrolls, but this\n // element does. That keeps the header + sidebar pinned as chrome.\n 'ds:flex-1 ds:min-w-0 ds:overflow-auto',\n // Focusable via the header's SkipLink — tabIndex={-1} is on the\n // element itself so keyboard users land inside the main region.\n 'ds:focus:outline-none',\n ].join(' '),\n {\n variants: {\n padded: {\n true: [\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n false: '',\n },\n },\n defaultVariants: { padded: true },\n },\n);\n\nconst footerSlotVariants = cva('ds:shrink-0');\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport interface AppFrameProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof mainVariants> {\n /** `<Header>` instance rendered full-width at the block-start of the shell. */\n header: ReactNode;\n /** `<Sidebar>` instance rendered inline-start of the row beneath the header on ≥ md viewports. */\n sidebar: ReactNode;\n /** Main content — rendered inside a `<main>` landmark. */\n children: ReactNode;\n /** Optional inline-end docked panel (typically `<LeoSidebar />`) sharing the same row as the main region on ≥ md viewports. Hidden on narrow viewports — consumers should flip to an overlay/popout mode there. */\n endSidebar?: ReactNode;\n /** Optional block-end footer — renders full-width below the sidebar + main row. */\n footer?: ReactNode;\n /**\n * Id applied to the `<main>` element so `<HeaderSkipLink href=\"#{mainId}\" />`\n * can target it. Must be a valid HTML id (letters, digits, `-`, `_`, no\n * spaces). Defaults to `'main-content'`.\n */\n mainId?: string;\n /**\n * Override the landmark's accessible name. Defaults to the i18n'd\n * `ui.navigation.main.label` (\"Main content\").\n */\n mainAriaLabel?: string;\n /** Extra classes applied to the `<main>` landmark. */\n mainClassName?: string;\n}\n\nexport const AppFrame = forwardRef<HTMLDivElement, AppFrameProps>(\n (\n {\n header,\n sidebar,\n children,\n endSidebar,\n footer,\n mainId = 'main-content',\n mainAriaLabel,\n padded = true,\n className,\n mainClassName,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const mainLabel =\n mainAriaLabel ?? t('navigation.main.label', 'Main content');\n\n const [mainScrolled, setMainScrolled] = useState(false);\n const handleMainScroll = useCallback((event: UIEvent<HTMLElement>) => {\n const next = event.currentTarget.scrollTop > 0;\n setMainScrolled((prev) => (prev === next ? prev : next));\n }, []);\n\n return (\n <div\n ref={ref}\n data-app-scrolled={mainScrolled ? 'true' : undefined}\n data-component=\"app-frame\"\n className={rootVariants({ className })}\n {...rest}\n >\n {/* Header is rendered as a direct flex child — NOT wrapped in a slot\n div — so it sits at the block-start of the shell. The root's\n `overflow-hidden` keeps it pinned; no `position: sticky` needed. */}\n {header}\n <div className={rowVariants()} data-app-frame-slot=\"row\">\n <div className={sidebarSlotVariants()} data-app-frame-slot=\"sidebar\">\n {sidebar}\n </div>\n <main\n id={mainId}\n tabIndex={-1}\n aria-label={mainLabel}\n onScroll={handleMainScroll}\n className={mainVariants({ padded, className: mainClassName })}\n >\n {children}\n </main>\n {endSidebar ? (\n <div\n className={endSidebarSlotVariants()}\n data-app-frame-slot=\"end-sidebar\"\n >\n {endSidebar}\n </div>\n ) : null}\n </div>\n {footer ? (\n <div className={footerSlotVariants()} data-app-frame-slot=\"footer\">\n {footer}\n </div>\n ) : null}\n </div>\n );\n },\n);\nAppFrame.displayName = 'AppFrame';\n"],"names":["rootVariants","cva","rowVariants","sidebarSlotVariants","endSidebarSlotVariants","mainVariants","footerSlotVariants","AppFrame","forwardRef","header","sidebar","children","endSidebar","footer","mainId","mainAriaLabel","padded","className","mainClassName","rest","ref","t","useTranslation","mainLabel","mainScrolled","setMainScrolled","useState","handleMainScroll","useCallback","event","next","prev","jsxs","jsx"],"mappings":";;;;AAiEA,MAAMA,IAAeC;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMC,IAAcD;AAAA,EAClB,CAAC,+CAA+C,EAAE,KAAK,GAAG;AAC5D,GAEME,IAAsBF;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,IAIE;AAAA,IACA;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAMMG,IAAyBH;AAAA,EAC7B,CAAC,wBAAwB,eAAe,WAAW,EAAE,KAAK,GAAG;AAC/D,GAEMI,IAAeJ;AAAA,EACnB;AAAA;AAAA;AAAA,IAGE;AAAA;AAAA;AAAA,IAGA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB,EAAE,QAAQ,GAAA;AAAA,EAAK;AAEpC,GAEMK,IAAqBL,EAAI,aAAa,GAmC/BM,IAAWC;AAAA,EACtB,CACE;AAAA,IACE,QAAAC;AAAA,IACA,SAAAC;AAAA,IACA,UAAAC;AAAA,IACA,YAAAC;AAAA,IACA,QAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,eAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,WAAAC;AAAA,IACA,eAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IACJR,KAAiBM,EAAE,yBAAyB,cAAc,GAEtD,CAACG,GAAcC,CAAe,IAAIC,EAAS,EAAK,GAChDC,IAAmBC,EAAY,CAACC,MAAgC;AACpE,YAAMC,IAAOD,EAAM,cAAc,YAAY;AAC7C,MAAAJ,EAAgB,CAACM,MAAUA,MAASD,IAAOC,IAAOD,CAAK;AAAA,IACzD,GAAG,CAAA,CAAE;AAEL,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAZ;AAAA,QACA,qBAAmBI,IAAe,SAAS;AAAA,QAC3C,kBAAe;AAAA,QACf,WAAWxB,EAAa,EAAE,WAAAiB,GAAW;AAAA,QACpC,GAAGE;AAAA,QAKH,UAAA;AAAA,UAAAV;AAAA,4BACA,OAAA,EAAI,WAAWP,EAAA,GAAe,uBAAoB,OACjD,UAAA;AAAA,YAAA,gBAAA+B,EAAC,SAAI,WAAW9B,EAAA,GAAuB,uBAAoB,WACxD,UAAAO,GACH;AAAA,YACA,gBAAAuB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAInB;AAAA,gBACJ,UAAU;AAAA,gBACV,cAAYS;AAAA,gBACZ,UAAUI;AAAA,gBACV,WAAWtB,EAAa,EAAE,QAAAW,GAAQ,WAAWE,GAAe;AAAA,gBAE3D,UAAAP;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFC,IACC,gBAAAqB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW7B,EAAA;AAAA,gBACX,uBAAoB;AAAA,gBAEnB,UAAAQ;AAAA,cAAA;AAAA,YAAA,IAED;AAAA,UAAA,GACN;AAAA,UACCC,sBACE,OAAA,EAAI,WAAWP,KAAsB,uBAAoB,UACvD,UAAAO,EAAA,CACH,IACE;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACAN,EAAS,cAAc;"}
@@ -1,12 +1,12 @@
1
- import { jsxs as b, jsx as s, Fragment as re } from "react/jsx-runtime";
1
+ import { jsxs as b, jsx as s, Fragment as ie } from "react/jsx-runtime";
2
2
  import { forwardRef as se, useReducer as ae, useState as x, useRef as m, useEffect as D, useCallback as h, useMemo as ne, useImperativeHandle as de } from "react";
3
3
  import { c as ce } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as oe } from "react-i18next";
5
5
  import { B as G } from "./button-DD_0Xdmr.js";
6
6
  import { I as N } from "./icon-button-C4CGcYuz.js";
7
- import { S as ue } from "./select-BOU_Osnf.js";
8
- import { A as pe } from "./audio-visualiser-ByDEFLNm.js";
9
- import { A as F } from "./alert-CVMq99Cq.js";
7
+ import { S as ue } from "./select-i9MwQeQy.js";
8
+ import { A as pe } from "./audio-visualiser-I-T4Z7EU.js";
9
+ import { A as F } from "./alert-pgdXrEO5.js";
10
10
  import { u as le } from "./registry-C9nwlNyL.js";
11
11
  import { c as V } from "./createLucideIcon-CrFbzy84.js";
12
12
  import { S as me } from "./square-CZoGU14v.js";
@@ -54,19 +54,19 @@ const ke = [
54
54
  type: "boolean",
55
55
  descriptionKey: "ui.agent.audioRecorder.state.isRecording",
56
56
  description: "True while actively capturing audio (not paused).",
57
- read: (i) => i.isRecording()
57
+ read: (r) => r.isRecording()
58
58
  },
59
59
  duration: {
60
60
  type: "number",
61
61
  descriptionKey: "ui.agent.audioRecorder.state.duration",
62
62
  description: "Elapsed recording time in milliseconds (paused time excluded).",
63
- read: (i) => i.getDuration()
63
+ read: (r) => r.getDuration()
64
64
  },
65
65
  hasRecording: {
66
66
  type: "boolean",
67
67
  descriptionKey: "ui.agent.audioRecorder.state.hasRecording",
68
68
  description: "True when a completed recording is available for submission.",
69
- read: (i) => i.hasRecording()
69
+ read: (r) => r.hasRecording()
70
70
  }
71
71
  },
72
72
  actions: {
@@ -74,30 +74,30 @@ const ke = [
74
74
  safety: "write",
75
75
  descriptionKey: "ui.agent.audioRecorder.actions.startRecording",
76
76
  description: "Request microphone permission and begin recording.",
77
- invoke: (i) => i.startRecording()
77
+ invoke: (r) => r.startRecording()
78
78
  },
79
79
  stop_recording: {
80
80
  safety: "write",
81
81
  descriptionKey: "ui.agent.audioRecorder.actions.stopRecording",
82
82
  description: "Stop the current recording and finalise the blob.",
83
- invoke: (i) => {
84
- i.stopRecording();
83
+ invoke: (r) => {
84
+ r.stopRecording();
85
85
  }
86
86
  },
87
87
  discard: {
88
88
  safety: "destructive",
89
89
  descriptionKey: "ui.agent.audioRecorder.actions.discard",
90
90
  description: "Cancel the recording. Irreversible — the captured audio is dropped.",
91
- invoke: (i) => {
92
- i.discard();
91
+ invoke: (r) => {
92
+ r.discard();
93
93
  }
94
94
  },
95
95
  submit: {
96
96
  safety: "write",
97
97
  descriptionKey: "ui.agent.audioRecorder.actions.submit",
98
98
  description: "Stop the active recording, finalising it via onRecordingComplete.",
99
- invoke: (i) => {
100
- i.stopRecording();
99
+ invoke: (r) => {
100
+ r.stopRecording();
101
101
  }
102
102
  }
103
103
  },
@@ -114,24 +114,24 @@ const ke = [
114
114
  }
115
115
  }
116
116
  };
117
- function we(i, u) {
117
+ function we(r, u) {
118
118
  switch (u.type) {
119
119
  case "request":
120
120
  return { kind: "requesting" };
121
121
  case "start":
122
122
  return { kind: "recording", startedAt: Date.now(), pausedMs: 0 };
123
123
  case "pause":
124
- return i.kind !== "recording" ? i : {
124
+ return r.kind !== "recording" ? r : {
125
125
  kind: "paused",
126
- startedAt: i.startedAt,
127
- pausedMs: i.pausedMs,
126
+ startedAt: r.startedAt,
127
+ pausedMs: r.pausedMs,
128
128
  pausedAt: Date.now()
129
129
  };
130
130
  case "resume":
131
- return i.kind !== "paused" ? i : {
131
+ return r.kind !== "paused" ? r : {
132
132
  kind: "recording",
133
- startedAt: i.startedAt,
134
- pausedMs: i.pausedMs + (Date.now() - i.pausedAt)
133
+ startedAt: r.startedAt,
134
+ pausedMs: r.pausedMs + (Date.now() - r.pausedAt)
135
135
  };
136
136
  case "stop":
137
137
  return { kind: "stopped", duration: u.duration };
@@ -142,7 +142,7 @@ function we(i, u) {
142
142
  case "reset":
143
143
  return { kind: "idle" };
144
144
  default:
145
- return i;
145
+ return r;
146
146
  }
147
147
  }
148
148
  const Ae = ce(
@@ -170,20 +170,20 @@ const Ae = ce(
170
170
  ];
171
171
  function xe() {
172
172
  if (!(typeof MediaRecorder > "u")) {
173
- for (const i of Me)
174
- if (MediaRecorder.isTypeSupported(i)) return i;
173
+ for (const r of Me)
174
+ if (MediaRecorder.isTypeSupported(r)) return r;
175
175
  }
176
176
  }
177
- function De(i, u) {
178
- const l = Math.max(0, Math.floor(i / 1e3)), r = Math.floor(l / 60), f = l % 60, v = (S) => new Intl.NumberFormat(u, { minimumIntegerDigits: 2 }).format(S);
179
- return `${v(r)}:${v(f)}`;
177
+ function De(r, u) {
178
+ const l = Math.max(0, Math.floor(r / 1e3)), i = Math.floor(l / 60), f = l % 60, v = (S) => new Intl.NumberFormat(u, { minimumIntegerDigits: 2 }).format(S);
179
+ return `${v(i)}:${v(f)}`;
180
180
  }
181
181
  const Ne = se(
182
182
  ({
183
- size: i = "md",
183
+ size: r = "md",
184
184
  onRecordingComplete: u,
185
185
  onCancel: l,
186
- onError: r,
186
+ onError: i,
187
187
  maxDurationMs: f = 1800 * 1e3,
188
188
  maxBytes: v = 250 * 1024 * 1024,
189
189
  className: S,
@@ -207,7 +207,7 @@ const Ne = se(
207
207
  e == null || e.getTracks().forEach((a) => a.stop()), g.current = null, T(null);
208
208
  }, [z]), A = h(async () => {
209
209
  if (!k) {
210
- p({ type: "error", kind: "unsupported" }), r == null || r("unsupported");
210
+ p({ type: "error", kind: "unsupported" }), i == null || i("unsupported");
211
211
  return;
212
212
  }
213
213
  p({ type: "request" }), w.current = !1;
@@ -227,7 +227,7 @@ const Ne = se(
227
227
  c.current = o, y.current = [], _.current = 0, o.ondataavailable = (n) => {
228
228
  var X;
229
229
  if (n.data && n.data.size > 0 && (y.current.push(n.data), _.current += n.data.size, typeof v == "number" && _.current >= v && ((X = c.current) == null ? void 0 : X.state) === "recording")) {
230
- r == null || r("max-size");
230
+ i == null || i("max-size");
231
231
  try {
232
232
  c.current.stop();
233
233
  } catch {
@@ -244,12 +244,12 @@ const Ne = se(
244
244
  }, o.start(1e3), p({ type: "start" });
245
245
  } catch (e) {
246
246
  const a = e instanceof Error ? e.name : "";
247
- a === "NotAllowedError" || a === "SecurityError" ? (p({ type: "error", kind: "permission-denied" }), r == null || r("permission-denied")) : a === "NotFoundError" || a === "OverconstrainedError" ? (p({ type: "error", kind: "no-device" }), r == null || r("no-device")) : (p({ type: "error", kind: "capture-failed" }), r == null || r("capture-failed"));
247
+ a === "NotAllowedError" || a === "SecurityError" ? (p({ type: "error", kind: "permission-denied" }), i == null || i("permission-denied")) : a === "NotFoundError" || a === "OverconstrainedError" ? (p({ type: "error", kind: "no-device" }), i == null || i("no-device")) : (p({ type: "error", kind: "capture-failed" }), i == null || i("capture-failed"));
248
248
  }
249
- }, [r, u, R, k]), te = h(() => {
249
+ }, [i, u, R, k]), te = h(() => {
250
250
  var e;
251
251
  (e = c.current) == null || e.pause(), p({ type: "pause" });
252
- }, []), ie = h(() => {
252
+ }, []), re = h(() => {
253
253
  var e;
254
254
  (e = c.current) == null || e.resume(), p({ type: "resume" });
255
255
  }, []), q = h(() => {
@@ -276,7 +276,7 @@ const Ne = se(
276
276
  const e = Date.now() - t.startedAt - t.pausedMs, a = Math.max(0, f - e), o = window.setTimeout(() => {
277
277
  var n;
278
278
  if (((n = c.current) == null ? void 0 : n.state) === "recording") {
279
- r == null || r("max-duration");
279
+ i == null || i("max-duration");
280
280
  try {
281
281
  c.current.stop();
282
282
  } catch {
@@ -284,7 +284,7 @@ const Ne = se(
284
284
  }
285
285
  }, a);
286
286
  return () => window.clearTimeout(o);
287
- }, [t, f, r]), D(() => () => {
287
+ }, [t, f, i]), D(() => () => {
288
288
  var e, a;
289
289
  B.current = !0;
290
290
  try {
@@ -307,21 +307,21 @@ const Ne = se(
307
307
  de(J, () => P, [P]), le(Re, P, I.id);
308
308
  const C = Z.map((e) => ({
309
309
  value: e.deviceId,
310
- label: e.label || d("ui.chat.audio.selectDevice")
310
+ label: e.label || d("chat.audio.selectDevice")
311
311
  })), O = (() => {
312
312
  switch (t.kind) {
313
313
  case "idle":
314
- return d("ui.chat.audio.idle");
314
+ return d("chat.audio.idle");
315
315
  case "requesting":
316
- return d("ui.common.loading");
316
+ return d("common.loading");
317
317
  case "recording":
318
- return d("ui.chat.audio.recording");
318
+ return d("chat.audio.recording");
319
319
  case "paused":
320
- return d("ui.chat.audio.paused");
320
+ return d("chat.audio.paused");
321
321
  case "stopped":
322
- return d("ui.chat.audio.idle");
322
+ return d("chat.audio.idle");
323
323
  case "error":
324
- return t.type === "permission-denied" ? d("ui.chat.audio.permissionDenied") : t.type === "unsupported" ? d("ui.chat.audio.unsupported") : d("ui.chat.audio.idle");
324
+ return t.type === "permission-denied" ? d("chat.audio.permissionDenied") : t.type === "unsupported" ? d("chat.audio.unsupported") : d("chat.audio.idle");
325
325
  }
326
326
  })(), M = t.kind === "recording", L = t.kind === "paused", U = t.kind === "error";
327
327
  return /* @__PURE__ */ b(
@@ -329,7 +329,7 @@ const Ne = se(
329
329
  {
330
330
  "data-component": "audio-recorder",
331
331
  "data-component-id": I.id,
332
- className: Ae({ size: i, className: S }),
332
+ className: Ae({ size: r, className: S }),
333
333
  ...I,
334
334
  children: [
335
335
  /* @__PURE__ */ b("div", { className: "ds:flex ds:items-center ds:gap-[var(--spacing-sm)]", children: [
@@ -383,14 +383,14 @@ const Ne = se(
383
383
  startIcon: /* @__PURE__ */ s(he, {}),
384
384
  onClick: A,
385
385
  disabled: !k,
386
- children: d("ui.chat.audio.record")
386
+ children: d("chat.audio.record")
387
387
  }
388
388
  ) : null,
389
389
  M ? /* @__PURE__ */ s(
390
390
  N,
391
391
  {
392
392
  icon: /* @__PURE__ */ s(ye, {}),
393
- "aria-label": d("ui.chat.audio.pause"),
393
+ "aria-label": d("chat.audio.pause"),
394
394
  intent: "secondary",
395
395
  size: "sm",
396
396
  onClick: te
@@ -400,18 +400,18 @@ const Ne = se(
400
400
  N,
401
401
  {
402
402
  icon: /* @__PURE__ */ s(be, {}),
403
- "aria-label": d("ui.chat.audio.resume"),
403
+ "aria-label": d("chat.audio.resume"),
404
404
  intent: "secondary",
405
405
  size: "sm",
406
- onClick: ie
406
+ onClick: re
407
407
  }
408
408
  ) : null,
409
- M || L ? /* @__PURE__ */ b(re, { children: [
409
+ M || L ? /* @__PURE__ */ b(ie, { children: [
410
410
  /* @__PURE__ */ s(
411
411
  N,
412
412
  {
413
413
  icon: /* @__PURE__ */ s(me, {}),
414
- "aria-label": d("ui.chat.audio.stop"),
414
+ "aria-label": d("chat.audio.stop"),
415
415
  intent: "primary",
416
416
  size: "sm",
417
417
  onClick: q
@@ -421,7 +421,7 @@ const Ne = se(
421
421
  N,
422
422
  {
423
423
  icon: /* @__PURE__ */ s(fe, {}),
424
- "aria-label": d("ui.chat.audio.cancel"),
424
+ "aria-label": d("chat.audio.cancel"),
425
425
  intent: "ghost",
426
426
  size: "sm",
427
427
  onClick: K
@@ -431,7 +431,7 @@ const Ne = se(
431
431
  t.kind === "idle" && C.length > 1 ? /* @__PURE__ */ s("div", { className: "ds:ms-auto ds:min-w-[160px]", children: /* @__PURE__ */ s(
432
432
  ue,
433
433
  {
434
- "aria-label": d("ui.chat.audio.selectDevice"),
434
+ "aria-label": d("chat.audio.selectDevice"),
435
435
  options: C,
436
436
  value: R,
437
437
  onValueChange: (e) => ee(e),
@@ -442,7 +442,7 @@ const Ne = se(
442
442
  ] }),
443
443
  U && t.kind === "error" ? /* @__PURE__ */ b(F, { variant: "error", live: "polite", children: [
444
444
  /* @__PURE__ */ s(F.Description, { children: O }),
445
- t.type === "permission-denied" ? /* @__PURE__ */ s(F.Action, { children: /* @__PURE__ */ s(G, { intent: "ghost", size: "sm", onClick: A, children: d("ui.chat.audio.retry") }) }) : null
445
+ t.type === "permission-denied" ? /* @__PURE__ */ s(F.Action, { children: /* @__PURE__ */ s(G, { intent: "ghost", size: "sm", onClick: A, children: d("chat.audio.retry") }) }) : null
446
446
  ] }) : null
447
447
  ]
448
448
  }
@@ -454,4 +454,4 @@ export {
454
454
  Ne as A,
455
455
  Re as a
456
456
  };
457
- //# sourceMappingURL=audio-recorder-cOl_Z_Pk.js.map
457
+ //# sourceMappingURL=audio-recorder-BHBonrFf.js.map