@alfadocs/ui-kit-debug 0.38.0 → 0.40.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 (266) hide show
  1. package/dist/_chunks/{accordion-bSU21uTV.js → accordion-9lJSMMsZ.js} +6 -6
  2. package/dist/_chunks/accordion-9lJSMMsZ.js.map +1 -0
  3. package/dist/_chunks/{agenda-tray-By_asPN9.js → agenda-tray-Dyj9ChHC.js} +22 -21
  4. package/dist/_chunks/agenda-tray-Dyj9ChHC.js.map +1 -0
  5. package/dist/_chunks/{bmi-calculator-BRUru9QX.js → bmi-calculator-DnEr513I.js} +2 -2
  6. package/dist/_chunks/{bmi-calculator-BRUru9QX.js.map → bmi-calculator-DnEr513I.js.map} +1 -1
  7. package/dist/_chunks/{booking-DK_BPHnQ.js → booking-4mCw3Mpl.js} +2 -2
  8. package/dist/_chunks/{booking-DK_BPHnQ.js.map → booking-4mCw3Mpl.js.map} +1 -1
  9. package/dist/_chunks/{chart-DnHvmiDX.js → chart-Cbt0_sKv.js} +46 -37
  10. package/dist/_chunks/chart-Cbt0_sKv.js.map +1 -0
  11. package/dist/_chunks/{collapsible-CERONory.js → collapsible-X3oaLPU3.js} +5 -5
  12. package/dist/_chunks/collapsible-X3oaLPU3.js.map +1 -0
  13. package/dist/_chunks/{document-scanner-CdHQ6lTN.js → document-scanner-CqS_klIr.js} +56 -55
  14. package/dist/_chunks/document-scanner-CqS_klIr.js.map +1 -0
  15. package/dist/_chunks/{editable-currency-cell-renderer-DGKuRNVG.js → editable-currency-cell-renderer-DgkCIIcO.js} +2 -2
  16. package/dist/_chunks/{editable-currency-cell-renderer-DGKuRNVG.js.map → editable-currency-cell-renderer-DgkCIIcO.js.map} +1 -1
  17. package/dist/_chunks/{file-upload-CnzRcErt.js → file-upload-BosbPDb1.js} +2 -2
  18. package/dist/_chunks/file-upload-BosbPDb1.js.map +1 -0
  19. package/dist/_chunks/{freemium-paywall-D1N02Oam.js → freemium-paywall-BAk3a6er.js} +7 -7
  20. package/dist/_chunks/{freemium-paywall-D1N02Oam.js.map → freemium-paywall-BAk3a6er.js.map} +1 -1
  21. package/dist/_chunks/header-settings-CBLwUK6t.js +244 -0
  22. package/dist/_chunks/header-settings-CBLwUK6t.js.map +1 -0
  23. package/dist/_chunks/{map-view-vD5pvWs9.js → map-view-qJLybrmN.js} +2 -2
  24. package/dist/_chunks/{map-view-vD5pvWs9.js.map → map-view-qJLybrmN.js.map} +1 -1
  25. package/dist/_chunks/marketplace-app-shell-BlxVizU4.js +296 -0
  26. package/dist/_chunks/marketplace-app-shell-BlxVizU4.js.map +1 -0
  27. package/dist/_chunks/{message-card-BbRhZkDI.js → message-card-DSPw5ghw.js} +20 -19
  28. package/dist/_chunks/message-card-DSPw5ghw.js.map +1 -0
  29. package/dist/_chunks/{message-tray-B762TKuv.js → message-tray-hSQff9u4.js} +3 -3
  30. package/dist/_chunks/message-tray-hSQff9u4.js.map +1 -0
  31. package/dist/_chunks/{notification-card-DMdO4g54.js → notification-card-CObnGdJu.js} +22 -21
  32. package/dist/_chunks/notification-card-CObnGdJu.js.map +1 -0
  33. package/dist/_chunks/{notification-tray-Dl3FTleW.js → notification-tray-BWHDIjgd.js} +2 -2
  34. package/dist/_chunks/{notification-tray-Dl3FTleW.js.map → notification-tray-BWHDIjgd.js.map} +1 -1
  35. package/dist/_chunks/{otp-input-CDTWT5EK.js → otp-input-CMphfBxZ.js} +70 -71
  36. package/dist/_chunks/otp-input-CMphfBxZ.js.map +1 -0
  37. package/dist/_chunks/{patient-shell-Bz3CdO84.js → patient-shell-DF81lALv.js} +36 -35
  38. package/dist/_chunks/{patient-shell-Bz3CdO84.js.map → patient-shell-DF81lALv.js.map} +1 -1
  39. package/dist/_chunks/{payment-form-D5rgnZu7.js → payment-form-Dy3WIIsC.js} +18 -18
  40. package/dist/_chunks/payment-form-Dy3WIIsC.js.map +1 -0
  41. package/dist/_chunks/{pdf-viewer-DvtEHcEP.js → pdf-viewer-Cy6Ul3hZ.js} +2 -2
  42. package/dist/_chunks/pdf-viewer-Cy6Ul3hZ.js.map +1 -0
  43. package/dist/_chunks/{practice-results-C8ciLQap.js → practice-results-C0d4IL5E.js} +2 -2
  44. package/dist/_chunks/{practice-results-C8ciLQap.js.map → practice-results-C0d4IL5E.js.map} +1 -1
  45. package/dist/_chunks/{public-footer.agent-zw1vFin_.js → public-footer.agent-okt8ZRc5.js} +2 -2
  46. package/dist/_chunks/{public-footer.agent-zw1vFin_.js.map → public-footer.agent-okt8ZRc5.js.map} +1 -1
  47. package/dist/_chunks/{reviews-panel-Dow8Dzoa.js → reviews-panel-CPrXu5TX.js} +2 -2
  48. package/dist/_chunks/{reviews-panel-Dow8Dzoa.js.map → reviews-panel-CPrXu5TX.js.map} +1 -1
  49. package/dist/_chunks/{sidebar-BbR8f6oe.js → sidebar-_vJXI9rB.js} +2 -2
  50. package/dist/_chunks/{sidebar-BbR8f6oe.js.map → sidebar-_vJXI9rB.js.map} +1 -1
  51. package/dist/_chunks/sign-document-CpLDZ6Db.js +316 -0
  52. package/dist/_chunks/sign-document-CpLDZ6Db.js.map +1 -0
  53. package/dist/_chunks/{signature-capture-C-fF71xI.js → signature-capture-DoiBd6i3.js} +138 -143
  54. package/dist/_chunks/signature-capture-DoiBd6i3.js.map +1 -0
  55. package/dist/_chunks/{sparkline-DEROcSl0.js → sparkline-DGhCSw8M.js} +55 -46
  56. package/dist/_chunks/sparkline-DGhCSw8M.js.map +1 -0
  57. package/dist/_chunks/{stepper-accordion-BfS6lUB9.js → stepper-accordion-Dki6r9ZE.js} +2 -2
  58. package/dist/_chunks/stepper-accordion-Dki6r9ZE.js.map +1 -0
  59. package/dist/_chunks/{tag-CyoaEmf_.js → tag-CdA0s_VV.js} +16 -16
  60. package/dist/_chunks/tag-CdA0s_VV.js.map +1 -0
  61. package/dist/_chunks/{task-card-BUVMh6HN.js → task-card-CPyQ5AXC.js} +6 -5
  62. package/dist/_chunks/task-card-CPyQ5AXC.js.map +1 -0
  63. package/dist/_chunks/{task-tray-DRK0b0Qb.js → task-tray-B8jFv5FV.js} +36 -35
  64. package/dist/_chunks/task-tray-B8jFv5FV.js.map +1 -0
  65. package/dist/_chunks/{transcript-panel-DyhTpAP7.js → transcript-panel-CR7VY1uw.js} +8 -7
  66. package/dist/_chunks/transcript-panel-CR7VY1uw.js.map +1 -0
  67. package/dist/_chunks/{warning-stack-bDicCvxs.js → warning-stack-DNR3-IbP.js} +17 -16
  68. package/dist/_chunks/warning-stack-DNR3-IbP.js.map +1 -0
  69. package/dist/_chunks/{workflow-map-uSiHbOWQ.js → workflow-map-C3gB0FvB.js} +3 -2
  70. package/dist/_chunks/{workflow-map-uSiHbOWQ.js.map → workflow-map-C3gB0FvB.js.map} +1 -1
  71. package/dist/agent-catalog.json +39 -1
  72. package/dist/brand/product-lockup/product-lockup.d.ts.map +1 -1
  73. package/dist/components/accordion/index.js +1 -1
  74. package/dist/components/agenda-tray/agenda-tray.d.ts.map +1 -1
  75. package/dist/components/agenda-tray/index.js +1 -1
  76. package/dist/components/bmi-calculator/index.js +1 -1
  77. package/dist/components/booking/index.js +1 -1
  78. package/dist/components/chart/chart.d.ts +1 -1
  79. package/dist/components/chart/chart.d.ts.map +1 -1
  80. package/dist/components/chart/index.js +1 -1
  81. package/dist/components/collapsible/index.js +1 -1
  82. package/dist/components/data-table/index.js +1 -1
  83. package/dist/components/document-scanner/document-scanner.d.ts.map +1 -1
  84. package/dist/components/document-scanner/index.js +1 -1
  85. package/dist/components/file-upload/index.js +1 -1
  86. package/dist/components/freemium-paywall/index.js +1 -1
  87. package/dist/components/header-settings/header-settings.agent.d.ts +4 -0
  88. package/dist/components/header-settings/header-settings.agent.d.ts.map +1 -0
  89. package/dist/components/header-settings/header-settings.d.ts +36 -0
  90. package/dist/components/header-settings/header-settings.d.ts.map +1 -0
  91. package/dist/components/header-settings/index.d.ts +2 -0
  92. package/dist/components/header-settings/index.d.ts.map +1 -0
  93. package/dist/components/header-settings/index.js +2 -241
  94. package/dist/components/header-settings/index.js.map +1 -1
  95. package/dist/components/index.d.ts +1 -0
  96. package/dist/components/index.d.ts.map +1 -1
  97. package/dist/components/locale-picker/locale-picker.agent.d.ts +4 -0
  98. package/dist/components/locale-picker/locale-picker.agent.d.ts.map +1 -0
  99. package/dist/components/locale-picker/locale-picker.d.ts +80 -0
  100. package/dist/components/locale-picker/locale-picker.d.ts.map +1 -0
  101. package/dist/components/map-view/index.js +1 -1
  102. package/dist/components/message-card/index.js +1 -1
  103. package/dist/components/message-card/message-card.d.ts.map +1 -1
  104. package/dist/components/message-tray/index.js +1 -1
  105. package/dist/components/notification-card/index.js +1 -1
  106. package/dist/components/notification-card/notification-card.d.ts.map +1 -1
  107. package/dist/components/notification-tray/index.js +1 -1
  108. package/dist/components/otp-input/index.d.ts +1 -1
  109. package/dist/components/otp-input/index.d.ts.map +1 -1
  110. package/dist/components/otp-input/index.js +1 -1
  111. package/dist/components/otp-input/otp-input.d.ts +1 -1
  112. package/dist/components/otp-input/otp-input.d.ts.map +1 -1
  113. package/dist/components/payment-form/index.js +1 -1
  114. package/dist/components/pdf-viewer/index.js +1 -1
  115. package/dist/components/practice-results/index.js +1 -1
  116. package/dist/components/public-footer/index.js +1 -1
  117. package/dist/components/reviews-panel/index.js +1 -1
  118. package/dist/components/sidebar/index.js +1 -1
  119. package/dist/components/sign-document/index.d.ts +4 -0
  120. package/dist/components/sign-document/index.d.ts.map +1 -0
  121. package/dist/components/sign-document/index.js +6 -0
  122. package/dist/components/sign-document/index.js.map +1 -0
  123. package/dist/components/sign-document/sign-document.agent.d.ts +4 -0
  124. package/dist/components/sign-document/sign-document.agent.d.ts.map +1 -0
  125. package/dist/components/sign-document/sign-document.d.ts +47 -0
  126. package/dist/components/sign-document/sign-document.d.ts.map +1 -0
  127. package/dist/components/signature-capture/index.js +1 -1
  128. package/dist/components/signature-capture/signature-capture.d.ts.map +1 -1
  129. package/dist/components/sparkline/index.js +1 -1
  130. package/dist/components/sparkline/sparkline.d.ts +1 -1
  131. package/dist/components/sparkline/sparkline.d.ts.map +1 -1
  132. package/dist/components/stepper-accordion/index.js +1 -1
  133. package/dist/components/tag/index.js +1 -1
  134. package/dist/components/task-card/index.js +1 -1
  135. package/dist/components/task-card/task-card.d.ts.map +1 -1
  136. package/dist/components/task-tray/index.js +1 -1
  137. package/dist/components/task-tray/task-tray.d.ts.map +1 -1
  138. package/dist/components/transcript-panel/index.js +1 -1
  139. package/dist/components/transcript-panel/transcript-panel.d.ts.map +1 -1
  140. package/dist/components/warning-stack/index.js +1 -1
  141. package/dist/components/warning-stack/warning-stack.d.ts.map +1 -1
  142. package/dist/components/workflow/index.js +1 -1
  143. package/dist/components/workflow/workflow-map.d.ts.map +1 -1
  144. package/dist/i18n/locale-meta.d.ts +56 -0
  145. package/dist/i18n/locale-meta.d.ts.map +1 -0
  146. package/dist/i18n/locales/ar.d.ts +22 -0
  147. package/dist/i18n/locales/ar.d.ts.map +1 -1
  148. package/dist/i18n/locales/ar.js +22 -0
  149. package/dist/i18n/locales/ar.js.map +1 -1
  150. package/dist/i18n/locales/de.d.ts +22 -0
  151. package/dist/i18n/locales/de.d.ts.map +1 -1
  152. package/dist/i18n/locales/de.js +22 -0
  153. package/dist/i18n/locales/de.js.map +1 -1
  154. package/dist/i18n/locales/el.d.ts +22 -0
  155. package/dist/i18n/locales/el.d.ts.map +1 -1
  156. package/dist/i18n/locales/el.js +22 -0
  157. package/dist/i18n/locales/el.js.map +1 -1
  158. package/dist/i18n/locales/en.d.ts +22 -0
  159. package/dist/i18n/locales/en.d.ts.map +1 -1
  160. package/dist/i18n/locales/en.js +22 -0
  161. package/dist/i18n/locales/en.js.map +1 -1
  162. package/dist/i18n/locales/es.d.ts +22 -0
  163. package/dist/i18n/locales/es.d.ts.map +1 -1
  164. package/dist/i18n/locales/es.js +22 -0
  165. package/dist/i18n/locales/es.js.map +1 -1
  166. package/dist/i18n/locales/fr.d.ts +22 -0
  167. package/dist/i18n/locales/fr.d.ts.map +1 -1
  168. package/dist/i18n/locales/fr.js +22 -0
  169. package/dist/i18n/locales/fr.js.map +1 -1
  170. package/dist/i18n/locales/hi.d.ts +22 -0
  171. package/dist/i18n/locales/hi.d.ts.map +1 -1
  172. package/dist/i18n/locales/hi.js +22 -0
  173. package/dist/i18n/locales/hi.js.map +1 -1
  174. package/dist/i18n/locales/it.d.ts +22 -0
  175. package/dist/i18n/locales/it.d.ts.map +1 -1
  176. package/dist/i18n/locales/it.js +22 -0
  177. package/dist/i18n/locales/it.js.map +1 -1
  178. package/dist/i18n/locales/ja.d.ts +22 -0
  179. package/dist/i18n/locales/ja.d.ts.map +1 -1
  180. package/dist/i18n/locales/ja.js +22 -0
  181. package/dist/i18n/locales/ja.js.map +1 -1
  182. package/dist/i18n/locales/nl.d.ts +22 -0
  183. package/dist/i18n/locales/nl.d.ts.map +1 -1
  184. package/dist/i18n/locales/nl.js +22 -0
  185. package/dist/i18n/locales/nl.js.map +1 -1
  186. package/dist/i18n/locales/pl.d.ts +22 -0
  187. package/dist/i18n/locales/pl.d.ts.map +1 -1
  188. package/dist/i18n/locales/pl.js +22 -0
  189. package/dist/i18n/locales/pl.js.map +1 -1
  190. package/dist/i18n/locales/pt.d.ts +22 -0
  191. package/dist/i18n/locales/pt.d.ts.map +1 -1
  192. package/dist/i18n/locales/pt.js +22 -0
  193. package/dist/i18n/locales/pt.js.map +1 -1
  194. package/dist/i18n/locales/ro.d.ts +22 -0
  195. package/dist/i18n/locales/ro.d.ts.map +1 -1
  196. package/dist/i18n/locales/ro.js +22 -0
  197. package/dist/i18n/locales/ro.js.map +1 -1
  198. package/dist/i18n/locales/ru.d.ts +22 -0
  199. package/dist/i18n/locales/ru.d.ts.map +1 -1
  200. package/dist/i18n/locales/ru.js +22 -0
  201. package/dist/i18n/locales/ru.js.map +1 -1
  202. package/dist/i18n/locales/sq.d.ts +22 -0
  203. package/dist/i18n/locales/sq.d.ts.map +1 -1
  204. package/dist/i18n/locales/sq.js +22 -0
  205. package/dist/i18n/locales/sq.js.map +1 -1
  206. package/dist/i18n/locales/sv.d.ts +22 -0
  207. package/dist/i18n/locales/sv.d.ts.map +1 -1
  208. package/dist/i18n/locales/sv.js +22 -0
  209. package/dist/i18n/locales/sv.js.map +1 -1
  210. package/dist/i18n/locales/tr.d.ts +22 -0
  211. package/dist/i18n/locales/tr.d.ts.map +1 -1
  212. package/dist/i18n/locales/tr.js +22 -0
  213. package/dist/i18n/locales/tr.js.map +1 -1
  214. package/dist/i18n/locales/zh.d.ts +22 -0
  215. package/dist/i18n/locales/zh.d.ts.map +1 -1
  216. package/dist/i18n/locales/zh.js +22 -0
  217. package/dist/i18n/locales/zh.js.map +1 -1
  218. package/dist/index.js +110 -107
  219. package/dist/index.js.map +1 -1
  220. package/dist/locales/ar.json +22 -0
  221. package/dist/locales/de.json +22 -0
  222. package/dist/locales/el.json +22 -0
  223. package/dist/locales/en.json +22 -0
  224. package/dist/locales/es.json +22 -0
  225. package/dist/locales/fr.json +22 -0
  226. package/dist/locales/hi.json +22 -0
  227. package/dist/locales/it.json +22 -0
  228. package/dist/locales/ja.json +22 -0
  229. package/dist/locales/nl.json +22 -0
  230. package/dist/locales/pl.json +22 -0
  231. package/dist/locales/pt.json +22 -0
  232. package/dist/locales/ro.json +22 -0
  233. package/dist/locales/ru.json +22 -0
  234. package/dist/locales/sq.json +22 -0
  235. package/dist/locales/sv.json +22 -0
  236. package/dist/locales/tr.json +22 -0
  237. package/dist/locales/zh.json +22 -0
  238. package/dist/patterns/marketplace-app-shell/index.js +1 -1
  239. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts +12 -8
  240. package/dist/patterns/marketplace-app-shell/marketplace-app-shell.d.ts.map +1 -1
  241. package/dist/patterns/patient-shell/index.js +1 -1
  242. package/dist/patterns/patient-shell/patient-shell.d.ts.map +1 -1
  243. package/dist/tokens.css +1 -1
  244. package/package.json +5 -1
  245. package/dist/_chunks/accordion-bSU21uTV.js.map +0 -1
  246. package/dist/_chunks/agenda-tray-By_asPN9.js.map +0 -1
  247. package/dist/_chunks/chart-DnHvmiDX.js.map +0 -1
  248. package/dist/_chunks/collapsible-CERONory.js.map +0 -1
  249. package/dist/_chunks/document-scanner-CdHQ6lTN.js.map +0 -1
  250. package/dist/_chunks/file-upload-CnzRcErt.js.map +0 -1
  251. package/dist/_chunks/marketplace-app-shell-BnClrL2B.js +0 -295
  252. package/dist/_chunks/marketplace-app-shell-BnClrL2B.js.map +0 -1
  253. package/dist/_chunks/message-card-BbRhZkDI.js.map +0 -1
  254. package/dist/_chunks/message-tray-B762TKuv.js.map +0 -1
  255. package/dist/_chunks/notification-card-DMdO4g54.js.map +0 -1
  256. package/dist/_chunks/otp-input-CDTWT5EK.js.map +0 -1
  257. package/dist/_chunks/payment-form-D5rgnZu7.js.map +0 -1
  258. package/dist/_chunks/pdf-viewer-DvtEHcEP.js.map +0 -1
  259. package/dist/_chunks/signature-capture-C-fF71xI.js.map +0 -1
  260. package/dist/_chunks/sparkline-DEROcSl0.js.map +0 -1
  261. package/dist/_chunks/stepper-accordion-BfS6lUB9.js.map +0 -1
  262. package/dist/_chunks/tag-CyoaEmf_.js.map +0 -1
  263. package/dist/_chunks/task-card-BUVMh6HN.js.map +0 -1
  264. package/dist/_chunks/task-tray-DRK0b0Qb.js.map +0 -1
  265. package/dist/_chunks/transcript-panel-DyhTpAP7.js.map +0 -1
  266. package/dist/_chunks/warning-stack-bDicCvxs.js.map +0 -1
