@alfadocs/ui-kit 0.1.2 → 0.1.4

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 (442) hide show
  1. package/dist/_chunks/{accordion-BJD1aM67.js → accordion-B6fyINUk.js} +10 -9
  2. package/dist/_chunks/accordion-B6fyINUk.js.map +1 -0
  3. package/dist/_chunks/{agenda-card-DXOgg8IX.js → agenda-card-C_hQGErS.js} +12 -11
  4. package/dist/_chunks/{agenda-card-DXOgg8IX.js.map → agenda-card-C_hQGErS.js.map} +1 -1
  5. package/dist/_chunks/{agenda-tray-DEO8XL8V.js → agenda-tray-CBaVMJLO.js} +6 -5
  6. package/dist/_chunks/{agenda-tray-DEO8XL8V.js.map → agenda-tray-CBaVMJLO.js.map} +1 -1
  7. package/dist/_chunks/{ai-prompt-input-8IShJ-GX.js → ai-prompt-input-K94oVLG2.js} +17 -16
  8. package/dist/_chunks/ai-prompt-input-K94oVLG2.js.map +1 -0
  9. package/dist/_chunks/{alert-ETrF7Q8J.js → alert-rOM4EG0P.js} +12 -11
  10. package/dist/_chunks/{alert-ETrF7Q8J.js.map → alert-rOM4EG0P.js.map} +1 -1
  11. package/dist/_chunks/{app-frame-uq2Gy0vs.js → app-frame-6d7Lu4ea.js} +2 -1
  12. package/dist/_chunks/{app-frame-uq2Gy0vs.js.map → app-frame-6d7Lu4ea.js.map} +1 -1
  13. package/dist/_chunks/{aspect-ratio-BqU4itGW.js → aspect-ratio-CxsdG8vk.js} +9 -8
  14. package/dist/_chunks/{aspect-ratio-BqU4itGW.js.map → aspect-ratio-CxsdG8vk.js.map} +1 -1
  15. package/dist/_chunks/{audio-recorder-BvisG0Wt.js → audio-recorder-Cn8z2zC9.js} +6 -5
  16. package/dist/_chunks/{audio-recorder-BvisG0Wt.js.map → audio-recorder-Cn8z2zC9.js.map} +1 -1
  17. package/dist/_chunks/{audio-visualiser-B4u4goV5.js → audio-visualiser-CeMPCZkd.js} +2 -1
  18. package/dist/_chunks/{audio-visualiser-B4u4goV5.js.map → audio-visualiser-CeMPCZkd.js.map} +1 -1
  19. package/dist/_chunks/{autocomplete.agent-BmrpzsfW.js → autocomplete.agent-DRrp-Rsx.js} +3 -2
  20. package/dist/_chunks/{autocomplete.agent-BmrpzsfW.js.map → autocomplete.agent-DRrp-Rsx.js.map} +1 -1
  21. package/dist/_chunks/{avatar-DTQY5qIZ.js → avatar-Biffh-_H.js} +2 -1
  22. package/dist/_chunks/{avatar-DTQY5qIZ.js.map → avatar-Biffh-_H.js.map} +1 -1
  23. package/dist/_chunks/{badge-BbbBRweN.js → badge-mrstWxve.js} +14 -13
  24. package/dist/_chunks/{badge-BbbBRweN.js.map → badge-mrstWxve.js.map} +1 -1
  25. package/dist/_chunks/{balance-cell-renderer-DjR0rPS6.js → balance-cell-renderer-CiyezQhi.js} +11 -11
  26. package/dist/_chunks/{balance-cell-renderer-DjR0rPS6.js.map → balance-cell-renderer-CiyezQhi.js.map} +1 -1
  27. package/dist/_chunks/{breadcrumb-pdUacgm1.js → breadcrumb-CcZovmIq.js} +2 -1
  28. package/dist/_chunks/breadcrumb-CcZovmIq.js.map +1 -0
  29. package/dist/_chunks/{button-group-BtTHSyU0.js → button-group-CONver7M.js} +9 -8
  30. package/dist/_chunks/{button-group-BtTHSyU0.js.map → button-group-CONver7M.js.map} +1 -1
  31. package/dist/_chunks/{card-DeItIBcV.js → card-BEy58ZKp.js} +2 -1
  32. package/dist/_chunks/card-BEy58ZKp.js.map +1 -0
  33. package/dist/_chunks/{chat-container-ChdJTH0J.js → chat-container-BZvQ3_yT.js} +2 -2
  34. package/dist/_chunks/{chat-container-ChdJTH0J.js.map → chat-container-BZvQ3_yT.js.map} +1 -1
  35. package/dist/_chunks/{chat-input-C-B4snVJ.js → chat-input-xiBIujMv.js} +3 -3
  36. package/dist/_chunks/chat-input-xiBIujMv.js.map +1 -0
  37. package/dist/_chunks/{chat-message-cFNbQYRH.js → chat-message-BtxUyugB.js} +9 -8
  38. package/dist/_chunks/chat-message-BtxUyugB.js.map +1 -0
  39. package/dist/_chunks/{checkbox-DMzgtnqw.js → checkbox-Ni6C_KJg.js} +11 -11
  40. package/dist/_chunks/{checkbox-DMzgtnqw.js.map → checkbox-Ni6C_KJg.js.map} +1 -1
  41. package/dist/_chunks/{checkbox-group-DBnIBRT_.js → checkbox-group-BFZ4oN5t.js} +8 -7
  42. package/dist/_chunks/checkbox-group-BFZ4oN5t.js.map +1 -0
  43. package/dist/_chunks/{collapsible-DPGQnHZh.js → collapsible-fFMqzpdL.js} +8 -7
  44. package/dist/_chunks/collapsible-fFMqzpdL.js.map +1 -0
  45. package/dist/_chunks/{color-picker-DkMFcK2m.js → color-picker-Cl3KdjJd.js} +18 -16
  46. package/dist/_chunks/{color-picker-DkMFcK2m.js.map → color-picker-Cl3KdjJd.js.map} +1 -1
  47. package/dist/_chunks/{combobox.agent-9w6W1Jct.js → combobox.agent-DjdivI3X.js} +2 -1
  48. package/dist/_chunks/combobox.agent-DjdivI3X.js.map +1 -0
  49. package/dist/_chunks/{command-palette.agent-Dg7jhOIc.js → command-palette.agent-BUjzr2ET.js} +2 -1
  50. package/dist/_chunks/command-palette.agent-BUjzr2ET.js.map +1 -0
  51. package/dist/_chunks/{date-picker-0WQ98ZC0.js → date-picker-DYXNsWmM.js} +2 -2
  52. package/dist/_chunks/{date-picker-0WQ98ZC0.js.map → date-picker-DYXNsWmM.js.map} +1 -1
  53. package/dist/_chunks/{date-range-picker-CtwEwoyr.js → date-range-picker-BcNDJI7m.js} +2 -2
  54. package/dist/_chunks/date-range-picker-BcNDJI7m.js.map +1 -0
  55. package/dist/_chunks/{date-time-picker-Df3OJ2_C.js → date-time-picker-CmGiTU__.js} +3 -3
  56. package/dist/_chunks/{date-time-picker-Df3OJ2_C.js.map → date-time-picker-CmGiTU__.js.map} +1 -1
  57. package/dist/_chunks/{description-list-Bk3p71qY.js → description-list-C_1NX8P3.js} +3 -2
  58. package/dist/_chunks/description-list-C_1NX8P3.js.map +1 -0
  59. package/dist/_chunks/{dialog.agent-CtMkDinJ.js → dialog.agent-C2lP9H0h.js} +2 -2
  60. package/dist/_chunks/{dialog.agent-CtMkDinJ.js.map → dialog.agent-C2lP9H0h.js.map} +1 -1
  61. package/dist/_chunks/{dropdown-menu-BnVUeVG3.js → dropdown-menu-2HgU1Emf.js} +4 -3
  62. package/dist/_chunks/dropdown-menu-2HgU1Emf.js.map +1 -0
  63. package/dist/_chunks/{empty-state-DPUnQp0A.js → empty-state-BHrItOiE.js} +2 -1
  64. package/dist/_chunks/{empty-state-DPUnQp0A.js.map → empty-state-BHrItOiE.js.map} +1 -1
  65. package/dist/_chunks/{file-upload.agent-DVMxMeDA.js → file-upload.agent-LlC0W468.js} +2 -2
  66. package/dist/_chunks/{file-upload.agent-DVMxMeDA.js.map → file-upload.agent-LlC0W468.js.map} +1 -1
  67. package/dist/_chunks/{flag-C3BUEwHH.js → flag-DZ6V7-hU.js} +3 -1
  68. package/dist/_chunks/{flag-C3BUEwHH.js.map → flag-DZ6V7-hU.js.map} +1 -1
  69. package/dist/_chunks/{floating-action-button-DjRhFQdd.js → floating-action-button-Cnw-f6AG.js} +5 -4
  70. package/dist/_chunks/{floating-action-button-DjRhFQdd.js.map → floating-action-button-Cnw-f6AG.js.map} +1 -1
  71. package/dist/_chunks/{form-field-DI5LY5aG.js → form-field-BfsPLTSc.js} +2 -1
  72. package/dist/_chunks/form-field-BfsPLTSc.js.map +1 -0
  73. package/dist/_chunks/{freemium-paywall-CCsX3GhK.js → freemium-paywall-Dr9aOtOC.js} +23 -22
  74. package/dist/_chunks/freemium-paywall-Dr9aOtOC.js.map +1 -0
  75. package/dist/_chunks/{header-CVQxeLc_.js → header-BpU9U-1X.js} +3 -2
  76. package/dist/_chunks/{header-CVQxeLc_.js.map → header-BpU9U-1X.js.map} +1 -1
  77. package/dist/_chunks/{icon-button-SWpSs9S6.js → icon-button-CNjWCD1X.js} +9 -8
  78. package/dist/_chunks/icon-button-CNjWCD1X.js.map +1 -0
  79. package/dist/_chunks/{icon-button-group-BnhkUWUg.js → icon-button-group-DeV3FpNY.js} +26 -25
  80. package/dist/_chunks/{icon-button-group-BnhkUWUg.js.map → icon-button-group-DeV3FpNY.js.map} +1 -1
  81. package/dist/_chunks/{kbd-DTcIjYA7.js → kbd-8baVw3KU.js} +35 -31
  82. package/dist/_chunks/kbd-8baVw3KU.js.map +1 -0
  83. package/dist/_chunks/{key-value-pair-Cm-pSE6k.js → key-value-pair-C9hpjC_B.js} +13 -12
  84. package/dist/_chunks/{key-value-pair-Cm-pSE6k.js.map → key-value-pair-C9hpjC_B.js.map} +1 -1
  85. package/dist/_chunks/{leo-sidebar-SqGAp1vx.js → leo-sidebar-CNjZqljo.js} +11 -11
  86. package/dist/_chunks/{leo-sidebar-SqGAp1vx.js.map → leo-sidebar-CNjZqljo.js.map} +1 -1
  87. package/dist/_chunks/{list-Cwe8mcmh.js → list-B1ozIjQe.js} +4 -1
  88. package/dist/_chunks/list-B1ozIjQe.js.map +1 -0
  89. package/dist/_chunks/live-region-C41SO3cA.js +58 -0
  90. package/dist/_chunks/{live-region-COggO6x6.js.map → live-region-C41SO3cA.js.map} +1 -1
  91. package/dist/_chunks/{logo-3wrZGpwg.js → logo-BpFoCL-s.js} +7 -7
  92. package/dist/_chunks/{logo-3wrZGpwg.js.map → logo-BpFoCL-s.js.map} +1 -1
  93. package/dist/_chunks/{matrix-rain-gsHqSvW7.js → matrix-rain-BEkvux64.js} +2 -1
  94. package/dist/_chunks/{matrix-rain-gsHqSvW7.js.map → matrix-rain-BEkvux64.js.map} +1 -1
  95. package/dist/_chunks/{message-card-B0oGrI3i.js → message-card-CZzNO4ov.js} +5 -4
  96. package/dist/_chunks/message-card-CZzNO4ov.js.map +1 -0
  97. package/dist/_chunks/{message-tray-DZ6oZ0cs.js → message-tray-BWbjXW3F.js} +6 -5
  98. package/dist/_chunks/message-tray-BWbjXW3F.js.map +1 -0
  99. package/dist/_chunks/{multi-select.agent-BDEVGMmW.js → multi-select.agent-BSGEW10d.js} +19 -18
  100. package/dist/_chunks/multi-select.agent-BSGEW10d.js.map +1 -0
  101. package/dist/_chunks/{navigation-menu-NjwxyshT.js → navigation-menu-DxOMvrKM.js} +2 -1
  102. package/dist/_chunks/navigation-menu-DxOMvrKM.js.map +1 -0
  103. package/dist/_chunks/{notification-card-C73GqjHH.js → notification-card-DgW-vVg-.js} +4 -3
  104. package/dist/_chunks/{notification-card-C73GqjHH.js.map → notification-card-DgW-vVg-.js.map} +1 -1
  105. package/dist/_chunks/{notification-tray-a8a_nut-.js → notification-tray-CKUgl2jc.js} +6 -5
  106. package/dist/_chunks/{notification-tray-a8a_nut-.js.map → notification-tray-CKUgl2jc.js.map} +1 -1
  107. package/dist/_chunks/{number-input-DFQtl5K2.js → number-input-BPPhekLu.js} +16 -15
  108. package/dist/_chunks/{number-input-DFQtl5K2.js.map → number-input-BPPhekLu.js.map} +1 -1
  109. package/dist/_chunks/{otp-input-C2FdizHh.js → otp-input-De5_Ih7B.js} +2 -1
  110. package/dist/_chunks/{otp-input-C2FdizHh.js.map → otp-input-De5_Ih7B.js.map} +1 -1
  111. package/dist/_chunks/{pagination.agent-sxokDphY.js → pagination.agent-CmA0Ocr5.js} +2 -1
  112. package/dist/_chunks/pagination.agent-CmA0Ocr5.js.map +1 -0
  113. package/dist/_chunks/{password-input-C6PvKyQV.js → password-input-DAT5HQth.js} +7 -7
  114. package/dist/_chunks/password-input-DAT5HQth.js.map +1 -0
  115. package/dist/_chunks/{patient-shell-B4vKnuOf.js → patient-shell-BzHhg6uA.js} +9 -9
  116. package/dist/_chunks/{patient-shell-B4vKnuOf.js.map → patient-shell-BzHhg6uA.js.map} +1 -1
  117. package/dist/_chunks/{payment-form-175AzK-1.js → payment-form-YlxrCpZQ.js} +3 -3
  118. package/dist/_chunks/{payment-form-175AzK-1.js.map → payment-form-YlxrCpZQ.js.map} +1 -1
  119. package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js → pdf-viewer.agent-sMned5Xn.js} +3 -3
  120. package/dist/_chunks/{pdf-viewer.agent-DuGfSoep.js.map → pdf-viewer.agent-sMned5Xn.js.map} +1 -1
  121. package/dist/_chunks/{phone-input-BavVyXxZ.js → phone-input-BuRe5PyI.js} +3 -2
  122. package/dist/_chunks/phone-input-BuRe5PyI.js.map +1 -0
  123. package/dist/_chunks/{popover-BWgOopjI.js → popover-Ds1iOdiv.js} +3 -2
  124. package/dist/_chunks/popover-Ds1iOdiv.js.map +1 -0
  125. package/dist/_chunks/{privacy-lock-DWL7m_VT.js → privacy-lock-up2ervfF.js} +41 -39
  126. package/dist/_chunks/privacy-lock-up2ervfF.js.map +1 -0
  127. package/dist/_chunks/{radio-B_gvGU29.js → radio-XSSNX3Af.js} +8 -7
  128. package/dist/_chunks/radio-XSSNX3Af.js.map +1 -0
  129. package/dist/_chunks/{radio-group-Bn8Wt0yc.js → radio-group-DBrUOPcy.js} +19 -18
  130. package/dist/_chunks/radio-group-DBrUOPcy.js.map +1 -0
  131. package/dist/_chunks/{scroll-area-Ba99pJ_R.js → scroll-area-HIq0hJyJ.js} +14 -12
  132. package/dist/_chunks/scroll-area-HIq0hJyJ.js.map +1 -0
  133. package/dist/_chunks/{search-bar-VoTqJhRp.js → search-bar-9Zbew4yM.js} +4 -3
  134. package/dist/_chunks/search-bar-9Zbew4yM.js.map +1 -0
  135. package/dist/_chunks/{search-input-D6rarD0_.js → search-input-CtkWITO2.js} +28 -28
  136. package/dist/_chunks/{search-input-D6rarD0_.js.map → search-input-CtkWITO2.js.map} +1 -1
  137. package/dist/_chunks/{select-CQxhOXVE.js → select-DdAOtomN.js} +18 -17
  138. package/dist/_chunks/select-DdAOtomN.js.map +1 -0
  139. package/dist/_chunks/{separator-BRQHi8s0.js → separator-B4wXDLNC.js} +9 -8
  140. package/dist/_chunks/{separator-BRQHi8s0.js.map → separator-B4wXDLNC.js.map} +1 -1
  141. package/dist/_chunks/{sheet-CKsuHuHB.js → sheet-D7GRhnWw.js} +3 -2
  142. package/dist/_chunks/sheet-D7GRhnWw.js.map +1 -0
  143. package/dist/_chunks/{sidebar-CiEpSH9e.js → sidebar-Dc2ffrbf.js} +4 -3
  144. package/dist/_chunks/sidebar-Dc2ffrbf.js.map +1 -0
  145. package/dist/_chunks/sign-in-with-alfadocs-button-BotwPDcW.js +45 -0
  146. package/dist/_chunks/{sign-in-with-alfadocs-button-BDErAgG2.js.map → sign-in-with-alfadocs-button-BotwPDcW.js.map} +1 -1
  147. package/dist/_chunks/{skeleton-ClO1v5GE.js → skeleton-DAdPFx9d.js} +18 -16
  148. package/dist/_chunks/{skeleton-ClO1v5GE.js.map → skeleton-DAdPFx9d.js.map} +1 -1
  149. package/dist/_chunks/{skip-link-CASJkBOe.js → skip-link-DmZ3c6cb.js} +12 -11
  150. package/dist/_chunks/{skip-link-CASJkBOe.js.map → skip-link-DmZ3c6cb.js.map} +1 -1
  151. package/dist/_chunks/{slider-BVBlOW_l.js → slider-DjyRt3Mp.js} +2 -1
  152. package/dist/_chunks/slider-DjyRt3Mp.js.map +1 -0
  153. package/dist/_chunks/{slot-grid-B4WvLEwT.js → slot-grid-WHc5A8-z.js} +5 -4
  154. package/dist/_chunks/{slot-grid-B4WvLEwT.js.map → slot-grid-WHc5A8-z.js.map} +1 -1
  155. package/dist/_chunks/{spinner-CoAOGcDa.js → spinner-GCcv67vh.js} +2 -1
  156. package/dist/_chunks/spinner-GCcv67vh.js.map +1 -0
  157. package/dist/_chunks/{stat-D76MNHzK.js → stat-DUB6g90R.js} +3 -1
  158. package/dist/_chunks/{stat-D76MNHzK.js.map → stat-DUB6g90R.js.map} +1 -1
  159. package/dist/_chunks/{stepper-accordion-DHQ80A4v.js → stepper-accordion-2_7Pw0tC.js} +2 -1
  160. package/dist/_chunks/{stepper-accordion-DHQ80A4v.js.map → stepper-accordion-2_7Pw0tC.js.map} +1 -1
  161. package/dist/_chunks/{stepper-calendar-BZUJpj8i.js → stepper-calendar-CWZcFgt_.js} +7 -6
  162. package/dist/_chunks/{stepper-calendar-BZUJpj8i.js.map → stepper-calendar-CWZcFgt_.js.map} +1 -1
  163. package/dist/_chunks/{stepper-progress-DMZ5w5VR.js → stepper-progress-rE7tn7WY.js} +12 -11
  164. package/dist/_chunks/{stepper-progress-DMZ5w5VR.js.map → stepper-progress-rE7tn7WY.js.map} +1 -1
  165. package/dist/_chunks/{streaming-text-D0cW8pwq.js → streaming-text-BgjCTVOw.js} +6 -5
  166. package/dist/_chunks/{streaming-text-D0cW8pwq.js.map → streaming-text-BgjCTVOw.js.map} +1 -1
  167. package/dist/_chunks/{suggestion-chip-BgNFpPEE.js → suggestion-chip-6AB40rxz.js} +2 -1
  168. package/dist/_chunks/{suggestion-chip-BgNFpPEE.js.map → suggestion-chip-6AB40rxz.js.map} +1 -1
  169. package/dist/_chunks/{switch-DtLPKO0p.js → switch-DhSORO9C.js} +2 -1
  170. package/dist/_chunks/{switch-DtLPKO0p.js.map → switch-DhSORO9C.js.map} +1 -1
  171. package/dist/_chunks/{tabs.agent-sQAHxebC.js → tabs.agent-BtaNGxRh.js} +3 -2
  172. package/dist/_chunks/tabs.agent-BtaNGxRh.js.map +1 -0
  173. package/dist/_chunks/{tag-CfSZZN2f.js → tag--uLKOb9f.js} +17 -14
  174. package/dist/_chunks/{tag-CfSZZN2f.js.map → tag--uLKOb9f.js.map} +1 -1
  175. package/dist/_chunks/{task-card-B5xfiFg5.js → task-card-BeSuntXP.js} +11 -10
  176. package/dist/_chunks/{task-card-B5xfiFg5.js.map → task-card-BeSuntXP.js.map} +1 -1
  177. package/dist/_chunks/{task-tray-CWvVxWM0.js → task-tray-pRk6u8Ik.js} +10 -9
  178. package/dist/_chunks/{task-tray-CWvVxWM0.js.map → task-tray-pRk6u8Ik.js.map} +1 -1
  179. package/dist/_chunks/{text-area-iPDv7Nah.js → text-area-xf9-6iDf.js} +13 -13
  180. package/dist/_chunks/{text-area-iPDv7Nah.js.map → text-area-xf9-6iDf.js.map} +1 -1
  181. package/dist/_chunks/{text-input-lh6kRXZS.js → text-input-exh7VD7D.js} +10 -9
  182. package/dist/_chunks/{text-input-lh6kRXZS.js.map → text-input-exh7VD7D.js.map} +1 -1
  183. package/dist/_chunks/theme-root-DDb0TJjd.js +18 -0
  184. package/dist/_chunks/{theme-root-vapFjsnt.js.map → theme-root-DDb0TJjd.js.map} +1 -1
  185. package/dist/_chunks/{theme-toggle-CEaPghpm.js → theme-toggle-CJgA6G24.js} +42 -39
  186. package/dist/_chunks/theme-toggle-CJgA6G24.js.map +1 -0
  187. package/dist/_chunks/{time-picker-Crc87DU3.js → time-picker-D-EueWUG.js} +2 -1
  188. package/dist/_chunks/{time-picker-Crc87DU3.js.map → time-picker-D-EueWUG.js.map} +1 -1
  189. package/dist/_chunks/{timeline-Ym2DRmtu.js → timeline-DIueH4TJ.js} +5 -4
  190. package/dist/_chunks/timeline-DIueH4TJ.js.map +1 -0
  191. package/dist/_chunks/{timestamp-DmSt92P1.js → timestamp-BV2lC-wV.js} +2 -1
  192. package/dist/_chunks/{timestamp-DmSt92P1.js.map → timestamp-BV2lC-wV.js.map} +1 -1
  193. package/dist/_chunks/{toast-DoMNrzwm.js → toast-q0SlabGr.js} +2 -2
  194. package/dist/_chunks/{toast-DoMNrzwm.js.map → toast-q0SlabGr.js.map} +1 -1
  195. package/dist/_chunks/{tooltip-Dp3u8jGz.js → tooltip-DHik5yRI.js} +2 -1
  196. package/dist/_chunks/{tooltip-Dp3u8jGz.js.map → tooltip-DHik5yRI.js.map} +1 -1
  197. package/dist/_chunks/{transcript-panel-Bg1BTMSr.js → transcript-panel-DFnhbrlQ.js} +39 -38
  198. package/dist/_chunks/{transcript-panel-Bg1BTMSr.js.map → transcript-panel-DFnhbrlQ.js.map} +1 -1
  199. package/dist/_chunks/{typing-indicator-BRg22Rqr.js → typing-indicator-CbUBf-Dx.js} +9 -8
  200. package/dist/_chunks/{typing-indicator-BRg22Rqr.js.map → typing-indicator-CbUBf-Dx.js.map} +1 -1
  201. package/dist/_chunks/visually-hidden-BlkhaZWe.js +21 -0
  202. package/dist/_chunks/{visually-hidden-Y3jcdCv-.js.map → visually-hidden-BlkhaZWe.js.map} +1 -1
  203. package/dist/_chunks/{warning-stack-5KROOw9M.js → warning-stack-DCmO0R07.js} +25 -23
  204. package/dist/_chunks/warning-stack-DCmO0R07.js.map +1 -0
  205. package/dist/_chunks/{workflow-map-D4sjYv2d.js → workflow-map-CAM6Uy_J.js} +12 -9
  206. package/dist/_chunks/workflow-map-CAM6Uy_J.js.map +1 -0
  207. package/dist/agent-catalog.json +1 -1
  208. package/dist/components/accordion/accordion.d.ts.map +1 -1
  209. package/dist/components/accordion/index.js +1 -1
  210. package/dist/components/agenda-card/agenda-card.d.ts.map +1 -1
  211. package/dist/components/agenda-card/index.js +1 -1
  212. package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
  213. package/dist/components/agenda-tray/index.js +1 -1
  214. package/dist/components/ai-prompt-input/ai-prompt-input.d.ts.map +1 -1
  215. package/dist/components/ai-prompt-input/index.js +1 -1
  216. package/dist/components/alert/alert.d.ts.map +1 -1
  217. package/dist/components/alert/index.js +1 -1
  218. package/dist/components/app-frame/app-frame.d.ts.map +1 -1
  219. package/dist/components/app-frame/index.js +1 -1
  220. package/dist/components/aspect-ratio/aspect-ratio.d.ts.map +1 -1
  221. package/dist/components/aspect-ratio/index.js +1 -1
  222. package/dist/components/audio-recorder/audio-recorder.d.ts.map +1 -1
  223. package/dist/components/audio-recorder/index.js +1 -1
  224. package/dist/components/audio-visualiser/audio-visualiser.d.ts.map +1 -1
  225. package/dist/components/audio-visualiser/index.js +1 -1
  226. package/dist/components/autocomplete/autocomplete.d.ts.map +1 -1
  227. package/dist/components/autocomplete/index.js +1 -1
  228. package/dist/components/avatar/avatar.d.ts.map +1 -1
  229. package/dist/components/avatar/index.js +1 -1
  230. package/dist/components/badge/badge.d.ts.map +1 -1
  231. package/dist/components/badge/index.js +1 -1
  232. package/dist/components/breadcrumb/breadcrumb.d.ts.map +1 -1
  233. package/dist/components/breadcrumb/index.js +1 -1
  234. package/dist/components/button/icon-button.d.ts.map +1 -1
  235. package/dist/components/button/index.js +1 -1
  236. package/dist/components/button-group/button-group.d.ts.map +1 -1
  237. package/dist/components/button-group/index.js +1 -1
  238. package/dist/components/card/card.d.ts.map +1 -1
  239. package/dist/components/card/index.js +1 -1
  240. package/dist/components/chat-container/index.js +1 -1
  241. package/dist/components/chat-input/index.js +1 -1
  242. package/dist/components/chat-message/chat-message.d.ts.map +1 -1
  243. package/dist/components/chat-message/index.js +1 -1
  244. package/dist/components/checkbox/index.js +1 -1
  245. package/dist/components/checkbox-group/checkbox-group.d.ts.map +1 -1
  246. package/dist/components/checkbox-group/index.js +1 -1
  247. package/dist/components/collapsible/collapsible.d.ts.map +1 -1
  248. package/dist/components/collapsible/index.js +1 -1
  249. package/dist/components/color-picker/color-picker.d.ts.map +1 -1
  250. package/dist/components/color-picker/index.js +1 -1
  251. package/dist/components/combobox/combobox.d.ts.map +1 -1
  252. package/dist/components/combobox/index.js +1 -1
  253. package/dist/components/command-palette/command-palette.d.ts.map +1 -1
  254. package/dist/components/command-palette/index.js +1 -1
  255. package/dist/components/data-table/index.js +1 -1
  256. package/dist/components/date-picker/index.js +1 -1
  257. package/dist/components/date-range-picker/index.js +1 -1
  258. package/dist/components/date-time-picker/index.js +1 -1
  259. package/dist/components/description-list/description-list.d.ts.map +1 -1
  260. package/dist/components/description-list/index.js +1 -1
  261. package/dist/components/dialog/index.js +1 -1
  262. package/dist/components/dropdown-menu/dropdown-menu.d.ts.map +1 -1
  263. package/dist/components/dropdown-menu/index.js +1 -1
  264. package/dist/components/empty-state/empty-state.d.ts.map +1 -1
  265. package/dist/components/empty-state/index.js +1 -1
  266. package/dist/components/file-upload/index.js +1 -1
  267. package/dist/components/flag/flag.d.ts.map +1 -1
  268. package/dist/components/flag/index.js +1 -1
  269. package/dist/components/floating-action-button/floating-action-button.d.ts.map +1 -1
  270. package/dist/components/floating-action-button/index.js +1 -1
  271. package/dist/components/form-field/form-field.d.ts.map +1 -1
  272. package/dist/components/form-field/index.js +1 -1
  273. package/dist/components/freemium-paywall/freemium-paywall.d.ts.map +1 -1
  274. package/dist/components/freemium-paywall/index.js +1 -1
  275. package/dist/components/header/header.d.ts.map +1 -1
  276. package/dist/components/header/index.js +1 -1
  277. package/dist/components/icon-button/index.js +1 -1
  278. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  279. package/dist/components/icon-button-group/index.js +1 -1
  280. package/dist/components/kbd/index.js +1 -1
  281. package/dist/components/kbd/kbd.d.ts.map +1 -1
  282. package/dist/components/key-value-pair/index.js +1 -1
  283. package/dist/components/key-value-pair/key-value-pair.d.ts.map +1 -1
  284. package/dist/components/list/index.js +1 -1
  285. package/dist/components/list/list.d.ts.map +1 -1
  286. package/dist/components/live-region/index.js +1 -1
  287. package/dist/components/live-region/live-region.d.ts.map +1 -1
  288. package/dist/components/logo/index.js +1 -1
  289. package/dist/components/matrix-rain/index.js +1 -1
  290. package/dist/components/matrix-rain/matrix-rain.d.ts.map +1 -1
  291. package/dist/components/message-card/index.js +1 -1
  292. package/dist/components/message-card/message-card.d.ts.map +1 -1
  293. package/dist/components/message-tray/index.js +1 -1
  294. package/dist/components/message-tray/message-tray.d.ts.map +1 -1
  295. package/dist/components/multi-select/index.js +1 -1
  296. package/dist/components/multi-select/multi-select.d.ts.map +1 -1
  297. package/dist/components/navigation-menu/index.js +2 -2
  298. package/dist/components/navigation-menu/navigation-menu.d.ts.map +1 -1
  299. package/dist/components/notification-card/index.js +1 -1
  300. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  301. package/dist/components/notification-tray/index.js +1 -1
  302. package/dist/components/notification-tray/notification-tray.d.ts.map +1 -1
  303. package/dist/components/number-input/index.js +1 -1
  304. package/dist/components/number-input/number-input.d.ts.map +1 -1
  305. package/dist/components/otp-input/index.js +1 -1
  306. package/dist/components/otp-input/otp-input.d.ts.map +1 -1
  307. package/dist/components/pagination/index.js +1 -1
  308. package/dist/components/pagination/pagination.d.ts.map +1 -1
  309. package/dist/components/password-input/index.js +1 -1
  310. package/dist/components/payment-form/index.js +1 -1
  311. package/dist/components/pdf-viewer/index.js +1 -1
  312. package/dist/components/phone-input/index.js +1 -1
  313. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  314. package/dist/components/popover/index.js +1 -1
  315. package/dist/components/popover/popover.d.ts.map +1 -1
  316. package/dist/components/privacy-lock/index.js +1 -1
  317. package/dist/components/privacy-lock/privacy-lock.d.ts.map +1 -1
  318. package/dist/components/radio/index.js +1 -1
  319. package/dist/components/radio-group/index.js +2 -2
  320. package/dist/components/radio-group/radio-group.d.ts.map +1 -1
  321. package/dist/components/radio-group/radio.d.ts.map +1 -1
  322. package/dist/components/scroll-area/index.js +1 -1
  323. package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
  324. package/dist/components/search-bar/index.js +1 -1
  325. package/dist/components/search-input/index.js +1 -1
  326. package/dist/components/select/index.js +1 -1
  327. package/dist/components/select/select.d.ts.map +1 -1
  328. package/dist/components/separator/index.js +1 -1
  329. package/dist/components/separator/separator.d.ts.map +1 -1
  330. package/dist/components/sheet/index.js +1 -1
  331. package/dist/components/sheet/sheet.d.ts.map +1 -1
  332. package/dist/components/sidebar/index.js +1 -1
  333. package/dist/components/sidebar/sidebar.d.ts.map +1 -1
  334. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  335. package/dist/components/sign-in-with-alfadocs-button/sign-in-with-alfadocs-button.d.ts.map +1 -1
  336. package/dist/components/skeleton/index.js +1 -1
  337. package/dist/components/skeleton/skeleton.d.ts.map +1 -1
  338. package/dist/components/skip-link/index.js +1 -1
  339. package/dist/components/skip-link/skip-link.d.ts.map +1 -1
  340. package/dist/components/slider/index.js +1 -1
  341. package/dist/components/slider/slider.d.ts.map +1 -1
  342. package/dist/components/slot-grid/index.js +1 -1
  343. package/dist/components/slot-grid/slot-grid.d.ts.map +1 -1
  344. package/dist/components/spinner/index.js +1 -1
  345. package/dist/components/spinner/spinner.d.ts.map +1 -1
  346. package/dist/components/stat/index.js +1 -1
  347. package/dist/components/stat/stat.d.ts.map +1 -1
  348. package/dist/components/stepper-accordion/index.js +1 -1
  349. package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
  350. package/dist/components/stepper-calendar/index.js +1 -1
  351. package/dist/components/stepper-calendar/stepper-calendar.d.ts.map +1 -1
  352. package/dist/components/stepper-progress/index.js +1 -1
  353. package/dist/components/stepper-progress/stepper-progress.d.ts.map +1 -1
  354. package/dist/components/streaming-text/index.js +1 -1
  355. package/dist/components/streaming-text/streaming-text.d.ts.map +1 -1
  356. package/dist/components/suggestion-chip/index.js +1 -1
  357. package/dist/components/suggestion-chip/suggestion-chip.d.ts.map +1 -1
  358. package/dist/components/switch/index.js +1 -1
  359. package/dist/components/switch/switch.d.ts.map +1 -1
  360. package/dist/components/tabs/index.js +1 -1
  361. package/dist/components/tabs/tabs.d.ts.map +1 -1
  362. package/dist/components/tag/index.js +1 -1
  363. package/dist/components/tag/tag.d.ts.map +1 -1
  364. package/dist/components/task-card/index.js +1 -1
  365. package/dist/components/task-card/task-card.d.ts.map +1 -1
  366. package/dist/components/task-tray/index.js +1 -1
  367. package/dist/components/task-tray/task-tray.d.ts.map +1 -1
  368. package/dist/components/text-area/index.js +1 -1
  369. package/dist/components/text-input/index.js +1 -1
  370. package/dist/components/text-input/text-input.d.ts.map +1 -1
  371. package/dist/components/theme-root/index.js +1 -1
  372. package/dist/components/theme-toggle/index.js +1 -1
  373. package/dist/components/theme-toggle/theme-toggle.d.ts.map +1 -1
  374. package/dist/components/time-picker/index.js +1 -1
  375. package/dist/components/time-picker/time-picker.d.ts.map +1 -1
  376. package/dist/components/timeline/index.js +1 -1
  377. package/dist/components/timeline/timeline.d.ts.map +1 -1
  378. package/dist/components/timestamp/index.js +1 -1
  379. package/dist/components/timestamp/timestamp.d.ts.map +1 -1
  380. package/dist/components/toast/index.js +1 -1
  381. package/dist/components/tooltip/index.js +1 -1
  382. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  383. package/dist/components/transcript-panel/index.js +1 -1
  384. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  385. package/dist/components/typing-indicator/index.js +1 -1
  386. package/dist/components/typing-indicator/typing-indicator.d.ts.map +1 -1
  387. package/dist/components/visually-hidden/index.js +1 -1
  388. package/dist/components/warning-stack/index.js +1 -1
  389. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  390. package/dist/components/workflow/index.js +1 -1
  391. package/dist/components/workflow/workflow-card.d.ts.map +1 -1
  392. package/dist/components/workflow/workflow-editor.d.ts.map +1 -1
  393. package/dist/components/workflow/workflow-map.d.ts.map +1 -1
  394. package/dist/index.js +103 -103
  395. package/dist/patterns/leo-assistant/index.js +1 -1
  396. package/dist/patterns/patient-shell/index.js +1 -1
  397. package/package.json +504 -135
  398. package/dist/_chunks/accordion-BJD1aM67.js.map +0 -1
  399. package/dist/_chunks/ai-prompt-input-8IShJ-GX.js.map +0 -1
  400. package/dist/_chunks/breadcrumb-pdUacgm1.js.map +0 -1
  401. package/dist/_chunks/card-DeItIBcV.js.map +0 -1
  402. package/dist/_chunks/chat-input-C-B4snVJ.js.map +0 -1
  403. package/dist/_chunks/chat-message-cFNbQYRH.js.map +0 -1
  404. package/dist/_chunks/checkbox-group-DBnIBRT_.js.map +0 -1
  405. package/dist/_chunks/collapsible-DPGQnHZh.js.map +0 -1
  406. package/dist/_chunks/combobox.agent-9w6W1Jct.js.map +0 -1
  407. package/dist/_chunks/command-palette.agent-Dg7jhOIc.js.map +0 -1
  408. package/dist/_chunks/date-range-picker-CtwEwoyr.js.map +0 -1
  409. package/dist/_chunks/description-list-Bk3p71qY.js.map +0 -1
  410. package/dist/_chunks/dropdown-menu-BnVUeVG3.js.map +0 -1
  411. package/dist/_chunks/form-field-DI5LY5aG.js.map +0 -1
  412. package/dist/_chunks/freemium-paywall-CCsX3GhK.js.map +0 -1
  413. package/dist/_chunks/icon-button-SWpSs9S6.js.map +0 -1
  414. package/dist/_chunks/kbd-DTcIjYA7.js.map +0 -1
  415. package/dist/_chunks/list-Cwe8mcmh.js.map +0 -1
  416. package/dist/_chunks/live-region-COggO6x6.js +0 -57
  417. package/dist/_chunks/message-card-B0oGrI3i.js.map +0 -1
  418. package/dist/_chunks/message-tray-DZ6oZ0cs.js.map +0 -1
  419. package/dist/_chunks/multi-select.agent-BDEVGMmW.js.map +0 -1
  420. package/dist/_chunks/navigation-menu-NjwxyshT.js.map +0 -1
  421. package/dist/_chunks/pagination.agent-sxokDphY.js.map +0 -1
  422. package/dist/_chunks/password-input-C6PvKyQV.js.map +0 -1
  423. package/dist/_chunks/phone-input-BavVyXxZ.js.map +0 -1
  424. package/dist/_chunks/popover-BWgOopjI.js.map +0 -1
  425. package/dist/_chunks/privacy-lock-DWL7m_VT.js.map +0 -1
  426. package/dist/_chunks/radio-B_gvGU29.js.map +0 -1
  427. package/dist/_chunks/radio-group-Bn8Wt0yc.js.map +0 -1
  428. package/dist/_chunks/scroll-area-Ba99pJ_R.js.map +0 -1
  429. package/dist/_chunks/search-bar-VoTqJhRp.js.map +0 -1
  430. package/dist/_chunks/select-CQxhOXVE.js.map +0 -1
  431. package/dist/_chunks/sheet-CKsuHuHB.js.map +0 -1
  432. package/dist/_chunks/sidebar-CiEpSH9e.js.map +0 -1
  433. package/dist/_chunks/sign-in-with-alfadocs-button-BDErAgG2.js +0 -44
  434. package/dist/_chunks/slider-BVBlOW_l.js.map +0 -1
  435. package/dist/_chunks/spinner-CoAOGcDa.js.map +0 -1
  436. package/dist/_chunks/tabs.agent-sQAHxebC.js.map +0 -1
  437. package/dist/_chunks/theme-root-vapFjsnt.js +0 -18
  438. package/dist/_chunks/theme-toggle-CEaPghpm.js.map +0 -1
  439. package/dist/_chunks/timeline-Ym2DRmtu.js.map +0 -1
  440. package/dist/_chunks/visually-hidden-Y3jcdCv-.js +0 -21
  441. package/dist/_chunks/warning-stack-5KROOw9M.js.map +0 -1
  442. package/dist/_chunks/workflow-map-D4sjYv2d.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"stepper-calendar-BZUJpj8i.js","sources":["../../node_modules/date-fns/subMonths.js","../../src/components/stepper-calendar/stepper-calendar.tsx"],"sourcesContent":["import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n addDays,\n addMonths,\n format as fnsFormat,\n isSameDay,\n isSameMonth,\n parseISO,\n startOfMonth,\n startOfWeek,\n subMonths,\n} from 'date-fns';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type { StepSpec, StepStatus } from '../_shared/stepper';\nimport { stateForStep } from '../_shared/stepper';\nimport { StepperProgress } from '../stepper-progress/stepper-progress';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { SlotGrid, type SlotGridDay, type SlotGridSlot } from '../slot-grid/slot-grid';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { resolveFirstDay } from '../calendar/calendar';\n\n// Slot IDs use a fixed `${yyyy-mm-dd}T${HH:mm}` shape so the trailing time\n// segment can be safely peeled off in onSlotSelect. Validating against the\n// shape rather than splitting blindly so an unexpected ID surfaces as a\n// no-op rather than a malformed time value.\nconst SLOT_ID_PATTERN = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2})$/;\n\n/* -------------------------------------------------------------------- */\n/* StepperCalendar */\n/* */\n/* Single-component, A/B-testable appointment-booking flow with 4 */\n/* fixed steps in this order: */\n/* 0. Service — pick from `services` */\n/* 1. Date — inline month grid; only `availableDates` are enabled */\n/* 2. Time — slot grid showing `availableSlots[selectedDate]` */\n/* 3. Details — render-prop slot for the consumer's form fields */\n/* -------------------------------------------------------------------- */\n\n/** Service offering rendered on Step 1. Data is API-driven by the consumer. */\nexport interface StepperCalendarService {\n id: string;\n /** Already-translated label (consumer is responsible for i18n of data). */\n label: string;\n /** Duration in minutes — shown alongside the label. */\n durationMin: number;\n /** Optional secondary line. */\n description?: string;\n}\n\n/** Re-exported for convenience. */\nexport type ServiceOption = StepperCalendarService;\n\n/** Booking selection — controlled by the consumer. */\nexport interface StepperCalendarValue {\n serviceId?: string;\n /** ISO yyyy-mm-dd. */\n date?: string;\n /** HH:mm (24h). */\n time?: string;\n}\n\nconst TOTAL_STEPS = 4;\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-md)] ds:text-[var(--foreground)]',\n {\n variants: {\n layout: {\n vertical: 'ds:flex-col',\n horizontal: 'ds:lg:flex-row ds:lg:items-start',\n },\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n layout: 'vertical',\n density: 'comfortable',\n },\n },\n);\n\nconst stepBodyVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--card)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { density: 'comfortable' },\n },\n);\n\nconst serviceCardVariants = cva(\n [\n 'ds:group/service ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:text-start',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--background)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:transition-[background-color,border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-checked:border-[var(--primary)] ds:aria-checked:bg-[var(--primary)]/5',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst monthHeaderVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]',\n);\n\nconst monthGridVariants = cva(\n 'ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-xs)]',\n);\n\nconst dayCellVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n // `min-target-size` (44/48px) governs the rendered size — it always\n // exceeds the explicit floor below. Keeping the explicit floor for\n // grid layout stability when the cell content is empty (skeletons),\n // matching the precedent in `slot-grid`.\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:h-10 ds:w-10 ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-[var(--font-weight-medium)]',\n 'ds:border ds:border-transparent ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:transition-[background-color,border-color,color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-40 ds:disabled:cursor-not-allowed',\n 'ds:aria-selected:bg-[var(--primary)] ds:aria-selected:text-[var(--primary-foreground)]',\n 'ds:aria-selected:border-[var(--primary)]',\n 'ds:data-[outside=true]:text-[var(--muted-foreground)]',\n ].join(' '),\n);\n\nconst actionsRowVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:mt-[var(--spacing-md)]',\n);\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nfunction isoDay(date: Date): string {\n return fnsFormat(date, 'yyyy-MM-dd');\n}\n\n/** Compute the first incomplete step from the current value. */\nfunction firstIncompleteStep(value: StepperCalendarValue): number {\n if (!value.serviceId) return 0;\n if (!value.date) return 1;\n if (!value.time) return 2;\n return 3;\n}\n\n/* -------------------------------------------------------------------- */\n/* Public props */\n/* -------------------------------------------------------------------- */\n\nexport interface StepperCalendarProps\n extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n >,\n VariantProps<typeof rootVariants> {\n services: StepperCalendarService[];\n availableDates: string[];\n availableSlots: Record<string, string[]>;\n value: StepperCalendarValue;\n onChange: (next: StepperCalendarValue) => void;\n onSubmit?: (value: StepperCalendarValue) => void;\n detailsFields?: ReactNode;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n /** Per-step status overrides — `error` will mark a step in the rail. */\n stepStatuses?: Partial<Record<0 | 1 | 2 | 3, StepStatus>>;\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Service grid (Step 0) */\n/* -------------------------------------------------------------------- */\n\ninterface ServiceGridProps {\n services: StepperCalendarService[];\n selectedId?: string;\n onSelect: (id: string) => void;\n durationLabel: (minutes: number) => string;\n groupLabel: string;\n}\n\nconst ServiceGrid = forwardRef<HTMLDivElement, ServiceGridProps>(\n ({ services, selectedId, onSelect, durationLabel, groupLabel }, ref) => {\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const focusedIndex = (() => {\n const i = services.findIndex((s) => s.id === selectedId);\n return i >= 0 ? i : 0;\n })();\n\n const moveFocus = (next: number) => {\n const wrapped = (next + services.length) % services.length;\n const target = itemRefs.current[wrapped];\n if (!target) return;\n // Per WAI-ARIA radiogroup, arrow keys move focus AND selection.\n target.focus();\n const svc = services[wrapped];\n if (svc) onSelect(svc.id);\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n currentIndex: number,\n ) => {\n // RTL inversion: in an RTL document, ArrowLeft visually advances forward.\n const isRtl =\n typeof document !== 'undefined' &&\n document.documentElement.dir === 'rtl';\n const forward = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const back = isRtl ? 'ArrowRight' : 'ArrowLeft';\n if (event.key === forward || event.key === 'ArrowDown') {\n event.preventDefault();\n moveFocus(currentIndex + 1);\n return;\n }\n if (event.key === back || event.key === 'ArrowUp') {\n event.preventDefault();\n moveFocus(currentIndex - 1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(0);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(services.length - 1);\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label={groupLabel}\n className=\"ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\"\n >\n {services.map((svc, index) => {\n const checked = svc.id === selectedId;\n const isRovingTabStop = index === focusedIndex;\n return (\n <button\n key={svc.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n tabIndex={isRovingTabStop ? 0 : -1}\n onClick={() => onSelect(svc.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n className={serviceCardVariants()}\n >\n <span className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {svc.label}\n </span>\n {svc.description ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {svc.description}\n </span>\n ) : null}\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {durationLabel(svc.durationMin)}\n </span>\n </button>\n );\n })}\n </div>\n );\n },\n);\nServiceGrid.displayName = 'StepperCalendar.ServiceGrid';\n\n/* -------------------------------------------------------------------- */\n/* Inline month grid (Step 1) */\n/* -------------------------------------------------------------------- */\n\ntype WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\ninterface MonthGridProps {\n availableDates: Set<string>;\n selectedDate?: string;\n onSelectDate: (iso: string) => void;\n loading: boolean;\n locale: string;\n weekStartsOn: WeekStart;\n prevLabel: string;\n nextLabel: string;\n emptyLabel: string;\n}\n\nconst MonthGrid = forwardRef<HTMLDivElement, MonthGridProps>(\n (\n {\n availableDates,\n selectedDate,\n onSelectDate,\n loading,\n locale,\n weekStartsOn,\n prevLabel,\n nextLabel,\n emptyLabel,\n },\n ref,\n ) => {\n const initialMonth = useMemo(() => {\n if (selectedDate) return parseISO(selectedDate);\n const first = [...availableDates].sort()[0];\n return first ? parseISO(first) : new Date();\n }, [availableDates, selectedDate]);\n\n const [month, setMonth] = useState<Date>(initialMonth);\n const [focusedDay, setFocusedDay] = useState<Date>(\n selectedDate ? parseISO(selectedDate) : initialMonth,\n );\n\n // Build the 6x7 grid (always full weeks for stable layout).\n const monthStart = startOfMonth(month);\n const gridStart = startOfWeek(monthStart, { weekStartsOn });\n const days: Date[] = useMemo(() => {\n const cells: Date[] = [];\n for (let i = 0; i < 42; i += 1) {\n cells.push(addDays(gridStart, i));\n }\n return cells;\n }, [gridStart]);\n\n const weekdayLabels = useMemo(() => {\n const base = startOfWeek(new Date(), { weekStartsOn });\n const fmt = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return Array.from({ length: 7 }, (_, i) => fmt.format(addDays(base, i)));\n }, [locale, weekStartsOn]);\n\n const monthLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(month);\n } catch {\n return fnsFormat(month, 'MMMM yyyy');\n }\n }, [locale, month]);\n\n const isAvailable = useCallback(\n (d: Date) => availableDates.has(isoDay(d)),\n [availableDates],\n );\n\n const moveFocus = useCallback(\n (next: Date) => {\n setFocusedDay(next);\n if (!isSameMonth(next, month)) setMonth(startOfMonth(next));\n },\n [month],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const map: Record<string, number> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -7,\n ArrowDown: 7,\n };\n if (event.key in map) {\n event.preventDefault();\n moveFocus(addDays(focusedDay, map[event.key]));\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(startOfWeek(focusedDay, { weekStartsOn }));\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(addDays(startOfWeek(focusedDay, { weekStartsOn }), 6));\n return;\n }\n if (event.key === 'PageUp') {\n event.preventDefault();\n moveFocus(subMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'PageDown') {\n event.preventDefault();\n moveFocus(addMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (isAvailable(focusedDay)) onSelectDate(isoDay(focusedDay));\n }\n };\n\n const focusedRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n // Move focus to the focused day when it changes. Note: when the parent\n // StepperCalendar transitions Service → Date, its own step-change focus\n // effect *also* tries to focus the body's first interactive element. In\n // practice this effect runs deeper in the tree and after mount, so it\n // wins — but consumers should be aware of the interaction if they\n // tweak the ordering.\n focusedRef.current?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusedDay.getTime()]);\n\n if (loading) {\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"40%\" />\n <div className={monthGridVariants()}>\n {Array.from({ length: 42 }, (_, i) => (\n <Skeleton\n key={`day-skeleton-${i}`}\n variant=\"rounded\"\n size=\"md\"\n height=\"40px\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n if (availableDates.size === 0) {\n return (\n <div ref={ref}>\n <EmptyState variant=\"no-results\" title={emptyLabel} />\n </div>\n );\n }\n\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className={monthHeaderVariants()}>\n <IconButton\n icon={<ChevronLeft />}\n aria-label={prevLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(subMonths(month, 1))}\n />\n <span\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)]\"\n aria-live=\"polite\"\n >\n {monthLabel}\n </span>\n <IconButton\n icon={<ChevronRight />}\n aria-label={nextLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(addMonths(month, 1))}\n />\n </div>\n <div\n role=\"grid\"\n aria-label={monthLabel}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleKeyDown}\n >\n <div className={monthGridVariants()} role=\"row\">\n {weekdayLabels.map((wd) => (\n <span\n key={wd}\n role=\"columnheader\"\n className=\"type-meta ds:text-center ds:text-[var(--muted-foreground)]\"\n >\n {wd}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, weekIndex) => {\n const week = days.slice(weekIndex * 7, weekIndex * 7 + 7);\n return (\n <div\n key={`week-${weekIndex}`}\n role=\"row\"\n className={monthGridVariants()}\n >\n {week.map((d) => {\n const iso = isoDay(d);\n const outside = !isSameMonth(d, month);\n const available = isAvailable(d);\n const selected = selectedDate === iso;\n const isFocused = isSameDay(d, focusedDay);\n return (\n <button\n key={iso}\n ref={isFocused ? focusedRef : undefined}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={selected}\n aria-disabled={!available || undefined}\n disabled={!available}\n data-outside={outside || undefined}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => available && onSelectDate(iso)}\n className={dayCellVariants()}\n >\n {fnsFormat(d, 'd')}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n },\n);\nMonthGrid.displayName = 'StepperCalendar.MonthGrid';\n\n/* -------------------------------------------------------------------- */\n/* Time step body */\n/* -------------------------------------------------------------------- */\n\ninterface TimeStepBodyProps {\n date?: string;\n slots: string[];\n selectedTime?: string;\n loading: boolean;\n emptyLabel: string;\n onSelect: (time: string) => void;\n}\n\nfunction TimeStepBody({\n date,\n slots,\n selectedTime,\n loading,\n emptyLabel,\n onSelect,\n}: TimeStepBodyProps) {\n if (!date) return null;\n if (loading) {\n return (\n <SlotGrid\n days={[{ date, slots: [] }]}\n state=\"loading\"\n />\n );\n }\n if (slots.length === 0) {\n return <EmptyState variant=\"no-results\" title={emptyLabel} />;\n }\n const slotObjects: SlotGridSlot[] = slots.map((time) => {\n // Build a Date from `date` + `time` for `Intl` formatting.\n const [h, m] = time.split(':');\n const start = parseISO(date);\n start.setHours(Number(h), Number(m), 0, 0);\n return {\n id: `${date}T${time}`,\n start,\n label: time,\n };\n });\n const day: SlotGridDay = { date, slots: slotObjects };\n return (\n <SlotGrid\n days={[day]}\n selectedSlotId={selectedTime ? `${date}T${selectedTime}` : undefined}\n onSlotSelect={(slot) => {\n // Validate against the documented `${yyyy-mm-dd}T${HH:mm}` shape so\n // an unexpected ID surfaces as a no-op rather than a malformed time.\n const match = SLOT_ID_PATTERN.exec(slot.id);\n if (match) onSelect(match[2]);\n }}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperCalendar = forwardRef<HTMLDivElement, StepperCalendarProps>(\n (\n {\n services,\n availableDates,\n availableSlots,\n value,\n onChange,\n onSubmit,\n detailsFields,\n loadingDates = false,\n loadingSlots = false,\n stepStatuses,\n layout = 'vertical',\n density = 'comfortable',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const locale = i18n.language ?? 'en';\n const weekStartsOn = useMemo(\n () => resolveFirstDay(locale) as WeekStart,\n [locale],\n );\n\n // Derive max-allowed step from value, then clamp internal active step.\n const maxAllowed = firstIncompleteStep(value);\n const [activeStep, setActiveStep] = useState<number>(maxAllowed);\n // If `value` regresses (consumer cleared a field), pull active back.\n useEffect(() => {\n if (activeStep > maxAllowed) setActiveStep(maxAllowed);\n }, [activeStep, maxAllowed]);\n\n const headingRef = useRef<HTMLHeadingElement>(null);\n const isFirstRenderRef = useRef(true);\n\n // Move focus to the new step's heading when activeStep changes (skip\n // first render to avoid stealing focus on mount). Targeting the heading\n // (rather than the first interactive control) is the pattern recommended\n // by 05-accessibility.mdx — screen-reader users hear the step label\n // before any field, and sighted keyboard users can Tab into the form.\n useEffect(() => {\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n return;\n }\n headingRef.current?.focus();\n }, [activeStep]);\n\n const steps: StepSpec[] = useMemo(\n () => [\n {\n label: t('navigation.stepperCalendar.steps.service'),\n status: stepStatuses?.[0],\n },\n {\n label: t('navigation.stepperCalendar.steps.date'),\n status: stepStatuses?.[1],\n },\n {\n label: t('navigation.stepperCalendar.steps.time'),\n status: stepStatuses?.[2],\n },\n {\n label: t('navigation.stepperCalendar.steps.details'),\n status: stepStatuses?.[3],\n },\n ],\n [stepStatuses, t],\n );\n\n const label = ariaLabel ?? t('navigation.stepperCalendar.label');\n const backLabel = t('navigation.stepperCalendar.actions.back');\n const nextLabel = t('navigation.stepperCalendar.actions.next');\n const submitLabel = t('navigation.stepperCalendar.actions.submit');\n const emptyTimeLabel = t('navigation.stepperCalendar.time.empty');\n const prevMonthLabel = t('navigation.stepperCalendar.date.previousMonth');\n const nextMonthLabel = t('navigation.stepperCalendar.date.nextMonth');\n const serviceGroupLabel = t('navigation.stepperCalendar.steps.service');\n\n const durationLabel = useCallback(\n (minutes: number) =>\n t('navigation.stepperCalendar.service.duration', { minutes }),\n [t],\n );\n\n const canAdvance = (() => {\n if (activeStep === 0) return Boolean(value.serviceId);\n if (activeStep === 1) return Boolean(value.date);\n if (activeStep === 2) return Boolean(value.time);\n return false; // step 3 is terminal\n })();\n\n const handleServiceSelect = (serviceId: string) => {\n onChange({ ...value, serviceId });\n // Auto-advance for conversion. Use a short delay so users see the\n // selection register before the step swaps. Plain `setTimeout` (not\n // `window.setTimeout`) so the component does not assume a DOM global.\n setTimeout(() => {\n setActiveStep((s) => (s === 0 ? 1 : s));\n }, 120);\n };\n\n const handleDateSelect = (date: string) => {\n // Clear time when date changes.\n onChange({ ...value, date, time: undefined });\n };\n\n const handleTimeSelect = (time: string) => {\n onChange({ ...value, time });\n };\n\n const handleBack = () => setActiveStep((s) => Math.max(0, s - 1));\n const handleNext = () =>\n setActiveStep((s) => Math.min(TOTAL_STEPS - 1, s + 1));\n const handleSubmit = () => onSubmit?.(value);\n\n const headingId = `stepper-calendar-step-${activeStep}-heading`;\n const availableDateSet = useMemo(\n () => new Set(availableDates),\n [availableDates],\n );\n\n /* ---- Active step body ---- */\n let body: ReactNode = null;\n if (activeStep === 0) {\n body = (\n <ServiceGrid\n services={services}\n selectedId={value.serviceId}\n onSelect={handleServiceSelect}\n durationLabel={durationLabel}\n groupLabel={serviceGroupLabel}\n />\n );\n } else if (activeStep === 1) {\n body = (\n <MonthGrid\n availableDates={availableDateSet}\n selectedDate={value.date}\n onSelectDate={handleDateSelect}\n loading={loadingDates}\n locale={locale}\n weekStartsOn={weekStartsOn}\n prevLabel={prevMonthLabel}\n nextLabel={nextMonthLabel}\n emptyLabel={emptyTimeLabel}\n />\n );\n } else if (activeStep === 2) {\n body = (\n <TimeStepBody\n date={value.date}\n slots={value.date ? (availableSlots[value.date] ?? []) : []}\n selectedTime={value.time}\n loading={loadingSlots}\n emptyLabel={emptyTimeLabel}\n onSelect={handleTimeSelect}\n />\n );\n } else {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {detailsFields}\n </div>\n );\n }\n\n const isTerminal = activeStep === TOTAL_STEPS - 1;\n const activeState = stateForStep(\n activeStep,\n activeStep,\n stepStatuses?.[activeStep as 0 | 1 | 2 | 3],\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label}\n className={rootVariants({ layout, density, className })}\n {...rest}\n >\n <StepperProgress\n activeStep={activeStep}\n steps={steps}\n aria-label={label}\n />\n <section\n aria-labelledby={headingId}\n className={stepBodyVariants({ density })}\n data-step={activeStep}\n data-state={activeState}\n >\n <h2\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:focus:outline-none\"\n >\n {steps[activeStep]?.label}\n </h2>\n {body}\n <div className={actionsRowVariants()}>\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"md\"\n onClick={handleBack}\n disabled={activeStep === 0}\n >\n {backLabel}\n </Button>\n {isTerminal ? (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleSubmit}\n >\n {submitLabel}\n </Button>\n ) : (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleNext}\n disabled={!canAdvance}\n >\n {nextLabel}\n </Button>\n )}\n </div>\n </section>\n </div>\n );\n },\n);\nStepperCalendar.displayName = 'StepperCalendar';\n\nexport { StepperCalendar };\n"],"names":["subMonths","date","amount","options","addMonths","SLOT_ID_PATTERN","TOTAL_STEPS","rootVariants","cva","stepBodyVariants","serviceCardVariants","monthHeaderVariants","monthGridVariants","dayCellVariants","actionsRowVariants","isoDay","fnsFormat","firstIncompleteStep","value","ServiceGrid","forwardRef","services","selectedId","onSelect","durationLabel","groupLabel","ref","itemRefs","useRef","focusedIndex","i","moveFocus","next","wrapped","target","svc","handleKeyDown","event","currentIndex","isRtl","forward","back","jsx","index","checked","jsxs","el","e","MonthGrid","availableDates","selectedDate","onSelectDate","loading","locale","weekStartsOn","prevLabel","nextLabel","emptyLabel","initialMonth","useMemo","parseISO","first","month","setMonth","useState","focusedDay","setFocusedDay","monthStart","startOfMonth","gridStart","startOfWeek","days","cells","addDays","weekdayLabels","base","fmt","_","monthLabel","isAvailable","useCallback","d","isSameMonth","map","focusedRef","useEffect","_a","Skeleton","EmptyState","IconButton","ChevronLeft","ChevronRight","wd","weekIndex","week","iso","outside","available","selected","isFocused","isSameDay","TimeStepBody","slots","selectedTime","SlotGrid","slotObjects","time","h","m","start","slot","match","StepperCalendar","availableSlots","onChange","onSubmit","detailsFields","loadingDates","loadingSlots","stepStatuses","layout","density","ariaLabel","className","rest","t","i18n","useTranslation","resolveFirstDay","maxAllowed","activeStep","setActiveStep","headingRef","isFirstRenderRef","steps","label","backLabel","submitLabel","emptyTimeLabel","prevMonthLabel","nextMonthLabel","serviceGroupLabel","minutes","canAdvance","handleServiceSelect","serviceId","s","handleDateSelect","handleTimeSelect","handleBack","handleNext","handleSubmit","headingId","availableDateSet","body","isTerminal","activeState","stateForStep","StepperProgress","Button"],"mappings":";;;;;;;;;;;;;;;;AA4BO,SAASA,GAAUC,GAAMC,GAAQC,GAAS;AAC/C,SAAOC,EAAUH,GAAM,IAASE,CAAO;AACzC;ACSA,MAAME,KAAkB,uCAoClBC,KAAc,GAEdC,KAAeC;AAAA,EACnB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,UAAU;AAAA,QACV,YAAY;AAAA,MAAA;AAAA,MAEd,SAAS;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,iBAAiB;AAAA,MACf,QAAQ;AAAA,MACR,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ,GAEMC,KAAmBD;AAAA,EACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,iBAAiB,EAAE,SAAS,cAAA;AAAA,EAAc;AAE9C,GAEME,KAAsBF;AAAA,EAC1B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMG,KAAsBH;AAAA,EAC1B;AACF,GAEMI,IAAoBJ;AAAA,EACxB;AACF,GAEMK,KAAkBL;AAAA,EACtB;AAAA,IACE;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAEMM,KAAqBN;AAAA,EACzB;AACF;AAMA,SAASO,EAAOd,GAAoB;AAClC,SAAOe,EAAUf,GAAM,YAAY;AACrC;AAGA,SAASgB,GAAoBC,GAAqC;AAChE,SAAKA,EAAM,YACNA,EAAM,OACNA,EAAM,OACJ,IADiB,IADA,IADK;AAI/B;AAsCA,MAAMC,KAAcC;AAAA,EAClB,CAAC,EAAE,UAAAC,GAAU,YAAAC,GAAY,UAAAC,GAAU,eAAAC,GAAe,YAAAC,EAAA,GAAcC,MAAQ;AACtE,UAAMC,IAAWC,EAAqC,EAAE,GAClDC,KAAgB,MAAM;AAC1B,YAAMC,IAAIT,EAAS,UAAU,CAAC,MAAM,EAAE,OAAOC,CAAU;AACvD,aAAOQ,KAAK,IAAIA,IAAI;AAAA,IACtB,GAAA,GAEMC,IAAY,CAACC,MAAiB;AAClC,YAAMC,KAAWD,IAAOX,EAAS,UAAUA,EAAS,QAC9Ca,IAASP,EAAS,QAAQM,CAAO;AACvC,UAAI,CAACC,EAAQ;AAEb,MAAAA,EAAO,MAAA;AACP,YAAMC,IAAMd,EAASY,CAAO;AAC5B,MAAIE,KAAKZ,EAASY,EAAI,EAAE;AAAA,IAC1B,GAEMC,IAAgB,CACpBC,GACAC,MACG;AAEH,YAAMC,IACJ,OAAO,WAAa,OACpB,SAAS,gBAAgB,QAAQ,OAC7BC,IAAUD,IAAQ,cAAc,cAChCE,IAAOF,IAAQ,eAAe;AACpC,UAAIF,EAAM,QAAQG,KAAWH,EAAM,QAAQ,aAAa;AACtD,QAAAA,EAAM,eAAA,GACNN,EAAUO,IAAe,CAAC;AAC1B;AAAA,MACF;AACA,UAAID,EAAM,QAAQI,KAAQJ,EAAM,QAAQ,WAAW;AACjD,QAAAA,EAAM,eAAA,GACNN,EAAUO,IAAe,CAAC;AAC1B;AAAA,MACF;AACA,UAAID,EAAM,QAAQ,QAAQ;AACxB,QAAAA,EAAM,eAAA,GACNN,EAAU,CAAC;AACX;AAAA,MACF;AACA,MAAIM,EAAM,QAAQ,UAChBA,EAAM,eAAA,GACNN,EAAUV,EAAS,SAAS,CAAC;AAAA,IAEjC;AAEA,WACE,gBAAAqB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAhB;AAAA,QACA,MAAK;AAAA,QACL,cAAYD;AAAA,QACZ,WAAU;AAAA,QAET,UAAAJ,EAAS,IAAI,CAACc,GAAKQ,MAAU;AAC5B,gBAAMC,IAAUT,EAAI,OAAOb;AAE3B,iBACE,gBAAAuB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,KAAK,CAACC,MAAO;AACX,gBAAAnB,EAAS,QAAQgB,CAAK,IAAIG;AAAA,cAC5B;AAAA,cACA,MAAK;AAAA,cACL,MAAK;AAAA,cACL,gBAAcF;AAAA,cACd,UAVoBD,MAAUd,IAUF,IAAI;AAAA,cAChC,SAAS,MAAMN,EAASY,EAAI,EAAE;AAAA,cAC9B,WAAW,CAACY,MAAMX,EAAcW,GAAGJ,CAAK;AAAA,cACxC,WAAWjC,GAAA;AAAA,cAEX,UAAA;AAAA,gBAAA,gBAAAgC,EAAC,QAAA,EAAK,WAAU,kFACb,UAAAP,EAAI,OACP;AAAA,gBACCA,EAAI,cACH,gBAAAO,EAAC,QAAA,EAAK,WAAU,+CACb,UAAAP,EAAI,aACP,IACE;AAAA,kCACH,QAAA,EAAK,WAAU,+CACb,UAAAX,EAAcW,EAAI,WAAW,EAAA,CAChC;AAAA,cAAA;AAAA,YAAA;AAAA,YAtBKA,EAAI;AAAA,UAAA;AAAA,QAyBf,CAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AACAhB,GAAY,cAAc;AAoB1B,MAAM6B,KAAY5B;AAAA,EAChB,CACE;AAAA,IACE,gBAAA6B;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC;AAAA,IACA,SAAAC;AAAA,IACA,QAAAC;AAAA,IACA,cAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,EAAA,GAEF/B,MACG;AACH,UAAMgC,IAAeC,EAAQ,MAAM;AACjC,UAAIT,EAAc,QAAOU,EAASV,CAAY;AAC9C,YAAMW,IAAQ,CAAC,GAAGZ,CAAc,EAAE,KAAA,EAAO,CAAC;AAC1C,aAAOY,IAAQD,EAASC,CAAK,wBAAQ,KAAA;AAAA,IACvC,GAAG,CAACZ,GAAgBC,CAAY,CAAC,GAE3B,CAACY,GAAOC,CAAQ,IAAIC,EAAeN,CAAY,GAC/C,CAACO,GAAYC,CAAa,IAAIF;AAAA,MAClCd,IAAeU,EAASV,CAAY,IAAIQ;AAAA,IAAA,GAIpCS,IAAaC,GAAaN,CAAK,GAC/BO,IAAYC,EAAYH,GAAY,EAAE,cAAAb,GAAc,GACpDiB,IAAeZ,EAAQ,MAAM;AACjC,YAAMa,IAAgB,CAAA;AACtB,eAAS1C,IAAI,GAAGA,IAAI,IAAIA,KAAK;AAC3B,QAAA0C,EAAM,KAAKC,EAAQJ,GAAWvC,CAAC,CAAC;AAElC,aAAO0C;AAAA,IACT,GAAG,CAACH,CAAS,CAAC,GAERK,IAAgBf,EAAQ,MAAM;AAClC,YAAMgB,IAAOL,EAAY,oBAAI,QAAQ,EAAE,cAAAhB,GAAc,GAC/CsB,IAAM,IAAI,KAAK,eAAevB,GAAQ,EAAE,SAAS,SAAS;AAChE,aAAO,MAAM,KAAK,EAAE,QAAQ,KAAK,CAACwB,GAAG/C,MAAM8C,EAAI,OAAOH,EAAQE,GAAM7C,CAAC,CAAC,CAAC;AAAA,IACzE,GAAG,CAACuB,GAAQC,CAAY,CAAC,GAEnBwB,IAAanB,EAAQ,MAAM;AAC/B,UAAI;AACF,eAAO,IAAI,KAAK,eAAeN,GAAQ;AAAA,UACrC,OAAO;AAAA,UACP,MAAM;AAAA,QAAA,CACP,EAAE,OAAOS,CAAK;AAAA,MACjB,QAAQ;AACN,eAAO9C,EAAU8C,GAAO,WAAW;AAAA,MACrC;AAAA,IACF,GAAG,CAACT,GAAQS,CAAK,CAAC,GAEZiB,IAAcC;AAAA,MAClB,CAACC,MAAYhC,EAAe,IAAIlC,EAAOkE,CAAC,CAAC;AAAA,MACzC,CAAChC,CAAc;AAAA,IAAA,GAGXlB,IAAYiD;AAAA,MAChB,CAAChD,MAAe;AACd,QAAAkC,EAAclC,CAAI,GACbkD,GAAYlD,GAAM8B,CAAK,KAAGC,EAASK,GAAapC,CAAI,CAAC;AAAA,MAC5D;AAAA,MACA,CAAC8B,CAAK;AAAA,IAAA,GAGF1B,IAAgB,CAACC,MAAyC;AAC9D,YAAM8C,IAA8B;AAAA,QAClC,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SAAS;AAAA,QACT,WAAW;AAAA,MAAA;AAEb,UAAI9C,EAAM,OAAO8C,GAAK;AACpB,QAAA9C,EAAM,eAAA,GACNN,EAAU0C,EAAQR,GAAYkB,EAAI9C,EAAM,GAAG,CAAC,CAAC;AAC7C;AAAA,MACF;AACA,UAAIA,EAAM,QAAQ,QAAQ;AACxB,QAAAA,EAAM,eAAA,GACNN,EAAUuC,EAAYL,GAAY,EAAE,cAAAX,EAAA,CAAc,CAAC;AACnD;AAAA,MACF;AACA,UAAIjB,EAAM,QAAQ,OAAO;AACvB,QAAAA,EAAM,eAAA,GACNN,EAAU0C,EAAQH,EAAYL,GAAY,EAAE,cAAAX,GAAc,GAAG,CAAC,CAAC;AAC/D;AAAA,MACF;AACA,UAAIjB,EAAM,QAAQ,UAAU;AAC1B,QAAAA,EAAM,eAAA,GACNN,EAAU/B,GAAUiE,CAAa,CAAC;AAClC;AAAA,MACF;AACA,UAAI5B,EAAM,QAAQ,YAAY;AAC5B,QAAAA,EAAM,eAAA,GACNN,EAAU3B,EAAU6D,GAAY,CAAC,CAAC;AAClC;AAAA,MACF;AACA,OAAI5B,EAAM,QAAQ,WAAWA,EAAM,QAAQ,SACzCA,EAAM,eAAA,GACF0C,EAAYd,CAAU,KAAGd,EAAapC,EAAOkD,CAAU,CAAC;AAAA,IAEhE,GAEMmB,IAAaxD,EAA0B,IAAI;AAYjD,WAXAyD,EAAU,MAAM;;AAOd,OAAAC,IAAAF,EAAW,YAAX,QAAAE,EAAoB;AAAA,IAEtB,GAAG,CAACrB,EAAW,QAAA,CAAS,CAAC,GAErBb,IAEA,gBAAAP,EAAC,OAAA,EAAI,KAAAnB,GAAU,WAAU,kDACvB,UAAA;AAAA,MAAA,gBAAAgB,EAAC6C,MAAS,SAAQ,QAAO,MAAK,MAAK,OAAM,OAAM;AAAA,MAC/C,gBAAA7C,EAAC,OAAA,EAAI,WAAW9B,EAAA,GACb,UAAA,MAAM,KAAK,EAAE,QAAQ,GAAA,GAAM,CAACiE,GAAG/C,MAC9B,gBAAAY;AAAA,QAAC6C;AAAA,QAAA;AAAA,UAEC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,QAAO;AAAA,QAAA;AAAA,QAHF,gBAAgBzD,CAAC;AAAA,MAAA,CAKzB,EAAA,CACH;AAAA,IAAA,GACF,IAIAmB,EAAe,SAAS,IAExB,gBAAAP,EAAC,SAAI,KAAAhB,GACH,UAAA,gBAAAgB,EAAC8C,MAAW,SAAQ,cAAa,OAAO/B,EAAA,CAAY,EAAA,CACtD,IAKF,gBAAAZ,EAAC,OAAA,EAAI,KAAAnB,GAAU,WAAU,kDACvB,UAAA;AAAA,MAAA,gBAAAmB,EAAC,OAAA,EAAI,WAAWlC,GAAA,GACd,UAAA;AAAA,QAAA,gBAAA+B;AAAA,UAAC+C;AAAA,UAAA;AAAA,YACC,wBAAOC,IAAA,EAAY;AAAA,YACnB,cAAYnC;AAAA,YACZ,MAAK;AAAA,YACL,QAAO;AAAA,YACP,eAAa;AAAA,YACb,SAAS,MAAMQ,EAAS/D,GAAU8D,CAAQ,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,QAE7C,gBAAApB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,aAAU;AAAA,YAET,UAAAoC;AAAA,UAAA;AAAA,QAAA;AAAA,QAEH,gBAAApC;AAAA,UAAC+C;AAAA,UAAA;AAAA,YACC,wBAAOE,IAAA,EAAa;AAAA,YACpB,cAAYnC;AAAA,YACZ,MAAK;AAAA,YACL,QAAO;AAAA,YACP,eAAa;AAAA,YACb,SAAS,MAAMO,EAAS3D,EAAU0D,GAAO,CAAC,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MAC7C,GACF;AAAA,MACA,gBAAAjB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAYiC;AAAA,UACZ,WAAU;AAAA,UACV,WAAW1C;AAAA,UAEX,UAAA;AAAA,YAAA,gBAAAM,EAAC,OAAA,EAAI,WAAW9B,EAAA,GAAqB,MAAK,OACvC,UAAA8D,EAAc,IAAI,CAACkB,MAClB,gBAAAlD;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,WAAU;AAAA,gBAET,UAAAkD;AAAA,cAAA;AAAA,cAJIA;AAAA,YAAA,CAMR,GACH;AAAA,YACC,MAAM,KAAK,EAAE,QAAQ,KAAK,CAACf,GAAGgB,MAAc;AAC3C,oBAAMC,IAAOvB,EAAK,MAAMsB,IAAY,GAAGA,IAAY,IAAI,CAAC;AACxD,qBACE,gBAAAnD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,MAAK;AAAA,kBACL,WAAW9B,EAAA;AAAA,kBAEV,UAAAkF,EAAK,IAAI,CAACb,MAAM;AACf,0BAAMc,IAAMhF,EAAOkE,CAAC,GACde,IAAU,CAACd,GAAYD,GAAGnB,CAAK,GAC/BmC,IAAYlB,EAAYE,CAAC,GACzBiB,IAAWhD,MAAiB6C,GAC5BI,IAAYC,GAAUnB,GAAGhB,CAAU;AACzC,2BACE,gBAAAvB;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBAEC,KAAKyD,IAAYf,IAAa;AAAA,wBAC9B,MAAK;AAAA,wBACL,MAAK;AAAA,wBACL,iBAAec;AAAA,wBACf,iBAAe,CAACD,KAAa;AAAA,wBAC7B,UAAU,CAACA;AAAA,wBACX,gBAAcD,KAAW;AAAA,wBACzB,UAAUG,IAAY,IAAI;AAAA,wBAC1B,SAAS,MAAMF,KAAa9C,EAAa4C,CAAG;AAAA,wBAC5C,WAAWlF,GAAA;AAAA,wBAEV,UAAAG,EAAUiE,GAAG,GAAG;AAAA,sBAAA;AAAA,sBAZZc;AAAA,oBAAA;AAAA,kBAeX,CAAC;AAAA,gBAAA;AAAA,gBA3BI,QAAQF,CAAS;AAAA,cAAA;AAAA,YA8B5B,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,GACF;AAAA,EAEJ;AACF;AACA7C,GAAU,cAAc;AAexB,SAASqD,GAAa;AAAA,EACpB,MAAApG;AAAA,EACA,OAAAqG;AAAA,EACA,cAAAC;AAAA,EACA,SAAAnD;AAAA,EACA,YAAAK;AAAA,EACA,UAAAlC;AACF,GAAsB;AACpB,MAAI,CAACtB,EAAM,QAAO;AAClB,MAAImD;AACF,WACE,gBAAAV;AAAA,MAAC8D;AAAA,MAAA;AAAA,QACC,MAAM,CAAC,EAAE,MAAAvG,GAAM,OAAO,CAAA,GAAI;AAAA,QAC1B,OAAM;AAAA,MAAA;AAAA,IAAA;AAIZ,MAAIqG,EAAM,WAAW;AACnB,WAAO,gBAAA5D,EAAC8C,IAAA,EAAW,SAAQ,cAAa,OAAO/B,GAAY;AAE7D,QAAMgD,IAA8BH,EAAM,IAAI,CAACI,MAAS;AAEtD,UAAM,CAACC,GAAGC,CAAC,IAAIF,EAAK,MAAM,GAAG,GACvBG,IAAQjD,EAAS3D,CAAI;AAC3B,WAAA4G,EAAM,SAAS,OAAOF,CAAC,GAAG,OAAOC,CAAC,GAAG,GAAG,CAAC,GAClC;AAAA,MACL,IAAI,GAAG3G,CAAI,IAAIyG,CAAI;AAAA,MACnB,OAAAG;AAAA,MACA,OAAOH;AAAA,IAAA;AAAA,EAEX,CAAC;AAED,SACE,gBAAAhE;AAAA,IAAC8D;AAAA,IAAA;AAAA,MACC,MAAM,CAHe,EAAE,MAAAvG,GAAM,OAAOwG,EAAA,CAG1B;AAAA,MACV,gBAAgBF,IAAe,GAAGtG,CAAI,IAAIsG,CAAY,KAAK;AAAA,MAC3D,cAAc,CAACO,MAAS;AAGtB,cAAMC,IAAQ1G,GAAgB,KAAKyG,EAAK,EAAE;AAC1C,QAAIC,KAAOxF,EAASwF,EAAM,CAAC,CAAC;AAAA,MAC9B;AAAA,IAAA;AAAA,EAAA;AAGN;AAMA,MAAMC,KAAkB5F;AAAA,EACtB,CACE;AAAA,IACE,UAAAC;AAAA,IACA,gBAAA4B;AAAA,IACA,gBAAAgE;AAAA,IACA,OAAA/F;AAAA,IACA,UAAAgG;AAAA,IACA,UAAAC;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,cAAAC,IAAe;AAAA,IACf,cAAAC;AAAA,IACA,QAAAC,IAAS;AAAA,IACT,SAAAC,IAAU;AAAA,IACV,cAAcC;AAAA,IACd,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELlG,MACG;;AACH,UAAM,EAAE,GAAAmG,GAAG,MAAAC,EAAA,IAASC,GAAA,GACd1E,IAASyE,EAAK,YAAY,MAC1BxE,IAAeK;AAAA,MACnB,MAAMqE,GAAgB3E,CAAM;AAAA,MAC5B,CAACA,CAAM;AAAA,IAAA,GAIH4E,IAAahH,GAAoBC,CAAK,GACtC,CAACgH,GAAYC,CAAa,IAAInE,EAAiBiE,CAAU;AAE/D,IAAA5C,EAAU,MAAM;AACd,MAAI6C,IAAaD,KAAYE,EAAcF,CAAU;AAAA,IACvD,GAAG,CAACC,GAAYD,CAAU,CAAC;AAE3B,UAAMG,IAAaxG,EAA2B,IAAI,GAC5CyG,IAAmBzG,EAAO,EAAI;AAOpC,IAAAyD,EAAU,MAAM;;AACd,UAAIgD,EAAiB,SAAS;AAC5B,QAAAA,EAAiB,UAAU;AAC3B;AAAA,MACF;AACA,OAAA/C,IAAA8C,EAAW,YAAX,QAAA9C,EAAoB;AAAA,IACtB,GAAG,CAAC4C,CAAU,CAAC;AAEf,UAAMI,IAAoB3E;AAAA,MACxB,MAAM;AAAA,QACJ;AAAA,UACE,OAAOkE,EAAE,0CAA0C;AAAA,UACnD,QAAQN,KAAA,gBAAAA,EAAe;AAAA,QAAC;AAAA,QAE1B;AAAA,UACE,OAAOM,EAAE,uCAAuC;AAAA,UAChD,QAAQN,KAAA,gBAAAA,EAAe;AAAA,QAAC;AAAA,QAE1B;AAAA,UACE,OAAOM,EAAE,uCAAuC;AAAA,UAChD,QAAQN,KAAA,gBAAAA,EAAe;AAAA,QAAC;AAAA,QAE1B;AAAA,UACE,OAAOM,EAAE,0CAA0C;AAAA,UACnD,QAAQN,KAAA,gBAAAA,EAAe;AAAA,QAAC;AAAA,MAC1B;AAAA,MAEF,CAACA,GAAcM,CAAC;AAAA,IAAA,GAGZU,IAAQb,KAAaG,EAAE,kCAAkC,GACzDW,IAAYX,EAAE,yCAAyC,GACvDrE,IAAYqE,EAAE,yCAAyC,GACvDY,IAAcZ,EAAE,2CAA2C,GAC3Da,IAAiBb,EAAE,uCAAuC,GAC1Dc,IAAiBd,EAAE,+CAA+C,GAClEe,IAAiBf,EAAE,2CAA2C,GAC9DgB,KAAoBhB,EAAE,0CAA0C,GAEhErG,KAAgBwD;AAAA,MACpB,CAAC8D,MACCjB,EAAE,+CAA+C,EAAE,SAAAiB,GAAS;AAAA,MAC9D,CAACjB,CAAC;AAAA,IAAA,GAGEkB,KACAb,MAAe,IAAU,EAAQhH,EAAM,YACvCgH,MAAe,IAAU,EAAQhH,EAAM,OACvCgH,MAAe,IAAU,EAAQhH,EAAM,OACpC,IAGH8H,KAAsB,CAACC,MAAsB;AACjD,MAAA/B,EAAS,EAAE,GAAGhG,GAAO,WAAA+H,GAAW,GAIhC,WAAW,MAAM;AACf,QAAAd,EAAc,CAACe,OAAOA,OAAM,IAAI,IAAIA,EAAE;AAAA,MACxC,GAAG,GAAG;AAAA,IACR,GAEMC,KAAmB,CAAClJ,MAAiB;AAEzC,MAAAiH,EAAS,EAAE,GAAGhG,GAAO,MAAAjB,GAAM,MAAM,QAAW;AAAA,IAC9C,GAEMmJ,KAAmB,CAAC1C,MAAiB;AACzC,MAAAQ,EAAS,EAAE,GAAGhG,GAAO,MAAAwF,GAAM;AAAA,IAC7B,GAEM2C,KAAa,MAAMlB,EAAc,CAACe,MAAM,KAAK,IAAI,GAAGA,IAAI,CAAC,CAAC,GAC1DI,KAAa,MACjBnB,EAAc,CAACe,MAAM,KAAK,IAAI5I,KAAc,GAAG4I,IAAI,CAAC,CAAC,GACjDK,KAAe,MAAMpC,KAAA,gBAAAA,EAAWjG,IAEhCsI,IAAY,yBAAyBtB,CAAU,YAC/CuB,KAAmB9F;AAAA,MACvB,MAAM,IAAI,IAAIV,CAAc;AAAA,MAC5B,CAACA,CAAc;AAAA,IAAA;AAIjB,QAAIyG,IAAkB;AACtB,IAAIxB,MAAe,IACjBwB,IACE,gBAAAhH;AAAA,MAACvB;AAAA,MAAA;AAAA,QACC,UAAAE;AAAA,QACA,YAAYH,EAAM;AAAA,QAClB,UAAU8H;AAAA,QACV,eAAAxH;AAAA,QACA,YAAYqH;AAAA,MAAA;AAAA,IAAA,IAGPX,MAAe,IACxBwB,IACE,gBAAAhH;AAAA,MAACM;AAAA,MAAA;AAAA,QACC,gBAAgByG;AAAA,QAChB,cAAcvI,EAAM;AAAA,QACpB,cAAciI;AAAA,QACd,SAAS9B;AAAA,QACT,QAAAhE;AAAA,QACA,cAAAC;AAAA,QACA,WAAWqF;AAAA,QACX,WAAWC;AAAA,QACX,YAAYF;AAAA,MAAA;AAAA,IAAA,IAGPR,MAAe,IACxBwB,IACE,gBAAAhH;AAAA,MAAC2D;AAAA,MAAA;AAAA,QACC,MAAMnF,EAAM;AAAA,QACZ,OAAOA,EAAM,OAAQ+F,EAAe/F,EAAM,IAAI,KAAK,CAAA,IAAM,CAAA;AAAA,QACzD,cAAcA,EAAM;AAAA,QACpB,SAASoG;AAAA,QACT,YAAYoB;AAAA,QACZ,UAAUU;AAAA,MAAA;AAAA,IAAA,IAIdM,IACE,gBAAAhH,EAAC,OAAA,EAAI,WAAU,kDACZ,UAAA0E,GACH;AAIJ,UAAMuC,KAAazB,MAAe5H,KAAc,GAC1CsJ,KAAcC;AAAA,MAClB3B;AAAA,MACAA;AAAA,MACAX,KAAA,gBAAAA,EAAeW;AAAA,IAA2B;AAG5C,WACE,gBAAArF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAnB;AAAA,QACA,MAAK;AAAA,QACL,cAAY6G;AAAA,QACZ,WAAWhI,GAAa,EAAE,QAAAiH,GAAQ,SAAAC,GAAS,WAAAE,GAAW;AAAA,QACrD,GAAGC;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAlF;AAAA,YAACoH;AAAA,YAAA;AAAA,cACC,YAAA5B;AAAA,cACA,OAAAI;AAAA,cACA,cAAYC;AAAA,YAAA;AAAA,UAAA;AAAA,UAEd,gBAAA1F;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,mBAAiB2G;AAAA,cACjB,WAAW/I,GAAiB,EAAE,SAAAgH,GAAS;AAAA,cACvC,aAAWS;AAAA,cACX,cAAY0B;AAAA,cAEZ,UAAA;AAAA,gBAAA,gBAAAlH;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,KAAK0F;AAAA,oBACL,IAAIoB;AAAA,oBACJ,UAAU;AAAA,oBACV,WAAU;AAAA,oBAET,WAAAlE,IAAAgD,EAAMJ,CAAU,MAAhB,gBAAA5C,EAAmB;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAErBoE;AAAA,gBACD,gBAAA7G,EAAC,OAAA,EAAI,WAAW/B,GAAA,GACd,UAAA;AAAA,kBAAA,gBAAA4B;AAAA,oBAACqH;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,MAAK;AAAA,sBACL,SAASV;AAAA,sBACT,UAAUnB,MAAe;AAAA,sBAExB,UAAAM;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAEFmB,KACC,gBAAAjH;AAAA,oBAACqH;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,MAAK;AAAA,sBACL,SAASR;AAAA,sBAER,UAAAd;AAAA,oBAAA;AAAA,kBAAA,IAGH,gBAAA/F;AAAA,oBAACqH;AAAA,oBAAA;AAAA,sBACC,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,MAAK;AAAA,sBACL,SAAST;AAAA,sBACT,UAAU,CAACP;AAAA,sBAEV,UAAAvF;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACH,EAAA,CAEJ;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACAwD,GAAgB,cAAc;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"stepper-calendar-CWZcFgt_.js","sources":["../../node_modules/date-fns/subMonths.js","../../src/components/stepper-calendar/stepper-calendar.tsx"],"sourcesContent":["import { addMonths } from \"./addMonths.js\";\n\n/**\n * The subMonths function options.\n */\n\n/**\n * @name subMonths\n * @category Month Helpers\n * @summary Subtract the specified number of months from the given date.\n *\n * @description\n * Subtract the specified number of months from the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be subtracted.\n * @param options - An object with options\n *\n * @returns The new date with the months subtracted\n *\n * @example\n * // Subtract 5 months from 1 February 2015:\n * const result = subMonths(new Date(2015, 1, 1), 5)\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function subMonths(date, amount, options) {\n return addMonths(date, -amount, options);\n}\n\n// Fallback for modularized imports:\nexport default subMonths;\n","import {\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n addDays,\n addMonths,\n format as fnsFormat,\n isSameDay,\n isSameMonth,\n parseISO,\n startOfMonth,\n startOfWeek,\n subMonths,\n} from 'date-fns';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport type { StepSpec, StepStatus } from '../_shared/stepper';\nimport { stateForStep } from '../_shared/stepper';\nimport { StepperProgress } from '../stepper-progress/stepper-progress';\nimport { Button } from '../button/button';\nimport { IconButton } from '../button/icon-button';\nimport { SlotGrid, type SlotGridDay, type SlotGridSlot } from '../slot-grid/slot-grid';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { resolveFirstDay } from '../calendar/calendar';\n\n// Slot IDs use a fixed `${yyyy-mm-dd}T${HH:mm}` shape so the trailing time\n// segment can be safely peeled off in onSlotSelect. Validating against the\n// shape rather than splitting blindly so an unexpected ID surfaces as a\n// no-op rather than a malformed time value.\nconst SLOT_ID_PATTERN = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2}:\\d{2})$/;\n\n/* -------------------------------------------------------------------- */\n/* StepperCalendar */\n/* */\n/* Single-component, A/B-testable appointment-booking flow with 4 */\n/* fixed steps in this order: */\n/* 0. Service — pick from `services` */\n/* 1. Date — inline month grid; only `availableDates` are enabled */\n/* 2. Time — slot grid showing `availableSlots[selectedDate]` */\n/* 3. Details — render-prop slot for the consumer's form fields */\n/* -------------------------------------------------------------------- */\n\n/** Service offering rendered on Step 1. Data is API-driven by the consumer. */\nexport interface StepperCalendarService {\n id: string;\n /** Already-translated label (consumer is responsible for i18n of data). */\n label: string;\n /** Duration in minutes — shown alongside the label. */\n durationMin: number;\n /** Optional secondary line. */\n description?: string;\n}\n\n/** Re-exported for convenience. */\nexport type ServiceOption = StepperCalendarService;\n\n/** Booking selection — controlled by the consumer. */\nexport interface StepperCalendarValue {\n serviceId?: string;\n /** ISO yyyy-mm-dd. */\n date?: string;\n /** HH:mm (24h). */\n time?: string;\n}\n\nconst TOTAL_STEPS = 4;\n\nconst rootVariants = cva(\n 'ds:flex ds:w-full ds:flex-col ds:gap-[var(--spacing-md)] ds:text-[var(--foreground)]',\n {\n variants: {\n layout: {\n vertical: 'ds:flex-col',\n horizontal: 'ds:lg:flex-row ds:lg:items-start',\n },\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: {\n layout: 'vertical',\n density: 'comfortable',\n },\n },\n);\n\nconst stepBodyVariants = cva(\n [\n 'ds:flex ds:flex-col ds:gap-[var(--spacing-md)]',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--card)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-md)] ds:pb-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n density: {\n comfortable: 'ds:gap-[var(--spacing-md)]',\n compact: 'ds:gap-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { density: 'comfortable' },\n },\n);\n\nconst serviceCardVariants = cva(\n [\n 'ds:group/service ds:flex ds:flex-col ds:items-start ds:gap-[var(--spacing-xs)] ds:text-start',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[var(--border)] ds:bg-[var(--background)]',\n 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:transition-[background-color,border-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:aria-checked:border-[var(--primary)] ds:aria-checked:bg-[var(--primary)]/5',\n 'ds:disabled:opacity-50 ds:disabled:cursor-not-allowed',\n ].join(' '),\n);\n\nconst monthHeaderVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)]',\n);\n\nconst monthGridVariants = cva(\n 'ds:grid ds:grid-cols-7 ds:gap-[var(--spacing-xs)]',\n);\n\nconst dayCellVariants = cva(\n [\n 'ds:inline-flex ds:items-center ds:justify-center',\n // `min-target-size` (44/48px) governs the rendered size — it always\n // exceeds the explicit floor below. Keeping the explicit floor for\n // grid layout stability when the cell content is empty (skeletons),\n // matching the precedent in `slot-grid`.\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:h-10 ds:w-10 ds:rounded-[var(--radius-sm)]',\n 'ds:text-[length:var(--font-size-sm)] ds:font-[var(--font-weight-medium)]',\n 'ds:border ds:border-transparent ds:bg-[var(--background)] ds:text-[var(--foreground)]',\n 'ds:transition-[background-color,border-color,color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n 'ds:hover:enabled:bg-[var(--muted)]/40',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:opacity-40 ds:disabled:cursor-not-allowed',\n 'ds:aria-selected:bg-[var(--primary)] ds:aria-selected:text-[var(--primary-foreground)]',\n 'ds:aria-selected:border-[var(--primary)]',\n 'ds:data-[outside=true]:text-[var(--muted-foreground)]',\n ].join(' '),\n);\n\nconst actionsRowVariants = cva(\n 'ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:mt-[var(--spacing-md)]',\n);\n\n/* -------------------------------------------------------------------- */\n/* Helpers */\n/* -------------------------------------------------------------------- */\n\nfunction isoDay(date: Date): string {\n return fnsFormat(date, 'yyyy-MM-dd');\n}\n\n/** Compute the first incomplete step from the current value. */\nfunction firstIncompleteStep(value: StepperCalendarValue): number {\n if (!value.serviceId) return 0;\n if (!value.date) return 1;\n if (!value.time) return 2;\n return 3;\n}\n\n/* -------------------------------------------------------------------- */\n/* Public props */\n/* -------------------------------------------------------------------- */\n\nexport interface StepperCalendarProps\n extends Omit<\n ComponentPropsWithoutRef<'div'>,\n 'aria-label' | 'onChange' | 'onSubmit'\n >,\n VariantProps<typeof rootVariants> {\n services: StepperCalendarService[];\n availableDates: string[];\n availableSlots: Record<string, string[]>;\n value: StepperCalendarValue;\n onChange: (next: StepperCalendarValue) => void;\n onSubmit?: (value: StepperCalendarValue) => void;\n detailsFields?: ReactNode;\n loadingDates?: boolean;\n loadingSlots?: boolean;\n /** Per-step status overrides — `error` will mark a step in the rail. */\n stepStatuses?: Partial<Record<0 | 1 | 2 | 3, StepStatus>>;\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Service grid (Step 0) */\n/* -------------------------------------------------------------------- */\n\ninterface ServiceGridProps {\n services: StepperCalendarService[];\n selectedId?: string;\n onSelect: (id: string) => void;\n durationLabel: (minutes: number) => string;\n groupLabel: string;\n}\n\nconst ServiceGrid = forwardRef<HTMLDivElement, ServiceGridProps>(\n ({ services, selectedId, onSelect, durationLabel, groupLabel }, ref) => {\n const itemRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const focusedIndex = (() => {\n const i = services.findIndex((s) => s.id === selectedId);\n return i >= 0 ? i : 0;\n })();\n\n const moveFocus = (next: number) => {\n const wrapped = (next + services.length) % services.length;\n const target = itemRefs.current[wrapped];\n if (!target) return;\n // Per WAI-ARIA radiogroup, arrow keys move focus AND selection.\n target.focus();\n const svc = services[wrapped];\n if (svc) onSelect(svc.id);\n };\n\n const handleKeyDown = (\n event: KeyboardEvent<HTMLButtonElement>,\n currentIndex: number,\n ) => {\n // RTL inversion: in an RTL document, ArrowLeft visually advances forward.\n const isRtl =\n typeof document !== 'undefined' &&\n document.documentElement.dir === 'rtl';\n const forward = isRtl ? 'ArrowLeft' : 'ArrowRight';\n const back = isRtl ? 'ArrowRight' : 'ArrowLeft';\n if (event.key === forward || event.key === 'ArrowDown') {\n event.preventDefault();\n moveFocus(currentIndex + 1);\n return;\n }\n if (event.key === back || event.key === 'ArrowUp') {\n event.preventDefault();\n moveFocus(currentIndex - 1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(0);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(services.length - 1);\n }\n };\n\n return (\n <div\n ref={ref}\n role=\"radiogroup\"\n aria-label={groupLabel}\n className=\"ds:grid ds:gap-[var(--spacing-sm)] ds:sm:grid-cols-2\"\n >\n {services.map((svc, index) => {\n const checked = svc.id === selectedId;\n const isRovingTabStop = index === focusedIndex;\n return (\n <button\n key={svc.id}\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n tabIndex={isRovingTabStop ? 0 : -1}\n onClick={() => onSelect(svc.id)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n className={serviceCardVariants()}\n >\n <span className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:text-[var(--foreground)]\">\n {svc.label}\n </span>\n {svc.description ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {svc.description}\n </span>\n ) : null}\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n {durationLabel(svc.durationMin)}\n </span>\n </button>\n );\n })}\n </div>\n );\n },\n);\nServiceGrid.displayName = 'StepperCalendar.ServiceGrid';\n\n/* -------------------------------------------------------------------- */\n/* Inline month grid (Step 1) */\n/* -------------------------------------------------------------------- */\n\ntype WeekStart = 0 | 1 | 2 | 3 | 4 | 5 | 6;\n\ninterface MonthGridProps {\n availableDates: Set<string>;\n selectedDate?: string;\n onSelectDate: (iso: string) => void;\n loading: boolean;\n locale: string;\n weekStartsOn: WeekStart;\n prevLabel: string;\n nextLabel: string;\n emptyLabel: string;\n}\n\nconst MonthGrid = forwardRef<HTMLDivElement, MonthGridProps>(\n (\n {\n availableDates,\n selectedDate,\n onSelectDate,\n loading,\n locale,\n weekStartsOn,\n prevLabel,\n nextLabel,\n emptyLabel,\n },\n ref,\n ) => {\n const initialMonth = useMemo(() => {\n if (selectedDate) return parseISO(selectedDate);\n const first = [...availableDates].sort()[0];\n return first ? parseISO(first) : new Date();\n }, [availableDates, selectedDate]);\n\n const [month, setMonth] = useState<Date>(initialMonth);\n const [focusedDay, setFocusedDay] = useState<Date>(\n selectedDate ? parseISO(selectedDate) : initialMonth,\n );\n\n // Build the 6x7 grid (always full weeks for stable layout).\n const monthStart = startOfMonth(month);\n const gridStart = startOfWeek(monthStart, { weekStartsOn });\n const days: Date[] = useMemo(() => {\n const cells: Date[] = [];\n for (let i = 0; i < 42; i += 1) {\n cells.push(addDays(gridStart, i));\n }\n return cells;\n }, [gridStart]);\n\n const weekdayLabels = useMemo(() => {\n const base = startOfWeek(new Date(), { weekStartsOn });\n const fmt = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n return Array.from({ length: 7 }, (_, i) => fmt.format(addDays(base, i)));\n }, [locale, weekStartsOn]);\n\n const monthLabel = useMemo(() => {\n try {\n return new Intl.DateTimeFormat(locale, {\n month: 'long',\n year: 'numeric',\n }).format(month);\n } catch {\n return fnsFormat(month, 'MMMM yyyy');\n }\n }, [locale, month]);\n\n const isAvailable = useCallback(\n (d: Date) => availableDates.has(isoDay(d)),\n [availableDates],\n );\n\n const moveFocus = useCallback(\n (next: Date) => {\n setFocusedDay(next);\n if (!isSameMonth(next, month)) setMonth(startOfMonth(next));\n },\n [month],\n );\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const map: Record<string, number> = {\n ArrowLeft: -1,\n ArrowRight: 1,\n ArrowUp: -7,\n ArrowDown: 7,\n };\n if (event.key in map) {\n event.preventDefault();\n moveFocus(addDays(focusedDay, map[event.key]));\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n moveFocus(startOfWeek(focusedDay, { weekStartsOn }));\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n moveFocus(addDays(startOfWeek(focusedDay, { weekStartsOn }), 6));\n return;\n }\n if (event.key === 'PageUp') {\n event.preventDefault();\n moveFocus(subMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'PageDown') {\n event.preventDefault();\n moveFocus(addMonths(focusedDay, 1));\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n if (isAvailable(focusedDay)) onSelectDate(isoDay(focusedDay));\n }\n };\n\n const focusedRef = useRef<HTMLButtonElement>(null);\n useEffect(() => {\n // Move focus to the focused day when it changes. Note: when the parent\n // StepperCalendar transitions Service → Date, its own step-change focus\n // effect *also* tries to focus the body's first interactive element. In\n // practice this effect runs deeper in the tree and after mount, so it\n // wins — but consumers should be aware of the interaction if they\n // tweak the ordering.\n focusedRef.current?.focus();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [focusedDay.getTime()]);\n\n if (loading) {\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <Skeleton variant=\"text\" size=\"md\" width=\"40%\" />\n <div className={monthGridVariants()}>\n {Array.from({ length: 42 }, (_, i) => (\n <Skeleton\n key={`day-skeleton-${i}`}\n variant=\"rounded\"\n size=\"md\"\n height=\"40px\"\n />\n ))}\n </div>\n </div>\n );\n }\n\n if (availableDates.size === 0) {\n return (\n <div ref={ref}>\n <EmptyState variant=\"no-results\" title={emptyLabel} />\n </div>\n );\n }\n\n return (\n <div ref={ref} className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n <div className={monthHeaderVariants()}>\n <IconButton\n icon={<ChevronLeft />}\n aria-label={prevLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(subMonths(month, 1))}\n />\n <span\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)]\"\n aria-live=\"polite\"\n >\n {monthLabel}\n </span>\n <IconButton\n icon={<ChevronRight />}\n aria-label={nextLabel}\n size=\"sm\"\n intent=\"ghost\"\n flipIconInRtl\n onClick={() => setMonth(addMonths(month, 1))}\n />\n </div>\n <div\n role=\"grid\"\n aria-label={monthLabel}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n onKeyDown={handleKeyDown}\n >\n <div className={monthGridVariants()} role=\"row\">\n {weekdayLabels.map((wd) => (\n <span\n key={wd}\n role=\"columnheader\"\n className=\"type-meta ds:text-center ds:text-[var(--muted-foreground)]\"\n >\n {wd}\n </span>\n ))}\n </div>\n {Array.from({ length: 6 }, (_, weekIndex) => {\n const week = days.slice(weekIndex * 7, weekIndex * 7 + 7);\n return (\n <div\n key={`week-${weekIndex}`}\n role=\"row\"\n className={monthGridVariants()}\n >\n {week.map((d) => {\n const iso = isoDay(d);\n const outside = !isSameMonth(d, month);\n const available = isAvailable(d);\n const selected = selectedDate === iso;\n const isFocused = isSameDay(d, focusedDay);\n return (\n <button\n key={iso}\n ref={isFocused ? focusedRef : undefined}\n type=\"button\"\n role=\"gridcell\"\n aria-selected={selected}\n aria-disabled={!available || undefined}\n disabled={!available}\n data-outside={outside || undefined}\n tabIndex={isFocused ? 0 : -1}\n onClick={() => available && onSelectDate(iso)}\n className={dayCellVariants()}\n >\n {fnsFormat(d, 'd')}\n </button>\n );\n })}\n </div>\n );\n })}\n </div>\n </div>\n );\n },\n);\nMonthGrid.displayName = 'StepperCalendar.MonthGrid';\n\n/* -------------------------------------------------------------------- */\n/* Time step body */\n/* -------------------------------------------------------------------- */\n\ninterface TimeStepBodyProps {\n date?: string;\n slots: string[];\n selectedTime?: string;\n loading: boolean;\n emptyLabel: string;\n onSelect: (time: string) => void;\n}\n\nfunction TimeStepBody({\n date,\n slots,\n selectedTime,\n loading,\n emptyLabel,\n onSelect,\n}: TimeStepBodyProps) {\n if (!date) return null;\n if (loading) {\n return (\n <SlotGrid\n days={[{ date, slots: [] }]}\n state=\"loading\"\n />\n );\n }\n if (slots.length === 0) {\n return <EmptyState variant=\"no-results\" title={emptyLabel} />;\n }\n const slotObjects: SlotGridSlot[] = slots.map((time) => {\n // Build a Date from `date` + `time` for `Intl` formatting.\n const [h, m] = time.split(':');\n const start = parseISO(date);\n start.setHours(Number(h), Number(m), 0, 0);\n return {\n id: `${date}T${time}`,\n start,\n label: time,\n };\n });\n const day: SlotGridDay = { date, slots: slotObjects };\n return (\n <SlotGrid\n days={[day]}\n selectedSlotId={selectedTime ? `${date}T${selectedTime}` : undefined}\n onSlotSelect={(slot) => {\n // Validate against the documented `${yyyy-mm-dd}T${HH:mm}` shape so\n // an unexpected ID surfaces as a no-op rather than a malformed time.\n const match = SLOT_ID_PATTERN.exec(slot.id);\n if (match) onSelect(match[2]);\n }}\n />\n );\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperCalendar = forwardRef<HTMLDivElement, StepperCalendarProps>(\n (\n {\n services,\n availableDates,\n availableSlots,\n value,\n onChange,\n onSubmit,\n detailsFields,\n loadingDates = false,\n loadingSlots = false,\n stepStatuses,\n layout = 'vertical',\n density = 'comfortable',\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const locale = i18n.language ?? 'en';\n const weekStartsOn = useMemo(\n () => resolveFirstDay(locale) as WeekStart,\n [locale],\n );\n\n // Derive max-allowed step from value, then clamp internal active step.\n const maxAllowed = firstIncompleteStep(value);\n const [activeStep, setActiveStep] = useState<number>(maxAllowed);\n // If `value` regresses (consumer cleared a field), pull active back.\n useEffect(() => {\n if (activeStep > maxAllowed) setActiveStep(maxAllowed);\n }, [activeStep, maxAllowed]);\n\n const headingRef = useRef<HTMLHeadingElement>(null);\n const isFirstRenderRef = useRef(true);\n\n // Move focus to the new step's heading when activeStep changes (skip\n // first render to avoid stealing focus on mount). Targeting the heading\n // (rather than the first interactive control) is the pattern recommended\n // by 05-accessibility.mdx — screen-reader users hear the step label\n // before any field, and sighted keyboard users can Tab into the form.\n useEffect(() => {\n if (isFirstRenderRef.current) {\n isFirstRenderRef.current = false;\n return;\n }\n headingRef.current?.focus();\n }, [activeStep]);\n\n const steps: StepSpec[] = useMemo(\n () => [\n {\n label: t('navigation.stepperCalendar.steps.service'),\n status: stepStatuses?.[0],\n },\n {\n label: t('navigation.stepperCalendar.steps.date'),\n status: stepStatuses?.[1],\n },\n {\n label: t('navigation.stepperCalendar.steps.time'),\n status: stepStatuses?.[2],\n },\n {\n label: t('navigation.stepperCalendar.steps.details'),\n status: stepStatuses?.[3],\n },\n ],\n [stepStatuses, t],\n );\n\n const label = ariaLabel ?? t('navigation.stepperCalendar.label');\n const backLabel = t('navigation.stepperCalendar.actions.back');\n const nextLabel = t('navigation.stepperCalendar.actions.next');\n const submitLabel = t('navigation.stepperCalendar.actions.submit');\n const emptyTimeLabel = t('navigation.stepperCalendar.time.empty');\n const prevMonthLabel = t('navigation.stepperCalendar.date.previousMonth');\n const nextMonthLabel = t('navigation.stepperCalendar.date.nextMonth');\n const serviceGroupLabel = t('navigation.stepperCalendar.steps.service');\n\n const durationLabel = useCallback(\n (minutes: number) =>\n t('navigation.stepperCalendar.service.duration', { minutes }),\n [t],\n );\n\n const canAdvance = (() => {\n if (activeStep === 0) return Boolean(value.serviceId);\n if (activeStep === 1) return Boolean(value.date);\n if (activeStep === 2) return Boolean(value.time);\n return false; // step 3 is terminal\n })();\n\n const handleServiceSelect = (serviceId: string) => {\n onChange({ ...value, serviceId });\n // Auto-advance for conversion. Use a short delay so users see the\n // selection register before the step swaps. Plain `setTimeout` (not\n // `window.setTimeout`) so the component does not assume a DOM global.\n setTimeout(() => {\n setActiveStep((s) => (s === 0 ? 1 : s));\n }, 120);\n };\n\n const handleDateSelect = (date: string) => {\n // Clear time when date changes.\n onChange({ ...value, date, time: undefined });\n };\n\n const handleTimeSelect = (time: string) => {\n onChange({ ...value, time });\n };\n\n const handleBack = () => setActiveStep((s) => Math.max(0, s - 1));\n const handleNext = () =>\n setActiveStep((s) => Math.min(TOTAL_STEPS - 1, s + 1));\n const handleSubmit = () => onSubmit?.(value);\n\n const headingId = `stepper-calendar-step-${activeStep}-heading`;\n const availableDateSet = useMemo(\n () => new Set(availableDates),\n [availableDates],\n );\n\n /* ---- Active step body ---- */\n let body: ReactNode = null;\n if (activeStep === 0) {\n body = (\n <ServiceGrid\n services={services}\n selectedId={value.serviceId}\n onSelect={handleServiceSelect}\n durationLabel={durationLabel}\n groupLabel={serviceGroupLabel}\n />\n );\n } else if (activeStep === 1) {\n body = (\n <MonthGrid\n availableDates={availableDateSet}\n selectedDate={value.date}\n onSelectDate={handleDateSelect}\n loading={loadingDates}\n locale={locale}\n weekStartsOn={weekStartsOn}\n prevLabel={prevMonthLabel}\n nextLabel={nextMonthLabel}\n emptyLabel={emptyTimeLabel}\n />\n );\n } else if (activeStep === 2) {\n body = (\n <TimeStepBody\n date={value.date}\n slots={value.date ? (availableSlots[value.date] ?? []) : []}\n selectedTime={value.time}\n loading={loadingSlots}\n emptyLabel={emptyTimeLabel}\n onSelect={handleTimeSelect}\n />\n );\n } else {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]\">\n {detailsFields}\n </div>\n );\n }\n\n const isTerminal = activeStep === TOTAL_STEPS - 1;\n const activeState = stateForStep(\n activeStep,\n activeStep,\n stepStatuses?.[activeStep as 0 | 1 | 2 | 3],\n );\n\n return (\n <div\n ref={ref}\n role=\"region\"\n aria-label={label}\n data-component=\"stepper-calendar\"\n className={rootVariants({ layout, density, className })}\n {...rest}\n >\n <StepperProgress\n activeStep={activeStep}\n steps={steps}\n aria-label={label}\n />\n <section\n aria-labelledby={headingId}\n className={stepBodyVariants({ density })}\n data-step={activeStep}\n data-state={activeState}\n >\n <h2\n ref={headingRef}\n id={headingId}\n tabIndex={-1}\n className=\"type-body-sm ds:font-[var(--font-weight-semibold)] ds:focus:outline-none\"\n >\n {steps[activeStep]?.label}\n </h2>\n {body}\n <div className={actionsRowVariants()}>\n <Button\n type=\"button\"\n intent=\"ghost\"\n size=\"md\"\n onClick={handleBack}\n disabled={activeStep === 0}\n >\n {backLabel}\n </Button>\n {isTerminal ? (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleSubmit}\n >\n {submitLabel}\n </Button>\n ) : (\n <Button\n type=\"button\"\n intent=\"primary\"\n size=\"md\"\n onClick={handleNext}\n disabled={!canAdvance}\n >\n {nextLabel}\n </Button>\n )}\n </div>\n </section>\n </div>\n );\n },\n);\nStepperCalendar.displayName = 'StepperCalendar';\n\nexport { StepperCalendar };\n"],"names":["subMonths","date","amount","options","addMonths","SLOT_ID_PATTERN","TOTAL_STEPS","rootVariants","cva","stepBodyVariants","serviceCardVariants","monthHeaderVariants","monthGridVariants","dayCellVariants","actionsRowVariants","isoDay","fnsFormat","firstIncompleteStep","value","ServiceGrid","forwardRef","services","selectedId","onSelect","durationLabel","groupLabel","ref","itemRefs","useRef","focusedIndex","i","moveFocus","next","wrapped","target","svc","handleKeyDown","event","currentIndex","isRtl","forward","back","jsx","index","checked","jsxs","el","e","MonthGrid","availableDates","selectedDate","onSelectDate","loading","locale","weekStartsOn","prevLabel","nextLabel","emptyLabel","initialMonth","useMemo","parseISO","first","month","setMonth","useState","focusedDay","setFocusedDay","monthStart","startOfMonth","gridStart","startOfWeek","days","cells","addDays","weekdayLabels","base","fmt","_","monthLabel","isAvailable","useCallback","d","isSameMonth","map","focusedRef","useEffect","_a","Skeleton","EmptyState","IconButton","ChevronLeft","ChevronRight","wd","weekIndex","week","iso","outside","available","selected","isFocused","isSameDay","TimeStepBody","slots","selectedTime","SlotGrid","slotObjects","time","h","m","start","slot","match","StepperCalendar","availableSlots","onChange","onSubmit","detailsFields","loadingDates","loadingSlots","stepStatuses","layout","density","ariaLabel","className","rest","t","i18n","useTranslation","resolveFirstDay","maxAllowed","activeStep","setActiveStep","headingRef","isFirstRenderRef","steps","label","backLabel","submitLabel","emptyTimeLabel","prevMonthLabel","nextMonthLabel","serviceGroupLabel","minutes","canAdvance","handleServiceSelect","serviceId","s","handleDateSelect","handleTimeSelect","handleBack","handleNext","handleSubmit","headingId","availableDateSet","body","isTerminal","activeState","stateForStep","StepperProgress","Button"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import { jsxs as n, jsx as r } from "react/jsx-runtime";
1
+ import { jsxs as n, jsx as a } from "react/jsx-runtime";
2
2
  import { forwardRef as k, useRef as R, useState as S, useEffect as C, useLayoutEffect as E } from "react";
3
3
  import { c as t } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as A } from "react-i18next";
