@alfadocs/ui-kit 0.1.4 → 0.1.6

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 (275) hide show
  1. package/README.md +26 -0
  2. package/dist/_chunks/{agenda-card-C_hQGErS.js → agenda-card-DIWDvWum.js} +10 -10
  3. package/dist/_chunks/agenda-card-DIWDvWum.js.map +1 -0
  4. package/dist/_chunks/{agenda-tray-CBaVMJLO.js → agenda-tray-BqQZwiHc.js} +5 -5
  5. package/dist/_chunks/{agenda-tray-CBaVMJLO.js.map → agenda-tray-BqQZwiHc.js.map} +1 -1
  6. package/dist/_chunks/{ai-prompt-input-K94oVLG2.js → ai-prompt-input-CI27KmZ1.js} +4 -4
  7. package/dist/_chunks/ai-prompt-input-CI27KmZ1.js.map +1 -0
  8. package/dist/_chunks/{alert-rOM4EG0P.js → alert-BlOUMkXj.js} +39 -39
  9. package/dist/_chunks/alert-BlOUMkXj.js.map +1 -0
  10. package/dist/_chunks/{audio-recorder-Cn8z2zC9.js → audio-recorder-B-8SKgKn.js} +5 -5
  11. package/dist/_chunks/{audio-recorder-Cn8z2zC9.js.map → audio-recorder-B-8SKgKn.js.map} +1 -1
  12. package/dist/_chunks/{autocomplete.agent-DRrp-Rsx.js → autocomplete.agent-DqOy0_1P.js} +31 -31
  13. package/dist/_chunks/autocomplete.agent-DqOy0_1P.js.map +1 -0
  14. package/dist/_chunks/{avatar-Biffh-_H.js → avatar-Dcr6XuDQ.js} +19 -19
  15. package/dist/_chunks/avatar-Dcr6XuDQ.js.map +1 -0
  16. package/dist/_chunks/{balance-cell-renderer-CiyezQhi.js → balance-cell-renderer-BRWt3neo.js} +166 -166
  17. package/dist/_chunks/balance-cell-renderer-BRWt3neo.js.map +1 -0
  18. package/dist/_chunks/breadcrumb-D6xpsP7n.js +293 -0
  19. package/dist/_chunks/breadcrumb-D6xpsP7n.js.map +1 -0
  20. package/dist/_chunks/{button-7dTew-IV.js → button-7mLWcMp_.js} +9 -9
  21. package/dist/_chunks/{button-7dTew-IV.js.map → button-7mLWcMp_.js.map} +1 -1
  22. package/dist/_chunks/{calendar-BkDeDTaX.js → calendar-nGEgelJs.js} +100 -100
  23. package/dist/_chunks/calendar-nGEgelJs.js.map +1 -0
  24. package/dist/_chunks/{chat-input-xiBIujMv.js → chat-input-DsIrWM4f.js} +2 -2
  25. package/dist/_chunks/{chat-input-xiBIujMv.js.map → chat-input-DsIrWM4f.js.map} +1 -1
  26. package/dist/_chunks/{chat-message-BtxUyugB.js → chat-message-ByouZpPP.js} +3 -3
  27. package/dist/_chunks/{chat-message-BtxUyugB.js.map → chat-message-ByouZpPP.js.map} +1 -1
  28. package/dist/_chunks/{checkbox-Ni6C_KJg.js → checkbox-DNK4qS2_.js} +13 -13
  29. package/dist/_chunks/checkbox-DNK4qS2_.js.map +1 -0
  30. package/dist/_chunks/{checkbox-group-BFZ4oN5t.js → checkbox-group-CWpGZEF6.js} +13 -13
  31. package/dist/_chunks/checkbox-group-CWpGZEF6.js.map +1 -0
  32. package/dist/_chunks/{collapsible-fFMqzpdL.js → collapsible-D4LOdLxp.js} +18 -18
  33. package/dist/_chunks/collapsible-D4LOdLxp.js.map +1 -0
  34. package/dist/_chunks/{color-picker-Cl3KdjJd.js → color-picker-e9PmpaGH.js} +161 -161
  35. package/dist/_chunks/color-picker-e9PmpaGH.js.map +1 -0
  36. package/dist/_chunks/{combobox.agent-DjdivI3X.js → combobox.agent-ByobCLJ_.js} +28 -28
  37. package/dist/_chunks/combobox.agent-ByobCLJ_.js.map +1 -0
  38. package/dist/_chunks/{command-palette.agent-BUjzr2ET.js → command-palette.agent-js2rxgeR.js} +117 -117
  39. package/dist/_chunks/command-palette.agent-js2rxgeR.js.map +1 -0
  40. package/dist/_chunks/{description-list-C_1NX8P3.js → description-list-DvJbp6Yg.js} +2 -2
  41. package/dist/_chunks/{description-list-C_1NX8P3.js.map → description-list-DvJbp6Yg.js.map} +1 -1
  42. package/dist/_chunks/{dialog.agent-C2lP9H0h.js → dialog.agent-DEG_fVzG.js} +42 -42
  43. package/dist/_chunks/dialog.agent-DEG_fVzG.js.map +1 -0
  44. package/dist/_chunks/{dropdown-menu-2HgU1Emf.js → dropdown-menu-JNo66A-j.js} +2 -2
  45. package/dist/_chunks/dropdown-menu-JNo66A-j.js.map +1 -0
  46. package/dist/_chunks/{empty-state-BHrItOiE.js → empty-state-DQPtRp2b.js} +2 -2
  47. package/dist/_chunks/{empty-state-BHrItOiE.js.map → empty-state-DQPtRp2b.js.map} +1 -1
  48. package/dist/_chunks/{file-upload.agent-LlC0W468.js → file-upload.agent-B9AN82LA.js} +2 -2
  49. package/dist/_chunks/{file-upload.agent-LlC0W468.js.map → file-upload.agent-B9AN82LA.js.map} +1 -1
  50. package/dist/_chunks/{freemium-paywall-Dr9aOtOC.js → freemium-paywall-CkefGLM_.js} +4 -4
  51. package/dist/_chunks/{freemium-paywall-Dr9aOtOC.js.map → freemium-paywall-CkefGLM_.js.map} +1 -1
  52. package/dist/_chunks/{header-BpU9U-1X.js → header-BGn1mRp8.js} +2 -2
  53. package/dist/_chunks/{header-BpU9U-1X.js.map → header-BGn1mRp8.js.map} +1 -1
  54. package/dist/_chunks/{icon-button-CNjWCD1X.js → icon-button-Wnnde5lc.js} +6 -6
  55. package/dist/_chunks/icon-button-Wnnde5lc.js.map +1 -0
  56. package/dist/_chunks/input-surface-u4QB0lxe.js +32 -0
  57. package/dist/_chunks/input-surface-u4QB0lxe.js.map +1 -0
  58. package/dist/_chunks/{key-value-pair-C9hpjC_B.js → key-value-pair-JRFS9Xrh.js} +10 -10
  59. package/dist/_chunks/key-value-pair-JRFS9Xrh.js.map +1 -0
  60. package/dist/_chunks/{leo-sidebar-CNjZqljo.js → leo-sidebar-Bh3dPDTQ.js} +64 -64
  61. package/dist/_chunks/leo-sidebar-Bh3dPDTQ.js.map +1 -0
  62. package/dist/_chunks/{message-card-CZzNO4ov.js → message-card-qAp2-WQK.js} +12 -12
  63. package/dist/_chunks/message-card-qAp2-WQK.js.map +1 -0
  64. package/dist/_chunks/{message-tray-BWbjXW3F.js → message-tray-VaLpQU5t.js} +5 -5
  65. package/dist/_chunks/{message-tray-BWbjXW3F.js.map → message-tray-VaLpQU5t.js.map} +1 -1
  66. package/dist/_chunks/{multi-select.agent-BSGEW10d.js → multi-select.agent-CNsyW3n9.js} +66 -66
  67. package/dist/_chunks/multi-select.agent-CNsyW3n9.js.map +1 -0
  68. package/dist/_chunks/navigation-menu-EVFau1O2.js +180 -0
  69. package/dist/_chunks/navigation-menu-EVFau1O2.js.map +1 -0
  70. package/dist/_chunks/{notification-card-DgW-vVg-.js → notification-card-BF2_veHy.js} +11 -11
  71. package/dist/_chunks/notification-card-BF2_veHy.js.map +1 -0
  72. package/dist/_chunks/{notification-tray-CKUgl2jc.js → notification-tray-Bq-08ReD.js} +5 -5
  73. package/dist/_chunks/{notification-tray-CKUgl2jc.js.map → notification-tray-Bq-08ReD.js.map} +1 -1
  74. package/dist/_chunks/{number-input-BPPhekLu.js → number-input-DjpT_RXJ.js} +46 -46
  75. package/dist/_chunks/number-input-DjpT_RXJ.js.map +1 -0
  76. package/dist/_chunks/pagination.agent-oEaqmtx5.js +380 -0
  77. package/dist/_chunks/pagination.agent-oEaqmtx5.js.map +1 -0
  78. package/dist/_chunks/{password-input-DAT5HQth.js → password-input-DJDVznWH.js} +5 -5
  79. package/dist/_chunks/password-input-DJDVznWH.js.map +1 -0
  80. package/dist/_chunks/{patient-shell-BzHhg6uA.js → patient-shell-DP54y6rc.js} +5 -5
  81. package/dist/_chunks/{patient-shell-BzHhg6uA.js.map → patient-shell-DP54y6rc.js.map} +1 -1
  82. package/dist/_chunks/{payment-form-YlxrCpZQ.js → payment-form-hcl-gGrp.js} +2 -2
  83. package/dist/_chunks/{payment-form-YlxrCpZQ.js.map → payment-form-hcl-gGrp.js.map} +1 -1
  84. package/dist/_chunks/{pdf-viewer.agent-sMned5Xn.js → pdf-viewer.agent-CfIHhcHx.js} +3 -3
  85. package/dist/_chunks/{pdf-viewer.agent-sMned5Xn.js.map → pdf-viewer.agent-CfIHhcHx.js.map} +1 -1
  86. package/dist/_chunks/{phone-input-BuRe5PyI.js → phone-input-DE_39q65.js} +103 -103
  87. package/dist/_chunks/phone-input-DE_39q65.js.map +1 -0
  88. package/dist/_chunks/{popover-Ds1iOdiv.js → popover-DvAtFOi-.js} +2 -2
  89. package/dist/_chunks/{popover-Ds1iOdiv.js.map → popover-DvAtFOi-.js.map} +1 -1
  90. package/dist/_chunks/{privacy-lock-up2ervfF.js → privacy-lock-DS6QRo2N.js} +3 -3
  91. package/dist/_chunks/{privacy-lock-up2ervfF.js.map → privacy-lock-DS6QRo2N.js.map} +1 -1
  92. package/dist/_chunks/{progress-D4ELgHG3.js → progress-B4Of_pzz.js} +57 -57
  93. package/dist/_chunks/progress-B4Of_pzz.js.map +1 -0
  94. package/dist/_chunks/{radio-XSSNX3Af.js → radio-cs8N1wJi.js} +29 -29
  95. package/dist/_chunks/radio-cs8N1wJi.js.map +1 -0
  96. package/dist/_chunks/{radio-group-DBrUOPcy.js → radio-group-BIUbpWml.js} +3 -3
  97. package/dist/_chunks/radio-group-BIUbpWml.js.map +1 -0
  98. package/dist/_chunks/{scroll-area-HIq0hJyJ.js → scroll-area-DLr5w9Dd.js} +9 -9
  99. package/dist/_chunks/scroll-area-DLr5w9Dd.js.map +1 -0
  100. package/dist/_chunks/{search-bar-9Zbew4yM.js → search-bar-fcGqDFW3.js} +30 -30
  101. package/dist/_chunks/{search-bar-9Zbew4yM.js.map → search-bar-fcGqDFW3.js.map} +1 -1
  102. package/dist/_chunks/{search-input-CtkWITO2.js → search-input-BVMCONyN.js} +2 -2
  103. package/dist/_chunks/{search-input-CtkWITO2.js.map → search-input-BVMCONyN.js.map} +1 -1
  104. package/dist/_chunks/{select-DdAOtomN.js → select-IY_JQa-F.js} +50 -50
  105. package/dist/_chunks/select-IY_JQa-F.js.map +1 -0
  106. package/dist/_chunks/{sheet-D7GRhnWw.js → sheet-BhNpLHc9.js} +8 -8
  107. package/dist/_chunks/sheet-BhNpLHc9.js.map +1 -0
  108. package/dist/_chunks/{sidebar-Dc2ffrbf.js → sidebar-OVzwN3jE.js} +294 -294
  109. package/dist/_chunks/sidebar-OVzwN3jE.js.map +1 -0
  110. package/dist/_chunks/{sign-in-with-alfadocs-button-BotwPDcW.js → sign-in-with-alfadocs-button-BN_FPGHT.js} +2 -2
  111. package/dist/_chunks/{sign-in-with-alfadocs-button-BotwPDcW.js.map → sign-in-with-alfadocs-button-BN_FPGHT.js.map} +1 -1
  112. package/dist/_chunks/{skeleton-DAdPFx9d.js → skeleton-dtqyF09N.js} +8 -8
  113. package/dist/_chunks/skeleton-dtqyF09N.js.map +1 -0
  114. package/dist/_chunks/{slot-grid-WHc5A8-z.js → slot-grid-D_l5VsHG.js} +5 -5
  115. package/dist/_chunks/{slot-grid-WHc5A8-z.js.map → slot-grid-D_l5VsHG.js.map} +1 -1
  116. package/dist/_chunks/{stepper-accordion-2_7Pw0tC.js → stepper-accordion-CGog0JSF.js} +64 -64
  117. package/dist/_chunks/stepper-accordion-CGog0JSF.js.map +1 -0
  118. package/dist/_chunks/{stepper-calendar-CWZcFgt_.js → stepper-calendar-_fLOAjus.js} +7 -7
  119. package/dist/_chunks/{stepper-calendar-CWZcFgt_.js.map → stepper-calendar-_fLOAjus.js.map} +1 -1
  120. package/dist/_chunks/{switch-DhSORO9C.js → switch-aN2EYxHh.js} +4 -4
  121. package/dist/_chunks/switch-aN2EYxHh.js.map +1 -0
  122. package/dist/_chunks/{tabs.agent-BtaNGxRh.js → tabs.agent-BpbVA-Zh.js} +55 -55
  123. package/dist/_chunks/tabs.agent-BpbVA-Zh.js.map +1 -0
  124. package/dist/_chunks/{tag--uLKOb9f.js → tag-BqidXKo3.js} +2 -2
  125. package/dist/_chunks/tag-BqidXKo3.js.map +1 -0
  126. package/dist/_chunks/{task-card-BeSuntXP.js → task-card-yW7tKlG4.js} +17 -17
  127. package/dist/_chunks/task-card-yW7tKlG4.js.map +1 -0
  128. package/dist/_chunks/{task-tray-pRk6u8Ik.js → task-tray-BzahI5FQ.js} +5 -5
  129. package/dist/_chunks/{task-tray-pRk6u8Ik.js.map → task-tray-BzahI5FQ.js.map} +1 -1
  130. package/dist/_chunks/{text-area-xf9-6iDf.js → text-area-DmKSd2DG.js} +2 -2
  131. package/dist/_chunks/text-area-DmKSd2DG.js.map +1 -0
  132. package/dist/_chunks/{text-input-exh7VD7D.js → text-input-CRHvl5zk.js} +19 -19
  133. package/dist/_chunks/text-input-CRHvl5zk.js.map +1 -0
  134. package/dist/_chunks/{theme-toggle-CJgA6G24.js → theme-toggle-COHFwO2H.js} +4 -4
  135. package/dist/_chunks/{theme-toggle-CJgA6G24.js.map → theme-toggle-COHFwO2H.js.map} +1 -1
  136. package/dist/_chunks/{timeline-DIueH4TJ.js → timeline-RgAIzpMd.js} +2 -2
  137. package/dist/_chunks/{timeline-DIueH4TJ.js.map → timeline-RgAIzpMd.js.map} +1 -1
  138. package/dist/_chunks/{toast-q0SlabGr.js → toast-lOhJDKOH.js} +12 -12
  139. package/dist/_chunks/{toast-q0SlabGr.js.map → toast-lOhJDKOH.js.map} +1 -1
  140. package/dist/_chunks/{transcript-panel-DFnhbrlQ.js → transcript-panel-CNbVGG9L.js} +59 -59
  141. package/dist/_chunks/transcript-panel-CNbVGG9L.js.map +1 -0
  142. package/dist/_chunks/{visually-hidden-BlkhaZWe.js → visually-hidden-Bw7vBHLm.js} +6 -6
  143. package/dist/_chunks/{visually-hidden-BlkhaZWe.js.map → visually-hidden-Bw7vBHLm.js.map} +1 -1
  144. package/dist/_chunks/{warning-stack-DCmO0R07.js → warning-stack-8Pa3pekh.js} +24 -24
  145. package/dist/_chunks/warning-stack-8Pa3pekh.js.map +1 -0
  146. package/dist/_chunks/{workflow-map-CAM6Uy_J.js → workflow-map-DGJwVcO-.js} +106 -106
  147. package/dist/_chunks/workflow-map-DGJwVcO-.js.map +1 -0
  148. package/dist/agent-catalog.json +1 -1
  149. package/dist/components/_shared/input-surface.d.ts +11 -11
  150. package/dist/components/agenda-card/index.js +1 -1
  151. package/dist/components/agenda-tray/index.js +1 -1
  152. package/dist/components/ai-prompt-input/index.js +1 -1
  153. package/dist/components/alert/index.js +1 -1
  154. package/dist/components/audio-recorder/index.js +1 -1
  155. package/dist/components/autocomplete/index.js +1 -1
  156. package/dist/components/avatar/index.js +1 -1
  157. package/dist/components/breadcrumb/index.js +1 -1
  158. package/dist/components/button/index.js +2 -2
  159. package/dist/components/calendar/index.js +1 -1
  160. package/dist/components/chat-input/index.js +1 -1
  161. package/dist/components/chat-message/index.js +1 -1
  162. package/dist/components/checkbox/index.js +1 -1
  163. package/dist/components/checkbox-group/index.js +1 -1
  164. package/dist/components/collapsible/index.js +1 -1
  165. package/dist/components/color-picker/index.js +1 -1
  166. package/dist/components/combobox/index.js +1 -1
  167. package/dist/components/command-palette/index.js +1 -1
  168. package/dist/components/data-table/index.js +1 -1
  169. package/dist/components/description-list/index.js +1 -1
  170. package/dist/components/dialog/index.js +1 -1
  171. package/dist/components/dropdown-menu/index.js +1 -1
  172. package/dist/components/empty-state/index.js +1 -1
  173. package/dist/components/file-upload/index.js +1 -1
  174. package/dist/components/freemium-paywall/index.js +1 -1
  175. package/dist/components/header/index.js +1 -1
  176. package/dist/components/icon-button/index.js +1 -1
  177. package/dist/components/key-value-pair/index.js +1 -1
  178. package/dist/components/message-card/index.js +1 -1
  179. package/dist/components/message-tray/index.js +1 -1
  180. package/dist/components/multi-select/index.js +1 -1
  181. package/dist/components/navigation-menu/index.js +1 -1
  182. package/dist/components/notification-card/index.js +1 -1
  183. package/dist/components/notification-tray/index.js +1 -1
  184. package/dist/components/number-input/index.js +1 -1
  185. package/dist/components/pagination/index.js +1 -1
  186. package/dist/components/password-input/index.js +1 -1
  187. package/dist/components/payment-form/index.js +1 -1
  188. package/dist/components/pdf-viewer/index.js +1 -1
  189. package/dist/components/phone-input/index.js +1 -1
  190. package/dist/components/popover/index.js +1 -1
  191. package/dist/components/privacy-lock/index.js +1 -1
  192. package/dist/components/progress/index.js +1 -1
  193. package/dist/components/radio/index.js +1 -1
  194. package/dist/components/radio-group/index.js +2 -2
  195. package/dist/components/scroll-area/index.js +1 -1
  196. package/dist/components/search-bar/index.js +1 -1
  197. package/dist/components/search-input/index.js +1 -1
  198. package/dist/components/select/index.js +1 -1
  199. package/dist/components/sheet/index.js +1 -1
  200. package/dist/components/sidebar/index.js +1 -1
  201. package/dist/components/sign-in-with-alfadocs-button/index.js +1 -1
  202. package/dist/components/skeleton/index.js +1 -1
  203. package/dist/components/slot-grid/index.js +1 -1
  204. package/dist/components/stepper-accordion/index.js +1 -1
  205. package/dist/components/stepper-calendar/index.js +1 -1
  206. package/dist/components/switch/index.js +1 -1
  207. package/dist/components/tabs/index.js +1 -1
  208. package/dist/components/tag/index.js +1 -1
  209. package/dist/components/task-card/index.js +1 -1
  210. package/dist/components/task-tray/index.js +1 -1
  211. package/dist/components/text-area/index.js +1 -1
  212. package/dist/components/text-input/index.js +1 -1
  213. package/dist/components/theme-toggle/index.js +1 -1
  214. package/dist/components/timeline/index.js +1 -1
  215. package/dist/components/toast/index.js +1 -1
  216. package/dist/components/transcript-panel/index.js +1 -1
  217. package/dist/components/visually-hidden/index.js +1 -1
  218. package/dist/components/warning-stack/index.js +1 -1
  219. package/dist/components/workflow/index.js +1 -1
  220. package/dist/index.js +72 -72
  221. package/dist/patterns/leo-assistant/index.js +1 -1
  222. package/dist/patterns/leo-assistant/leo-sidebar.d.ts.map +1 -1
  223. package/dist/patterns/patient-shell/index.js +1 -1
  224. package/dist/tokens.css +1 -1
  225. package/package.json +1 -1
  226. package/dist/_chunks/agenda-card-C_hQGErS.js.map +0 -1
  227. package/dist/_chunks/ai-prompt-input-K94oVLG2.js.map +0 -1
  228. package/dist/_chunks/alert-rOM4EG0P.js.map +0 -1
  229. package/dist/_chunks/autocomplete.agent-DRrp-Rsx.js.map +0 -1
  230. package/dist/_chunks/avatar-Biffh-_H.js.map +0 -1
  231. package/dist/_chunks/balance-cell-renderer-CiyezQhi.js.map +0 -1
  232. package/dist/_chunks/breadcrumb-CcZovmIq.js +0 -293
  233. package/dist/_chunks/breadcrumb-CcZovmIq.js.map +0 -1
  234. package/dist/_chunks/calendar-BkDeDTaX.js.map +0 -1
  235. package/dist/_chunks/checkbox-Ni6C_KJg.js.map +0 -1
  236. package/dist/_chunks/checkbox-group-BFZ4oN5t.js.map +0 -1
  237. package/dist/_chunks/collapsible-fFMqzpdL.js.map +0 -1
  238. package/dist/_chunks/color-picker-Cl3KdjJd.js.map +0 -1
  239. package/dist/_chunks/combobox.agent-DjdivI3X.js.map +0 -1
  240. package/dist/_chunks/command-palette.agent-BUjzr2ET.js.map +0 -1
  241. package/dist/_chunks/dialog.agent-C2lP9H0h.js.map +0 -1
  242. package/dist/_chunks/dropdown-menu-2HgU1Emf.js.map +0 -1
  243. package/dist/_chunks/icon-button-CNjWCD1X.js.map +0 -1
  244. package/dist/_chunks/input-surface-D5OMCB1W.js +0 -32
  245. package/dist/_chunks/input-surface-D5OMCB1W.js.map +0 -1
  246. package/dist/_chunks/key-value-pair-C9hpjC_B.js.map +0 -1
  247. package/dist/_chunks/leo-sidebar-CNjZqljo.js.map +0 -1
  248. package/dist/_chunks/message-card-CZzNO4ov.js.map +0 -1
  249. package/dist/_chunks/multi-select.agent-BSGEW10d.js.map +0 -1
  250. package/dist/_chunks/navigation-menu-DxOMvrKM.js +0 -180
  251. package/dist/_chunks/navigation-menu-DxOMvrKM.js.map +0 -1
  252. package/dist/_chunks/notification-card-DgW-vVg-.js.map +0 -1
  253. package/dist/_chunks/number-input-BPPhekLu.js.map +0 -1
  254. package/dist/_chunks/pagination.agent-CmA0Ocr5.js +0 -380
  255. package/dist/_chunks/pagination.agent-CmA0Ocr5.js.map +0 -1
  256. package/dist/_chunks/password-input-DAT5HQth.js.map +0 -1
  257. package/dist/_chunks/phone-input-BuRe5PyI.js.map +0 -1
  258. package/dist/_chunks/progress-D4ELgHG3.js.map +0 -1
  259. package/dist/_chunks/radio-XSSNX3Af.js.map +0 -1
  260. package/dist/_chunks/radio-group-DBrUOPcy.js.map +0 -1
  261. package/dist/_chunks/scroll-area-HIq0hJyJ.js.map +0 -1
  262. package/dist/_chunks/select-DdAOtomN.js.map +0 -1
  263. package/dist/_chunks/sheet-D7GRhnWw.js.map +0 -1
  264. package/dist/_chunks/sidebar-Dc2ffrbf.js.map +0 -1
  265. package/dist/_chunks/skeleton-DAdPFx9d.js.map +0 -1
  266. package/dist/_chunks/stepper-accordion-2_7Pw0tC.js.map +0 -1
  267. package/dist/_chunks/switch-DhSORO9C.js.map +0 -1
  268. package/dist/_chunks/tabs.agent-BtaNGxRh.js.map +0 -1
  269. package/dist/_chunks/tag--uLKOb9f.js.map +0 -1
  270. package/dist/_chunks/task-card-BeSuntXP.js.map +0 -1
  271. package/dist/_chunks/text-area-xf9-6iDf.js.map +0 -1
  272. package/dist/_chunks/text-input-exh7VD7D.js.map +0 -1
  273. package/dist/_chunks/transcript-panel-DFnhbrlQ.js.map +0 -1
  274. package/dist/_chunks/warning-stack-DCmO0R07.js.map +0 -1
  275. package/dist/_chunks/workflow-map-CAM6Uy_J.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress-D4ELgHG3.js","sources":["../../src/components/progress/progress.tsx"],"sourcesContent":["import {\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\n\n/* ── Public types ─────────────────────────────────────────────────────── */\n\nexport interface ProgressHandle {\n setValue: (value: number) => void;\n}\n\nexport interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {\n value?: number;\n max?: number;\n shape?: 'bar' | 'circular';\n size?: 'sm' | 'md' | 'lg';\n ariaLabel?: string;\n ariaValueText?: string;\n debouncePercent?: number;\n disabled?: boolean;\n children?: ReactNode;\n}\n\n/* ── Context ──────────────────────────────────────────────────────────── */\n\ntype ProgressContextValue = {\n labelId: string;\n isIndeterminate: boolean;\n value: number | undefined;\n max: number;\n};\n\nconst ProgressCtx = createContext<ProgressContextValue | null>(null);\n\nfunction useProgressCtx(): ProgressContextValue {\n const ctx = useContext(ProgressCtx);\n if (!ctx) throw new Error('Progress sub-components must be used within <Progress>');\n return ctx;\n}\n\n/* ── Circle geometry ──────────────────────────────────────────────────── */\n\nconst CIRCLE = {\n sm: { viewBox: '0 0 24 24', cx: 12, cy: 12, r: 10 },\n md: { viewBox: '0 0 40 40', cx: 20, cy: 20, r: 18 },\n lg: { viewBox: '0 0 56 56', cx: 28, cy: 28, r: 26 },\n} as const;\n\n/* ── CVA ──────────────────────────────────────────────────────────────── */\n\nconst barTrackVariants = cva(\n 'ds:relative ds:w-full ds:overflow-hidden ds:rounded-[var(--radius-full)] ds:bg-[var(--progress-track)]',\n {\n variants: {\n size: { sm: 'ds:h-1', md: 'ds:h-2', lg: 'ds:h-3' },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst circularVariants = cva('', {\n variants: {\n size: {\n sm: 'ds:w-6 ds:h-6',\n md: 'ds:w-10 ds:h-10',\n lg: 'ds:w-14 ds:h-14',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\n/* ── Progress.Label ───────────────────────────────────────────────────── */\n\nconst ProgressLabel = forwardRef<\n HTMLSpanElement,\n HTMLAttributes<HTMLSpanElement>\n>(({ children, className, ...props }, ref) => {\n const ctx = useProgressCtx();\n const { t, i18n } = useTranslation();\n\n const defaultText = ctx.isIndeterminate\n ? t('ui.common.loading', 'Loading...')\n : t('ui.common.progress_label', {\n percent: new Intl.NumberFormat(i18n.language, {\n style: 'percent',\n maximumFractionDigits: 0,\n }).format((ctx.value ?? 0) / ctx.max),\n });\n\n return (\n <span\n ref={ref}\n id={ctx.labelId}\n className={[\n 'type-label ds:text-foreground',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children ?? defaultText}\n </span>\n );\n});\nProgressLabel.displayName = 'Progress.Label';\n\n/* ── Progress.Value ───────────────────────────────────────────────────── */\n\nconst ProgressValue = forwardRef<\n HTMLSpanElement,\n HTMLAttributes<HTMLSpanElement>\n>(({ className, ...props }, ref) => {\n const ctx = useProgressCtx();\n const { t, i18n } = useTranslation();\n\n const text = ctx.isIndeterminate\n ? t('ui.common.loading', 'Loading...')\n : new Intl.NumberFormat(i18n.language, {\n style: 'percent',\n maximumFractionDigits: 0,\n }).format((ctx.value ?? 0) / ctx.max);\n\n return (\n <span\n ref={ref}\n className={['type-body-sm ds:tabular-nums ds:text-muted-foreground', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {text}\n </span>\n );\n});\nProgressValue.displayName = 'Progress.Value';\n\n/* ── Progress root ────────────────────────────────────────────────────── */\n\nconst ProgressRoot = forwardRef<ProgressHandle, ProgressProps>(\n (\n {\n value,\n max = 100,\n shape = 'bar',\n size = 'md',\n ariaLabel,\n ariaValueText,\n debouncePercent = 1,\n disabled = false,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const labelId = useId();\n const { t, i18n } = useTranslation();\n const barTrackRef = useRef<HTMLDivElement>(null);\n const barFillRef = useRef<HTMLDivElement>(null);\n const circTrackRef = useRef<SVGSVGElement>(null);\n const circFillRef = useRef<SVGCircleElement>(null);\n /* Separate typed refs for each shape to avoid union-type casts */\n const lastAnnouncedPercentRef = useRef<number | null>(null);\n\n const isIndeterminate = value === undefined;\n const clampedValue = isIndeterminate\n ? undefined\n : Math.min(max, Math.max(0, value));\n const targetPercent =\n clampedValue !== undefined ? (clampedValue / max) * 100 : undefined;\n\n /* ── Mount-in animation ──────────────────────────────────────────── */\n // Paint once at 0 before showing the target value, so the existing\n // transition on stroke-dashoffset / inline-size animates from empty\n // → target on mount. First render: hasMounted=false → percent=0,\n // useLayoutEffect writes 0 to the style, browser paints empty.\n // useEffect then flips hasMounted, triggering a re-render at the\n // target percent; the style write inside useLayoutEffect produces\n // the change the transition needs.\n const [hasMounted, setHasMounted] = useState(false);\n useEffect(() => {\n setHasMounted(true);\n }, []);\n const percent =\n hasMounted || isIndeterminate ? targetPercent : 0;\n\n /* ── CSS property updates (visual fill) ──────────────────────────── */\n useLayoutEffect(() => {\n if (isIndeterminate || percent === undefined) return;\n\n if (shape === 'bar') {\n barFillRef.current?.style.setProperty(\n '--progress-value',\n String(percent),\n );\n } else {\n const { r } = CIRCLE[size];\n const circumference = 2 * Math.PI * r;\n const offset = circumference * (1 - percent / 100);\n circFillRef.current?.style.setProperty(\n 'stroke-dashoffset',\n String(offset),\n );\n }\n }, [isIndeterminate, percent, shape, size]);\n\n /* ── Debounced ARIA value updates ────────────────────────────────── */\n useLayoutEffect(() => {\n const trackEl =\n shape === 'bar' ? barTrackRef.current : circTrackRef.current;\n if (!trackEl) return;\n\n if (isIndeterminate) {\n trackEl.removeAttribute('aria-valuenow');\n lastAnnouncedPercentRef.current = null;\n return;\n }\n if (clampedValue === undefined) return;\n\n const pct = (clampedValue / max) * 100;\n const last = lastAnnouncedPercentRef.current;\n const delta = last === null ? Infinity : Math.abs(pct - last);\n if (delta >= debouncePercent) {\n trackEl.setAttribute('aria-valuenow', String(clampedValue));\n lastAnnouncedPercentRef.current = pct;\n }\n }, [isIndeterminate, clampedValue, max, debouncePercent, shape]);\n\n /* ── Imperative handle for high-frequency updates ────────────────── */\n useImperativeHandle(\n ref,\n () => ({\n setValue: (v: number) => {\n const clamped = Math.min(max, Math.max(0, v));\n const pct = (clamped / max) * 100;\n\n if (shape === 'bar') {\n barFillRef.current?.style.setProperty(\n '--progress-value',\n String(pct),\n );\n } else {\n const { r } = CIRCLE[size];\n const circumference = 2 * Math.PI * r;\n const offset = circumference * (1 - pct / 100);\n circFillRef.current?.style.setProperty(\n 'stroke-dashoffset',\n String(offset),\n );\n }\n\n const trackEl =\n shape === 'bar' ? barTrackRef.current : circTrackRef.current;\n const last = lastAnnouncedPercentRef.current;\n const delta = last === null ? Infinity : Math.abs(pct - last);\n if (delta >= debouncePercent && trackEl) {\n trackEl.setAttribute('aria-valuenow', String(clamped));\n lastAnnouncedPercentRef.current = pct;\n }\n },\n }),\n [max, shape, size, debouncePercent],\n );\n\n /* ── ARIA props shared by both shapes ────────────────────────────── */\n // Provide aria-label as fallback alongside aria-labelledby: per ARIA spec,\n // AT falls back to aria-label when aria-labelledby references a missing id.\n // This covers the case where neither ariaLabel nor Progress.Label is used.\n const fallbackAriaLabel = isIndeterminate\n ? t('ui.common.loading', 'Loading...')\n : t('ui.common.progress_label', {\n percent: new Intl.NumberFormat(i18n.language, {\n style: 'percent',\n maximumFractionDigits: 0,\n }).format((clampedValue ?? 0) / max),\n });\n\n const labelProps = ariaLabel\n ? { 'aria-label': ariaLabel }\n : { 'aria-labelledby': labelId, 'aria-label': fallbackAriaLabel };\n\n const stateProps = isIndeterminate\n ? { 'aria-busy': true as const, 'aria-valuemin': 0, 'aria-valuemax': max }\n : {\n 'aria-valuemin': 0 as const,\n 'aria-valuemax': max,\n ...(ariaValueText ? { 'aria-valuetext': ariaValueText } : {}),\n };\n\n const disabledProp = disabled ? { 'aria-disabled': true as const } : {};\n\n const wrapperClass = [\n 'flex flex-col gap-[var(--spacing-xs)]',\n disabled && 'opacity-50',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const ctxValue: ProgressContextValue = {\n labelId,\n isIndeterminate,\n value: clampedValue,\n max,\n };\n\n /* ── Bar shape ──────────────────────────────────────────────────── */\n if (shape === 'bar') {\n const fillClass = isIndeterminate\n ? [\n 'absolute [inset-block:0] bg-primary rounded-[var(--radius-full)]',\n '[@media(prefers-reduced-motion:no-preference)]:animate-[progress-bar-indeterminate_1200ms_ease-in-out_infinite]',\n '[.theme-accessible_&]:animate-none',\n 'motion-reduce:animate-[progress-indeterminate-pulse_var(--animation-duration)_ease-in-out_infinite]',\n ].join(' ')\n : [\n 'absolute [inset-block:0] start-0',\n '[inline-size:calc(var(--progress-value,0)*1%)]',\n 'bg-primary rounded-[var(--radius-full)]',\n 'transition-[inline-size] duration-[var(--animation-duration)]',\n 'ease-[var(--ease-out)] motion-reduce:transition-none',\n ].join(' ');\n\n return (\n <ProgressCtx.Provider value={ctxValue}>\n <div className={wrapperClass} data-component=\"progress\" {...rest}>\n {children}\n <div\n ref={barTrackRef}\n role=\"progressbar\"\n {...labelProps}\n {...stateProps}\n {...disabledProp}\n className={barTrackVariants({ size })}\n >\n <div ref={barFillRef} className={fillClass} />\n </div>\n </div>\n </ProgressCtx.Provider>\n );\n }\n\n /* ── Circular shape ─────────────────────────────────────────────── */\n const { viewBox, cx, cy, r } = CIRCLE[size];\n const circumference = 2 * Math.PI * r;\n const indeterminateDashOffset = circumference * 0.25;\n // For determinate progress, paint an empty arc on first mount. The\n // effect above then sets stroke-dashoffset to the target, and the\n // CSS transition animates from empty → target.\n const initialDashOffset = isIndeterminate\n ? indeterminateDashOffset\n : circumference;\n\n const svgClass = isIndeterminate\n ? [\n circularVariants({ size }),\n '[transform:rotate(-90deg)]',\n '[@media(prefers-reduced-motion:no-preference)]:animate-[progress-circular-spin_1200ms_linear_infinite]',\n '[.theme-accessible_&]:animate-none',\n 'motion-reduce:animate-[progress-indeterminate-pulse_var(--animation-duration)_ease-in-out_infinite]',\n ].join(' ')\n : [\n circularVariants({ size }),\n '[transform:rotate(-90deg)]',\n 'rtl:[transform:rotate(-90deg)_scaleX(-1)]',\n ].join(' ');\n\n const fillStrokeClass = [\n 'stroke-primary [stroke-width:var(--spacing-xs)]',\n !isIndeterminate &&\n 'transition-[stroke-dashoffset] duration-[var(--animation-duration)] ease-[var(--ease-out)] motion-reduce:transition-none',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <ProgressCtx.Provider value={ctxValue}>\n <div className={wrapperClass} data-component=\"progress\" {...rest}>\n {children}\n <svg\n ref={circTrackRef}\n role=\"progressbar\"\n {...labelProps}\n {...stateProps}\n {...disabledProp}\n viewBox={viewBox}\n className={svgClass}\n >\n <circle\n cx={cx}\n cy={cy}\n r={r}\n fill=\"none\"\n strokeDasharray={circumference}\n className=\"ds:[stroke:var(--progress-track)] ds:[stroke-width:var(--spacing-xs)]\"\n />\n <circle\n ref={circFillRef}\n cx={cx}\n cy={cy}\n r={r}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={initialDashOffset}\n className={fillStrokeClass}\n />\n </svg>\n </div>\n </ProgressCtx.Provider>\n );\n },\n);\n\nProgressRoot.displayName = 'Progress';\n\n/* ── Compound export ──────────────────────────────────────────────────── */\n\nexport const Progress = Object.assign(ProgressRoot, {\n Label: ProgressLabel,\n Value: ProgressValue,\n});\n"],"names":["ProgressCtx","createContext","useProgressCtx","ctx","useContext","CIRCLE","barTrackVariants","cva","circularVariants","ProgressLabel","forwardRef","children","className","props","ref","t","i18n","useTranslation","defaultText","jsx","ProgressValue","text","ProgressRoot","value","max","shape","size","ariaLabel","ariaValueText","debouncePercent","disabled","rest","labelId","useId","barTrackRef","useRef","barFillRef","circTrackRef","circFillRef","lastAnnouncedPercentRef","isIndeterminate","clampedValue","targetPercent","hasMounted","setHasMounted","useState","useEffect","percent","useLayoutEffect","_a","r","offset","_b","trackEl","pct","last","useImperativeHandle","v","clamped","fallbackAriaLabel","labelProps","stateProps","disabledProp","wrapperClass","ctxValue","fillClass","jsxs","viewBox","cx","cy","circumference","indeterminateDashOffset","initialDashOffset","svgClass","fillStrokeClass","Progress"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"radio-XSSNX3Af.js","sources":["../../src/components/radio-group/radio-group-context.ts","../../src/components/radio-group/radio.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\n\nexport type RadioGroupVariant = 'vertical' | 'horizontal' | 'card';\n\nexport interface RadioGroupInternalContextShape {\n variant: RadioGroupVariant;\n}\n\nexport const RadioGroupInternalContext =\n createContext<RadioGroupInternalContextShape | null>(null);\n\nexport function useRadioGroupContext(): RadioGroupInternalContextShape | null {\n return useContext(RadioGroupInternalContext);\n}\n","import {\n forwardRef,\n useEffect,\n useId,\n useRef,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useRadioGroupContext } from './radio-group-context';\nimport { Tooltip } from '../tooltip';\n\nconst radioVariants = cva(\n [\n 'ds:group ds:inline-flex ds:items-center ds:justify-center ds:shrink-0 ds:rounded-full',\n 'ds:border ds:border-border ds:bg-background',\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-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n 'ds:data-[state=checked]:border-primary',\n 'ds:data-[disabled]:border-muted',\n 'ds:relative ds:before:absolute ds:before:inset-[calc((var(--min-target-size)-100%)/-2)] ds:before:content-[\"\"]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:size-3.5',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst discSizeBySize = {\n sm: 'size-1.5',\n md: 'size-2',\n lg: 'size-2.5',\n} as const;\n\ntype RadixItemProps = ComponentPropsWithoutRef<typeof RadixRadioGroup.Item>;\n\nexport interface RadioProps\n extends Omit<RadixItemProps, 'children'>,\n VariantProps<typeof radioVariants> {\n label: string;\n size?: 'sm' | 'md' | 'lg';\n disabledReason?: string;\n description?: string;\n}\n\nexport const Radio = forwardRef<HTMLButtonElement, RadioProps>(\n (\n {\n label,\n size = 'md',\n disabled,\n disabledReason,\n description,\n id,\n className,\n value,\n ...props\n },\n ref,\n ) => {\n const generatedId = useId();\n const radioId = id ?? generatedId;\n const ctx = useRadioGroupContext();\n const isCard = ctx?.variant === 'card';\n\n const warnedRef = useRef(false);\n useEffect(() => {\n if (import.meta.env.DEV && !ctx && !warnedRef.current) {\n warnedRef.current = true;\n console.warn(\n '<Radio> rendered without a <RadioGroup> ancestor. A lone radio is rarely meaningful — use <Checkbox> for a single on/off choice.',\n );\n }\n }, [ctx]);\n\n const discClasses = [\n 'rounded-full bg-primary',\n discSizeBySize[size],\n 'group-data-[disabled]:bg-muted',\n ].join(' ');\n\n const item = (\n <RadixRadioGroup.Item\n ref={ref}\n id={radioId}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n value={value as string}\n className={radioVariants({ size, className })}\n data-component=\"radio\"\n {...props}\n >\n <RadixRadioGroup.Indicator\n asChild\n className=\"ds:inline-flex ds:items-center ds:justify-center\"\n >\n <span aria-hidden=\"true\" className={discClasses} />\n </RadixRadioGroup.Indicator>\n </RadixRadioGroup.Item>\n );\n\n const labelClasses = [\n 'type-label text-foreground select-none',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n ].join(' ');\n\n const cardClasses = [\n 'flex items-start gap-[var(--spacing-md)]',\n 'rounded-[var(--radius-md)] border border-border',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-md)] py-[var(--spacing-md)]',\n 'min-h-[var(--min-target-size)]',\n 'has-[[data-state=checked]]:border-ring',\n 'has-[[data-state=checked]]:bg-[color-mix(in_srgb,var(--accent)_5%,transparent)]',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n ].join(' ');\n\n const content = isCard ? (\n <label htmlFor={radioId} className={cardClasses}>\n {item}\n <span className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:text-start\">\n <span className=\"type-label ds:text-foreground\">{label}</span>\n {description ? (\n <span className=\"type-body-sm ds:text-muted-foreground\">{description}</span>\n ) : null}\n </span>\n </label>\n ) : (\n <div className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-sm)] ds:min-h-[var(--min-target-size)]\">\n {item}\n <label htmlFor={radioId} className={labelClasses}>\n {label}\n </label>\n </div>\n );\n\n if (disabled && disabledReason) {\n return <Tooltip label={disabledReason}>{content}</Tooltip>;\n }\n\n return content;\n },\n);\n\nRadio.displayName = 'Radio';\n"],"names":["RadioGroupInternalContext","createContext","useRadioGroupContext","useContext","radioVariants","cva","discSizeBySize","Radio","forwardRef","label","size","disabled","disabledReason","description","id","className","value","props","ref","generatedId","useId","radioId","ctx","isCard","useRef","useEffect","discClasses","item","jsx","RadixRadioGroup","labelClasses","cardClasses","content","jsxs","Tooltip"],"mappings":";;;;;AAQO,MAAMA,IACXC,EAAqD,IAAI;AAEpD,SAASC,IAA8D;AAC5E,SAAOC,EAAWH,CAAyB;AAC7C;ACDA,MAAMI,IAAgBC;AAAA,EACpB;AAAA,IACE;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,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MAAA;AAAA,IACN;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,IAAA;AAAA,EACR;AAEJ,GAEMC,IAAiB;AAAA,EACrB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAaaC,IAAQC;AAAA,EACnB,CACE;AAAA,IACE,OAAAC;AAAA,IACA,MAAAC,IAAO;AAAA,IACP,UAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,IAAAC;AAAA,IACA,WAAAC;AAAA,IACA,OAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAcC,EAAA,GACdC,IAAUP,KAAMK,GAChBG,IAAMpB,EAAA,GACNqB,KAASD,KAAA,gBAAAA,EAAK,aAAY;AAEd,IAAAE,EAAO,EAAK,GAC9BC,EAAU,MAAM;AAAA,IAOhB,GAAG,CAACH,CAAG,CAAC;AAER,UAAMI,IAAc;AAAA,MAClB;AAAA,MACApB,EAAeI,CAAI;AAAA,MACnB;AAAA,IAAA,EACA,KAAK,GAAG,GAEJiB,IACJ,gBAAAC;AAAA,MAACC,EAAgB;AAAA,MAAhB;AAAA,QACC,KAAAX;AAAA,QACA,IAAIG;AAAA,QACJ,UAAAV;AAAA,QACA,iBAAeA,KAAY;AAAA,QAC3B,OAAAK;AAAA,QACA,WAAWZ,EAAc,EAAE,MAAAM,GAAM,WAAAK,GAAW;AAAA,QAC5C,kBAAe;AAAA,QACd,GAAGE;AAAA,QAEJ,UAAA,gBAAAW;AAAA,UAACC,EAAgB;AAAA,UAAhB;AAAA,YACC,SAAO;AAAA,YACP,WAAU;AAAA,YAEV,4BAAC,QAAA,EAAK,eAAY,QAAO,WAAWH,GAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MACnD;AAAA,IAAA,GAIEI,IAAe;AAAA,MACnB;AAAA,MACAnB,IAAW,kCAAkC;AAAA,IAAA,EAC7C,KAAK,GAAG,GAEJoB,IAAc;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACApB,IAAW,kCAAkC;AAAA,IAAA,EAC7C,KAAK,GAAG,GAEJqB,IAAUT,IACd,gBAAAU,EAAC,WAAM,SAASZ,GAAS,WAAWU,GACjC,UAAA;AAAA,MAAAJ;AAAA,MACD,gBAAAM,EAAC,QAAA,EAAK,WAAU,gEACd,UAAA;AAAA,0BAAC,QAAA,EAAK,WAAU,iCAAiC,UAAAxB,GAAM;AAAA,QACtDI,sBACE,QAAA,EAAK,WAAU,yCAAyC,aAAY,IACnE;AAAA,MAAA,GACN;AAAA,IAAA,EAAA,CACF,IAEA,gBAAAoB,EAAC,OAAA,EAAI,WAAU,+FACZ,UAAA;AAAA,MAAAN;AAAA,wBACA,SAAA,EAAM,SAASN,GAAS,WAAWS,GACjC,UAAArB,EAAA,CACH;AAAA,IAAA,GACF;AAGF,WAAIE,KAAYC,sBACNsB,GAAA,EAAQ,OAAOtB,GAAiB,UAAAoB,GAAQ,IAG3CA;AAAA,EACT;AACF;AAEAzB,EAAM,cAAc;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"radio-group-DBrUOPcy.js","sources":["../../src/components/radio-group/radio-group.tsx"],"sourcesContent":["import {\n forwardRef,\n useId,\n useMemo,\n useRef,\n type ComponentPropsWithoutRef,\n} from 'react';\nimport * as RadixRadioGroup from '@radix-ui/react-radio-group';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle } from 'lucide-react';\nimport {\n RadioGroupInternalContext,\n type RadioGroupInternalContextShape,\n type RadioGroupVariant,\n} from './radio-group-context';\nimport { useDirection } from '../_shared/use-direction';\nimport { composeRefs } from '../_shared/compose-refs';\n\nconst radioGroupVariants = cva('ds:flex', {\n variants: {\n variant: {\n vertical: 'ds:flex-col ds:gap-[var(--spacing-sm)]',\n horizontal: 'ds:flex-row ds:flex-wrap ds:gap-[var(--spacing-md)]',\n card: 'ds:flex-col ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: {\n variant: 'vertical',\n },\n});\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixRadioGroup.Root>;\n\nexport interface RadioGroupProps\n extends Omit<RadixRootProps, 'children' | 'orientation'>,\n VariantProps<typeof radioGroupVariants> {\n children: React.ReactNode;\n variant?: RadioGroupVariant;\n label?: string;\n description?: string;\n error?: string;\n required?: boolean;\n}\n\nexport const RadioGroup = forwardRef<HTMLDivElement, RadioGroupProps>(\n (\n {\n children,\n variant = 'vertical',\n label,\n description,\n error,\n required,\n disabled,\n className,\n ...props\n },\n ref,\n ) => {\n const baseId = useId();\n const descriptionId = `${baseId}-description`;\n const errorId = `${baseId}-error`;\n\n const describedBy =\n [description ? descriptionId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const orientation: 'vertical' | 'horizontal' =\n variant === 'horizontal' ? 'horizontal' : 'vertical';\n\n const ctxValue: RadioGroupInternalContextShape = useMemo(\n () => ({ variant }),\n [variant],\n );\n\n const descriptionNode = description ? (\n <p id={descriptionId} className=\"type-body-sm ds:text-muted-foreground\">\n {description}\n </p>\n ) : null;\n\n const errorNode = error ? (\n <p\n id={errorId}\n role=\"alert\"\n className=\"ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-body-sm ds:text-destructive\"\n >\n <AlertCircle aria-hidden=\"true\" className=\"ds:size-4 ds:shrink-0\" />\n <span>{error}</span>\n </p>\n ) : null;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, rootRef);\n const dir = useDirection(rootRef);\n\n const root = (\n <RadixRadioGroup.Root\n ref={composedRef}\n orientation={orientation}\n dir={dir}\n disabled={disabled}\n required={required}\n aria-describedby={describedBy}\n aria-invalid={Boolean(error) || undefined}\n aria-required={required || undefined}\n className={radioGroupVariants({ variant, className })}\n data-component=\"radio-group\"\n {...props}\n >\n {children}\n </RadixRadioGroup.Root>\n );\n\n const outerClasses = 'flex flex-col gap-[var(--spacing-xs)] min-w-0';\n\n if (label) {\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <fieldset className={`${outerClasses} ds:border-0 ds:p-0 ds:m-0`}>\n <legend className=\"type-label ds:text-foreground ds:p-0\">\n {label}\n {required ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:text-destructive ds:ms-[var(--spacing-xs)]\"\n >\n *\n </span>\n ) : null}\n </legend>\n {descriptionNode}\n {root}\n {errorNode}\n </fieldset>\n </RadioGroupInternalContext.Provider>\n );\n }\n\n return (\n <RadioGroupInternalContext.Provider value={ctxValue}>\n <div className={outerClasses}>\n {descriptionNode}\n {root}\n {errorNode}\n </div>\n </RadioGroupInternalContext.Provider>\n );\n },\n);\n\nRadioGroup.displayName = 'RadioGroup';\n"],"names":["radioGroupVariants","cva","RadioGroup","forwardRef","children","variant","label","description","error","required","disabled","className","props","ref","baseId","useId","descriptionId","errorId","describedBy","orientation","ctxValue","useMemo","descriptionNode","jsx","errorNode","jsxs","AlertCircle","rootRef","useRef","composedRef","composeRefs","dir","useDirection","root","RadixRadioGroup","outerClasses","RadioGroupInternalContext"],"mappings":";;;;;;;;AAkBA,MAAMA,IAAqBC,EAAI,WAAW;AAAA,EACxC,UAAU;AAAA,IACR,SAAS;AAAA,MACP,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,MAAM;AAAA,IAAA;AAAA,EACR;AAAA,EAEF,iBAAiB;AAAA,IACf,SAAS;AAAA,EAAA;AAEb,CAAC,GAeYC,IAAaC;AAAA,EACxB,CACE;AAAA,IACE,UAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,OAAAC;AAAA,IACA,aAAAC;AAAA,IACA,OAAAC;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAASC,EAAA,GACTC,IAAgB,GAAGF,CAAM,gBACzBG,IAAU,GAAGH,CAAM,UAEnBI,IACJ,CAACX,IAAcS,IAAgB,MAAMR,IAAQS,IAAU,IAAI,EACxD,OAAO,OAAO,EACd,KAAK,GAAG,KAAK,QAEZE,IACJd,MAAY,eAAe,eAAe,YAEtCe,IAA2CC;AAAA,MAC/C,OAAO,EAAE,SAAAhB,EAAA;AAAA,MACT,CAACA,CAAO;AAAA,IAAA,GAGJiB,IAAkBf,IACtB,gBAAAgB,EAAC,KAAA,EAAE,IAAIP,GAAe,WAAU,yCAC7B,UAAAT,EAAA,CACH,IACE,MAEEiB,IAAYhB,IAChB,gBAAAiB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAIR;AAAA,QACJ,MAAK;AAAA,QACL,WAAU;AAAA,QAEV,UAAA;AAAA,UAAA,gBAAAM,EAACG,GAAA,EAAY,eAAY,QAAO,WAAU,yBAAwB;AAAA,UAClE,gBAAAH,EAAC,UAAM,UAAAf,EAAA,CAAM;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAEb,MAEEmB,IAAUC,EAAuB,IAAI,GACrCC,IAAcC,EAAYjB,GAAKc,CAAO,GACtCI,IAAMC,EAAaL,CAAO,GAE1BM,IACJ,gBAAAV;AAAA,MAACW,EAAgB;AAAA,MAAhB;AAAA,QACC,KAAKL;AAAA,QACL,aAAAV;AAAA,QACA,KAAAY;AAAA,QACA,UAAArB;AAAA,QACA,UAAAD;AAAA,QACA,oBAAkBS;AAAA,QAClB,gBAAc,EAAQV,KAAU;AAAA,QAChC,iBAAeC,KAAY;AAAA,QAC3B,WAAWT,EAAmB,EAAE,SAAAK,GAAS,WAAAM,GAAW;AAAA,QACpD,kBAAe;AAAA,QACd,GAAGC;AAAA,QAEH,UAAAR;AAAA,MAAA;AAAA,IAAA,GAIC+B,IAAe;AAErB,WAAI7B,IAEA,gBAAAiB,EAACa,EAA0B,UAA1B,EAAmC,OAAOhB,GACzC,UAAA,gBAAAK,EAAC,YAAA,EAAS,WAAW,GAAGU,CAAY,8BAClC,UAAA;AAAA,MAAA,gBAAAV,EAAC,UAAA,EAAO,WAAU,wCACf,UAAA;AAAA,QAAAnB;AAAA,QACAG,IACC,gBAAAc;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,YACX,UAAA;AAAA,UAAA;AAAA,QAAA,IAGC;AAAA,MAAA,GACN;AAAA,MACCD;AAAA,MACAW;AAAA,MACAT;AAAA,IAAA,EAAA,CACH,EAAA,CACF,IAKF,gBAAAD,EAACa,EAA0B,UAA1B,EAAmC,OAAOhB,GACzC,UAAA,gBAAAK,EAAC,OAAA,EAAI,WAAWU,GACb,UAAA;AAAA,MAAAb;AAAA,MACAW;AAAA,MACAT;AAAA,IAAA,EAAA,CACH,EAAA,CACF;AAAA,EAEJ;AACF;AAEAtB,EAAW,cAAc;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"scroll-area-HIq0hJyJ.js","sources":["../../src/components/scroll-area/scroll-area.tsx"],"sourcesContent":["import { forwardRef, useRef, type ComponentPropsWithoutRef } from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useDirection } from '../_shared/use-direction';\n\nconst scrollbarVariants = cva(\n [\n 'ds:flex ds:touch-none ds:select-none',\n // Fade in/out based on Radix data-state (requires forceMount on Scrollbar).\n // Default opacity is 1 because ScrollAreaScrollbarVisible (type='always')\n // never sets data-state at all — only hover/scroll/auto set data-state=\"hidden\".\n 'ds:transition-opacity ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[state=hidden]:opacity-0',\n // Orientation-specific sizing + padding so thumb floats away from the frame edge\n 'ds:data-[orientation=vertical]:w-[var(--scrollbar-size)] ds:data-[orientation=vertical]:p-[var(--scrollbar-padding)]',\n 'ds:data-[orientation=horizontal]:h-[var(--scrollbar-size)] ds:data-[orientation=horizontal]:flex-col ds:data-[orientation=horizontal]:p-[var(--scrollbar-padding)]',\n 'ds:bg-[var(--scrollbar-track)]',\n // forced-colors: 1px border keeps the track visible when background flattens\n 'ds:forced-colors:border ds:forced-colors:border-[ButtonText]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:[--scrollbar-size:var(--scrollbar-size-sm)]',\n md: 'ds:[--scrollbar-size:var(--scrollbar-size-md)]',\n lg: 'ds:[--scrollbar-size:var(--scrollbar-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst thumbVariants = cva(\n [\n 'ds:relative ds:flex-1',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--scrollbar-thumb)]',\n 'ds:hover:bg-[var(--scrollbar-thumb-hover)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n // forced-color-adjust: auto so forced-colors paint ButtonFace/ButtonText\n 'ds:[forced-color-adjust:auto]',\n // hit area extension via ::before for touch pointers (must be absolute)\n 'ds:before:absolute ds:before:content-[\"\"] ds:before:inset-inline-[calc((var(--min-target-size)-100%)/-2)]',\n 'ds:before:inset-block-[calc((var(--min-target-size)-100%)/-2)]',\n ].join(' '),\n);\n\nexport interface ScrollAreaProps\n extends Omit<\n ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>,\n 'type'\n >,\n VariantProps<typeof scrollbarVariants> {\n orientation?: 'vertical' | 'horizontal' | 'both';\n size?: 'sm' | 'md' | 'lg';\n /**\n * `auto` — scrollbar fades in on pointer-enter, fades out after `--scrollbar-fade-delay` (default).\n * `always` — scrollbar always visible; use for data tables.\n * `scroll` — scrollbar visible only while scrolling.\n * `hover` — alias for `auto` (Radix hover mode).\n * `native` — skips the custom scrollbar entirely; the OS renders its own.\n * Use for virtualised lists (AG Grid, @tanstack/react-virtual).\n */\n type?: 'auto' | 'always' | 'scroll' | 'hover' | 'native';\n className?: string;\n children: React.ReactNode;\n}\n\nconst radixType = (\n type: ScrollAreaProps['type'],\n): ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>['type'] => {\n if (type === 'auto' || type === undefined) return 'hover';\n return type as Exclude<ScrollAreaProps['type'], 'auto' | 'native' | undefined>;\n};\n\nconst nativeOverflow: Record<\n NonNullable<ScrollAreaProps['orientation']>,\n string\n> = {\n vertical: 'overflow-y-auto',\n horizontal: 'overflow-x-auto',\n both: 'overflow-auto',\n};\n\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n (\n {\n orientation = 'vertical',\n size = 'md',\n type = 'auto',\n className,\n children,\n // scrollHideDelay is a Root-only prop; ignore it for the native branch\n scrollHideDelay,\n ...props\n },\n ref,\n ) => {\n // ── Native escape-hatch ────────────────────────────────────────────\n // Radix's Viewport always injects `scrollbar-width: none` CSS, which\n // hides the browser scrollbar even if we skip rendering the custom one.\n // For native mode we bypass Radix entirely and render a plain div.\n if (type === 'native') {\n return (\n <div\n ref={ref}\n data-component=\"scroll-area\"\n className={[\n nativeOverflow[orientation],\n 'ds:min-w-0 ds:min-h-0',\n // focus ring matches the custom-scrollbar variant\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[Highlight]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n // ── Radix custom-scrollbar path ────────────────────────────────────\n const rootRef = useRef<HTMLDivElement>(null);\n const dir = useDirection(rootRef);\n return (\n <ScrollAreaPrimitive.Root\n ref={rootRef}\n type={radixType(type)}\n dir={dir}\n scrollHideDelay={scrollHideDelay}\n data-component=\"scroll-area\"\n className={[\n 'ds:relative ds:overflow-hidden',\n 'ds:min-w-0 ds:min-h-0',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={ref}\n className={[\n 'ds:h-full ds:w-full ds:rounded-[inherit]',\n // keyboard focus ring on the scroll container\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[Highlight]',\n ].join(' ')}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n\n {(orientation === 'vertical' || orientation === 'both') && (\n // forceMount keeps the element in the DOM so CSS opacity transition\n // can animate the show/hide instead of mount/unmount snapping.\n <ScrollAreaPrimitive.Scrollbar\n forceMount\n orientation=\"vertical\"\n className={scrollbarVariants({ size })}\n >\n <ScrollAreaPrimitive.Thumb className={thumbVariants()} />\n </ScrollAreaPrimitive.Scrollbar>\n )}\n\n {(orientation === 'horizontal' || orientation === 'both') && (\n <ScrollAreaPrimitive.Scrollbar\n forceMount\n orientation=\"horizontal\"\n className={scrollbarVariants({ size })}\n >\n <ScrollAreaPrimitive.Thumb className={thumbVariants()} />\n </ScrollAreaPrimitive.Scrollbar>\n )}\n\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n },\n);\n\nScrollArea.displayName = 'ScrollArea';\n\n// Re-export Radix parts for advanced composition\nexport const ScrollAreaRoot = ScrollAreaPrimitive.Root;\nexport const ScrollAreaViewport = ScrollAreaPrimitive.Viewport;\nexport const ScrollAreaScrollbar = ScrollAreaPrimitive.Scrollbar;\nexport const ScrollAreaThumb = ScrollAreaPrimitive.Thumb;\nexport const ScrollAreaCorner = ScrollAreaPrimitive.Corner;\n"],"names":["scrollbarVariants","cva","thumbVariants","radixType","type","nativeOverflow","ScrollArea","forwardRef","orientation","size","className","children","scrollHideDelay","props","ref","jsx","rootRef","useRef","dir","useDirection","jsxs","ScrollAreaPrimitive","ScrollAreaRoot","ScrollAreaViewport","ScrollAreaScrollbar","ScrollAreaThumb","ScrollAreaCorner"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"select-DdAOtomN.js","sources":["../../src/components/select/select.tsx"],"sourcesContent":["import {\n forwardRef,\n useContext,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type MutableRefObject,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport * as RadixSelect from '@radix-ui/react-select';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Check, ChevronDown, ChevronUp, X } from 'lucide-react';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\nimport type { OptionShape } from '../_shared/option';\nimport { groupOptions } from '../_shared/group-options';\nimport { useDirection } from '../_shared/use-direction';\n\nconst selectTriggerVariants = cva(\n [\n 'ds:group ds:inline-flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:w-full',\n 'ds:rounded-[var(--radius-sm)] ds:border ds:border-border ds:bg-background',\n 'ds:text-foreground ds:placeholder:text-muted-foreground',\n 'ds:data-[placeholder]:text-muted-foreground',\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-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-8 ds:ps-3 ds:pe-3 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:h-[var(--min-target-size)] ds:ps-3 ds:pe-3 ds:text-[length:var(--font-size-base)]',\n lg: 'ds:h-12 ds:ps-4 ds:pe-4 ds:text-[length:var(--font-size-lg)]',\n },\n tone: {\n default: '',\n error: 'ds:border-destructive ds:focus-visible:outline-destructive',\n },\n },\n defaultVariants: {\n size: 'md',\n tone: 'default',\n },\n },\n);\n\nconst selectContentVariants = cva(\n [\n 'ds:z-[var(--z-dropdown)] ds:overflow-hidden',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border ds:bg-background ds:text-foreground',\n 'ds:shadow-[var(--shadow-lg)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:data-[state=closed]:zoom-out-95',\n 'ds:data-[side=bottom]:slide-in-from-top-2',\n 'ds:data-[side=top]:slide-in-from-bottom-2',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n);\n\nconst selectItemVariants = cva(\n [\n 'ds:relative ds:flex ds:cursor-pointer ds:items-center',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:text-foreground ds:outline-none ds:select-none',\n 'ds:data-[highlighted]:bg-muted ds:data-[highlighted]:text-foreground',\n 'ds:data-[disabled]:pointer-events-none ds:data-[disabled]:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:min-h-8 ds:ps-8 ds:pe-3 ds:text-[length:var(--font-size-sm)]',\n md: 'ds:min-h-[var(--min-target-size)] ds:ps-8 ds:pe-3 ds:text-[length:var(--font-size-base)]',\n lg: 'ds:min-h-12 ds:ps-10 ds:pe-4 ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\nconst selectLabelClasses = [\n 'ps-8 pe-3 py-1.5',\n 'type-eyebrow text-muted-foreground',\n 'sticky top-0 bg-background',\n].join(' ');\n\nconst iconSizeByItemSize = {\n sm: 'size-3.5',\n md: 'size-4',\n lg: 'size-5',\n} as const;\n\nconst itemIndicatorStartByItemSize = {\n sm: 'start-2',\n md: 'start-2',\n lg: 'start-3',\n} as const;\n\nfunction composeRefs<T>(\n ...refs: Array<Ref<T> | undefined | null>\n): (node: T | null) => void {\n return (node: T | null) => {\n for (const r of refs) {\n if (!r) continue;\n if (typeof r === 'function') {\n r(node);\n } else {\n (r as MutableRefObject<T | null>).current = node;\n }\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Compound sub-components — thin `forwardRef` wrappers over Radix parts.\n// ---------------------------------------------------------------------------\n\ntype SelectRootProps = ComponentPropsWithoutRef<typeof RadixSelect.Root>;\n\nconst SelectRoot = (props: SelectRootProps) => <RadixSelect.Root {...props} />;\nSelectRoot.displayName = 'Select.Root';\n\ntype SelectTriggerElement = ElementRef<typeof RadixSelect.Trigger>;\ntype SelectTriggerProps = ComponentPropsWithoutRef<typeof RadixSelect.Trigger> &\n VariantProps<typeof selectTriggerVariants>;\n\nconst SelectTrigger = forwardRef<SelectTriggerElement, SelectTriggerProps>(\n ({ size, tone, className, children, ...props }, ref) => (\n <RadixSelect.Trigger\n ref={ref}\n className={selectTriggerVariants({ size, tone, className })}\n {...props}\n >\n {children}\n </RadixSelect.Trigger>\n ),\n);\nSelectTrigger.displayName = 'Select.Trigger';\n\ntype SelectValueProps = ComponentPropsWithoutRef<typeof RadixSelect.Value>;\n\nconst SelectValue = forwardRef<\n ElementRef<typeof RadixSelect.Value>,\n SelectValueProps\n>((props, ref) => <RadixSelect.Value ref={ref} {...props} />);\nSelectValue.displayName = 'Select.Value';\n\ntype SelectContentProps = ComponentPropsWithoutRef<\n typeof RadixSelect.Content\n> & {\n container?: HTMLElement | null;\n};\n\nconst SelectContent = forwardRef<\n ElementRef<typeof RadixSelect.Content>,\n SelectContentProps\n>(\n (\n {\n className,\n children,\n position = 'popper',\n sideOffset = 4,\n container,\n ...props\n },\n ref,\n ) => (\n <RadixSelect.Portal container={container ?? undefined}>\n <RadixSelect.Content\n ref={ref}\n position={position}\n sideOffset={sideOffset}\n className={selectContentVariants({ className })}\n {...props}\n >\n <RadixSelect.ScrollUpButton className=\"ds:flex ds:items-center ds:justify-center ds:h-6 ds:bg-background ds:cursor-default\">\n <ChevronUp aria-hidden=\"true\" className=\"ds:size-4\" />\n </RadixSelect.ScrollUpButton>\n {children}\n <RadixSelect.ScrollDownButton className=\"ds:flex ds:items-center ds:justify-center ds:h-6 ds:bg-background ds:cursor-default\">\n <ChevronDown aria-hidden=\"true\" className=\"ds:size-4\" />\n </RadixSelect.ScrollDownButton>\n </RadixSelect.Content>\n </RadixSelect.Portal>\n ),\n);\nSelectContent.displayName = 'Select.Content';\n\ntype SelectViewportProps = ComponentPropsWithoutRef<\n typeof RadixSelect.Viewport\n>;\n\nconst SelectViewport = forwardRef<\n ElementRef<typeof RadixSelect.Viewport>,\n SelectViewportProps\n>(({ className, ...props }, ref) => (\n <RadixSelect.Viewport\n ref={ref}\n className={['ds:p-1', className].filter(Boolean).join(' ')}\n {...props}\n />\n));\nSelectViewport.displayName = 'Select.Viewport';\n\ntype SelectItemProps = ComponentPropsWithoutRef<typeof RadixSelect.Item> &\n VariantProps<typeof selectItemVariants>;\n\nconst SelectItem = forwardRef<\n ElementRef<typeof RadixSelect.Item>,\n SelectItemProps\n>(({ size = 'md', className, children, ...props }, ref) => {\n const indicatorStart = itemIndicatorStartByItemSize[size ?? 'md'];\n const iconSize = iconSizeByItemSize[size ?? 'md'];\n return (\n <RadixSelect.Item\n ref={ref}\n className={selectItemVariants({ size, className })}\n {...props}\n >\n <span\n className={`ds:absolute ${indicatorStart} ds:inline-flex ds:items-center ds:justify-center`}\n aria-hidden=\"true\"\n >\n <RadixSelect.ItemIndicator>\n <Check className={iconSize} />\n </RadixSelect.ItemIndicator>\n </span>\n <RadixSelect.ItemText>{children}</RadixSelect.ItemText>\n </RadixSelect.Item>\n );\n});\nSelectItem.displayName = 'Select.Item';\n\ntype SelectItemTextProps = ComponentPropsWithoutRef<\n typeof RadixSelect.ItemText\n>;\n\nconst SelectItemText = forwardRef<\n ElementRef<typeof RadixSelect.ItemText>,\n SelectItemTextProps\n>((props, ref) => <RadixSelect.ItemText ref={ref} {...props} />);\nSelectItemText.displayName = 'Select.ItemText';\n\ntype SelectGroupProps = ComponentPropsWithoutRef<typeof RadixSelect.Group>;\n\nconst SelectGroup = forwardRef<\n ElementRef<typeof RadixSelect.Group>,\n SelectGroupProps\n>((props, ref) => <RadixSelect.Group ref={ref} {...props} />);\nSelectGroup.displayName = 'Select.Group';\n\ntype SelectLabelProps = ComponentPropsWithoutRef<typeof RadixSelect.Label>;\n\nconst SelectLabel = forwardRef<\n ElementRef<typeof RadixSelect.Label>,\n SelectLabelProps\n>(({ className, ...props }, ref) => (\n <RadixSelect.Label\n ref={ref}\n className={[selectLabelClasses, className].filter(Boolean).join(' ')}\n {...props}\n />\n));\nSelectLabel.displayName = 'Select.Label';\n\ntype SelectSeparatorProps = ComponentPropsWithoutRef<\n typeof RadixSelect.Separator\n>;\n\nconst SelectSeparator = forwardRef<\n ElementRef<typeof RadixSelect.Separator>,\n SelectSeparatorProps\n>(({ className, ...props }, ref) => (\n <RadixSelect.Separator\n ref={ref}\n className={['ds:my-1 ds:h-px ds:bg-border', className].filter(Boolean).join(' ')}\n {...props}\n />\n));\nSelectSeparator.displayName = 'Select.Separator';\n\n// ---------------------------------------------------------------------------\n// Convenience form — `<Select options={[{value, label, group?}]} />`.\n// ---------------------------------------------------------------------------\n\nexport type SelectOption<T extends string = string> = OptionShape<T>;\n\nexport interface SelectProps<T extends string = string> {\n options: SelectOption<T>[];\n value?: T | '';\n defaultValue?: T;\n onValueChange?: (value: T | '') => void;\n placeholder?: string;\n clearable?: boolean;\n disabled?: boolean;\n required?: boolean;\n name?: string;\n id?: string;\n size?: 'sm' | 'md' | 'lg';\n tone?: 'default' | 'error';\n 'aria-label'?: string;\n className?: string;\n}\n\nconst SelectImpl = forwardRef<HTMLButtonElement, SelectProps>(function Select(\n {\n options,\n value,\n defaultValue,\n onValueChange,\n placeholder,\n clearable = false,\n disabled,\n required,\n name,\n id,\n size = 'md',\n tone = 'default',\n className,\n 'aria-label': ariaLabel,\n },\n ref,\n) {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n\n const [internalValue, setInternalValue] = useState<string>(\n value ?? defaultValue ?? '',\n );\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n\n const triggerId = id ?? (inFormField ? ctx.id : undefined);\n const effectiveDisabled = (inFormField ? ctx.disabled : false) || Boolean(disabled);\n const effectiveRequired = (inFormField ? ctx.required : false) || Boolean(required);\n const effectiveInvalid = inFormField ? ctx.invalid : false;\n const effectiveTone = effectiveInvalid ? 'error' : tone;\n const describedBy = inFormField && ctx.describedBy ? ctx.describedBy : undefined;\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const composedTriggerRef = composeRefs(ref, triggerRef);\n const dir = useDirection(triggerRef);\n\n const emitValue = onValueChange as\n | ((value: string) => void)\n | undefined;\n\n const handleValueChange = (next: string) => {\n if (!isControlled) setInternalValue(next);\n emitValue?.(next);\n };\n\n const handleClear: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!isControlled) setInternalValue('');\n emitValue?.('');\n triggerRef.current?.focus();\n };\n\n const resolvedPlaceholder =\n placeholder ?? t('ui.inputs.select.placeholder', 'Select…');\n\n const showClear = clearable && !!currentValue && !effectiveDisabled;\n\n const groups = groupOptions(options);\n\n return (\n <RadixSelect.Root\n value={currentValue === '' ? undefined : currentValue}\n onValueChange={handleValueChange}\n disabled={effectiveDisabled}\n required={effectiveRequired}\n name={name}\n dir={dir}\n >\n <RadixSelect.Trigger\n ref={composedTriggerRef}\n id={triggerId}\n aria-label={ariaLabel}\n aria-describedby={describedBy}\n aria-invalid={effectiveInvalid || undefined}\n data-component=\"select\"\n className={selectTriggerVariants({\n size,\n tone: effectiveTone,\n className,\n })}\n >\n <RadixSelect.Value placeholder={resolvedPlaceholder} />\n <span className=\"ds:ms-auto ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n {showClear ? (\n <button\n type=\"button\"\n aria-label={t('ui.inputs.select.clear', 'Clear selection')}\n onClick={handleClear}\n onPointerDown={(event) => event.stopPropagation()}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.stopPropagation();\n }\n }}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center ds:rounded-[var(--radius-sm)]',\n 'ds:text-muted-foreground ds:hover:text-foreground',\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-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:size-4',\n ].join(' ')}\n >\n <X aria-hidden=\"true\" className=\"ds:size-3.5\" />\n </button>\n ) : null}\n <RadixSelect.Icon asChild>\n <ChevronDown\n aria-hidden=\"true\"\n className={[\n 'ds:size-4 ds:shrink-0 ds:text-muted-foreground',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:group-data-[state=open]:rotate-180',\n ].join(' ')}\n />\n </RadixSelect.Icon>\n </span>\n </RadixSelect.Trigger>\n <SelectContent>\n <SelectViewport>\n {options.length === 0 ? (\n <div className=\"ds:ps-8 ds:pe-3 ds:py-2 type-body-sm ds:text-muted-foreground\">\n {t('ui.inputs.select.noOptions', 'No options')}\n </div>\n ) : (\n groups.map(({ group, items }, groupIndex) => {\n const body = items.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n disabled={option.disabled}\n size={size}\n >\n {option.label}\n </SelectItem>\n ));\n if (!group) {\n return (\n <RadixSelect.Group key={`group-${groupIndex}`}>\n {body}\n </RadixSelect.Group>\n );\n }\n return (\n <RadixSelect.Group key={`group-${group}`}>\n <SelectLabel>{group}</SelectLabel>\n {body}\n </RadixSelect.Group>\n );\n })\n )}\n </SelectViewport>\n </SelectContent>\n </RadixSelect.Root>\n );\n});\nSelectImpl.displayName = 'Select';\n\ninterface SelectComponent {\n <T extends string = string>(\n props: SelectProps<T> & { ref?: Ref<HTMLButtonElement> },\n ): ReactElement | null;\n displayName?: string;\n Root: typeof SelectRoot;\n Trigger: typeof SelectTrigger;\n Value: typeof SelectValue;\n Content: typeof SelectContent;\n Viewport: typeof SelectViewport;\n Item: typeof SelectItem;\n ItemText: typeof SelectItemText;\n Group: typeof SelectGroup;\n Label: typeof SelectLabel;\n Separator: typeof SelectSeparator;\n}\n\nconst SelectWithStatics = Object.assign(SelectImpl, {\n Root: SelectRoot,\n Trigger: SelectTrigger,\n Value: SelectValue,\n Content: SelectContent,\n Viewport: SelectViewport,\n Item: SelectItem,\n ItemText: SelectItemText,\n Group: SelectGroup,\n Label: SelectLabel,\n Separator: SelectSeparator,\n}) as unknown as SelectComponent;\n\nexport const Select = SelectWithStatics;\n\nexport {\n SelectRoot,\n SelectTrigger,\n SelectValue,\n SelectContent,\n SelectViewport,\n SelectItem,\n SelectItemText,\n SelectGroup,\n SelectLabel,\n SelectSeparator,\n};\n\nexport {\n selectTriggerVariants,\n selectContentVariants,\n selectItemVariants,\n};\n\nexport type {\n SelectTriggerProps,\n SelectContentProps,\n SelectItemProps,\n SelectLabelProps,\n SelectRootProps,\n};\n\nexport type { ReactNode };\n"],"names":["selectTriggerVariants","cva","selectContentVariants","selectItemVariants","selectLabelClasses","iconSizeByItemSize","itemIndicatorStartByItemSize","composeRefs","refs","node","r","SelectRoot","props","jsx","RadixSelect","SelectTrigger","forwardRef","size","tone","className","children","ref","SelectValue","SelectContent","position","sideOffset","container","jsxs","ChevronUp","ChevronDown","SelectViewport","SelectItem","indicatorStart","iconSize","Check","SelectItemText","SelectGroup","SelectLabel","SelectSeparator","SelectImpl","options","value","defaultValue","onValueChange","placeholder","clearable","disabled","required","name","id","ariaLabel","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","internalValue","setInternalValue","useState","isControlled","currentValue","triggerId","effectiveDisabled","effectiveRequired","effectiveInvalid","effectiveTone","describedBy","triggerRef","useRef","composedTriggerRef","dir","useDirection","emitValue","handleValueChange","next","handleClear","event","_a","resolvedPlaceholder","showClear","groups","groupOptions","X","group","items","groupIndex","body","option","SelectWithStatics","Select"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sheet-D7GRhnWw.js","sources":["../../src/components/sheet/sheet.tsx"],"sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { X } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\n\nconst OVERLAY_CLASSES = [\n 'fixed inset-0 z-[var(--z-modal-backdrop)]',\n 'bg-[var(--background)]/[var(--opacity-70)]',\n 'backdrop-blur-sm',\n 'data-[state=open]:animate-in data-[state=open]:fade-in-0',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0',\n 'duration-[var(--animation-duration)] motion-reduce:transition-none',\n].join(' ');\n\nconst contentVariants = cva(\n [\n 'ds:fixed ds:z-[var(--z-modal)] ds:flex ds:flex-col',\n 'ds:bg-[var(--popover)] ds:text-[var(--popover-foreground)]',\n 'ds:shadow-[var(--shadow-xl)]',\n 'ds:focus-visible:outline-none',\n 'ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n side: {\n start: [\n 'ds:start-0 ds:inset-y-0',\n 'ds:border-e ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:ltr:data-[state=open]:slide-in-from-left-full ds:rtl:data-[state=open]:slide-in-from-right-full',\n 'ds:data-[state=closed]:animate-out ds:ltr:data-[state=closed]:slide-out-to-left-full ds:rtl:data-[state=closed]:slide-out-to-right-full',\n 'ds:max-sm:[inline-size:100dvw] ds:max-sm:[block-size:100dvh]',\n ].join(' '),\n end: [\n 'ds:end-0 ds:inset-y-0',\n 'ds:border-s ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:ltr:data-[state=open]:slide-in-from-right-full ds:rtl:data-[state=open]:slide-in-from-left-full',\n 'ds:data-[state=closed]:animate-out ds:ltr:data-[state=closed]:slide-out-to-right-full ds:rtl:data-[state=closed]:slide-out-to-left-full',\n 'ds:max-sm:[inline-size:100dvw] ds:max-sm:[block-size:100dvh]',\n ].join(' '),\n top: [\n 'ds:top-0 ds:inset-x-0',\n 'ds:border-b ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:slide-in-from-top-full',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:slide-out-to-top-full',\n ].join(' '),\n bottom: [\n 'ds:bottom-0 ds:inset-x-0',\n 'ds:border-t ds:border-[color:var(--border)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:slide-in-from-bottom-full',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:slide-out-to-bottom-full',\n ].join(' '),\n },\n },\n defaultVariants: { side: 'end' },\n },\n);\n\nfunction getSizeClass(\n side: 'start' | 'end' | 'top' | 'bottom',\n size: 'sm' | 'md' | 'lg',\n): string {\n if (side === 'start' || side === 'end') {\n const map = {\n sm: '[inline-size:360px]',\n md: '[inline-size:480px]',\n lg: '[inline-size:640px]',\n } as const;\n return map[size];\n }\n\n const map = {\n sm: '[block-size:40dvh]',\n md: '[block-size:60dvh]',\n lg: '[block-size:80dvh]',\n } as const;\n return map[size];\n}\n\nconst SheetRoot = ({\n children,\n ...props\n}: ComponentPropsWithoutRef<typeof RadixDialog.Root>) => (\n <RadixDialog.Root {...props}>{children}</RadixDialog.Root>\n);\nSheetRoot.displayName = 'Sheet.Root';\n\nconst SheetTrigger = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Trigger>\n>(({ children, ...props }, ref) => (\n <RadixDialog.Trigger ref={ref} {...props}>\n {children}\n </RadixDialog.Trigger>\n));\nSheetTrigger.displayName = 'Sheet.Trigger';\n\nconst SheetClose = forwardRef<\n HTMLButtonElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Close>\n>(({ children, ...props }, ref) => (\n <RadixDialog.Close ref={ref} {...props}>\n {children}\n </RadixDialog.Close>\n));\nSheetClose.displayName = 'Sheet.Close';\n\nexport interface SheetContentProps\n extends Omit<ComponentPropsWithoutRef<typeof RadixDialog.Content>, 'className'>,\n VariantProps<typeof contentVariants> {\n side?: 'start' | 'end' | 'top' | 'bottom';\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n children: ReactNode;\n}\n\nconst SheetContent = forwardRef<HTMLDivElement, SheetContentProps>(\n ({ side = 'end', size = 'md', className, children, ...props }, ref) => (\n <RadixDialog.Portal>\n <RadixDialog.Overlay className={OVERLAY_CLASSES} />\n <RadixDialog.Content\n ref={ref}\n className={[contentVariants({ side }), getSizeClass(side, size), className]\n .filter(Boolean)\n .join(' ')}\n data-component=\"sheet\"\n {...props}\n >\n {children}\n </RadixDialog.Content>\n </RadixDialog.Portal>\n ),\n);\nSheetContent.displayName = 'Sheet.Content';\n\nconst SheetHeader = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const { t } = useTranslation();\n\n return (\n <div\n ref={ref}\n className={[\n 'ds:sticky ds:top-0 ds:z-10 ds:flex ds:items-center ds:justify-between',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:py-[var(--spacing-md)]',\n 'ds:border-b ds:border-[color:var(--border)] ds:bg-[var(--popover)]',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n {children}\n <SheetClose asChild>\n <IconButton\n icon={<X />}\n intent=\"ghost\"\n size=\"sm\"\n aria-label={t('ui.common.close', 'Close')}\n />\n </SheetClose>\n </div>\n );\n },\n);\nSheetHeader.displayName = 'Sheet.Header';\n\nconst SheetBody = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:overflow-y-auto ds:overflow-x-hidden ds:flex-1',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:py-[var(--spacing-lg)]',\n 'ds:break-words',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nSheetBody.displayName = 'Sheet.Body';\n\nconst SheetFooter = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:sticky ds:bottom-0 ds:z-10 ds:flex ds:items-center ds:justify-end ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-lg)] ds:pe-[var(--spacing-lg)] ds:py-[var(--spacing-md)]',\n 'ds:border-t ds:border-[color:var(--border)] ds:bg-[var(--popover)]',\n 'ds:max-sm:flex-col ds:max-sm:[&>*]:w-full',\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n ),\n);\nSheetFooter.displayName = 'Sheet.Footer';\n\nconst SheetTitle = forwardRef<\n HTMLHeadingElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Title>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Title\n ref={ref}\n className={['type-title-card ds:break-words', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nSheetTitle.displayName = 'Sheet.Title';\n\nconst SheetDescription = forwardRef<\n HTMLParagraphElement,\n ComponentPropsWithoutRef<typeof RadixDialog.Description>\n>(({ className, ...props }, ref) => (\n <RadixDialog.Description\n ref={ref}\n className={['type-body-sm ds:text-[var(--muted-foreground)]', className]\n .filter(Boolean)\n .join(' ')}\n {...props}\n />\n));\nSheetDescription.displayName = 'Sheet.Description';\n\nexport const Sheet = Object.assign(SheetRoot, {\n Root: SheetRoot,\n Trigger: SheetTrigger,\n Content: SheetContent,\n Header: SheetHeader,\n Body: SheetBody,\n Footer: SheetFooter,\n Title: SheetTitle,\n Description: SheetDescription,\n Close: SheetClose,\n});\n\nexport type SheetHeaderProps = HTMLAttributes<HTMLDivElement>;\nexport type SheetBodyProps = HTMLAttributes<HTMLDivElement>;\nexport type SheetFooterProps = HTMLAttributes<HTMLDivElement>;\n"],"names":["OVERLAY_CLASSES","contentVariants","cva","getSizeClass","side","size","SheetRoot","children","props","RadixDialog","SheetTrigger","forwardRef","ref","jsx","SheetClose","SheetContent","className","jsxs","SheetHeader","t","useTranslation","IconButton","X","SheetBody","SheetFooter","SheetTitle","SheetDescription","Sheet"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sidebar-Dc2ffrbf.js","sources":["../../node_modules/lucide-react/dist/esm/icons/grip-vertical.js","../../node_modules/lucide-react/dist/esm/icons/panel-left-close.js","../../node_modules/lucide-react/dist/esm/icons/panel-left-open.js","../../node_modules/lucide-react/dist/esm/icons/star.js","../../src/components/sidebar/sidebar.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"9\", cy: \"12\", r: \"1\", key: \"1vctgf\" }],\n [\"circle\", { cx: \"9\", cy: \"5\", r: \"1\", key: \"hp0tcf\" }],\n [\"circle\", { cx: \"9\", cy: \"19\", r: \"1\", key: \"fkjjf6\" }],\n [\"circle\", { cx: \"15\", cy: \"12\", r: \"1\", key: \"1tmaij\" }],\n [\"circle\", { cx: \"15\", cy: \"5\", r: \"1\", key: \"19l28e\" }],\n [\"circle\", { cx: \"15\", cy: \"19\", r: \"1\", key: \"f4zoj3\" }]\n];\nconst GripVertical = createLucideIcon(\"grip-vertical\", __iconNode);\n\nexport { __iconNode, GripVertical as default };\n//# sourceMappingURL=grip-vertical.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m16 15-3-3 3-3\", key: \"14y99z\" }]\n];\nconst PanelLeftClose = createLucideIcon(\"panel-left-close\", __iconNode);\n\nexport { __iconNode, PanelLeftClose as default };\n//# sourceMappingURL=panel-left-close.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m14 9 3 3-3 3\", key: \"8010ee\" }]\n];\nconst PanelLeftOpen = createLucideIcon(\"panel-left-open\", __iconNode);\n\nexport { __iconNode, PanelLeftOpen as default };\n//# sourceMappingURL=panel-left-open.js.map\n","/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\",\n key: \"r04s7s\"\n }\n ]\n];\nconst Star = createLucideIcon(\"star\", __iconNode);\n\nexport { __iconNode, Star as default };\n//# sourceMappingURL=star.js.map\n","import {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type AnchorHTMLAttributes,\n type ComponentPropsWithoutRef,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n} from 'react';\nimport * as RadixDialog from '@radix-ui/react-dialog';\nimport * as RadixCollapsible from '@radix-ui/react-collapsible';\nimport * as RadixAccordion from '@radix-ui/react-accordion';\nimport * as RadixTooltip from '@radix-ui/react-tooltip';\nimport { AccordionContent } from '../accordion';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cva } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n ChevronRight,\n GripVertical,\n PanelLeftClose,\n PanelLeftOpen,\n Star,\n X,\n} from 'lucide-react';\n\n/* -------------------------------------------------------------------- */\n/* Types & context */\n/* -------------------------------------------------------------------- */\n\nexport type SidebarMode = 'expanded' | 'icon' | 'overlay';\nexport type SidebarDensity = 'default' | 'compact';\n\nexport interface SidebarContextValue {\n mode: SidebarMode;\n density: SidebarDensity;\n /** Transition the sidebar to a new mode from an internal toggle. */\n transitionTo?: (next: SidebarMode) => void;\n}\n\nconst SidebarContext = createContext<SidebarContextValue>({\n mode: 'expanded',\n density: 'default',\n});\n\nexport const useSidebar = () => useContext(SidebarContext);\n\n/* -------------------------------------------------------------------- */\n/* localStorage helpers (SSR-safe) */\n/* -------------------------------------------------------------------- */\n\nconst STORAGE_KEY = 'ui.sidebar.state';\n\nfunction readStoredState(defaultMode: SidebarMode): SidebarMode {\n if (typeof window === 'undefined') return defaultMode;\n try {\n const v = window.localStorage.getItem(STORAGE_KEY);\n if (v === 'expanded' || v === 'icon' || v === 'overlay') return v;\n } catch {\n /* noop */\n }\n return defaultMode;\n}\n\nfunction writeStoredState(value: SidebarMode) {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(STORAGE_KEY, value);\n } catch {\n /* noop */\n }\n}\n\n/* -------------------------------------------------------------------- */\n/* usePersistentState */\n/* */\n/* Drop-in `useState` replacement that mirrors its value to */\n/* `localStorage` under the given key. Same signature as `useState`, so */\n/* consumers can wire favourites / accordion / any sidebar preference to */\n/* survive reloads without plumbing effects by hand: */\n/* */\n/* const [pinnedIds, setPinnedIds] = */\n/* usePersistentState<string[]>('ui.sidebar.favorites', */\n/* ['dashboard', 'calendar']); */\n/* */\n/* SSR-safe and quota-safe (swallows serialize / storage errors). */\n/* -------------------------------------------------------------------- */\n\nexport function usePersistentState<T>(\n storageKey: string,\n initial: T | (() => T),\n): [T, (value: T | ((prev: T) => T)) => void] {\n const [value, setValue] = useState<T>(() => {\n if (typeof window === 'undefined') {\n return typeof initial === 'function' ? (initial as () => T)() : initial;\n }\n try {\n const raw = window.localStorage.getItem(storageKey);\n if (raw !== null) return JSON.parse(raw) as T;\n } catch {\n /* noop */\n }\n return typeof initial === 'function' ? (initial as () => T)() : initial;\n });\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(value));\n } catch {\n /* noop */\n }\n }, [storageKey, value]);\n\n return [value, setValue];\n}\n\n/* -------------------------------------------------------------------- */\n/* Root */\n/* -------------------------------------------------------------------- */\n\nconst railClasses = cva(\n [\n 'ds:flex ds:flex-col',\n // Sidebar sits at the page background in light mode (white-on-white\n // chrome separated by the inline-end border + --shadow-md). In dark\n // mode the Header already blends with --background, so we step the\n // sidebar one layer down (blue-600) to keep it visually distinct from\n // the header band — matches the PDF dark mockups' \"flat Dark Blue\n // surface with subtle depth via layering\" recipe.\n 'ds:bg-[var(--background)] ds:[.theme-dark_&]:bg-[color:var(--color-blue-600)] ds:text-[var(--foreground)]',\n 'ds:border-inline-end ds:border-[var(--border)]',\n // Resting-surface elevation — `--shadow-md` is deliberately lighter\n // than `--shadow-card` so it reads as chrome, not a floating card,\n // while still separating the rail from the page content on light\n // backgrounds. Forced-colors strips shadows globally, so the\n // `border-inline-end` above carries the separation cue for HCM.\n //\n // `relative z-[1]` lifts the rail above any sibling that paints a\n // solid background (e.g. AppFrame's `<main>` surface), otherwise\n // the shadow that projects towards the inline-end gets covered.\n 'ds:relative ds:z-[1] ds:shadow-[var(--shadow-md)]',\n 'ds:h-full',\n 'ds:transition-[inline-size] ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n mode: {\n // Tokenised widths modelled on Linear / Jira proportions.\n expanded: 'ds:w-[var(--sidebar-modern-expanded-size)]',\n icon: 'ds:w-[var(--sidebar-modern-icon-size)]',\n overlay: 'ds:w-[var(--sidebar-modern-expanded-size)]',\n },\n density: {\n default: '',\n compact: '',\n },\n },\n defaultVariants: { mode: 'expanded', density: 'default' },\n },\n);\n\nexport interface SidebarProps extends ComponentPropsWithoutRef<'nav'> {\n /** Visual mode. Controlled via `onStateChange`. @default 'expanded' */\n state?: SidebarMode;\n /** Uncontrolled default mode. @default 'expanded' */\n defaultState?: SidebarMode;\n /** Fires when the mode changes (user toggle or overlay open/close). */\n onStateChange?: (state: SidebarMode) => void;\n /** Compact density shrinks inline padding. @default 'default' */\n density?: SidebarDensity;\n /** Overlay-only: controlled open state. */\n open?: boolean;\n /** Overlay-only: fires when the dialog opens/closes. */\n onOpenChange?: (open: boolean) => void;\n /** Override the nav aria-label. */\n 'aria-label'?: string;\n}\n\nconst Sidebar = forwardRef<HTMLElement, SidebarProps>(\n (\n {\n state,\n defaultState = 'expanded',\n onStateChange,\n density = 'default',\n open,\n onOpenChange,\n 'aria-label': ariaLabel,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const isControlled = state !== undefined;\n const [internalState, setInternalState] = useState<SidebarMode>(() =>\n isControlled ? state! : readStoredState(defaultState),\n );\n const resolved = isControlled ? state! : internalState;\n\n useEffect(() => {\n if (!isControlled) writeStoredState(internalState);\n }, [internalState, isControlled]);\n\n // Transition handler used by internal toggles. In controlled mode we\n // only fire `onStateChange` — the parent is responsible for updating\n // the `state` prop. In uncontrolled mode we also update local state.\n // Note: we intentionally do NOT echo the incoming `state` prop back to\n // `onStateChange` — that caused a feedback loop in controlled consumers.\n const transitionTo = useCallback(\n (next: SidebarMode) => {\n if (!isControlled) setInternalState(next);\n onStateChange?.(next);\n },\n [isControlled, onStateChange],\n );\n\n const label = ariaLabel ?? t('ui.navigation.sidebar.label');\n\n if (resolved === 'overlay') {\n return (\n <SidebarContext.Provider value={{ mode: 'overlay', density, transitionTo }}>\n <RadixDialog.Root open={open} onOpenChange={onOpenChange}>\n <RadixDialog.Portal>\n <RadixDialog.Overlay\n className={[\n 'ds:fixed ds:inset-0 ds:z-[var(--z-modal-backdrop)]',\n 'ds:bg-[var(--foreground)]/20 ds:backdrop-blur-sm',\n 'ds:data-[state=open]:animate-in ds:data-[state=open]:fade-in',\n 'ds:data-[state=closed]:animate-out ds:data-[state=closed]:fade-out',\n 'ds:motion-reduce:animate-none',\n ].join(' ')}\n />\n <RadixDialog.Content\n aria-label={label}\n className={[\n 'ds:fixed ds:z-[var(--z-modal)]',\n 'ds:inset-inline-start-0 ds:inset-block-start-0',\n 'ds:h-dvh',\n railClasses({ mode: 'overlay', density }),\n 'ds:shadow-[var(--shadow-xl)]',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:data-[state=open]:slide-in-from-left ds:data-[state=closed]:slide-out-to-left',\n 'ds:rtl:data-[state=open]:slide-in-from-right ds:rtl:data-[state=closed]:slide-out-to-right',\n 'ds:motion-reduce:animate-none',\n 'ds:focus:outline-none',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <nav ref={ref} aria-label={label} data-component=\"sidebar\" className=\"ds:flex ds:flex-col ds:h-full\" {...rest}>\n {children}\n </nav>\n <RadixDialog.Close asChild>\n <button\n type=\"button\"\n aria-label={t('ui.navigation.sidebar.close')}\n className={[\n 'ds:absolute ds:top-[var(--spacing-sm)] ds:end-[var(--spacing-sm)]',\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:min-w-[var(--min-target-size)] ds:min-h-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-sm)] ds:text-[var(--muted-foreground)]',\n 'ds:hover:bg-[var(--muted)]/20 ds:focus-visible:outline-[length:var(--focus-ring-width)]',\n 'ds:focus-visible:outline-solid ds:focus-visible:outline-[var(--ring)]',\n 'ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n ].join(' ')}\n >\n <X aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n </RadixDialog.Close>\n </RadixDialog.Content>\n </RadixDialog.Portal>\n </RadixDialog.Root>\n </SidebarContext.Provider>\n );\n }\n\n return (\n <SidebarContext.Provider value={{ mode: resolved, density, transitionTo }}>\n <RadixTooltip.Provider delayDuration={300}>\n <nav\n ref={ref}\n aria-label={label}\n data-component=\"sidebar\"\n data-mode={resolved}\n data-density={density}\n className={[\n railClasses({ mode: resolved, density }),\n density === 'compact' ? 'ds:density-compact' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </nav>\n </RadixTooltip.Provider>\n </SidebarContext.Provider>\n );\n },\n);\nSidebar.displayName = 'Sidebar';\n\n/* -------------------------------------------------------------------- */\n/* Header / Body / Footer */\n/* -------------------------------------------------------------------- */\n\nconst SidebarHeader = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...rest }, ref) => {\n const { mode } = useSidebar();\n return (\n <div\n ref={ref}\n className={[\n 'ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n // Icon-rail is 64px — shrink horizontal padding so a 44×44\n // control fits centred inside the header.\n mode === 'icon'\n ? 'ds:justify-center ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]'\n : 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:py-[var(--spacing-sm)]',\n // Hairline border + downward chrome shadow cast the header as a\n // sticky top band above the scrolling body.\n 'ds:border-block-end ds:border-[var(--border)]',\n 'ds:shadow-[var(--shadow-chrome-down)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n />\n );\n },\n);\nSidebarHeader.displayName = 'SidebarHeader';\n\nconst SidebarBody = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...rest }, ref) => (\n <div\n ref={ref}\n className={[\n 'ds:flex-1 ds:overflow-auto',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n 'ds:py-[var(--spacing-sm)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n />\n ),\n);\nSidebarBody.displayName = 'SidebarBody';\n\nconst SidebarFooter = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...rest }, ref) => {\n const { mode } = useSidebar();\n return (\n <div\n ref={ref}\n className={[\n 'ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-xs)]',\n // Icon-rail is 64px — two 44×44 controls can't sit side-by-side,\n // so switch to a vertical stack and let each row self-centre.\n mode === 'icon'\n ? 'ds:flex-col ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]'\n : 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:py-[var(--spacing-sm)]',\n // Hairline border + upward chrome shadow cast the footer as a\n // sticky bottom band below the scrolling body.\n 'ds:border-block-start ds:border-[var(--border)]',\n 'ds:shadow-[var(--shadow-chrome-up)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n />\n );\n },\n);\nSidebarFooter.displayName = 'SidebarFooter';\n\n/* -------------------------------------------------------------------- */\n/* Section */\n/* -------------------------------------------------------------------- */\n\nexport interface SidebarSectionProps extends ComponentPropsWithoutRef<'div'> {\n /** Section label shown in expanded / overlay modes. */\n label?: string;\n /**\n * Optional leading glyph rendered inline with the section label. Stays\n * visible in `icon` mode (when the label collapses to `sr-only`) so the\n * user still has a visual grouping cue. Decorative — the label carries\n * the accessible name, so the icon slot is `aria-hidden`.\n */\n icon?: ReactNode;\n /**\n * Make the label an accordion trigger that collapses its children.\n * @default true\n */\n collapsible?: boolean;\n /** Uncontrolled default open state for the accordion. @default true */\n defaultOpen?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Fires when the accordion opens / closes. */\n onOpenChange?: (open: boolean) => void;\n}\n\nconst sectionLabelClasses = [\n 'group/section-label flex w-full items-center',\n 'type-eyebrow',\n 'text-[var(--muted-foreground)]',\n 'ps-[var(--spacing-sm)] pe-[var(--spacing-sm)]',\n 'py-[var(--spacing-xs)]',\n 'hover:text-[var(--foreground)]',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n].join(' ');\n\n// Leading icon rendered inside a section header (accordion trigger or plain\n// heading). `--accent` keeps it in the same tint as item-level icons so the\n// header reads as a grouping cue, not a control. `aria-hidden` because the\n// label carries the accessible name.\nconst sectionIconClasses = [\n 'inline-flex shrink-0 items-center justify-center',\n 'size-4',\n 'text-[var(--accent)]',\n 'me-[var(--spacing-xs)]',\n].join(' ');\n\nconst SidebarSection = forwardRef<HTMLDivElement, SidebarSectionProps>(\n (\n {\n label,\n icon,\n collapsible = true,\n defaultOpen = true,\n open,\n onOpenChange,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const { mode } = useSidebar();\n const isIconMode = mode === 'icon';\n // Collapsing the section in icon mode hides icons the user needs for\n // navigation — skip the accordion behaviour there.\n const isAccordion = collapsible && !isIconMode && Boolean(label);\n\n const wrapperClasses = [\n 'flex flex-col',\n 'gap-[var(--spacing-xs)]',\n 'mt-[var(--spacing-sm)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ');\n\n if (!isAccordion) {\n // In icon mode, if there's no icon and no label to render, skip the\n // heading altogether. If there is an icon, it stays visible as the\n // grouping cue and the label collapses to sr-only.\n const hasHeading = Boolean(label) || Boolean(icon);\n return (\n <div ref={ref} className={wrapperClasses} {...rest}>\n {hasHeading ? (\n <span\n className={[\n 'ds:flex ds:items-center',\n 'type-eyebrow',\n 'ds:text-[var(--muted-foreground)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:py-[var(--spacing-xs)]',\n isIconMode && !icon ? 'ds:sr-only' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {icon ? (\n <span aria-hidden=\"true\" className={sectionIconClasses}>\n {icon}\n </span>\n ) : null}\n {label ? (\n <span className={isIconMode ? 'ds:sr-only' : ''}>{label}</span>\n ) : null}\n </span>\n ) : null}\n {children}\n </div>\n );\n }\n\n // Use the Radix Accordion primitive + the DS `AccordionContent`\n // component so the sidebar inherits the exact open/close animation\n // defined in `accordion.tsx` (`accordion-down` / `accordion-up`\n // keyframes). Any tweak there propagates here automatically.\n const accordionValue = 'section';\n return (\n <RadixAccordion.Root\n type=\"single\"\n collapsible\n defaultValue={\n open === undefined && defaultOpen ? accordionValue : undefined\n }\n value={open === undefined ? undefined : open ? accordionValue : ''}\n onValueChange={\n onOpenChange ? (v) => onOpenChange(v === accordionValue) : undefined\n }\n asChild\n >\n <div ref={ref} className={wrapperClasses} {...rest}>\n <RadixAccordion.Item value={accordionValue}>\n <RadixAccordion.Header className=\"ds:flex\">\n <RadixAccordion.Trigger className={sectionLabelClasses}>\n {icon ? (\n <span aria-hidden=\"true\" className={sectionIconClasses}>\n {icon}\n </span>\n ) : null}\n <span className=\"ds:flex-1 ds:text-start\">{label}</span>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-3 ds:transition-transform ds:group-data-[state=open]/section-label:rotate-90 ds:rtl:-scale-x-100 ds:motion-reduce:transition-none\"\n />\n </RadixAccordion.Trigger>\n </RadixAccordion.Header>\n <AccordionContent\n aria-label={label}\n // Flatten the inner padding wrapper AccordionContent adds —\n // the sidebar sections don't want the 16px padding block\n // that Accordion cards use. `display: contents` strips the\n // wrapper from layout so our children flow directly into\n // the flex column with the gap we set here.\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)] ds:[&>div]:contents\"\n >\n {children}\n </AccordionContent>\n </RadixAccordion.Item>\n </div>\n </RadixAccordion.Root>\n );\n },\n);\nSidebarSection.displayName = 'SidebarSection';\n\n/* -------------------------------------------------------------------- */\n/* Group (collapsible) */\n/* -------------------------------------------------------------------- */\n\nexport interface SidebarGroupProps\n extends ComponentPropsWithoutRef<typeof RadixCollapsible.Root> {\n /** Visible label for the group trigger. */\n label: string;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nconst groupTriggerClasses = [\n 'group flex w-full items-center gap-[var(--spacing-sm)]',\n 'min-h-[var(--min-target-size)]',\n 'ps-[var(--spacing-sm)] pe-[var(--spacing-sm)]',\n 'rounded-[var(--radius-sm)]',\n 'text-[var(--foreground)] text-[var(--font-size-sm)]',\n 'font-[var(--font-weight-medium)]',\n 'hover:bg-[var(--muted)]/20',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n].join(' ');\n\nconst SidebarGroup = forwardRef<HTMLDivElement, SidebarGroupProps>(\n ({ label, icon, children, className, defaultOpen, open, onOpenChange, ...rest }, ref) => {\n const { mode } = useSidebar();\n return (\n <RadixCollapsible.Root\n ref={ref}\n defaultOpen={defaultOpen}\n open={open}\n onOpenChange={onOpenChange}\n className={className}\n {...rest}\n >\n <RadixCollapsible.Trigger className={groupTriggerClasses}>\n {icon ? (\n <span\n aria-hidden=\"true\"\n className=\"ds:inline-flex ds:items-center ds:text-[var(--accent)]\"\n >\n {icon}\n </span>\n ) : null}\n <span\n className={[\n 'ds:flex-1 ds:text-start',\n mode === 'icon' ? 'ds:sr-only' : '',\n ].join(' ')}\n >\n {label}\n </span>\n {mode !== 'icon' ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:transition-transform ds:group-data-[state=open]:rotate-90 ds:rtl:-scale-x-100 ds:motion-reduce:transition-none\"\n />\n ) : null}\n </RadixCollapsible.Trigger>\n <RadixCollapsible.Content\n className={[\n 'ds:overflow-hidden',\n 'ds:data-[state=open]:animate-in ds:data-[state=closed]:animate-out',\n 'ds:motion-reduce:animate-none',\n 'ds:ps-[var(--spacing-md)]',\n ].join(' ')}\n >\n {children}\n </RadixCollapsible.Content>\n </RadixCollapsible.Root>\n );\n },\n);\nSidebarGroup.displayName = 'SidebarGroup';\n\n/* -------------------------------------------------------------------- */\n/* Item */\n/* -------------------------------------------------------------------- */\n\nconst itemClasses = cva(\n [\n // Every row is a pin-hover parent so inline pin / reorder affordances can\n // fade in on hover of the whole row — keep `group/item` on this selector.\n // `!text-[var(--foreground)]` forces the label colour over the browser's\n // default `<a>` link colour (blue-violet) and any inherited hue. The\n // active variant also uses `!text-*` so it still wins when needed.\n 'ds:group/item ds:relative ds:flex ds:items-center',\n 'ds:gap-[var(--spacing-sm)]',\n 'ds:no-underline ds:!text-[var(--foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:hover:bg-[var(--muted)]/12',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n '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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n mode: {\n expanded: [\n 'ds:min-h-[var(--min-target-size)] ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n ].join(' '),\n // Icon-only: each item is a 44×44 pill tile centered in the rail.\n // The active / hover background fills just the tile rather than the\n // whole row — matching Linear / Asana chrome.\n icon: [\n 'ds:justify-center ds:ms-auto ds:me-auto',\n 'ds:w-[var(--min-target-size)] ds:h-[var(--min-target-size)]',\n 'ds:ps-0 ds:pe-0 ds:rounded-[var(--radius-md)]',\n ].join(' '),\n overlay: [\n 'ds:min-h-[var(--min-target-size)] ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n ].join(' '),\n },\n density: {\n default: '',\n compact: 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n },\n isActive: {\n // Filled pill — multi-carrier (bg + text + weight + aria-current at\n // render time) so colour is never the sole identifier. `!text-*`\n // forces the foreground over any inherited / base rule so the icon\n // and label read clearly against the primary fill in every theme.\n true: [\n 'ds:bg-[var(--primary)] ds:!text-[var(--primary-foreground)]',\n 'ds:font-[var(--font-weight-semibold)]',\n // Keep hover from dimming the active fill.\n 'ds:hover:bg-[var(--primary)]',\n ].join(' '),\n false: '',\n },\n },\n defaultVariants: {\n mode: 'expanded',\n density: 'default',\n isActive: false,\n },\n },\n);\n\nexport interface SidebarItemProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Mark the item as the current page (`aria-current='page'`). */\n isActive?: boolean;\n /** Render through Radix `Slot` so a router link can take over. */\n asChild?: boolean;\n /**\n * Whether this item is currently pinned to Favourites. Only consulted\n * when `onPinChange` is supplied.\n */\n isPinned?: boolean;\n /**\n * Fires with the new pinned state when the user clicks the star. Passing\n * this prop opts the row into the always-on pin affordance — a star\n * outline fades in on row hover / focus and fills when pinned. Hidden in\n * icon-only mode where there is no room for trailing controls.\n */\n onPinChange?: (next: boolean) => void;\n /** Accessible label for the pin button. Defaults to the item's `aria-label`. */\n pinLabel?: string;\n}\n\nconst SidebarItem = forwardRef<HTMLAnchorElement, SidebarItemProps>(\n (\n {\n asChild = false,\n isActive = false,\n isPinned = false,\n onPinChange,\n pinLabel,\n className,\n children,\n 'aria-label': ariaLabel,\n ...rest\n },\n ref,\n ) => {\n const { mode, density } = useSidebar();\n const Comp = asChild ? Slot : 'a';\n const showPin = onPinChange !== undefined && mode !== 'icon';\n\n const anchor = (\n <Comp\n ref={ref as never}\n aria-current={isActive ? 'page' : undefined}\n aria-label={ariaLabel}\n className={itemClasses({\n mode,\n density,\n isActive,\n className: showPin ? 'flex-1 min-w-0' : className,\n })}\n {...rest}\n >\n {children}\n </Comp>\n );\n\n const body = showPin ? (\n <div\n className={[\n 'ds:group/item ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {anchor}\n <SidebarPinButton\n isPinned={isPinned}\n label={pinLabel ?? ariaLabel ?? ''}\n onPinChange={onPinChange}\n />\n </div>\n ) : (\n anchor\n );\n\n // In icon-only mode, wrap the item in a Radix Tooltip showing the label.\n if (mode === 'icon' && ariaLabel) {\n return (\n <RadixTooltip.Root>\n <RadixTooltip.Trigger asChild>{body}</RadixTooltip.Trigger>\n <RadixTooltip.Portal>\n <RadixTooltip.Content\n side=\"right\"\n sideOffset={6}\n className={[\n 'ds:z-[var(--z-tooltip)] ds:max-w-[16rem]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--foreground)] ds:text-[var(--background)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)] ds:text-[length:var(--font-size-xs)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95 ds:motion-reduce:animate-none',\n ].join(' ')}\n >\n {ariaLabel}\n <RadixTooltip.Arrow className=\"ds:fill-[var(--foreground)]\" />\n </RadixTooltip.Content>\n </RadixTooltip.Portal>\n </RadixTooltip.Root>\n );\n }\n\n return body;\n },\n);\nSidebarItem.displayName = 'SidebarItem';\n\n/* -------------------------------------------------------------------- */\n/* Item slots — Icon, Label, Badge */\n/* -------------------------------------------------------------------- */\n\nconst SidebarItemIcon = forwardRef<HTMLSpanElement, ComponentPropsWithoutRef<'span'>>(\n ({ className, children, ...rest }, ref) => (\n <span\n ref={ref}\n aria-hidden=\"true\"\n className={[\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:size-5',\n // Icons carry the accent tint by default so the rail reads less\n // monotone against the violet active pill. The active row sets\n // `aria-current=\"page\"` on the anchor (which is `group/item`), so\n // the icon flips to the primary-foreground (white) on the filled\n // pill — keeping it readable on the primary background.\n 'ds:text-[var(--accent)]',\n 'ds:group-aria-[current=page]/item:text-[var(--primary-foreground)]',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </span>\n ),\n);\nSidebarItemIcon.displayName = 'SidebarItemIcon';\n\nconst SidebarItemLabel = forwardRef<HTMLSpanElement, ComponentPropsWithoutRef<'span'>>(\n ({ className, children, ...rest }, ref) => {\n const { mode } = useSidebar();\n return (\n <span\n ref={ref}\n className={[\n 'ds:flex-1',\n 'ds:overflow-hidden ds:text-ellipsis ds:whitespace-nowrap ds:break-normal',\n 'ds:text-start',\n mode === 'icon' ? 'ds:sr-only' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </span>\n );\n },\n);\nSidebarItemLabel.displayName = 'SidebarItemLabel';\n\nconst SidebarItemBadge = forwardRef<HTMLSpanElement, ComponentPropsWithoutRef<'span'>>(\n ({ className, children, ...rest }, ref) => {\n const { mode } = useSidebar();\n const isIcon = mode === 'icon';\n // --accent on a light surface is magenta-500 (~3.2:1 on white) and\n // fails WCAG AA for `--font-size-xs` text per 05-accessibility §Accent.\n // Use --primary + its token-paired foreground so contrast is preserved\n // in every theme.\n //\n // In icon mode the pill collapses to a compact presence indicator: a\n // 10×10 dot perched on the top-end of the icon tile with a background-\n // coloured ring so it reads against any row fill. The numeric count is\n // hidden visually but stays in the accessible name via an sr-only span.\n return (\n <span\n ref={ref}\n aria-hidden={isIcon ? 'true' : undefined}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:font-[var(--font-weight-semibold)]',\n isIcon\n ? [\n 'ds:absolute ds:top-[2px] ds:end-[2px]',\n 'ds:min-w-0 ds:size-[10px] ds:ps-0 ds:pe-0',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--primary)] ds:text-transparent',\n 'ds:ring-2 ds:ring-[var(--background)]',\n 'ds:pointer-events-none',\n ].join(' ')\n : [\n 'ds:min-w-[var(--spacing-lg)] ds:h-[var(--spacing-lg)]',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:text-[length:var(--font-size-xs)]',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)]',\n ].join(' '),\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </span>\n );\n },\n);\nSidebarItemBadge.displayName = 'SidebarItemBadge';\n\n/* -------------------------------------------------------------------- */\n/* Modern-only compound pieces */\n/* */\n/* These components ship styling that matches the modern aesthetic. */\n/* They are INTERACTION STUBS — they render the correct chrome but do */\n/* not open a DropdownMenu, because the DS <DropdownMenu> wrapper does */\n/* not exist yet (see review-findings/component-cohesion.mdx). Consumers */\n/* wire their own Radix DropdownMenu around these triggers until the DS */\n/* wrapper lands. Do NOT add aria-haspopup here — it would announce a */\n/* menu that never opens (screen-reader lie). */\n/* -------------------------------------------------------------------- */\n\nconst workspaceSwitcherClasses = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-[var(--foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:hover:bg-[var(--muted)]/20',\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:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:no-underline',\n ].join(' '),\n);\n\nexport interface SidebarWorkspaceSwitcherProps\n extends ComponentPropsWithoutRef<'button'> {\n /** Workspace glyph — square <Avatar>, <img>, or <svg>. Required. */\n logo: ReactNode;\n /** Workspace name. Hidden in icon mode; always the accessible name. */\n name: string;\n /** Trailing chevron for the dropdown affordance. Defaults to true. */\n showChevron?: boolean;\n}\n\nconst SidebarWorkspaceSwitcher = forwardRef<\n HTMLButtonElement,\n SidebarWorkspaceSwitcherProps\n>(({ logo, name, showChevron = true, className, ...rest }, ref) => {\n const { mode } = useSidebar();\n const showLabel = mode !== 'icon';\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={name}\n className={[workspaceSwitcherClasses(), className].filter(Boolean).join(' ')}\n {...rest}\n >\n <span aria-hidden=\"true\" className=\"ds:inline-flex ds:items-center ds:shrink-0\">\n {logo}\n </span>\n {showLabel ? (\n <>\n <span\n className=\"ds:truncate ds:flex-1 ds:text-start ds:max-w-[var(--header-workspace-max-inline-size)]\"\n >\n {name}\n </span>\n {showChevron ? (\n <ChevronRight\n aria-hidden=\"true\"\n className=\"ds:size-4 ds:shrink-0 ds:rotate-90\"\n />\n ) : null}\n </>\n ) : null}\n </button>\n );\n});\nSidebarWorkspaceSwitcher.displayName = 'SidebarWorkspaceSwitcher';\n\n/* -- Primary action slot -------------------------------------------- */\n\nconst primaryActionClasses = cva(\n [\n 'ds:flex ds:items-center ds:justify-center ds:gap-[var(--spacing-xs)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:font-[var(--font-weight-semibold)] ds:text-[length:var(--font-size-sm)]',\n 'ds:hover:bg-[var(--primary-hover)]',\n 'ds:transition-colors 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-[var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n ].join(' '),\n {\n variants: {\n mode: {\n expanded: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n icon: 'ds:ps-0 ds:pe-0 ds:w-[var(--sidebar-modern-tile)] ds:h-[var(--sidebar-modern-tile)] ds:ms-auto ds:me-auto',\n overlay: 'ds:ps-[var(--spacing-md)] ds:pe-[var(--spacing-md)]',\n },\n },\n defaultVariants: { mode: 'expanded' },\n },\n);\n\nexport interface SidebarPrimaryActionProps\n extends ComponentPropsWithoutRef<'button'> {\n icon: ReactNode;\n /** Button label — hidden in icon mode, always the accessible name. */\n label: string;\n /** Optional keyboard shortcut displayed on inline-end in expanded mode. */\n shortcut?: string;\n}\n\nconst SidebarPrimaryAction = forwardRef<\n HTMLButtonElement,\n SidebarPrimaryActionProps\n>(({ icon, label, shortcut, className, ...rest }, ref) => {\n const { mode } = useSidebar();\n const showLabel = mode !== 'icon';\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={label}\n aria-keyshortcuts={shortcut}\n className={[primaryActionClasses({ mode }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n <span aria-hidden=\"true\" className=\"ds:inline-flex ds:size-4 ds:items-center ds:justify-center\">\n {icon}\n </span>\n {showLabel ? (\n <>\n <span className=\"ds:truncate\">{label}</span>\n {shortcut ? (\n <kbd className=\"ds:ms-auto ds:text-[length:var(--font-size-xs)] ds:font-[family-name:var(--font-mono)] ds:opacity-80\">\n {shortcut}\n </kbd>\n ) : null}\n </>\n ) : null}\n </button>\n );\n});\nSidebarPrimaryAction.displayName = 'SidebarPrimaryAction';\n\n/* -- Pin button ----------------------------------------------------- */\n\n/**\n * Toggleable star button used to pin / unpin a nav item to the Favorites\n * section. Rendered inline alongside a `SidebarItem`'s content — hidden in\n * icon mode (pin affordances only make sense when the full row is visible).\n *\n * Controlled via `isPinned` + `onPinChange`. The consumer owns the list of\n * pinned items and mirrors them into `<SidebarFavorites>`.\n */\nexport interface SidebarPinButtonProps\n extends Omit<ComponentPropsWithoutRef<'button'>, 'onChange'> {\n /** Whether the associated item is currently pinned. */\n isPinned: boolean;\n /** Fires with the new pinned state. */\n onPinChange?: (next: boolean) => void;\n /**\n * Accessible label that names what is being pinned — e.g. the item's\n * label. Required so screen-readers can tell pin buttons apart.\n */\n label: string;\n}\n\nconst pinButtonClasses = [\n 'inline-flex items-center justify-center shrink-0',\n 'size-6 rounded-[var(--radius-sm)]',\n // Pin stars carry the accent tint to match every other icon in the rail.\n // Stays quiet via opacity — reveals only on row hover / focus.\n 'text-[var(--accent)]',\n 'opacity-0 group-hover/item:opacity-100 focus-visible:opacity-100',\n 'hover:bg-[var(--muted)]/20',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'forced-colors:focus-visible:outline-[CanvasText]',\n 'transition-[color,opacity,background-color] duration-[var(--animation-duration)]',\n 'motion-reduce:transition-none',\n].join(' ');\n\nconst SidebarPinButton = forwardRef<HTMLButtonElement, SidebarPinButtonProps>(\n (\n { isPinned, onPinChange, label, className, onClick, ...rest },\n ref,\n ) => {\n const { t } = useTranslation();\n const { mode } = useSidebar();\n if (mode === 'icon') return null;\n const accessibleLabel = isPinned\n ? t('ui.navigation.sidebar.unpinItem', 'Unpin {{label}}', { label })\n : t('ui.navigation.sidebar.pinItem', 'Pin {{label}}', { label });\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={accessibleLabel}\n aria-pressed={isPinned}\n className={[pinButtonClasses, className].filter(Boolean).join(' ')}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onPinChange?.(!isPinned);\n onClick?.(event);\n }}\n {...rest}\n >\n <Star\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n fill={isPinned ? 'currentColor' : 'none'}\n />\n </button>\n );\n },\n);\nSidebarPinButton.displayName = 'SidebarPinButton';\n\n/* -- Favorites — reorderable section -------------------------------- */\n\ninterface SidebarFavoritesContextValue {\n onReorder?: (from: number, to: number) => void;\n count: number;\n dragSource: number | null;\n setDragSource: (index: number | null) => void;\n announce: (message: string) => void;\n}\n\nconst SidebarFavoritesContext =\n createContext<SidebarFavoritesContextValue | null>(null);\n\nconst useFavoritesContext = () => useContext(SidebarFavoritesContext);\n\n/**\n * Renders `<SidebarSection heading={t('ui.sidebar.favorites')}>` with an\n * empty-state prompt when no children are supplied. When `onReorder` is\n * provided, children rendered as `<SidebarFavoriteItem>` become drag-and-drop\n * and keyboard reorderable (Alt+↑ / Alt+↓).\n */\nexport interface SidebarFavoritesProps extends ComponentPropsWithoutRef<'div'> {\n heading?: string;\n /** Shown when `children` is empty. */\n emptyMessage?: string;\n /**\n * Called when a favorite item is moved from `from` index to `to` index.\n * Providing this opts the section into drag-and-drop + keyboard reorder.\n */\n onReorder?: (from: number, to: number) => void;\n}\n\nconst SidebarFavorites = forwardRef<HTMLDivElement, SidebarFavoritesProps>(\n (\n { heading, emptyMessage, onReorder, className, children, ...rest },\n ref,\n ) => {\n const { t } = useTranslation();\n const resolvedHeading =\n heading ?? t('ui.navigation.sidebar.favorites', 'Favourites');\n const childArray = Array.isArray(children)\n ? children.filter(Boolean)\n : children\n ? [children]\n : [];\n const count = childArray.length;\n const hasChildren = count > 0;\n const [dragSource, setDragSource] = useState<number | null>(null);\n const [liveMessage, setLiveMessage] = useState('');\n // Re-emit identical announcements by toggling an invisible suffix so\n // screen-readers treat repeated moves as distinct.\n const announceToggle = useRef(false);\n const announce = useCallback((message: string) => {\n announceToggle.current = !announceToggle.current;\n setLiveMessage(\n announceToggle.current ? message : `${message}\\u200b`,\n );\n }, []);\n\n const value = useMemo<SidebarFavoritesContextValue>(\n () => ({ onReorder, count, dragSource, setDragSource, announce }),\n [onReorder, count, dragSource, announce],\n );\n\n // When there are no pinned items, render nothing by default — no\n // heading, no empty-state copy. Consumers that want an explicit empty\n // state can pass `emptyMessage` to opt in.\n if (!hasChildren && !emptyMessage) return null;\n\n return (\n <SidebarFavoritesContext.Provider value={value}>\n <SidebarSection\n ref={ref}\n label={resolvedHeading}\n className={className}\n {...rest}\n >\n {hasChildren ? (\n childArray\n ) : (\n <p className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] type-meta ds:text-[color:var(--muted-foreground)]\">\n {emptyMessage}\n </p>\n )}\n <span role=\"status\" aria-live=\"polite\" className=\"ds:sr-only\">\n {liveMessage}\n </span>\n </SidebarSection>\n </SidebarFavoritesContext.Provider>\n );\n },\n);\nSidebarFavorites.displayName = 'SidebarFavorites';\n\n/* -- Favorite item with drag handle + keyboard reorder -------------- */\n\nexport interface SidebarFavoriteItemProps extends SidebarItemProps {\n /** Zero-based position of this item within its `<SidebarFavorites>`. */\n index: number;\n /**\n * Accessible name used by the drag handle and live-region announcements.\n * Defaults to the `aria-label` of the underlying `SidebarItem`.\n */\n reorderLabel?: string;\n}\n\nconst favoriteRowClasses = cva(\n [\n 'ds:group/item ds:relative ds:flex ds:items-center ds:gap-[var(--spacing-2xs)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:transition-colors ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n ].join(' '),\n {\n variants: {\n dragging: {\n true: 'ds:opacity-60',\n false: '',\n },\n dropTarget: {\n true: 'ds:outline-[length:var(--focus-ring-width)] ds:outline-dashed ds:outline-[var(--primary)] ds:outline-offset-[-2px]',\n false: '',\n },\n },\n defaultVariants: { dragging: false, dropTarget: false },\n },\n);\n\nconst dragHandleClasses = [\n 'inline-flex items-center justify-center shrink-0',\n 'size-6 rounded-[var(--radius-sm)]',\n 'cursor-grab active:cursor-grabbing',\n 'text-[var(--muted-foreground)]',\n // Quiet chrome — only reveal the grip when the row is hovered or the\n // handle itself is focused (keyboard / AT). Matches the pin-star's\n // reveal-on-hover behaviour so the two siblings appear together.\n 'opacity-0 group-hover/item:opacity-100 focus-visible:opacity-100',\n 'hover:bg-[var(--muted)]/20 hover:text-[var(--foreground)]',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'forced-colors:focus-visible:outline-[CanvasText]',\n 'transition-[color,opacity,background-color] duration-[var(--animation-duration)] motion-reduce:transition-none',\n].join(' ');\n\nconst SidebarFavoriteItem = forwardRef<\n HTMLAnchorElement,\n SidebarFavoriteItemProps\n>(\n (\n {\n index,\n isActive = false,\n asChild = false,\n reorderLabel,\n isPinned = false,\n onPinChange,\n pinLabel,\n 'aria-label': ariaLabel,\n className,\n children,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const { mode } = useSidebar();\n const favorites = useFavoritesContext();\n const [isDropTarget, setIsDropTarget] = useState(false);\n const canReorder = Boolean(favorites?.onReorder) && mode !== 'icon';\n const label = reorderLabel ?? ariaLabel ?? '';\n const handleId = useId();\n\n const moveFromTo = (from: number, to: number) => {\n if (!favorites?.onReorder) return;\n const clamped = Math.max(0, Math.min(favorites.count - 1, to));\n if (clamped === from) return;\n favorites.onReorder(from, clamped);\n favorites.announce(\n t(\n 'ui.navigation.sidebar.reorderAnnounce',\n '{{label}} moved to position {{to}} of {{total}}',\n { label, to: clamped + 1, total: favorites.count },\n ),\n );\n };\n\n const onHandleKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (!canReorder) return;\n if (event.altKey && event.key === 'ArrowUp') {\n event.preventDefault();\n moveFromTo(index, index - 1);\n } else if (event.altKey && event.key === 'ArrowDown') {\n event.preventDefault();\n moveFromTo(index, index + 1);\n } else if (event.key === 'Home' && event.altKey) {\n event.preventDefault();\n moveFromTo(index, 0);\n } else if (event.key === 'End' && event.altKey) {\n event.preventDefault();\n moveFromTo(index, favorites!.count - 1);\n }\n };\n\n const onDragStart = (event: ReactMouseEvent & { dataTransfer?: DataTransfer }) => {\n if (!canReorder) return;\n favorites?.setDragSource(index);\n if (event.dataTransfer) {\n event.dataTransfer.effectAllowed = 'move';\n // Firefox requires data to initiate a drag.\n event.dataTransfer.setData('text/plain', String(index));\n }\n };\n\n const onDragEnd = () => {\n favorites?.setDragSource(null);\n setIsDropTarget(false);\n };\n\n const onDragOver = (event: ReactMouseEvent & { dataTransfer?: DataTransfer }) => {\n if (!canReorder || favorites?.dragSource === null) return;\n event.preventDefault();\n if (event.dataTransfer) event.dataTransfer.dropEffect = 'move';\n setIsDropTarget(true);\n };\n\n const onDragLeave = () => setIsDropTarget(false);\n\n const onDrop = (event: ReactMouseEvent) => {\n if (!canReorder) return;\n event.preventDefault();\n const source = favorites?.dragSource;\n setIsDropTarget(false);\n if (source === null || source === undefined || source === index) return;\n moveFromTo(source, index);\n };\n\n const isDragging = favorites?.dragSource === index;\n\n return (\n <div\n className={favoriteRowClasses({\n dragging: isDragging,\n dropTarget: isDropTarget && !isDragging,\n })}\n // Drag the whole row — the grip is a visual + keyboard affordance,\n // not the sole drag target. Buttons don't start HTML5 drags reliably\n // in every browser, so we mount the drag events on the row wrapper.\n draggable={canReorder || undefined}\n onDragStart={\n canReorder\n ? (onDragStart as unknown as (e: ReactMouseEvent<HTMLDivElement>) => void)\n : undefined\n }\n onDragEnd={canReorder ? onDragEnd : undefined}\n onDragOver={onDragOver as unknown as (e: ReactMouseEvent<HTMLDivElement>) => void}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <SidebarItem\n ref={ref}\n isActive={isActive}\n asChild={asChild}\n aria-label={ariaLabel}\n aria-describedby={canReorder ? handleId : undefined}\n // Links and images are `draggable=auto` by default — without this\n // the browser would fire its native link-drag before our row-level\n // drag, and our reorder would never start.\n draggable={canReorder ? false : undefined}\n className={[\n canReorder ? 'ds:flex-1 ds:min-w-0' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {children}\n </SidebarItem>\n {canReorder ? (\n <button\n type=\"button\"\n id={handleId}\n aria-label={t(\n 'ui.navigation.sidebar.reorderHandle',\n 'Reorder {{label}}. Press Alt + Up or Alt + Down to move.',\n { label },\n )}\n className={dragHandleClasses}\n onKeyDown={onHandleKeyDown}\n >\n <GripVertical aria-hidden=\"true\" className=\"ds:size-4\" />\n </button>\n ) : null}\n {onPinChange && mode !== 'icon' ? (\n <SidebarPinButton\n isPinned={isPinned}\n label={pinLabel ?? ariaLabel ?? ''}\n onPinChange={onPinChange}\n />\n ) : null}\n </div>\n );\n },\n);\nSidebarFavoriteItem.displayName = 'SidebarFavoriteItem';\n\n/* -- Profile pill at the block-end --------------------------------- */\n\nconst profilePillClasses = cva(\n [\n 'ds:flex ds:items-center ds:gap-[var(--spacing-sm)]',\n 'ds:min-h-[var(--min-target-size)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)]',\n 'ds:rounded-[var(--radius-md)]',\n 'ds:text-[var(--foreground)] ds:text-[length:var(--font-size-sm)]',\n 'ds:hover:bg-[var(--muted)]/20',\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:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:no-underline',\n ].join(' '),\n);\n\nexport interface SidebarProfilePillProps\n extends ComponentPropsWithoutRef<'button'> {\n /** Avatar or other identifying glyph. Required. */\n avatar: ReactNode;\n /** User's display name — hidden in icon mode, always the accessible name. */\n name: string;\n /**\n * Secondary line (e.g. selected studio, \"Owner\", \"Admin\"). Accepts arbitrary\n * JSX so an icon can sit inline with the text. Hidden in icon mode.\n */\n subtitle?: ReactNode;\n /**\n * Plain-text form of the subtitle for the accessible name. Required when\n * `subtitle` is not a string; ignored otherwise.\n */\n subtitleLabel?: string;\n}\n\nconst SidebarProfilePill = forwardRef<\n HTMLButtonElement,\n SidebarProfilePillProps\n>(({ avatar, name, subtitle, subtitleLabel, className, ...rest }, ref) => {\n const { mode } = useSidebar();\n const showLabel = mode !== 'icon';\n const accessibleSubtitle =\n typeof subtitle === 'string' ? subtitle : subtitleLabel;\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-label={\n accessibleSubtitle ? `${name}, ${accessibleSubtitle}` : name\n }\n // No `aria-haspopup` here until a DropdownMenu is wired — announcing\n // a menu that never opens is a screen-reader lie. Consumers wrap\n // this trigger in their own Radix DropdownMenu.\n className={[profilePillClasses(), className].filter(Boolean).join(' ')}\n {...rest}\n >\n <span aria-hidden=\"true\" className=\"ds:inline-flex ds:items-center ds:shrink-0\">\n {avatar}\n </span>\n {showLabel ? (\n <span className=\"ds:flex-1 ds:min-w-0 ds:text-start\">\n <span className=\"ds:block ds:truncate type-label\">{name}</span>\n {subtitle ? (\n typeof subtitle === 'string' ? (\n <span className=\"ds:block ds:truncate type-meta ds:text-[color:var(--muted-foreground)]\">\n {subtitle}\n </span>\n ) : (\n <span className=\"ds:flex ds:items-center ds:gap-[length:var(--spacing-xs)] ds:min-w-0 type-meta ds:text-[color:var(--muted-foreground)]\">\n {subtitle}\n </span>\n )\n ) : null}\n </span>\n ) : null}\n </button>\n );\n});\nSidebarProfilePill.displayName = 'SidebarProfilePill';\n\n/* -------------------------------------------------------------------- */\n/* Collapse trigger */\n/* */\n/* Full-width nav-item-style toggle that swaps between `expanded` and */\n/* `icon` modes. A compact 44×44 icon-only button — drop it inline next */\n/* to the profile pill, Settings row, or anywhere else. Accessible name */\n/* comes from the i18n collapse / expand string; a tooltip shows the */\n/* same text on hover / focus so sighted users don't have to guess. */\n/* */\n/* Hidden in `overlay` mode (overlay has its own close button). */\n/* -------------------------------------------------------------------- */\n\nexport interface SidebarCollapseTriggerProps\n extends ComponentPropsWithoutRef<'button'> {\n /** Override the accessible label. Defaults to the i18n collapse/expand string. */\n 'aria-label'?: string;\n}\n\nconst collapseTriggerClasses = [\n 'inline-flex items-center justify-center shrink-0',\n 'min-w-[var(--min-target-size)] min-h-[var(--min-target-size)]',\n 'rounded-[var(--radius-sm)]',\n 'text-[var(--muted-foreground)]',\n 'hover:bg-[var(--muted)]/20 hover:text-[var(--foreground)]',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'forced-colors:focus-visible:outline-[CanvasText]',\n 'transition-colors duration-[var(--animation-duration)] motion-reduce:transition-none',\n].join(' ');\n\nconst SidebarCollapseTrigger = forwardRef<\n HTMLButtonElement,\n SidebarCollapseTriggerProps\n>(\n (\n { className, 'aria-label': ariaLabel, onClick, ...rest },\n ref,\n ) => {\n const { t } = useTranslation();\n const { mode, transitionTo } = useSidebar();\n\n if (mode === 'overlay') return null;\n\n const isExpanded = mode === 'expanded';\n const accessibleLabel =\n ariaLabel ??\n (isExpanded\n ? t('ui.navigation.sidebar.collapse', 'Collapse sidebar')\n : t('ui.navigation.sidebar.expand', 'Expand sidebar'));\n\n const button = (\n <button\n ref={ref}\n type=\"button\"\n aria-label={accessibleLabel}\n aria-expanded={isExpanded}\n onClick={(event) => {\n transitionTo?.(isExpanded ? 'icon' : 'expanded');\n onClick?.(event);\n }}\n className={[collapseTriggerClasses, className].filter(Boolean).join(' ')}\n {...rest}\n >\n {isExpanded ? (\n <PanelLeftClose aria-hidden=\"true\" className=\"ds:size-4 ds:rtl:-scale-x-100\" />\n ) : (\n <PanelLeftOpen aria-hidden=\"true\" className=\"ds:size-4 ds:rtl:-scale-x-100\" />\n )}\n </button>\n );\n\n return (\n <RadixTooltip.Root>\n <RadixTooltip.Trigger asChild>{button}</RadixTooltip.Trigger>\n <RadixTooltip.Portal>\n <RadixTooltip.Content\n side={mode === 'icon' ? 'right' : 'top'}\n sideOffset={6}\n className={[\n 'ds:z-[var(--z-tooltip)] ds:max-w-[16rem]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:bg-[var(--foreground)] ds:text-[var(--background)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:py-[var(--spacing-xs)] ds:text-[length:var(--font-size-xs)]',\n 'ds:animate-in ds:fade-in ds:zoom-in-95 ds:motion-reduce:animate-none',\n ].join(' ')}\n >\n {accessibleLabel}\n <RadixTooltip.Arrow className=\"ds:fill-[var(--foreground)]\" />\n </RadixTooltip.Content>\n </RadixTooltip.Portal>\n </RadixTooltip.Root>\n );\n },\n);\nSidebarCollapseTrigger.displayName = 'SidebarCollapseTrigger';\n\nexport {\n Sidebar,\n SidebarHeader,\n SidebarBody,\n SidebarFooter,\n SidebarSection,\n SidebarGroup,\n SidebarItem,\n SidebarItemIcon,\n SidebarItemLabel,\n SidebarItemBadge,\n SidebarWorkspaceSwitcher,\n SidebarPrimaryAction,\n SidebarFavorites,\n SidebarFavoriteItem,\n SidebarPinButton,\n SidebarProfilePill,\n SidebarCollapseTrigger,\n};\n"],"names":["__iconNode","GripVertical","createLucideIcon","PanelLeftClose","PanelLeftOpen","Star","SidebarContext","createContext","useSidebar","useContext","STORAGE_KEY","readStoredState","defaultMode","v","writeStoredState","value","usePersistentState","storageKey","initial","setValue","useState","raw","useEffect","railClasses","cva","Sidebar","forwardRef","state","defaultState","onStateChange","density","open","onOpenChange","ariaLabel","className","children","rest","ref","t","useTranslation","isControlled","internalState","setInternalState","resolved","transitionTo","useCallback","next","label","jsx","RadixDialog","jsxs","X","RadixTooltip","SidebarHeader","mode","SidebarBody","SidebarFooter","sectionLabelClasses","sectionIconClasses","SidebarSection","icon","collapsible","defaultOpen","isIconMode","isAccordion","wrapperClasses","accordionValue","RadixAccordion","ChevronRight","AccordionContent","groupTriggerClasses","SidebarGroup","RadixCollapsible","itemClasses","SidebarItem","asChild","isActive","isPinned","onPinChange","pinLabel","Comp","Slot","showPin","anchor","body","SidebarPinButton","SidebarItemIcon","SidebarItemLabel","SidebarItemBadge","isIcon","workspaceSwitcherClasses","SidebarWorkspaceSwitcher","logo","name","showChevron","showLabel","Fragment","primaryActionClasses","SidebarPrimaryAction","shortcut","pinButtonClasses","onClick","accessibleLabel","event","SidebarFavoritesContext","useFavoritesContext","SidebarFavorites","heading","emptyMessage","onReorder","resolvedHeading","childArray","count","hasChildren","dragSource","setDragSource","liveMessage","setLiveMessage","announceToggle","useRef","announce","message","useMemo","favoriteRowClasses","dragHandleClasses","SidebarFavoriteItem","index","reorderLabel","favorites","isDropTarget","setIsDropTarget","canReorder","handleId","useId","moveFromTo","from","to","clamped","onHandleKeyDown","onDragStart","onDragEnd","onDragOver","onDragLeave","onDrop","source","isDragging","profilePillClasses","SidebarProfilePill","avatar","subtitle","subtitleLabel","accessibleSubtitle","collapseTriggerClasses","SidebarCollapseTrigger","isExpanded","button"],"mappings":";;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,KAAK,UAAU;AAAA,EACvD,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,KAAK,UAAU;AAAA,EACtD,CAAC,UAAU,EAAE,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,KAAK,UAAU;AAAA,EACvD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,UAAU;AAAA,EACxD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,KAAK,GAAG,KAAK,KAAK,UAAU;AAAA,EACvD,CAAC,UAAU,EAAE,IAAI,MAAM,IAAI,MAAM,GAAG,KAAK,KAAK,SAAQ,CAAE;AAC1D,GACMC,KAAeC,EAAiB,iBAAiBF,EAAU;ACjBjE;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,SAAQ,CAAE;AAAA,EAC9E,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,kBAAkB,KAAK,SAAQ,CAAE;AACjD,GACMG,KAAiBD,EAAiB,oBAAoBF,EAAU;ACdtE;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB,CAAC,QAAQ,EAAE,OAAO,MAAM,QAAQ,MAAM,GAAG,KAAK,GAAG,KAAK,IAAI,KAAK,KAAK,SAAQ,CAAE;AAAA,EAC9E,CAAC,QAAQ,EAAE,GAAG,WAAW,KAAK,SAAQ,CAAE;AAAA,EACxC,CAAC,QAAQ,EAAE,GAAG,iBAAiB,KAAK,SAAQ,CAAE;AAChD,GACMI,KAAgBF,EAAiB,mBAAmBF,EAAU;ACdpE;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,MAAMA,KAAa;AAAA,EACjB;AAAA,IACE;AAAA,IACA;AAAA,MACE,GAAG;AAAA,MACH,KAAK;AAAA,IACX;AAAA,EACA;AACA,GACMK,KAAOH,EAAiB,QAAQF,EAAU,GC6B1CM,IAAiBC,EAAmC;AAAA,EACxD,MAAM;AAAA,EACN,SAAS;AACX,CAAC,GAEYC,IAAa,MAAMC,EAAWH,CAAc,GAMnDI,IAAc;AAEpB,SAASC,GAAgBC,GAAuC;AAC9D,MAAI,OAAO,SAAW,IAAa,QAAOA;AAC1C,MAAI;AACF,UAAMC,IAAI,OAAO,aAAa,QAAQH,CAAW;AACjD,QAAIG,MAAM,cAAcA,MAAM,UAAUA,MAAM,UAAW,QAAOA;AAAA,EAClE,QAAQ;AAAA,EAER;AACA,SAAOD;AACT;AAEA,SAASE,GAAiBC,GAAoB;AAC5C,MAAI,SAAO,SAAW;AACtB,QAAI;AACF,aAAO,aAAa,QAAQL,GAAaK,CAAK;AAAA,IAChD,QAAQ;AAAA,IAER;AACF;AAiBO,SAASC,GACdC,GACAC,GAC4C;AAC5C,QAAM,CAACH,GAAOI,CAAQ,IAAIC,EAAY,MAAM;AAC1C,QAAI,OAAO,SAAW;AACpB,aAAO,OAAOF,KAAY,aAAcA,EAAA,IAAwBA;AAElE,QAAI;AACF,YAAMG,IAAM,OAAO,aAAa,QAAQJ,CAAU;AAClD,UAAII,MAAQ,KAAM,QAAO,KAAK,MAAMA,CAAG;AAAA,IACzC,QAAQ;AAAA,IAER;AACA,WAAO,OAAOH,KAAY,aAAcA,EAAA,IAAwBA;AAAA,EAClE,CAAC;AAED,SAAAI,EAAU,MAAM;AACd,QAAI,SAAO,SAAW;AACtB,UAAI;AACF,eAAO,aAAa,QAAQL,GAAY,KAAK,UAAUF,CAAK,CAAC;AAAA,MAC/D,QAAQ;AAAA,MAER;AAAA,EACF,GAAG,CAACE,GAAYF,CAAK,CAAC,GAEf,CAACA,GAAOI,CAAQ;AACzB;AAMA,MAAMI,IAAcC;AAAA,EAClB;AAAA,IACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,MAAM;AAAA;AAAA,QAEJ,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MAAA;AAAA,MAEX,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,iBAAiB,EAAE,MAAM,YAAY,SAAS,UAAA;AAAA,EAAU;AAE5D,GAmBMC,KAAUC;AAAA,EACd,CACE;AAAA,IACE,OAAAC;AAAA,IACA,cAAAC,IAAe;AAAA,IACf,eAAAC;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,MAAAC;AAAA,IACA,cAAAC;AAAA,IACA,cAAcC;AAAA,IACd,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRC,IAAeb,MAAU,QACzB,CAACc,GAAeC,CAAgB,IAAItB;AAAA,MAAsB,MAC9DoB,IAAeb,IAAShB,GAAgBiB,CAAY;AAAA,IAAA,GAEhDe,IAAWH,IAAeb,IAASc;AAEzC,IAAAnB,EAAU,MAAM;AACd,MAAKkB,KAAc1B,GAAiB2B,CAAa;AAAA,IACnD,GAAG,CAACA,GAAeD,CAAY,CAAC;AAOhC,UAAMI,IAAeC;AAAA,MACnB,CAACC,MAAsB;AACrB,QAAKN,KAAcE,EAAiBI,CAAI,GACxCjB,KAAA,QAAAA,EAAgBiB;AAAA,MAClB;AAAA,MACA,CAACN,GAAcX,CAAa;AAAA,IAAA,GAGxBkB,IAAQd,KAAaK,EAAE,6BAA6B;AAE1D,WAAIK,MAAa,YAEb,gBAAAK,EAAC1C,EAAe,UAAf,EAAwB,OAAO,EAAE,MAAM,WAAW,SAAAwB,GAAS,cAAAc,KAC1D,UAAA,gBAAAI,EAACC,EAAY,MAAZ,EAAiB,MAAAlB,GAAY,cAAAC,GAC5B,UAAA,gBAAAkB,EAACD,EAAY,QAAZ,EACC,UAAA;AAAA,MAAA,gBAAAD;AAAA,QAACC,EAAY;AAAA,QAAZ;AAAA,UACC,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,GAAG;AAAA,QAAA;AAAA,MAAA;AAAA,MAEZ,gBAAAC;AAAA,QAACD,EAAY;AAAA,QAAZ;AAAA,UACC,cAAYF;AAAA,UACZ,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACAxB,EAAY,EAAE,MAAM,WAAW,SAAAO,GAAS;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACAI,KAAa;AAAA,UAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UAEX,UAAA;AAAA,YAAA,gBAAAc,EAAC,OAAA,EAAI,KAAAX,GAAU,cAAYU,GAAO,kBAAe,WAAU,WAAU,iCAAiC,GAAGX,GACtG,UAAAD,EAAA,CACH;AAAA,YACA,gBAAAa,EAACC,EAAY,OAAZ,EAAkB,SAAO,IACxB,UAAA,gBAAAD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,cAAYV,EAAE,6BAA6B;AAAA,gBAC3C,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBAAA,EACA,KAAK,GAAG;AAAA,gBAEV,UAAA,gBAAAU,EAACG,IAAA,EAAE,eAAY,QAAO,WAAU,YAAA,CAAY;AAAA,cAAA;AAAA,YAAA,EAC9C,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF,GACF,GACF,sBAKD7C,EAAe,UAAf,EAAwB,OAAO,EAAE,MAAMqC,GAAU,SAAAb,GAAS,cAAAc,EAAA,GACzD,UAAA,gBAAAI,EAACI,EAAa,UAAb,EAAsB,eAAe,KACpC,UAAA,gBAAAJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAX;AAAA,QACA,cAAYU;AAAA,QACZ,kBAAe;AAAA,QACf,aAAWJ;AAAA,QACX,gBAAcb;AAAA,QACd,WAAW;AAAA,UACTP,EAAY,EAAE,MAAMoB,GAAU,SAAAb,GAAS;AAAA,UACvCA,MAAY,YAAY,uBAAuB;AAAA,UAC/CI,KAAa;AAAA,QAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGE;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA,GAEL,EAAA,CACF;AAAA,EAEJ;AACF;AACAV,GAAQ,cAAc;AAMtB,MAAM4B,KAAgB3B;AAAA,EACpB,CAAC,EAAE,WAAAQ,GAAW,GAAGE,EAAA,GAAQC,MAAQ;AAC/B,UAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA;AACjB,WACE,gBAAAwC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAX;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA;AAAA;AAAA,UAGAiB,MAAS,SACL,0EACA;AAAA,UACJ;AAAA;AAAA;AAAA,UAGA;AAAA,UACA;AAAA,UACApB,KAAa;AAAA,QAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGE;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACAiB,GAAc,cAAc;AAE5B,MAAME,KAAc7B;AAAA,EAClB,CAAC,EAAE,WAAAQ,GAAW,GAAGE,EAAA,GAAQC,MACvB,gBAAAW;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAX;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACAH,KAAa;AAAA,MAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AACAmB,GAAY,cAAc;AAE1B,MAAMC,KAAgB9B;AAAA,EACpB,CAAC,EAAE,WAAAQ,GAAW,GAAGE,EAAA,GAAQC,MAAQ;AAC/B,UAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA;AACjB,WACE,gBAAAwC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAX;AAAA,QACA,WAAW;AAAA,UACT;AAAA;AAAA;AAAA,UAGAiB,MAAS,SACL,oEACA;AAAA,UACJ;AAAA,UACA;AAAA;AAAA;AAAA,UAGA;AAAA,UACA;AAAA,UACApB,KAAa;AAAA,QAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGE;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACAoB,GAAc,cAAc;AA6B5B,MAAMC,KAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAMJC,IAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,IAAiBjC;AAAA,EACrB,CACE;AAAA,IACE,OAAAqB;AAAA,IACA,MAAAa;AAAA,IACA,aAAAC,IAAc;AAAA,IACd,aAAAC,IAAc;AAAA,IACd,MAAA/B;AAAA,IACA,cAAAC;AAAA,IACA,WAAAE;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA,GACXuD,IAAaT,MAAS,QAGtBU,IAAcH,KAAe,CAACE,KAAc,EAAQhB,GAEpDkB,IAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA/B,KAAa;AAAA,IAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,QAAI,CAAC8B;AAKH,+BACG,OAAA,EAAI,KAAA3B,GAAU,WAAW4B,GAAiB,GAAG7B,GAC3C,UAAA;AAAA,QAHc,EAAQW,KAAU,EAAQa,IAIvC,gBAAAV;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACAa,KAAc,CAACH,IAAO,eAAe;AAAA,YAAA,EAEpC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YAEV,UAAA;AAAA,cAAAA,sBACE,QAAA,EAAK,eAAY,QAAO,WAAWF,GACjC,aACH,IACE;AAAA,cACHX,sBACE,QAAA,EAAK,WAAWgB,IAAa,eAAe,IAAK,aAAM,IACtD;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,IAEJ;AAAA,QACH5B;AAAA,MAAA,GACH;AAQJ,UAAM+B,IAAiB;AACvB,WACE,gBAAAlB;AAAA,MAACmB,EAAe;AAAA,MAAf;AAAA,QACC,MAAK;AAAA,QACL,aAAW;AAAA,QACX,cACEpC,MAAS,UAAa+B,IAAcI,IAAiB;AAAA,QAEvD,OAAOnC,MAAS,SAAY,SAAYA,IAAOmC,IAAiB;AAAA,QAChE,eACElC,IAAe,CAACnB,MAAMmB,EAAanB,MAAMqD,CAAc,IAAI;AAAA,QAE7D,SAAO;AAAA,QAEP,UAAA,gBAAAlB,EAAC,OAAA,EAAI,KAAAX,GAAU,WAAW4B,GAAiB,GAAG7B,GAC5C,UAAA,gBAAAc,EAACiB,EAAe,MAAf,EAAoB,OAAOD,GAC1B,UAAA;AAAA,UAAA,gBAAAlB,EAACmB,EAAe,QAAf,EAAsB,WAAU,WAC/B,4BAACA,EAAe,SAAf,EAAuB,WAAWV,IAChC,UAAA;AAAA,YAAAG,sBACE,QAAA,EAAK,eAAY,QAAO,WAAWF,GACjC,aACH,IACE;AAAA,YACJ,gBAAAV,EAAC,QAAA,EAAK,WAAU,2BAA2B,UAAAD,GAAM;AAAA,YACjD,gBAAAC;AAAA,cAACoB;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF,EAAA,CACF;AAAA,UACA,gBAAApB;AAAA,YAACqB;AAAA,YAAA;AAAA,cACC,cAAYtB;AAAA,cAMZ,WAAU;AAAA,cAET,UAAAZ;AAAA,YAAA;AAAA,UAAA;AAAA,QACH,EAAA,CACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACAwB,EAAe,cAAc;AAc7B,MAAMW,KAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,KAAe7C;AAAA,EACnB,CAAC,EAAE,OAAAqB,GAAO,MAAAa,GAAM,UAAAzB,GAAU,WAAAD,GAAW,aAAA4B,GAAa,MAAA/B,GAAM,cAAAC,GAAc,GAAGI,EAAA,GAAQC,MAAQ;AACvF,UAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA;AACjB,WACE,gBAAA0C;AAAA,MAACsB,EAAiB;AAAA,MAAjB;AAAA,QACC,KAAAnC;AAAA,QACA,aAAAyB;AAAA,QACA,MAAA/B;AAAA,QACA,cAAAC;AAAA,QACA,WAAAE;AAAA,QACC,GAAGE;AAAA,QAEJ,UAAA;AAAA,UAAA,gBAAAc,EAACsB,EAAiB,SAAjB,EAAyB,WAAWF,IAClC,UAAA;AAAA,YAAAV,IACC,gBAAAZ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA,gBAET,UAAAY;AAAA,cAAA;AAAA,YAAA,IAED;AAAA,YACJ,gBAAAZ;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACAM,MAAS,SAAS,eAAe;AAAA,gBAAA,EACjC,KAAK,GAAG;AAAA,gBAET,UAAAP;AAAA,cAAA;AAAA,YAAA;AAAA,YAEFO,MAAS,SACR,gBAAAN;AAAA,cAACoB;AAAA,cAAA;AAAA,gBACC,eAAY;AAAA,gBACZ,WAAU;AAAA,cAAA;AAAA,YAAA,IAEV;AAAA,UAAA,GACN;AAAA,UACA,gBAAApB;AAAA,YAACwB,EAAiB;AAAA,YAAjB;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cAAA,EACA,KAAK,GAAG;AAAA,cAET,UAAArC;AAAA,YAAA;AAAA,UAAA;AAAA,QACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AACF;AACAoC,GAAa,cAAc;AAM3B,MAAME,KAAcjD;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAME;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,MAAM;AAAA,QACJ,UAAU;AAAA,UACR;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA;AAAA;AAAA;AAAA,QAIV,MAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,SAAS;AAAA,UACP;AAAA,UACA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,MAAA;AAAA,MAEZ,SAAS;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,MAEX,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA,QAKR,MAAM;AAAA,UACJ;AAAA,UACA;AAAA;AAAA,UAEA;AAAA,QAAA,EACA,KAAK,GAAG;AAAA,QACV,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,IAAA;AAAA,EACZ;AAEJ,GAuBMkD,IAAchD;AAAA,EAClB,CACE;AAAA,IACE,SAAAiD,IAAU;AAAA,IACV,UAAAC,IAAW;AAAA,IACX,UAAAC,IAAW;AAAA,IACX,aAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAA7C;AAAA,IACA,UAAAC;AAAA,IACA,cAAcF;AAAA,IACd,GAAGG;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,MAAAiB,GAAM,SAAAxB,EAAA,IAAYtB,EAAA,GACpBwE,IAAOL,IAAUM,KAAO,KACxBC,IAAUJ,MAAgB,UAAaxB,MAAS,QAEhD6B,IACJ,gBAAAnC;AAAA,MAACgC;AAAA,MAAA;AAAA,QACC,KAAA3C;AAAA,QACA,gBAAcuC,IAAW,SAAS;AAAA,QAClC,cAAY3C;AAAA,QACZ,WAAWwC,GAAY;AAAA,UACrB,MAAAnB;AAAA,UACA,SAAAxB;AAAA,UACA,UAAA8C;AAAA,UACA,WAAWM,IAAU,mBAAmBhD;AAAA,QAAA,CACzC;AAAA,QACA,GAAGE;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA,GAICiD,IAAOF,IACX,gBAAAhC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACAhB,KAAa;AAAA,QAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QAEV,UAAA;AAAA,UAAAiD;AAAA,UACD,gBAAAnC;AAAA,YAACqC;AAAA,YAAA;AAAA,cACC,UAAAR;AAAA,cACA,OAAOE,KAAY9C,KAAa;AAAA,cAChC,aAAA6C;AAAA,YAAA;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA,IAGFK;AAIF,WAAI7B,MAAS,UAAUrB,IAEnB,gBAAAiB,EAACE,EAAa,MAAb,EACC,UAAA;AAAA,MAAA,gBAAAJ,EAACI,EAAa,SAAb,EAAqB,SAAO,IAAE,UAAAgC,GAAK;AAAA,MACpC,gBAAApC,EAACI,EAAa,QAAb,EACC,UAAA,gBAAAF;AAAA,QAACE,EAAa;AAAA,QAAb;AAAA,UACC,MAAK;AAAA,UACL,YAAY;AAAA,UACZ,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,GAAG;AAAA,UAET,UAAA;AAAA,YAAAnB;AAAA,YACD,gBAAAe,EAACI,EAAa,OAAb,EAAmB,WAAU,8BAAA,CAA8B;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EAC9D,CACF;AAAA,IAAA,GACF,IAIGgC;AAAA,EACT;AACF;AACAV,EAAY,cAAc;AAM1B,MAAMY,KAAkB5D;AAAA,EACtB,CAAC,EAAE,WAAAQ,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAAQC,MACjC,gBAAAW;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAX;AAAA,MACA,eAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA;AAAA,QACA;AAAA,QACAH,KAAa;AAAA,MAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;AACAmD,GAAgB,cAAc;AAE9B,MAAMC,KAAmB7D;AAAA,EACvB,CAAC,EAAE,WAAAQ,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAAQC,MAAQ;AACzC,UAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA;AACjB,WACE,gBAAAwC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAX;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACAiB,MAAS,SAAS,eAAe;AAAA,UACjCpB,KAAa;AAAA,QAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGE;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AACAoD,GAAiB,cAAc;AAE/B,MAAMC,KAAmB9D;AAAA,EACvB,CAAC,EAAE,WAAAQ,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAAQC,MAAQ;AACzC,UAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA,GACXiF,IAASnC,MAAS;AAUxB,WACE,gBAAAN;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAX;AAAA,QACA,eAAaoD,IAAS,SAAS;AAAA,QAC/B,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACAA,IACI;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,GAAG,IACV;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,GAAG;AAAA,UACdvD,KAAa;AAAA,QAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,QACV,GAAGE;AAAA,QAEH,UAAAD;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AACF;AACAqD,GAAiB,cAAc;AAc/B,MAAME,KAA2BlE;AAAA,EAC/B;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAYMmE,KAA2BjE,EAG/B,CAAC,EAAE,MAAAkE,GAAM,MAAAC,GAAM,aAAAC,IAAc,IAAM,WAAA5D,GAAW,GAAGE,EAAA,GAAQC,MAAQ;AACjE,QAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA,GACXuF,IAAYzC,MAAS;AAC3B,SACE,gBAAAJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAb;AAAA,MACA,MAAK;AAAA,MACL,cAAYwD;AAAA,MACZ,WAAW,CAACH,GAAA,GAA4BxD,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC1E,GAAGE;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAY,EAAC,QAAA,EAAK,eAAY,QAAO,WAAU,8CAChC,UAAA4C,GACH;AAAA,QACCG,IACC,gBAAA7C,EAAA8C,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAhD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cAET,UAAA6C;AAAA,YAAA;AAAA,UAAA;AAAA,UAEFC,IACC,gBAAA9C;AAAA,YAACoB;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,YAAA;AAAA,UAAA,IAEV;AAAA,QAAA,EAAA,CACN,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDuB,GAAyB,cAAc;AAIvC,MAAMM,KAAuBzE;AAAA,EAC3B;AAAA,IACE;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,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,iBAAiB,EAAE,MAAM,WAAA;AAAA,EAAW;AAExC,GAWM0E,KAAuBxE,EAG3B,CAAC,EAAE,MAAAkC,GAAM,OAAAb,GAAO,UAAAoD,GAAU,WAAAjE,GAAW,GAAGE,EAAA,GAAQC,MAAQ;AACxD,QAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA,GACXuF,IAAYzC,MAAS;AAC3B,SACE,gBAAAJ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAb;AAAA,MACA,MAAK;AAAA,MACL,cAAYU;AAAA,MACZ,qBAAmBoD;AAAA,MACnB,WAAW,CAACF,GAAqB,EAAE,MAAA3C,GAAM,GAAGpB,CAAS,EAClD,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAY,EAAC,QAAA,EAAK,eAAY,QAAO,WAAU,8DAChC,UAAAY,GACH;AAAA,QACCmC,IACC,gBAAA7C,EAAA8C,GAAA,EACE,UAAA;AAAA,UAAA,gBAAAhD,EAAC,QAAA,EAAK,WAAU,eAAe,UAAAD,GAAM;AAAA,UACpCoD,IACC,gBAAAnD,EAAC,OAAA,EAAI,WAAU,wGACZ,aACH,IACE;AAAA,QAAA,EAAA,CACN,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDkD,GAAqB,cAAc;AAyBnC,MAAME,KAAmB;AAAA,EACvB;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJf,IAAmB3D;AAAA,EACvB,CACE,EAAE,UAAAmD,GAAU,aAAAC,GAAa,OAAA/B,GAAO,WAAAb,GAAW,SAAAmE,GAAS,GAAGjE,EAAA,GACvDC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,MAAAe,EAAA,IAAS9C,EAAA;AACjB,QAAI8C,MAAS,OAAQ,QAAO;AAC5B,UAAMgD,IAAkBzB,IACpBvC,EAAE,mCAAmC,mBAAmB,EAAE,OAAAS,EAAA,CAAO,IACjET,EAAE,iCAAiC,iBAAiB,EAAE,OAAAS,GAAO;AACjE,WACE,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAX;AAAA,QACA,MAAK;AAAA,QACL,cAAYiE;AAAA,QACZ,gBAAczB;AAAA,QACd,WAAW,CAACuB,IAAkBlE,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACjE,SAAS,CAACqE,MAAU;AAClB,UAAAA,EAAM,eAAA,GACNA,EAAM,gBAAA,GACNzB,KAAA,QAAAA,EAAc,CAACD,IACfwB,KAAA,QAAAA,EAAUE;AAAA,QACZ;AAAA,QACC,GAAGnE;AAAA,QAEJ,UAAA,gBAAAY;AAAA,UAAC3C;AAAA,UAAA;AAAA,YACC,eAAY;AAAA,YACZ,WAAU;AAAA,YACV,MAAMwE,IAAW,iBAAiB;AAAA,UAAA;AAAA,QAAA;AAAA,MACpC;AAAA,IAAA;AAAA,EAGN;AACF;AACAQ,EAAiB,cAAc;AAY/B,MAAMmB,IACJjG,EAAmD,IAAI,GAEnDkG,KAAsB,MAAMhG,EAAW+F,CAAuB,GAmB9DE,KAAmBhF;AAAA,EACvB,CACE,EAAE,SAAAiF,GAAS,cAAAC,GAAc,WAAAC,GAAW,WAAA3E,GAAW,UAAAC,GAAU,GAAGC,EAAA,GAC5DC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACRuE,IACJH,KAAWrE,EAAE,mCAAmC,YAAY,GACxDyE,IAAa,MAAM,QAAQ5E,CAAQ,IACrCA,EAAS,OAAO,OAAO,IACvBA,IACE,CAACA,CAAQ,IACT,CAAA,GACA6E,IAAQD,EAAW,QACnBE,IAAcD,IAAQ,GACtB,CAACE,GAAYC,CAAa,IAAI/F,EAAwB,IAAI,GAC1D,CAACgG,GAAaC,CAAc,IAAIjG,EAAS,EAAE,GAG3CkG,IAAiBC,GAAO,EAAK,GAC7BC,IAAW3E,EAAY,CAAC4E,MAAoB;AAChD,MAAAH,EAAe,UAAU,CAACA,EAAe,SACzCD;AAAA,QACEC,EAAe,UAAUG,IAAU,GAAGA,CAAO;AAAA,MAAA;AAAA,IAEjD,GAAG,CAAA,CAAE,GAEC1G,IAAQ2G;AAAA,MACZ,OAAO,EAAE,WAAAb,GAAW,OAAAG,GAAO,YAAAE,GAAY,eAAAC,GAAe,UAAAK,EAAA;AAAA,MACtD,CAACX,GAAWG,GAAOE,GAAYM,CAAQ;AAAA,IAAA;AAMzC,WAAI,CAACP,KAAe,CAACL,IAAqB,OAGxC,gBAAA5D,EAACwD,EAAwB,UAAxB,EAAiC,OAAAzF,GAChC,UAAA,gBAAAmC;AAAA,MAACS;AAAA,MAAA;AAAA,QACC,KAAAtB;AAAA,QACA,OAAOyE;AAAA,QACP,WAAA5E;AAAA,QACC,GAAGE;AAAA,QAEH,UAAA;AAAA,UAAA6E,IACCF,IAEA,gBAAA/D,EAAC,KAAA,EAAE,WAAU,yGACV,UAAA4D,GACH;AAAA,UAEF,gBAAA5D,EAAC,UAAK,MAAK,UAAS,aAAU,UAAS,WAAU,cAC9C,UAAAoE,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,EAEJ;AACF;AACAV,GAAiB,cAAc;AAc/B,MAAMiB,KAAqBnG;AAAA,EACzB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AAAA,EACV;AAAA,IACE,UAAU;AAAA,MACR,UAAU;AAAA,QACR,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,MAET,YAAY;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACT;AAAA,IAEF,iBAAiB,EAAE,UAAU,IAAO,YAAY,GAAA;AAAA,EAAM;AAE1D,GAEMoG,KAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,KAAsBnG;AAAA,EAI1B,CACE;AAAA,IACE,OAAAoG;AAAA,IACA,UAAAlD,IAAW;AAAA,IACX,SAAAD,IAAU;AAAA,IACV,cAAAoD;AAAA,IACA,UAAAlD,IAAW;AAAA,IACX,aAAAC;AAAA,IACA,UAAAC;AAAA,IACA,cAAc9C;AAAA,IACd,WAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,MAAAe,EAAA,IAAS9C,EAAA,GACXwH,IAAYvB,GAAA,GACZ,CAACwB,GAAcC,CAAe,IAAI9G,EAAS,EAAK,GAChD+G,IAAa,GAAQH,KAAA,QAAAA,EAAW,cAAc1E,MAAS,QACvDP,IAAQgF,KAAgB9F,KAAa,IACrCmG,IAAWC,GAAA,GAEXC,IAAa,CAACC,GAAcC,MAAe;AAC/C,UAAI,EAACR,KAAA,QAAAA,EAAW,WAAW;AAC3B,YAAMS,IAAU,KAAK,IAAI,GAAG,KAAK,IAAIT,EAAU,QAAQ,GAAGQ,CAAE,CAAC;AAC7D,MAAIC,MAAYF,MAChBP,EAAU,UAAUO,GAAME,CAAO,GACjCT,EAAU;AAAA,QACR1F;AAAA,UACE;AAAA,UACA;AAAA,UACA,EAAE,OAAAS,GAAO,IAAI0F,IAAU,GAAG,OAAOT,EAAU,MAAA;AAAA,QAAM;AAAA,MACnD;AAAA,IAEJ,GAEMU,IAAkB,CAACnC,MAAiD;AACxE,MAAK4B,MACD5B,EAAM,UAAUA,EAAM,QAAQ,aAChCA,EAAM,eAAA,GACN+B,EAAWR,GAAOA,IAAQ,CAAC,KAClBvB,EAAM,UAAUA,EAAM,QAAQ,eACvCA,EAAM,eAAA,GACN+B,EAAWR,GAAOA,IAAQ,CAAC,KAClBvB,EAAM,QAAQ,UAAUA,EAAM,UACvCA,EAAM,eAAA,GACN+B,EAAWR,GAAO,CAAC,KACVvB,EAAM,QAAQ,SAASA,EAAM,WACtCA,EAAM,eAAA,GACN+B,EAAWR,GAAOE,EAAW,QAAQ,CAAC;AAAA,IAE1C,GAEMW,IAAc,CAACpC,MAA6D;AAChF,MAAK4B,MACLH,KAAA,QAAAA,EAAW,cAAcF,IACrBvB,EAAM,iBACRA,EAAM,aAAa,gBAAgB,QAEnCA,EAAM,aAAa,QAAQ,cAAc,OAAOuB,CAAK,CAAC;AAAA,IAE1D,GAEMc,IAAY,MAAM;AACtB,MAAAZ,KAAA,QAAAA,EAAW,cAAc,OACzBE,EAAgB,EAAK;AAAA,IACvB,GAEMW,KAAa,CAACtC,MAA6D;AAC/E,MAAI,CAAC4B,MAAcH,KAAA,gBAAAA,EAAW,gBAAe,SAC7CzB,EAAM,eAAA,GACFA,EAAM,iBAAcA,EAAM,aAAa,aAAa,SACxD2B,EAAgB,EAAI;AAAA,IACtB,GAEMY,KAAc,MAAMZ,EAAgB,EAAK,GAEzCa,KAAS,CAACxC,MAA2B;AACzC,UAAI,CAAC4B,EAAY;AACjB,MAAA5B,EAAM,eAAA;AACN,YAAMyC,IAAShB,KAAA,gBAAAA,EAAW;AAE1B,MADAE,EAAgB,EAAK,GACjB,EAAAc,KAAW,QAAgCA,MAAWlB,MAC1DQ,EAAWU,GAAQlB,CAAK;AAAA,IAC1B,GAEMmB,KAAajB,KAAA,gBAAAA,EAAW,gBAAeF;AAE7C,WACE,gBAAA5E;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWyE,GAAmB;AAAA,UAC5B,UAAUsB;AAAA,UACV,YAAYhB,KAAgB,CAACgB;AAAA,QAAA,CAC9B;AAAA,QAID,WAAWd,KAAc;AAAA,QACzB,aACEA,IACKQ,IACD;AAAA,QAEN,WAAWR,IAAaS,IAAY;AAAA,QACpC,YAAAC;AAAA,QACA,aAAAC;AAAA,QACA,QAAAC;AAAA,QAEA,UAAA;AAAA,UAAA,gBAAA/F;AAAA,YAAC0B;AAAA,YAAA;AAAA,cACC,KAAArC;AAAA,cACA,UAAAuC;AAAA,cACA,SAAAD;AAAA,cACA,cAAY1C;AAAA,cACZ,oBAAkBkG,IAAaC,IAAW;AAAA,cAI1C,WAAWD,IAAa,KAAQ;AAAA,cAChC,WAAW;AAAA,gBACTA,IAAa,yBAAyB;AAAA,gBACtCjG,KAAa;AAAA,cAAA,EAEZ,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,cACV,GAAGE;AAAA,cAEH,UAAAD;AAAA,YAAA;AAAA,UAAA;AAAA,UAEFgG,IACC,gBAAAnF;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,IAAIoF;AAAA,cACJ,cAAY9F;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA,EAAE,OAAAS,EAAA;AAAA,cAAM;AAAA,cAEV,WAAW6E;AAAA,cACX,WAAWc;AAAA,cAEX,UAAA,gBAAA1F,EAAC/C,IAAA,EAAa,eAAY,QAAO,WAAU,YAAA,CAAY;AAAA,YAAA;AAAA,UAAA,IAEvD;AAAA,UACH6E,KAAexB,MAAS,SACvB,gBAAAN;AAAA,YAACqC;AAAA,YAAA;AAAA,cACC,UAAAR;AAAA,cACA,OAAOE,KAAY9C,KAAa;AAAA,cAChC,aAAA6C;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACA+C,GAAoB,cAAc;AAIlC,MAAMqB,KAAqB1H;AAAA,EACzB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,EACA,KAAK,GAAG;AACZ,GAoBM2H,KAAqBzH,EAGzB,CAAC,EAAE,QAAA0H,GAAQ,MAAAvD,GAAM,UAAAwD,GAAU,eAAAC,GAAe,WAAApH,GAAW,GAAGE,EAAA,GAAQC,MAAQ;AACxE,QAAM,EAAE,MAAAiB,EAAA,IAAS9C,EAAA,GACXuF,IAAYzC,MAAS,QACrBiG,IACJ,OAAOF,KAAa,WAAWA,IAAWC;AAC5C,SACE,gBAAApG;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAb;AAAA,MACA,MAAK;AAAA,MACL,cACEkH,IAAqB,GAAG1D,CAAI,KAAK0D,CAAkB,KAAK1D;AAAA,MAK1D,WAAW,CAACqD,GAAA,GAAsBhH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MACpE,GAAGE;AAAA,MAEJ,UAAA;AAAA,QAAA,gBAAAY,EAAC,QAAA,EAAK,eAAY,QAAO,WAAU,8CAChC,UAAAoG,GACH;AAAA,QACCrD,IACC,gBAAA7C,EAAC,QAAA,EAAK,WAAU,sCACd,UAAA;AAAA,UAAA,gBAAAF,EAAC,QAAA,EAAK,WAAU,mCAAmC,UAAA6C,GAAK;AAAA,UACvDwD,IACC,OAAOA,KAAa,6BACjB,QAAA,EAAK,WAAU,0EACb,UAAAA,EAAA,CACH,IAEA,gBAAArG,EAAC,QAAA,EAAK,WAAU,0HACb,aACH,IAEA;AAAA,QAAA,EAAA,CACN,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV,CAAC;AACDmG,GAAmB,cAAc;AAoBjC,MAAMK,KAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,GAAG,GAEJC,KAAyB/H;AAAA,EAI7B,CACE,EAAE,WAAAQ,GAAW,cAAcD,GAAW,SAAAoE,GAAS,GAAGjE,EAAA,GAClDC,MACG;AACH,UAAM,EAAE,GAAAC,EAAA,IAAMC,EAAA,GACR,EAAE,MAAAe,GAAM,cAAAV,EAAA,IAAiBpC,EAAA;AAE/B,QAAI8C,MAAS,UAAW,QAAO;AAE/B,UAAMoG,IAAapG,MAAS,YACtBgD,IACJrE,MACCyH,IACGpH,EAAE,kCAAkC,kBAAkB,IACtDA,EAAE,gCAAgC,gBAAgB,IAElDqH,IACJ,gBAAA3G;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAX;AAAA,QACA,MAAK;AAAA,QACL,cAAYiE;AAAA,QACZ,iBAAeoD;AAAA,QACf,SAAS,CAACnD,MAAU;AAClB,UAAA3D,KAAA,QAAAA,EAAe8G,IAAa,SAAS,aACrCrD,KAAA,QAAAA,EAAUE;AAAA,QACZ;AAAA,QACA,WAAW,CAACiD,IAAwBtH,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACtE,GAAGE;AAAA,QAEH,UAAAsH,IACC,gBAAA1G,EAAC7C,IAAA,EAAe,eAAY,QAAO,WAAU,gCAAA,CAAgC,IAE7E,gBAAA6C,EAAC5C,IAAA,EAAc,eAAY,QAAO,WAAU,gCAAA,CAAgC;AAAA,MAAA;AAAA,IAAA;AAKlF,WACE,gBAAA8C,EAACE,EAAa,MAAb,EACC,UAAA;AAAA,MAAA,gBAAAJ,EAACI,EAAa,SAAb,EAAqB,SAAO,IAAE,UAAAuG,GAAO;AAAA,MACtC,gBAAA3G,EAACI,EAAa,QAAb,EACC,UAAA,gBAAAF;AAAA,QAACE,EAAa;AAAA,QAAb;AAAA,UACC,MAAME,MAAS,SAAS,UAAU;AAAA,UAClC,YAAY;AAAA,UACZ,WAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,KAAK,GAAG;AAAA,UAET,UAAA;AAAA,YAAAgD;AAAA,YACD,gBAAAtD,EAACI,EAAa,OAAb,EAAmB,WAAU,8BAAA,CAA8B;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EAC9D,CACF;AAAA,IAAA,GACF;AAAA,EAEJ;AACF;AACAqG,GAAuB,cAAc;","x_google_ignoreList":[0,1,2,3]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"skeleton-DAdPFx9d.js","sources":["../../src/components/skeleton/skeleton.tsx"],"sourcesContent":["import { forwardRef, type CSSProperties, type HTMLAttributes } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nconst skeletonVariants = cva(\n [\n 'ds:bg-[var(--muted)]',\n 'ds:motion-reduce:animate-none',\n 'ds:forced-colors:bg-[GrayText]',\n 'ds:forced-colors:outline',\n 'ds:forced-colors:outline-1',\n 'ds:forced-colors:outline-[CanvasText]',\n 'ds:forced-colors:animate-none',\n ].join(' '),\n {\n variants: {\n variant: {\n text: 'ds:rounded-[var(--radius-sm)] ds:w-full',\n circular: 'ds:rounded-[var(--radius-full)] ds:aspect-square ds:shrink-0',\n rectangular: 'ds:rounded-none',\n rounded: 'ds:rounded-[var(--radius-md)]',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { variant: 'text', size: 'sm', class: 'ds:h-3' },\n { variant: 'text', size: 'md', class: 'ds:h-4' },\n { variant: 'text', size: 'lg', class: 'ds:h-5' },\n { variant: 'circular', size: 'sm', class: 'ds:h-8 ds:w-8' },\n { variant: 'circular', size: 'md', class: 'ds:h-10 ds:w-10' },\n { variant: 'circular', size: 'lg', class: 'ds:h-12 ds:w-12' },\n { variant: 'rectangular', size: 'sm', class: 'ds:h-16' },\n { variant: 'rectangular', size: 'md', class: 'ds:h-24' },\n { variant: 'rectangular', size: 'lg', class: 'ds:h-40' },\n { variant: 'rounded', size: 'sm', class: 'ds:h-16' },\n { variant: 'rounded', size: 'md', class: 'ds:h-24' },\n { variant: 'rounded', size: 'lg', class: 'ds:h-40' },\n ],\n defaultVariants: {\n variant: 'text',\n size: 'md',\n },\n },\n);\n\nconst ANIMATION_CLASS =\n 'animate-[skeleton-pulse_calc(var(--animation-duration)*8)_ease-in-out_infinite]';\n\nexport interface SkeletonProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'aria-hidden' | 'style'>,\n VariantProps<typeof skeletonVariants> {\n variant?: 'text' | 'circular' | 'rectangular' | 'rounded';\n size?: 'sm' | 'md' | 'lg';\n /** Number of stacked text lines — only applies when variant='text' */\n lines?: number;\n /**\n * Width override — accepts any CSS value.\n * Exception to constraint §4: skeleton dimensions are consumer-specified\n * and cannot be expressed as static Tailwind classes.\n */\n width?: string;\n /**\n * Height override — accepts any CSS value.\n * Exception to constraint §4: skeleton dimensions are consumer-specified\n * and cannot be expressed as static Tailwind classes.\n */\n height?: string;\n /** Whether to animate the pulse */\n animate?: boolean;\n}\n\nexport const Skeleton = forwardRef<HTMLDivElement, SkeletonProps>(\n (\n {\n variant = 'text',\n size = 'md',\n lines,\n width,\n height,\n animate = true,\n className,\n ...props\n },\n ref,\n ) => {\n // Exception to constraint §4: width/height are consumer-specified dimensions\n // that cannot be expressed as static Tailwind classes.\n const inlineStyle: CSSProperties | undefined =\n width !== undefined || height !== undefined\n ? { ...(width !== undefined && { width }), ...(height !== undefined && { height }) }\n : undefined;\n\n const atomClass = [\n skeletonVariants({ variant, size }),\n animate && ANIMATION_CLASS,\n ]\n .filter(Boolean)\n .join(' ');\n\n if (lines !== undefined && lines > 1) {\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n data-component=\"skeleton\"\n className={['ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]', className]\n .filter(Boolean)\n .join(' ')}\n style={inlineStyle}\n {...props}\n >\n {Array.from({ length: lines }, (_, i) => (\n <div\n key={`skeleton-line-${i}`}\n aria-hidden=\"true\"\n className={[atomClass, i === lines - 1 && 'ds:w-3/5']\n .filter(Boolean)\n .join(' ')}\n />\n ))}\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n aria-hidden=\"true\"\n data-component=\"skeleton\"\n className={[atomClass, className].filter(Boolean).join(' ')}\n style={inlineStyle}\n {...props}\n />\n );\n },\n);\n\nSkeleton.displayName = 'Skeleton';\n"],"names":["skeletonVariants","cva","ANIMATION_CLASS","Skeleton","forwardRef","variant","size","lines","width","height","animate","className","props","ref","inlineStyle","atomClass","jsx","_","i"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"stepper-accordion-2_7Pw0tC.js","sources":["../../node_modules/lucide-react/dist/esm/icons/lock.js","../../src/components/stepper-accordion/stepper-accordion.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"11\", x: \"3\", y: \"11\", rx: \"2\", ry: \"2\", key: \"1w4ew1\" }],\n [\"path\", { d: \"M7 11V7a5 5 0 0 1 10 0v4\", key: \"fwvmzm\" }]\n];\nconst Lock = createLucideIcon(\"lock\", __iconNode);\n\nexport { __iconNode, Lock as default };\n//# sourceMappingURL=lock.js.map\n","import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as AccordionPrimitive from '@radix-ui/react-accordion';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { ChevronDown, Lock } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport {\n stateForStep,\n type StepSpec,\n type StepState,\n} from '../_shared/stepper';\n\n/* -------------------------------------------------------------------- */\n/* StepperAccordion */\n/* */\n/* Vertical disclosure wizard. The current step is expanded inline; */\n/* completed steps collapse to a one-line summary with an \"Edit\" hint */\n/* that re-opens them; upcoming steps are locked. Built on Radix */\n/* Accordion in controlled-single mode with collapsible=false so the */\n/* current panel always stays open. */\n/* -------------------------------------------------------------------- */\n\nconst STEP_VALUE_PREFIX = 'step-';\nconst makeValue = (index: number) => `${STEP_VALUE_PREFIX}${index}`;\nconst indexFromValue = (value: string): number =>\n Number(value.slice(STEP_VALUE_PREFIX.length));\n\n/* -------------------------------------------------------------------- */\n/* Indicator — shared with progress bar visual tone but sized for the */\n/* vertical wizard's dense header row. */\n/* -------------------------------------------------------------------- */\n\nconst iconDrawClasses = [\n '[stroke-dasharray:1] [stroke-dashoffset:1]',\n 'animate-[stepper-icon-draw_var(--animation-duration)_var(--ease-out)_forwards]',\n 'motion-reduce:animate-none motion-reduce:[stroke-dashoffset:0]',\n].join(' ');\n\nfunction CheckGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M5 12l5 5L20 7\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nfunction CrossGlyph() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"ds:size-4\"\n >\n <path pathLength=\"1\" d=\"M6 6l12 12\" className={iconDrawClasses} />\n <path pathLength=\"1\" d=\"M18 6l-12 12\" className={iconDrawClasses} />\n </svg>\n );\n}\n\nconst indicatorClasses = [\n 'inline-flex shrink-0 items-center justify-center',\n 'min-w-[var(--min-target-size)] min-h-[var(--min-target-size)]',\n 'size-[var(--min-target-size)]',\n 'rounded-[var(--radius-full)]',\n 'text-[var(--font-size-sm)] font-[var(--font-weight-semibold)]',\n 'border border-[var(--border)]',\n 'transition-[background-color,border-color,color]',\n 'duration-[var(--animation-duration)] ease-[var(--ease-out)]',\n 'motion-reduce:transition-none',\n].join(' ');\n\nconst indicatorVariants = cva(indicatorClasses, {\n variants: {\n state: {\n upcoming: 'ds:bg-[var(--background)] ds:text-[var(--muted-foreground)]',\n current: [\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n completed:\n 'ds:border-[var(--primary)] ds:bg-[var(--primary)] ds:text-[var(--primary-foreground)]',\n error: [\n 'ds:border-[var(--destructive)] ds:bg-[var(--destructive)] ds:text-[var(--destructive-foreground)]',\n 'ds:animate-[stepper-indicator-pop_var(--animation-duration)_var(--ease-out)_both]',\n 'ds:motion-reduce:animate-none',\n ].join(' '),\n },\n },\n});\n\n/* -------------------------------------------------------------------- */\n/* Item / trigger / content variants */\n/* -------------------------------------------------------------------- */\n\nconst itemVariants = cva(\n [\n 'ds:group/item ds:overflow-hidden ds:rounded-[var(--radius-md)]',\n 'ds:border ds:border-[var(--border)] ds:bg-[var(--card)]',\n 'ds:data-[state=open]:border-[var(--primary)]',\n 'ds:transition-[border-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 neutral: '',\n error: 'ds:data-[state=open]:border-[var(--destructive)]',\n },\n },\n defaultVariants: { tone: 'neutral' },\n },\n);\n\nconst triggerClasses = [\n 'flex w-full items-center gap-[var(--spacing-sm)]',\n 'min-h-[var(--min-target-size)]',\n 'ps-[var(--spacing-md)] pe-[var(--spacing-md)]',\n 'pt-[var(--spacing-sm)] pb-[var(--spacing-sm)]',\n 'text-start',\n 'focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-solid',\n 'focus-visible:outline-[var(--ring)] focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'disabled:cursor-not-allowed',\n 'transition-[background-color] duration-[var(--animation-duration)] ease-[var(--ease-out)]',\n 'motion-reduce:transition-none',\n 'hover:enabled:bg-[var(--muted)]/40',\n].join(' ');\n\nconst labelClasses = (state: StepState) =>\n [\n 'type-body-sm',\n state === 'current' || state === 'error'\n ? 'font-[var(--font-weight-semibold)] text-[var(--foreground)]'\n : state === 'completed'\n ? 'text-[var(--foreground)]'\n : 'text-[var(--muted-foreground)]',\n ].join(' ');\n\nconst descriptionClasses = [\n 'type-meta text-[var(--muted-foreground)]',\n 'mt-[var(--spacing-xs)]',\n].join(' ');\n\nconst hintClasses = [\n 'type-meta',\n 'inline-flex items-center gap-[var(--spacing-xs)]',\n 'text-[var(--muted-foreground)]',\n].join(' ');\n\nconst chevronClasses = [\n 'size-4 shrink-0 text-[var(--muted-foreground)]',\n 'transition-transform duration-[var(--animation-duration)] ease-[var(--ease-out)]',\n 'motion-reduce:transition-none',\n 'group-data-[state=open]/item:rotate-180',\n].join(' ');\n\nconst summaryClasses = [\n 'type-meta text-[var(--muted-foreground)]',\n 'ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'pe-[var(--spacing-md)] pb-[var(--spacing-sm)]',\n 'group-data-[state=open]/item:hidden',\n].join(' ');\n\nconst contentClasses = [\n 'overflow-hidden',\n 'data-[state=open]:animate-[accordion-down_var(--animation-duration)_var(--ease-out)]',\n 'data-[state=closed]:animate-[accordion-up_var(--animation-duration)_var(--ease-in)]',\n].join(' ');\n\nconst contentInnerClasses = [\n 'ps-[calc(var(--min-target-size)+var(--spacing-md)+var(--spacing-sm))]',\n 'pe-[var(--spacing-md)] pt-[var(--spacing-xs)] pb-[var(--spacing-md)]',\n].join(' ');\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface AccordionStepSpec extends StepSpec {\n /** Form content rendered inside the expanded panel. */\n content: ReactNode;\n /**\n * One-line summary shown under the header when the step is completed\n * and its panel is collapsed. Typically a preview of the captured\n * data — \"Mario Rossi · 12/03/1985\".\n */\n summary?: ReactNode;\n}\n\nconst rootVariants = cva('ds:flex ds:flex-col ds:gap-[var(--spacing-sm)]', {\n variants: {},\n});\n\nexport interface StepperAccordionProps\n extends Omit<\n ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n 'type' | 'value' | 'defaultValue' | 'onValueChange' | 'collapsible'\n >,\n VariantProps<typeof rootVariants> {\n /** Active step (0-indexed). The matching panel is the one that is open. */\n activeStep: number;\n /** Step specs — each one provides its own content + optional summary. */\n steps: AccordionStepSpec[];\n /**\n * Fires when the user re-opens a completed step. Upcoming steps cannot\n * be activated — their triggers are disabled. The current step cannot\n * be collapsed (Radix `collapsible=false`).\n */\n onStepChange?: (index: number) => void;\n /** Override the default `aria-label` on the list wrapper. */\n 'aria-label'?: string;\n}\n\n/* -------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------- */\n\nconst StepperAccordion = forwardRef<HTMLDivElement, StepperAccordionProps>(\n (\n {\n activeStep,\n steps,\n onStepChange,\n 'aria-label': ariaLabel,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const total = steps.length;\n const clampedActive = Math.max(0, Math.min(activeStep, total - 1));\n const label = ariaLabel ?? t('navigation.stepper.label');\n const editCopy = t('navigation.stepper.edit');\n const lockedCopy = t('navigation.stepper.locked');\n const completedCopy = t('navigation.stepper.completed');\n const errorCopy = t('navigation.stepper.error');\n\n const handleValueChange = (value: string) => {\n // `collapsible=false` prevents empty-string values in practice, but the\n // primitive's type still allows one — guard anyway.\n if (!value) return;\n const index = indexFromValue(value);\n if (Number.isFinite(index) && index !== clampedActive) {\n onStepChange?.(index);\n }\n };\n\n return (\n <AccordionPrimitive.Root\n ref={ref}\n type=\"single\"\n value={makeValue(clampedActive)}\n onValueChange={handleValueChange}\n collapsible={false}\n aria-label={label}\n data-component=\"stepper-accordion\"\n className={rootVariants({ className })}\n {...rest}\n >\n {steps.map((spec, index) => {\n const state = stateForStep(index, clampedActive, spec.status);\n const isCurrent = state === 'current' || state === 'error';\n const isUpcoming = state === 'upcoming';\n const itemTone = state === 'error' ? 'error' : 'neutral';\n const stepN = t('navigation.stepper.stepN', { n: index + 1 });\n\n const indicatorContent = (() => {\n if (state === 'completed') {\n return (\n <>\n <CheckGlyph />\n <span className=\"ds:sr-only\">{completedCopy}</span>\n </>\n );\n }\n if (state === 'error') {\n return (\n <>\n <CrossGlyph />\n <span className=\"ds:sr-only\">{errorCopy}</span>\n </>\n );\n }\n return <span>{index + 1}</span>;\n })();\n\n const hint = (() => {\n if (state === 'completed') {\n return <span className={hintClasses}>{editCopy}</span>;\n }\n if (state === 'upcoming') {\n return (\n <span className={hintClasses}>\n <Lock aria-hidden=\"true\" className=\"ds:size-3\" />\n {lockedCopy}\n </span>\n );\n }\n return null;\n })();\n\n return (\n <AccordionPrimitive.Item\n key={index}\n value={makeValue(index)}\n className={itemVariants({ tone: itemTone })}\n >\n <AccordionPrimitive.Header className=\"ds:flex\">\n <AccordionPrimitive.Trigger\n // Upcoming steps are *HTML*-disabled — they must not be\n // reachable by Tab or by Radix's arrow-key navigation ring\n // (Radix filters `item.ref.current?.disabled`, which is\n // the HTML attribute). Current is only *ARIA*-disabled so\n // keyboard users can Tab to it as a heading anchor and\n // hear \"current step\"; Radix's `collapsible=false` makes\n // the click a no-op regardless. Setting `disabled` at the\n // Trigger rather than the Item because `...triggerProps`\n // spreads after Collapsible writes its own `disabled`\n // from context, so the Item-level disabled gets overridden.\n disabled={isUpcoming}\n aria-disabled={isCurrent || undefined}\n aria-label={\n state === 'completed' ? `${stepN}, ${editCopy}` : stepN\n }\n aria-current={isCurrent ? 'step' : undefined}\n className={triggerClasses}\n >\n <span\n aria-hidden=\"true\"\n className={indicatorVariants({ state })}\n >\n {indicatorContent}\n </span>\n <span className=\"ds:flex ds:min-w-0 ds:flex-1 ds:flex-col\">\n <span className={labelClasses(state)}>{spec.label}</span>\n {spec.description ? (\n <span className={descriptionClasses}>\n {spec.description}\n </span>\n ) : null}\n </span>\n {hint}\n {isCurrent ? null : (\n <ChevronDown\n aria-hidden=\"true\"\n className={chevronClasses}\n />\n )}\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n {spec.summary && state === 'completed' ? (\n <div className={summaryClasses}>{spec.summary}</div>\n ) : null}\n <AccordionPrimitive.Content className={contentClasses}>\n <div className={contentInnerClasses}>{spec.content}</div>\n </AccordionPrimitive.Content>\n </AccordionPrimitive.Item>\n );\n })}\n </AccordionPrimitive.Root>\n );\n },\n);\nStepperAccordion.displayName = 'StepperAccordion';\n\nexport { StepperAccordion };\n"],"names":["__iconNode","Lock","createLucideIcon","STEP_VALUE_PREFIX","makeValue","index","indexFromValue","value","iconDrawClasses","CheckGlyph","jsx","CrossGlyph","jsxs","indicatorClasses","indicatorVariants","cva","itemVariants","triggerClasses","labelClasses","state","descriptionClasses","hintClasses","chevronClasses","summaryClasses","contentClasses","contentInnerClasses","rootVariants","StepperAccordion","forwardRef","activeStep","steps","onStepChange","ariaLabel","className","rest","ref","t","useTranslation","total","clampedActive","label","editCopy","lockedCopy","completedCopy","errorCopy","handleValueChange","AccordionPrimitive","spec","stateForStep","isCurrent","isUpcoming","itemTone","stepN","indicatorContent","Fragment","hint","ChevronDown"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"switch-DhSORO9C.js","sources":["../../src/components/switch/switch.tsx"],"sourcesContent":["import {\n forwardRef,\n useContext,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from 'react';\nimport * as RadixSwitch from '@radix-ui/react-switch';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport {\n FormFieldContext,\n useFormField,\n} from '../form-field/form-field-context';\n\nconst switchVariants = cva(\n [\n 'ds:inline-flex ds:shrink-0 ds:cursor-pointer ds:items-center',\n 'ds:rounded-[var(--radius-full)]',\n 'ds:border-2 ds:border-transparent',\n 'ds:bg-muted',\n 'ds:data-[state=checked]:bg-primary',\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-ring ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:disabled:cursor-not-allowed ds:disabled:opacity-50',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:h-4 ds:w-7',\n md: 'ds:h-5 ds:w-9',\n lg: 'ds:h-6 ds:w-11',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst thumbVariants = cva(\n [\n 'ds:pointer-events-none ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-background ds:text-foreground ds:shadow-[var(--shadow-sm)]',\n 'ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n 'ds:data-[state=checked]:translate-x-full ds:rtl:data-[state=checked]:-translate-x-full',\n 'ds:data-[state=unchecked]:translate-x-0',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:size-3',\n md: 'ds:size-4',\n lg: 'ds:size-5',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst wrapperVariants = cva(\n 'ds:inline-flex ds:items-center ds:gap-3 ds:min-h-[var(--min-target-size)]',\n {\n variants: {\n labelSide: {\n start: 'ds:flex-row-reverse',\n end: '',\n },\n },\n defaultVariants: { labelSide: 'end' },\n },\n);\n\nconst labelVariants = cva('type-label ds:text-foreground ds:select-none', {\n variants: {\n disabled: {\n true: 'ds:cursor-not-allowed ds:opacity-50',\n false: 'ds:cursor-pointer',\n },\n },\n defaultVariants: { disabled: false },\n});\n\nconst iconSizeBySwitchSize = {\n sm: 'size-2',\n md: 'size-2.5',\n lg: 'size-3',\n} as const;\n\nexport interface SwitchIcon {\n on: ReactNode;\n off: ReactNode;\n}\n\ntype RadixRootProps = ComponentPropsWithoutRef<typeof RadixSwitch.Root>;\n\nexport interface SwitchProps\n extends Omit<RadixRootProps, 'children'>,\n VariantProps<typeof switchVariants> {\n label: string;\n labelSide?: 'start' | 'end';\n size?: 'sm' | 'md' | 'lg';\n icon?: SwitchIcon;\n showStateText?: boolean;\n}\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n label,\n labelSide = 'end',\n size = 'md',\n icon,\n showStateText = false,\n checked,\n defaultChecked,\n onCheckedChange,\n disabled,\n id,\n className,\n ...props\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const ctx = useFormField();\n const inFormField = useContext(FormFieldContext) !== null;\n const switchId = id ?? ctx.id;\n\n const [internalChecked, setInternalChecked] = useState<boolean>(\n checked ?? defaultChecked ?? false,\n );\n const isControlled = typeof checked === 'boolean';\n const currentChecked = isControlled ? checked : internalChecked;\n\n const handleCheckedChange = (next: boolean) => {\n if (!isControlled) setInternalChecked(next);\n onCheckedChange?.(next);\n };\n\n const effectiveDisabled = ctx.disabled || disabled;\n const describedBy = ctx.describedBy || undefined;\n\n const stateText = currentChecked\n ? t('ui.inputs.switch.on', 'On')\n : t('ui.inputs.switch.off', 'Off');\n\n return (\n <div className={wrapperVariants({ labelSide })}>\n <RadixSwitch.Root\n ref={ref}\n id={switchId}\n checked={isControlled ? checked : undefined}\n defaultChecked={!isControlled ? defaultChecked : undefined}\n onCheckedChange={handleCheckedChange}\n disabled={effectiveDisabled}\n aria-describedby={describedBy}\n aria-invalid={ctx.invalid || undefined}\n aria-required={ctx.required || undefined}\n data-component=\"switch\"\n className={switchVariants({ size, className })}\n {...props}\n >\n <RadixSwitch.Thumb className={thumbVariants({ size })}>\n {icon ? (\n <span\n aria-hidden=\"true\"\n className={`${iconSizeBySwitchSize[size]} ds:inline-flex ds:items-center ds:justify-center ds:[&_svg]:size-full`}\n >\n {currentChecked ? icon.on : icon.off}\n </span>\n ) : null}\n </RadixSwitch.Thumb>\n </RadixSwitch.Root>\n {showStateText ? (\n <span\n aria-hidden=\"true\"\n className=\"type-meta ds:text-muted-foreground ds:select-none\"\n >\n {stateText}\n </span>\n ) : null}\n {!inFormField ? (\n <label\n htmlFor={switchId}\n className={labelVariants({ disabled: Boolean(effectiveDisabled) })}\n >\n {label}\n </label>\n ) : null}\n </div>\n );\n },\n);\n\nSwitch.displayName = 'Switch';\n"],"names":["switchVariants","cva","thumbVariants","wrapperVariants","labelVariants","iconSizeBySwitchSize","Switch","forwardRef","label","labelSide","size","icon","showStateText","checked","defaultChecked","onCheckedChange","disabled","id","className","props","ref","t","useTranslation","ctx","useFormField","inFormField","useContext","FormFieldContext","switchId","internalChecked","setInternalChecked","useState","isControlled","currentChecked","handleCheckedChange","next","effectiveDisabled","describedBy","stateText","jsx","RadixSwitch"],"mappings":"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"}