@@ -1,11 +1,11 @@
1
1
  import { jsx as a, jsxs as p } from "react/jsx-runtime";
2
- import { forwardRef as q, useRef as k, useMemo as z, useImperativeHandle as M } from "react";
3
- import { c as S } from "./index-D2ZczOXr.js";
4
- import { useTranslation as _ } from "react-i18next";
2
+ import { forwardRef as j, useRef as v, useMemo as q, useImperativeHandle as z } from "react";
3
+ import { c as M } from "./index-D2ZczOXr.js";
4
+ import { useTranslation as S } from "react-i18next";
5
5
  import { I as C } from "./icon-button-CKEOrN37.js";
6
6
  import { S as K } from "./skeleton-CZbwyJAA.js";
7
7
  import { E } from "./empty-state-BLy7tigq.js";
8
- import { T as L } from "./task-card-BUVMh6HN.js";
8
+ import { T as L } from "./task-card-CPyQ5AXC.js";
9
9
  import { u as P } from "./registry-nPAVE19X.js";
10
10
  import { c as H } from "./createLucideIcon-CrFbzy84.js";
11
11
  import { P as V } from "./plus-CYKNmfuA.js";
@@ -77,10 +77,11 @@ const B = [
77
77
  description: "Stable task id emitted on each rendered TaskCard inside the tray."
78
78
  }
