@alfadocs/ui-kit-debug 1.45.0 → 1.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/dist/_chunks/{actions-cell-renderer-BXBy9c0f.js → actions-cell-renderer-B5m9lwgC.js} +2 -2
  2. package/dist/_chunks/{actions-cell-renderer-BXBy9c0f.js.map → actions-cell-renderer-B5m9lwgC.js.map} +1 -1
  3. package/dist/_chunks/ai-credits-notice-xszqOZTC.js +90 -0
  4. package/dist/_chunks/ai-credits-notice-xszqOZTC.js.map +1 -0
  5. package/dist/_chunks/ai-credits-notice.agent-C9L7orrP.js +17 -0
  6. package/dist/_chunks/ai-credits-notice.agent-C9L7orrP.js.map +1 -0
  7. package/dist/_chunks/{ai-consent-banner-D7I2U-cz.js → ai-permission-notice-D7I2U-cz.js} +1 -1
  8. package/dist/_chunks/ai-permission-notice-D7I2U-cz.js.map +1 -0
  9. package/dist/_chunks/ai-sparkle-D23NT8Z_.js +45 -0
  10. package/dist/_chunks/ai-sparkle-D23NT8Z_.js.map +1 -0
  11. package/dist/_chunks/{anamnesis-summary-rows-DQUqwWc1.js → anamnesis-summary-rows-DI-UX5r6.js} +2 -2
  12. package/dist/_chunks/{anamnesis-summary-rows-DQUqwWc1.js.map → anamnesis-summary-rows-DI-UX5r6.js.map} +1 -1
  13. package/dist/_chunks/{appointment-card-TgR_2GKS.js → appointment-card-DluZy8Iv.js} +2 -2
  14. package/dist/_chunks/{appointment-card-TgR_2GKS.js.map → appointment-card-DluZy8Iv.js.map} +1 -1
  15. package/dist/_chunks/{appointment-peek-abiR0T9e.js → appointment-peek-BsfCpiJs.js} +3 -3
  16. package/dist/_chunks/{appointment-peek-abiR0T9e.js.map → appointment-peek-BsfCpiJs.js.map} +1 -1
  17. package/dist/_chunks/{appointment-timeline-CCnyUYKz.js → appointment-timeline-Cs5f9viN.js} +3 -3
  18. package/dist/_chunks/{appointment-timeline-CCnyUYKz.js.map → appointment-timeline-Cs5f9viN.js.map} +1 -1
  19. package/dist/_chunks/{appointment-tray-N0yEI8UF.js → appointment-tray-CLrGGnKR.js} +2 -2
  20. package/dist/_chunks/{appointment-tray-N0yEI8UF.js.map → appointment-tray-CLrGGnKR.js.map} +1 -1
  21. package/dist/_chunks/baby-Dku-Xvg9.js +23 -0
  22. package/dist/_chunks/baby-Dku-Xvg9.js.map +1 -0
  23. package/dist/_chunks/{balance-badge-cell-o6LldMUA.js → balance-badge-cell-YGrYdrvR.js} +3 -3
  24. package/dist/_chunks/{balance-badge-cell-o6LldMUA.js.map → balance-badge-cell-YGrYdrvR.js.map} +1 -1
  25. package/dist/_chunks/booking-C4MwImkS.js +3362 -0
  26. package/dist/_chunks/booking-C4MwImkS.js.map +1 -0
  27. package/dist/_chunks/button-group-CA1tmu39.js +325 -0
  28. package/dist/_chunks/button-group-CA1tmu39.js.map +1 -0
  29. package/dist/_chunks/{calendar-U6N0F99w.js → calendar-OzSeTb4V.js} +2 -2
  30. package/dist/_chunks/{calendar-U6N0F99w.js.map → calendar-OzSeTb4V.js.map} +1 -1
  31. package/dist/_chunks/{calendar-event-card-DKUnT9Be.js → calendar-event-card-B6N5h1dO.js} +57 -48
  32. package/dist/_chunks/{calendar-event-card-DKUnT9Be.js.map → calendar-event-card-B6N5h1dO.js.map} +1 -1
  33. package/dist/_chunks/calendar-workspace-DDnQmiIL.js +12427 -0
  34. package/dist/_chunks/calendar-workspace-DDnQmiIL.js.map +1 -0
  35. package/dist/_chunks/{chart-PF2krCZC.js → chart-D8ucl8hH.js} +2 -2
  36. package/dist/_chunks/{chart-PF2krCZC.js.map → chart-D8ucl8hH.js.map} +1 -1
  37. package/dist/_chunks/{data-table-CcAx_I1w.js → data-table-DnKOmEVw.js} +2 -2
  38. package/dist/_chunks/{data-table-CcAx_I1w.js.map → data-table-DnKOmEVw.js.map} +1 -1
  39. package/dist/_chunks/{editable-currency-cell-renderer-Psb6XKHR.js → editable-currency-cell-renderer-OUkUv7U4.js} +2 -2
  40. package/dist/_chunks/{editable-currency-cell-renderer-Psb6XKHR.js.map → editable-currency-cell-renderer-OUkUv7U4.js.map} +1 -1
  41. package/dist/_chunks/{face-scheme-Bm6pe7R8.js → face-scheme-mIhwrQXt.js} +3 -3
  42. package/dist/_chunks/{face-scheme-Bm6pe7R8.js.map → face-scheme-mIhwrQXt.js.map} +1 -1
  43. package/dist/_chunks/{file-manager-BfLQxF5t.js → file-manager-DOcJGIx2.js} +4 -4
  44. package/dist/_chunks/{file-manager-BfLQxF5t.js.map → file-manager-DOcJGIx2.js.map} +1 -1
  45. package/dist/_chunks/{freemium-paywall-Cz-O9lQD.js → freemium-paywall-BaW5ODc9.js} +2 -2
  46. package/dist/_chunks/{freemium-paywall-Cz-O9lQD.js.map → freemium-paywall-BaW5ODc9.js.map} +1 -1
  47. package/dist/_chunks/{header-settings-CTe45iDy.js → header-settings-BEfx_-TF.js} +2 -2
  48. package/dist/_chunks/{header-settings-CTe45iDy.js.map → header-settings-BEfx_-TF.js.map} +1 -1
  49. package/dist/_chunks/{help-me-write-templates-GUeEn3Ff.js → help-me-write-templates-DHIwa4xR.js} +205 -199
  50. package/dist/_chunks/help-me-write-templates-DHIwa4xR.js.map +1 -0
  51. package/dist/_chunks/{hover-card-BMJBVqIf.js → hover-card-nUae8NPJ.js} +67 -62
  52. package/dist/_chunks/{hover-card-BMJBVqIf.js.map → hover-card-nUae8NPJ.js.map} +1 -1
  53. package/dist/_chunks/{icon-button-group-DkkdIygu.js → icon-button-group-DZKC6KGf.js} +181 -168
  54. package/dist/_chunks/icon-button-group-DZKC6KGf.js.map +1 -0
  55. package/dist/_chunks/kit-extensions-DuoFF1R3.js +94 -0
  56. package/dist/_chunks/kit-extensions-DuoFF1R3.js.map +1 -0
  57. package/dist/_chunks/{marketplace-app-shell-DdwPj03y.js → marketplace-app-shell-PB89Dkk_.js} +2 -2
  58. package/dist/_chunks/{marketplace-app-shell-DdwPj03y.js.map → marketplace-app-shell-PB89Dkk_.js.map} +1 -1
  59. package/dist/_chunks/{notes-panel-Dkk9QPPX.js → notes-panel-CHbDDMx8.js} +83 -73
  60. package/dist/_chunks/notes-panel-CHbDDMx8.js.map +1 -0
  61. package/dist/_chunks/{patient-details-C8ImUrVg.js → patient-details-yrgkSeEY.js} +2 -2
  62. package/dist/_chunks/{patient-details-C8ImUrVg.js.map → patient-details-yrgkSeEY.js.map} +1 -1
  63. package/dist/_chunks/{patient-field-row-BRSOKvme.js → patient-field-row-DCMkFGqI.js} +3 -3
  64. package/dist/_chunks/patient-field-row-DCMkFGqI.js.map +1 -0
  65. package/dist/_chunks/{patient-summary-card-BhmKB2KR.js → patient-summary-card-CmEFflGS.js} +59 -45
  66. package/dist/_chunks/patient-summary-card-CmEFflGS.js.map +1 -0
  67. package/dist/_chunks/payment-form-DqJFiplX.js +881 -0
  68. package/dist/_chunks/payment-form-DqJFiplX.js.map +1 -0
  69. package/dist/_chunks/{phone-input-BsZIoE36.js → phone-input-IWrGOCwm.js} +40 -39
  70. package/dist/_chunks/{phone-input-BsZIoE36.js.map → phone-input-IWrGOCwm.js.map} +1 -1
  71. package/dist/_chunks/rich-text-editor-BwDV2XkZ.js +4153 -0
  72. package/dist/_chunks/rich-text-editor-BwDV2XkZ.js.map +1 -0
  73. package/dist/_chunks/{stepper-accordion-DmVykr5F.js → stepper-accordion-jMR8NaOB.js} +2 -1
  74. package/dist/_chunks/{stepper-accordion-DmVykr5F.js.map → stepper-accordion-jMR8NaOB.js.map} +1 -1
  75. package/dist/_chunks/{tasks-panel-CpcikOeY.js → tasks-panel-DncuBPIZ.js} +2 -2
  76. package/dist/_chunks/{tasks-panel-CpcikOeY.js.map → tasks-panel-DncuBPIZ.js.map} +1 -1
  77. package/dist/_chunks/{theme-toggle-bI0pgDDv.js → theme-toggle-BP0XRGMM.js} +2 -2
  78. package/dist/_chunks/{theme-toggle-bI0pgDDv.js.map → theme-toggle-BP0XRGMM.js.map} +1 -1
  79. package/dist/_chunks/use-ai-sparkle-Cf4yVTLB.js +76 -0
  80. package/dist/_chunks/use-ai-sparkle-Cf4yVTLB.js.map +1 -0
  81. package/dist/_chunks/{workflow-status-xeaJTzD3.js → workflow-status-CuJAOuKL.js} +43 -42
  82. package/dist/_chunks/{workflow-status-xeaJTzD3.js.map → workflow-status-CuJAOuKL.js.map} +1 -1
  83. package/dist/agent-catalog.json +36 -7
  84. package/dist/agent-i18n/en.json +3 -3
  85. package/dist/components/_shared/field-value.d.ts.map +1 -1
  86. package/dist/components/ai-credits-notice/ai-credits-notice.agent.d.ts +3 -0
  87. package/dist/components/ai-credits-notice/ai-credits-notice.agent.d.ts.map +1 -0
  88. package/dist/components/ai-credits-notice/ai-credits-notice.d.ts +48 -0
  89. package/dist/components/ai-credits-notice/ai-credits-notice.d.ts.map +1 -0
  90. package/dist/components/ai-credits-notice/index.d.ts +4 -0
  91. package/dist/components/ai-credits-notice/index.d.ts.map +1 -0
  92. package/dist/components/ai-credits-notice/index.js +7 -0
  93. package/dist/components/ai-credits-notice/index.js.map +1 -0
  94. package/dist/components/{ai-consent-banner/ai-consent-banner.agent.d.ts → ai-permission-notice/ai-permission-notice.agent.d.ts} +2 -2
  95. package/dist/components/ai-permission-notice/ai-permission-notice.agent.d.ts.map +1 -0
  96. package/dist/components/{ai-consent-banner/ai-consent-banner.d.ts → ai-permission-notice/ai-permission-notice.d.ts} +1 -1
  97. package/dist/components/ai-permission-notice/ai-permission-notice.d.ts.map +1 -0
  98. package/dist/components/ai-permission-notice/index.d.ts +4 -0
  99. package/dist/components/ai-permission-notice/index.d.ts.map +1 -0
  100. package/dist/components/{ai-consent-banner → ai-permission-notice}/index.js +1 -1
  101. package/dist/components/ai-sparkle/ai-sparkle.d.ts +3 -3
  102. package/dist/components/ai-sparkle/ai-sparkle.d.ts.map +1 -1
  103. package/dist/components/ai-sparkle/index.js +1 -1
  104. package/dist/components/appointment-card/index.js +2 -2
  105. package/dist/components/appointment-peek/index.js +1 -1
  106. package/dist/components/appointment-timeline/index.js +1 -1
  107. package/dist/components/booking/booking-types.d.ts +60 -1
  108. package/dist/components/booking/booking-types.d.ts.map +1 -1
  109. package/dist/components/booking/booking.agent.d.ts.map +1 -1
  110. package/dist/components/booking/booking.d.ts +1 -1
  111. package/dist/components/booking/booking.d.ts.map +1 -1
  112. package/dist/components/booking/details-form.d.ts +5 -1
  113. package/dist/components/booking/details-form.d.ts.map +1 -1
  114. package/dist/components/booking/index.d.ts +1 -1
  115. package/dist/components/booking/index.d.ts.map +1 -1
  116. package/dist/components/booking/index.js +1 -1
  117. package/dist/components/booking/payment.d.ts +9 -0
  118. package/dist/components/booking/payment.d.ts.map +1 -0
  119. package/dist/components/booking/use-booking-payment.d.ts +14 -0
  120. package/dist/components/booking/use-booking-payment.d.ts.map +1 -0
  121. package/dist/components/button-group/button-group.d.ts.map +1 -1
  122. package/dist/components/button-group/index.js +1 -1
  123. package/dist/components/calendar/index.js +1 -1
  124. package/dist/components/calendar-event-card/calendar-event-card.d.ts.map +1 -1
  125. package/dist/components/calendar-event-card/index.js +1 -1
  126. package/dist/components/chart/index.js +1 -1
  127. package/dist/components/data-table/index.js +3 -3
  128. package/dist/components/face-scheme/index.js +1 -1
  129. package/dist/components/file-manager/index.js +1 -1
  130. package/dist/components/freemium-paywall/index.js +1 -1
  131. package/dist/components/header-settings/index.js +1 -1
  132. package/dist/components/hover-card/hover-card.d.ts +4 -0
  133. package/dist/components/hover-card/hover-card.d.ts.map +1 -1
  134. package/dist/components/hover-card/index.d.ts +1 -1
  135. package/dist/components/hover-card/index.d.ts.map +1 -1
  136. package/dist/components/hover-card/index.js +3 -2
  137. package/dist/components/icon-button-group/icon-button-group.d.ts.map +1 -1
  138. package/dist/components/icon-button-group/index.js +1 -1
  139. package/dist/components/index.d.ts +2 -1
  140. package/dist/components/index.d.ts.map +1 -1
  141. package/dist/components/notes-panel/index.js +1 -1
  142. package/dist/components/notes-panel/notes-panel.d.ts +10 -0
  143. package/dist/components/notes-panel/notes-panel.d.ts.map +1 -1
  144. package/dist/components/patient-details/index.js +1 -1
  145. package/dist/components/patient-summary-card/index.js +1 -1
  146. package/dist/components/patient-summary-card/patient-summary-card.d.ts.map +1 -1
  147. package/dist/components/patient-table/index.js +1 -1
  148. package/dist/components/payment-form/index.d.ts +1 -1
  149. package/dist/components/payment-form/index.d.ts.map +1 -1
  150. package/dist/components/payment-form/index.js +1 -1
  151. package/dist/components/payment-form/payment-form.d.ts +35 -3
  152. package/dist/components/payment-form/payment-form.d.ts.map +1 -1
  153. package/dist/components/phone-input/index.js +1 -1
  154. package/dist/components/phone-input/phone-input.d.ts.map +1 -1
  155. package/dist/components/rich-text-editor/editor-extensions.d.ts +54 -0
  156. package/dist/components/rich-text-editor/editor-extensions.d.ts.map +1 -0
  157. package/dist/components/rich-text-editor/editor-toolbar.d.ts +2 -1
  158. package/dist/components/rich-text-editor/editor-toolbar.d.ts.map +1 -1
  159. package/dist/components/rich-text-editor/help-me-write-overlay.d.ts +4 -0
  160. package/dist/components/rich-text-editor/help-me-write-overlay.d.ts.map +1 -1
  161. package/dist/components/rich-text-editor/index.d.ts +2 -0
  162. package/dist/components/rich-text-editor/index.d.ts.map +1 -1
  163. package/dist/components/rich-text-editor/index.js +6 -4
  164. package/dist/components/rich-text-editor/index.js.map +1 -1
  165. package/dist/components/rich-text-editor/kit-extensions.d.ts +4 -0
  166. package/dist/components/rich-text-editor/kit-extensions.d.ts.map +1 -0
  167. package/dist/components/rich-text-editor/rich-text-editor.d.ts +18 -2
  168. package/dist/components/rich-text-editor/rich-text-editor.d.ts.map +1 -1
  169. package/dist/components/stepper-accordion/index.js +1 -1
  170. package/dist/components/stepper-accordion/stepper-accordion.d.ts.map +1 -1
  171. package/dist/components/tasks-panel/index.js +1 -1
  172. package/dist/components/theme-toggle/index.js +1 -1
  173. package/dist/components/workflow-status/index.js +1 -1
  174. package/dist/components/workflow-status/workflow-status.d.ts.map +1 -1
  175. package/dist/hooks/index.d.ts +1 -1
  176. package/dist/hooks/index.d.ts.map +1 -1
  177. package/dist/hooks/index.js +51 -53
  178. package/dist/hooks/use-ai-sparkle.d.ts +7 -25
  179. package/dist/hooks/use-ai-sparkle.d.ts.map +1 -1
  180. package/dist/host-compat.css +2 -2
  181. package/dist/i18n/locales/ar.d.ts +67 -1
  182. package/dist/i18n/locales/ar.d.ts.map +1 -1
  183. package/dist/i18n/locales/ar.js +69 -3
  184. package/dist/i18n/locales/ar.js.map +1 -1
  185. package/dist/i18n/locales/de.d.ts +67 -1
  186. package/dist/i18n/locales/de.d.ts.map +1 -1
  187. package/dist/i18n/locales/de.js +69 -3
  188. package/dist/i18n/locales/de.js.map +1 -1
  189. package/dist/i18n/locales/el.d.ts +67 -1
  190. package/dist/i18n/locales/el.d.ts.map +1 -1
  191. package/dist/i18n/locales/el.js +69 -3
  192. package/dist/i18n/locales/el.js.map +1 -1
  193. package/dist/i18n/locales/en.d.ts +67 -1
  194. package/dist/i18n/locales/en.d.ts.map +1 -1
  195. package/dist/i18n/locales/en.js +69 -3
  196. package/dist/i18n/locales/en.js.map +1 -1
  197. package/dist/i18n/locales/es.d.ts +67 -1
  198. package/dist/i18n/locales/es.d.ts.map +1 -1
  199. package/dist/i18n/locales/es.js +69 -3
  200. package/dist/i18n/locales/es.js.map +1 -1
  201. package/dist/i18n/locales/fr.d.ts +67 -1
  202. package/dist/i18n/locales/fr.d.ts.map +1 -1
  203. package/dist/i18n/locales/fr.js +69 -3
  204. package/dist/i18n/locales/fr.js.map +1 -1
  205. package/dist/i18n/locales/hi.d.ts +67 -1
  206. package/dist/i18n/locales/hi.d.ts.map +1 -1
  207. package/dist/i18n/locales/hi.js +69 -3
  208. package/dist/i18n/locales/hi.js.map +1 -1
  209. package/dist/i18n/locales/it.d.ts +67 -1
  210. package/dist/i18n/locales/it.d.ts.map +1 -1
  211. package/dist/i18n/locales/it.js +69 -3
  212. package/dist/i18n/locales/it.js.map +1 -1
  213. package/dist/i18n/locales/ja.d.ts +67 -1
  214. package/dist/i18n/locales/ja.d.ts.map +1 -1
  215. package/dist/i18n/locales/ja.js +69 -3
  216. package/dist/i18n/locales/ja.js.map +1 -1
  217. package/dist/i18n/locales/nl.d.ts +67 -1
  218. package/dist/i18n/locales/nl.d.ts.map +1 -1
  219. package/dist/i18n/locales/nl.js +69 -3
  220. package/dist/i18n/locales/nl.js.map +1 -1
  221. package/dist/i18n/locales/pl.d.ts +67 -1
  222. package/dist/i18n/locales/pl.d.ts.map +1 -1
  223. package/dist/i18n/locales/pl.js +69 -3
  224. package/dist/i18n/locales/pl.js.map +1 -1
  225. package/dist/i18n/locales/pt.d.ts +67 -1
  226. package/dist/i18n/locales/pt.d.ts.map +1 -1
  227. package/dist/i18n/locales/pt.js +69 -3
  228. package/dist/i18n/locales/pt.js.map +1 -1
  229. package/dist/i18n/locales/ro.d.ts +67 -1
  230. package/dist/i18n/locales/ro.d.ts.map +1 -1
  231. package/dist/i18n/locales/ro.js +69 -3
  232. package/dist/i18n/locales/ro.js.map +1 -1
  233. package/dist/i18n/locales/ru.d.ts +67 -1
  234. package/dist/i18n/locales/ru.d.ts.map +1 -1
  235. package/dist/i18n/locales/ru.js +69 -3
  236. package/dist/i18n/locales/ru.js.map +1 -1
  237. package/dist/i18n/locales/sq.d.ts +67 -1
  238. package/dist/i18n/locales/sq.d.ts.map +1 -1
  239. package/dist/i18n/locales/sq.js +69 -3
  240. package/dist/i18n/locales/sq.js.map +1 -1
  241. package/dist/i18n/locales/sv.d.ts +67 -1
  242. package/dist/i18n/locales/sv.d.ts.map +1 -1
  243. package/dist/i18n/locales/sv.js +69 -3
  244. package/dist/i18n/locales/sv.js.map +1 -1
  245. package/dist/i18n/locales/tr.d.ts +67 -1
  246. package/dist/i18n/locales/tr.d.ts.map +1 -1
  247. package/dist/i18n/locales/tr.js +69 -3
  248. package/dist/i18n/locales/tr.js.map +1 -1
  249. package/dist/i18n/locales/zh.d.ts +67 -1
  250. package/dist/i18n/locales/zh.d.ts.map +1 -1
  251. package/dist/i18n/locales/zh.js +69 -3
  252. package/dist/i18n/locales/zh.js.map +1 -1
  253. package/dist/index.js +648 -641
  254. package/dist/index.js.map +1 -1
  255. package/dist/locales/ar.json +69 -3
  256. package/dist/locales/de.json +69 -3
  257. package/dist/locales/el.json +69 -3
  258. package/dist/locales/en.json +69 -3
  259. package/dist/locales/es.json +69 -3
  260. package/dist/locales/fr.json +69 -3
  261. package/dist/locales/hi.json +69 -3
  262. package/dist/locales/it.json +69 -3
  263. package/dist/locales/ja.json +69 -3
  264. package/dist/locales/nl.json +69 -3
  265. package/dist/locales/pl.json +69 -3
  266. package/dist/locales/pt.json +69 -3
  267. package/dist/locales/ro.json +69 -3
  268. package/dist/locales/ru.json +69 -3
  269. package/dist/locales/sq.json +69 -3
  270. package/dist/locales/sv.json +69 -3
  271. package/dist/locales/tr.json +69 -3
  272. package/dist/locales/zh.json +69 -3
  273. package/dist/patterns/anamnesis/index.js +1 -1
  274. package/dist/patterns/calendar/calendar-appointment-details.d.ts.map +1 -1
  275. package/dist/patterns/calendar/calendar-appointment-details.sections.d.ts.map +1 -1
  276. package/dist/patterns/calendar/calendar-bookings-panel.d.ts.map +1 -1
  277. package/dist/patterns/calendar/calendar-editor-fields.d.ts +33 -0
  278. package/dist/patterns/calendar/calendar-editor-fields.d.ts.map +1 -0
  279. package/dist/patterns/calendar/calendar-sticky-offset.d.ts +20 -0
  280. package/dist/patterns/calendar/calendar-sticky-offset.d.ts.map +1 -0
  281. package/dist/patterns/calendar/calendar-task-editor.d.ts.map +1 -1
  282. package/dist/patterns/calendar/calendar-workspace.d.ts +6 -4
  283. package/dist/patterns/calendar/calendar-workspace.d.ts.map +1 -1
  284. package/dist/patterns/calendar/calendar.data.d.ts +26 -0
  285. package/dist/patterns/calendar/calendar.data.d.ts.map +1 -1
  286. package/dist/patterns/calendar/calendar.journey.d.ts +1 -1
  287. package/dist/patterns/calendar/calendar.journey.d.ts.map +1 -1
  288. package/dist/patterns/calendar/calendar.sheets.d.ts +16 -5
  289. package/dist/patterns/calendar/calendar.sheets.d.ts.map +1 -1
  290. package/dist/patterns/calendar/calendar.surface.d.ts.map +1 -1
  291. package/dist/patterns/calendar/calendar.types.d.ts +25 -9
  292. package/dist/patterns/calendar/calendar.types.d.ts.map +1 -1
  293. package/dist/patterns/calendar/index.js +1 -1
  294. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts +11 -2
  295. package/dist/patterns/help-me-write-templates/help-me-write-templates.d.ts.map +1 -1
  296. package/dist/patterns/help-me-write-templates/index.js +1 -1
  297. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  298. package/dist/tokens.css +1 -1
  299. package/package.json +14 -4
  300. package/dist/_chunks/ai-consent-banner-D7I2U-cz.js.map +0 -1
  301. package/dist/_chunks/ai-sparkle-DXeP_6a0.js +0 -52
  302. package/dist/_chunks/ai-sparkle-DXeP_6a0.js.map +0 -1
  303. package/dist/_chunks/booking-D43ASl8y.js +0 -3034
  304. package/dist/_chunks/booking-D43ASl8y.js.map +0 -1
  305. package/dist/_chunks/button-group-R32U7SyV.js +0 -307
  306. package/dist/_chunks/button-group-R32U7SyV.js.map +0 -1
  307. package/dist/_chunks/calendar-workspace-B7KvZ1_D.js +0 -12161
  308. package/dist/_chunks/calendar-workspace-B7KvZ1_D.js.map +0 -1
  309. package/dist/_chunks/help-me-write-templates-GUeEn3Ff.js.map +0 -1
  310. package/dist/_chunks/icon-button-group-DkkdIygu.js.map +0 -1
  311. package/dist/_chunks/notes-panel-Dkk9QPPX.js.map +0 -1
  312. package/dist/_chunks/patient-field-row-BRSOKvme.js.map +0 -1
  313. package/dist/_chunks/patient-summary-card-BhmKB2KR.js.map +0 -1
  314. package/dist/_chunks/payment-form-BHMDqW9C.js +0 -767
  315. package/dist/_chunks/payment-form-BHMDqW9C.js.map +0 -1
  316. package/dist/_chunks/rich-text-editor-BrAvNajV.js +0 -3779
  317. package/dist/_chunks/rich-text-editor-BrAvNajV.js.map +0 -1
  318. package/dist/_chunks/use-ai-sparkle-CyQSRTCe.js +0 -103
  319. package/dist/_chunks/use-ai-sparkle-CyQSRTCe.js.map +0 -1
  320. package/dist/components/ai-consent-banner/ai-consent-banner.agent.d.ts.map +0 -1
  321. package/dist/components/ai-consent-banner/ai-consent-banner.d.ts.map +0 -1
  322. package/dist/components/ai-consent-banner/index.d.ts +0 -4
  323. package/dist/components/ai-consent-banner/index.d.ts.map +0 -1
  324. /package/dist/components/{ai-consent-banner → ai-permission-notice}/index.js.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"theme-toggle-bI0pgDDv.js","sources":["../../src/components/theme-toggle/theme-toggle.agent.ts","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ThemeToggle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ThemeToggleHandle } from './theme-toggle';\n\nexport const themeToggleAgent: AgentAdapter<ThemeToggleHandle> = {\n id: 'theme-toggle',\n capabilities: ['set_value'],\n state: {\n currentTheme: {\n type: 'ThemePreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentTheme',\n description: 'Active theme preference: light, dark, or system.',\n read: (handle) => handle.getCurrentTheme(),\n },\n currentAccessibility: {\n type: 'AccessibilityPreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentAccessibility',\n description: 'Active accessibility preference: default or accessible.',\n read: (handle) => handle.getCurrentAccessibility(),\n },\n },\n actions: {\n set_theme: {\n safety: 'write',\n argsType: '{ theme: \"light\" | \"dark\" | \"system\" }',\n argsSchema: {\n type: 'object',\n properties: { theme: { enum: ['light', 'dark', 'system'] } },\n required: ['theme'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setTheme',\n description: 'Switch the theme preference.',\n invoke: (handle, args: { theme: 'light' | 'dark' | 'system' }) => {\n handle.setTheme(args.theme);\n },\n },\n set_accessibility: {\n safety: 'write',\n argsType: '{ accessibility: \"default\" | \"accessible\" }',\n argsSchema: {\n type: 'object',\n properties: { accessibility: { enum: ['default', 'accessible'] } },\n required: ['accessibility'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setAccessibility',\n description: 'Switch the accessibility preference.',\n invoke: (handle, args: { accessibility: 'default' | 'accessible' }) => {\n handle.setAccessibility(args.accessibility);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'theme-toggle',\n description: 'Marks the ThemeToggle wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { themeToggleAgent } from './theme-toggle.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ThemeToggleHandle {\n getCurrentTheme: () => ThemePreference;\n getCurrentAccessibility: () => AccessibilityPreference;\n setTheme: (next: ThemePreference) => void;\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation();\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation();\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) => onValueChange(next ? 'accessible' : 'default')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.Ref<HTMLDivElement>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n const triggerIcon =\n state.resolvedTheme === 'dark' ||\n state.resolvedTheme === 'dark-accessible' ? (\n <Moon aria-hidden />\n ) : (\n <Sun aria-hidden />\n );\n\n const accessibleChecked = state.accessibility === 'accessible';\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content align=\"end\" sideOffset={8}>\n <DropdownMenu.Label>\n {t('navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) => state.setTheme(next as ThemePreference)}\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<HTMLDivElement, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n id,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props as ThemeToggleProps & { id?: string };\n\n const state = useResolvedTheme(props);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // Internal variant wrappers attach refs to <div> elements; we forward that\n // DOM node as the public ref (Pattern B). The agent handle is registered\n // separately via useAgentRegistration.\n const forwardedRef = useRef<HTMLDivElement | null>(null);\n useImperativeHandle(ref, () => forwardedRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<ThemeToggleHandle>(\n () => ({\n getCurrentTheme: () => stateRef.current.theme,\n getCurrentAccessibility: () => stateRef.current.accessibility,\n setTheme: (next) => stateRef.current.setTheme(next),\n setAccessibility: (next) => stateRef.current.setAccessibility(next),\n }),\n [],\n );\n useAgentRegistration(themeToggleAgent, agentHandle, id);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["themeToggleAgent","handle","args","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","Sun","Moon","Monitor","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","id","_theme","_accessibility","_onThemeChange","_onAccessibilityChange","stateRef","useRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration"],"mappings":"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"}
1
+ {"version":3,"file":"theme-toggle-BP0XRGMM.js","sources":["../../src/components/theme-toggle/theme-toggle.agent.ts","../../src/components/theme-toggle/theme-toggle.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — ThemeToggle. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { ThemeToggleHandle } from './theme-toggle';\n\nexport const themeToggleAgent: AgentAdapter<ThemeToggleHandle> = {\n id: 'theme-toggle',\n capabilities: ['set_value'],\n state: {\n currentTheme: {\n type: 'ThemePreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentTheme',\n description: 'Active theme preference: light, dark, or system.',\n read: (handle) => handle.getCurrentTheme(),\n },\n currentAccessibility: {\n type: 'AccessibilityPreference',\n descriptionKey: 'ui.agent.themeToggle.state.currentAccessibility',\n description: 'Active accessibility preference: default or accessible.',\n read: (handle) => handle.getCurrentAccessibility(),\n },\n },\n actions: {\n set_theme: {\n safety: 'write',\n argsType: '{ theme: \"light\" | \"dark\" | \"system\" }',\n argsSchema: {\n type: 'object',\n properties: { theme: { enum: ['light', 'dark', 'system'] } },\n required: ['theme'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setTheme',\n description: 'Switch the theme preference.',\n invoke: (handle, args: { theme: 'light' | 'dark' | 'system' }) => {\n handle.setTheme(args.theme);\n },\n },\n set_accessibility: {\n safety: 'write',\n argsType: '{ accessibility: \"default\" | \"accessible\" }',\n argsSchema: {\n type: 'object',\n properties: { accessibility: { enum: ['default', 'accessible'] } },\n required: ['accessibility'],\n },\n idempotent: true,\n descriptionKey: 'ui.agent.themeToggle.actions.setAccessibility',\n description: 'Switch the accessibility preference.',\n invoke: (handle, args: { accessibility: 'default' | 'accessible' }) => {\n handle.setAccessibility(args.accessibility);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'theme-toggle',\n description: 'Marks the ThemeToggle wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { Monitor, Moon, Sun } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { IconButtonGroup } from '../icon-button-group/icon-button-group';\nimport { Switch } from '../switch/switch';\nimport { DropdownMenu } from '../dropdown-menu/dropdown-menu';\nimport {\n useTheme,\n type AccessibilityPreference,\n type ThemePreference,\n type UseThemeReturn,\n} from '../../hooks';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { themeToggleAgent } from './theme-toggle.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst wrapperVariants = cva('ds:inline-flex ds:items-center', {\n variants: {\n variant: {\n menu: '',\n compact: '',\n split: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { variant: 'menu' },\n});\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport type ThemeToggleVariant = 'menu' | 'compact' | 'split';\n\ninterface ThemeToggleBaseProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'onChange'>,\n VariantProps<typeof wrapperVariants> {\n /**\n * Visual form factor.\n * - `menu` (default) — single trigger that opens a dropdown with both\n * Appearance and Accessibility controls. Best for headers / nav rails.\n * - `compact` — segmented Appearance control only. Use when accessibility\n * lives on a separate settings surface.\n * - `split` — segmented Appearance control plus an inline Accessibility\n * switch. Best for full-width settings panels.\n */\n variant?: ThemeToggleVariant;\n /** Hide the accessibility control. Ignored on `compact`, which never renders it. */\n showAccessibility?: boolean;\n /**\n * Controlled escape hatch — when omitted the component reads/writes\n * `useTheme()` directly so it can drop into any header with no wiring.\n * Pass all four to opt into controlled mode.\n */\n theme?: ThemePreference;\n accessibility?: AccessibilityPreference;\n onThemeChange?: (next: ThemePreference) => void;\n onAccessibilityChange?: (next: AccessibilityPreference) => void;\n}\n\nexport type ThemeToggleProps = ThemeToggleBaseProps;\n\n/** Curated imperative handle for agent / external automation. */\nexport interface ThemeToggleHandle {\n getCurrentTheme: () => ThemePreference;\n getCurrentAccessibility: () => AccessibilityPreference;\n setTheme: (next: ThemePreference) => void;\n setAccessibility: (next: AccessibilityPreference) => void;\n}\n\n/* ------------------------------------------------------------------ */\n/* Hook adapter */\n/* ------------------------------------------------------------------ */\n\n/**\n * Resolves controlled props against the store. When the consumer passes\n * `theme` / `onThemeChange` (etc.) we honour those; otherwise we fall\n * through to the singleton `useTheme()` hook so a bare `<ThemeToggle />`\n * works with zero wiring.\n */\nfunction useResolvedTheme(props: ThemeToggleBaseProps): UseThemeReturn {\n const {\n theme: themeProp,\n accessibility: accessibilityProp,\n onThemeChange,\n onAccessibilityChange,\n } = props;\n const store = useTheme();\n const theme = themeProp ?? store.theme;\n const accessibility = accessibilityProp ?? store.accessibility;\n\n const storeSetTheme = store.setTheme;\n const storeSetAccessibility = store.setAccessibility;\n\n const setTheme = useCallback(\n (next: ThemePreference) => {\n if (onThemeChange) {\n onThemeChange(next);\n return;\n }\n storeSetTheme(next);\n },\n [onThemeChange, storeSetTheme],\n );\n\n const setAccessibility = useCallback(\n (next: AccessibilityPreference) => {\n if (onAccessibilityChange) {\n onAccessibilityChange(next);\n return;\n }\n storeSetAccessibility(next);\n },\n [onAccessibilityChange, storeSetAccessibility],\n );\n\n return {\n theme,\n accessibility,\n resolvedTheme: store.resolvedTheme,\n setTheme,\n setAccessibility,\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-pieces */\n/* ------------------------------------------------------------------ */\n\ninterface AppearanceSegmentProps {\n value: ThemePreference;\n onValueChange: (next: ThemePreference) => void;\n ariaLabel: string;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AppearanceSegment({\n value,\n onValueChange,\n ariaLabel,\n size = 'md',\n}: AppearanceSegmentProps) {\n const { t } = useTranslation();\n return (\n <IconButtonGroup\n aria-label={ariaLabel}\n role=\"radiogroup\"\n mode=\"toggle-single\"\n size={size}\n value={value}\n onValueChange={(next) => onValueChange(next as ThemePreference)}\n >\n <IconButton\n icon={<Sun aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.light')}\n value=\"light\"\n />\n <IconButton\n icon={<Moon aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.dark')}\n value=\"dark\"\n />\n <IconButton\n icon={<Monitor aria-hidden />}\n aria-label={t('navigation.themeToggle.appearance.system')}\n value=\"system\"\n />\n </IconButtonGroup>\n );\n}\n\ninterface AccessibilitySwitchProps {\n value: AccessibilityPreference;\n onValueChange: (next: AccessibilityPreference) => void;\n size?: 'sm' | 'md' | 'lg';\n}\n\nfunction AccessibilitySwitch({\n value,\n onValueChange,\n size = 'md',\n}: AccessibilitySwitchProps) {\n const { t } = useTranslation();\n // 'system' is treated as \"off\" visually — the OS preference flows through\n // automatically. Flipping the switch on creates an explicit override.\n const checked = value === 'accessible';\n return (\n <Switch\n label={t('navigation.themeToggle.accessibility.label')}\n labelSide=\"start\"\n size={size}\n checked={checked}\n onCheckedChange={(next) => onValueChange(next ? 'accessible' : 'default')}\n />\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Variants */\n/* ------------------------------------------------------------------ */\n\ninterface VariantRenderProps {\n state: UseThemeReturn;\n className?: string;\n rest: HTMLAttributes<HTMLDivElement>;\n forwardedRef: React.Ref<HTMLDivElement>;\n showAccessibility: boolean;\n}\n\nfunction MenuVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n const triggerIcon =\n state.resolvedTheme === 'dark' ||\n state.resolvedTheme === 'dark-accessible' ? (\n <Moon aria-hidden />\n ) : (\n <Sun aria-hidden />\n );\n\n const accessibleChecked = state.accessibility === 'accessible';\n\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'menu', className })}\n {...rest}\n >\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <IconButton\n icon={triggerIcon}\n aria-label={t('navigation.themeToggle.trigger')}\n />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content align=\"end\" sideOffset={8}>\n <DropdownMenu.Label>\n {t('navigation.themeToggle.appearance.label')}\n </DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={state.theme}\n onValueChange={(next) => state.setTheme(next as ThemePreference)}\n >\n <DropdownMenu.RadioItem value=\"light\">\n <Sun aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.light')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"dark\">\n <Moon aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.dark')}\n </DropdownMenu.RadioItem>\n <DropdownMenu.RadioItem value=\"system\">\n <Monitor aria-hidden className=\"ds:size-4\" />\n {t('navigation.themeToggle.appearance.system')}\n </DropdownMenu.RadioItem>\n </DropdownMenu.RadioGroup>\n {showAccessibility ? (\n <>\n <DropdownMenu.Separator />\n {/* CheckboxItem keeps the accessibility toggle inside the\n Radix menu collection so ArrowDown reaches it and Space\n activates it; `onSelect={preventDefault}` prevents the\n menu from closing on toggle. */}\n <DropdownMenu.CheckboxItem\n checked={accessibleChecked}\n onCheckedChange={(next) =>\n state.setAccessibility(next ? 'accessible' : 'default')\n }\n onSelect={(event) => event.preventDefault()}\n >\n {t('navigation.themeToggle.accessibility.label')}\n </DropdownMenu.CheckboxItem>\n </>\n ) : null}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\nfunction CompactVariant({\n state,\n className,\n rest,\n forwardedRef,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'compact', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n </div>\n );\n}\n\nfunction SplitVariant({\n state,\n className,\n rest,\n forwardedRef,\n showAccessibility,\n}: VariantRenderProps) {\n const { t } = useTranslation();\n return (\n <div\n ref={forwardedRef}\n data-component=\"theme-toggle\"\n data-component-id={rest.id}\n className={wrapperVariants({ variant: 'split', className })}\n {...rest}\n >\n <AppearanceSegment\n value={state.theme}\n onValueChange={state.setTheme}\n ariaLabel={t('navigation.themeToggle.appearance.label')}\n />\n {showAccessibility ? (\n <AccessibilitySwitch\n value={state.accessibility}\n onValueChange={state.setAccessibility}\n />\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* ThemeToggle */\n/* ------------------------------------------------------------------ */\n\nexport const ThemeToggle = forwardRef<HTMLDivElement, ThemeToggleProps>(\n (props, ref) => {\n const {\n variant = 'menu',\n showAccessibility = true,\n className,\n id,\n // Strip controlled props from the spread — they are read by the\n // adapter, not by the DOM element.\n theme: _theme,\n accessibility: _accessibility,\n onThemeChange: _onThemeChange,\n onAccessibilityChange: _onAccessibilityChange,\n ...rest\n } = props as ThemeToggleProps & { id?: string };\n\n const state = useResolvedTheme(props);\n const stateRef = useRef(state);\n stateRef.current = state;\n\n // Internal variant wrappers attach refs to <div> elements; we forward that\n // DOM node as the public ref (Pattern B). The agent handle is registered\n // separately via useAgentRegistration.\n const forwardedRef = useRef<HTMLDivElement | null>(null);\n useImperativeHandle(ref, () => forwardedRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<ThemeToggleHandle>(\n () => ({\n getCurrentTheme: () => stateRef.current.theme,\n getCurrentAccessibility: () => stateRef.current.accessibility,\n setTheme: (next) => stateRef.current.setTheme(next),\n setAccessibility: (next) => stateRef.current.setAccessibility(next),\n }),\n [],\n );\n useAgentRegistration(themeToggleAgent, agentHandle, id);\n\n if (variant === 'compact') {\n return (\n <CompactVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n if (variant === 'split') {\n return (\n <SplitVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n }\n return (\n <MenuVariant\n state={state}\n className={className}\n rest={rest}\n forwardedRef={forwardedRef}\n showAccessibility={showAccessibility}\n />\n );\n },\n);\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":["themeToggleAgent","handle","args","wrapperVariants","cva","useResolvedTheme","props","themeProp","accessibilityProp","onThemeChange","onAccessibilityChange","store","useTheme","theme","accessibility","storeSetTheme","storeSetAccessibility","setTheme","useCallback","next","setAccessibility","AppearanceSegment","value","onValueChange","ariaLabel","size","t","useTranslation","jsxs","IconButtonGroup","jsx","IconButton","Sun","Moon","Monitor","AccessibilitySwitch","checked","Switch","MenuVariant","state","className","rest","forwardedRef","showAccessibility","triggerIcon","accessibleChecked","DropdownMenu","Fragment","event","CompactVariant","SplitVariant","ThemeToggle","forwardRef","ref","variant","id","_theme","_accessibility","_onThemeChange","_onAccessibilityChange","stateRef","useRef","useImperativeHandle","agentHandle","useMemo","useAgentRegistration"],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { useState as _, useEffect as v, useCallback as n } from "react";
2
+ import { u as y } from "./use-prefers-reduced-motion-BMwIQRjB.js";
3
+ const p = {
4
+ intro: 1840,
5
+ landed: 1440
6
+ }, f = {
7
+ intro: "ds:animate-[ai-pill-shimmer_calc(var(--animation-duration)*6)_var(--ease-in-out)_1]",
8
+ working: "ds:animate-[ai-pill-shimmer_calc(var(--animation-duration)*6)_var(--ease-in-out)_infinite]",
9
+ landed: "ds:animate-[ai-pill-shimmer_calc(var(--animation-duration)*4)_var(--ease-out)_1]"
10
+ }, g = {
11
+ intro: "ds:animate-[ai-comet-orbit_calc(var(--animation-duration)*7)_var(--ease-in-out)_1_both]",
12
+ working: "ds:animate-[ai-comet-orbit_calc(var(--animation-duration)*8)_linear_infinite]",
13
+ landed: "ds:animate-[ai-comet-orbit_calc(var(--animation-duration)*5)_var(--ease-out)_1_both]"
14
+ }, b = "ds:pointer-events-none ds:absolute ds:[inset-block-start:0] ds:[inset-inline-start:0] ds:opacity-0 ds:[offset-path:inset(0_round_var(--radius-full))] ds:[offset-rotate:0deg]", C = [
15
+ {
16
+ key: 1,
17
+ lag: "ds:[animation-delay:calc(var(--animation-duration)*0.2)]",
18
+ dot: "ds:size-2.5 ds:opacity-[var(--opacity-90)]"
19
+ },
20
+ {
21
+ key: 2,
22
+ lag: "ds:[animation-delay:calc(var(--animation-duration)*0.4)]",
23
+ dot: "ds:size-2 ds:opacity-[var(--opacity-70)]"
24
+ },
25
+ {
26
+ key: 3,
27
+ lag: "ds:[animation-delay:calc(var(--animation-duration)*0.6)]",
28
+ dot: "ds:size-2 ds:opacity-[var(--opacity-50)]"
29
+ },
30
+ {
31
+ key: 4,
32
+ lag: "ds:[animation-delay:calc(var(--animation-duration)*0.8)]",
33
+ dot: "ds:size-1.5 ds:opacity-[var(--opacity-30)]"
34
+ },
35
+ {
36
+ key: 5,
37
+ lag: "ds:[animation-delay:calc(var(--animation-duration)*1)]",
38
+ dot: "ds:size-1.5 ds:opacity-[var(--opacity-20)]"
39
+ },
40
+ {
41
+ key: 6,
42
+ lag: "ds:[animation-delay:calc(var(--animation-duration)*1.2)]",
43
+ dot: "ds:size-1 ds:opacity-[var(--opacity-10)]"
44
+ }
45
+ ];
46
+ function w(e = {}) {
47
+ const { enabled: s = !0, reducedMotion: d = "auto" } = e, r = y(), o = d === "off" ? !1 : r, [a, t] = _(
48
+ s ? "intro" : null
49
+ );
50
+ v(() => {
51
+ if (a !== "intro" && a !== "landed") return;
52
+ const i = o ? 0 : p[a], u = window.setTimeout(() => t(null), i);
53
+ return () => window.clearTimeout(u);
54
+ }, [a, o]);
55
+ const c = n(() => t("working"), []), l = n(() => t("landed"), []), m = n(() => {
56
+ t((i) => i === "working" ? null : i);
57
+ }, []);
58
+ return {
59
+ state: a,
60
+ props: {
61
+ "data-ai-sparkle": a ?? void 0,
62
+ className: a ? f[a] : ""
63
+ },
64
+ start: c,
65
+ land: l,
66
+ reset: m
67
+ };
68
+ }
69
+ export {
70
+ C,
71
+ f as S,
72
+ b as a,
73
+ g as b,
74
+ w as u
75
+ };
76
+ //# sourceMappingURL=use-ai-sparkle-Cf4yVTLB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-ai-sparkle-Cf4yVTLB.js","sources":["../../src/hooks/use-ai-sparkle.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\nimport { usePrefersReducedMotion } from './use-prefers-reduced-motion';\n\n/* -------------------------------------------------------------------- */\n/* Shared class tables — read by the hook (shimmer) and by the */\n/* `AiSparkle` presentational component (the comet layer), so both */\n/* sides key off the same three states. */\n/* -------------------------------------------------------------------- */\n\n/** Where the sparkle is: on first show, while an action runs, as it lands. */\nexport type AiSparkleState = 'intro' | 'working' | 'landed';\n\n// How long the one-off sparkles stay lit at the default 200ms\n// `--animation-duration` — everything the comet paints, plus one\n// `--animation-duration` of buffer so the clear never lands mid-fade.\n// `COMET_CLASS` runs the head's lap over 7 durations on intro and 5 on\n// landing, and the faintest tail dot starts 1.2 durations behind the head\n// (`COMET_TAIL`), so the last thing on screen ends a lap plus 1.2 durations\n// in: (7+1.2+1)*200 = 1840 and (5+1.2+1)*200 = 1440. Leave the tail's lag\n// out and the last dot is unmounted mid-flight. Scaled to 0 under reduced\n// motion (see `useAiSparkle`).\nconst SPARKLE_ONCE_MS: Record<'intro' | 'landed', number> = {\n intro: 1840,\n landed: 1440,\n};\n\n// Pill sparkle: a light sweep across the surface. Durations derive from\n// `--animation-duration`, so they drop to 0 (no motion) under\n// prefers-reduced-motion and in the accessible themes.\nexport const SHIMMER_CLASS: Record<AiSparkleState, string> = {\n intro:\n 'ds:animate-[ai-pill-shimmer_calc(var(--animation-duration)*6)_var(--ease-in-out)_1]',\n working:\n 'ds:animate-[ai-pill-shimmer_calc(var(--animation-duration)*6)_var(--ease-in-out)_infinite]',\n landed:\n 'ds:animate-[ai-pill-shimmer_calc(var(--animation-duration)*4)_var(--ease-out)_1]',\n};\n\n// The comet laps the pill: once on intro, faster on landing, looping while\n// an action runs. `offset-path` traces the pill's rounded outline; where it\n// is unsupported the comet simply never shows (it rests at opacity 0).\nexport const COMET_CLASS: Record<AiSparkleState, string> = {\n intro:\n 'ds:animate-[ai-comet-orbit_calc(var(--animation-duration)*7)_var(--ease-in-out)_1_both]',\n working:\n 'ds:animate-[ai-comet-orbit_calc(var(--animation-duration)*8)_linear_infinite]',\n landed:\n 'ds:animate-[ai-comet-orbit_calc(var(--animation-duration)*5)_var(--ease-out)_1_both]',\n};\n\n// The comet rides the host's rounded outline. Its tail is a row of dots on\n// the same path, each a step behind the head, so the tail bends with the\n// curve. Every piece rests at opacity 0 and shows only while it runs.\nexport const COMET_WRAPPER_CLASS =\n 'ds:pointer-events-none ds:absolute ds:[inset-block-start:0] ds:[inset-inline-start:0] ds:opacity-0 ds:[offset-path:inset(0_round_var(--radius-full))] ds:[offset-rotate:0deg]';\nexport const COMET_TAIL = [\n {\n key: 1,\n lag: 'ds:[animation-delay:calc(var(--animation-duration)*0.2)]',\n dot: 'ds:size-2.5 ds:opacity-[var(--opacity-90)]',\n },\n {\n key: 2,\n lag: 'ds:[animation-delay:calc(var(--animation-duration)*0.4)]',\n dot: 'ds:size-2 ds:opacity-[var(--opacity-70)]',\n },\n {\n key: 3,\n lag: 'ds:[animation-delay:calc(var(--animation-duration)*0.6)]',\n dot: 'ds:size-2 ds:opacity-[var(--opacity-50)]',\n },\n {\n key: 4,\n lag: 'ds:[animation-delay:calc(var(--animation-duration)*0.8)]',\n dot: 'ds:size-1.5 ds:opacity-[var(--opacity-30)]',\n },\n {\n key: 5,\n lag: 'ds:[animation-delay:calc(var(--animation-duration)*1)]',\n dot: 'ds:size-1.5 ds:opacity-[var(--opacity-20)]',\n },\n {\n key: 6,\n lag: 'ds:[animation-delay:calc(var(--animation-duration)*1.2)]',\n dot: 'ds:size-1 ds:opacity-[var(--opacity-10)]',\n },\n] as const;\n\n/* -------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------- */\n\nexport interface UseAiSparkleOptions {\n /**\n * Whether the sparkle is available at all. Read once, at mount, to seed\n * the initial `'intro'` phase — matches how the RichTextEditor's\n * `aiSparkle` prop only ever gated the very first render. Default `true`.\n */\n enabled?: boolean;\n /**\n * `'auto'` (default) reads `prefers-reduced-motion` via\n * `usePrefersReducedMotion`. `'off'` forces full motion regardless of the\n * OS preference — useful for a story that wants to show the animated\n * states side by side with a reduced one.\n */\n reducedMotion?: 'auto' | 'off';\n}\n\nexport interface UseAiSparkleProps {\n /** Spread (or picked) onto the host element as a pure styling hook. */\n 'data-ai-sparkle': AiSparkleState | undefined;\n /**\n * The shimmer animation class for the current state — empty when at rest.\n * Layer it over the host's own base positioning classes; the comet layer\n * needs real DOM and lives in the `AiSparkle` component instead.\n */\n className: string;\n}\n\nexport interface UseAiSparkleReturn {\n /** `null` at rest — nothing to render for the comet layer either. */\n state: AiSparkleState | null;\n props: UseAiSparkleProps;\n /** An AI action started: swap to the looping `'working'` phase. */\n start: () => void;\n /** An action's result landed: swap to the one-off `'landed'` phase. */\n land: () => void;\n /**\n * Settle after an action ends. Clears back to rest only when still\n * `'working'` (the action errored or was cancelled before `land()`);\n * leaves `'landed'` alone so the one-off animation gets to play out.\n */\n reset: () => void;\n}\n\n/* -------------------------------------------------------------------- */\n/* Hook */\n/* -------------------------------------------------------------------- */\n\n/**\n * Drives the AI-pill sparkle: lit on first show, looping while an action\n * runs, and a one-off flourish as the result lands.\n *\n * The hook owns the state machine and the timing only — it paints nothing.\n * `props['data-ai-sparkle']` is a plain styling hook for the host element;\n * `props.className` carries the shimmer layer's animation class from the\n * same lookup table the RichTextEditor's pill originally inlined. The\n * comet layer needs actual DOM (a head and a tail of dots), so it lives in\n * the sibling `AiSparkle` component, keyed off the same `state`.\n *\n * Both `intro` and `landed` are one-off: this hook clears them back to\n * `null` on a timer sized to the comet's lap plus a small buffer, at the\n * default 200ms `--animation-duration`. Under reduced\n * motion (`prefers-reduced-motion` or `reducedMotion: 'auto'`'s system\n * read) the CSS animations already collapse to 0ms, so the clear fires at\n * the next tick instead of waiting out the full lap — the pill still gets\n * its `data-ai-sparkle` attribute for a moment, but nothing visibly moves.\n */\nexport function useAiSparkle(\n options: UseAiSparkleOptions = {},\n): UseAiSparkleReturn {\n const { enabled = true, reducedMotion = 'auto' } = options;\n const systemReduced = usePrefersReducedMotion();\n const reduced = reducedMotion === 'off' ? false : systemReduced;\n\n const [state, setState] = useState<AiSparkleState | null>(\n enabled ? 'intro' : null,\n );\n\n useEffect(() => {\n if (state !== 'intro' && state !== 'landed') return undefined;\n const ms = reduced ? 0 : SPARKLE_ONCE_MS[state];\n const timer = window.setTimeout(() => setState(null), ms);\n return () => window.clearTimeout(timer);\n }, [state, reduced]);\n\n const start = useCallback(() => setState('working'), []);\n const land = useCallback(() => setState('landed'), []);\n const reset = useCallback(() => {\n setState((s) => (s === 'working' ? null : s));\n }, []);\n\n return {\n state,\n props: {\n 'data-ai-sparkle': state ?? undefined,\n className: state ? SHIMMER_CLASS[state] : '',\n },\n start,\n land,\n reset,\n };\n}\n"],"names":["SPARKLE_ONCE_MS","SHIMMER_CLASS","COMET_CLASS","COMET_WRAPPER_CLASS","COMET_TAIL","useAiSparkle","options","enabled","reducedMotion","systemReduced","usePrefersReducedMotion","reduced","state","setState","useState","useEffect","ms","timer","start","useCallback","land","reset","s"],"mappings":";;AAqBA,MAAMA,IAAsD;AAAA,EAC1D,OAAO;AAAA,EACP,QAAQ;AACV,GAKaC,IAAgD;AAAA,EAC3D,OACE;AAAA,EACF,SACE;AAAA,EACF,QACE;AACJ,GAKaC,IAA8C;AAAA,EACzD,OACE;AAAA,EACF,SACE;AAAA,EACF,QACE;AACJ,GAKaC,IACX,iLACWC,IAAa;AAAA,EACxB;AAAA,IACE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAAA,EAEP;AAAA,IACE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAAA,EAEP;AAAA,IACE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAAA,EAEP;AAAA,IACE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAAA,EAEP;AAAA,IACE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAAA,EAEP;AAAA,IACE,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EAAA;AAET;AAwEO,SAASC,EACdC,IAA+B,IACX;AACpB,QAAM,EAAE,SAAAC,IAAU,IAAM,eAAAC,IAAgB,WAAWF,GAC7CG,IAAgBC,EAAA,GAChBC,IAAUH,MAAkB,QAAQ,KAAQC,GAE5C,CAACG,GAAOC,CAAQ,IAAIC;AAAA,IACxBP,IAAU,UAAU;AAAA,EAAA;AAGtB,EAAAQ,EAAU,MAAM;AACd,QAAIH,MAAU,WAAWA,MAAU,SAAU;AAC7C,UAAMI,IAAKL,IAAU,IAAIX,EAAgBY,CAAK,GACxCK,IAAQ,OAAO,WAAW,MAAMJ,EAAS,IAAI,GAAGG,CAAE;AACxD,WAAO,MAAM,OAAO,aAAaC,CAAK;AAAA,EACxC,GAAG,CAACL,GAAOD,CAAO,CAAC;AAEnB,QAAMO,IAAQC,EAAY,MAAMN,EAAS,SAAS,GAAG,CAAA,CAAE,GACjDO,IAAOD,EAAY,MAAMN,EAAS,QAAQ,GAAG,CAAA,CAAE,GAC/CQ,IAAQF,EAAY,MAAM;AAC9B,IAAAN,EAAS,CAACS,MAAOA,MAAM,YAAY,OAAOA,CAAE;AAAA,EAC9C,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,OAAAV;AAAA,IACA,OAAO;AAAA,MACL,mBAAmBA,KAAS;AAAA,MAC5B,WAAWA,IAAQX,EAAcW,CAAK,IAAI;AAAA,IAAA;AAAA,IAE5C,OAAAM;AAAA,IACA,MAAAE;AAAA,IACA,OAAAC;AAAA,EAAA;AAEJ;"}
@@ -4,7 +4,7 @@ import { c as f } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as L } from "react-i18next";
5
5
  import { u as de } from "./registry-DvAUVLHh.js";
6
6
  import { u as ie } from "./use-controllable-state-BiY4xTzM.js";
7
- import { a as N } from "./input-surface-xyERuLU_.js";
7
+ import { a as z } from "./input-surface-xyERuLU_.js";
8
8
  import { D as p } from "./dropdown-menu-DU-Hrf33.js";
9
9
  import { C as T } from "./circle-alert-rGDZ73Wh.js";
10
10
  import { L as le } from "./loader-circle-BECIU_8N.js";
@@ -114,9 +114,9 @@ const ue = {
114
114
  {
115
115
  variants: {
116
116
  size: {
117
- sm: `${N.sm} ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,
118
- md: `${N.md} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,
119
- lg: `${N.lg} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-md)]`
117
+ sm: `${z.sm} ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,
118
+ md: `${z.md} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,
119
+ lg: `${z.lg} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-md)]`
120
120
  },
121
121
  interactive: {
122
122
  true: [
@@ -271,14 +271,14 @@ function A({
271
271
  ] }) : null
272
272
  ] });
273
273
  }
274
- const ve = I(function({ value: a, option: t, size: n = "md", workflowLabel: l, id: c, className: o, dir: h }, v) {
275
- const { t: k } = L(), x = l ?? k("workflowStatus.label", "Workflow");
274
+ const ve = I(function({ value: a, option: t, size: n = "md", workflowLabel: l, id: c, className: o, dir: k }, b) {
275
+ const { t: x } = L(), y = l ?? x("workflowStatus.label", "Workflow");
276
276
  return /* @__PURE__ */ s(
277
277
  "div",
278
278
  {
279
- ref: v,
279
+ ref: b,
280
280
  id: c,
281
- dir: h,
281
+ dir: k,
282
282
  "data-component": "workflow-status",
283
283
  "data-component-id": c,
284
284
  "data-state": a,
@@ -288,7 +288,7 @@ const ve = I(function({ value: a, option: t, size: n = "md", workflowLabel: l, i
288
288
  A,
289
289
  {
290
290
  option: t,
291
- workflowLabel: x,
291
+ workflowLabel: y,
292
292
  size: n,
293
293
  interactive: !1,
294
294
  error: !1
@@ -305,64 +305,64 @@ const we = I(function({
305
305
  size: l = "md",
306
306
  disabled: c = !1,
307
307
  saving: o = !1,
308
- error: h = !1,
309
- errorMessage: v,
310
- workflowLabel: k,
311
- menuLabel: x,
308
+ error: k = !1,
309
+ errorMessage: b,
310
+ workflowLabel: x,
311
+ menuLabel: y,
312
312
  savingLabel: D,
313
313
  open: E,
314
314
  defaultOpen: K = !1,
315
315
  onOpenChange: $,
316
316
  id: u,
317
317
  className: H,
318
- dir: V,
318
+ dir: W,
319
319
  "aria-label": M,
320
320
  "aria-describedby": q
321
321
  }, F) {
322
- const { t: m } = L(), G = re(), z = ae(null), y = t.find((e) => e.value === a);
323
- if (!y)
322
+ const { t: m } = L(), G = re(), S = ae(null), C = t.find((e) => e.value === a);
323
+ if (!C)
324
324
  throw new Error(
325
325
  `WorkflowStatusControl requires an option matching value "${a}".`
326
326
  );
327
- const P = k ?? m("workflowStatus.label", "Workflow"), U = x ?? m("workflowStatus.menuLabel", "Workflow statuses"), J = D ?? m("workflowStatus.saving", "Saving workflow status"), Q = v ?? m(
327
+ const P = x ?? m("workflowStatus.label", "Workflow"), U = y ?? m("workflowStatus.menuLabel", "Workflow statuses"), J = D ?? m("workflowStatus.saving", "Saving workflow status"), Q = b ?? m(
328
328
  "workflowStatus.saveFailed",
329
329
  "Could not change workflow status. The previous status is still shown."
330
330
  ), X = M ?? m("workflowStatus.changeLabel", "Change workflow status: {{status}}", {
331
- status: y.label
332
- }), g = h || !!v, d = c || o, W = u ? `${u}-error` : G, Y = [q, g ? W : void 0].filter(Boolean).join(" ") || void 0, _ = o ? "saving" : c ? "disabled" : g ? "error" : "idle", [Z, w] = ie({
331
+ status: C.label
332
+ }), g = k || !!b, d = c || o, _ = u ? `${u}-error` : G, Y = [q, g ? _ : void 0].filter(Boolean).join(" ") || void 0, j = o ? "saving" : c ? "disabled" : g ? "error" : "idle", [Z, v] = ie({
333
333
  value: E,
334
334
  defaultValue: K,
335
335
  onChange: $
336
- }), b = !!Z && !d, S = te(
336
+ }), h = !!Z && !d, N = te(
337
337
  (e) => {
338
338
  if (d || e === a) return;
339
- const j = t.find((ee) => ee.value === e);
340
- if (!(!j || j.disabled))
339
+ const w = t.find((ee) => ee.value === e);
340
+ if (!(!w || w.disabled))
341
341
  return n(e);
342
342
  },
343
343
  [d, n, t, a]
344
- ), C = oe(
344
+ ), V = oe(
345
345
  () => ({
346
346
  getValue: () => a,
347
- getIsOpen: () => b,
347
+ getIsOpen: () => h,
348
348
  getIsSaving: () => o,
349
- setValue: S,
349
+ setValue: N,
350
350
  open: () => {
351
- d || w(!0);
351
+ d || v(!0);
352
352
  },
353
- close: () => w(!1),
353
+ close: () => v(!1),
354
354
  focus: () => {
355
355
  var e;
356
- return (e = z.current) == null ? void 0 : e.focus();
356
+ return (e = S.current) == null ? void 0 : e.focus();
357
357
  }
358
358
  }),
359
- [S, d, b, o, w, a]
359
+ [N, d, h, o, v, a]
360
360
  );
361
- return ne(F, () => C, [C]), de(ue, C, u), /* @__PURE__ */ i(
361
+ return ne(F, () => V, [V]), de(ue, V, u), /* @__PURE__ */ i(
362
362
  "div",
363
363
  {
364
364
  id: u,
365
- dir: V,
365
+ dir: W,
366
366
  "data-component": "workflow-status",
367
367
  "data-component-id": u,
368
368
  "data-state": a,
@@ -374,36 +374,36 @@ const we = I(function({
374
374
  /* @__PURE__ */ i(
375
375
  p.Root,
376
376
  {
377
- dir: V,
378
- open: b,
377
+ dir: W,
378
+ open: h,
379
379
  onOpenChange: (e) => {
380
- e && d || w(e);
380
+ e && d || v(e);
381
381
  },
382
382
  children: [
383
383
  /* @__PURE__ */ s(p.Trigger, { asChild: !0, children: /* @__PURE__ */ s(
384
384
  "button",
385
385
  {
386
- ref: z,
386
+ ref: S,
387
387
  id: u ? `${u}-trigger` : void 0,
388
388
  type: "button",
389
389
  disabled: d,
390
390
  "aria-label": X,
391
391
  "aria-describedby": Y,
392
392
  "aria-busy": o,
393
- "data-open": b ? "" : void 0,
393
+ "data-open": h ? "" : void 0,
394
394
  className: R({
395
395
  size: l,
396
396
  interactive: !0,
397
- operation: _
397
+ operation: j
398
398
  }),
399
399
  children: /* @__PURE__ */ s(
400
400
  A,
401
401
  {
402
- option: y,
402
+ option: C,
403
403
  workflowLabel: P,
404
404
  size: l,
405
405
  interactive: !0,
406
- operation: _,
406
+ operation: j,
407
407
  error: g
408
408
  }
409
409
  )
@@ -416,7 +416,8 @@ const we = I(function({
416
416
  {
417
417
  value: a,
418
418
  onValueChange: (e) => {
419
- S(e);
419
+ var w;
420
+ v(!1), (w = S.current) == null || w.focus(), N(e);
420
421
  },
421
422
  children: t.map((e) => /* @__PURE__ */ s(
422
423
  p.RadioItem,
@@ -459,7 +460,7 @@ const we = I(function({
459
460
  children: o ? J : ""
460
461
  }
461
462
  ),
462
- g ? /* @__PURE__ */ i("div", { id: W, role: "alert", className: ge(), children: [
463
+ g ? /* @__PURE__ */ i("div", { id: _, role: "alert", className: ge(), children: [
463
464
  /* @__PURE__ */ s(T, { "aria-hidden": "true" }),
464
465
  /* @__PURE__ */ s("span", { children: Q })
465
466
  ] }) : null
@@ -473,4 +474,4 @@ export {
473
474
  ve as a,
474
475
  ue as w
475
476
  };
476
- //# sourceMappingURL=workflow-status-xeaJTzD3.js.map
477
+ //# sourceMappingURL=workflow-status-CuJAOuKL.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-status-xeaJTzD3.js","sources":["../../src/components/workflow-status/workflow-status.agent.ts","../../src/components/workflow-status/workflow-status.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { WorkflowStatusControlHandle } from './workflow-status';\n\nexport const workflowStatusAgent: AgentAdapter<WorkflowStatusControlHandle> = {\n id: 'workflow-status',\n capabilities: ['select_single', 'set_value', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.workflowStatus.state.value',\n description: 'The current non-sensitive workflow status key.',\n read: (handle) => handle.getValue(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.workflowStatus.state.isOpen',\n description: 'Whether the permitted workflow status list is open.',\n read: (handle) => handle.getIsOpen(),\n },\n isSaving: {\n type: 'boolean',\n descriptionKey: 'ui.agent.workflowStatus.state.isSaving',\n description: 'Whether the host is saving a workflow status change.',\n read: (handle) => handle.getIsSaving(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: 'string',\n description: 'Permitted workflow status key to select.',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n openWorld: false,\n errors: [\n 'The status is not in the host-provided transition list.',\n 'The status is disabled.',\n 'A status change is already being saved.',\n ],\n examples: [{ args: { value: 'review' } }],\n descriptionKey: 'ui.agent.workflowStatus.actions.setValue',\n description:\n 'Request a permitted workflow status through the host-owned change callback.',\n invoke: (handle, args: { value: string }) => handle.setValue(args.value),\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.workflowStatus.actions.open',\n description: 'Open the permitted workflow status list.',\n invoke: (handle) => handle.open(),\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.workflowStatus.actions.close',\n description: 'Close the workflow status list.',\n invoke: (handle) => handle.close(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'workflow-status',\n description: 'Marks the WorkflowStatus boundary.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-option-id',\n description: 'Non-sensitive workflow status key for a permitted option.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle, ChevronDown, LoaderCircle } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { INPUT_SURFACE_HEIGHT } from '../_shared/input-surface';\nimport { DropdownMenu } from '../dropdown-menu';\nimport { workflowStatusAgent } from './workflow-status.agent';\n\nexport type WorkflowStatusTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'accent';\n\nexport type WorkflowStatusSize = 'sm' | 'md' | 'lg';\n\nexport interface WorkflowStatusOption {\n value: string;\n label: string;\n icon: ReactNode;\n tone: WorkflowStatusTone;\n disabled?: boolean;\n}\n\nconst rootVariants = cva(\n 'ds:inline-flex ds:max-w-full ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]',\n {\n variants: {\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst surfaceVariants = cva(\n [\n 'ds:group/workflow-status ds:inline-grid ds:max-w-full ds:w-fit ds:items-center',\n 'ds:overflow-hidden ds:text-start',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-transparent ds:text-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:forced-colors:border-[ButtonBorder]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,\n md: `${INPUT_SURFACE_HEIGHT.md} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-md)]`,\n },\n interactive: {\n true: [\n 'ds:grid-cols-[auto_minmax(0,1fr)_auto] ds:appearance-none ds:cursor-pointer',\n 'ds:hover:enabled:bg-muted/10 ds:active:enabled:bg-muted/20',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:data-[open]:bg-muted/20 ds:data-[open]:border-[color:var(--primary)]',\n 'ds:forced-colors:data-[open]:border-[Highlight]',\n ].join(' '),\n false: 'ds:grid-cols-[auto_minmax(0,1fr)] ds:cursor-default',\n },\n operation: {\n idle: '',\n disabled: 'ds:cursor-not-allowed ds:opacity-50',\n saving: 'ds:cursor-wait ds:border-[color:var(--info-foreground)]',\n error: 'ds:border-[color:var(--error-foreground)]',\n },\n },\n defaultVariants: {\n size: 'md',\n interactive: false,\n operation: 'idle',\n },\n },\n);\n\nconst iconVariants = cva(\n [\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)] ds:border ds:[&>svg]:block',\n 'ds:forced-colors:bg-transparent ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n tone: {\n neutral:\n 'ds:bg-muted ds:text-muted-foreground ds:border-[color:var(--border)]',\n info: 'ds:bg-info/15 ds:text-[color:var(--info-foreground)] ds:border-[color:var(--info-foreground)]',\n success:\n 'ds:bg-success/15 ds:text-[color:var(--success-foreground)] ds:border-[color:var(--success-foreground)]',\n warning:\n 'ds:bg-warning/15 ds:text-[color:var(--warning-foreground)] ds:border-[color:var(--warning-foreground)]',\n error:\n 'ds:bg-destructive/15 ds:text-[color:var(--error-foreground)] ds:border-[color:var(--error-foreground)]',\n accent:\n 'ds:bg-[color:color-mix(in_srgb,var(--accent)_15%,transparent)] ds:text-[color:color-mix(in_srgb,var(--accent)_40%,var(--foreground))] ds:border-[color:color-mix(in_srgb,var(--accent)_40%,var(--foreground))]',\n },\n /* The ball is a SETTING for the glyph, not a container it fills: at\n the old 24px/16px the icon took two thirds of the circle and the two\n read as one crowded blob. Each step is smaller overall and gives the\n glyph roughly half its diameter, so the ring stays legible as a ring\n and the status colour has room to register. */\n size: {\n sm: 'ds:size-5 ds:[&>svg]:size-3',\n md: 'ds:size-[var(--spacing-lg)] ds:[&>svg]:size-3.5',\n lg: 'ds:size-7 ds:[&>svg]:size-[var(--icon-size-sm)]',\n menu: 'ds:size-5 ds:[&>svg]:size-3',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'md' },\n },\n);\n\nconst labelGroupVariants = cva(\n 'ds:flex ds:min-w-0 ds:flex-col ds:justify-center ds:text-start',\n {\n variants: {\n size: {\n sm: 'ds:gap-0',\n md: 'ds:gap-0',\n lg: 'ds:gap-0',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst valueVariants = cva(\n 'ds:block ds:min-w-0 ds:truncate ds:font-[var(--font-weight-semibold)] ds:text-[color:var(--foreground)]',\n {\n variants: {\n size: {\n sm: 'type-body-sm',\n md: 'type-label',\n lg: 'type-body',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst trailingVariants = cva(\n [\n 'ds:inline-flex ds:self-stretch ds:items-center ds:justify-center',\n 'ds:gap-[var(--spacing-2xs)] ds:border-s ds:border-border',\n 'ds:text-[color:var(--muted-foreground)]',\n 'ds:forced-colors:border-[ButtonBorder]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:ps-[var(--spacing-xs)]',\n md: 'ds:ps-[var(--spacing-sm)]',\n lg: 'ds:ps-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst errorVariants = cva(\n [\n 'ds:flex ds:max-w-full ds:items-start ds:gap-[var(--spacing-xs)]',\n 'type-meta ds:text-[color:var(--error-foreground)]',\n 'ds:[&>svg]:mt-[var(--spacing-2xs)] ds:[&>svg]:size-[var(--spacing-md)] ds:[&>svg]:shrink-0',\n 'ds:forced-colors:text-[CanvasText]',\n ].join(' '),\n);\n\ninterface WorkflowStatusSurfaceProps extends Pick<\n VariantProps<typeof surfaceVariants>,\n 'size'\n> {\n option: WorkflowStatusOption;\n workflowLabel: string;\n interactive: boolean;\n operation?: 'idle' | 'disabled' | 'saving' | 'error';\n error: boolean;\n}\n\nfunction WorkflowStatusSurface({\n option,\n workflowLabel,\n size = 'md',\n interactive,\n operation = 'idle',\n error,\n}: WorkflowStatusSurfaceProps) {\n return (\n <>\n <span\n aria-hidden=\"true\"\n data-workflow-status-icon=\"\"\n data-tone={option.tone}\n className={iconVariants({ tone: option.tone, size })}\n >\n {option.icon}\n </span>\n <span className={labelGroupVariants({ size })}>\n {size !== 'sm' ? (\n <span className=\"type-meta ds:font-[var(--font-weight-medium)] ds:text-[color:var(--muted-foreground)]\">\n {workflowLabel}\n </span>\n ) : null}\n <span\n data-workflow-status-value=\"\"\n title={option.label}\n className={valueVariants({ size })}\n >\n {option.label}\n </span>\n </span>\n {interactive ? (\n <span className={trailingVariants({ size })} aria-hidden=\"true\">\n {error ? (\n <AlertCircle\n data-testid=\"workflow-status-error-icon\"\n className=\"ds:size-[var(--spacing-md)] ds:shrink-0\"\n />\n ) : null}\n {operation === 'saving' ? (\n <LoaderCircle className=\"ds:size-[var(--spacing-md)] ds:shrink-0 ds:animate-spin ds:motion-reduce:animate-none\" />\n ) : (\n <ChevronDown\n data-testid=\"workflow-status-chevron\"\n className=\"ds:size-[var(--spacing-md)] ds:shrink-0 ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:group-data-[open]/workflow-status:rotate-180\"\n />\n )}\n </span>\n ) : null}\n </>\n );\n}\n\nexport interface WorkflowStatusDisplayProps {\n value: string;\n option: WorkflowStatusOption;\n size?: WorkflowStatusSize;\n workflowLabel?: string;\n id?: string;\n className?: string;\n dir?: 'ltr' | 'rtl';\n}\n\nexport const WorkflowStatusDisplay = forwardRef<\n HTMLDivElement,\n WorkflowStatusDisplayProps\n>(function WorkflowStatusDisplay(\n { value, option, size = 'md', workflowLabel, id, className, dir },\n ref,\n) {\n const { t } = useTranslation();\n const resolvedWorkflowLabel =\n workflowLabel ?? t('workflowStatus.label', 'Workflow');\n\n return (\n <div\n ref={ref}\n id={id}\n dir={dir}\n data-component=\"workflow-status\"\n data-component-id={id}\n data-state={value}\n data-variant=\"display\"\n className={rootVariants({ size, className })}\n >\n <div className={surfaceVariants({ size, interactive: false })}>\n <WorkflowStatusSurface\n option={option}\n workflowLabel={resolvedWorkflowLabel}\n size={size}\n interactive={false}\n error={false}\n />\n </div>\n </div>\n );\n});\n\nWorkflowStatusDisplay.displayName = 'WorkflowStatusDisplay';\n\nexport interface WorkflowStatusControlHandle {\n getValue: () => string;\n getIsOpen: () => boolean;\n getIsSaving: () => boolean;\n setValue: (value: string) => void | Promise<void>;\n open: () => void;\n close: () => void;\n focus: () => void;\n}\n\nexport interface WorkflowStatusControlProps {\n value: string;\n options: readonly WorkflowStatusOption[];\n onValueChange: (value: string) => void | Promise<void>;\n size?: WorkflowStatusSize;\n disabled?: boolean;\n saving?: boolean;\n error?: boolean;\n errorMessage?: string;\n workflowLabel?: string;\n menuLabel?: string;\n savingLabel?: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n id?: string;\n className?: string;\n dir?: 'ltr' | 'rtl';\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const WorkflowStatusControl = forwardRef<\n WorkflowStatusControlHandle,\n WorkflowStatusControlProps\n>(function WorkflowStatusControl(\n {\n value,\n options,\n onValueChange,\n size = 'md',\n disabled = false,\n saving = false,\n error = false,\n errorMessage,\n workflowLabel,\n menuLabel,\n savingLabel,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n id,\n className,\n dir,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n },\n ref,\n) {\n const { t } = useTranslation();\n const generatedErrorId = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const currentOption = options.find((option) => option.value === value);\n\n if (!currentOption) {\n throw new Error(\n `WorkflowStatusControl requires an option matching value \"${value}\".`,\n );\n }\n\n const resolvedWorkflowLabel =\n workflowLabel ?? t('workflowStatus.label', 'Workflow');\n const resolvedMenuLabel =\n menuLabel ?? t('workflowStatus.menuLabel', 'Workflow statuses');\n const resolvedSavingLabel =\n savingLabel ?? t('workflowStatus.saving', 'Saving workflow status');\n const resolvedErrorMessage =\n errorMessage ??\n t(\n 'workflowStatus.saveFailed',\n 'Could not change workflow status. The previous status is still shown.',\n );\n const resolvedAriaLabel =\n ariaLabel ??\n t('workflowStatus.changeLabel', 'Change workflow status: {{status}}', {\n status: currentOption.label,\n });\n const hasError = error || Boolean(errorMessage);\n const inactive = disabled || saving;\n const errorId = id ? `${id}-error` : generatedErrorId;\n const describedBy =\n [ariaDescribedBy, hasError ? errorId : undefined]\n .filter(Boolean)\n .join(' ') || undefined;\n const operation = saving\n ? 'saving'\n : disabled\n ? 'disabled'\n : hasError\n ? 'error'\n : 'idle';\n const [openValue, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const isOpen = Boolean(openValue) && !inactive;\n\n const changeValue = useCallback(\n (next: string): void | Promise<void> => {\n if (inactive || next === value) return;\n const nextOption = options.find((option) => option.value === next);\n if (!nextOption || nextOption.disabled) return;\n return onValueChange(next);\n },\n [inactive, onValueChange, options, value],\n );\n\n const handle = useMemo<WorkflowStatusControlHandle>(\n () => ({\n getValue: () => value,\n getIsOpen: () => isOpen,\n getIsSaving: () => saving,\n setValue: changeValue,\n open: () => {\n if (!inactive) setOpen(true);\n },\n close: () => setOpen(false),\n focus: () => triggerRef.current?.focus(),\n }),\n [changeValue, inactive, isOpen, saving, setOpen, value],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(workflowStatusAgent, handle, id);\n\n return (\n <div\n id={id}\n dir={dir}\n data-component=\"workflow-status\"\n data-component-id={id}\n data-state={value}\n data-variant=\"control\"\n data-saving={saving ? '' : undefined}\n data-error={hasError ? '' : undefined}\n className={rootVariants({ size, className })}\n >\n <DropdownMenu.Root\n dir={dir}\n open={isOpen}\n onOpenChange={(next) => {\n if (next && inactive) return;\n setOpen(next);\n }}\n >\n <DropdownMenu.Trigger asChild>\n <button\n ref={triggerRef}\n id={id ? `${id}-trigger` : undefined}\n type=\"button\"\n disabled={inactive}\n aria-label={resolvedAriaLabel}\n aria-describedby={describedBy}\n aria-busy={saving}\n data-open={isOpen ? '' : undefined}\n className={surfaceVariants({\n size,\n interactive: true,\n operation,\n })}\n >\n <WorkflowStatusSurface\n option={currentOption}\n workflowLabel={resolvedWorkflowLabel}\n size={size}\n interactive\n operation={operation}\n error={hasError}\n />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.Label>{resolvedMenuLabel}</DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={value}\n onValueChange={(next) => {\n void changeValue(next);\n }}\n >\n {options.map((option) => (\n <DropdownMenu.RadioItem\n key={option.value}\n value={option.value}\n disabled={inactive || option.disabled}\n data-option-id={option.value}\n >\n <span className=\"ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n aria-hidden=\"true\"\n data-workflow-status-icon=\"\"\n data-tone={option.tone}\n className={iconVariants({\n tone: option.tone,\n size: 'menu',\n })}\n >\n {option.icon}\n </span>\n <span className=\"ds:min-w-0 ds:truncate\" title={option.label}>\n {option.label}\n </span>\n </span>\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {saving ? resolvedSavingLabel : ''}\n </span>\n {hasError ? (\n <div id={errorId} role=\"alert\" className={errorVariants()}>\n <AlertCircle aria-hidden=\"true\" />\n <span>{resolvedErrorMessage}</span>\n </div>\n ) : null}\n </div>\n );\n});\n\nWorkflowStatusControl.displayName = 'WorkflowStatusControl';\n"],"names":["workflowStatusAgent","handle","args","rootVariants","cva","surfaceVariants","INPUT_SURFACE_HEIGHT","iconVariants","labelGroupVariants","valueVariants","trailingVariants","errorVariants","WorkflowStatusSurface","option","workflowLabel","size","interactive","operation","error","jsxs","Fragment","jsx","AlertCircle","LoaderCircle","ChevronDown","WorkflowStatusDisplay","forwardRef","value","id","className","dir","ref","t","useTranslation","resolvedWorkflowLabel","WorkflowStatusControl","options","onValueChange","disabled","saving","errorMessage","menuLabel","savingLabel","openProp","defaultOpen","onOpenChange","ariaLabel","ariaDescribedBy","generatedErrorId","useId","triggerRef","useRef","currentOption","resolvedMenuLabel","resolvedSavingLabel","resolvedErrorMessage","resolvedAriaLabel","hasError","inactive","errorId","describedBy","openValue","setOpen","useControllableState","isOpen","changeValue","useCallback","next","nextOption","useMemo","_a","useImperativeHandle","useAgentRegistration","DropdownMenu"],"mappings":"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"}
1
+ {"version":3,"file":"workflow-status-CuJAOuKL.js","sources":["../../src/components/workflow-status/workflow-status.agent.ts","../../src/components/workflow-status/workflow-status.tsx"],"sourcesContent":["import type { AgentAdapter } from '../../agent/types';\nimport type { WorkflowStatusControlHandle } from './workflow-status';\n\nexport const workflowStatusAgent: AgentAdapter<WorkflowStatusControlHandle> = {\n id: 'workflow-status',\n capabilities: ['select_single', 'set_value', 'open', 'close'],\n state: {\n value: {\n type: 'string',\n descriptionKey: 'ui.agent.workflowStatus.state.value',\n description: 'The current non-sensitive workflow status key.',\n read: (handle) => handle.getValue(),\n },\n isOpen: {\n type: 'boolean',\n descriptionKey: 'ui.agent.workflowStatus.state.isOpen',\n description: 'Whether the permitted workflow status list is open.',\n read: (handle) => handle.getIsOpen(),\n },\n isSaving: {\n type: 'boolean',\n descriptionKey: 'ui.agent.workflowStatus.state.isSaving',\n description: 'Whether the host is saving a workflow status change.',\n read: (handle) => handle.getIsSaving(),\n },\n },\n actions: {\n set_value: {\n safety: 'write',\n argsType: '{ value: string }',\n argsSchema: {\n type: 'object',\n properties: {\n value: {\n type: 'string',\n description: 'Permitted workflow status key to select.',\n },\n },\n required: ['value'],\n },\n idempotent: true,\n openWorld: false,\n errors: [\n 'The status is not in the host-provided transition list.',\n 'The status is disabled.',\n 'A status change is already being saved.',\n ],\n examples: [{ args: { value: 'review' } }],\n descriptionKey: 'ui.agent.workflowStatus.actions.setValue',\n description:\n 'Request a permitted workflow status through the host-owned change callback.',\n invoke: (handle, args: { value: string }) => handle.setValue(args.value),\n },\n open: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.workflowStatus.actions.open',\n description: 'Open the permitted workflow status list.',\n invoke: (handle) => handle.open(),\n },\n close: {\n safety: 'read',\n idempotent: true,\n descriptionKey: 'ui.agent.workflowStatus.actions.close',\n description: 'Close the workflow status list.',\n invoke: (handle) => handle.close(),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'workflow-status',\n description: 'Marks the WorkflowStatus boundary.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-option-id',\n description: 'Non-sensitive workflow status key for a permitted option.',\n },\n },\n};\n","import {\n forwardRef,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { AlertCircle, ChevronDown, LoaderCircle } from 'lucide-react';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent';\nimport { useControllableState } from '../../hooks/use-controllable-state';\nimport { INPUT_SURFACE_HEIGHT } from '../_shared/input-surface';\nimport { DropdownMenu } from '../dropdown-menu';\nimport { workflowStatusAgent } from './workflow-status.agent';\n\nexport type WorkflowStatusTone =\n | 'neutral'\n | 'info'\n | 'success'\n | 'warning'\n | 'error'\n | 'accent';\n\nexport type WorkflowStatusSize = 'sm' | 'md' | 'lg';\n\nexport interface WorkflowStatusOption {\n value: string;\n label: string;\n icon: ReactNode;\n tone: WorkflowStatusTone;\n disabled?: boolean;\n}\n\nconst rootVariants = cva(\n 'ds:inline-flex ds:max-w-full ds:flex-col ds:items-start ds:gap-[var(--spacing-2xs)]',\n {\n variants: {\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst surfaceVariants = cva(\n [\n 'ds:group/workflow-status ds:inline-grid ds:max-w-full ds:w-fit ds:items-center',\n 'ds:overflow-hidden ds:text-start',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-border',\n 'ds:bg-transparent ds:text-foreground',\n 'ds:transition-colors ds:duration-[var(--animation-duration)]',\n 'ds:motion-reduce:transition-none',\n 'ds:forced-colors:border-[ButtonBorder]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: `${INPUT_SURFACE_HEIGHT.sm} ds:gap-[var(--spacing-xs)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,\n md: `${INPUT_SURFACE_HEIGHT.md} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-2xs)] ds:pe-[var(--spacing-sm)]`,\n lg: `${INPUT_SURFACE_HEIGHT.lg} ds:gap-[var(--spacing-sm)] ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-md)]`,\n },\n interactive: {\n true: [\n 'ds:grid-cols-[auto_minmax(0,1fr)_auto] ds:appearance-none ds:cursor-pointer',\n 'ds:hover:enabled:bg-muted/10 ds:active:enabled:bg-muted/20',\n 'ds:focus-visible:outline-[length:var(--focus-ring-width)] ds:focus-visible:outline-solid',\n 'ds:focus-visible:outline-[color:var(--ring)] ds:focus-visible:outline-offset-[length:var(--focus-ring-offset)]',\n 'ds:forced-colors:focus-visible:outline-[CanvasText]',\n 'ds:data-[open]:bg-muted/20 ds:data-[open]:border-[color:var(--primary)]',\n 'ds:forced-colors:data-[open]:border-[Highlight]',\n ].join(' '),\n false: 'ds:grid-cols-[auto_minmax(0,1fr)] ds:cursor-default',\n },\n operation: {\n idle: '',\n disabled: 'ds:cursor-not-allowed ds:opacity-50',\n saving: 'ds:cursor-wait ds:border-[color:var(--info-foreground)]',\n error: 'ds:border-[color:var(--error-foreground)]',\n },\n },\n defaultVariants: {\n size: 'md',\n interactive: false,\n operation: 'idle',\n },\n },\n);\n\nconst iconVariants = cva(\n [\n 'ds:inline-flex ds:shrink-0 ds:items-center ds:justify-center',\n 'ds:rounded-[var(--radius-full)] ds:border ds:[&>svg]:block',\n 'ds:forced-colors:bg-transparent ds:forced-colors:border-[CanvasText]',\n ].join(' '),\n {\n variants: {\n tone: {\n neutral:\n 'ds:bg-muted ds:text-muted-foreground ds:border-[color:var(--border)]',\n info: 'ds:bg-info/15 ds:text-[color:var(--info-foreground)] ds:border-[color:var(--info-foreground)]',\n success:\n 'ds:bg-success/15 ds:text-[color:var(--success-foreground)] ds:border-[color:var(--success-foreground)]',\n warning:\n 'ds:bg-warning/15 ds:text-[color:var(--warning-foreground)] ds:border-[color:var(--warning-foreground)]',\n error:\n 'ds:bg-destructive/15 ds:text-[color:var(--error-foreground)] ds:border-[color:var(--error-foreground)]',\n accent:\n 'ds:bg-[color:color-mix(in_srgb,var(--accent)_15%,transparent)] ds:text-[color:color-mix(in_srgb,var(--accent)_40%,var(--foreground))] ds:border-[color:color-mix(in_srgb,var(--accent)_40%,var(--foreground))]',\n },\n /* The ball is a SETTING for the glyph, not a container it fills: at\n the old 24px/16px the icon took two thirds of the circle and the two\n read as one crowded blob. Each step is smaller overall and gives the\n glyph roughly half its diameter, so the ring stays legible as a ring\n and the status colour has room to register. */\n size: {\n sm: 'ds:size-5 ds:[&>svg]:size-3',\n md: 'ds:size-[var(--spacing-lg)] ds:[&>svg]:size-3.5',\n lg: 'ds:size-7 ds:[&>svg]:size-[var(--icon-size-sm)]',\n menu: 'ds:size-5 ds:[&>svg]:size-3',\n },\n },\n defaultVariants: { tone: 'neutral', size: 'md' },\n },\n);\n\nconst labelGroupVariants = cva(\n 'ds:flex ds:min-w-0 ds:flex-col ds:justify-center ds:text-start',\n {\n variants: {\n size: {\n sm: 'ds:gap-0',\n md: 'ds:gap-0',\n lg: 'ds:gap-0',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst valueVariants = cva(\n 'ds:block ds:min-w-0 ds:truncate ds:font-[var(--font-weight-semibold)] ds:text-[color:var(--foreground)]',\n {\n variants: {\n size: {\n sm: 'type-body-sm',\n md: 'type-label',\n lg: 'type-body',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst trailingVariants = cva(\n [\n 'ds:inline-flex ds:self-stretch ds:items-center ds:justify-center',\n 'ds:gap-[var(--spacing-2xs)] ds:border-s ds:border-border',\n 'ds:text-[color:var(--muted-foreground)]',\n 'ds:forced-colors:border-[ButtonBorder]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:ps-[var(--spacing-xs)]',\n md: 'ds:ps-[var(--spacing-sm)]',\n lg: 'ds:ps-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst errorVariants = cva(\n [\n 'ds:flex ds:max-w-full ds:items-start ds:gap-[var(--spacing-xs)]',\n 'type-meta ds:text-[color:var(--error-foreground)]',\n 'ds:[&>svg]:mt-[var(--spacing-2xs)] ds:[&>svg]:size-[var(--spacing-md)] ds:[&>svg]:shrink-0',\n 'ds:forced-colors:text-[CanvasText]',\n ].join(' '),\n);\n\ninterface WorkflowStatusSurfaceProps extends Pick<\n VariantProps<typeof surfaceVariants>,\n 'size'\n> {\n option: WorkflowStatusOption;\n workflowLabel: string;\n interactive: boolean;\n operation?: 'idle' | 'disabled' | 'saving' | 'error';\n error: boolean;\n}\n\nfunction WorkflowStatusSurface({\n option,\n workflowLabel,\n size = 'md',\n interactive,\n operation = 'idle',\n error,\n}: WorkflowStatusSurfaceProps) {\n return (\n <>\n <span\n aria-hidden=\"true\"\n data-workflow-status-icon=\"\"\n data-tone={option.tone}\n className={iconVariants({ tone: option.tone, size })}\n >\n {option.icon}\n </span>\n <span className={labelGroupVariants({ size })}>\n {size !== 'sm' ? (\n <span className=\"type-meta ds:font-[var(--font-weight-medium)] ds:text-[color:var(--muted-foreground)]\">\n {workflowLabel}\n </span>\n ) : null}\n <span\n data-workflow-status-value=\"\"\n title={option.label}\n className={valueVariants({ size })}\n >\n {option.label}\n </span>\n </span>\n {interactive ? (\n <span className={trailingVariants({ size })} aria-hidden=\"true\">\n {error ? (\n <AlertCircle\n data-testid=\"workflow-status-error-icon\"\n className=\"ds:size-[var(--spacing-md)] ds:shrink-0\"\n />\n ) : null}\n {operation === 'saving' ? (\n <LoaderCircle className=\"ds:size-[var(--spacing-md)] ds:shrink-0 ds:animate-spin ds:motion-reduce:animate-none\" />\n ) : (\n <ChevronDown\n data-testid=\"workflow-status-chevron\"\n className=\"ds:size-[var(--spacing-md)] ds:shrink-0 ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none ds:group-data-[open]/workflow-status:rotate-180\"\n />\n )}\n </span>\n ) : null}\n </>\n );\n}\n\nexport interface WorkflowStatusDisplayProps {\n value: string;\n option: WorkflowStatusOption;\n size?: WorkflowStatusSize;\n workflowLabel?: string;\n id?: string;\n className?: string;\n dir?: 'ltr' | 'rtl';\n}\n\nexport const WorkflowStatusDisplay = forwardRef<\n HTMLDivElement,\n WorkflowStatusDisplayProps\n>(function WorkflowStatusDisplay(\n { value, option, size = 'md', workflowLabel, id, className, dir },\n ref,\n) {\n const { t } = useTranslation();\n const resolvedWorkflowLabel =\n workflowLabel ?? t('workflowStatus.label', 'Workflow');\n\n return (\n <div\n ref={ref}\n id={id}\n dir={dir}\n data-component=\"workflow-status\"\n data-component-id={id}\n data-state={value}\n data-variant=\"display\"\n className={rootVariants({ size, className })}\n >\n <div className={surfaceVariants({ size, interactive: false })}>\n <WorkflowStatusSurface\n option={option}\n workflowLabel={resolvedWorkflowLabel}\n size={size}\n interactive={false}\n error={false}\n />\n </div>\n </div>\n );\n});\n\nWorkflowStatusDisplay.displayName = 'WorkflowStatusDisplay';\n\nexport interface WorkflowStatusControlHandle {\n getValue: () => string;\n getIsOpen: () => boolean;\n getIsSaving: () => boolean;\n setValue: (value: string) => void | Promise<void>;\n open: () => void;\n close: () => void;\n focus: () => void;\n}\n\nexport interface WorkflowStatusControlProps {\n value: string;\n options: readonly WorkflowStatusOption[];\n onValueChange: (value: string) => void | Promise<void>;\n size?: WorkflowStatusSize;\n disabled?: boolean;\n saving?: boolean;\n error?: boolean;\n errorMessage?: string;\n workflowLabel?: string;\n menuLabel?: string;\n savingLabel?: string;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n id?: string;\n className?: string;\n dir?: 'ltr' | 'rtl';\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n}\n\nexport const WorkflowStatusControl = forwardRef<\n WorkflowStatusControlHandle,\n WorkflowStatusControlProps\n>(function WorkflowStatusControl(\n {\n value,\n options,\n onValueChange,\n size = 'md',\n disabled = false,\n saving = false,\n error = false,\n errorMessage,\n workflowLabel,\n menuLabel,\n savingLabel,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n id,\n className,\n dir,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n },\n ref,\n) {\n const { t } = useTranslation();\n const generatedErrorId = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const currentOption = options.find((option) => option.value === value);\n\n if (!currentOption) {\n throw new Error(\n `WorkflowStatusControl requires an option matching value \"${value}\".`,\n );\n }\n\n const resolvedWorkflowLabel =\n workflowLabel ?? t('workflowStatus.label', 'Workflow');\n const resolvedMenuLabel =\n menuLabel ?? t('workflowStatus.menuLabel', 'Workflow statuses');\n const resolvedSavingLabel =\n savingLabel ?? t('workflowStatus.saving', 'Saving workflow status');\n const resolvedErrorMessage =\n errorMessage ??\n t(\n 'workflowStatus.saveFailed',\n 'Could not change workflow status. The previous status is still shown.',\n );\n const resolvedAriaLabel =\n ariaLabel ??\n t('workflowStatus.changeLabel', 'Change workflow status: {{status}}', {\n status: currentOption.label,\n });\n const hasError = error || Boolean(errorMessage);\n const inactive = disabled || saving;\n const errorId = id ? `${id}-error` : generatedErrorId;\n const describedBy =\n [ariaDescribedBy, hasError ? errorId : undefined]\n .filter(Boolean)\n .join(' ') || undefined;\n const operation = saving\n ? 'saving'\n : disabled\n ? 'disabled'\n : hasError\n ? 'error'\n : 'idle';\n const [openValue, setOpen] = useControllableState<boolean>({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n const isOpen = Boolean(openValue) && !inactive;\n\n const changeValue = useCallback(\n (next: string): void | Promise<void> => {\n if (inactive || next === value) return;\n const nextOption = options.find((option) => option.value === next);\n if (!nextOption || nextOption.disabled) return;\n return onValueChange(next);\n },\n [inactive, onValueChange, options, value],\n );\n\n const handle = useMemo<WorkflowStatusControlHandle>(\n () => ({\n getValue: () => value,\n getIsOpen: () => isOpen,\n getIsSaving: () => saving,\n setValue: changeValue,\n open: () => {\n if (!inactive) setOpen(true);\n },\n close: () => setOpen(false),\n focus: () => triggerRef.current?.focus(),\n }),\n [changeValue, inactive, isOpen, saving, setOpen, value],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n useAgentRegistration(workflowStatusAgent, handle, id);\n\n return (\n <div\n id={id}\n dir={dir}\n data-component=\"workflow-status\"\n data-component-id={id}\n data-state={value}\n data-variant=\"control\"\n data-saving={saving ? '' : undefined}\n data-error={hasError ? '' : undefined}\n className={rootVariants({ size, className })}\n >\n <DropdownMenu.Root\n dir={dir}\n open={isOpen}\n onOpenChange={(next) => {\n if (next && inactive) return;\n setOpen(next);\n }}\n >\n <DropdownMenu.Trigger asChild>\n <button\n ref={triggerRef}\n id={id ? `${id}-trigger` : undefined}\n type=\"button\"\n disabled={inactive}\n aria-label={resolvedAriaLabel}\n aria-describedby={describedBy}\n aria-busy={saving}\n data-open={isOpen ? '' : undefined}\n className={surfaceVariants({\n size,\n interactive: true,\n operation,\n })}\n >\n <WorkflowStatusSurface\n option={currentOption}\n workflowLabel={resolvedWorkflowLabel}\n size={size}\n interactive\n operation={operation}\n error={hasError}\n />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"start\">\n <DropdownMenu.Label>{resolvedMenuLabel}</DropdownMenu.Label>\n <DropdownMenu.RadioGroup\n value={value}\n onValueChange={(next) => {\n // Close explicitly. `isOpen` is derived (`openValue &&\n // !inactive`), so a caller flipping `saving` in this same\n // event already controls the Root to `open={false}`, and\n // Radix swallows its own `onOpenChange` when the value\n // matches. `openValue` would stay true and the menu would\n // spring back once `saving` cleared.\n setOpen(false);\n triggerRef.current?.focus();\n void changeValue(next);\n }}\n >\n {options.map((option) => (\n <DropdownMenu.RadioItem\n key={option.value}\n value={option.value}\n disabled={inactive || option.disabled}\n data-option-id={option.value}\n >\n <span className=\"ds:flex ds:min-w-0 ds:items-center ds:gap-[var(--spacing-sm)]\">\n <span\n aria-hidden=\"true\"\n data-workflow-status-icon=\"\"\n data-tone={option.tone}\n className={iconVariants({\n tone: option.tone,\n size: 'menu',\n })}\n >\n {option.icon}\n </span>\n <span className=\"ds:min-w-0 ds:truncate\" title={option.label}>\n {option.label}\n </span>\n </span>\n </DropdownMenu.RadioItem>\n ))}\n </DropdownMenu.RadioGroup>\n </DropdownMenu.Content>\n </DropdownMenu.Root>\n <span\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n >\n {saving ? resolvedSavingLabel : ''}\n </span>\n {hasError ? (\n <div id={errorId} role=\"alert\" className={errorVariants()}>\n <AlertCircle aria-hidden=\"true\" />\n <span>{resolvedErrorMessage}</span>\n </div>\n ) : null}\n </div>\n );\n});\n\nWorkflowStatusControl.displayName = 'WorkflowStatusControl';\n"],"names":["workflowStatusAgent","handle","args","rootVariants","cva","surfaceVariants","INPUT_SURFACE_HEIGHT","iconVariants","labelGroupVariants","valueVariants","trailingVariants","errorVariants","WorkflowStatusSurface","option","workflowLabel","size","interactive","operation","error","jsxs","Fragment","jsx","AlertCircle","LoaderCircle","ChevronDown","WorkflowStatusDisplay","forwardRef","value","id","className","dir","ref","t","useTranslation","resolvedWorkflowLabel","WorkflowStatusControl","options","onValueChange","disabled","saving","errorMessage","menuLabel","savingLabel","openProp","defaultOpen","onOpenChange","ariaLabel","ariaDescribedBy","generatedErrorId","useId","triggerRef","useRef","currentOption","resolvedMenuLabel","resolvedSavingLabel","resolvedErrorMessage","resolvedAriaLabel","hasError","inactive","errorId","describedBy","openValue","setOpen","useControllableState","isOpen","changeValue","useCallback","next","nextOption","useMemo","_a","useImperativeHandle","useAgentRegistration","DropdownMenu"],"mappings":"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"}