@alfadocs/ui-kit 0.0.19 → 0.1.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 (552) hide show
  1. package/dist/_chunks/accordion-BJD1aM67.js +117 -0
  2. package/dist/_chunks/accordion-BJD1aM67.js.map +1 -0
  3. package/dist/_chunks/agenda-card-Bld47Eul.js +130 -0
  4. package/dist/_chunks/agenda-card-Bld47Eul.js.map +1 -0
  5. package/dist/_chunks/agenda-tray-D86cNIJ0.js +119 -0
  6. package/dist/_chunks/agenda-tray-D86cNIJ0.js.map +1 -0
  7. package/dist/_chunks/ai-prompt-input-CdYwt2VP.js +379 -0
  8. package/dist/_chunks/ai-prompt-input-CdYwt2VP.js.map +1 -0
  9. package/dist/_chunks/{alert-C5ud6CfE.js → alert-ETrF7Q8J.js} +51 -51
  10. package/dist/_chunks/alert-ETrF7Q8J.js.map +1 -0
  11. package/dist/_chunks/apexcharts-theme-BkSShpEy.js +48 -0
  12. package/dist/_chunks/apexcharts-theme-BkSShpEy.js.map +1 -0
  13. package/dist/_chunks/{app-frame-CmIUp9BD.js → app-frame-uq2Gy0vs.js} +37 -37
  14. package/dist/_chunks/app-frame-uq2Gy0vs.js.map +1 -0
  15. package/dist/_chunks/aspect-ratio-BqU4itGW.js +56 -0
  16. package/dist/_chunks/aspect-ratio-BqU4itGW.js.map +1 -0
  17. package/dist/_chunks/{audio-recorder-GkGNtW2X.js → audio-recorder-D2UEBF9B.js} +98 -98
  18. package/dist/_chunks/audio-recorder-D2UEBF9B.js.map +1 -0
  19. package/dist/_chunks/{audio-visualiser-CIO3yy23.js → audio-visualiser-B4u4goV5.js} +46 -46
  20. package/dist/_chunks/audio-visualiser-B4u4goV5.js.map +1 -0
  21. package/dist/_chunks/{autocomplete.agent-kb0nmr6F.js → autocomplete.agent-Bi6CiRKa.js} +111 -111
  22. package/dist/_chunks/autocomplete.agent-Bi6CiRKa.js.map +1 -0
  23. package/dist/_chunks/{avatar-BsV7vRA6.js → avatar-BAhxbDEu.js} +38 -38
  24. package/dist/_chunks/avatar-BAhxbDEu.js.map +1 -0
  25. package/dist/_chunks/badge-zDghajh8.js +104 -0
  26. package/dist/_chunks/badge-zDghajh8.js.map +1 -0
  27. package/dist/_chunks/{balance-cell-renderer-BQwN51rT.js → balance-cell-renderer-BGyvZWjB.js} +123 -124
  28. package/dist/_chunks/balance-cell-renderer-BGyvZWjB.js.map +1 -0
  29. package/dist/_chunks/{breadcrumb-DnO6eHSS.js → breadcrumb-pdUacgm1.js} +40 -40
  30. package/dist/_chunks/breadcrumb-pdUacgm1.js.map +1 -0
  31. package/dist/_chunks/button-DmiGFnNA.js +119 -0
  32. package/dist/_chunks/button-DmiGFnNA.js.map +1 -0
  33. package/dist/_chunks/{button-group-CI7LFxt3.js → button-group-BtTHSyU0.js} +24 -24
  34. package/dist/_chunks/button-group-BtTHSyU0.js.map +1 -0
  35. package/dist/_chunks/{calendar-BIXVzhkL.js → calendar-BkDeDTaX.js} +333 -290
  36. package/dist/_chunks/calendar-BkDeDTaX.js.map +1 -0
  37. package/dist/_chunks/card-DeItIBcV.js +158 -0
  38. package/dist/_chunks/card-DeItIBcV.js.map +1 -0
  39. package/dist/_chunks/{chart.agent-DkmVXNsI.js → chart.agent-BdS-_8MO.js} +66 -64
  40. package/dist/_chunks/chart.agent-BdS-_8MO.js.map +1 -0
  41. package/dist/_chunks/chat-container-Co8HpB64.js +174 -0
  42. package/dist/_chunks/chat-container-Co8HpB64.js.map +1 -0
  43. package/dist/_chunks/{chat-input-aphxDjZL.js → chat-input-3rstZhHR.js} +57 -57
  44. package/dist/_chunks/chat-input-3rstZhHR.js.map +1 -0
  45. package/dist/_chunks/{chat-message-CdJSD18D.js → chat-message-dDMVSYBs.js} +66 -66
  46. package/dist/_chunks/chat-message-dDMVSYBs.js.map +1 -0
  47. package/dist/_chunks/checkbox-DMzgtnqw.js +116 -0
  48. package/dist/_chunks/checkbox-DMzgtnqw.js.map +1 -0
  49. package/dist/_chunks/{checkbox-group-D1aqVI0-.js → checkbox-group-DBnIBRT_.js} +34 -34
  50. package/dist/_chunks/checkbox-group-DBnIBRT_.js.map +1 -0
  51. package/dist/_chunks/{collapsible-jBFm7Ah8.js → collapsible-DPGQnHZh.js} +16 -16
  52. package/dist/_chunks/collapsible-DPGQnHZh.js.map +1 -0
  53. package/dist/_chunks/{color-picker-CiotzQJF.js → color-picker-OKKF3Dww.js} +158 -158
  54. package/dist/_chunks/color-picker-OKKF3Dww.js.map +1 -0
  55. package/dist/_chunks/{combobox.agent-B6RwDSct.js → combobox.agent-CfeB-IZ1.js} +107 -107
  56. package/dist/_chunks/combobox.agent-CfeB-IZ1.js.map +1 -0
  57. package/dist/_chunks/{command-palette.agent-B87_OkmC.js → command-palette.agent-XLfSGHCL.js} +27 -27
  58. package/dist/_chunks/command-palette.agent-XLfSGHCL.js.map +1 -0
  59. package/dist/_chunks/{date-picker-CdPuI3dK.js → date-picker-DXx8oSJb.js} +5 -5
  60. package/dist/_chunks/{date-picker-CdPuI3dK.js.map → date-picker-DXx8oSJb.js.map} +1 -1
  61. package/dist/_chunks/{date-range-picker-DfK4cjln.js → date-range-picker-C3CbY__H.js} +29 -29
  62. package/dist/_chunks/{date-range-picker-DfK4cjln.js.map → date-range-picker-C3CbY__H.js.map} +1 -1
  63. package/dist/_chunks/{date-time-picker-CX_FMsLG.js → date-time-picker-Bn3FPeAc.js} +58 -58
  64. package/dist/_chunks/date-time-picker-Bn3FPeAc.js.map +1 -0
  65. package/dist/_chunks/description-list-B1CL3RTG.js +187 -0
  66. package/dist/_chunks/description-list-B1CL3RTG.js.map +1 -0
  67. package/dist/_chunks/{dialog.agent-B276rAQF.js → dialog.agent-D9WeIWi2.js} +39 -39
  68. package/dist/_chunks/dialog.agent-D9WeIWi2.js.map +1 -0
  69. package/dist/_chunks/dropdown-menu-BnVUeVG3.js +210 -0
  70. package/dist/_chunks/dropdown-menu-BnVUeVG3.js.map +1 -0
  71. package/dist/_chunks/{empty-state-DiG7vYBM.js → empty-state-DV96gCnp.js} +37 -37
  72. package/dist/_chunks/empty-state-DV96gCnp.js.map +1 -0
  73. package/dist/_chunks/{file-upload.agent-BMow5yDY.js → file-upload.agent-DYFnqdxw.js} +185 -185
  74. package/dist/_chunks/file-upload.agent-DYFnqdxw.js.map +1 -0
  75. package/dist/_chunks/{flag-ChP784EM.js → flag-C3BUEwHH.js} +14 -14
  76. package/dist/_chunks/{flag-ChP784EM.js.map → flag-C3BUEwHH.js.map} +1 -1
  77. package/dist/_chunks/floating-action-button-RigP2E7o.js +95 -0
  78. package/dist/_chunks/floating-action-button-RigP2E7o.js.map +1 -0
  79. package/dist/_chunks/form-field-DI5LY5aG.js +121 -0
  80. package/dist/_chunks/form-field-DI5LY5aG.js.map +1 -0
  81. package/dist/_chunks/freemium-paywall-D0GiUFOe.js +197 -0
  82. package/dist/_chunks/freemium-paywall-D0GiUFOe.js.map +1 -0
  83. package/dist/_chunks/{header-BpKaSL_v.js → header-CW2oRd5H.js} +111 -111
  84. package/dist/_chunks/header-CW2oRd5H.js.map +1 -0
  85. package/dist/_chunks/icon-button-C482ii4y.js +45 -0
  86. package/dist/_chunks/icon-button-C482ii4y.js.map +1 -0
  87. package/dist/_chunks/{icon-button-group-tERESY-n.js → icon-button-group-BnhkUWUg.js} +56 -56
  88. package/dist/_chunks/icon-button-group-BnhkUWUg.js.map +1 -0
  89. package/dist/_chunks/{kbd-0iPlQjgC.js → kbd-DTcIjYA7.js} +52 -52
  90. package/dist/_chunks/kbd-DTcIjYA7.js.map +1 -0
  91. package/dist/_chunks/{key-value-pair--Je59tAF.js → key-value-pair-DDhSYdDL.js} +26 -26
  92. package/dist/_chunks/key-value-pair-DDhSYdDL.js.map +1 -0
  93. package/dist/_chunks/leo-sidebar-gXXcGPKk.js +755 -0
  94. package/dist/_chunks/leo-sidebar-gXXcGPKk.js.map +1 -0
  95. package/dist/_chunks/{list-n8vI8Yvn.js → list-Cwe8mcmh.js} +96 -96
  96. package/dist/_chunks/list-Cwe8mcmh.js.map +1 -0
  97. package/dist/_chunks/live-region-COggO6x6.js +57 -0
  98. package/dist/_chunks/live-region-COggO6x6.js.map +1 -0
  99. package/dist/_chunks/{logo-UNWYb9p7.js → logo-3wrZGpwg.js} +29 -29
  100. package/dist/_chunks/logo-3wrZGpwg.js.map +1 -0
  101. package/dist/_chunks/{matrix-rain-Q7xTEpKu.js → matrix-rain-gsHqSvW7.js} +75 -75
  102. package/dist/_chunks/matrix-rain-gsHqSvW7.js.map +1 -0
  103. package/dist/_chunks/message-card-DID3cXUW.js +275 -0
  104. package/dist/_chunks/message-card-DID3cXUW.js.map +1 -0
  105. package/dist/_chunks/message-tray-CVMLBnVp.js +302 -0
  106. package/dist/_chunks/message-tray-CVMLBnVp.js.map +1 -0
  107. package/dist/_chunks/{multi-select.agent-Cf4pU636.js → multi-select.agent-BUKYZJfp.js} +126 -126
  108. package/dist/_chunks/multi-select.agent-BUKYZJfp.js.map +1 -0
  109. package/dist/_chunks/{navigation-menu-DBDsAmXc.js → navigation-menu-NjwxyshT.js} +68 -97
  110. package/dist/_chunks/navigation-menu-NjwxyshT.js.map +1 -0
  111. package/dist/_chunks/notification-card-BZ33fq8H.js +255 -0
  112. package/dist/_chunks/notification-card-BZ33fq8H.js.map +1 -0
  113. package/dist/_chunks/{notification-tray-CNWPuPZp.js → notification-tray-CnEd7B2q.js} +96 -96
  114. package/dist/_chunks/notification-tray-CnEd7B2q.js.map +1 -0
  115. package/dist/_chunks/{number-input-B1Th0DdC.js → number-input-D7rSa_ef.js} +73 -73
  116. package/dist/_chunks/number-input-D7rSa_ef.js.map +1 -0
  117. package/dist/_chunks/{otp-input-CmoBuZ4K.js → otp-input-C9R9sC74.js} +42 -42
  118. package/dist/_chunks/otp-input-C9R9sC74.js.map +1 -0
  119. package/dist/_chunks/{pagination.agent-B5KLDCMN.js → pagination.agent-D75FB6XP.js} +106 -106
  120. package/dist/_chunks/pagination.agent-D75FB6XP.js.map +1 -0
  121. package/dist/_chunks/{password-input-DnjNh-hQ.js → password-input-C6PvKyQV.js} +59 -59
  122. package/dist/_chunks/password-input-C6PvKyQV.js.map +1 -0
  123. package/dist/_chunks/{patient-shell-D0RaWDMR.js → patient-shell-CGsmI5LJ.js} +9 -9
  124. package/dist/_chunks/{patient-shell-D0RaWDMR.js.map → patient-shell-CGsmI5LJ.js.map} +1 -1
  125. package/dist/_chunks/{payment-form-Cf7U6r5L.js → payment-form-l3j-gA-t.js} +108 -108
  126. package/dist/_chunks/payment-form-l3j-gA-t.js.map +1 -0
  127. package/dist/_chunks/{pdf-viewer.agent-DXjgDItg.js → pdf-viewer.agent-DuGfSoep.js} +234 -233
  128. package/dist/_chunks/pdf-viewer.agent-DuGfSoep.js.map +1 -0
  129. package/dist/_chunks/{phone-input-C2dtIuxW.js → phone-input-ZWa_FU4R.js} +112 -112
  130. package/dist/_chunks/phone-input-ZWa_FU4R.js.map +1 -0
  131. package/dist/_chunks/{popover-D1woU9mP.js → popover-CMr1pTPO.js} +58 -58
  132. package/dist/_chunks/popover-CMr1pTPO.js.map +1 -0
  133. package/dist/_chunks/{privacy-lock-C1X42Sit.js → privacy-lock-Br5k7Rul.js} +36 -36
  134. package/dist/_chunks/privacy-lock-Br5k7Rul.js.map +1 -0
  135. package/dist/_chunks/{progress-DL3-izuO.js → progress-D4ELgHG3.js} +43 -43
  136. package/dist/_chunks/progress-D4ELgHG3.js.map +1 -0
  137. package/dist/_chunks/radio-B_gvGU29.js +106 -0
  138. package/dist/_chunks/radio-B_gvGU29.js.map +1 -0
  139. package/dist/_chunks/radio-group-Bn8Wt0yc.js +88 -0
  140. package/dist/_chunks/radio-group-Bn8Wt0yc.js.map +1 -0
  141. package/dist/_chunks/{react-day-picker-DQKDiJ37.js → react-day-picker-d0MHsyCj.js} +174 -174
  142. package/dist/_chunks/{react-day-picker-DQKDiJ37.js.map → react-day-picker-d0MHsyCj.js.map} +1 -1
  143. package/dist/_chunks/{resizable.agent-DVk_jJur.js → resizable.agent-DBpPGNdy.js} +122 -122
  144. package/dist/_chunks/resizable.agent-DBpPGNdy.js.map +1 -0
  145. package/dist/_chunks/{rich-text-editor.agent-BOjF4Xao.js → rich-text-editor.agent-C1_E7_7t.js} +225 -225
  146. package/dist/_chunks/rich-text-editor.agent-C1_E7_7t.js.map +1 -0
  147. package/dist/_chunks/scroll-area-Ba99pJ_R.js +144 -0
  148. package/dist/_chunks/scroll-area-Ba99pJ_R.js.map +1 -0
  149. package/dist/_chunks/{search-bar-DgSOAajC.js → search-bar-VoTqJhRp.js} +131 -131
  150. package/dist/_chunks/search-bar-VoTqJhRp.js.map +1 -0
  151. package/dist/_chunks/search-input-D6rarD0_.js +197 -0
  152. package/dist/_chunks/search-input-D6rarD0_.js.map +1 -0
  153. package/dist/_chunks/select-DbxWF3O_.js +320 -0
  154. package/dist/_chunks/select-DbxWF3O_.js.map +1 -0
  155. package/dist/_chunks/{separator-DExI4amU.js → separator-BRQHi8s0.js} +17 -17
  156. package/dist/_chunks/separator-BRQHi8s0.js.map +1 -0
  157. package/dist/_chunks/sheet-DyWqluiS.js +188 -0
  158. package/dist/_chunks/sheet-DyWqluiS.js.map +1 -0
  159. package/dist/_chunks/sidebar-B52iGGNV.js +1076 -0
  160. package/dist/_chunks/sidebar-B52iGGNV.js.map +1 -0
  161. package/dist/_chunks/sign-in-with-alfadocs-button-BU7MP5Hg.js +44 -0
  162. package/dist/_chunks/sign-in-with-alfadocs-button-BU7MP5Hg.js.map +1 -0
  163. package/dist/_chunks/{signature-capture.agent-L_1_-zVR.js → signature-capture.agent-4htVctJ2.js} +163 -163
  164. package/dist/_chunks/signature-capture.agent-4htVctJ2.js.map +1 -0
  165. package/dist/_chunks/skeleton-ClO1v5GE.js +95 -0
  166. package/dist/_chunks/skeleton-ClO1v5GE.js.map +1 -0
  167. package/dist/_chunks/skip-link-CASJkBOe.js +68 -0
  168. package/dist/_chunks/skip-link-CASJkBOe.js.map +1 -0
  169. package/dist/_chunks/slider-n8JWpJvT.js +273 -0
  170. package/dist/_chunks/slider-n8JWpJvT.js.map +1 -0
  171. package/dist/_chunks/slot-grid-BRAkqChA.js +491 -0
  172. package/dist/_chunks/slot-grid-BRAkqChA.js.map +1 -0
  173. package/dist/_chunks/{sparkline.agent-BDTXzTy9.js → sparkline.agent-BLY1IMyW.js} +45 -45
  174. package/dist/_chunks/sparkline.agent-BLY1IMyW.js.map +1 -0
  175. package/dist/_chunks/{spinner-77xUGpuX.js → spinner-CoAOGcDa.js} +40 -40
  176. package/dist/_chunks/spinner-CoAOGcDa.js.map +1 -0
  177. package/dist/_chunks/stat-D76MNHzK.js +208 -0
  178. package/dist/_chunks/stat-D76MNHzK.js.map +1 -0
  179. package/dist/_chunks/{stepper-accordion-BkvqQWPI.js → stepper-accordion-DHQ80A4v.js} +33 -33
  180. package/dist/_chunks/stepper-accordion-DHQ80A4v.js.map +1 -0
  181. package/dist/_chunks/{stepper-calendar-BQMjrwzo.js → stepper-calendar-vtWwa2bY.js} +159 -159
  182. package/dist/_chunks/stepper-calendar-vtWwa2bY.js.map +1 -0
  183. package/dist/_chunks/stepper-progress-DMZ5w5VR.js +128 -0
  184. package/dist/_chunks/stepper-progress-DMZ5w5VR.js.map +1 -0
  185. package/dist/_chunks/streaming-text-D0cW8pwq.js +104 -0
  186. package/dist/_chunks/streaming-text-D0cW8pwq.js.map +1 -0
  187. package/dist/_chunks/suggestion-chip-BgNFpPEE.js +157 -0
  188. package/dist/_chunks/suggestion-chip-BgNFpPEE.js.map +1 -0
  189. package/dist/_chunks/switch-DtLPKO0p.js +137 -0
  190. package/dist/_chunks/switch-DtLPKO0p.js.map +1 -0
  191. package/dist/_chunks/{tabs.agent-FsGU3sZL.js → tabs.agent-BDUlyPbJ.js} +101 -101
  192. package/dist/_chunks/tabs.agent-BDUlyPbJ.js.map +1 -0
  193. package/dist/_chunks/tag-CfSZZN2f.js +194 -0
  194. package/dist/_chunks/tag-CfSZZN2f.js.map +1 -0
  195. package/dist/_chunks/task-card-B5xfiFg5.js +112 -0
  196. package/dist/_chunks/task-card-B5xfiFg5.js.map +1 -0
  197. package/dist/_chunks/task-tray-BnpiodZ4.js +99 -0
  198. package/dist/_chunks/task-tray-BnpiodZ4.js.map +1 -0
  199. package/dist/_chunks/text-area-BqbruBWx.js +152 -0
  200. package/dist/_chunks/text-area-BqbruBWx.js.map +1 -0
  201. package/dist/_chunks/text-input-lh6kRXZS.js +187 -0
  202. package/dist/_chunks/text-input-lh6kRXZS.js.map +1 -0
  203. package/dist/_chunks/theme-toggle-BHKMiORD.js +326 -0
  204. package/dist/_chunks/theme-toggle-BHKMiORD.js.map +1 -0
  205. package/dist/_chunks/{time-picker-BapZq0OY.js → time-picker-DbpAmPux.js} +102 -102
  206. package/dist/_chunks/time-picker-DbpAmPux.js.map +1 -0
  207. package/dist/_chunks/timeline-vjsUeuq1.js +219 -0
  208. package/dist/_chunks/timeline-vjsUeuq1.js.map +1 -0
  209. package/dist/_chunks/{timestamp-BLM-jjdw.js → timestamp-DmSt92P1.js} +30 -30
  210. package/dist/_chunks/timestamp-DmSt92P1.js.map +1 -0
  211. package/dist/_chunks/{toast-DSCqnDRl.js → toast-DllSITLf.js} +151 -151
  212. package/dist/_chunks/{toast-DSCqnDRl.js.map → toast-DllSITLf.js.map} +1 -1
  213. package/dist/_chunks/{tooltip-DF6WjD1r.js → tooltip-Dp3u8jGz.js} +30 -30
  214. package/dist/_chunks/tooltip-Dp3u8jGz.js.map +1 -0
  215. package/dist/_chunks/{tooth-scheme.agent-CFKl3iQr.js → tooth-scheme.agent-BRqxWa1D.js} +75 -75
  216. package/dist/_chunks/tooth-scheme.agent-BRqxWa1D.js.map +1 -0
  217. package/dist/_chunks/transcript-panel-Bg1BTMSr.js +265 -0
  218. package/dist/_chunks/transcript-panel-Bg1BTMSr.js.map +1 -0
  219. package/dist/_chunks/typing-indicator-BRg22Rqr.js +81 -0
  220. package/dist/_chunks/typing-indicator-BRg22Rqr.js.map +1 -0
  221. package/dist/_chunks/use-locale-BuXR_Zl9.js +32 -0
  222. package/dist/_chunks/use-locale-BuXR_Zl9.js.map +1 -0
  223. package/dist/_chunks/visually-hidden-Y3jcdCv-.js +21 -0
  224. package/dist/_chunks/visually-hidden-Y3jcdCv-.js.map +1 -0
  225. package/dist/_chunks/{warning-stack-Cyf_81SL.js → warning-stack-B9N9yWet.js} +38 -38
  226. package/dist/_chunks/warning-stack-B9N9yWet.js.map +1 -0
  227. package/dist/_chunks/{workflow-map-Uf-hHAO3.js → workflow-map-gBhL_Wrs.js} +385 -385
  228. package/dist/_chunks/workflow-map-gBhL_Wrs.js.map +1 -0
  229. package/dist/agent-catalog.json +1 -1
  230. package/dist/components/_shared/index.d.ts +2 -0
  231. package/dist/components/_shared/index.d.ts.map +1 -1
  232. package/dist/components/_shared/use-focus-trap.d.ts +32 -0
  233. package/dist/components/_shared/use-focus-trap.d.ts.map +1 -0
  234. package/dist/components/_shared/use-neutralize-hidden-focus.d.ts +3 -0
  235. package/dist/components/_shared/use-neutralize-hidden-focus.d.ts.map +1 -0
  236. package/dist/components/accordion/index.js +1 -1
  237. package/dist/components/agenda-card/index.js +1 -1
  238. package/dist/components/agenda-tray/index.js +1 -1
  239. package/dist/components/ai-prompt-input/index.js +1 -1
  240. package/dist/components/alert/index.js +1 -1
  241. package/dist/components/app-frame/index.js +1 -1
  242. package/dist/components/aspect-ratio/index.js +1 -1
  243. package/dist/components/audio-recorder/index.js +1 -1
  244. package/dist/components/audio-visualiser/index.js +1 -1
  245. package/dist/components/autocomplete/index.js +1 -1
  246. package/dist/components/avatar/index.js +1 -1
  247. package/dist/components/badge/index.js +1 -1
  248. package/dist/components/breadcrumb/index.js +1 -1
  249. package/dist/components/button/index.js +2 -2
  250. package/dist/components/button-group/index.js +1 -1
  251. package/dist/components/calendar/calendar.d.ts.map +1 -1
  252. package/dist/components/calendar/index.js +1 -1
  253. package/dist/components/card/index.js +1 -1
  254. package/dist/components/chart/chart.d.ts.map +1 -1
  255. package/dist/components/chart/index.js +1 -1
  256. package/dist/components/chat-container/index.js +1 -1
  257. package/dist/components/chat-input/index.js +1 -1
  258. package/dist/components/chat-message/index.js +1 -1
  259. package/dist/components/checkbox/index.js +1 -1
  260. package/dist/components/checkbox-group/index.js +1 -1
  261. package/dist/components/collapsible/index.js +1 -1
  262. package/dist/components/color-picker/index.js +1 -1
  263. package/dist/components/combobox/index.js +1 -1
  264. package/dist/components/command-palette/index.js +1 -1
  265. package/dist/components/data-table/index.js +1 -1
  266. package/dist/components/data-table/toolbar.d.ts.map +1 -1
  267. package/dist/components/date-picker/index.js +1 -1
  268. package/dist/components/date-range-picker/index.js +1 -1
  269. package/dist/components/date-time-picker/index.js +1 -1
  270. package/dist/components/description-list/index.js +1 -1
  271. package/dist/components/dialog/index.js +1 -1
  272. package/dist/components/dropdown-menu/index.js +1 -1
  273. package/dist/components/empty-state/index.js +1 -1
  274. package/dist/components/file-upload/index.js +1 -1
  275. package/dist/components/flag/index.js +1 -1
  276. package/dist/components/floating-action-button/index.js +1 -1
  277. package/dist/components/form-field/index.js +1 -1
  278. package/dist/components/freemium-paywall/index.js +1 -1
  279. package/dist/components/header/index.js +1 -1
  280. package/dist/components/icon-button/index.d.ts +3 -0
  281. package/dist/components/icon-button/index.d.ts.map +1 -0
  282. package/dist/components/icon-button/index.js +5 -0
  283. package/dist/components/icon-button/index.js.map +1 -0
  284. package/dist/components/icon-button-group/index.js +1 -1
  285. package/dist/components/index.d.ts +8 -2
  286. package/dist/components/index.d.ts.map +1 -1
  287. package/dist/components/kbd/index.js +1 -1
  288. package/dist/components/key-value-pair/index.js +1 -1
  289. package/dist/components/list/index.js +1 -1
  290. package/dist/components/live-region/index.d.ts +3 -0
  291. package/dist/components/live-region/index.d.ts.map +1 -0
  292. package/dist/components/live-region/index.js +5 -0
  293. package/dist/components/live-region/index.js.map +1 -0
  294. package/dist/components/live-region/live-region.d.ts +49 -0
  295. package/dist/components/live-region/live-region.d.ts.map +1 -0
  296. package/dist/components/logo/index.js +1 -1
  297. package/dist/components/matrix-rain/index.js +1 -1
  298. package/dist/components/message-card/index.js +1 -1
  299. package/dist/components/message-tray/index.js +1 -1
  300. package/dist/components/multi-select/index.js +1 -1
  301. package/dist/components/navigation-menu/index.d.ts +4 -2
  302. package/dist/components/navigation-menu/index.d.ts.map +1 -1
  303. package/dist/components/navigation-menu/index.js +3 -2
  304. package/dist/components/navigation-menu/index.js.map +1 -1
  305. package/dist/components/navigation-menu/navigation-menu.d.ts +2 -6
  306. package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
  307. package/dist/components/notification-card/index.js +1 -1
  308. package/dist/components/notification-tray/index.js +1 -1
  309. package/dist/components/number-input/index.js +1 -1
  310. package/dist/components/otp-input/index.js +1 -1
  311. package/dist/components/pagination/index.js +1 -1
  312. package/dist/components/password-input/index.js +1 -1
  313. package/dist/components/payment-form/index.js +1 -1
  314. package/dist/components/pdf-viewer/index.js +1 -1
  315. package/dist/components/pdf-viewer/pdf-viewer.d.ts.map +1 -1
  316. package/dist/components/phone-input/index.js +1 -1
  317. package/dist/components/popover/index.js +1 -1
  318. package/dist/components/privacy-lock/index.js +1 -1
  319. package/dist/components/progress/index.js +1 -1
  320. package/dist/components/radio/index.d.ts +3 -0
  321. package/dist/components/radio/index.d.ts.map +1 -0
  322. package/dist/components/radio/index.js +5 -0
  323. package/dist/components/radio/index.js.map +1 -0
  324. package/dist/components/radio-group/index.js +4 -3
  325. package/dist/components/radio-group/index.js.map +1 -1
  326. package/dist/components/resizable/index.js +1 -1
  327. package/dist/components/rich-text-editor/index.js +1 -1
  328. package/dist/components/scroll-area/index.js +1 -1
  329. package/dist/components/search-bar/index.js +1 -1
  330. package/dist/components/search-input/index.js +1 -1
  331. package/dist/components/select/index.js +1 -1
  332. package/dist/components/separator/index.js +1 -1
  333. package/dist/components/sheet/index.js +1 -1
  334. package/dist/components/sidebar/index.js +1 -1
  335. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  336. package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts +20 -0
  337. package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +1 -1
  338. package/dist/components/signature-capture/index.js +1 -1
  339. package/dist/components/skeleton/index.js +1 -1
  340. package/dist/components/skip-link/index.d.ts +2 -0
  341. package/dist/components/skip-link/index.d.ts.map +1 -0
  342. package/dist/components/skip-link/index.js +5 -0
  343. package/dist/components/skip-link/index.js.map +1 -0
  344. package/dist/components/skip-link/skip-link.d.ts +34 -0
  345. package/dist/components/skip-link/skip-link.d.ts.map +1 -0
  346. package/dist/components/slider/index.js +1 -1
  347. package/dist/components/slot-grid/index.js +1 -1
  348. package/dist/components/sparkline/index.js +1 -1
  349. package/dist/components/sparkline/sparkline.d.ts.map +1 -1
  350. package/dist/components/spinner/index.js +1 -1
  351. package/dist/components/stat/index.js +1 -1
  352. package/dist/components/stepper-accordion/index.js +1 -1
  353. package/dist/components/stepper-calendar/index.js +1 -1
  354. package/dist/components/stepper-progress/index.js +1 -1
  355. package/dist/components/streaming-text/index.js +1 -1
  356. package/dist/components/suggestion-chip/index.js +1 -1
  357. package/dist/components/switch/index.js +1 -1
  358. package/dist/components/tabs/index.js +1 -1
  359. package/dist/components/tag/index.js +1 -1
  360. package/dist/components/task-card/index.js +1 -1
  361. package/dist/components/task-tray/index.js +1 -1
  362. package/dist/components/text-area/index.js +1 -1
  363. package/dist/components/text-input/index.js +1 -1
  364. package/dist/components/theme-toggle/index.d.ts +3 -0
  365. package/dist/components/theme-toggle/index.d.ts.map +1 -0
  366. package/dist/components/theme-toggle/index.js +5 -0
  367. package/dist/components/theme-toggle/index.js.map +1 -0
  368. package/dist/components/theme-toggle/theme-toggle.d.ts +34 -0
  369. package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -0
  370. package/dist/components/time-picker/index.js +1 -1
  371. package/dist/components/timeline/index.js +1 -1
  372. package/dist/components/timestamp/index.js +1 -1
  373. package/dist/components/toast/index.js +1 -1
  374. package/dist/components/tooltip/index.js +1 -1
  375. package/dist/components/tooth-scheme/index.js +1 -1
  376. package/dist/components/transcript-panel/index.js +1 -1
  377. package/dist/components/typing-indicator/index.js +1 -1
  378. package/dist/components/visually-hidden/index.d.ts +2 -0
  379. package/dist/components/visually-hidden/index.d.ts.map +1 -0
  380. package/dist/components/visually-hidden/index.js +5 -0
  381. package/dist/components/visually-hidden/index.js.map +1 -0
  382. package/dist/components/visually-hidden/visually-hidden.d.ts +11 -0
  383. package/dist/components/visually-hidden/visually-hidden.d.ts.map +1 -0
  384. package/dist/components/warning-stack/index.js +1 -1
  385. package/dist/components/workflow/index.js +1 -1
  386. package/dist/hooks/index.d.ts +3 -0
  387. package/dist/hooks/index.d.ts.map +1 -1
  388. package/dist/hooks/index.js +10 -7
  389. package/dist/hooks/index.js.map +1 -1
  390. package/dist/hooks/use-locale.d.ts +27 -0
  391. package/dist/hooks/use-locale.d.ts.map +1 -0
  392. package/dist/hooks/use-media-query.d.ts +17 -0
  393. package/dist/hooks/use-media-query.d.ts.map +1 -0
  394. package/dist/i18n/config.js +59 -2
  395. package/dist/i18n/config.js.map +1 -1
  396. package/dist/i18n/resources.d.ts +57 -0
  397. package/dist/i18n/resources.d.ts.map +1 -1
  398. package/dist/index.js +442 -431
  399. package/dist/index.js.map +1 -1
  400. package/dist/locales/de.json +19 -0
  401. package/dist/locales/en.json +19 -0
  402. package/dist/locales/it.json +19 -0
  403. package/dist/patterns/leo-assistant/index.js +1 -1
  404. package/dist/patterns/patient-shell/index.js +1 -1
  405. package/dist/tokens.css +2 -2
  406. package/package.json +4 -2
  407. package/dist/_chunks/accordion-Dgcd38U_.js +0 -117
  408. package/dist/_chunks/accordion-Dgcd38U_.js.map +0 -1
  409. package/dist/_chunks/agenda-card-B2gq-gTq.js +0 -130
  410. package/dist/_chunks/agenda-card-B2gq-gTq.js.map +0 -1
  411. package/dist/_chunks/agenda-tray-twa8g_87.js +0 -119
  412. package/dist/_chunks/agenda-tray-twa8g_87.js.map +0 -1
  413. package/dist/_chunks/ai-prompt-input-C6IY_Eds.js +0 -379
  414. package/dist/_chunks/ai-prompt-input-C6IY_Eds.js.map +0 -1
  415. package/dist/_chunks/alert-C5ud6CfE.js.map +0 -1
  416. package/dist/_chunks/apexcharts-theme-cpBYmCcr.js +0 -17
  417. package/dist/_chunks/apexcharts-theme-cpBYmCcr.js.map +0 -1
  418. package/dist/_chunks/app-frame-CmIUp9BD.js.map +0 -1
  419. package/dist/_chunks/aspect-ratio-Bo3cZXmR.js +0 -56
  420. package/dist/_chunks/aspect-ratio-Bo3cZXmR.js.map +0 -1
  421. package/dist/_chunks/audio-recorder-GkGNtW2X.js.map +0 -1
  422. package/dist/_chunks/audio-visualiser-CIO3yy23.js.map +0 -1
  423. package/dist/_chunks/autocomplete.agent-kb0nmr6F.js.map +0 -1
  424. package/dist/_chunks/avatar-BsV7vRA6.js.map +0 -1
  425. package/dist/_chunks/badge--CmSr7ok.js +0 -104
  426. package/dist/_chunks/badge--CmSr7ok.js.map +0 -1
  427. package/dist/_chunks/balance-cell-renderer-BQwN51rT.js.map +0 -1
  428. package/dist/_chunks/breadcrumb-DnO6eHSS.js.map +0 -1
  429. package/dist/_chunks/button-CXL8bA8G.js +0 -119
  430. package/dist/_chunks/button-CXL8bA8G.js.map +0 -1
  431. package/dist/_chunks/button-group-CI7LFxt3.js.map +0 -1
  432. package/dist/_chunks/calendar-BIXVzhkL.js.map +0 -1
  433. package/dist/_chunks/card-n97MNPP2.js +0 -158
  434. package/dist/_chunks/card-n97MNPP2.js.map +0 -1
  435. package/dist/_chunks/chart.agent-DkmVXNsI.js.map +0 -1
  436. package/dist/_chunks/chat-container-SR3UWxbL.js +0 -174
  437. package/dist/_chunks/chat-container-SR3UWxbL.js.map +0 -1
  438. package/dist/_chunks/chat-input-aphxDjZL.js.map +0 -1
  439. package/dist/_chunks/chat-message-CdJSD18D.js.map +0 -1
  440. package/dist/_chunks/checkbox-CfiZ0FZc.js +0 -116
  441. package/dist/_chunks/checkbox-CfiZ0FZc.js.map +0 -1
  442. package/dist/_chunks/checkbox-group-D1aqVI0-.js.map +0 -1
  443. package/dist/_chunks/collapsible-jBFm7Ah8.js.map +0 -1
  444. package/dist/_chunks/color-picker-CiotzQJF.js.map +0 -1
  445. package/dist/_chunks/combobox.agent-B6RwDSct.js.map +0 -1
  446. package/dist/_chunks/command-palette.agent-B87_OkmC.js.map +0 -1
  447. package/dist/_chunks/date-time-picker-CX_FMsLG.js.map +0 -1
  448. package/dist/_chunks/description-list-C5UPZgX6.js +0 -187
  449. package/dist/_chunks/description-list-C5UPZgX6.js.map +0 -1
  450. package/dist/_chunks/dialog.agent-B276rAQF.js.map +0 -1
  451. package/dist/_chunks/dropdown-menu-CJKvK7VG.js +0 -210
  452. package/dist/_chunks/dropdown-menu-CJKvK7VG.js.map +0 -1
  453. package/dist/_chunks/empty-state-DiG7vYBM.js.map +0 -1
  454. package/dist/_chunks/file-upload.agent-BMow5yDY.js.map +0 -1
  455. package/dist/_chunks/floating-action-button-BM9ib-Wf.js +0 -95
  456. package/dist/_chunks/floating-action-button-BM9ib-Wf.js.map +0 -1
  457. package/dist/_chunks/form-field-B4bwrccN.js +0 -121
  458. package/dist/_chunks/form-field-B4bwrccN.js.map +0 -1
  459. package/dist/_chunks/freemium-paywall-DVyNsQHS.js +0 -197
  460. package/dist/_chunks/freemium-paywall-DVyNsQHS.js.map +0 -1
  461. package/dist/_chunks/header-BpKaSL_v.js.map +0 -1
  462. package/dist/_chunks/icon-button-C1vpylg3.js +0 -45
  463. package/dist/_chunks/icon-button-C1vpylg3.js.map +0 -1
  464. package/dist/_chunks/icon-button-group-tERESY-n.js.map +0 -1
  465. package/dist/_chunks/kbd-0iPlQjgC.js.map +0 -1
  466. package/dist/_chunks/key-value-pair--Je59tAF.js.map +0 -1
  467. package/dist/_chunks/leo-sidebar-9A9AWBxX.js +0 -755
  468. package/dist/_chunks/leo-sidebar-9A9AWBxX.js.map +0 -1
  469. package/dist/_chunks/list-n8vI8Yvn.js.map +0 -1
  470. package/dist/_chunks/logo-UNWYb9p7.js.map +0 -1
  471. package/dist/_chunks/matrix-rain-Q7xTEpKu.js.map +0 -1
  472. package/dist/_chunks/message-card-g5VS5Q80.js +0 -275
  473. package/dist/_chunks/message-card-g5VS5Q80.js.map +0 -1
  474. package/dist/_chunks/message-tray-CAk-iibU.js +0 -302
  475. package/dist/_chunks/message-tray-CAk-iibU.js.map +0 -1
  476. package/dist/_chunks/multi-select.agent-Cf4pU636.js.map +0 -1
  477. package/dist/_chunks/navigation-menu-DBDsAmXc.js.map +0 -1
  478. package/dist/_chunks/notification-card-CQxJporb.js +0 -255
  479. package/dist/_chunks/notification-card-CQxJporb.js.map +0 -1
  480. package/dist/_chunks/notification-tray-CNWPuPZp.js.map +0 -1
  481. package/dist/_chunks/number-input-B1Th0DdC.js.map +0 -1
  482. package/dist/_chunks/otp-input-CmoBuZ4K.js.map +0 -1
  483. package/dist/_chunks/pagination.agent-B5KLDCMN.js.map +0 -1
  484. package/dist/_chunks/password-input-DnjNh-hQ.js.map +0 -1
  485. package/dist/_chunks/payment-form-Cf7U6r5L.js.map +0 -1
  486. package/dist/_chunks/pdf-viewer.agent-DXjgDItg.js.map +0 -1
  487. package/dist/_chunks/phone-input-C2dtIuxW.js.map +0 -1
  488. package/dist/_chunks/popover-D1woU9mP.js.map +0 -1
  489. package/dist/_chunks/privacy-lock-C1X42Sit.js.map +0 -1
  490. package/dist/_chunks/progress-DL3-izuO.js.map +0 -1
  491. package/dist/_chunks/radio-group-CXN9qNPe.js +0 -185
  492. package/dist/_chunks/radio-group-CXN9qNPe.js.map +0 -1
  493. package/dist/_chunks/resizable.agent-DVk_jJur.js.map +0 -1
  494. package/dist/_chunks/rich-text-editor.agent-BOjF4Xao.js.map +0 -1
  495. package/dist/_chunks/scroll-area-DXn-YWHY.js +0 -144
  496. package/dist/_chunks/scroll-area-DXn-YWHY.js.map +0 -1
  497. package/dist/_chunks/search-bar-DgSOAajC.js.map +0 -1
  498. package/dist/_chunks/search-input-D4tC_Prn.js +0 -197
  499. package/dist/_chunks/search-input-D4tC_Prn.js.map +0 -1
  500. package/dist/_chunks/select-B4m4upMg.js +0 -320
  501. package/dist/_chunks/select-B4m4upMg.js.map +0 -1
  502. package/dist/_chunks/separator-DExI4amU.js.map +0 -1
  503. package/dist/_chunks/sheet-D6XOx0fK.js +0 -188
  504. package/dist/_chunks/sheet-D6XOx0fK.js.map +0 -1
  505. package/dist/_chunks/sidebar-r645O-k9.js +0 -1076
  506. package/dist/_chunks/sidebar-r645O-k9.js.map +0 -1
  507. package/dist/_chunks/sign-in-with-alfadocs-button-y3gy-W-D.js +0 -38
  508. package/dist/_chunks/sign-in-with-alfadocs-button-y3gy-W-D.js.map +0 -1
  509. package/dist/_chunks/signature-capture.agent-L_1_-zVR.js.map +0 -1
  510. package/dist/_chunks/skeleton-vbTWUntB.js +0 -95
  511. package/dist/_chunks/skeleton-vbTWUntB.js.map +0 -1
  512. package/dist/_chunks/slider-B3DBwmcm.js +0 -273
  513. package/dist/_chunks/slider-B3DBwmcm.js.map +0 -1
  514. package/dist/_chunks/slot-grid-DL_Tuj0p.js +0 -491
  515. package/dist/_chunks/slot-grid-DL_Tuj0p.js.map +0 -1
  516. package/dist/_chunks/sparkline.agent-BDTXzTy9.js.map +0 -1
  517. package/dist/_chunks/spinner-77xUGpuX.js.map +0 -1
  518. package/dist/_chunks/stat-CrumvZWf.js +0 -208
  519. package/dist/_chunks/stat-CrumvZWf.js.map +0 -1
  520. package/dist/_chunks/stepper-accordion-BkvqQWPI.js.map +0 -1
  521. package/dist/_chunks/stepper-calendar-BQMjrwzo.js.map +0 -1
  522. package/dist/_chunks/stepper-progress-Bwfl-0rV.js +0 -128
  523. package/dist/_chunks/stepper-progress-Bwfl-0rV.js.map +0 -1
  524. package/dist/_chunks/streaming-text-Cu9YQe_1.js +0 -104
  525. package/dist/_chunks/streaming-text-Cu9YQe_1.js.map +0 -1
  526. package/dist/_chunks/suggestion-chip-XkxDJiPW.js +0 -157
  527. package/dist/_chunks/suggestion-chip-XkxDJiPW.js.map +0 -1
  528. package/dist/_chunks/switch-DyC0ThNT.js +0 -137
  529. package/dist/_chunks/switch-DyC0ThNT.js.map +0 -1
  530. package/dist/_chunks/tabs.agent-FsGU3sZL.js.map +0 -1
  531. package/dist/_chunks/tag-BucAvfTX.js +0 -194
  532. package/dist/_chunks/tag-BucAvfTX.js.map +0 -1
  533. package/dist/_chunks/task-card-uxjApfcg.js +0 -112
  534. package/dist/_chunks/task-card-uxjApfcg.js.map +0 -1
  535. package/dist/_chunks/task-tray-BdfM3p8N.js +0 -99
  536. package/dist/_chunks/task-tray-BdfM3p8N.js.map +0 -1
  537. package/dist/_chunks/text-area-CKxZ7cS3.js +0 -152
  538. package/dist/_chunks/text-area-CKxZ7cS3.js.map +0 -1
  539. package/dist/_chunks/text-input-D16CcMlL.js +0 -187
  540. package/dist/_chunks/text-input-D16CcMlL.js.map +0 -1
  541. package/dist/_chunks/time-picker-BapZq0OY.js.map +0 -1
  542. package/dist/_chunks/timeline-D3VOf4RT.js +0 -219
  543. package/dist/_chunks/timeline-D3VOf4RT.js.map +0 -1
  544. package/dist/_chunks/timestamp-BLM-jjdw.js.map +0 -1
  545. package/dist/_chunks/tooltip-DF6WjD1r.js.map +0 -1
  546. package/dist/_chunks/tooth-scheme.agent-CFKl3iQr.js.map +0 -1
  547. package/dist/_chunks/transcript-panel-aI14fHYA.js +0 -265
  548. package/dist/_chunks/transcript-panel-aI14fHYA.js.map +0 -1
  549. package/dist/_chunks/typing-indicator-BTVDEpnd.js +0 -81
  550. package/dist/_chunks/typing-indicator-BTVDEpnd.js.map +0 -1
  551. package/dist/_chunks/warning-stack-Cyf_81SL.js.map +0 -1
  552. package/dist/_chunks/workflow-map-Uf-hHAO3.js.map +0 -1