@@ -61,7 +61,7 @@ const B = t("ds:flex ds:w-full", {
61
61
  className: N,
62
62
  ...V
63
63
  }, w) => {
64
- const { t: i } = A(), d = R(null), s = l.length, a = Math.max(0, Math.min(g, s - 1)), e = l[a], c = (e == null ? void 0 : e.status) === "error" ? "error" : "current", u = a + 1, P = s === 0 ? 0 : u / s * 100, p = c === "error" ? "error" : a === s - 1 && s > 0 ? "complete" : "progress", [j, z] = S(!1);
64
+ const { t: i } = A(), d = R(null), s = l.length, r = Math.max(0, Math.min(g, s - 1)), e = l[r], c = (e == null ? void 0 : e.status) === "error" ? "error" : "current", p = r + 1, P = s === 0 ? 0 : p / s * 100, u = c === "error" ? "error" : r === s - 1 && s > 0 ? "complete" : "progress", [j, z] = S(!1);
65
65
  C(() => {
66
66
  z(!0);
67
67
  }, []);
@@ -74,7 +74,7 @@ const B = t("ds:flex ds:w-full", {
74
74
  );
75
75
  }, [f]);
76
76
  const v = i("navigation.stepper.stepOfTotal", {
77
- n: a + 1,
77
+ n: r + 1,
78
78
  total: s
79
79
  }), M = x ?? i("navigation.stepper.label"), o = c === "error" && (e != null && e.description) ? e.description : null, T = [
80
80
  v,
@@ -85,33 +85,34 @@ const B = t("ds:flex ds:w-full", {
85
85
  "div",
86
86
  {
87
87
  ref: w,
88
+ "data-component": "stepper-progress",
88
89
  className: B({ captionPosition: y, className: N }),
89
90
  ...V,
90
91
  children: [
91
- h ? null : /* @__PURE__ */ n("div", { className: O({ tone: p }), "aria-hidden": "true", children: [
92
- /* @__PURE__ */ r("span", { className: "type-meta ds:font-[var(--font-weight-semibold)]", children: v }),
92
+ h ? null : /* @__PURE__ */ n("div", { className: O({ tone: u }), "aria-hidden": "true", children: [
93
+ /* @__PURE__ */ a("span", { className: "type-meta ds:font-[var(--font-weight-semibold)]", children: v }),
93
94
  e ? /* @__PURE__ */ n("span", { className: "type-meta ds:text-[var(--muted-foreground)]", children: [
94
95
  "— ",
95
96
  e.label
96
97
  ] }) : null,
97
- o ? /* @__PURE__ */ r("span", { className: "type-meta ds:ms-auto ds:text-[var(--destructive)]", children: o }) : null
98
+ o ? /* @__PURE__ */ a("span", { className: "type-meta ds:ms-auto ds:text-[var(--destructive)]", children: o }) : null
98
99
  ] }),
99
- /* @__PURE__ */ r(
100
+ /* @__PURE__ */ a(
100
101
  "div",
101
102
  {
102
103
  role: "progressbar",
103
104
  "aria-label": M,
104
105
  "aria-valuemin": 0,
105
106
  "aria-valuemax": s,
106
- "aria-valuenow": u,
107
+ "aria-valuenow": p,
107
108
  "aria-valuetext": T,
108
109
  className: H({ size: b }),
109
- children: /* @__PURE__ */ r(
110
+ children: /* @__PURE__ */ a(
110
111
  "span",
111
112
  {
112
113
  ref: d,
113
114
  "aria-hidden": "true",
114
- className: L({ tone: p })
115
+ className: L({ tone: u })
115
116
  }
116
117
  )
117
118
  }
@@ -125,4 +126,4 @@ $.displayName = "StepperProgress";
125
126
  export {
126
127
  $ as S
127
128
  };
128
- //# sourceMappingURL=stepper-progress-DMZ5w5VR.js.map
129
+ //# sourceMappingURL=stepper-progress-rE7tn7WY.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stepper-progress-DMZ5w5VR.js","sources":["../../src/components/stepper-progress/stepper-progress.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport type { StepSpec, StepState } from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperProgress */\n/* */\n/* A lightweight \"Step N of M — {label}\" caption + fill bar. Pure */\n/* indicator — no revisit, no per-step click targets. For flows that */\n/* need editable completed steps, reach for `StepperAccordion`. */\n/* -------------------------------------------------------------------- */\n\ntype Size = 'sm' | 'default';\ntype CaptionPosition = 'top' | 'bottom';\ntype Tone = 'progress' | 'error' | 'complete';\n\nconst rootVariants = cva('ds:flex ds:w-full', {\n variants: {\n captionPosition: {\n top: 'ds:flex-col ds:gap-[var(--spacing-xs)]',\n bottom: 'ds:flex-col-reverse ds:gap-[var(--spacing-xs)]',\n },\n },\n defaultVariants: { captionPosition: 'top' },\n});\n\nconst trackVariants = cva(\n 'ds:relative ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-[var(--muted)]',\n {\n variants: {\n size: {\n sm: 'ds:h-[var(--spacing-xs)]',\n default: 'ds:h-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { size: 'default' },\n },\n);\n\nconst fillVariants = cva(\n [\n 'ds:block ds:h-full ds:rounded-[var(--radius-full)]',\n 'ds:[inline-size:calc(var(--stepper-progress-value,0)*1%)]',\n 'ds:transition-[inline-size,background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n progress: 'ds:bg-[var(--primary)]',\n error: 'ds:bg-[var(--destructive)]',\n complete: 'ds:bg-[var(--success,var(--primary))]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nconst captionVariants = cva(\n 'ds:flex ds:items-baseline ds:gap-[var(--spacing-sm)] ds:flex-wrap',\n {\n variants: {\n tone: {\n progress: 'ds:text-[var(--foreground)]',\n error: 'ds:text-[var(--destructive)]',\n complete: 'ds:text-[var(--foreground)]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nexport interface StepperProgressProps\n extends Omit<ComponentPropsWithoutRef<'div'>, 'aria-label'>,\n VariantProps<typeof trackVariants>,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). */\n activeStep: number;\n /** Step specs — `label` is used in the caption for the active step. */\n steps: StepSpec[];\n /** Override the default `aria-label` on the progressbar. */\n 'aria-label'?: string;\n /** Hide the \"Step N of M — label\" caption. @default false */\n hideCaption?: boolean;\n /** Track size. @default 'default' */\n size?: Size;\n /** Caption position relative to the bar. @default 'top' */\n captionPosition?: CaptionPosition;\n}\n\nconst StepperProgress = forwardRef<HTMLDivElement, StepperProgressProps>(\n (\n {\n activeStep,\n steps,\n 'aria-label': ariaLabel,\n hideCaption = false,\n size = 'default',\n captionPosition = 'top',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const fillRef = useRef<HTMLSpanElement>(null);\n\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const activeSpec = steps[clampedActive];\n // The progress variant only renders one \"active\" step at a time — the\n // shared four-way state machine collapses to error-or-current here.\n const activeState: StepState =\n activeSpec?.status === 'error' ? 'error' : 'current';\n\n // Fill reaches through the completed segments plus the current one, so\n // a 4-step flow at index 1 fills 50% (2/4). Matches the user's mental\n // model for \"how far along am I\".\n const filledCount = clampedActive + 1;\n const targetPercent = total === 0 ? 0 : (filledCount / total) * 100;\n\n const tone: Tone =\n activeState === 'error'\n ? 'error'\n : clampedActive === total - 1 && total > 0\n ? 'complete'\n : 'progress';\n\n // Mount-in animation: paint at 0 on first render, then swap to the\n // target in a post-mount effect so the CSS transition animates from\n // empty → target. Matches the pattern in `components/progress`.\n const [hasMounted, setHasMounted] = useState(false);\n useEffect(() => {\n setHasMounted(true);\n }, []);\n const percent = hasMounted ? targetPercent : 0;\n\n // Setting a CSS custom property via `style.setProperty` (rather than a\n // JSX `style={{}}` attribute) is the sanctioned escape hatch for\n // runtime-computed CSS tokens per `src/docs/23-constraints.mdx` §4;\n // the `components/progress` bar uses the same pattern for its fill.\n useLayoutEffect(() => {\n fillRef.current?.style.setProperty(\n '--stepper-progress-value',\n String(percent),\n );\n }, [percent]);\n\n const captionText = t('navigation.stepper.stepOfTotal', {\n n: clampedActive + 1,\n total,\n });\n const label = ariaLabel ?? t('navigation.stepper.label');\n const errorCopy =\n activeState === 'error' && activeSpec?.description\n ? activeSpec.description\n : null;\n // `aria-valuetext` is the single AT source — the caption is aria-hidden\n // so anything the caption exposes (label, error description) must be\n // appended here too, or it's invisible to screen-reader users who set\n // `hideCaption`.\n const valueText = [\n captionText,\n activeSpec ? `— ${activeSpec.label}` : null,\n errorCopy,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={ref}\n className={rootVariants({ captionPosition, className })}\n {...rest}\n >\n {hideCaption ? null : (\n <div className={captionVariants({ tone })} aria-hidden=\"true\">\n <span className=\"type-meta ds:font-[var(--font-weight-semibold)]\">\n {captionText}\n </span>\n {activeSpec ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n — {activeSpec.label}\n </span>\n ) : null}\n {errorCopy ? (\n <span className=\"type-meta ds:ms-auto ds:text-[var(--destructive)]\">\n {errorCopy}\n </span>\n ) : null}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={filledCount}\n aria-valuetext={valueText}\n className={trackVariants({ size })}\n >\n <span\n ref={fillRef}\n aria-hidden=\"true\"\n className={fillVariants({ tone })}\n />\n </div>\n </div>\n );\n },\n);\nStepperProgress.displayName = 'StepperProgress';\n\nexport { StepperProgress };\n"],"names":["rootVariants","cva","trackVariants","fillVariants","captionVariants","StepperProgress","forwardRef","activeStep","steps","ariaLabel","hideCaption","size","captionPosition","className","rest","ref","t","useTranslation","fillRef","useRef","total","clampedActive","activeSpec","activeState","filledCount","targetPercent","tone","hasMounted","setHasMounted","useState","useEffect","percent","useLayoutEffect","_a","captionText","label","errorCopy","valueText","jsxs","jsx"],"mappings":";;;;AAwBA,MAAMA,IAAeC,EAAI,qBAAqB;AAAA,EAC5C,UAAU;AAAA,IACR,iBAAiB;AAAA,MACf,KAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EACV;AAAA,EAEF,iBAAiB,EAAE,iBAAiB,MAAA;AACtC,CAAC,GAEKC,IAAgBD;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,iBAAiB,EAAE,MAAM,UAAA;AAAA,EAAU;AAEvC,GAEME,IAAeF;AAAA,EACnB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,iBAAiB,EAAE,MAAM,WAAA;AAAA,EAAW;AAExC,GAEMG,IAAkBH;AAAA,EACtB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,IACZ;AAAA,IAEF,iBAAiB,EAAE,MAAM,WAAA;AAAA,EAAW;AAExC,GAoBMI,IAAkBC;AAAA,EACtB,CACE;AAAA,IACE,YAAAC;AAAA,IACA,OAAAC;AAAA,IACA,cAAcC;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,MAAAC,IAAO;AAAA,IACP,iBAAAC,IAAkB;AAAA,IAClB,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAwB,IAAI,GAEtCC,IAAQZ,EAAM,QACda,IAAgB,KAAK,IAAI,GAAG,KAAK,IAAId,GAAYa,IAAQ,CAAC,CAAC,GAC3DE,IAAad,EAAMa,CAAa,GAGhCE,KACJD,KAAA,gBAAAA,EAAY,YAAW,UAAU,UAAU,WAKvCE,IAAcH,IAAgB,GAC9BI,IAAgBL,MAAU,IAAI,IAAKI,IAAcJ,IAAS,KAE1DM,IACJH,MAAgB,UACZ,UACAF,MAAkBD,IAAQ,KAAKA,IAAQ,IACrC,aACA,YAKF,CAACO,GAAYC,CAAa,IAAIC,EAAS,EAAK;AAClD,IAAAC,EAAU,MAAM;AACd,MAAAF,EAAc,EAAI;AAAA,IACpB,GAAG,CAAA,CAAE;AACL,UAAMG,IAAUJ,IAAaF,IAAgB;AAM7C,IAAAO,EAAgB,MAAM;;AACpB,OAAAC,IAAAf,EAAQ,YAAR,QAAAe,EAAiB,MAAM;AAAA,QACrB;AAAA,QACA,OAAOF,CAAO;AAAA;AAAA,IAElB,GAAG,CAACA,CAAO,CAAC;AAEZ,UAAMG,IAAclB,EAAE,kCAAkC;AAAA,MACtD,GAAGK,IAAgB;AAAA,MACnB,OAAAD;AAAA,IAAA,CACD,GACKe,IAAQ1B,KAAaO,EAAE,0BAA0B,GACjDoB,IACJb,MAAgB,YAAWD,KAAA,QAAAA,EAAY,eACnCA,EAAW,cACX,MAKAe,IAAY;AAAA,MAChBH;AAAA,MACAZ,IAAa,KAAKA,EAAW,KAAK,KAAK;AAAA,MACvCc;AAAA,IAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAvB;AAAA,QACA,WAAWf,EAAa,EAAE,iBAAAY,GAAiB,WAAAC,GAAW;AAAA,QACrD,GAAGC;AAAA,QAEH,UAAA;AAAA,UAAAJ,IAAc,OACb,gBAAA4B,EAAC,OAAA,EAAI,WAAWlC,EAAgB,EAAE,MAAAsB,EAAA,CAAM,GAAG,eAAY,QACrD,UAAA;AAAA,YAAA,gBAAAa,EAAC,QAAA,EAAK,WAAU,mDACb,UAAAL,GACH;AAAA,YACCZ,IACC,gBAAAgB,EAAC,QAAA,EAAK,WAAU,+CAA8C,UAAA;AAAA,cAAA;AAAA,cACzDhB,EAAW;AAAA,YAAA,EAAA,CAChB,IACE;AAAA,YACHc,IACC,gBAAAG,EAAC,QAAA,EAAK,WAAU,qDACb,aACH,IACE;AAAA,UAAA,GACN;AAAA,UAEF,gBAAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAYJ;AAAA,cACZ,iBAAe;AAAA,cACf,iBAAef;AAAA,cACf,iBAAeI;AAAA,cACf,kBAAgBa;AAAA,cAChB,WAAWnC,EAAc,EAAE,MAAAS,GAAM;AAAA,cAEjC,UAAA,gBAAA4B;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKrB;AAAA,kBACL,eAAY;AAAA,kBACZ,WAAWf,EAAa,EAAE,MAAAuB,EAAA,CAAM;AAAA,gBAAA;AAAA,cAAA;AAAA,YAClC;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACArB,EAAgB,cAAc;"}
1
+ {"version":3,"file":"stepper-progress-rE7tn7WY.js","sources":["../../src/components/stepper-progress/stepper-progress.tsx"],"sourcesContent":["import {\n forwardRef,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport type { StepSpec, StepState } from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperProgress */\n/* */\n/* A lightweight \"Step N of M — {label}\" caption + fill bar. Pure */\n/* indicator — no revisit, no per-step click targets. For flows that */\n/* need editable completed steps, reach for `StepperAccordion`. */\n/* -------------------------------------------------------------------- */\n\ntype Size = 'sm' | 'default';\ntype CaptionPosition = 'top' | 'bottom';\ntype Tone = 'progress' | 'error' | 'complete';\n\nconst rootVariants = cva('ds:flex ds:w-full', {\n variants: {\n captionPosition: {\n top: 'ds:flex-col ds:gap-[var(--spacing-xs)]',\n bottom: 'ds:flex-col-reverse ds:gap-[var(--spacing-xs)]',\n },\n },\n defaultVariants: { captionPosition: 'top' },\n});\n\nconst trackVariants = cva(\n 'ds:relative ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-[var(--muted)]',\n {\n variants: {\n size: {\n sm: 'ds:h-[var(--spacing-xs)]',\n default: 'ds:h-[var(--spacing-sm)]',\n },\n },\n defaultVariants: { size: 'default' },\n },\n);\n\nconst fillVariants = cva(\n [\n 'ds:block ds:h-full ds:rounded-[var(--radius-full)]',\n 'ds:[inline-size:calc(var(--stepper-progress-value,0)*1%)]',\n 'ds:transition-[inline-size,background-color] ds:duration-[var(--animation-duration)] ds:ease-[var(--ease-out)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n tone: {\n progress: 'ds:bg-[var(--primary)]',\n error: 'ds:bg-[var(--destructive)]',\n complete: 'ds:bg-[var(--success,var(--primary))]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nconst captionVariants = cva(\n 'ds:flex ds:items-baseline ds:gap-[var(--spacing-sm)] ds:flex-wrap',\n {\n variants: {\n tone: {\n progress: 'ds:text-[var(--foreground)]',\n error: 'ds:text-[var(--destructive)]',\n complete: 'ds:text-[var(--foreground)]',\n },\n },\n defaultVariants: { tone: 'progress' },\n },\n);\n\nexport interface StepperProgressProps\n extends Omit<ComponentPropsWithoutRef<'div'>, 'aria-label'>,\n VariantProps<typeof trackVariants>,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). */\n activeStep: number;\n /** Step specs — `label` is used in the caption for the active step. */\n steps: StepSpec[];\n /** Override the default `aria-label` on the progressbar. */\n 'aria-label'?: string;\n /** Hide the \"Step N of M — label\" caption. @default false */\n hideCaption?: boolean;\n /** Track size. @default 'default' */\n size?: Size;\n /** Caption position relative to the bar. @default 'top' */\n captionPosition?: CaptionPosition;\n}\n\nconst StepperProgress = forwardRef<HTMLDivElement, StepperProgressProps>(\n (\n {\n activeStep,\n steps,\n 'aria-label': ariaLabel,\n hideCaption = false,\n size = 'default',\n captionPosition = 'top',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const fillRef = useRef<HTMLSpanElement>(null);\n\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const activeSpec = steps[clampedActive];\n // The progress variant only renders one \"active\" step at a time — the\n // shared four-way state machine collapses to error-or-current here.\n const activeState: StepState =\n activeSpec?.status === 'error' ? 'error' : 'current';\n\n // Fill reaches through the completed segments plus the current one, so\n // a 4-step flow at index 1 fills 50% (2/4). Matches the user's mental\n // model for \"how far along am I\".\n const filledCount = clampedActive + 1;\n const targetPercent = total === 0 ? 0 : (filledCount / total) * 100;\n\n const tone: Tone =\n activeState === 'error'\n ? 'error'\n : clampedActive === total - 1 && total > 0\n ? 'complete'\n : 'progress';\n\n // Mount-in animation: paint at 0 on first render, then swap to the\n // target in a post-mount effect so the CSS transition animates from\n // empty → target. Matches the pattern in `components/progress`.\n const [hasMounted, setHasMounted] = useState(false);\n useEffect(() => {\n setHasMounted(true);\n }, []);\n const percent = hasMounted ? targetPercent : 0;\n\n // Setting a CSS custom property via `style.setProperty` (rather than a\n // JSX `style={{}}` attribute) is the sanctioned escape hatch for\n // runtime-computed CSS tokens per `src/docs/23-constraints.mdx` §4;\n // the `components/progress` bar uses the same pattern for its fill.\n useLayoutEffect(() => {\n fillRef.current?.style.setProperty(\n '--stepper-progress-value',\n String(percent),\n );\n }, [percent]);\n\n const captionText = t('navigation.stepper.stepOfTotal', {\n n: clampedActive + 1,\n total,\n });\n const label = ariaLabel ?? t('navigation.stepper.label');\n const errorCopy =\n activeState === 'error' && activeSpec?.description\n ? activeSpec.description\n : null;\n // `aria-valuetext` is the single AT source — the caption is aria-hidden\n // so anything the caption exposes (label, error description) must be\n // appended here too, or it's invisible to screen-reader users who set\n // `hideCaption`.\n const valueText = [\n captionText,\n activeSpec ? `— ${activeSpec.label}` : null,\n errorCopy,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n ref={ref}\n data-component=\"stepper-progress\"\n className={rootVariants({ captionPosition, className })}\n {...rest}\n >\n {hideCaption ? null : (\n <div className={captionVariants({ tone })} aria-hidden=\"true\">\n <span className=\"type-meta ds:font-[var(--font-weight-semibold)]\">\n {captionText}\n </span>\n {activeSpec ? (\n <span className=\"type-meta ds:text-[var(--muted-foreground)]\">\n — {activeSpec.label}\n </span>\n ) : null}\n {errorCopy ? (\n <span className=\"type-meta ds:ms-auto ds:text-[var(--destructive)]\">\n {errorCopy}\n </span>\n ) : null}\n </div>\n )}\n <div\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={total}\n aria-valuenow={filledCount}\n aria-valuetext={valueText}\n className={trackVariants({ size })}\n >\n <span\n ref={fillRef}\n aria-hidden=\"true\"\n className={fillVariants({ tone })}\n />\n </div>\n </div>\n );\n },\n);\nStepperProgress.displayName = 'StepperProgress';\n\nexport { StepperProgress };\n"],"names":["rootVariants","cva","trackVariants","fillVariants","captionVariants","StepperProgress","forwardRef","activeStep","steps","ariaLabel","hideCaption","size","captionPosition","className","rest","ref","t","useTranslation","fillRef","useRef","total","clampedActive","activeSpec","activeState","filledCount","targetPercent","tone","hasMounted","setHasMounted","useState","useEffect","percent","useLayoutEffect","_a","captionText","label","errorCopy","valueText","jsxs","jsx"],"mappings":"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"}
@@ -55,7 +55,7 @@ const w = y(
55
55
  density: o = "default",
56
56
  className: l,
57
57
  ...c
58
- }, u) => {
58
+ }, p) => {
59
59
  const [i, d] = v(a);
60
60
  b(() => {
61
61
  if (!e) {
@@ -65,17 +65,18 @@ const w = y(
65
65
  const m = setTimeout(() => d(a), 100);
66
66
  return () => clearTimeout(m);
67
67
  }, [a, e]);
68
- const p = s ? T(i) : i;
68
+ const u = s ? T(i) : i;
69
69
  return /* @__PURE__ */ f(
70
70
  "span",
71
71
  {
72
- ref: u,
72
+ ref: p,
73
73
  "aria-live": r,
74
74
  "aria-busy": e || void 0,
75
+ "data-component": "streaming-text",
75
76
  className: g({ size: t, density: o, className: l }),
76
77
  ...c,
77
78
  children: [
78
- p,
79
+ u,
79
80
  e ? /* @__PURE__ */ n(
80
81
  "span",
81
82
  {
@@ -101,4 +102,4 @@ w.displayName = "StreamingText";
101
102
  export {
102
103
  w as S
103
104
  };
104
- //# sourceMappingURL=streaming-text-D0cW8pwq.js.map
105
+ //# sourceMappingURL=streaming-text-BgjCTVOw.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-text-D0cW8pwq.js","sources":["../../src/components/streaming-text/streaming-text.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';\n\nconst containerVariants = cva(\n 'type-body ds:block ds:whitespace-pre-wrap ds:break-words',\n {\n variants: {\n // Family, weight, tracking, line-height all come from `.type-body` on the base.\n // Size variants override --type-body-size to shift the ramp step.\n size: {\n sm: 'ds:[--type-body-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-body-size:var(--font-size-lg)]',\n },\n density: {\n default: '',\n compact: 'ds:[--type-body-size:var(--font-size-sm)] ds:leading-snug',\n },\n },\n defaultVariants: { size: 'md', density: 'default' },\n },\n);\n\ntype NativeProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children' | 'aria-busy' | 'aria-live'>;\n\nexport interface StreamingTextProps\n extends NativeProps,\n VariantProps<typeof containerVariants> {\n /** Accumulated plain-text content. Parent appends tokens as they arrive. */\n content: string;\n /** While true the blinking cursor is shown and aria-busy is set. */\n isStreaming: boolean;\n /** When true, parse a small, safe subset of markdown (bold, inline code, line-breaks).\n * No HTML passes through; no dangerouslySetInnerHTML is ever used. */\n renderMarkdown?: boolean;\n /** Announce updates more aggressively when the streamed content is primary\n * (not wrapped by a higher-level log region). Defaults to 'polite'; never\n * set to 'assertive' for streamed output. */\n ariaLive?: 'polite' | 'off';\n}\n\n/* ------------------------------------------------------------------ */\n/* Safe, dependency-free markdown-ish renderer. */\n/* Handles **bold**, `inline code`, and newlines. Anything that looks */\n/* like HTML stays as text — no dangerouslySetInnerHTML. */\n/* ------------------------------------------------------------------ */\n\ntype Token =\n | { type: 'text'; value: string }\n | { type: 'bold'; value: string }\n | { type: 'code'; value: string }\n | { type: 'br' };\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let remaining = input;\n // Alternation: bold | code | newline | text.\n const pattern = /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\n/;\n while (remaining.length > 0) {\n const match = pattern.exec(remaining);\n if (!match) {\n tokens.push({ type: 'text', value: remaining });\n break;\n }\n if (match.index > 0) {\n tokens.push({ type: 'text', value: remaining.slice(0, match.index) });\n }\n if (match[1] !== undefined) {\n tokens.push({ type: 'bold', value: match[1] });\n } else if (match[2] !== undefined) {\n tokens.push({ type: 'code', value: match[2] });\n } else {\n tokens.push({ type: 'br' });\n }\n remaining = remaining.slice(match.index + match[0].length);\n }\n return tokens;\n}\n\nfunction renderTokens(input: string): ReactNode {\n return tokenize(input).map((tok, i) => {\n if (tok.type === 'bold') return <strong key={i}>{tok.value}</strong>;\n if (tok.type === 'code') {\n return (\n <code\n key={i}\n dir=\"ltr\"\n className=\"ds:rounded-[var(--radius-sm)] ds:bg-muted/20 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-[family-name:var(--font-mono)] ds:text-[length:0.95em]\"\n >\n {tok.value}\n </code>\n );\n }\n if (tok.type === 'br') return <br key={i} />;\n return <Fragment key={i}>{tok.value}</Fragment>;\n });\n}\n\nexport const StreamingText = forwardRef<HTMLSpanElement, StreamingTextProps>(\n (\n {\n content,\n isStreaming,\n renderMarkdown = false,\n ariaLive = 'polite',\n size = 'md',\n density = 'default',\n className,\n ...rest\n },\n ref,\n ) => {\n // Throttle visible content to at most ~10 updates per second so assistive\n // tech doesn't receive one announcement per token. We keep the full text in\n // a ref and push it to state on a timer.\n const [visible, setVisible] = useState<string>(content);\n\n useEffect(() => {\n if (!isStreaming) {\n // Streaming ended — flush immediately.\n setVisible(content);\n return;\n }\n // Global `setTimeout` works in both Node and browsers — avoid the\n // `window.` prefix so SSR (Next.js App Router, Remix) doesn't throw.\n const handle = setTimeout(() => setVisible(content), 100);\n return () => clearTimeout(handle);\n }, [content, isStreaming]);\n\n const body = renderMarkdown ? renderTokens(visible) : visible;\n\n return (\n <span\n ref={ref}\n aria-live={ariaLive}\n aria-busy={isStreaming || undefined}\n className={containerVariants({ size, density, className })}\n {...rest}\n >\n {body}\n {isStreaming ? (\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:inline-block ds:align-baseline',\n 'ds:text-[color:var(--primary)]',\n 'ds:motion-safe:animate-[streaming-cursor-blink_1s_step-end_infinite]',\n 'ds:motion-reduce:opacity-100',\n 'ds:[.theme-accessible_&]:animate-none',\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:ms-[1px]',\n ].join(' ')}\n >\n {'\\u258D'}\n </span>\n ) : null}\n </span>\n );\n },\n);\n\nStreamingText.displayName = 'StreamingText';\n"],"names":["containerVariants","cva","tokenize","input","tokens","remaining","pattern","match","renderTokens","tok","i","jsx","Fragment","StreamingText","forwardRef","content","isStreaming","renderMarkdown","ariaLive","size","density","className","rest","ref","visible","setVisible","useState","useEffect","handle","body","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"streaming-text-BgjCTVOw.js","sources":["../../src/components/streaming-text/streaming-text.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';\n\nconst containerVariants = cva(\n 'type-body ds:block ds:whitespace-pre-wrap ds:break-words',\n {\n variants: {\n // Family, weight, tracking, line-height all come from `.type-body` on the base.\n // Size variants override --type-body-size to shift the ramp step.\n size: {\n sm: 'ds:[--type-body-size:var(--font-size-sm)]',\n md: '',\n lg: 'ds:[--type-body-size:var(--font-size-lg)]',\n },\n density: {\n default: '',\n compact: 'ds:[--type-body-size:var(--font-size-sm)] ds:leading-snug',\n },\n },\n defaultVariants: { size: 'md', density: 'default' },\n },\n);\n\ntype NativeProps = Omit<HTMLAttributes<HTMLSpanElement>, 'children' | 'aria-busy' | 'aria-live'>;\n\nexport interface StreamingTextProps\n extends NativeProps,\n VariantProps<typeof containerVariants> {\n /** Accumulated plain-text content. Parent appends tokens as they arrive. */\n content: string;\n /** While true the blinking cursor is shown and aria-busy is set. */\n isStreaming: boolean;\n /** When true, parse a small, safe subset of markdown (bold, inline code, line-breaks).\n * No HTML passes through; no dangerouslySetInnerHTML is ever used. */\n renderMarkdown?: boolean;\n /** Announce updates more aggressively when the streamed content is primary\n * (not wrapped by a higher-level log region). Defaults to 'polite'; never\n * set to 'assertive' for streamed output. */\n ariaLive?: 'polite' | 'off';\n}\n\n/* ------------------------------------------------------------------ */\n/* Safe, dependency-free markdown-ish renderer. */\n/* Handles **bold**, `inline code`, and newlines. Anything that looks */\n/* like HTML stays as text — no dangerouslySetInnerHTML. */\n/* ------------------------------------------------------------------ */\n\ntype Token =\n | { type: 'text'; value: string }\n | { type: 'bold'; value: string }\n | { type: 'code'; value: string }\n | { type: 'br' };\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let remaining = input;\n // Alternation: bold | code | newline | text.\n const pattern = /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\n/;\n while (remaining.length > 0) {\n const match = pattern.exec(remaining);\n if (!match) {\n tokens.push({ type: 'text', value: remaining });\n break;\n }\n if (match.index > 0) {\n tokens.push({ type: 'text', value: remaining.slice(0, match.index) });\n }\n if (match[1] !== undefined) {\n tokens.push({ type: 'bold', value: match[1] });\n } else if (match[2] !== undefined) {\n tokens.push({ type: 'code', value: match[2] });\n } else {\n tokens.push({ type: 'br' });\n }\n remaining = remaining.slice(match.index + match[0].length);\n }\n return tokens;\n}\n\nfunction renderTokens(input: string): ReactNode {\n return tokenize(input).map((tok, i) => {\n if (tok.type === 'bold') return <strong key={i}>{tok.value}</strong>;\n if (tok.type === 'code') {\n return (\n <code\n key={i}\n dir=\"ltr\"\n className=\"ds:rounded-[var(--radius-sm)] ds:bg-muted/20 ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:font-[family-name:var(--font-mono)] ds:text-[length:0.95em]\"\n >\n {tok.value}\n </code>\n );\n }\n if (tok.type === 'br') return <br key={i} />;\n return <Fragment key={i}>{tok.value}</Fragment>;\n });\n}\n\nexport const StreamingText = forwardRef<HTMLSpanElement, StreamingTextProps>(\n (\n {\n content,\n isStreaming,\n renderMarkdown = false,\n ariaLive = 'polite',\n size = 'md',\n density = 'default',\n className,\n ...rest\n },\n ref,\n ) => {\n // Throttle visible content to at most ~10 updates per second so assistive\n // tech doesn't receive one announcement per token. We keep the full text in\n // a ref and push it to state on a timer.\n const [visible, setVisible] = useState<string>(content);\n\n useEffect(() => {\n if (!isStreaming) {\n // Streaming ended — flush immediately.\n setVisible(content);\n return;\n }\n // Global `setTimeout` works in both Node and browsers — avoid the\n // `window.` prefix so SSR (Next.js App Router, Remix) doesn't throw.\n const handle = setTimeout(() => setVisible(content), 100);\n return () => clearTimeout(handle);\n }, [content, isStreaming]);\n\n const body = renderMarkdown ? renderTokens(visible) : visible;\n\n return (\n <span\n ref={ref}\n aria-live={ariaLive}\n aria-busy={isStreaming || undefined}\n data-component=\"streaming-text\"\n className={containerVariants({ size, density, className })}\n {...rest}\n >\n {body}\n {isStreaming ? (\n <span\n aria-hidden=\"true\"\n className={[\n 'ds:inline-block ds:align-baseline',\n 'ds:text-[color:var(--primary)]',\n 'ds:motion-safe:animate-[streaming-cursor-blink_1s_step-end_infinite]',\n 'ds:motion-reduce:opacity-100',\n 'ds:[.theme-accessible_&]:animate-none',\n 'ds:forced-colors:text-[CanvasText]',\n 'ds:ms-[1px]',\n ].join(' ')}\n >\n {'\\u258D'}\n </span>\n ) : null}\n </span>\n );\n },\n);\n\nStreamingText.displayName = 'StreamingText';\n"],"names":["containerVariants","cva","tokenize","input","tokens","remaining","pattern","match","renderTokens","tok","i","jsx","Fragment","StreamingText","forwardRef","content","isStreaming","renderMarkdown","ariaLive","size","density","className","rest","ref","visible","setVisible","useState","useEffect","handle","body","jsxs"],"mappings":"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"}
@@ -132,6 +132,7 @@ const B = G(null), q = L(
132
132
  onFocus: (e) => {
133
133
  a == null || a(e), s && !m && s.setFocus(o);
134
134
  },
135
+ "data-component": "suggestion-chip",
135
136
  className: K({ intent: z, size: M, className: r }),
136
137
  ...C,
137
138
  children: [
@@ -154,4 +155,4 @@ export {
154
155
  q as S,
155
156
  U as a
156
157
  };
157
- //# sourceMappingURL=suggestion-chip-BgNFpPEE.js.map
158
+ //# sourceMappingURL=suggestion-chip-6AB40rxz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"suggestion-chip-BgNFpPEE.js","sources":["../../src/components/suggestion-chip/suggestion-chip.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst chipVariants = cva(\n [\n // `max-w-full` keeps a chip from blowing past its container when the\n // label is long and the container is narrow (e.g. a 22rem Leo sidebar\n // dock). Labels wrap onto multiple lines via `whitespace-normal` +\n // `break-words` so the full text stays legible — rounded pills grow\n // taller rather than hiding content behind an ellipsis.\n 'ds:inline-flex ds:items-center ds:justify-start ds:text-start ds:whitespace-normal ds:break-words ds:max-w-full',\n 'ds:rounded-[var(--radius-full)] ds:border',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-label',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:forced-colors:border-[ButtonText] ds:forced-colors:text-[ButtonText]',\n ].join(' '),\n {\n variants: {\n intent: {\n default:\n 'ds:bg-muted/20 ds:text-foreground ds:border-transparent ds:hover:bg-accent/10',\n suggestion:\n 'ds:bg-[color:var(--primary)]/10 ds:text-foreground ds:border-[color:var(--primary)]/20 ds:hover:bg-[color:var(--primary)]/15',\n followup:\n 'ds:bg-transparent ds:text-foreground ds:border-border ds:hover:bg-muted/10',\n },\n // Weight, family, tracking, line-height all come from `.type-label` on the base.\n // Size variants override --type-label-size to shift the ramp step.\n size: {\n sm: 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-label-size:var(--font-size-xs)]',\n md: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n lg: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:[--type-label-size:var(--font-size-base)]',\n },\n },\n defaultVariants: { intent: 'default', size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Group context — roving tabIndex */\n/* ------------------------------------------------------------------ */\n\ninterface ChipGroupCtxValue {\n register: (id: string) => void;\n unregister: (id: string) => void;\n focusedId: string | null;\n setFocus: (id: string) => void;\n onArrowMove: (\n id: string,\n direction: 'prev' | 'next' | 'first' | 'last',\n ) => void;\n isRTL: boolean;\n}\n\nconst ChipGroupCtx = createContext<ChipGroupCtxValue | null>(null);\n\n/* ------------------------------------------------------------------ */\n/* SuggestionChipGroup */\n/* ------------------------------------------------------------------ */\n\nexport interface SuggestionChipGroupProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'aria-label'> {\n /** Override the default group label (ui.chat.suggestions). */\n label?: string;\n}\n\nexport const SuggestionChipGroup = forwardRef<HTMLDivElement, SuggestionChipGroupProps>(\n ({ label, className, children, ...rest }, ref) => {\n const { t, i18n } = useTranslation();\n const isRTL = i18n.dir() === 'rtl';\n const [order, setOrder] = useState<string[]>([]);\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const nodeMap = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n const register = useCallback((id: string) => {\n setOrder((prev) => (prev.includes(id) ? prev : [...prev, id]));\n }, []);\n const unregister = useCallback((id: string) => {\n setOrder((prev) => prev.filter((x) => x !== id));\n nodeMap.current.delete(id);\n }, []);\n\n const setFocus = useCallback((id: string) => setFocusedId(id), []);\n\n useEffect(() => {\n // Ensure focusedId stays valid — default to first registered.\n if (!focusedId && order.length > 0) setFocusedId(order[0]);\n if (focusedId && !order.includes(focusedId)) {\n setFocusedId(order[0] ?? null);\n }\n }, [focusedId, order]);\n\n const onArrowMove: ChipGroupCtxValue['onArrowMove'] = useCallback(\n (id, direction) => {\n const idx = order.indexOf(id);\n if (idx === -1) return;\n let next = idx;\n if (direction === 'next') next = (idx + 1) % order.length;\n if (direction === 'prev') next = (idx - 1 + order.length) % order.length;\n if (direction === 'first') next = 0;\n if (direction === 'last') next = order.length - 1;\n const nextId = order[next];\n setFocusedId(nextId);\n const el = nodeMap.current.get(nextId);\n el?.focus();\n },\n [order],\n );\n\n // Wrapped in useCallback so the context value reference is stable across\n // renders — otherwise every chip re-runs its ref-registering effect on\n // every focus change.\n const registerNode = useCallback(\n (id: string, el: HTMLButtonElement | null) => {\n if (el) nodeMap.current.set(id, el);\n else nodeMap.current.delete(id);\n },\n [],\n );\n\n // Memoise the context value so child chips don't see a new `group`\n // reference on every render — otherwise their register/unregister\n // effect re-runs each render, driving setOrder in the parent and\n // producing an infinite render loop.\n const ctxValue = useMemo(\n () => ({ register, unregister, focusedId, setFocus, onArrowMove, isRTL }),\n [register, unregister, focusedId, setFocus, onArrowMove, isRTL],\n );\n\n return (\n <ChipGroupCtxNodeContext.Provider value={registerNode}>\n <ChipGroupCtx.Provider value={ctxValue}>\n <div\n ref={ref}\n role=\"group\"\n aria-label={label ?? t('chat.suggestions')}\n className={[\n 'ds:flex ds:flex-wrap ds:items-center',\n 'ds:gap-y-[var(--spacing-xs)] ds:gap-x-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n </ChipGroupCtx.Provider>\n </ChipGroupCtxNodeContext.Provider>\n );\n },\n);\n\nSuggestionChipGroup.displayName = 'SuggestionChipGroup';\n\n// Separate context to register the DOM node from the chip without tripping\n// eslint `react-hooks/exhaustive-deps`.\nconst ChipGroupCtxNodeContext = createContext<\n ((id: string, el: HTMLButtonElement | null) => void) | null\n>(null);\n\n/* ------------------------------------------------------------------ */\n/* SuggestionChip */\n/* ------------------------------------------------------------------ */\n\ntype NativeButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'onSelect' | 'children'\n>;\n\nexport interface SuggestionChipProps\n extends NativeButtonProps,\n VariantProps<typeof chipVariants> {\n /** Value emitted on activation. Falls back to children when a string. */\n value?: string;\n startIcon?: ReactNode;\n children: ReactNode;\n /** Activation handler. */\n onSelect?: (value: string) => void;\n /** When provided, parent owns removal. Otherwise the chip manages its own\n * `removed` state and unmounts after selection. */\n onRemove?: () => void;\n /** Opt out of self-removal — useful inside controlled lists. */\n keepOnSelect?: boolean;\n}\n\nexport const SuggestionChip = forwardRef<HTMLButtonElement, SuggestionChipProps>(\n (\n {\n intent = 'default',\n size = 'md',\n value,\n startIcon,\n children,\n onSelect,\n onRemove,\n keepOnSelect = false,\n className,\n disabled,\n onKeyDown,\n onFocus,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const id = useId();\n const group = useContext(ChipGroupCtx);\n const registerNode = useContext(ChipGroupCtxNodeContext);\n const [removed, setRemoved] = useState(false);\n const localRef = useRef<HTMLButtonElement | null>(null);\n\n const setRef = (node: HTMLButtonElement | null) => {\n localRef.current = node;\n registerNode?.(id, node);\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n };\n\n // Keep register/unregister in a ref so the effect runs only on\n // mount / unmount. Depending on `group` directly would re-fire the\n // effect on every parent render (focusedId changes invalidate the\n // group context value), which in turn mutates the parent's `order`\n // state and loops.\n const groupRef = useRef(group);\n groupRef.current = group;\n\n useEffect(() => {\n const g = groupRef.current;\n if (!g) return;\n g.register(id);\n return () => g.unregister(id);\n }, [id]);\n\n if (removed) return null;\n\n const isFocused = group ? group.focusedId === id : true;\n const tabIndex = group ? (isFocused ? 0 : -1) : 0;\n\n const handleClick: NonNullable<NativeButtonProps['onClick']> = (e) => {\n onClick?.(e);\n const resolvedValue =\n typeof value === 'string'\n ? value\n : typeof children === 'string'\n ? children\n : '';\n onSelect?.(resolvedValue);\n if (onRemove) onRemove();\n else if (!keepOnSelect) setRemoved(true);\n };\n\n const handleKeyDown: NonNullable<NativeButtonProps['onKeyDown']> = (e) => {\n onKeyDown?.(e);\n if (!group) return;\n // Arrow navigation inside a group — RTL inverts Left/Right.\n const nextKey = group.isRTL ? 'ArrowLeft' : 'ArrowRight';\n const prevKey = group.isRTL ? 'ArrowRight' : 'ArrowLeft';\n if (e.key === nextKey || e.key === 'ArrowDown') {\n e.preventDefault();\n group.onArrowMove(id, 'next');\n } else if (e.key === prevKey || e.key === 'ArrowUp') {\n e.preventDefault();\n group.onArrowMove(id, 'prev');\n } else if (e.key === 'Home') {\n e.preventDefault();\n group.onArrowMove(id, 'first');\n } else if (e.key === 'End') {\n e.preventDefault();\n group.onArrowMove(id, 'last');\n }\n };\n\n const handleFocus: NonNullable<NativeButtonProps['onFocus']> = (e) => {\n onFocus?.(e);\n if (group && !isFocused) group.setFocus(id);\n };\n\n return (\n <button\n ref={setRef}\n type=\"button\"\n tabIndex={tabIndex}\n disabled={disabled}\n onClick={disabled ? undefined : handleClick}\n onKeyDown={handleKeyDown as unknown as (e: KeyboardEvent<HTMLButtonElement>) => void}\n onFocus={handleFocus}\n className={chipVariants({ intent, size, className })}\n {...rest}\n >\n {startIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:me-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:[&>svg]:size-4\"\n >\n {startIcon}\n </span>\n ) : null}\n <span>{children}</span>\n </button>\n );\n },\n);\n\nSuggestionChip.displayName = 'SuggestionChip';\n"],"names":["chipVariants","cva","ChipGroupCtx","createContext","SuggestionChipGroup","forwardRef","label","className","children","rest","ref","t","i18n","useTranslation","isRTL","order","setOrder","useState","focusedId","setFocusedId","nodeMap","useRef","register","useCallback","id","prev","unregister","x","setFocus","useEffect","onArrowMove","direction","idx","next","nextId","el","registerNode","ctxValue","useMemo","jsx","ChipGroupCtxNodeContext","SuggestionChip","intent","size","value","startIcon","onSelect","onRemove","keepOnSelect","disabled","onKeyDown","onFocus","onClick","useId","group","useContext","removed","setRemoved","localRef","setRef","node","groupRef","g","isFocused","jsxs","resolvedValue","nextKey","prevKey"],"mappings":"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"}
1
+ {"version":3,"file":"suggestion-chip-6AB40rxz.js","sources":["../../src/components/suggestion-chip/suggestion-chip.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst chipVariants = cva(\n [\n // `max-w-full` keeps a chip from blowing past its container when the\n // label is long and the container is narrow (e.g. a 22rem Leo sidebar\n // dock). Labels wrap onto multiple lines via `whitespace-normal` +\n // `break-words` so the full text stays legible — rounded pills grow\n // taller rather than hiding content behind an ellipsis.\n 'ds:inline-flex ds:items-center ds:justify-start ds:text-start ds:whitespace-normal ds:break-words ds:max-w-full',\n 'ds:rounded-[var(--radius-full)] ds:border',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n 'type-label',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:forced-colors:border-[ButtonText] ds:forced-colors:text-[ButtonText]',\n ].join(' '),\n {\n variants: {\n intent: {\n default:\n 'ds:bg-muted/20 ds:text-foreground ds:border-transparent ds:hover:bg-accent/10',\n suggestion:\n 'ds:bg-[color:var(--primary)]/10 ds:text-foreground ds:border-[color:var(--primary)]/20 ds:hover:bg-[color:var(--primary)]/15',\n followup:\n 'ds:bg-transparent ds:text-foreground ds:border-border ds:hover:bg-muted/10',\n },\n // Weight, family, tracking, line-height all come from `.type-label` on the base.\n // Size variants override --type-label-size to shift the ramp step.\n size: {\n sm: 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:[--type-label-size:var(--font-size-xs)]',\n md: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n lg: 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:[--type-label-size:var(--font-size-base)]',\n },\n },\n defaultVariants: { intent: 'default', size: 'md' },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Group context — roving tabIndex */\n/* ------------------------------------------------------------------ */\n\ninterface ChipGroupCtxValue {\n register: (id: string) => void;\n unregister: (id: string) => void;\n focusedId: string | null;\n setFocus: (id: string) => void;\n onArrowMove: (\n id: string,\n direction: 'prev' | 'next' | 'first' | 'last',\n ) => void;\n isRTL: boolean;\n}\n\nconst ChipGroupCtx = createContext<ChipGroupCtxValue | null>(null);\n\n/* ------------------------------------------------------------------ */\n/* SuggestionChipGroup */\n/* ------------------------------------------------------------------ */\n\nexport interface SuggestionChipGroupProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'aria-label'> {\n /** Override the default group label (ui.chat.suggestions). */\n label?: string;\n}\n\nexport const SuggestionChipGroup = forwardRef<HTMLDivElement, SuggestionChipGroupProps>(\n ({ label, className, children, ...rest }, ref) => {\n const { t, i18n } = useTranslation();\n const isRTL = i18n.dir() === 'rtl';\n const [order, setOrder] = useState<string[]>([]);\n const [focusedId, setFocusedId] = useState<string | null>(null);\n const nodeMap = useRef<Map<string, HTMLButtonElement>>(new Map());\n\n const register = useCallback((id: string) => {\n setOrder((prev) => (prev.includes(id) ? prev : [...prev, id]));\n }, []);\n const unregister = useCallback((id: string) => {\n setOrder((prev) => prev.filter((x) => x !== id));\n nodeMap.current.delete(id);\n }, []);\n\n const setFocus = useCallback((id: string) => setFocusedId(id), []);\n\n useEffect(() => {\n // Ensure focusedId stays valid — default to first registered.\n if (!focusedId && order.length > 0) setFocusedId(order[0]);\n if (focusedId && !order.includes(focusedId)) {\n setFocusedId(order[0] ?? null);\n }\n }, [focusedId, order]);\n\n const onArrowMove: ChipGroupCtxValue['onArrowMove'] = useCallback(\n (id, direction) => {\n const idx = order.indexOf(id);\n if (idx === -1) return;\n let next = idx;\n if (direction === 'next') next = (idx + 1) % order.length;\n if (direction === 'prev') next = (idx - 1 + order.length) % order.length;\n if (direction === 'first') next = 0;\n if (direction === 'last') next = order.length - 1;\n const nextId = order[next];\n setFocusedId(nextId);\n const el = nodeMap.current.get(nextId);\n el?.focus();\n },\n [order],\n );\n\n // Wrapped in useCallback so the context value reference is stable across\n // renders — otherwise every chip re-runs its ref-registering effect on\n // every focus change.\n const registerNode = useCallback(\n (id: string, el: HTMLButtonElement | null) => {\n if (el) nodeMap.current.set(id, el);\n else nodeMap.current.delete(id);\n },\n [],\n );\n\n // Memoise the context value so child chips don't see a new `group`\n // reference on every render — otherwise their register/unregister\n // effect re-runs each render, driving setOrder in the parent and\n // producing an infinite render loop.\n const ctxValue = useMemo(\n () => ({ register, unregister, focusedId, setFocus, onArrowMove, isRTL }),\n [register, unregister, focusedId, setFocus, onArrowMove, isRTL],\n );\n\n return (\n <ChipGroupCtxNodeContext.Provider value={registerNode}>\n <ChipGroupCtx.Provider value={ctxValue}>\n <div\n ref={ref}\n role=\"group\"\n aria-label={label ?? t('chat.suggestions')}\n className={[\n 'ds:flex ds:flex-wrap ds:items-center',\n 'ds:gap-y-[var(--spacing-xs)] ds:gap-x-[var(--spacing-sm)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </div>\n </ChipGroupCtx.Provider>\n </ChipGroupCtxNodeContext.Provider>\n );\n },\n);\n\nSuggestionChipGroup.displayName = 'SuggestionChipGroup';\n\n// Separate context to register the DOM node from the chip without tripping\n// eslint `react-hooks/exhaustive-deps`.\nconst ChipGroupCtxNodeContext = createContext<\n ((id: string, el: HTMLButtonElement | null) => void) | null\n>(null);\n\n/* ------------------------------------------------------------------ */\n/* SuggestionChip */\n/* ------------------------------------------------------------------ */\n\ntype NativeButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'onSelect' | 'children'\n>;\n\nexport interface SuggestionChipProps\n extends NativeButtonProps,\n VariantProps<typeof chipVariants> {\n /** Value emitted on activation. Falls back to children when a string. */\n value?: string;\n startIcon?: ReactNode;\n children: ReactNode;\n /** Activation handler. */\n onSelect?: (value: string) => void;\n /** When provided, parent owns removal. Otherwise the chip manages its own\n * `removed` state and unmounts after selection. */\n onRemove?: () => void;\n /** Opt out of self-removal — useful inside controlled lists. */\n keepOnSelect?: boolean;\n}\n\nexport const SuggestionChip = forwardRef<HTMLButtonElement, SuggestionChipProps>(\n (\n {\n intent = 'default',\n size = 'md',\n value,\n startIcon,\n children,\n onSelect,\n onRemove,\n keepOnSelect = false,\n className,\n disabled,\n onKeyDown,\n onFocus,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const id = useId();\n const group = useContext(ChipGroupCtx);\n const registerNode = useContext(ChipGroupCtxNodeContext);\n const [removed, setRemoved] = useState(false);\n const localRef = useRef<HTMLButtonElement | null>(null);\n\n const setRef = (node: HTMLButtonElement | null) => {\n localRef.current = node;\n registerNode?.(id, node);\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n };\n\n // Keep register/unregister in a ref so the effect runs only on\n // mount / unmount. Depending on `group` directly would re-fire the\n // effect on every parent render (focusedId changes invalidate the\n // group context value), which in turn mutates the parent's `order`\n // state and loops.\n const groupRef = useRef(group);\n groupRef.current = group;\n\n useEffect(() => {\n const g = groupRef.current;\n if (!g) return;\n g.register(id);\n return () => g.unregister(id);\n }, [id]);\n\n if (removed) return null;\n\n const isFocused = group ? group.focusedId === id : true;\n const tabIndex = group ? (isFocused ? 0 : -1) : 0;\n\n const handleClick: NonNullable<NativeButtonProps['onClick']> = (e) => {\n onClick?.(e);\n const resolvedValue =\n typeof value === 'string'\n ? value\n : typeof children === 'string'\n ? children\n : '';\n onSelect?.(resolvedValue);\n if (onRemove) onRemove();\n else if (!keepOnSelect) setRemoved(true);\n };\n\n const handleKeyDown: NonNullable<NativeButtonProps['onKeyDown']> = (e) => {\n onKeyDown?.(e);\n if (!group) return;\n // Arrow navigation inside a group — RTL inverts Left/Right.\n const nextKey = group.isRTL ? 'ArrowLeft' : 'ArrowRight';\n const prevKey = group.isRTL ? 'ArrowRight' : 'ArrowLeft';\n if (e.key === nextKey || e.key === 'ArrowDown') {\n e.preventDefault();\n group.onArrowMove(id, 'next');\n } else if (e.key === prevKey || e.key === 'ArrowUp') {\n e.preventDefault();\n group.onArrowMove(id, 'prev');\n } else if (e.key === 'Home') {\n e.preventDefault();\n group.onArrowMove(id, 'first');\n } else if (e.key === 'End') {\n e.preventDefault();\n group.onArrowMove(id, 'last');\n }\n };\n\n const handleFocus: NonNullable<NativeButtonProps['onFocus']> = (e) => {\n onFocus?.(e);\n if (group && !isFocused) group.setFocus(id);\n };\n\n return (\n <button\n ref={setRef}\n type=\"button\"\n tabIndex={tabIndex}\n disabled={disabled}\n onClick={disabled ? undefined : handleClick}\n onKeyDown={handleKeyDown as unknown as (e: KeyboardEvent<HTMLButtonElement>) => void}\n onFocus={handleFocus}\n data-component=\"suggestion-chip\"\n className={chipVariants({ intent, size, className })}\n {...rest}\n >\n {startIcon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:me-[var(--spacing-xs)] ds:inline-flex ds:items-center ds:[&>svg]:size-4\"\n >\n {startIcon}\n </span>\n ) : null}\n <span>{children}</span>\n </button>\n );\n },\n);\n\nSuggestionChip.displayName = 'SuggestionChip';\n"],"names":["chipVariants","cva","ChipGroupCtx","createContext","SuggestionChipGroup","forwardRef","label","className","children","rest","ref","t","i18n","useTranslation","isRTL","order","setOrder","useState","focusedId","setFocusedId","nodeMap","useRef","register","useCallback","id","prev","unregister","x","setFocus","useEffect","onArrowMove","direction","idx","next","nextId","el","registerNode","ctxValue","useMemo","jsx","ChipGroupCtxNodeContext","SuggestionChip","intent","size","value","startIcon","onSelect","onRemove","keepOnSelect","disabled","onKeyDown","onFocus","onClick","useId","group","useContext","removed","setRemoved","localRef","setRef","node","groupRef","g","isFocused","jsxs","resolvedValue","nextKey","prevKey"],"mappings":";;;;AAsBA,MAAMA,IAAeC;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAME;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,SACE;AAAA,QACF,YACE;AAAA,QACF,UACE;AAAA,MAAA;AAAA;AAAA;AAAA,MAIJ,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB,EAAE,QAAQ,WAAW,MAAM,KAAA;AAAA,EAAK;AAErD,GAkBMC,IAAeC,EAAwC,IAAI,GAYpDC,IAAsBC;AAAA,EACjC,CAAC,EAAE,OAAAC,GAAO,WAAAC,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAAQC,MAAQ;AAChD,UAAM,EAAE,GAAAC,GAAG,MAAAC,EAAA,IAASC,EAAA,GACdC,IAAQF,EAAK,IAAA,MAAU,OACvB,CAACG,GAAOC,CAAQ,IAAIC,EAAmB,CAAA,CAAE,GACzC,CAACC,GAAWC,CAAY,IAAIF,EAAwB,IAAI,GACxDG,IAAUC,EAAuC,oBAAI,KAAK,GAE1DC,IAAWC,EAAY,CAACC,MAAe;AAC3C,MAAAR,EAAS,CAACS,MAAUA,EAAK,SAASD,CAAE,IAAIC,IAAO,CAAC,GAAGA,GAAMD,CAAE,CAAE;AAAA,IAC/D,GAAG,CAAA,CAAE,GACCE,IAAaH,EAAY,CAACC,MAAe;AAC7C,MAAAR,EAAS,CAACS,MAASA,EAAK,OAAO,CAACE,MAAMA,MAAMH,CAAE,CAAC,GAC/CJ,EAAQ,QAAQ,OAAOI,CAAE;AAAA,IAC3B,GAAG,CAAA,CAAE,GAECI,IAAWL,EAAY,CAACC,MAAeL,EAAaK,CAAE,GAAG,EAAE;AAEjE,IAAAK,EAAU,MAAM;AAEd,MAAI,CAACX,KAAaH,EAAM,SAAS,KAAGI,EAAaJ,EAAM,CAAC,CAAC,GACrDG,KAAa,CAACH,EAAM,SAASG,CAAS,KACxCC,EAAaJ,EAAM,CAAC,KAAK,IAAI;AAAA,IAEjC,GAAG,CAACG,GAAWH,CAAK,CAAC;AAErB,UAAMe,IAAgDP;AAAA,MACpD,CAACC,GAAIO,MAAc;AACjB,cAAMC,IAAMjB,EAAM,QAAQS,CAAE;AAC5B,YAAIQ,MAAQ,GAAI;AAChB,YAAIC,IAAOD;AACX,QAAID,MAAc,WAAQE,KAAQD,IAAM,KAAKjB,EAAM,SAC/CgB,MAAc,WAAQE,KAAQD,IAAM,IAAIjB,EAAM,UAAUA,EAAM,SAC9DgB,MAAc,YAASE,IAAO,IAC9BF,MAAc,WAAQE,IAAOlB,EAAM,SAAS;AAChD,cAAMmB,IAASnB,EAAMkB,CAAI;AACzB,QAAAd,EAAae,CAAM;AACnB,cAAMC,IAAKf,EAAQ,QAAQ,IAAIc,CAAM;AACrC,QAAAC,KAAA,QAAAA,EAAI;AAAA,MACN;AAAA,MACA,CAACpB,CAAK;AAAA,IAAA,GAMFqB,IAAeb;AAAA,MACnB,CAACC,GAAYW,MAAiC;AAC5C,QAAIA,IAAIf,EAAQ,QAAQ,IAAII,GAAIW,CAAE,IAC7Bf,EAAQ,QAAQ,OAAOI,CAAE;AAAA,MAChC;AAAA,MACA,CAAA;AAAA,IAAC,GAOGa,IAAWC;AAAA,MACf,OAAO,EAAE,UAAAhB,GAAU,YAAAI,GAAY,WAAAR,GAAW,UAAAU,GAAU,aAAAE,GAAa,OAAAhB;MACjE,CAACQ,GAAUI,GAAYR,GAAWU,GAAUE,GAAahB,CAAK;AAAA,IAAA;AAGhE,WACE,gBAAAyB,EAACC,EAAwB,UAAxB,EAAiC,OAAOJ,GACvC,UAAA,gBAAAG,EAACrC,EAAa,UAAb,EAAsB,OAAOmC,GAC5B,UAAA,gBAAAE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAA7B;AAAA,QACA,MAAK;AAAA,QACL,cAAYJ,KAASK,EAAE,kBAAkB;AAAA,QACzC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACAJ;AAAA,QAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGE;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA,GAEL,EAAA,CACF;AAAA,EAEJ;AACF;AAEAJ,EAAoB,cAAc;AAIlC,MAAMoC,IAA0BrC,EAE9B,IAAI,GA2BOsC,IAAiBpC;AAAA,EAC5B,CACE;AAAA,IACE,QAAAqC,IAAS;AAAA,IACT,MAAAC,IAAO;AAAA,IACP,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,UAAArC;AAAA,IACA,UAAAsC;AAAA,IACA,UAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,WAAAzC;AAAA,IACA,UAAA0C;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,GAAG3C;AAAA,EAAA,GAELC,MACG;AACH,UAAMc,IAAK6B,EAAA,GACLC,IAAQC,EAAWrD,CAAY,GAC/BkC,IAAemB,EAAWf,CAAuB,GACjD,CAACgB,GAASC,CAAU,IAAIxC,EAAS,EAAK,GACtCyC,IAAWrC,EAAiC,IAAI,GAEhDsC,IAAS,CAACC,MAAmC;AACjD,MAAAF,EAAS,UAAUE,GACnBxB,KAAA,QAAAA,EAAeZ,GAAIoC,IACf,OAAOlD,KAAQ,aAAYA,EAAIkD,CAAI,IAC9BlD,QAAS,UAAUkD;AAAA,IAC9B,GAOMC,IAAWxC,EAAOiC,CAAK;AAU7B,QATAO,EAAS,UAAUP,GAEnBzB,EAAU,MAAM;AACd,YAAMiC,IAAID,EAAS;AACnB,UAAKC;AACL,eAAAA,EAAE,SAAStC,CAAE,GACN,MAAMsC,EAAE,WAAWtC,CAAE;AAAA,IAC9B,GAAG,CAACA,CAAE,CAAC,GAEHgC,EAAS,QAAO;AAEpB,UAAMO,IAAYT,IAAQA,EAAM,cAAc9B,IAAK;AA0CnD,WACE,gBAAAwC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKL;AAAA,QACL,MAAK;AAAA,QACL,UA7CaL,IAASS,IAAY,IAAI,KAAM;AAAA,QA8C5C,UAAAd;AAAA,QACA,SAASA,IAAW,SA7CuC,CAAC,MAAM;AACpE,UAAAG,KAAA,QAAAA,EAAU;AACV,gBAAMa,IACJ,OAAOrB,KAAU,WACbA,IACA,OAAOpC,KAAa,WAClBA,IACA;AACR,UAAAsC,KAAA,QAAAA,EAAWmB,IACPlB,IAAUA,EAAA,IACJC,KAAcS,EAAW,EAAI;AAAA,QACzC;AAAA,QAmCI,WAjC+D,CAAC,MAAM;AAExE,cADAP,KAAA,QAAAA,EAAY,IACR,CAACI,EAAO;AAEZ,gBAAMY,IAAUZ,EAAM,QAAQ,cAAc,cACtCa,IAAUb,EAAM,QAAQ,eAAe;AAC7C,UAAI,EAAE,QAAQY,KAAW,EAAE,QAAQ,eACjC,EAAE,eAAA,GACFZ,EAAM,YAAY9B,GAAI,MAAM,KACnB,EAAE,QAAQ2C,KAAW,EAAE,QAAQ,aACxC,EAAE,eAAA,GACFb,EAAM,YAAY9B,GAAI,MAAM,KACnB,EAAE,QAAQ,UACnB,EAAE,eAAA,GACF8B,EAAM,YAAY9B,GAAI,OAAO,KACpB,EAAE,QAAQ,UACnB,EAAE,eAAA,GACF8B,EAAM,YAAY9B,GAAI,MAAM;AAAA,QAEhC;AAAA,QAeI,SAb2D,CAAC,MAAM;AACpE,UAAA2B,KAAA,QAAAA,EAAU,IACNG,KAAS,CAACS,KAAWT,EAAM,SAAS9B,CAAE;AAAA,QAC5C;AAAA,QAWI,kBAAe;AAAA,QACf,WAAWxB,EAAa,EAAE,QAAA0C,GAAQ,MAAAC,GAAM,WAAApC,GAAW;AAAA,QAClD,GAAGE;AAAA,QAEH,UAAA;AAAA,UAAAoC,IACC,gBAAAN;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cAET,UAAAM;AAAA,YAAA;AAAA,UAAA,IAED;AAAA,UACJ,gBAAAN,EAAC,UAAM,UAAA/B,EAAA,CAAS;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AACF;AAEAiC,EAAe,cAAc;"}
@@ -99,6 +99,7 @@ const D = i(
99
99
  "aria-describedby": j,
100
100
  "aria-invalid": s.invalid || void 0,
101
101
  "aria-required": s.required || void 0,
102
+ "data-component": "switch",
102
103
  className: D({ size: a, className: g }),
103
104
  ...y,
104
105
  children: /* @__PURE__ */ e(h.Thumb, { className: _({ size: a }), children: n ? /* @__PURE__ */ e(
@@ -134,4 +135,4 @@ G.displayName = "Switch";
134
135
  export {
135
136
  G as S
136
137
  };
137
- //# sourceMappingURL=switch-DtLPKO0p.js.map
138
+ //# sourceMappingURL=switch-DhSORO9C.js.map