79
79
  }
80
- }, J = S(
80
+ }, J = M(
81
81
  [
82
82
  "ds:flex ds:flex-col",
83
83
  "ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]",
84
+ "ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2",
84
85
  "ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]",
85
86
  "ds:overflow-hidden"
86
87
  ].join(" "),
@@ -95,80 +96,80 @@ const B = [
95
96
  size: "sm"
96
97
  }
97
98
  }
98
- ), Q = q(
99
+ ), Q = j(
99
100
  ({
100
101
  id: e,
101
102
  items: s,
102
- title: v,
103
+ title: k,
103
104
  size: f = "sm",
104
- onOpenTask: r,
105
+ onOpenTask: i,
105
106
  onToggleDone: n,
106
107
  onDismissTask: c,
107
108
  onAddTask: y,
108
109
  addLabel: x,
109
- loading: u = !1,
110
- emptyTitle: w,
111
- emptyDescription: I,
112
- className: N,
113
- ...T
114
- }, b) => {
115
- const { t: l } = _(), h = v ?? l("taskTray.title", "Tasks"), R = x ?? l("taskTray.add", "Add task"), A = !u && s.length === 0;
110
+ loading: h = !1,
111
+ emptyTitle: b,
112
+ emptyDescription: w,
113
+ className: I,
114
+ ...N
115
+ }, T) => {
116
+ const { t: l } = S(), u = k ?? l("taskTray.title", "Tasks"), R = x ?? l("taskTray.add", "Add task"), A = !h && s.length === 0;
116
117
  let m;
117
- u ? m = /* @__PURE__ */ a("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [0, 1, 2].map((t) => /* @__PURE__ */ a(K, { variant: "rectangular", height: "2.5rem" }, t)) }) : A ? m = /* @__PURE__ */ a("div", { className: "ds:p-[var(--spacing-md)]", children: /* @__PURE__ */ a(
118
+ h ? m = /* @__PURE__ */ a("div", { className: "ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [0, 1, 2].map((t) => /* @__PURE__ */ a(K, { variant: "rectangular", height: "2.5rem" }, t)) }) : A ? m = /* @__PURE__ */ a("div", { className: "ds:p-[var(--spacing-md)]", children: /* @__PURE__ */ a(
118
119
  E,
119
120
  {
120
121
  variant: "first-use",
121
122
  size: "sm",
122
- title: w ?? l("taskTray.empty.title", "No tasks yet"),
123
- description: I ?? l("taskTray.empty.description", "New tasks will appear here.")
123
+ title: b ?? l("taskTray.empty.title", "No tasks yet"),
124
+ description: w ?? l("taskTray.empty.description", "New tasks will appear here.")
124
125
  }
125
126
  ) }) : m = /* @__PURE__ */ a("ul", { className: "ds:flex ds:list-none ds:flex-col", children: s.map((t) => /* @__PURE__ */ a(
126
127
  L,
127
128
  {
128
129
  item: t,
129
130
  size: f,
130
- onActivate: r,
131
+ onActivate: i,
131
132
  "data-task-id": t.id
132
133
  },
133
134
  t.id
134
135
  )) });
135
- const d = k(s);
136
+ const d = v(s);
136
137
  d.current = s;
137
- const j = z(
138
+ const _ = q(
138
139
  () => ({
139
140
  getItems: () => d.current.map((t) => ({
140
141
  id: t.id,
141
142
  status: t.status ?? "open"
142
143
  })),
143
144
  selectItem: (t) => {
144
- const i = d.current.find((o) => o.id === t);
145
- i && (r == null || r(i));
145
+ const r = d.current.find((o) => o.id === t);
146
+ r && (i == null || i(r));
146
147
  },
147
148
  toggleDone: (t) => {
148
- const i = d.current.find((o) => o.id === t);
149
- i && (n == null || n(i));
149
+ const r = d.current.find((o) => o.id === t);
150
+ r && (n == null || n(r));
150
151
  },
151
152
  dismiss: (t) => {
152
- const i = d.current.find((o) => o.id === t);
153
- i && (c == null || c(i));
153
+ const r = d.current.find((o) => o.id === t);
154
+ r && (c == null || c(r));
154
155
  }
155
156
  }),
156
- [r, n, c]
157
- ), g = k(null);
158
- return M(b, () => g.current, []), P(G, j, e), /* @__PURE__ */ p(
157
+ [i, n, c]
158
+ ), g = v(null);
159
+ return z(T, () => g.current, []), P(G, _, e), /* @__PURE__ */ p(
159
160
  "section",
160
161
  {
161
162
  ref: g,
162
- "aria-label": h,
163
+ "aria-label": u,
163
164
  "data-component": "task-tray",
164
165
  "data-component-id": e,
165
- className: J({ size: f, className: N }),
166
- ...T,
166
+ className: J({ size: f, className: I }),
167
+ ...N,
167
168
  children: [
168
169
  /* @__PURE__ */ p("header", { className: "ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]", children: [
169
170
  /* @__PURE__ */ p("h3", { className: "ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card", children: [
170
171
  /* @__PURE__ */ a(F, { "aria-hidden": "true", className: "ds:size-4" }),
171
- h
172
+ u
172
173
  ] }),
173
174
  y ? /* @__PURE__ */ a(
174
175
  C,
@@ -192,4 +193,4 @@ export {
192
193
  Q as T,
193
194
  G as t
194
195
  };
195
- //# sourceMappingURL=task-tray-DRK0b0Qb.js.map
196
+ //# sourceMappingURL=task-tray-B8jFv5FV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-tray-B8jFv5FV.js","sources":["../../node_modules/lucide-react/dist/esm/icons/list-todo.js","../../src/components/task-tray/task-tray.agent.ts","../../src/components/task-tray/task-tray.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.8.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\", key: \"1jhpwq\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"6\", height: \"6\", rx: \"1\", key: \"cif1o7\" }]\n];\nconst ListTodo = createLucideIcon(\"list-todo\", __iconNode);\n\nexport { __iconNode, ListTodo as default };\n//# sourceMappingURL=list-todo.js.map\n","/* -------------------------------------------------------------------- */\n/* Agent adapter — TaskTray. */\n/* */\n/* Tray-level surface: read the current task ids + status, route a */\n/* `select_item` activation, and `toggle_done` / `dismiss` per task */\n/* through the curated handle. TaskTray is in-page (no open/close), */\n/* so it declares neither `open` nor `close`. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TaskTrayHandle } from './task-tray';\n\nexport const taskTrayAgent: AgentAdapter<TaskTrayHandle> = {\n id: 'task-tray',\n capabilities: ['select_single', 'dismiss'],\n state: {\n items: {\n type: 'Array<{ id: string; status: string }>',\n descriptionKey: 'ui.agent.taskTray.state.items',\n description:\n 'Currently-displayed tasks. Ids + status only — never task title / patient.',\n read: (handle) => handle.getItems(),\n },\n },\n actions: {\n select_item: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.selectItem',\n description: 'Activate the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.selectItem(args.id);\n },\n },\n toggle_done: {\n safety: 'write',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.toggleDone',\n description: 'Request the host to toggle the done state of a task.',\n invoke: (handle, args: { id: string }) => {\n handle.toggleDone(args.id);\n },\n },\n dismiss: {\n safety: 'destructive',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.taskTray.actions.dismiss',\n description:\n 'Request the host to dismiss / remove the task with the given id.',\n invoke: (handle, args: { id: string }) => {\n handle.dismiss(args.id);\n },\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'task-tray',\n description: 'Marks the TaskTray wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description:\n 'Sourced from the id prop. Required to address a specific tray from the agent.',\n },\n item: {\n attr: 'data-task-id',\n description:\n 'Stable task id emitted on each rendered TaskCard inside the tray.',\n },\n },\n};\n","import {\n forwardRef,\n useImperativeHandle,\n useMemo,\n useRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ListTodo, Plus } from 'lucide-react';\nimport { IconButton } from '../button/icon-button';\nimport { Skeleton } from '../skeleton/skeleton';\nimport { EmptyState } from '../empty-state/empty-state';\nimport { TaskCard, type TaskItem } from '../task-card';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { taskTrayAgent } from './task-tray.agent';\n\n/* ------------------------------------------------------------------ */\n/* CVA */\n/* ------------------------------------------------------------------ */\n\nconst taskTrayVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-md)] ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:overflow-hidden',\n ].join(' '),\n {\n variants: {\n size: {\n sm: '',\n md: '',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n },\n);\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\n/**\n * Curated imperative handle for TaskTray. Exposed as the forwardRef\n * target so a future agent / MCP UI bridge can drive the tray without\n * touching the DOM. See `task-tray.agent.ts`.\n */\nexport interface TaskTrayHandle {\n getItems: () => Array<{ id: string; status: string }>;\n selectItem: (id: string) => void;\n toggleDone: (id: string) => void;\n dismiss: (id: string) => void;\n}\n\nexport interface TaskTrayProps\n extends\n Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'id'>,\n VariantProps<typeof taskTrayVariants> {\n /**\n * Stable instance id. Surfaced on the root as `data-component-id` so\n * an agent / MCP UI bridge can address this specific tray.\n */\n id?: string;\n /** Tasks rendered inside the panel. */\n items: TaskItem[];\n /** Section title — rendered in the header. Localised by the consumer. */\n title?: string;\n /** Visual density forwarded to each TaskCard. */\n size?: 'sm' | 'md';\n /** Fires when the user activates a task (click / Enter / Space). */\n onOpenTask?: (item: TaskItem) => void;\n /** Fires when the host should toggle the done state of a task. Used by agent integration. */\n onToggleDone?: (item: TaskItem) => void;\n /** Fires when the host should dismiss / remove a task. Used by agent integration. */\n onDismissTask?: (item: TaskItem) => void;\n /** Fires when the user activates the header \"Add\" affordance. */\n onAddTask?: () => void;\n /** Localised label for the \"Add\" affordance. Defaults to `ui.taskTray.add`. */\n addLabel?: string;\n /** When true the panel renders skeleton placeholders. */\n loading?: boolean;\n /** Render an empty state when `items` is empty and `loading` is false. */\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/* ------------------------------------------------------------------ */\n/* Component */\n/* ------------------------------------------------------------------ */\n\nexport const TaskTray = forwardRef<HTMLElement, TaskTrayProps>(\n (\n {\n id,\n items,\n title,\n size = 'sm',\n onOpenTask,\n onToggleDone,\n onDismissTask,\n onAddTask,\n addLabel,\n loading = false,\n emptyTitle,\n emptyDescription,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const heading = title ?? t('taskTray.title', 'Tasks');\n const resolvedAddLabel = addLabel ?? t('taskTray.add', 'Add task');\n const isEmpty = !loading && items.length === 0;\n\n let body: ReactNode;\n if (loading) {\n body = (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n {[0, 1, 2].map((i) => (\n <Skeleton key={i} variant=\"rectangular\" height=\"2.5rem\" />\n ))}\n </div>\n );\n } else if (isEmpty) {\n body = (\n <div className=\"ds:p-[var(--spacing-md)]\">\n <EmptyState\n variant=\"first-use\"\n size=\"sm\"\n title={emptyTitle ?? t('taskTray.empty.title', 'No tasks yet')}\n description={\n emptyDescription ??\n t('taskTray.empty.description', 'New tasks will appear here.')\n }\n />\n </div>\n );\n } else {\n body = (\n <ul className=\"ds:flex ds:list-none ds:flex-col\">\n {items.map((item) => (\n <TaskCard\n key={item.id}\n item={item}\n size={size}\n onActivate={onOpenTask}\n data-task-id={item.id}\n />\n ))}\n </ul>\n );\n }\n\n /* Curated imperative handle for agent integration. See\n * task-tray.agent.ts. */\n const itemsRef = useRef<TaskItem[]>(items);\n itemsRef.current = items;\n\n const handle = useMemo<TaskTrayHandle>(\n () => ({\n getItems: () =>\n itemsRef.current.map((i) => ({\n id: i.id,\n status: i.status ?? 'open',\n })),\n selectItem: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onOpenTask?.(found);\n },\n toggleDone: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onToggleDone?.(found);\n },\n dismiss: (targetId: string) => {\n const found = itemsRef.current.find((i) => i.id === targetId);\n if (found) onDismissTask?.(found);\n },\n }),\n [onOpenTask, onToggleDone, onDismissTask],\n );\n\n const rootRef = useRef<HTMLElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLElement, []);\n useAgentRegistration(taskTrayAgent, handle, id);\n\n return (\n <section\n ref={rootRef}\n aria-label={heading}\n data-component=\"task-tray\"\n data-component-id={id}\n className={taskTrayVariants({ size, className })}\n {...rest}\n >\n <header className=\"ds:flex ds:items-center ds:justify-between ds:gap-[var(--spacing-sm)] ds:p-[var(--spacing-sm)]\">\n <h3 className=\"ds:m-0 ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] type-title-card\">\n <ListTodo aria-hidden=\"true\" className=\"ds:size-4\" />\n {heading}\n </h3>\n {onAddTask ? (\n <IconButton\n icon={<Plus />}\n intent=\"outline\"\n size=\"sm\"\n aria-label={resolvedAddLabel}\n onClick={onAddTask}\n />\n ) : null}\n </header>\n {body}\n </section>\n );\n },\n);\n\nTaskTray.displayName = 'TaskTray';\n"],"names":["__iconNode","ListTodo","createLucideIcon","taskTrayAgent","handle","args","taskTrayVariants","cva","TaskTray","forwardRef","id","items","title","size","onOpenTask","onToggleDone","onDismissTask","onAddTask","addLabel","loading","emptyTitle","emptyDescription","className","rest","ref","t","useTranslation","heading","resolvedAddLabel","isEmpty","body","jsx","i","Skeleton","EmptyState","item","TaskCard","itemsRef","useRef","useMemo","targetId","found","rootRef","useImperativeHandle","useAgentRegistration","jsxs","IconButton","Plus"],"mappings":"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","x_google_ignoreList":[0]}
@@ -1,5 +1,5 @@
1
1
  import { jsxs as f, jsx as o } from "react/jsx-runtime";
2
- import { forwardRef as K, useState as A, useRef as x, useId as _, useMemo as w, useCallback as R, useImperativeHandle as j, Fragment as O } from "react";
2
+ import { forwardRef as K, useState as A, useRef as w, useId as _, useMemo as x, useCallback as R, useImperativeHandle as j, Fragment as O } from "react";
3
3
  import { c as V } from "./index-D2ZczOXr.js";
4
4
  import { useTranslation as D } from "react-i18next";
5
5
  import { u as F } from "./registry-nPAVE19X.js";
@@ -54,7 +54,8 @@ const U = {
54
54
  }, G = V(
55
55
  [
56
56
  "ds:flex ds:flex-col ds:w-full ds:min-h-0",
57
- "ds:rounded-[var(--radius-md)] ds:border ds:border-border",
57
+ "ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]",
58
+ "ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2",
58
59
  "ds:bg-background",
59
60
  "ds:focus-within:border-[color:var(--primary)]"
60
61
  ].join(" "),
@@ -120,14 +121,14 @@ const te = K(
120
121
  className: p,
121
122
  ...g
122
123
  }, L) => {
123
- const { t: d, i18n: b } = D(), [m, M] = A(""), h = x(null), T = x(null), P = _(), c = w(() => {
124
+ const { t: d, i18n: b } = D(), [m, M] = A(""), h = w(null), T = w(null), P = _(), c = x(() => {
124
125
  if (!Number.isFinite(n)) return -1;
125
126
  for (let e = 0; e < t.length; e += 1) {
126
127
  const r = t[e];
127
128
  if (r.start <= n && n < r.end) return e;
128
129
  }
129
130
  return -1;
130
- }, [t, n]), k = w(() => {
131
+ }, [t, n]), k = x(() => {
131
132
  if (!m) return 0;
132
133
  let e = 0;
133
134
  const r = m.toLocaleLowerCase();
@@ -245,9 +246,9 @@ const te = K(
245
246
  );
246
247
  },
247
248
  [c, b.language, a, m, d]
248
- ), S = x(null);
249
+ ), S = w(null);
249
250
  j(L, () => S.current, []);
250
- const E = w(
251
+ const E = x(
251
252
  () => ({
252
253
  getSelectedTurn: () => c >= 0 ? String(c) : null,
253
254
  focusTurn: (e) => {
@@ -344,4 +345,4 @@ export {
344
345
  te as T,
345
346
  U as t
346
347
  };
347
- //# sourceMappingURL=transcript-panel-DyhTpAP7.js.map
348
+ //# sourceMappingURL=transcript-panel-CR7VY1uw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-panel-CR7VY1uw.js","sources":["../../src/components/transcript-panel/transcript-panel.agent.ts","../../src/components/transcript-panel/transcript-panel.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* Agent adapter — TranscriptPanel. */\n/* */\n/* `data-turn-id` carries the line's stable index (opaque id) — never */\n/* the dictated text. Transcript content frequently contains PHI; the */\n/* DOM hook MUST NOT leak it. See PRS §26 §6.1. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { TranscriptPanelHandle } from './transcript-panel';\n\nexport const transcriptPanelAgent: AgentAdapter<TranscriptPanelHandle> = {\n id: 'transcript-panel',\n capabilities: ['select_single'],\n state: {\n selectedTurn: {\n type: 'string | null',\n descriptionKey: 'ui.agent.transcriptPanel.state.selectedTurn',\n description:\n 'Opaque id (line index) of the currently-active turn, or null when none is active.',\n read: (handle) => handle.getSelectedTurn(),\n },\n },\n actions: {\n focus_turn: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.transcriptPanel.actions.focusTurn',\n description: 'Scroll the given turn into view and focus its seek button.',\n invoke: (handle, args: { id: string }) => {\n handle.focusTurn(args.id);\n },\n },\n copy_turn: {\n safety: 'read',\n argsType: '{ id: string }',\n descriptionKey: 'ui.agent.transcriptPanel.actions.copyTurn',\n description: \"Copy the given turn's text to the clipboard.\",\n invoke: (handle, args: { id: string }) => handle.copyTurn(args.id),\n },\n },\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'transcript-panel',\n description: 'Marks the TranscriptPanel wrapper.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-turn-id',\n description:\n \"Stable opaque turn id (line index). Never carries the turn's dictated text.\",\n },\n },\n};\n","import {\n forwardRef,\n Fragment,\n useCallback,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent/registry';\nimport { transcriptPanelAgent } from './transcript-panel.agent';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport { SearchInput } from '../search-input';\nimport { useIsomorphicLayoutEffect } from '../../hooks/use-isomorphic-layout-effect';\n\n/* ------------------------------------------------------------------ */\n/* Public types */\n/* ------------------------------------------------------------------ */\n\nexport interface TranscriptLine {\n speaker: string;\n text: string;\n /** Seconds, floating-point — matches HTMLMediaElement.currentTime. */\n start: number;\n end: number;\n /** 0..1 — rendered with a dotted underline when below 0.6. */\n confidence?: number;\n}\n\n/** Curated imperative handle for agent / external automation. */\nexport interface TranscriptPanelHandle {\n /** Opaque id (line index) of the active turn, or null. */\n getSelectedTurn: () => string | null;\n /** Scroll the turn with the given id into view and focus its seek button. */\n focusTurn: (id: string) => void;\n /** Copy the turn's text to the clipboard. */\n copyTurn: (id: string) => Promise<void> | void;\n}\n\nexport interface TranscriptPanelProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children'>,\n VariantProps<typeof rootVariants> {\n lines: TranscriptLine[];\n /** Current playback time in seconds — drives the active line highlight. */\n currentTime?: number;\n onSeek?: (seconds: number) => void;\n /** Show the search bar. */\n searchable?: boolean;\n}\n\nconst rootVariants = cva(\n [\n 'ds:flex ds:flex-col ds:w-full ds:min-h-0',\n 'ds:rounded-[var(--radius-md)] ds:border ds:border-[color:var(--card-border)]',\n 'ds:shadow-[var(--shadow-card)] ds:[.theme-accessible_&]:border-2',\n 'ds:bg-background',\n 'ds:focus-within:border-[color:var(--primary)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:text-[length:var(--font-size-sm)]',\n md: 'ds:text-[length:var(--font-size-base)]',\n lg: 'ds:text-[length:var(--font-size-lg)]',\n },\n },\n defaultVariants: { size: 'md' },\n },\n);\n\nconst VIRTUALIZATION_THRESHOLD = 100;\nconst SPEAKER_SLOT_COUNT = 8;\n\nfunction formatTime(seconds: number, locale: string): string {\n const total = Math.max(0, Math.floor(seconds));\n const m = Math.floor(total / 60);\n const s = total % 60;\n const fmt = (n: number) =>\n new Intl.NumberFormat(locale, { minimumIntegerDigits: 2 }).format(n);\n return `${fmt(m)}:${fmt(s)}`;\n}\n\n/** ISO-8601 duration (PT#M#S) for <time datetime=\"...\">. */\nfunction secondsToIsoDuration(seconds: number): string {\n const total = Math.max(0, Math.floor(seconds));\n const m = Math.floor(total / 60);\n const s = total % 60;\n return `PT${m}M${s}S`;\n}\n\n/** Deterministic speaker slot (0..7) based on name hash. */\nfunction speakerSlot(name: string): number {\n let hash = 0;\n for (let i = 0; i < name.length; i += 1) {\n hash = (hash * 31 + name.charCodeAt(i)) | 0;\n }\n return Math.abs(hash) % SPEAKER_SLOT_COUNT;\n}\n\n/** Per-slot background classes. Indices align with the speaker palette tokens\n * in tokens/index.css. Static strings so Tailwind can pick them up at build. */\nconst SPEAKER_BG_CLASSES = [\n 'ds:bg-[color:var(--transcript-speaker-1)]',\n 'ds:bg-[color:var(--transcript-speaker-2)]',\n 'ds:bg-[color:var(--transcript-speaker-3)]',\n 'ds:bg-[color:var(--transcript-speaker-4)]',\n 'ds:bg-[color:var(--transcript-speaker-5)]',\n 'ds:bg-[color:var(--transcript-speaker-6)]',\n 'ds:bg-[color:var(--transcript-speaker-7)]',\n 'ds:bg-[color:var(--transcript-speaker-8)]',\n] as const;\n\n/** Escape a literal string for safe use inside a RegExp. */\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\ninterface HighlightedTextProps {\n text: string;\n query: string;\n}\n\n/** Renders text with <mark> wrapping around case-insensitive matches.\n * No dangerouslySetInnerHTML — splits text nodes only. */\nfunction HighlightedText({ text, query }: HighlightedTextProps): ReactNode {\n if (!query) return text;\n const escaped = escapeRegExp(query);\n const parts = text.split(new RegExp(`(${escaped})`, 'gi'));\n return parts.map((part, i) =>\n part.toLocaleLowerCase() === query.toLocaleLowerCase() ? (\n <mark\n key={i}\n className=\"ds:bg-[color:var(--warning)]/30 ds:text-[color:var(--foreground)] ds:rounded-[var(--radius-sm)]\"\n >\n {part}\n </mark>\n ) : (\n <Fragment key={i}>{part}</Fragment>\n ),\n );\n}\n\nexport const TranscriptPanel = forwardRef<HTMLDivElement, TranscriptPanelProps>(\n (\n {\n lines,\n currentTime = 0,\n onSeek,\n searchable = true,\n size = 'md',\n className,\n ...rest\n },\n ref,\n ) => {\n const { t, i18n } = useTranslation();\n const [query, setQuery] = useState('');\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const searchInputRef = useRef<HTMLInputElement | null>(null);\n const searchId = useId();\n\n /* Active-line index */\n const activeIndex = useMemo(() => {\n if (!Number.isFinite(currentTime)) return -1;\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n if (line.start <= currentTime && currentTime < line.end) return i;\n }\n return -1;\n }, [lines, currentTime]);\n\n /* Match count for search */\n const matchCount = useMemo(() => {\n if (!query) return 0;\n let count = 0;\n const needle = query.toLocaleLowerCase();\n for (const line of lines) {\n const hay = line.text.toLocaleLowerCase();\n let idx = hay.indexOf(needle);\n while (idx !== -1) {\n count += 1;\n idx = hay.indexOf(needle, idx + needle.length);\n }\n }\n return count;\n }, [lines, query]);\n\n /* Ctrl/Cmd+F shortcut — focuses the search field when focus is within. */\n const handleRootKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (\n (e.metaKey || e.ctrlKey) &&\n e.key.toLowerCase() === 'f' &&\n searchable\n ) {\n e.preventDefault();\n searchInputRef.current?.focus();\n }\n },\n [searchable],\n );\n\n /* Virtualisation above 100 lines */\n const virtualized = lines.length > VIRTUALIZATION_THRESHOLD;\n const virtualizer = useVirtualizer({\n count: virtualized ? lines.length : 0,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => 48,\n overscan: 8,\n getItemKey: (i) => i,\n });\n\n /* Auto-scroll active line into view when it changes. */\n useIsomorphicLayoutEffect(() => {\n if (activeIndex < 0) return;\n const scroller = scrollRef.current;\n if (!scroller) return;\n const target = scroller.querySelector(\n `[data-line-index=\"${activeIndex}\"]`,\n ) as HTMLElement | null;\n if (!target) return;\n const prefersReducedMotion =\n typeof window !== 'undefined' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n target.scrollIntoView({\n block: 'center',\n behavior: prefersReducedMotion ? 'auto' : 'smooth',\n });\n }, [activeIndex]);\n\n const renderLine = useCallback(\n (\n line: TranscriptLine,\n index: number,\n extras?: {\n liRef?: (node: HTMLLIElement | null) => void;\n dataIndex?: number;\n // Style is an inline-style escape hatch — virtualizer offsets\n // cannot be expressed as static Tailwind. See 23-constraints §4.\n style?: CSSProperties;\n absolutePositioning?: boolean;\n },\n ) => {\n const isActive = index === activeIndex;\n const slot = speakerSlot(line.speaker);\n const lowConfidence =\n typeof line.confidence === 'number' && line.confidence < 0.6;\n return (\n <li\n key={index}\n ref={extras?.liRef}\n data-line-index={index}\n data-turn-id={String(index)}\n data-index={extras?.dataIndex}\n aria-current={isActive ? 'true' : undefined}\n // eslint-disable-next-line react/forbid-dom-props -- virtualizer translateY offset, runtime-computed\n style={extras?.style}\n className={[\n 'ds:flex ds:items-start ds:gap-[var(--spacing-sm)]',\n 'ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-sm)]',\n isActive\n ? 'ds:bg-[color:var(--accent)]/12 ds:border-s-[3px] ds:border-[color:var(--primary)]'\n : 'ds:border-s-[3px] ds:border-transparent',\n extras?.absolutePositioning\n ? 'ds:absolute ds:start-0 ds:end-0 ds:top-0 ds:w-full'\n : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n <button\n type=\"button\"\n onClick={() => onSeek?.(line.start)}\n aria-label={t('chat.transcript.seekTo', {\n time: formatTime(line.start, i18n.language),\n })}\n className={[\n 'ds:inline-flex ds:items-center ds:justify-center',\n 'ds:font-[family-name:var(--font-mono)]',\n 'type-meta',\n 'ds:tabular-nums',\n 'ds:text-[color:var(--muted-foreground)]',\n 'ds:rounded-[var(--radius-sm)]',\n 'ds:ps-[var(--spacing-xs)] ds:pe-[var(--spacing-xs)] ds:pt-[var(--spacing-xs)] ds:pb-[var(--spacing-xs)]',\n // WCAG 2.5.5 target size: 44×44 default, 48×48 in accessible\n // themes — matches the DS `--min-target-size` token.\n 'ds:min-h-[var(--min-target-size)] ds:min-w-[var(--min-target-size)]',\n 'ds:hover: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 ].join(' ')}\n >\n <time dir=\"ltr\" dateTime={secondsToIsoDuration(line.start)}>\n {formatTime(line.start, i18n.language)}\n </time>\n </button>\n <div className=\"ds:flex-1 ds:min-w-0\">\n <div className=\"ds:flex ds:items-center ds:gap-[var(--spacing-xs)]\">\n <span\n aria-hidden=\"true\"\n className={`ds:inline-block ds:size-2 ds:rounded-[var(--radius-full)] ${SPEAKER_BG_CLASSES[slot]}`}\n />\n <strong className=\"type-title-item\">\n {t('chat.transcript.speaker', { name: line.speaker })}\n </strong>\n {lowConfidence ? (\n <span className=\"type-meta ds:italic ds:text-[color:var(--muted-foreground)]\">\n ({t('chat.transcript.lowConfidence')})\n </span>\n ) : null}\n </div>\n <span\n dir=\"auto\"\n className={[\n 'ds:block',\n lowConfidence\n ? 'ds:underline ds:decoration-dotted ds:decoration-[color:var(--muted-foreground)]'\n : '',\n ].join(' ')}\n >\n <HighlightedText text={line.text} query={query} />\n </span>\n </div>\n </li>\n );\n },\n [activeIndex, i18n.language, onSeek, query, t],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n useImperativeHandle(ref, () => rootRef.current as HTMLDivElement, []);\n\n const agentHandle = useMemo<TranscriptPanelHandle>(\n () => ({\n getSelectedTurn: () => (activeIndex >= 0 ? String(activeIndex) : null),\n focusTurn: (id: string) => {\n const target = scrollRef.current?.querySelector(\n `[data-turn-id=\"${id}\"]`,\n ) as HTMLElement | null;\n if (!target) return;\n target.scrollIntoView({ block: 'center', behavior: 'auto' });\n const btn = target.querySelector(\n 'button',\n ) as HTMLButtonElement | null;\n btn?.focus();\n },\n copyTurn: (id: string) => {\n const index = Number.parseInt(id, 10);\n if (!Number.isFinite(index)) return;\n const line = lines[index];\n if (!line) return;\n if (typeof navigator !== 'undefined' && navigator.clipboard) {\n return navigator.clipboard.writeText(line.text);\n }\n },\n }),\n [activeIndex, lines],\n );\n useAgentRegistration(\n transcriptPanelAgent,\n agentHandle,\n rest.id as string | undefined,\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions -- root keyboard shortcuts (j/k navigation, /) bubble up from focused descendants\n <div\n ref={rootRef}\n onKeyDown={handleRootKeyDown}\n data-component=\"transcript-panel\"\n data-component-id={rest.id}\n className={rootVariants({ size, className })}\n {...rest}\n >\n {searchable ? (\n <div className=\"ds:ps-[var(--spacing-sm)] ds:pe-[var(--spacing-sm)] ds:pt-[var(--spacing-sm)] ds:pb-[var(--spacing-xs)] ds:flex ds:items-center ds:gap-[var(--spacing-sm)] ds:border-b ds:border-border\">\n <SearchInput\n ref={searchInputRef}\n id={searchId}\n placeholder={t('chat.transcript.search')}\n aria-label={t('chat.transcript.search')}\n aria-keyshortcuts=\"Meta+F Control+F\"\n debounceMs={150}\n onChange={(v) => setQuery(v)}\n size=\"sm\"\n />\n {query ? (\n <span\n role=\"status\"\n aria-live=\"polite\"\n className=\"type-meta ds:text-[color:var(--muted-foreground)] ds:tabular-nums\"\n >\n {matchCount === 0\n ? t('chat.transcript.noMatches')\n : t('chat.transcript.matchCount', { count: matchCount })}\n </span>\n ) : null}\n </div>\n ) : null}\n\n <div\n ref={scrollRef}\n className=\"ds:flex-1 ds:min-h-0 ds:overflow-y-auto ds:overflow-x-hidden\"\n >\n {virtualized ? (\n <ol\n className=\"ds:relative ds:list-none ds:ps-0 ds:m-0\"\n // eslint-disable-next-line react/forbid-dom-props -- virtualizer total size, runtime-computed\n style={{ blockSize: `${virtualizer.getTotalSize()}px` }}\n >\n {virtualizer.getVirtualItems().map((vi) => {\n const line = lines[vi.index];\n if (!line) return null;\n // Put the measureElement ref on the <li> directly — a <div>\n // child of <ol> is invalid and breaks list semantics for\n // assistive tech.\n return renderLine(line, vi.index, {\n liRef: virtualizer.measureElement,\n dataIndex: vi.index,\n style: { transform: `translateY(${vi.start}px)` },\n absolutePositioning: true,\n });\n })}\n </ol>\n ) : (\n <ol className=\"ds:list-none ds:ps-0 ds:m-0\">\n {lines.map((line, index) => renderLine(line, index))}\n </ol>\n )}\n </div>\n </div>\n );\n },\n);\n\nTranscriptPanel.displayName = 'TranscriptPanel';\n"],"names":["transcriptPanelAgent","handle","args","rootVariants","cva","VIRTUALIZATION_THRESHOLD","SPEAKER_SLOT_COUNT","formatTime","seconds","locale","total","m","s","fmt","n","secondsToIsoDuration","speakerSlot","name","hash","i","SPEAKER_BG_CLASSES","escapeRegExp","input","HighlightedText","text","query","escaped","part","jsx","Fragment","TranscriptPanel","forwardRef","lines","currentTime","onSeek","searchable","size","className","rest","ref","t","i18n","useTranslation","setQuery","useState","scrollRef","useRef","searchInputRef","searchId","useId","activeIndex","useMemo","line","matchCount","count","needle","hay","idx","handleRootKeyDown","useCallback","_a","virtualized","virtualizer","useVirtualizer","useIsomorphicLayoutEffect","scroller","target","prefersReducedMotion","renderLine","index","extras","isActive","slot","lowConfidence","jsxs","rootRef","useImperativeHandle","agentHandle","id","btn","useAgentRegistration","SearchInput","v","vi"],"mappings":"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"}
@@ -11,6 +11,7 @@ const L = W(
11
11
  "ds:rounded-[var(--radius-lg)]",
12
12
  "ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]",
13
13
  "ds:shadow-[var(--shadow-card)]",
14
+ "ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2",
14
15
  "ds:p-[var(--spacing-md)]"
15
16
  ].join(" "),
16
17
  {
@@ -55,9 +56,9 @@ const L = W(
55
56
  ariaLabel: A,
56
57
  emptyState: m,
57
58
  className: w,
58
- ...x
59
- }, k) => {
60
- const { t: e } = q(), i = N(), b = N(), c = t !== void 0 && r.length > t, [o, B] = O(z), g = y(null), S = y(r.length);
59
+ ...b
60
+ }, x) => {
61
+ const { t: e } = q(), c = N(), k = N(), i = t !== void 0 && r.length > t, [o, B] = O(z), g = y(null), S = y(r.length);
61
62
  V(() => {
62
63
  if (!g.current) return;
63
64
  const n = S.current, s = r.length;
@@ -66,7 +67,7 @@ const L = W(
66
67
  defaultValue: "{{count}} warnings to review"
67
68
  })), S.current = s;
68
69
  }, [r.length, e]);
69
- const R = _(() => !c || !o ? r : r.slice(0, t), [r, c, o, t]), E = c ? r.length - (t ?? 0) : 0, I = j(
70
+ const R = _(() => !i || !o ? r : r.slice(0, t), [r, i, o, t]), E = i ? r.length - (t ?? 0) : 0, I = j(
70
71
  (n) => (s) => {
71
72
  s || d == null || d(n);
72
73
  },
@@ -75,21 +76,21 @@ const L = W(
75
76
  /* @__PURE__ */ a(
76
77
  "h2",
77
78
  {
78
- id: i,
79
+ id: c,
79
80
  className: "ds:text-start type-title-section ds:text-[var(--foreground)]",
80
81
  children: h
81
82
  }
82
83
  ),
83
84
  p ? /* @__PURE__ */ a("p", { className: "ds:text-start type-body-sm ds:text-[var(--muted-foreground)]", children: p }) : null
84
- ] }) : /* @__PURE__ */ a("h2", { id: i, className: "ds:sr-only", children: G });
85
+ ] }) : /* @__PURE__ */ a("h2", { id: c, className: "ds:sr-only", children: G });
85
86
  return r.length === 0 ? m ? /* @__PURE__ */ l(
86
87
  "section",
87
88
  {
88
- ref: k,
89
- "aria-labelledby": i,
89
+ ref: x,
90
+ "aria-labelledby": c,
90
91
  "data-component": "warning-stack",
91
92
  className: [L({ size: f, stretch: v }), w].filter(Boolean).join(" "),
92
- ...x,
93
+ ...b,
93
94
  children: [
94
95
  C,
95
96
  m
@@ -98,11 +99,11 @@ const L = W(
98
99
  ) : null : /* @__PURE__ */ l(
99
100
  "section",
100
101
  {
101
- ref: k,
102
- "aria-labelledby": i,
102
+ ref: x,
103
+ "aria-labelledby": c,
103
104
  "data-component": "warning-stack",
104
105
  className: [L({ size: f, stretch: v }), w].filter(Boolean).join(" "),
105
- ...x,
106
+ ...b,
106
107
  children: [
107
108
  C,
108
109
  /* @__PURE__ */ a(
@@ -117,7 +118,7 @@ const L = W(
117
118
  /* @__PURE__ */ a(
118
119
  "ul",
119
120
  {
120
- id: b,
121
+ id: k,
121
122
  className: J({ size: f }),
122
123
  "aria-label": e("warningStack.listLabel", "Warning list"),
123
124
  children: R.map((n) => {
@@ -139,14 +140,14 @@ const L = W(
139
140
  })
140
141
  }
141
142
  ),
142
- c ? /* @__PURE__ */ l(
143
+ i ? /* @__PURE__ */ l(
143
144
  F,
144
145
  {
145
146
  type: "button",
146
147
  intent: "link",
147
148
  size: "sm",
148
149
  "aria-expanded": !o,
149
- "aria-controls": b,
150
+ "aria-controls": k,
150
151
  onClick: T,
151
152
  className: K,
152
153
  children: [
@@ -176,4 +177,4 @@ P.displayName = "WarningStack";
176
177
  export {
177
178
  P as W
178
179
  };
179
- //# sourceMappingURL=warning-stack-bDicCvxs.js.map
180
+ //# sourceMappingURL=warning-stack-DNR3-IbP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warning-stack-DNR3-IbP.js","sources":["../../src/components/warning-stack/warning-stack.tsx"],"sourcesContent":["import {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { useTranslation } from 'react-i18next';\nimport { ChevronDown } from 'lucide-react';\nimport { Alert, type AlertProps } from '../alert/alert';\nimport { Button } from '../button/button';\n\n/* ------------------------------------------------------------------ */\n/* Types */\n/* ------------------------------------------------------------------ */\n\nexport interface WarningStackItem {\n id: string;\n variant?: AlertProps['variant'];\n title: ReactNode;\n description?: ReactNode;\n icon?: ReactNode;\n actions?: ReactNode;\n dismissible?: boolean;\n}\n\nconst stackVariants = cva(\n [\n 'ds:flex ds:flex-col',\n 'ds:rounded-[var(--radius-lg)]',\n 'ds:bg-[color:var(--card)] ds:text-[color:var(--card-foreground)]',\n 'ds:shadow-[var(--shadow-card)]',\n 'ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2',\n 'ds:p-[var(--spacing-md)]',\n ].join(' '),\n {\n variants: {\n size: {\n sm: 'ds:gap-[var(--spacing-sm)]',\n md: 'ds:gap-[var(--spacing-md)]',\n },\n // `stretch: true` fills the parent layout cell — mirrors the `stretch`\n // prop on `Card` so a WarningStack rendered next to a Card in a grid\n // row ends up at matching height.\n stretch: {\n true: 'ds:h-full ds:self-stretch',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n stretch: false,\n },\n },\n);\n\nconst listVariants = cva('ds:flex ds:flex-col', {\n variants: {\n size: {\n sm: 'ds:gap-[var(--spacing-sm)]',\n md: 'ds:gap-[var(--spacing-md)]',\n },\n },\n defaultVariants: { size: 'md' },\n});\n\nconst TOGGLE_CLASSES = [\n 'ds:inline-flex ds:items-center ds:gap-[var(--spacing-xs)] ds:self-start',\n].join(' ');\n\nexport interface WarningStackProps\n extends\n Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'role' | 'title'>,\n VariantProps<typeof stackVariants> {\n /** Items rendered inside the stack. */\n items: WarningStackItem[];\n /** Fill the parent layout cell — use in a dashboard grid row so the\n * stack ends up with matching height to sibling Cards. */\n stretch?: boolean;\n /** Visible title rendered as an `<h2>` above the stack. Also labels the\n * region for assistive tech. When omitted, the region is labelled via a\n * visually hidden heading using `ariaLabel` (or the default \"Warnings\"). */\n title?: ReactNode;\n /** Optional short description rendered under the title. */\n description?: ReactNode;\n /** Cap on visible items before a \"Show N more\" toggle appears. */\n maxVisible?: number;\n /** Whether the stack starts collapsed when items exceed `maxVisible`. */\n defaultCollapsed?: boolean;\n /** Fires when a dismissible item's close control is activated. */\n onDismiss?: (item: WarningStackItem) => void;\n /** Accessible label for the region when `title` is not set. */\n ariaLabel?: string;\n /** Optional node rendered when the stack has zero items. */\n emptyState?: ReactNode;\n}\n\n/* ------------------------------------------------------------------ */\n/* Root */\n/* ------------------------------------------------------------------ */\n\nexport const WarningStack = forwardRef<HTMLDivElement, WarningStackProps>(\n (\n {\n items,\n title,\n description,\n maxVisible,\n defaultCollapsed = true,\n onDismiss,\n size = 'md',\n stretch = false,\n ariaLabel,\n emptyState,\n className,\n ...rest\n },\n ref,\n ) => {\n const { t } = useTranslation();\n const labelId = useId();\n const listId = useId();\n\n const overflow = maxVisible !== undefined && items.length > maxVisible;\n const [collapsed, setCollapsed] = useState(defaultCollapsed);\n\n // Live-region announces the count when items change.\n const liveRef = useRef<HTMLDivElement>(null);\n const lastCountRef = useRef<number>(items.length);\n\n useEffect(() => {\n if (!liveRef.current) return;\n const prev = lastCountRef.current;\n const next = items.length;\n if (prev !== next) {\n liveRef.current.textContent = t('warningStack.countChanged', {\n count: next,\n defaultValue: '{{count}} warnings to review',\n });\n }\n lastCountRef.current = next;\n }, [items.length, t]);\n\n const visible = useMemo(() => {\n if (!overflow || !collapsed) return items;\n return items.slice(0, maxVisible);\n }, [items, overflow, collapsed, maxVisible]);\n\n const hiddenCount = overflow ? items.length - (maxVisible ?? 0) : 0;\n\n const handleDismiss = useCallback(\n (item: WarningStackItem) => (open: boolean) => {\n if (!open) onDismiss?.(item);\n },\n [onDismiss],\n );\n\n const toggle = useCallback(() => setCollapsed((c) => !c), []);\n\n const regionLabel = ariaLabel ?? t('warningStack.regionLabel', 'Warnings');\n\n // Title block: a visible header when `title` is provided; otherwise a\n // visually hidden heading so the region still has a programmatic name.\n // A `<div>` rather than `<header>` wrapper keeps the `<header>` element's\n // implicit banner role from leaking out of the region.\n const header = title ? (\n <div className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-3xs)]\">\n <h2\n id={labelId}\n className=\"ds:text-start type-title-section ds:text-[var(--foreground)]\"\n >\n {title}\n </h2>\n {description ? (\n <p className=\"ds:text-start type-body-sm ds:text-[var(--muted-foreground)]\">\n {description}\n </p>\n ) : null}\n </div>\n ) : (\n <h2 id={labelId} className=\"ds:sr-only\">\n {regionLabel}\n </h2>\n );\n\n if (items.length === 0) {\n if (!emptyState) return null;\n return (\n <section\n ref={ref}\n aria-labelledby={labelId}\n data-component=\"warning-stack\"\n className={[stackVariants({ size, stretch }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {header}\n {emptyState}\n </section>\n );\n }\n\n return (\n <section\n ref={ref}\n aria-labelledby={labelId}\n data-component=\"warning-stack\"\n className={[stackVariants({ size, stretch }), className]\n .filter(Boolean)\n .join(' ')}\n {...rest}\n >\n {header}\n <div\n ref={liveRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"ds:sr-only\"\n />\n <ul\n id={listId}\n className={listVariants({ size })}\n aria-label={t('warningStack.listLabel', 'Warning list')}\n >\n {visible.map((item) => {\n const variant = item.variant ?? 'warning';\n return (\n <li key={item.id}>\n <Alert\n variant={variant}\n dismissible={item.dismissible}\n icon={item.icon}\n onOpenChange={handleDismiss(item)}\n >\n {/* `as=\"h3\"` keeps a clean heading ladder — the stack's\n h2 labels the region, then each item's h3 rises from it. */}\n <Alert.Title as=\"h3\">{item.title}</Alert.Title>\n {item.description ? (\n <Alert.Description>{item.description}</Alert.Description>\n ) : null}\n {item.actions ? (\n <Alert.Action>{item.actions}</Alert.Action>\n ) : null}\n </Alert>\n </li>\n );\n })}\n </ul>\n\n {overflow ? (\n <Button\n type=\"button\"\n intent=\"link\"\n size=\"sm\"\n aria-expanded={!collapsed}\n aria-controls={listId}\n onClick={toggle}\n className={TOGGLE_CLASSES}\n >\n <ChevronDown\n aria-hidden=\"true\"\n className={[\n 'ds:size-4 ds:transition-transform ds:duration-[var(--animation-duration)] ds:motion-reduce:transition-none',\n collapsed ? '' : 'ds:rotate-180',\n ].join(' ')}\n />\n {collapsed\n ? t('warningStack.showMore', {\n count: hiddenCount,\n defaultValue: 'Show {{count}} more warnings',\n })\n : t('warningStack.showLess', 'Show less')}\n </Button>\n ) : null}\n </section>\n );\n },\n);\n\nWarningStack.displayName = 'WarningStack';\n"],"names":["stackVariants","cva","listVariants","TOGGLE_CLASSES","WarningStack","forwardRef","items","title","description","maxVisible","defaultCollapsed","onDismiss","size","stretch","ariaLabel","emptyState","className","rest","ref","t","useTranslation","labelId","useId","listId","overflow","collapsed","setCollapsed","useState","liveRef","useRef","lastCountRef","useEffect","prev","next","visible","useMemo","hiddenCount","handleDismiss","useCallback","item","open","toggle","c","regionLabel","header","jsxs","jsx","variant","Alert","Button","ChevronDown"],"mappings":"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"}
@@ -1077,7 +1077,8 @@ const lt = {
1077
1077
  "ds:relative ds:flex ds:items-center",
1078
1078
  "ds:gap-[var(--spacing-sm)]",
1079
1079
  "ds:rounded-[var(--radius-md)]",
1080
- "ds:border ds:border-[color:var(--border)]",
1080
+ // Flat-hairline: 1px card-border, no shadow; accessible theme bumps to 2px.
1081
+ "ds:border ds:border-[color:var(--card-border)] ds:[.theme-accessible_&]:border-2",
1081
1082
  "ds:bg-[var(--card)] ds:text-[var(--card-foreground)]",
1082
1083
  // Motion honours the accessible theme (--animation-duration → 0ms).
1083
1084
  "ds:transition-[box-shadow,transform,opacity] ds:duration-[var(--animation-duration)]",
@@ -1398,4 +1399,4 @@ export {
1398
1399
  ee as r,
1399
1400
  D as w
1400
1401
  };
1401
- //# sourceMappingURL=workflow-map-uSiHbOWQ.js.map
1402
+ //# sourceMappingURL=workflow-map-C3gB0FvB.js.map