@@ -1,121 +0,0 @@
1
- import { jsx as t, jsxs as s } from "react/jsx-runtime";
2
- import { forwardRef as z, useId as V, useMemo as p } from "react";
3
- import { c as f } from "./index-D2ZczOXr.js";
4
- import { useTranslation as j } from "react-i18next";
5
- import { F as w } from "./form-field-context-94LwgYTQ.js";
6
- import { C as B } from "./circle-alert-ChA9opNA.js";
7
- const C = f("text-start", {
8
- variants: {
9
- orientation: {
10
- vertical: "flex flex-col gap-[var(--spacing-xs)]",
11
- horizontal: "grid grid-cols-[minmax(0,var(--form-label-inline-size))_minmax(0,1fr)] items-start gap-x-[var(--spacing-md)] gap-y-[var(--spacing-xs)]"
12
- },
13
- disabled: {
14
- true: "opacity-50 cursor-not-allowed",
15
- false: ""
16
- }
17
- },
18
- defaultVariants: {
19
- orientation: "vertical",
20
- disabled: !1
21
- }
22
- }), I = f("flex flex-col gap-[var(--spacing-xs)]", {
23
- variants: {
24
- orientation: {
25
- vertical: "",
26
- horizontal: "min-w-0"
27
- }
28
- },
29
- defaultVariants: {
30
- orientation: "vertical"
31
- }
32
- }), $ = z(
33
- (x, v) => {
34
- const {
35
- label: u,
36
- description: o,
37
- error: e,
38
- required: l = !1,
39
- optional: h = !1,
40
- orientation: c = "vertical",
41
- disabled: n = !1,
42
- className: g,
43
- children: b,
44
- ...N
45
- } = x, { t: y } = j(), a = V(), r = `${a}-help`, i = `${a}-error`, d = !!e, m = p(
46
- () => [o ? r : null, e ? i : null].filter(Boolean).join(" "),
47
- [o, e, r, i]
48
- ), F = p(
49
- () => ({
50
- id: a,
51
- helpId: r,
52
- errorId: i,
53
- describedBy: m,
54
- invalid: d,
55
- required: l,
56
- disabled: n
57
- }),
58
- [a, r, i, m, d, l, n]
59
- );
60
- return /* @__PURE__ */ t(w.Provider, { value: F, children: /* @__PURE__ */ s(
61
- "div",
62
- {
63
- ref: v,
64
- className: C({ orientation: c, disabled: n, className: g }),
65
- ...N,
66
- children: [
67
- /* @__PURE__ */ s(
68
- "label",
69
- {
70
- htmlFor: a,
71
- className: "type-label text-foreground",
72
- children: [
73
- u,
74
- l && /* @__PURE__ */ t(
75
- "span",
76
- {
77
- "aria-hidden": "true",
78
- className: "text-destructive ms-[var(--spacing-xs)]",
79
- children: "*"
80
- }
81
- ),
82
- h && /* @__PURE__ */ s("span", { className: "text-muted-foreground ms-[var(--spacing-xs)] font-normal", children: [
83
- "(",
84
- y("ui.common.optional", "optional"),
85
- ")"
86
- ] })
87
- ]
88
- }
89
- ),
90
- /* @__PURE__ */ s("div", { className: I({ orientation: c }), children: [
91
- b,
92
- o && /* @__PURE__ */ t("p", { id: r, className: "type-body-sm text-muted-foreground", children: o }),
93
- e && /* @__PURE__ */ s(
94
- "p",
95
- {
96
- id: i,
97
- role: "alert",
98
- className: "inline-flex items-center gap-[var(--spacing-xs)] type-body-sm text-destructive",
99
- children: [
100
- /* @__PURE__ */ t(
101
- B,
102
- {
103
- "aria-hidden": "true",
104
- className: "size-4 shrink-0"
105
- }
106
- ),
107
- /* @__PURE__ */ t("span", { children: e })
108
- ]
109
- }
110
- )
111
- ] })
112
- ]
113
- }
114
- ) });
115
- }
116
- );
117
- $.displayName = "FormField";
118
- export {
119
- $ as F
120
- };
121
- //# sourceMappingURL=form-field-B4bwrccN.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"form-field-B4bwrccN.js","sources":["../../src/components/form-field/form-field.tsx"],"sourcesContent":["import { forwardRef, useId, useMemo, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertCircle } from 'lucide-react';\nimport {\n FormFieldContext,\n type FormFieldContextShape,\n} from './form-field-context';\n\nconst fieldVariants = cva('text-start', {\n variants: {\n orientation: {\n vertical: 'flex flex-col gap-[var(--spacing-xs)]',\n horizontal:\n 'grid grid-cols-[minmax(0,var(--form-label-inline-size))_minmax(0,1fr)] items-start gap-x-[var(--spacing-md)] gap-y-[var(--spacing-xs)]',\n },\n disabled: {\n true: 'opacity-50 cursor-not-allowed',\n false: '',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n disabled: false,\n },\n});\n\nconst slotsVariants = cva('flex flex-col gap-[var(--spacing-xs)]', {\n variants: {\n orientation: {\n vertical: '',\n horizontal: 'min-w-0',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n },\n});\n\ntype RequiredIndicator =\n | { required?: boolean; optional?: never }\n | { required?: never; optional?: boolean };\n\ninterface BaseFormFieldProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n Omit<VariantProps<typeof fieldVariants>, 'disabled'> {\n label: string;\n description?: string;\n error?: string;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport type FormFieldProps = BaseFormFieldProps & RequiredIndicator;\n\nexport const FormField = forwardRef<HTMLDivElement, FormFieldProps>(\n (props, ref) => {\n const {\n label,\n description,\n error,\n required = false,\n optional = false,\n orientation = 'vertical',\n disabled = false,\n className,\n children,\n ...rest\n } = props as BaseFormFieldProps & {\n required?: boolean;\n optional?: boolean;\n };\n\n const { t } = useTranslation();\n const id = useId();\n const helpId = `${id}-help`;\n const errorId = `${id}-error`;\n const invalid = Boolean(error);\n\n const describedBy = useMemo(\n () =>\n [description ? helpId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' '),\n [description, error, helpId, errorId],\n );\n\n const ctx: FormFieldContextShape = useMemo(\n () => ({\n id,\n helpId,\n errorId,\n describedBy,\n invalid,\n required,\n disabled,\n }),\n [id, helpId, errorId, describedBy, invalid, required, disabled],\n );\n\n return (\n <FormFieldContext.Provider value={ctx}>\n <div\n ref={ref}\n className={fieldVariants({ orientation, disabled, className })}\n {...rest}\n >\n <label\n htmlFor={id}\n className=\"type-label text-foreground\"\n >\n {label}\n {required && (\n <span\n aria-hidden=\"true\"\n className=\"text-destructive ms-[var(--spacing-xs)]\"\n >\n *\n </span>\n )}\n {optional && (\n <span className=\"text-muted-foreground ms-[var(--spacing-xs)] font-normal\">\n ({t('ui.common.optional', 'optional')})\n </span>\n )}\n </label>\n <div className={slotsVariants({ orientation })}>\n {children}\n {description && (\n <p id={helpId} className=\"type-body-sm text-muted-foreground\">\n {description}\n </p>\n )}\n {error && (\n <p\n id={errorId}\n role=\"alert\"\n className=\"inline-flex items-center gap-[var(--spacing-xs)] type-body-sm text-destructive\"\n >\n <AlertCircle\n aria-hidden=\"true\"\n className=\"size-4 shrink-0\"\n />\n <span>{error}</span>\n </p>\n )}\n </div>\n </div>\n </FormFieldContext.Provider>\n );\n },\n);\n\nFormField.displayName = 'FormField';\n"],"names":["fieldVariants","cva","slotsVariants","FormField","forwardRef","props","ref","label","description","error","required","optional","orientation","disabled","className","children","rest","t","useTranslation","id","useId","helpId","errorId","invalid","describedBy","useMemo","ctx","jsx","FormFieldContext","jsxs","AlertCircle"],"mappings":"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"}
@@ -1,197 +0,0 @@
1
- import { jsx as e, jsxs as i } from "react/jsx-runtime";
2
- import { forwardRef as U, useId as y, useState as q } from "react";
3
- import * as s from "@radix-ui/react-alert-dialog";
4
- import * as b from "@radix-ui/react-radio-group";
5
- import { c as E } from "./index-D2ZczOXr.js";
6
- import { useTranslation as H } from "react-i18next";
7
- import { B as w } from "./button-CXL8bA8G.js";
8
- import { P as J } from "./progress-DL3-izuO.js";
9
- import { f as O } from "./payment-form-Cf7U6r5L.js";
10
- import { T as Q } from "./triangle-alert-CBPUIzQo.js";
11
- import { C as W } from "./check-DPdL_Sm7.js";
12
- const X = E(
13
- [
14
- "fixed z-[var(--z-modal)] overflow-auto",
15
- "bg-[color:var(--popover)] text-[color:var(--popover-foreground)]",
16
- "border border-border shadow-[var(--shadow-lg)]",
17
- // forced-colors: keep the dialog boundary visible under Windows High
18
- // Contrast, where `var(--border)` may collapse to system colours.
19
- "forced-colors:border-[CanvasText]",
20
- "focus:outline-none"
21
- ].join(" "),
22
- {
23
- variants: {
24
- layout: {
25
- centered: "start-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 rtl:translate-x-1/2 rounded-[var(--radius-md)] max-w-[var(--dialog-width-xl)] w-[calc(100vw-2rem)] max-h-[90vh]",
26
- sheet: "inset-inline-0 bottom-0 w-full max-h-[90vh] rounded-t-[var(--radius-md)]"
27
- },
28
- density: {
29
- compact: "ps-[var(--spacing-md)] pe-[var(--spacing-md)] pt-[var(--spacing-md)] pb-[var(--spacing-md)]",
30
- full: "ps-[var(--spacing-lg)] pe-[var(--spacing-lg)] pt-[var(--spacing-lg)] pb-[var(--spacing-lg)]"
31
- }
32
- },
33
- defaultVariants: { layout: "centered", density: "full" }
34
- }
35
- ), Y = U(
36
- ({
37
- open: N,
38
- onOpenChange: d,
39
- plans: m,
40
- selectedPlanId: p,
41
- defaultSelectedPlanId: j,
42
- onSelectedPlanChange: o,
43
- usage: t,
44
- onUpgrade: k,
45
- onCancel: c,
46
- title: z,
47
- description: C,
48
- layout: K = "centered",
49
- density: R = "full",
50
- className: A
51
- }, F) => {
52
- var g;
53
- const { t: a, i18n: T } = H(), u = y(), v = y(), f = p !== void 0, [I, L] = q(
54
- j ?? ((g = m[0]) == null ? void 0 : g.id) ?? ""
55
- ), n = f ? p ?? "" : I, P = (r) => {
56
- f || L(r), o == null || o(r);
57
- }, M = () => {
58
- c == null || c(), d(!1);
59
- }, V = () => {
60
- n && k(n);
61
- }, B = t ? Math.min(100, Math.max(0, t.used / Math.max(1, t.limit) * 100)) : 0, l = t ? t.used >= t.limit : !1;
62
- return /* @__PURE__ */ e(s.Root, { open: N, onOpenChange: d, children: /* @__PURE__ */ i(s.Portal, { children: [
63
- /* @__PURE__ */ e(
64
- s.Overlay,
65
- {
66
- className: [
67
- "fixed inset-0 z-[var(--z-modal-backdrop)]",
68
- "bg-[color:var(--foreground)]/40",
69
- "motion-safe:data-[state=open]:animate-in motion-safe:data-[state=closed]:animate-out",
70
- "[.theme-accessible_&]:animate-none"
71
- ].join(" ")
72
- }
73
- ),
74
- /* @__PURE__ */ i(
75
- s.Content,
76
- {
77
- ref: F,
78
- "aria-labelledby": u,
79
- "aria-describedby": v,
80
- className: X({ layout: K, density: R, className: A }),
81
- children: [
82
- /* @__PURE__ */ e(s.Title, { id: u, asChild: !0, children: /* @__PURE__ */ e("h2", { className: "type-title-card", children: z ?? a("ui.paywall.title") }) }),
83
- /* @__PURE__ */ e(s.Description, { id: v, asChild: !0, children: /* @__PURE__ */ e("p", { className: "mt-[var(--spacing-xs)] text-[color:var(--muted-foreground)]", children: C ?? a("ui.paywall.description") }) }),
84
- t ? /* @__PURE__ */ i("div", { className: "mt-[var(--spacing-md)]", children: [
85
- /* @__PURE__ */ i("div", { className: "flex items-center gap-[var(--spacing-xs)] mb-[var(--spacing-xs)]", children: [
86
- l ? /* @__PURE__ */ e(
87
- Q,
88
- {
89
- "aria-hidden": "true",
90
- className: "size-4 text-[color:var(--destructive)]"
91
- }
92
- ) : null,
93
- /* @__PURE__ */ e(
94
- "span",
95
- {
96
- className: [
97
- "type-body-sm",
98
- l ? "text-[color:var(--destructive)]" : "text-[color:var(--muted-foreground)]"
99
- ].join(" "),
100
- children: l ? a("ui.paywall.usageFull") : a("ui.paywall.usageLabel", {
101
- used: t.used,
102
- limit: t.limit
103
- })
104
- }
105
- )
106
- ] }),
107
- /* @__PURE__ */ e(
108
- J,
109
- {
110
- value: B,
111
- max: 100,
112
- ariaLabel: a("ui.paywall.usageLabel", {
113
- used: t.used,
114
- limit: t.limit
115
- }),
116
- className: l ? "[&_[role=progressbar]>*]:bg-[color:var(--destructive)]" : ""
117
- }
118
- )
119
- ] }) : null,
120
- /* @__PURE__ */ e(
121
- b.Root,
122
- {
123
- value: n,
124
- onValueChange: P,
125
- "aria-label": a("ui.paywall.title"),
126
- className: "mt-[var(--spacing-md)] flex flex-col gap-[var(--spacing-sm)]",
127
- children: m.map((r) => {
128
- const h = O(
129
- r.priceAmount,
130
- r.currency,
131
- T.language
132
- ), x = r.perKey ? a(r.perKey) : void 0, D = x ? a("ui.paywall.pricePer", { price: h, period: x }) : h, _ = a(r.nameKey);
133
- return /* @__PURE__ */ i(
134
- b.Item,
135
- {
136
- value: r.id,
137
- className: [
138
- "group relative flex flex-col items-stretch",
139
- "rounded-[var(--radius-md)] border border-border",
140
- "ps-[var(--spacing-md)] pe-[var(--spacing-md)] pt-[var(--spacing-sm)] pb-[var(--spacing-sm)]",
141
- "text-start bg-[color:var(--card)] text-[color:var(--card-foreground)]",
142
- "data-[state=checked]:border-[color:var(--primary)]",
143
- "data-[state=checked]:bg-[color:var(--primary)]/5",
144
- "focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid",
145
- "focus-visible:outline-[color:var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]"
146
- ].join(" "),
147
- children: [
148
- /* @__PURE__ */ i("span", { className: "flex items-center justify-between gap-[var(--spacing-sm)]", children: [
149
- /* @__PURE__ */ e("span", { className: "font-semibold", children: _ }),
150
- /* @__PURE__ */ e("span", { className: "tabular-nums", children: D })
151
- ] }),
152
- r.featuresKeys && r.featuresKeys.length > 0 ? /* @__PURE__ */ e(
153
- "ul",
154
- {
155
- "aria-label": a("ui.paywall.features"),
156
- className: "mt-[var(--spacing-xs)] flex flex-col gap-[var(--spacing-xs)]",
157
- children: r.featuresKeys.map((G, S) => /* @__PURE__ */ i(
158
- "li",
159
- {
160
- className: "flex items-start gap-[var(--spacing-xs)] type-body-sm",
161
- children: [
162
- /* @__PURE__ */ e(
163
- W,
164
- {
165
- "aria-hidden": "true",
166
- className: "size-4 shrink-0 text-[color:var(--primary)] mt-[1px]"
167
- }
168
- ),
169
- /* @__PURE__ */ e("span", { children: a(G) })
170
- ]
171
- },
172
- S
173
- ))
174
- }
175
- ) : null
176
- ]
177
- },
178
- r.id
179
- );
180
- })
181
- }
182
- ),
183
- /* @__PURE__ */ i("div", { className: "mt-[var(--spacing-lg)] flex items-center gap-[var(--spacing-sm)] justify-end", children: [
184
- /* @__PURE__ */ e(s.Cancel, { asChild: !0, children: /* @__PURE__ */ e(w, { intent: "outline", onClick: M, children: a("ui.paywall.notNow") }) }),
185
- /* @__PURE__ */ e(s.Action, { asChild: !0, children: /* @__PURE__ */ e(w, { intent: "primary", onClick: V, children: a("ui.paywall.upgrade") }) })
186
- ] })
187
- ]
188
- }
189
- )
190
- ] }) });
191
- }
192
- );
193
- Y.displayName = "FreemiumPaywall";
194
- export {
195
- Y as F
196
- };
197
- //# sourceMappingURL=freemium-paywall-DVyNsQHS.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"freemium-paywall-DVyNsQHS.js","sources":["../../src/components/freemium-paywall/freemium-paywall.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useState,\n type ReactNode,\n} from 'react';\nimport * as RadixAlertDialog from '@radix-ui/react-alert-dialog';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { AlertTriangle, Check } from 'lucide-react';\nimport { Button } from '../button';\nimport { Progress } from '../progress';\nimport { formatPaymentAmount } from '../payment-form';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface FreemiumPlan {\n id: string;\n /** Translation key for the plan name (e.g. `app.paywall.plans.pro`). */\n nameKey: string;\n /** Amount in minor units (cents, centesimi). */\n priceAmount: number;\n /** ISO 4217 currency code. */\n currency: string;\n /** Translation key for the cadence suffix (e.g. `app.paywall.period.month`). */\n perKey?: string;\n /** Per-line feature translation keys. */\n featuresKeys?: string[];\n}\n\nconst contentVariants = cva(\n [\n 'fixed z-[var(--z-modal)] overflow-auto',\n 'bg-[color:var(--popover)] text-[color:var(--popover-foreground)]',\n 'border border-border shadow-[var(--shadow-lg)]',\n // forced-colors: keep the dialog boundary visible under Windows High\n // Contrast, where `var(--border)` may collapse to system colours.\n 'forced-colors:border-[CanvasText]',\n 'focus:outline-none',\n ].join(' '),\n {\n variants: {\n layout: {\n centered:\n 'start-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 rtl:translate-x-1/2 rounded-[var(--radius-md)] max-w-[var(--dialog-width-xl)] w-[calc(100vw-2rem)] max-h-[90vh]',\n sheet:\n 'inset-inline-0 bottom-0 w-full max-h-[90vh] rounded-t-[var(--radius-md)]',\n },\n density: {\n compact: 'ps-[var(--spacing-md)] pe-[var(--spacing-md)] pt-[var(--spacing-md)] pb-[var(--spacing-md)]',\n full: 'ps-[var(--spacing-lg)] pe-[var(--spacing-lg)] pt-[var(--spacing-lg)] pb-[var(--spacing-lg)]',\n },\n },\n defaultVariants: { layout: 'centered', density: 'full' },\n },\n);\n\nexport interface FreemiumPaywallProps\n extends VariantProps<typeof contentVariants> {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n plans: FreemiumPlan[];\n /** Currently-selected plan id (controlled) or default. */\n selectedPlanId?: string;\n defaultSelectedPlanId?: string;\n onSelectedPlanChange?: (id: string) => void;\n /** Usage indicator values — omit the object to hide the bar. */\n usage?: { used: number; limit: number };\n /** Fires on upgrade. */\n onUpgrade: (planId: string) => void;\n /** Fires when the user dismisses via Not Now. */\n onCancel?: () => void;\n /** Title override; defaults to t('ui.paywall.title'). */\n title?: ReactNode;\n /** Description override; defaults to t('ui.paywall.description'). */\n description?: ReactNode;\n className?: string;\n}\n\nexport const FreemiumPaywall = forwardRef<HTMLDivElement, FreemiumPaywallProps>(\n (\n {\n open,\n onOpenChange,\n plans,\n selectedPlanId,\n defaultSelectedPlanId,\n onSelectedPlanChange,\n usage,\n onUpgrade,\n onCancel,\n title,\n description,\n layout = 'centered',\n density = 'full',\n className,\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const titleId = useId();\n const descId = useId();\n\n const isControlled = selectedPlanId !== undefined;\n const [internalSelected, setInternalSelected] = useState<string>(\n defaultSelectedPlanId ?? plans[0]?.id ?? '',\n );\n const currentSelected = isControlled\n ? selectedPlanId ?? ''\n : internalSelected;\n\n const handleSelectedChange = (next: string) => {\n if (!isControlled) setInternalSelected(next);\n onSelectedPlanChange?.(next);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n const handleUpgrade = () => {\n if (!currentSelected) return;\n onUpgrade(currentSelected);\n };\n\n const usagePercent = usage\n ? Math.min(100, Math.max(0, (usage.used / Math.max(1, usage.limit)) * 100))\n : 0;\n const usageFull = usage ? usage.used >= usage.limit : false;\n\n return (\n <RadixAlertDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixAlertDialog.Portal>\n <RadixAlertDialog.Overlay\n className={[\n 'fixed inset-0 z-[var(--z-modal-backdrop)]',\n 'bg-[color:var(--foreground)]/40',\n 'motion-safe:data-[state=open]:animate-in motion-safe:data-[state=closed]:animate-out',\n '[.theme-accessible_&]:animate-none',\n ].join(' ')}\n />\n <RadixAlertDialog.Content\n ref={ref}\n aria-labelledby={titleId}\n aria-describedby={descId}\n className={contentVariants({ layout, density, className })}\n >\n <RadixAlertDialog.Title id={titleId} asChild>\n <h2 className=\"type-title-card\">\n {title ?? t('ui.paywall.title')}\n </h2>\n </RadixAlertDialog.Title>\n <RadixAlertDialog.Description id={descId} asChild>\n <p className=\"mt-[var(--spacing-xs)] text-[color:var(--muted-foreground)]\">\n {description ?? t('ui.paywall.description')}\n </p>\n </RadixAlertDialog.Description>\n\n {usage ? (\n <div className=\"mt-[var(--spacing-md)]\">\n <div className=\"flex items-center gap-[var(--spacing-xs)] mb-[var(--spacing-xs)]\">\n {usageFull ? (\n <AlertTriangle\n aria-hidden=\"true\"\n className=\"size-4 text-[color:var(--destructive)]\"\n />\n ) : null}\n <span\n className={[\n 'type-body-sm',\n usageFull\n ? 'text-[color:var(--destructive)]'\n : 'text-[color:var(--muted-foreground)]',\n ].join(' ')}\n >\n {usageFull\n ? t('ui.paywall.usageFull')\n : t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n </span>\n </div>\n <Progress\n value={usagePercent}\n max={100}\n ariaLabel={t('ui.paywall.usageLabel', {\n used: usage.used,\n limit: usage.limit,\n })}\n className={usageFull ? '[&_[role=progressbar]>*]:bg-[color:var(--destructive)]' : ''}\n />\n </div>\n ) : null}\n\n <RadixRadioGroup.Root\n value={currentSelected}\n onValueChange={handleSelectedChange}\n aria-label={t('ui.paywall.title')}\n className=\"mt-[var(--spacing-md)] flex flex-col gap-[var(--spacing-sm)]\"\n >\n {plans.map((plan) => {\n // Reuse the payment-form helper — it knows about\n // zero-decimal currencies (JPY, KRW, VND …) and applies\n // the right divisor. Raw `/ 100` would 100× the price in\n // those currencies.\n const formattedPrice = formatPaymentAmount(\n plan.priceAmount,\n plan.currency,\n i18n.language,\n );\n const period = plan.perKey ? t(plan.perKey) : undefined;\n const priceLine = period\n ? t('ui.paywall.pricePer', { price: formattedPrice, period })\n : formattedPrice;\n const planName = t(plan.nameKey);\n return (\n <RadixRadioGroup.Item\n key={plan.id}\n value={plan.id}\n className={[\n 'group relative flex flex-col items-stretch',\n 'rounded-[var(--radius-md)] border border-border',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-md)] pt-[var(--spacing-sm)] pb-[var(--spacing-sm)]',\n 'text-start bg-[color:var(--card)] text-[color:var(--card-foreground)]',\n 'data-[state=checked]:border-[color:var(--primary)]',\n 'data-[state=checked]:bg-[color:var(--primary)]/5',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[color:var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <span className=\"flex items-center justify-between gap-[var(--spacing-sm)]\">\n <span className=\"font-semibold\">{planName}</span>\n <span className=\"tabular-nums\">{priceLine}</span>\n </span>\n {plan.featuresKeys && plan.featuresKeys.length > 0 ? (\n <ul\n aria-label={t('ui.paywall.features')}\n className=\"mt-[var(--spacing-xs)] flex flex-col gap-[var(--spacing-xs)]\"\n >\n {plan.featuresKeys.map((key, i) => (\n <li\n key={i}\n className=\"flex items-start gap-[var(--spacing-xs)] type-body-sm\"\n >\n <Check\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 text-[color:var(--primary)] mt-[1px]\"\n />\n <span>{t(key)}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </RadixRadioGroup.Item>\n );\n })}\n </RadixRadioGroup.Root>\n\n <div className=\"mt-[var(--spacing-lg)] flex items-center gap-[var(--spacing-sm)] justify-end\">\n <RadixAlertDialog.Cancel asChild>\n <Button intent=\"outline\" onClick={handleCancel}>\n {t('ui.paywall.notNow')}\n </Button>\n </RadixAlertDialog.Cancel>\n <RadixAlertDialog.Action asChild>\n <Button intent=\"primary\" onClick={handleUpgrade}>\n {t('ui.paywall.upgrade')}\n </Button>\n </RadixAlertDialog.Action>\n </div>\n </RadixAlertDialog.Content>\n </RadixAlertDialog.Portal>\n </RadixAlertDialog.Root>\n );\n },\n);\n\nFreemiumPaywall.displayName = 'FreemiumPaywall';\n"],"names":["contentVariants","cva","FreemiumPaywall","forwardRef","open","onOpenChange","plans","selectedPlanId","defaultSelectedPlanId","onSelectedPlanChange","usage","onUpgrade","onCancel","title","description","layout","density","className","ref","t","i18n","useTranslation","titleId","useId","descId","isControlled","internalSelected","setInternalSelected","useState","_a","currentSelected","handleSelectedChange","next","handleCancel","handleUpgrade","usagePercent","usageFull","jsx","RadixAlertDialog","jsxs","AlertTriangle","Progress","RadixRadioGroup","plan","formattedPrice","formatPaymentAmount","period","priceLine","planName","key","i","Check","Button"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"header-BpKaSL_v.js","sources":["../../node_modules/lucide-react/dist/esm/icons/menu.js","../../src/components/header/header.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M4 5h16\", key: \"1tepv9\" }],\n [\"path\", { d: \"M4 12h16\", key: \"1lakjw\" }],\n [\"path\", { d: \"M4 19h16\", key: \"1djgab\" }]\n];\nconst Menu = createLucideIcon(\"menu\", __iconNode);\n\nexport { __iconNode, Menu as default };\n//# sourceMappingURL=menu.js.map\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type AnchorHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Menu } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst rootVariants = cva(\n [\n 'w-full',\n // Fixed height — a Header is always the `lg` token (64px). Using `h-*`\n // (not `min-h-*`) pins the row regardless of how Storybook's Canvas /\n // docs wrapper stretches the story's layout.\n 'h-[var(--header-height-lg)]',\n // `flex items-stretch` lets the inner div fill the full cross-axis so\n // the flex-centered content sits on the true vertical midline.\n 'flex items-stretch',\n // Pin to the top of the page — `sticky` keeps the Header in normal\n // document flow (so content below isn't occluded and the docs Canvas\n // doesn't leak the Header over adjacent preview blocks) but stays\n // anchored to the viewport while the nearest scroll ancestor scrolls.\n 'sticky inset-block-start-0 z-[var(--z-sticky)]',\n 'bg-[var(--background)]',\n 'text-[color:var(--foreground)]',\n // Shadow recipe follows `Brand/Shadows` — one tier between states, never\n // two. Resting: flat, no shadow. Scrolled: --shadow-md (tooltip/menu tier)\n // paired with a 1-px --border so elevation still reads without the shadow\n // in forced-colors / print, where UAs strip box-shadow. Transition is\n // gated on `motion-reduce` so users opting out of motion still get the\n // static elevation without animated lift.\n 'transition-[border-color,box-shadow] motion-reduce:transition-none',\n 'border-block-end border-transparent',\n 'data-[scrolled=true]:border-[color:var(--border)]',\n 'data-[scrolled=true]:shadow-[var(--shadow-md)]',\n // Windows HCM: always show the border — forced-colors strips box-shadow\n // entirely, so the border is the only separation cue the user gets.\n 'forced-colors:border-[color:CanvasText]',\n // Print: strip shadow, keep border so the header still reads as a\n // bounded surface on paper.\n 'print:shadow-none print:border-[color:var(--border)]',\n ].join(' '),\n {\n variants: {\n variant: {\n // Brand surface — primary-tinted background with primary-foreground\n // ink. Token rescopes are narrowed to `start` + `end` slots so chrome\n // (IconButton outline border, Logo monochrome, focus rings) re-tints\n // automatically. The `center` slot is excluded because SearchBar paints\n // its own `var(--background)` surface and must keep the document's\n // --foreground / --muted-foreground for its icon, placeholder, border,\n // kbd chip, and hover state.\n //\n // Contrast: --primary-foreground (#fff) over --primary (violet-500) is\n // 4.6:1 — passes WCAG AA for normal text. Muted-foreground is also set\n // to pure primary-foreground so any muted text in the header clears AA.\n //\n // Dark-mode override: in dark mode --primary is magenta-500 — using it\n // as the full-width header surface puts a hot-pink bar at the top of\n // every page, which the Apr 2026 brand guide's own dark mockups never\n // do (fuchsia is reserved for CTAs). We shift the header bg to\n // --background (blue-500) in dark so the header blends with the Dark\n // Blue brand surface at the same level as the Sidebar; separation\n // from the main canvas (which we offset to blue-700) is carried by\n // the existing scroll-shadow + border. White --primary-foreground ink\n // on blue-500 clears AAA (~12.8:1).\n brand: [\n 'bg-[var(--primary)] text-[color:var(--primary-foreground)]',\n '[.theme-dark_&]:bg-[var(--background)]',\n '[&_[data-header-slot=start]]:[--foreground:var(--primary-foreground)]',\n '[&_[data-header-slot=start]]:[--muted-foreground:var(--primary-foreground)]',\n '[&_[data-header-slot=start]]:[--border:color-mix(in_srgb,var(--primary-foreground)_40%,transparent)]',\n '[&_[data-header-slot=start]]:[--muted:color-mix(in_srgb,var(--primary-foreground)_16%,transparent)]',\n '[&_[data-header-slot=start]]:[--ring:var(--primary-foreground)]',\n '[&_[data-header-slot=end]]:[--foreground:var(--primary-foreground)]',\n '[&_[data-header-slot=end]]:[--muted-foreground:var(--primary-foreground)]',\n '[&_[data-header-slot=end]]:[--border:color-mix(in_srgb,var(--primary-foreground)_40%,transparent)]',\n '[&_[data-header-slot=end]]:[--muted:color-mix(in_srgb,var(--primary-foreground)_16%,transparent)]',\n '[&_[data-header-slot=end]]:[--ring:var(--primary-foreground)]',\n ].join(' '),\n // Light surface — plain page background with primary-coloured chrome.\n // Start + end slots rescope --foreground, --border, --ring to --primary\n // so IconButton borders/icons render in the brand hue while the\n // HeaderBrand wordmark keeps its bicolor artwork and the SearchBar\n // (center slot) is untouched.\n light: [\n 'bg-[var(--background)] text-[color:var(--foreground)]',\n '[&_[data-header-slot=start]]:[--foreground:var(--primary)]',\n '[&_[data-header-slot=start]]:[--border:var(--primary)]',\n '[&_[data-header-slot=start]]:[--ring:var(--primary)]',\n '[&_[data-header-slot=end]]:[--foreground:var(--primary)]',\n '[&_[data-header-slot=end]]:[--border:var(--primary)]',\n '[&_[data-header-slot=end]]:[--ring:var(--primary)]',\n ].join(' '),\n },\n },\n defaultVariants: {\n variant: 'brand',\n },\n },\n);\n\nconst innerVariants = cva(\n [\n 'flex items-center gap-[var(--spacing-sm)]',\n 'w-full h-full',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-md)]',\n ].join(' '),\n);\n\nconst slotStartVariants = cva('inline-flex items-center gap-[var(--spacing-sm)]');\nconst slotCenterVariants = cva(\n 'hidden md:flex flex-1 min-w-0 items-center justify-center gap-[var(--spacing-sm)]',\n);\nconst slotEndVariants = cva('ms-auto inline-flex items-center gap-[var(--spacing-sm)]');\n\nconst brandVariants = cva(\n [\n 'inline-flex items-center gap-[var(--spacing-sm)]',\n 'text-[length:var(--font-size-base)] font-[var(--font-weight-semibold)]',\n // `leading-none` zeros the anchor's line-height so the Logo SVG sits at\n // the geometric centre of the flex cross-axis — otherwise the residual\n // line-box above ascenders / below descenders nudges the SVG upward.\n 'leading-none',\n // Inherit foreground from the Header root so the `brand` variant's\n // --primary-foreground ink cascades here without an override prop.\n 'text-[color:currentColor]',\n 'no-underline',\n 'rounded-[var(--radius-sm)]',\n 'focus-visible:outline-[length:var(--focus-ring-width)]',\n 'focus-visible:outline-solid',\n 'focus-visible:outline-[color:var(--ring)]',\n 'focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'forced-colors:focus-visible:outline-[CanvasText]',\n 'min-h-[var(--min-target-size)]',\n ].join(' '),\n);\n\nconst brandDividerVariants = cva(\n [\n 'hidden md:inline-block',\n 'border-inline-start border-[color:var(--border)]',\n 'self-stretch my-[var(--spacing-xs)]',\n ].join(' '),\n);\n\nconst skipLinkVariants = cva(\n [\n 'sr-only focus:not-sr-only',\n 'focus:absolute focus:inset-inline-start-[var(--spacing-sm)] focus:inset-block-start-[var(--spacing-sm)]',\n 'focus:z-[calc(var(--z-sticky)+1)]',\n 'focus:ps-[var(--spacing-sm)] focus:pe-[var(--spacing-sm)] focus:pbs-[var(--spacing-xs)] focus:pbe-[var(--spacing-xs)]',\n 'focus:bg-[var(--background)] focus:text-[color:var(--foreground)]',\n 'focus:border focus:border-[color:var(--border)]',\n 'focus:rounded-[var(--radius-sm)]',\n 'focus:outline-[length:var(--focus-ring-width)] focus:outline-solid focus:outline-[color:var(--ring)]',\n 'forced-colors:focus:outline-[CanvasText]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport interface HeaderProps\n extends Omit<HTMLAttributes<HTMLElement>, 'role' | 'children'>,\n VariantProps<typeof rootVariants> {\n children: ReactNode;\n /** Override the default landmark name. */\n 'aria-label'?: string;\n /** Enable the scroll-linked border + shadow (default `true`). */\n scrollLinkedElevation?: boolean;\n}\n\nexport const Header = forwardRef<HTMLElement, HeaderProps>(\n (\n {\n variant = 'brand',\n className,\n children,\n scrollLinkedElevation = true,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const label = ariaLabel ?? t('navigation.header.label', 'Page header');\n\n /* ---- Scroll-linked border / shadow ---------------------------- */\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const [scrolled, setScrolled] = useState(false);\n useEffect(() => {\n if (!scrollLinkedElevation) return undefined;\n const sentinel = sentinelRef.current;\n if (!sentinel) return undefined;\n if (typeof IntersectionObserver === 'undefined') return undefined;\n const io = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n // When the sentinel scrolls out of view (isIntersecting=false),\n // the user has scrolled past the top — flip the elevation on.\n setScrolled(!entry.isIntersecting);\n },\n { threshold: 0 },\n );\n io.observe(sentinel);\n return () => io.disconnect();\n }, [scrollLinkedElevation]);\n\n return (\n <>\n {/* 1px sentinel above the sticky header so the IntersectionObserver\n fires when the user scrolls past the top. Kept outside the\n <header> so it doesn't affect landmark semantics. */}\n {scrollLinkedElevation ? (\n <div\n ref={sentinelRef}\n aria-hidden=\"true\"\n className=\"block h-px w-full\"\n />\n ) : null}\n <header\n ref={ref}\n role=\"banner\"\n aria-label={label}\n data-scrolled={scrolled ? 'true' : undefined}\n className={rootVariants({ variant, className })}\n {...rest}\n >\n <div className={innerVariants()}>{children}</div>\n </header>\n </>\n );\n },\n);\nHeader.displayName = 'Header';\n\n/* ------------------------------------------------------------------ */\n/* Slot wrappers */\n/* ------------------------------------------------------------------ */\n\nexport const HeaderStart = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-header-slot=\"start\"\n className={[slotStartVariants(), className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nHeaderStart.displayName = 'HeaderStart';\n\nexport const HeaderCenter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-header-slot=\"center\"\n className={[slotCenterVariants(), className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nHeaderCenter.displayName = 'HeaderCenter';\n\nexport const HeaderEnd = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-header-slot=\"end\"\n className={[slotEndVariants(), className].filter(Boolean).join(' ')}\n {...props}\n />\n ),\n);\nHeaderEnd.displayName = 'HeaderEnd';\n\n/* ------------------------------------------------------------------ */\n/* Brand */\n/* ------------------------------------------------------------------ */\n\nexport interface HeaderBrandProps\n extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'children'> {\n /** Logo slot — an <svg> / <img>. Must carry its own accessible name via aria-label on the wrapping component OR a visible wordmark child. */\n logo?: ReactNode;\n /** Visible wordmark / product name. Sits after the logo. */\n children?: ReactNode;\n /** Destination href. Defaults to \"/\". */\n href?: string;\n}\n\nexport const HeaderBrand = forwardRef<HTMLAnchorElement, HeaderBrandProps>(\n ({ logo, children, href = '/', className, ...props }, ref) => {\n if (import.meta.env.DEV && !props['aria-label'] && !children) {\n // eslint-disable-next-line no-console\n console.warn(\n 'HeaderBrand: pass `aria-label` or visible children — a logo-only brand link without a name has no accessible name.',\n );\n }\n return (\n <a\n ref={ref}\n href={href}\n className={[brandVariants(), className].filter(Boolean).join(' ')}\n {...props}\n >\n {logo ? (\n <span aria-hidden={children ? 'true' : undefined} className=\"inline-flex items-center\">\n {logo}\n </span>\n ) : null}\n {children ? <span className=\"truncate\">{children}</span> : null}\n </a>\n );\n },\n);\nHeaderBrand.displayName = 'HeaderBrand';\n\n/* ------------------------------------------------------------------ */\n/* Brand divider */\n/* ------------------------------------------------------------------ */\n\nexport function HeaderBrandDivider({\n className,\n ...props\n}: HTMLAttributes<HTMLSpanElement>): ReactNode {\n return (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={[brandDividerVariants(), className].filter(Boolean).join(' ')}\n {...props}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Menu button (mobile drawer trigger) */\n/* ------------------------------------------------------------------ */\n\nexport interface HeaderMenuButtonProps {\n onMenuOpen: () => void;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport const HeaderMenuButton = forwardRef<HTMLButtonElement, HeaderMenuButtonProps>(\n ({ onMenuOpen, 'aria-label': ariaLabel, className }, ref) => {\n const { t } = useTranslation();\n return (\n <IconButton\n ref={ref}\n // Show on mobile; hide above md breakpoint.\n className={['md:hidden', className].filter(Boolean).join(' ')}\n icon={<Menu aria-hidden />}\n aria-label={ariaLabel ?? t('navigation.sidebar.open', 'Open menu')}\n onClick={onMenuOpen}\n />\n );\n },\n);\nHeaderMenuButton.displayName = 'HeaderMenuButton';\n\n/* ------------------------------------------------------------------ */\n/* SkipLink */\n/* ------------------------------------------------------------------ */\n\nexport interface HeaderSkipLinkProps\n extends Omit<AnchorHTMLAttributes<HTMLAnchorElement>, 'children'> {\n href: string;\n children?: ReactNode;\n}\n\nexport const HeaderSkipLink = forwardRef<HTMLAnchorElement, HeaderSkipLinkProps>(\n ({ href, children, className, ...props }, ref) => {\n const { t } = useTranslation();\n return (\n <a\n ref={ref}\n href={href}\n className={[skipLinkVariants(), className].filter(Boolean).join(' ')}\n {...props}\n >\n {children ?? t('navigation.nav.skipToContent', 'Skip to content')}\n </a>\n );\n },\n);\nHeaderSkipLink.displayName = 'HeaderSkipLink';\n"],"names":["__iconNode","Menu","createLucideIcon","rootVariants","cva","innerVariants","slotStartVariants","slotCenterVariants","slotEndVariants","brandVariants","brandDividerVariants","skipLinkVariants","Header","forwardRef","variant","className","children","scrollLinkedElevation","ariaLabel","rest","ref","t","useTranslation","label","sentinelRef","useRef","scrolled","setScrolled","useState","useEffect","sentinel","io","entries","entry","jsxs","Fragment","jsx","HeaderStart","props","HeaderCenter","HeaderEnd","HeaderBrand","logo","href","HeaderBrandDivider","HeaderMenuButton","onMenuOpen","IconButton","HeaderSkipLink"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,45 +0,0 @@
1
- import { jsx as r } from "react/jsx-runtime";
2
- import { forwardRef as d } from "react";
3
- import { B as p } from "./button-CXL8bA8G.js";
4
- import { c as h } from "./index-D2ZczOXr.js";
5
- import { T as b } from "./tooltip-DF6WjD1r.js";
6
- const B = h("p-0", {
7
- variants: {
8
- size: {
9
- sm: "w-8 h-8",
10
- md: "w-10 h-10",
11
- lg: "w-12 h-12"
12
- }
13
- },
14
- defaultVariants: {
15
- size: "md"
16
- }
17
- }), w = d(
18
- ({ icon: i, size: a, intent: s = "outline", className: o, tooltip: t, flipIconInRtl: l = !1, ...n }, c) => {
19
- const m = n["aria-label"] || t, f = a === "sm" ? "size-4" : a === "lg" ? "size-5" : "size-[18px]", u = l ? "rtl:rotate-180" : "", e = /* @__PURE__ */ r(
20
- p,
21
- {
22
- ref: c,
23
- size: a,
24
- intent: s,
25
- className: B({ size: a, className: o }),
26
- "aria-label": m,
27
- ...n,
28
- children: /* @__PURE__ */ r(
29
- "span",
30
- {
31
- "aria-hidden": "true",
32
- className: `inline-flex items-center justify-center ${f} ${u}`.trim(),
33
- children: i
34
- }
35
- )
36
- }
37
- );
38
- return t ? /* @__PURE__ */ r(b, { label: t, children: e }) : e;
39
- }
40
- );
41
- w.displayName = "IconButton";
42
- export {
43
- w as I
44
- };
45
- //# sourceMappingURL=icon-button-C1vpylg3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"icon-button-C1vpylg3.js","sources":["../../src/components/button/icon-button.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { Button, type ButtonProps } from './button';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { Tooltip } from '../tooltip';\n\nconst iconButtonVariants = cva('p-0', {\n variants: {\n size: {\n sm: 'w-8 h-8',\n md: 'w-10 h-10',\n lg: 'w-12 h-12',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type IconButtonProps = Omit<\n ButtonProps,\n 'startIcon' | 'endIcon' | 'children' | 'size' | 'flipIconInRtl'\n> &\n VariantProps<typeof iconButtonVariants> & {\n icon: React.ReactNode;\n tooltip?: string;\n 'aria-label'?: string;\n /**\n * Mirror the icon horizontally in RTL. Default `false` — only enable\n * for directional glyphs (arrows, chevrons). See Button.flipIconInRtl.\n */\n flipIconInRtl?: boolean;\n };\n\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(\n (\n { icon, size, intent = 'outline', className, tooltip, flipIconInRtl = false, ...props },\n ref,\n ) => {\n const ariaLabel = props['aria-label'] || tooltip;\n\n if (import.meta.env.DEV && !ariaLabel) {\n console.warn('IconButton: aria-label or tooltip prop is required for accessibility.');\n }\n\n const iconSizeClass =\n size === 'sm' ? 'size-4' : size === 'lg' ? 'size-5' : 'size-[18px]';\n const iconFlipClass = flipIconInRtl ? 'rtl:rotate-180' : '';\n\n const button = (\n <Button\n ref={ref}\n size={size}\n intent={intent}\n className={iconButtonVariants({ size, className })}\n aria-label={ariaLabel}\n {...props}\n >\n <span\n aria-hidden=\"true\"\n className={`inline-flex items-center justify-center ${iconSizeClass} ${iconFlipClass}`.trim()}\n >\n {icon}\n </span>\n </Button>\n );\n\n if (tooltip) {\n return <Tooltip label={tooltip}>{button}</Tooltip>;\n }\n\n return button;\n },\n);\n\nIconButton.displayName = 'IconButton';\n"],"names":["iconButtonVariants","cva","IconButton","forwardRef","icon","size","intent","className","tooltip","flipIconInRtl","props","ref","ariaLabel","iconSizeClass","iconFlipClass","button","jsx","Button","Tooltip"],"mappings":";;;;;AAKA,MAAMA,IAAqBC,EAAI,OAAO;AAAA,EACpC,UAAU;AAAA,IACR,MAAM;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAAA,EACN;AAAA,EAEF,iBAAiB;AAAA,IACf,MAAM;AAAA,EAAA;AAEV,CAAC,GAiBYC,IAAaC;AAAA,EACxB,CACE,EAAE,MAAAC,GAAM,MAAAC,GAAM,QAAAC,IAAS,WAAW,WAAAC,GAAW,SAAAC,GAAS,eAAAC,IAAgB,IAAO,GAAGC,EAAA,GAChFC,MACG;AACH,UAAMC,IAAYF,EAAM,YAAY,KAAKF,GAMnCK,IACJR,MAAS,OAAO,WAAWA,MAAS,OAAO,WAAW,eAClDS,IAAgBL,IAAgB,mBAAmB,IAEnDM,IACJ,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAAN;AAAA,QACA,MAAAN;AAAA,QACA,QAAAC;AAAA,QACA,WAAWN,EAAmB,EAAE,MAAAK,GAAM,WAAAE,GAAW;AAAA,QACjD,cAAYK;AAAA,QACX,GAAGF;AAAA,QAEJ,UAAA,gBAAAM;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAW,2CAA2CH,CAAa,IAAIC,CAAa,GAAG,KAAA;AAAA,YAEtF,UAAAV;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAIJ,WAAII,sBACMU,GAAA,EAAQ,OAAOV,GAAU,UAAAO,GAAO,IAGnCA;AAAA,EACT;AACF;AAEAb,EAAW,cAAc;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"icon-button-group-tERESY-n.js","sources":["../../src/components/icon-button-group/icon-button-group.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n forwardRef,\n isValidElement,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { IconButton, type IconButtonProps } from '../button/icon-button';\nimport type { ButtonProps } from '../button/button';\n\ntype ButtonIntent = NonNullable<ButtonProps['intent']>;\n\n// Intentionally does NOT compose `@radix-ui/react-toggle-group`. Radix\n// ToggleGroup's render shape makes it hard to layer shared-border chrome\n// across children (first-child / last-child / internal-divider CSS), and\n// the three-mode + three-role matrix (group / toolbar / radiogroup × momentary\n// / toggle-single / toggle-multi) is broader than Radix's single / multi\n// contract. The roving-tabindex implementation below mirrors Radix's pattern\n// so keyboard semantics stay consistent. See 05-accessibility.mdx for the\n// WAI-ARIA toolbar / radiogroup references.\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst iconButtonGroupVariants = cva(\n [\n 'inline-flex isolate',\n // Hairline border around the group unifies the children into one\n // visual unit. Internal child dividers are drawn via the per-child\n // class list below.\n 'border border-border',\n 'rounded-[var(--radius-md)]',\n // Ensure the focus ring of a pressed child sits above its siblings.\n '[&>*]:relative [&>*:focus-visible]:z-10',\n ].join(' '),\n {\n variants: {\n orientation: {\n horizontal: [\n 'flex-row',\n // Flatten internal corners on children so the outer radius owns\n // the rounded edges.\n '[&>*:not(:first-child)]:rounded-s-none',\n '[&>*:not(:last-child)]:rounded-e-none',\n // Internal divider — logical so it flips in RTL.\n '[&>*:not(:first-child)]:border-s',\n '[&>*:not(:first-child)]:border-border',\n // The children already own an outer border (from IconButton's\n // own border in secondary/outline variants). Collapse the doubled\n // border so we don't get a 2px seam.\n '[&>*]:border-0',\n ].join(' '),\n vertical: [\n 'flex-col',\n // Vertical groups flow block-wise. Reading direction doesn't\n // invert vertical stacks in any locale this DS targets, so the\n // physical `rounded-t/b` is intentional.\n '[&>*:not(:first-child)]:rounded-t-none',\n '[&>*:not(:last-child)]:rounded-b-none',\n '[&>*:not(:first-child)]:border-t',\n '[&>*:not(:first-child)]:border-border',\n '[&>*]:border-0',\n ].join(' '),\n },\n },\n defaultVariants: {\n orientation: 'horizontal',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type IconButtonGroupRole = 'group' | 'toolbar' | 'radiogroup';\nexport type IconButtonGroupMode =\n | 'momentary'\n | 'toggle-single'\n | 'toggle-multi';\n\ntype SharedPropsBase = {\n /** Forwarded to every child that does not set its own `size`. */\n size?: 'sm' | 'md' | 'lg';\n orientation?: 'horizontal' | 'vertical';\n /** Disables every child. Uses `aria-disabled` on children (not the HTML\n * attribute) so each child still takes focus — matches WAI-ARIA toolbar\n * guidance. Visual disabled styling picks up the `aria-disabled:*`\n * variant declared on the Button base class. */\n disabled?: boolean;\n /** Intent applied to every child that does not set its own `intent`.\n * Defaults to `outline` — grouped icon buttons are peers, not a row\n * of solid-primary CTAs. */\n intent?: ButtonIntent;\n children: ReactNode;\n};\n\n// At least one of `aria-label` / `aria-labelledby` must be present. This\n// discriminated pair makes the TypeScript compiler reject a group with\n// neither — see the a11y acceptance criteria in the user story.\ntype AccessibleNameProps =\n | { 'aria-label': string; 'aria-labelledby'?: never }\n | { 'aria-label'?: never; 'aria-labelledby': string };\n\ntype SharedProps = SharedPropsBase & AccessibleNameProps;\n\n// Role + mode combinations are not all valid. Encoded via a discriminated\n// union so the compiler rejects nonsensical pairings (e.g. a multi-select\n// radiogroup).\ntype GroupRoleProps =\n | { role?: 'group'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'toolbar'; mode?: 'momentary' | 'toggle-single' | 'toggle-multi' }\n | { role: 'radiogroup'; mode: 'toggle-single' };\n\ntype MomentaryProps = SharedProps & {\n mode?: 'momentary';\n value?: never;\n defaultValue?: never;\n onValueChange?: never;\n};\n\ntype ToggleSingleProps = SharedProps & {\n mode: 'toggle-single';\n value?: string;\n defaultValue?: string;\n onValueChange?: (next: string) => void;\n};\n\ntype ToggleMultiProps = SharedProps & {\n mode: 'toggle-multi';\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (next: string[]) => void;\n};\n\nexport type IconButtonGroupProps = (\n | MomentaryProps\n | ToggleSingleProps\n | ToggleMultiProps\n) &\n GroupRoleProps &\n Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'onChange' | 'children'> &\n VariantProps<typeof iconButtonGroupVariants>;\n\n/* ------------------------------------------------------------------ */\n/* IconButtonGroup */\n/* ------------------------------------------------------------------ */\n\nexport const IconButtonGroup = forwardRef<HTMLDivElement, IconButtonGroupProps>(\n (props, ref) => {\n const {\n size,\n orientation = 'horizontal',\n role = 'group',\n mode = 'momentary',\n disabled = false,\n intent = 'outline',\n className,\n children,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n ...rest\n } = props as IconButtonGroupProps & { className?: string };\n\n if (import.meta.env.DEV && !ariaLabel && !ariaLabelledBy) {\n // eslint-disable-next-line no-console\n console.warn(\n 'IconButtonGroup: `aria-label` or `aria-labelledby` is required for accessibility.',\n );\n }\n\n /* ---- Controlled / uncontrolled value for toggle modes --------- */\n const [internalValue, setInternalValue] = useState<string | string[]>(\n () => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.defaultValue ?? '';\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.defaultValue ?? [];\n }\n return '';\n },\n );\n\n const resolvedValue: string | string[] = (() => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n return p.value !== undefined ? p.value : internalValue;\n }\n return '';\n })();\n\n const commitValue = useCallback(\n (next: string | string[]) => {\n if (mode === 'toggle-single') {\n const p = props as ToggleSingleProps;\n if (p.value === undefined) setInternalValue(next as string);\n p.onValueChange?.(next as string);\n } else if (mode === 'toggle-multi') {\n const p = props as ToggleMultiProps;\n if (p.value === undefined) setInternalValue(next as string[]);\n p.onValueChange?.(next as string[]);\n }\n },\n [mode, props],\n );\n\n /* ---- Roving tabindex state — only active in toolbar / radiogroup - */\n const rovingTabindex = role === 'toolbar' || role === 'radiogroup';\n const buttonsRef = useRef<Array<HTMLButtonElement | null>>([]);\n const [focusIndex, setFocusIndex] = useState(0);\n\n const registerIndex = useCallback(\n (index: number, el: HTMLButtonElement | null) => {\n buttonsRef.current[index] = el;\n },\n [],\n );\n\n const rootRef = useRef<HTMLDivElement | null>(null);\n const [isRTL, setIsRTL] = useState(false);\n // `useLayoutEffect` so the direction is correct BEFORE the first paint\n // (otherwise a user pressing an arrow key on the first frame after mount\n // would hit the default-LTR mapping even in an RTL document).\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const node = rootRef.current;\n if (!node) return;\n // Read the computed direction from the group's own wrapper so a\n // scoped `dir='rtl'` on any ancestor (not just <html>) flips arrow\n // navigation. `getComputedStyle` walks up automatically.\n const dir = window.getComputedStyle(node).direction;\n setIsRTL(dir === 'rtl');\n }, []);\n\n /* ---- Arrow-key navigation for roving tabindex ----------------- */\n const handleRootKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!rovingTabindex) return;\n const count = buttonsRef.current.filter(Boolean).length;\n if (count === 0) return;\n\n const forwardKey =\n orientation === 'vertical'\n ? 'ArrowDown'\n : isRTL\n ? 'ArrowLeft'\n : 'ArrowRight';\n const backwardKey =\n orientation === 'vertical'\n ? 'ArrowUp'\n : isRTL\n ? 'ArrowRight'\n : 'ArrowLeft';\n\n let next: number | null = null;\n if (event.key === forwardKey) next = (focusIndex + 1) % count;\n else if (event.key === backwardKey)\n next = (focusIndex - 1 + count) % count;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = count - 1;\n\n if (next === null) return;\n // Skip over disabled children.\n const maxAttempts = count;\n let attempts = 0;\n let candidate = next;\n while (attempts < maxAttempts) {\n const el = buttonsRef.current[candidate];\n if (el && el.getAttribute('aria-disabled') !== 'true' && !el.disabled) {\n break;\n }\n candidate =\n event.key === backwardKey || event.key === 'End'\n ? (candidate - 1 + count) % count\n : (candidate + 1) % count;\n attempts += 1;\n }\n event.preventDefault();\n setFocusIndex(candidate);\n buttonsRef.current[candidate]?.focus();\n // WAI-ARIA radiogroup pattern: arrow keys MOVE focus AND CHANGE\n // the selected radio in one action. toolbar pattern (and plain\n // group) only moves focus.\n if (role === 'radiogroup' && mode === 'toggle-single') {\n const child = childArrayRef.current[candidate];\n if (child && typeof child === 'object' && 'props' in child) {\n const cValue = (\n child as ReactElement<{ value?: string }>\n ).props.value;\n if (cValue) commitValue(cValue);\n }\n }\n },\n [rovingTabindex, orientation, isRTL, focusIndex, role, mode, commitValue],\n );\n\n /* ---- Build enhanced children ---------------------------------- */\n const childArray = Children.toArray(children);\n // Mirror into a ref so the keydown handler (referenced from Memo deps)\n // can read the latest child list without inflating the dep array.\n const childArrayRef = useRef<ReturnType<typeof Children.toArray>>([]);\n childArrayRef.current = childArray;\n\n const enhanced = childArray.map((child, index) => {\n if (!isValidElement(child)) {\n if (import.meta.env.DEV) {\n // eslint-disable-next-line no-console\n console.warn(\n 'IconButtonGroup: children should be <IconButton> elements.',\n );\n }\n return child;\n }\n\n const childEl = child as ReactElement<\n IconButtonProps & {\n value?: string;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n }\n >;\n\n // DEV-time sanity: warn if we got something that isn't an IconButton.\n // `React.cloneElement` would still work, but IconButton-specific\n // props (::before target size, forwarded tooltip) wouldn't apply.\n if (import.meta.env.DEV && childEl.type !== IconButton) {\n // eslint-disable-next-line no-console\n console.warn(\n 'IconButtonGroup: each child should be a DS <IconButton>. Other elements break target-size + focus-ring contracts.',\n );\n }\n\n const childValue = childEl.props.value;\n\n // Compute aria-pressed / aria-checked for toggle modes.\n const { ariaPressed, ariaChecked } = computeToggleAria(\n mode,\n role,\n childValue,\n resolvedValue,\n );\n\n const groupDisabled = disabled === true;\n const childDisabled = childEl.props.disabled === true;\n\n // Click handling — wrap so aria-disabled (group-level) blocks\n // activation, then forward to the child's own onClick.\n const wrappedOnClick: React.MouseEventHandler<HTMLButtonElement> = (\n event,\n ) => {\n // aria-disabled is advisory; the native click still fires. Block\n // it explicitly when the GROUP (not the child) is disabled.\n if (groupDisabled) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n // Forward to the child's own handler first so consumers can run\n // analytics / preventDefault.\n childEl.props.onClick?.(event);\n if (event.defaultPrevented) return;\n if (!childValue) return;\n if (mode === 'toggle-single') {\n // Contract: exactly one pressed. Clicking the pressed one is a\n // no-op. This matches Radix ToggleGroup type='single' and the\n // radiogroup pattern.\n if (resolvedValue === childValue) return;\n commitValue(childValue);\n } else if (mode === 'toggle-multi') {\n const list = resolvedValue as string[];\n const next = list.includes(childValue)\n ? list.filter((v) => v !== childValue)\n : [...list, childValue];\n commitValue(next);\n }\n };\n\n // cloneElement's typed overload rejects `ref` as a prop, so we\n // build the override bag as `unknown` and cast to the element's\n // prop type. React at runtime routes `ref` via its usual channel.\n const setMergedRef = (node: HTMLButtonElement | null) => {\n registerIndex(index, node);\n const originalRef = (\n childEl as unknown as { ref?: React.Ref<HTMLButtonElement> }\n ).ref;\n if (typeof originalRef === 'function') originalRef(node);\n else if (\n originalRef !== null &&\n originalRef !== undefined &&\n typeof originalRef === 'object'\n ) {\n (originalRef as React.MutableRefObject<HTMLButtonElement | null>).current =\n node;\n }\n };\n\n // Per the user story: group-level disabled injects `aria-disabled`\n // so the child stays focusable; child-level `disabled` still uses\n // the HTML attribute (child's own contract). When both are true\n // we leave the HTML disabled in place (strictest cue wins).\n const ariaDisabled = groupDisabled && !childDisabled ? true : undefined;\n\n // If the group is disabled OR we are in a toggle mode, we need the\n // wrapped click handler. In pure momentary mode with no group\n // disable, the child's own onClick is passed through unchanged.\n const needsWrappedClick = mode !== 'momentary' || groupDisabled;\n\n const overrides = {\n intent: childEl.props.intent ?? intent,\n size: childEl.props.size ?? size,\n disabled: childDisabled,\n 'aria-disabled': ariaDisabled,\n onClick: needsWrappedClick ? wrappedOnClick : childEl.props.onClick,\n 'aria-pressed': ariaPressed,\n 'aria-checked': ariaChecked,\n // When the group is a radiogroup, children must be `role=\"radio\"`\n // so screen readers announce them as radio buttons and so\n // `getByRole('radio')` works in tests. The button element is\n // re-purposed as a radio; `aria-checked` above carries the state.\n role: role === 'radiogroup' ? 'radio' : undefined,\n tabIndex: rovingTabindex ? (index === focusIndex ? 0 : -1) : undefined,\n onFocus: (ev: React.FocusEvent<HTMLButtonElement>) => {\n if (rovingTabindex) setFocusIndex(index);\n childEl.props.onFocus?.(ev);\n },\n ref: setMergedRef,\n } as unknown as Partial<IconButtonProps>;\n\n return cloneElement(childEl, overrides);\n });\n\n const mergedRootRef = (node: HTMLDivElement | null) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n };\n\n return (\n <div\n ref={mergedRootRef}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n aria-orientation={role === 'toolbar' ? orientation : undefined}\n onKeyDown={handleRootKeyDown}\n className={iconButtonGroupVariants({ orientation, className })}\n {...rest}\n >\n {enhanced}\n </div>\n );\n },\n);\n\nIconButtonGroup.displayName = 'IconButtonGroup';\n\n/* ------------------------------------------------------------------ */\n/* Helpers */\n/* ------------------------------------------------------------------ */\n\nfunction computeToggleAria(\n mode: IconButtonGroupMode,\n role: IconButtonGroupRole,\n childValue: string | undefined,\n resolvedValue: string | string[],\n): { ariaPressed?: boolean; ariaChecked?: boolean } {\n if (mode === 'momentary' || !childValue) return {};\n\n const isActive =\n mode === 'toggle-multi'\n ? (resolvedValue as string[]).includes(childValue)\n : resolvedValue === childValue;\n\n // radiogroup uses aria-checked; toolbar/group use aria-pressed.\n if (role === 'radiogroup') {\n return { ariaChecked: isActive };\n }\n return { ariaPressed: isActive };\n}\n\n"],"names":["iconButtonGroupVariants","cva","IconButtonGroup","forwardRef","props","ref","size","orientation","role","mode","disabled","intent","className","children","ariaLabel","ariaLabelledBy","rest","internalValue","setInternalValue","useState","resolvedValue","p","commitValue","useCallback","next","_a","_b","rovingTabindex","buttonsRef","useRef","focusIndex","setFocusIndex","registerIndex","index","el","rootRef","isRTL","setIsRTL","useLayoutEffect","node","dir","handleRootKeyDown","event","count","forwardKey","backwardKey","maxAttempts","attempts","candidate","child","childArrayRef","cValue","childArray","Children","enhanced","isValidElement","childEl","childValue","ariaPressed","ariaChecked","computeToggleAria","groupDisabled","childDisabled","wrappedOnClick","list","v","setMergedRef","originalRef","ariaDisabled","needsWrappedClick","overrides","ev","cloneElement","jsx","isActive"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"kbd-0iPlQjgC.js","sources":["../../src/components/kbd/kbd.tsx"],"sourcesContent":["import {\n forwardRef,\n Fragment,\n useEffect,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* Platform detection */\n/* ------------------------------------------------------------------ */\n\nfunction detectMacLike(): boolean {\n if (typeof navigator === 'undefined') return false;\n const uaData = (navigator as unknown as {\n userAgentData?: { platform?: string };\n }).userAgentData;\n const platformString = uaData?.platform ?? navigator.platform ?? '';\n return /mac/i.test(platformString);\n}\n\n/* ------------------------------------------------------------------ */\n/* Glyph + accessible-name maps */\n/* ------------------------------------------------------------------ */\n\nexport type KbdNamedKey =\n | 'Meta'\n | 'Control'\n | 'Alt'\n | 'Shift'\n | 'Enter'\n | 'Escape'\n | 'Space'\n | 'Tab'\n | 'Delete'\n | 'Backspace'\n | 'ArrowUp'\n | 'ArrowDown'\n | 'ArrowLeft'\n | 'ArrowRight';\n\n/**\n * Named keys we understand — anything else is passed through verbatim.\n * Glyph rendering is platform-aware; accessible names spell the key out\n * so screen readers say \"Command K\" instead of \"black apple K\".\n */\nconst MAC_GLYPHS: Record<KbdNamedKey, string> = {\n Meta: '\\u2318', // ⌘\n Control: '\\u2303', // ⌃\n Alt: '\\u2325', // ⌥\n Shift: '\\u21E7', // ⇧\n Enter: '\\u23CE', // ⏎\n Escape: 'Esc',\n Space: 'Space',\n Tab: '\\u21E5', // ⇥\n Delete: '\\u2326', // ⌦\n Backspace: '\\u232B', // ⌫\n ArrowUp: '\\u2191', // ↑\n ArrowDown: '\\u2193', // ↓\n ArrowLeft: '\\u2190', // ←\n ArrowRight: '\\u2192', // →\n};\n\nconst WIN_GLYPHS: Record<KbdNamedKey, string> = {\n Meta: 'Ctrl', // Windows/Linux consumers usually care about the Control equivalent\n Control: 'Ctrl',\n Alt: 'Alt',\n Shift: 'Shift',\n Enter: 'Enter',\n Escape: 'Esc',\n Space: 'Space',\n Tab: 'Tab',\n Delete: 'Del',\n Backspace: 'Backspace',\n ArrowUp: '\\u2191',\n ArrowDown: '\\u2193',\n ArrowLeft: '\\u2190',\n ArrowRight: '\\u2192',\n};\n\n/** Spelled-out names used for the aria-label — never platform-swapped. */\nconst SPOKEN_NAMES: Record<KbdNamedKey, string> = {\n Meta: 'Command',\n Control: 'Control',\n Alt: 'Option',\n Shift: 'Shift',\n Enter: 'Enter',\n Escape: 'Escape',\n Space: 'Space',\n Tab: 'Tab',\n Delete: 'Delete',\n Backspace: 'Backspace',\n ArrowUp: 'Up arrow',\n ArrowDown: 'Down arrow',\n ArrowLeft: 'Left arrow',\n ArrowRight: 'Right arrow',\n};\n\nfunction isNamedKey(key: string): key is KbdNamedKey {\n return (\n key === 'Meta' ||\n key === 'Control' ||\n key === 'Alt' ||\n key === 'Shift' ||\n key === 'Enter' ||\n key === 'Escape' ||\n key === 'Space' ||\n key === 'Tab' ||\n key === 'Delete' ||\n key === 'Backspace' ||\n key === 'ArrowUp' ||\n key === 'ArrowDown' ||\n key === 'ArrowLeft' ||\n key === 'ArrowRight'\n );\n}\n\nfunction glyphFor(key: string, isMac: boolean): string {\n if (isNamedKey(key)) {\n return (isMac ? MAC_GLYPHS : WIN_GLYPHS)[key];\n }\n return key;\n}\n\nfunction spokenFor(key: string): string {\n if (isNamedKey(key)) return SPOKEN_NAMES[key];\n return key;\n}\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst kbdVariants = cva(\n [\n 'inline-flex items-center justify-center',\n 'font-[family-name:var(--font-mono)]',\n 'tabular-nums',\n 'rounded-[var(--radius-sm)]',\n 'select-none',\n // Tight minimum size so single-key pills never collapse.\n 'min-inline-size-[1.5em] min-block-size-[1.5em]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'text-[length:var(--font-size-xs)] ps-[calc(var(--spacing-xs)/1.5)] pe-[calc(var(--spacing-xs)/1.5)]',\n md: 'text-[length:var(--font-size-xs)] ps-[var(--spacing-xs)] pe-[var(--spacing-xs)]',\n lg: 'text-[length:var(--font-size-sm)] ps-[var(--spacing-sm)] pe-[var(--spacing-sm)]',\n },\n intensity: {\n outline: [\n 'bg-[var(--background)]',\n 'border border-[color:var(--border)]',\n 'text-[color:var(--foreground)]',\n ].join(' '),\n solid: [\n 'bg-[var(--muted)]',\n 'text-[color:var(--foreground)]',\n ].join(' '),\n },\n },\n defaultVariants: { size: 'md', intensity: 'outline' },\n },\n);\n\nconst groupVariants = cva(\n [\n 'inline-flex items-center',\n 'gap-[calc(var(--spacing-xs)/2)]',\n // Group shouldn't visually render as a pill itself — just holds pills.\n 'font-[family-name:var(--font-mono)]',\n ].join(' '),\n);\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type KbdSeparator = 'none' | 'plus' | 'then';\n\n/**\n * Optional override map for keys. Consumers can rewrite the visible\n * glyph or the spoken name for product-specific shortcuts (e.g. mapping\n * a \"Brand\" modifier to a special icon).\n */\nexport interface KbdGlyphOverride {\n glyph?: string;\n spoken?: string;\n}\n\ninterface KbdBaseProps\n extends Omit<HTMLAttributes<HTMLElement>, 'children'>,\n VariantProps<typeof kbdVariants> {\n separator?: KbdSeparator;\n glyphMap?: Partial<Record<KbdNamedKey | string, KbdGlyphOverride>>;\n}\n\ninterface KbdWithKeysProps extends KbdBaseProps {\n keys: Array<KbdNamedKey | string>;\n children?: never;\n}\n\ninterface KbdWithChildrenProps extends KbdBaseProps {\n keys?: never;\n children: ReactNode;\n}\n\nexport type KbdProps = KbdWithKeysProps | KbdWithChildrenProps;\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const Kbd = forwardRef<HTMLElement, KbdProps>((props, ref) => {\n const {\n size = 'md',\n intensity = 'outline',\n separator = 'none',\n glyphMap,\n className,\n ...rest\n } = props as KbdBaseProps & { className?: string };\n\n const { t } = useTranslation();\n\n const [isMac, setIsMac] = useState(false);\n useEffect(() => {\n setIsMac(detectMacLike());\n }, []);\n\n // Children path: pass-through rendering. Still a semantic <kbd> so\n // AT + search engines classify it correctly.\n if ('children' in props && props.children !== undefined) {\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {(props as KbdWithChildrenProps).children}\n </kbd>\n );\n }\n\n const keys = (props as KbdWithKeysProps).keys;\n\n // Single-key shortcut with no separator — render as one pill.\n // axe's `aria-prohibited-attr` rule forbids `aria-label` on <kbd>\n // elements (no valid implicit role), so the spoken name is delivered\n // via a visually-hidden sr-only span instead.\n if (keys.length === 1) {\n const k = keys[0];\n const override = glyphMap?.[k];\n const glyph = override?.glyph ?? glyphFor(k, isMac);\n const spoken = override?.spoken ?? spokenFor(k);\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <span aria-hidden=\"true\">{glyph}</span>\n <span className=\"sr-only\">{spoken}</span>\n </kbd>\n );\n }\n\n // Multi-key shortcut.\n const spokenAll = keys\n .map((k) => glyphMap?.[k]?.spoken ?? spokenFor(k))\n .join(' ');\n\n // `none`: single combined pill (e.g. \"⌘K\" rendered together).\n if (separator === 'none') {\n return (\n <kbd\n ref={ref}\n className={[kbdVariants({ size, intensity }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {keys.map((k, i) => {\n const glyph = glyphMap?.[k]?.glyph ?? glyphFor(k, isMac);\n return (\n <span key={`${k}-${i}`} aria-hidden=\"true\">\n {glyph}\n </span>\n );\n })}\n <span className=\"sr-only\">{spokenAll}</span>\n </kbd>\n );\n }\n\n // `plus` / `then`: multiple sibling <kbd> pills inside a wrapping <kbd>.\n const separatorText =\n separator === 'plus' ? t('kbd.plus', '+') : t('kbd.then', 'then');\n\n const spokenAnnouncement =\n separator === 'then'\n ? t('kbd.pressThen', 'Press {{keys}}', {\n keys: keys\n .map((k) => glyphMap?.[k]?.spoken ?? spokenFor(k))\n .join(` ${t('kbd.thenSpoken', 'then')} `),\n })\n : spokenAll;\n\n return (\n <kbd\n ref={ref}\n className={[groupVariants(), className].filter(Boolean).join(' ')}\n {...rest}\n >\n <span className=\"sr-only\">{spokenAnnouncement}</span>\n {keys.map((k, i) => {\n const glyph = glyphMap?.[k]?.glyph ?? glyphFor(k, isMac);\n return (\n <Fragment key={`${k}-${i}`}>\n <kbd\n aria-hidden=\"true\"\n className={kbdVariants({ size, intensity })}\n >\n {glyph}\n </kbd>\n {i < keys.length - 1 ? (\n <span\n aria-hidden=\"true\"\n className=\"text-[color:var(--muted-foreground)] text-[length:var(--font-size-xs)]\"\n >\n {separatorText}\n </span>\n ) : null}\n </Fragment>\n );\n })}\n </kbd>\n );\n});\n\nKbd.displayName = 'Kbd';\n\n/* ------------------------------------------------------------------ */\n/* Named helpers */\n/* ------------------------------------------------------------------ */\n\nexport const kbdGlyphs = { mac: MAC_GLYPHS, win: WIN_GLYPHS, spoken: SPOKEN_NAMES };\n"],"names":["detectMacLike","uaData","platformString","MAC_GLYPHS","WIN_GLYPHS","SPOKEN_NAMES","isNamedKey","key","glyphFor","isMac","spokenFor","kbdVariants","cva","groupVariants","Kbd","forwardRef","props","ref","size","intensity","separator","glyphMap","className","rest","t","useTranslation","setIsMac","useState","useEffect","jsx","keys","k","override","glyph","spoken","jsxs","spokenAll","_a","i","separatorText","spokenAnnouncement","Fragment","kbdGlyphs"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-value-pair--Je59tAF.js","sources":["../../src/components/key-value-pair/key-value-pair.tsx"],"sourcesContent":["import { forwardRef, useState, useCallback } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Copy, Check } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\n\n/* ------------------------------------------------------------------ */\n/* CVA — root wrapper */\n/* ------------------------------------------------------------------ */\n\nconst keyValuePairVariants = cva('flex', {\n variants: {\n layout: {\n horizontal: 'flex-row items-center gap-[var(--spacing-sm)]',\n vertical: 'flex-col gap-[var(--spacing-xs)]',\n },\n },\n defaultVariants: {\n layout: 'horizontal',\n },\n});\n\n/* ------------------------------------------------------------------ */\n/* KeyValuePairProps */\n/* ------------------------------------------------------------------ */\n\nexport interface KeyValuePairProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof keyValuePairVariants> {\n /** The label (term) */\n label: string;\n /** The value — accepts plain text, Badge, Tag, monospace code, any ReactNode */\n value: React.ReactNode;\n /** Layout direction */\n layout?: 'horizontal' | 'vertical';\n /** Render value in monospace font */\n mono?: boolean;\n /** Show a copy-to-clipboard IconButton beside the value */\n copyable?: boolean;\n /** The text to copy — defaults to `value` if value is a string */\n copyText?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* KeyValuePair */\n/* ------------------------------------------------------------------ */\n\nexport const KeyValuePair = forwardRef<HTMLDivElement, KeyValuePairProps>(\n (\n {\n label,\n value,\n layout = 'horizontal',\n mono = false,\n copyable = false,\n copyText,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const [copied, setCopied] = useState(false);\n const [announcement, setAnnouncement] = useState('');\n\n const textToCopy = copyText ?? (typeof value === 'string' ? value : undefined);\n\n const handleCopy = useCallback(async () => {\n if (!textToCopy) {\n if (import.meta.env.DEV) {\n console.warn(\n 'KeyValuePair: copyable is true but no copyText was provided and value is not a string. Copy no-op.',\n );\n }\n return;\n }\n\n try {\n await navigator.clipboard.writeText(textToCopy);\n setCopied(true);\n setAnnouncement(t('ui.keyValuePair.copied'));\n setTimeout(() => {\n setCopied(false);\n setAnnouncement('');\n }, 2000);\n } catch {\n setAnnouncement(t('ui.keyValuePair.notAvailable'));\n setTimeout(() => setAnnouncement(''), 3000);\n }\n }, [textToCopy, t]);\n\n const valueClasses = [\n 'type-body text-foreground min-w-0 shrink [unicode-bidi:isolate]',\n mono ? 'font-[family-name:var(--font-mono)]' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={ref}\n className={keyValuePairVariants({ layout, className })}\n {...props}\n >\n <span className=\"type-label text-muted-foreground shrink-0\">\n {label}\n <span className=\"sr-only\">: </span>\n </span>\n <span className={valueClasses}>{value}</span>\n {copyable && (\n <IconButton\n icon={copied ? <Check /> : <Copy />}\n size=\"sm\"\n aria-label={t('ui.keyValuePair.copy', { label })}\n onClick={handleCopy}\n intent=\"ghost\"\n className={layout === 'horizontal' ? 'ms-auto shrink-0' : 'self-start'}\n />\n )}\n <span role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </span>\n </div>\n );\n },\n);\n\nKeyValuePair.displayName = 'KeyValuePair';\n"],"names":["keyValuePairVariants","cva","KeyValuePair","forwardRef","label","value","layout","mono","copyable","copyText","className","props","ref","t","useTranslation","copied","setCopied","useState","announcement","setAnnouncement","textToCopy","handleCopy","useCallback","valueClasses","jsxs","jsx","IconButton","Check","Copy"],"mappings":";;;;;;;AAUA,MAAMA,IAAuBC,EAAI,QAAQ;AAAA,EACvC,UAAU;AAAA,IACR,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA;AAAA,EACZ;AAAA,EAEF,iBAAiB;AAAA,IACf,QAAQ;AAAA,EAAA;AAEZ,CAAC,GA2BYC,IAAeC;AAAA,EAC1B,CACE;AAAA,IACE,OAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,MAAAC,IAAO;AAAA,IACP,UAAAC,IAAW;AAAA,IACX,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,CAACC,GAAQC,CAAS,IAAIC,EAAS,EAAK,GACpC,CAACC,GAAcC,CAAe,IAAIF,EAAS,EAAE,GAE7CG,IAAaX,MAAa,OAAOJ,KAAU,WAAWA,IAAQ,SAE9DgB,IAAaC,EAAY,YAAY;AACzC,UAAKF;AASL,YAAI;AACF,gBAAM,UAAU,UAAU,UAAUA,CAAU,GAC9CJ,EAAU,EAAI,GACdG,EAAgBN,EAAE,wBAAwB,CAAC,GAC3C,WAAW,MAAM;AACf,YAAAG,EAAU,EAAK,GACfG,EAAgB,EAAE;AAAA,UACpB,GAAG,GAAI;AAAA,QACT,QAAQ;AACN,UAAAA,EAAgBN,EAAE,8BAA8B,CAAC,GACjD,WAAW,MAAMM,EAAgB,EAAE,GAAG,GAAI;AAAA,QAC5C;AAAA,IACF,GAAG,CAACC,GAAYP,CAAC,CAAC,GAEZU,IAAe;AAAA,MACnB;AAAA,MACAhB,IAAO,wCAAwC;AAAA,IAAA,EAE9C,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAZ;AAAA,QACA,WAAWZ,EAAqB,EAAE,QAAAM,GAAQ,WAAAI,GAAW;AAAA,QACpD,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAa,EAAC,QAAA,EAAK,WAAU,6CACb,UAAA;AAAA,YAAApB;AAAA,8BACA,QAAA,EAAK,WAAU,WAAU,UAAA,MAAE;AAAA,UAAA,GAC9B;AAAA,4BACC,QAAA,EAAK,WAAWmB,GAAe,UAAAlB,GAAM;AAAA,UACrCG,KACC,gBAAAiB;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,MAAMX,IAAS,gBAAAU,EAACE,GAAA,CAAA,CAAM,sBAAMC,GAAA,EAAK;AAAA,cACjC,MAAK;AAAA,cACL,cAAYf,EAAE,wBAAwB,EAAE,OAAAT,GAAO;AAAA,cAC/C,SAASiB;AAAA,cACT,QAAO;AAAA,cACP,WAAWf,MAAW,eAAe,qBAAqB;AAAA,YAAA;AAAA,UAAA;AAAA,UAG9D,gBAAAmB,EAAC,UAAK,MAAK,UAAS,aAAU,UAAS,WAAU,WAC9C,UAAAP,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AAEAhB,EAAa,cAAc;"}