@ds-mo/ui 13.13.0 → 13.15.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 (339) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +71 -21
  3. package/dist/agent.json +291 -74
  4. package/dist/angular/ds-agent-questionnaire.d.ts +19 -0
  5. package/dist/angular/ds-agent-questionnaire.js +46 -0
  6. package/dist/angular/ds-agent-response.d.ts +1 -1
  7. package/dist/angular/ds-agent-response.js +3 -3
  8. package/dist/angular/ds-agent-source-list.d.ts +9 -2
  9. package/dist/angular/ds-agent-source-list.js +7 -3
  10. package/dist/angular/ds-agent-tool-call.d.ts +9 -2
  11. package/dist/angular/ds-agent-tool-call.js +9 -5
  12. package/dist/angular/ds-button-filled.d.ts +1 -1
  13. package/dist/angular/ds-button-filled.js +3 -3
  14. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  15. package/dist/angular/ds-button-unfilled.js +3 -3
  16. package/dist/angular/ds-checkbox.d.ts +1 -1
  17. package/dist/angular/ds-checkbox.js +3 -3
  18. package/dist/angular/ds-message-composer.d.ts +1 -1
  19. package/dist/angular/ds-message-composer.js +3 -3
  20. package/dist/angular/ds-radio.js +2 -1
  21. package/dist/angular/ds-table.d.ts +4 -1
  22. package/dist/angular/ds-table.js +7 -4
  23. package/dist/angular/ds-tag.d.ts +1 -1
  24. package/dist/angular/ds-tag.js +3 -3
  25. package/dist/angular/index.d.ts +1 -1
  26. package/dist/angular/index.js +1 -0
  27. package/dist/angular/proxies.d.ts +1 -0
  28. package/dist/angular/proxies.js +1 -0
  29. package/dist/components/ds-agent-activity.js +1 -1
  30. package/dist/components/ds-agent-questionnaire.d.ts +24 -0
  31. package/dist/components/ds-agent-questionnaire.js +2 -0
  32. package/dist/components/ds-agent-questionnaire.js.map +1 -0
  33. package/dist/components/ds-agent-response.js +1 -1
  34. package/dist/components/ds-agent-response.js.map +1 -1
  35. package/dist/components/ds-agent-source-list.js +1 -1
  36. package/dist/components/ds-agent-tool-call.js +1 -1
  37. package/dist/components/ds-attachment-list.js +1 -1
  38. package/dist/components/ds-avatar.js +1 -1
  39. package/dist/components/ds-badge.js +1 -1
  40. package/dist/components/ds-banner.js +1 -1
  41. package/dist/components/ds-bar-nav.js +1 -1
  42. package/dist/components/ds-bar-title.js +1 -1
  43. package/dist/components/ds-bar-workflow.js +1 -1
  44. package/dist/components/ds-breadcrumb.js +1 -1
  45. package/dist/components/ds-button-filled.js +1 -1
  46. package/dist/components/ds-button-unfilled.js +1 -1
  47. package/dist/components/ds-card-chart.js +1 -1
  48. package/dist/components/ds-card-overview.js +1 -1
  49. package/dist/components/ds-card-overview.js.map +1 -1
  50. package/dist/components/ds-card-setting.js +1 -1
  51. package/dist/components/ds-chart-legend.js +1 -1
  52. package/dist/components/ds-chart-legend.js.map +1 -1
  53. package/dist/components/ds-chart.js +1 -1
  54. package/dist/components/ds-chart.js.map +1 -1
  55. package/dist/components/ds-checkbox.js +1 -1
  56. package/dist/components/ds-chip.js +1 -1
  57. package/dist/components/ds-chip.js.map +1 -1
  58. package/dist/components/ds-code-block.js +1 -1
  59. package/dist/components/ds-conversation-list-item.js +1 -1
  60. package/dist/components/ds-conversation-list-item.js.map +1 -1
  61. package/dist/components/ds-conversation-list-section.js +1 -1
  62. package/dist/components/ds-conversation-list.js +1 -1
  63. package/dist/components/ds-divider.js +1 -1
  64. package/dist/components/ds-empty-state.js +1 -1
  65. package/dist/components/ds-field.js +1 -1
  66. package/dist/components/ds-icon.js +1 -1
  67. package/dist/components/ds-input.js +1 -1
  68. package/dist/components/ds-input.js.map +1 -1
  69. package/dist/components/ds-markdown.js +1 -1
  70. package/dist/components/ds-menu.js +1 -1
  71. package/dist/components/ds-message-actions.js +1 -1
  72. package/dist/components/ds-message-bubble.js +1 -1
  73. package/dist/components/ds-message-bubble.js.map +1 -1
  74. package/dist/components/ds-message-composer.js +1 -1
  75. package/dist/components/ds-message-composer.js.map +1 -1
  76. package/dist/components/ds-message-scroller.js +1 -1
  77. package/dist/components/ds-message-scroller.js.map +1 -1
  78. package/dist/components/ds-message.js +1 -1
  79. package/dist/components/ds-mobile-bar-nav.js +1 -1
  80. package/dist/components/ds-mobile-header.js +1 -1
  81. package/dist/components/ds-mobile-section-switcher.js +1 -1
  82. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  83. package/dist/components/ds-modal.js +1 -1
  84. package/dist/components/ds-panel-nav.js +1 -1
  85. package/dist/components/ds-panel-sub-nav.js +1 -1
  86. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  87. package/dist/components/ds-panel-tool-header.js +1 -1
  88. package/dist/components/ds-panel-tool-search.js +1 -1
  89. package/dist/components/ds-panel-tools.js +1 -1
  90. package/dist/components/ds-radio.js +1 -1
  91. package/dist/components/ds-radio.js.map +1 -1
  92. package/dist/components/ds-scroll-overlay.js +1 -1
  93. package/dist/components/ds-select.js +1 -1
  94. package/dist/components/ds-select.js.map +1 -1
  95. package/dist/components/ds-shell-app.js +1 -1
  96. package/dist/components/ds-shell-app.js.map +1 -1
  97. package/dist/components/ds-shell-page.js +1 -1
  98. package/dist/components/ds-shell-tools.js +1 -1
  99. package/dist/components/ds-skeleton.js +1 -1
  100. package/dist/components/ds-slider.js +1 -1
  101. package/dist/components/ds-slider.js.map +1 -1
  102. package/dist/components/ds-swatch-picker.js +1 -1
  103. package/dist/components/ds-switch.js +1 -1
  104. package/dist/components/ds-tab-group.js +1 -1
  105. package/dist/components/ds-table.js +1 -1
  106. package/dist/components/ds-table.js.map +1 -1
  107. package/dist/components/ds-tag.js +1 -1
  108. package/dist/components/ds-text.js +1 -1
  109. package/dist/components/ds-toast.js +1 -1
  110. package/dist/components/ds-tooltip-chart.js +1 -1
  111. package/dist/components/ds-tooltip.js +1 -1
  112. package/dist/components/ds-typing-indicator.js +1 -1
  113. package/dist/components/index.d.ts +10 -0
  114. package/dist/components/{p-PQgDzzn9.js → p-00or0yGw.js} +2 -2
  115. package/dist/components/p-B2SoinWf.js +2 -0
  116. package/dist/components/p-B2SoinWf.js.map +1 -0
  117. package/dist/components/{p-DGkWMhHO.js → p-B69Re7HW.js} +2 -2
  118. package/dist/components/p-BH_lVRgp.js +2 -0
  119. package/dist/components/{p-CCYgBUUS.js.map → p-BH_lVRgp.js.map} +1 -1
  120. package/dist/components/p-BLaqjUWu.js +2 -0
  121. package/dist/components/{p-Cw1bbiCG.js.map → p-BLaqjUWu.js.map} +1 -1
  122. package/dist/components/{p-B6z51yBf.js → p-BNkU9dcc.js} +2 -2
  123. package/dist/components/{p-DBchq8Zw.js → p-BRze4tRe.js} +2 -2
  124. package/dist/components/p-BtUgncSJ.js +2 -0
  125. package/dist/components/p-BtUgncSJ.js.map +1 -0
  126. package/dist/components/p-C891ueIx.js +2 -0
  127. package/dist/components/p-C891ueIx.js.map +1 -0
  128. package/dist/components/p-C8U5BsJf.js +2 -0
  129. package/dist/components/p-C8U5BsJf.js.map +1 -0
  130. package/dist/components/p-CCkptWPj.js +2 -0
  131. package/dist/components/p-CCkptWPj.js.map +1 -0
  132. package/dist/components/p-CKo3OFG1.js +2 -0
  133. package/dist/components/p-CKo3OFG1.js.map +1 -0
  134. package/dist/components/p-CXduurfd.js.map +1 -1
  135. package/dist/components/{p-DLwM1RNL.js → p-CdKz-QT2.js} +2 -2
  136. package/dist/components/p-CdKz-QT2.js.map +1 -0
  137. package/dist/components/p-CekGwihQ.js +2 -0
  138. package/dist/components/{p-CSlTJWFG.js.map → p-CekGwihQ.js.map} +1 -1
  139. package/dist/components/p-ClHpIZg0.js +2 -0
  140. package/dist/components/p-ClHpIZg0.js.map +1 -0
  141. package/dist/components/p-CnUq7E8S.js +2 -0
  142. package/dist/components/p-CnUq7E8S.js.map +1 -0
  143. package/dist/components/{p-C9StMCWg.js → p-Cohb8T7G.js} +2 -2
  144. package/dist/components/p-CqDJRVT8.js +2 -0
  145. package/dist/components/p-CqDJRVT8.js.map +1 -0
  146. package/dist/components/p-CsXC1cHI.js +2 -0
  147. package/dist/components/{p-DGvzGGcu.js.map → p-CsXC1cHI.js.map} +1 -1
  148. package/dist/components/p-CuwopElg.js.map +1 -1
  149. package/dist/components/p-D4j0deyd.js +2 -0
  150. package/dist/components/{p-CzV4gIxd.js.map → p-D4j0deyd.js.map} +1 -1
  151. package/dist/components/p-D5aUkdTw.js +2 -0
  152. package/dist/components/p-D5aUkdTw.js.map +1 -0
  153. package/dist/components/p-DQXzTV8N.js +2 -0
  154. package/dist/components/p-DQXzTV8N.js.map +1 -0
  155. package/dist/components/p-DStd98dM.js +2 -0
  156. package/dist/components/p-DStd98dM.js.map +1 -0
  157. package/dist/components/p-DWNhyLp2.js +2 -0
  158. package/dist/components/{p-B1JB0Zn-.js.map → p-DWNhyLp2.js.map} +1 -1
  159. package/dist/components/p-DWjE0VNn.js +2 -0
  160. package/dist/components/p-DWjE0VNn.js.map +1 -0
  161. package/dist/components/{p-BFMV9TJO.js → p-DgIRyJoc.js} +2 -2
  162. package/dist/components/{p-BNiIyZCn.js → p-Dhx_3_tf.js} +2 -2
  163. package/dist/components/p-Dhx_3_tf.js.map +1 -0
  164. package/dist/components/{p-CE82aQZr.js → p-DyVAWGL9.js} +2 -2
  165. package/dist/components/p-GSnB-sa7.js +2 -0
  166. package/dist/components/p-GSnB-sa7.js.map +1 -0
  167. package/dist/components/p-GWUTrIlk.js +2 -0
  168. package/dist/components/p-GWUTrIlk.js.map +1 -0
  169. package/dist/components/p-IhToA4m4.js +2 -0
  170. package/dist/components/{p-cPh32CFB.js.map → p-IhToA4m4.js.map} +1 -1
  171. package/dist/components/p-NQOI5gN1.js +2 -0
  172. package/dist/components/p-NQOI5gN1.js.map +1 -0
  173. package/dist/components/p-QDcUAz9m.js +2 -0
  174. package/dist/components/{p-BNHPCCw8.js.map → p-QDcUAz9m.js.map} +1 -1
  175. package/dist/components/p-Qf-os3lG.js +2 -0
  176. package/dist/components/p-Qf-os3lG.js.map +1 -0
  177. package/dist/components/{p-DBJJiSP0.js → p-chA2WA5x.js} +2 -2
  178. package/dist/components/{p-DwKC_9u2.js → p-dEouiXJ8.js} +2 -2
  179. package/dist/components/{p-BAGTb6cZ.js → p-fKwbYrhi.js} +2 -2
  180. package/dist/docs/components.json +942 -20
  181. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +4 -0
  182. package/dist/lib/utils/control-text.d.ts +2 -0
  183. package/dist/lib/utils/index.d.ts +1 -1
  184. package/dist/lib/utils/index.js.map +2 -2
  185. package/dist/mcp-data/registry/agent-activity.json +2 -2
  186. package/dist/mcp-data/registry/agent-questionnaire.json +273 -0
  187. package/dist/mcp-data/registry/agent-response.json +33 -12
  188. package/dist/mcp-data/registry/agent-source-list.json +34 -14
  189. package/dist/mcp-data/registry/agent-tool-call.json +60 -19
  190. package/dist/mcp-data/registry/attachment-list.json +2 -2
  191. package/dist/mcp-data/registry/avatar.json +2 -2
  192. package/dist/mcp-data/registry/badge.json +2 -2
  193. package/dist/mcp-data/registry/banner.json +2 -2
  194. package/dist/mcp-data/registry/bar-nav.json +3 -3
  195. package/dist/mcp-data/registry/bar-title.json +3 -3
  196. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  197. package/dist/mcp-data/registry/breadcrumb.json +3 -3
  198. package/dist/mcp-data/registry/button-filled.json +22 -4
  199. package/dist/mcp-data/registry/button-unfilled.json +28 -8
  200. package/dist/mcp-data/registry/card-chart.json +2 -2
  201. package/dist/mcp-data/registry/card-overview.json +2 -2
  202. package/dist/mcp-data/registry/card-setting.json +2 -2
  203. package/dist/mcp-data/registry/chart-legend.json +3 -3
  204. package/dist/mcp-data/registry/chart.json +3 -3
  205. package/dist/mcp-data/registry/checkbox.json +27 -10
  206. package/dist/mcp-data/registry/chip.json +3 -3
  207. package/dist/mcp-data/registry/code-block.json +15 -7
  208. package/dist/mcp-data/registry/conversation-list-item.json +3 -3
  209. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  210. package/dist/mcp-data/registry/conversation-list.json +2 -2
  211. package/dist/mcp-data/registry/divider.json +2 -2
  212. package/dist/mcp-data/registry/empty-state.json +2 -2
  213. package/dist/mcp-data/registry/field.json +2 -2
  214. package/dist/mcp-data/registry/icon.json +3 -3
  215. package/dist/mcp-data/registry/input.json +2 -2
  216. package/dist/mcp-data/registry/loader.json +2 -2
  217. package/dist/mcp-data/registry/markdown.json +2 -2
  218. package/dist/mcp-data/registry/menu.json +3 -3
  219. package/dist/mcp-data/registry/message-actions.json +2 -2
  220. package/dist/mcp-data/registry/message-bubble.json +3 -3
  221. package/dist/mcp-data/registry/message-composer.json +31 -9
  222. package/dist/mcp-data/registry/message-scroller.json +18 -10
  223. package/dist/mcp-data/registry/message.json +2 -2
  224. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  225. package/dist/mcp-data/registry/mobile-header.json +2 -2
  226. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  227. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  228. package/dist/mcp-data/registry/modal.json +2 -2
  229. package/dist/mcp-data/registry/panel-nav.json +3 -3
  230. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  231. package/dist/mcp-data/registry/panel-tool-header.json +2 -2
  232. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  233. package/dist/mcp-data/registry/panel-tools.json +3 -3
  234. package/dist/mcp-data/registry/radio.json +25 -12
  235. package/dist/mcp-data/registry/registry.json +295 -75
  236. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  237. package/dist/mcp-data/registry/select.json +3 -3
  238. package/dist/mcp-data/registry/shell-app.json +3 -3
  239. package/dist/mcp-data/registry/shell-page.json +2 -2
  240. package/dist/mcp-data/registry/shell-tools.json +2 -2
  241. package/dist/mcp-data/registry/skeleton.json +2 -2
  242. package/dist/mcp-data/registry/slider.json +3 -3
  243. package/dist/mcp-data/registry/swatch-picker.json +3 -3
  244. package/dist/mcp-data/registry/switch.json +3 -3
  245. package/dist/mcp-data/registry/tab-group.json +2 -2
  246. package/dist/mcp-data/registry/table.json +122 -21
  247. package/dist/mcp-data/registry/tag.json +24 -6
  248. package/dist/mcp-data/registry/text.json +3 -3
  249. package/dist/mcp-data/registry/toast.json +2 -2
  250. package/dist/mcp-data/registry/tooltip-chart.json +6 -4
  251. package/dist/mcp-data/registry/tooltip.json +2 -2
  252. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  253. package/dist/react/components.d.ts +1 -0
  254. package/dist/react/components.js +1 -0
  255. package/dist/react/ds-agent-questionnaire.d.ts +13 -0
  256. package/dist/react/ds-agent-questionnaire.js +15 -0
  257. package/dist/react/ds-agent-source-list.d.ts +7 -2
  258. package/dist/react/ds-agent-source-list.js +1 -1
  259. package/dist/react/ds-agent-tool-call.d.ts +7 -2
  260. package/dist/react/ds-agent-tool-call.js +1 -1
  261. package/dist/react/ds-table.d.ts +2 -1
  262. package/dist/react/ds-table.js +1 -0
  263. package/dist/styles/prose.css +21 -4
  264. package/dist/styles/table.css +244 -26
  265. package/dist/types/components/AgentQuestionnaire/AgentQuestionnaire.d.ts +49 -0
  266. package/dist/types/components/AgentQuestionnaire/agent-questionnaire-model.d.ts +13 -0
  267. package/dist/types/components/AgentResponse/AgentResponse.d.ts +3 -1
  268. package/dist/types/components/AgentSourceList/AgentSourceList.d.ts +5 -0
  269. package/dist/types/components/AgentToolCall/AgentToolCall.d.ts +21 -0
  270. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +4 -0
  271. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +11 -1
  272. package/dist/types/components/Checkbox/Checkbox.d.ts +3 -0
  273. package/dist/types/components/MessageComposer/MessageComposer.d.ts +3 -0
  274. package/dist/types/components/MessageScroller/MessageScroller.d.ts +21 -1
  275. package/dist/types/components/Radio/Radio.d.ts +4 -0
  276. package/dist/types/components/Table/Table.d.ts +31 -23
  277. package/dist/types/components/Table/index.d.ts +1 -1
  278. package/dist/types/components/Table/table-cell-model.d.ts +44 -0
  279. package/dist/types/components/Table/table-layout-controller.d.ts +65 -0
  280. package/dist/types/components/Table/table-load-controller.d.ts +49 -0
  281. package/dist/types/components/Table/table-model.d.ts +25 -0
  282. package/dist/types/components/Table/table-render-model.d.ts +41 -0
  283. package/dist/types/components/Table/table-types.d.ts +23 -2
  284. package/dist/types/components/Tag/Tag.d.ts +3 -0
  285. package/dist/types/components/conversation-types.d.ts +51 -2
  286. package/dist/types/components.d.ts +231 -10
  287. package/dist/types/utils/control-text.d.ts +2 -0
  288. package/dist/types/utils/index.d.ts +1 -1
  289. package/package.json +7 -5
  290. package/dist/components/p-B1JB0Zn-.js +0 -2
  291. package/dist/components/p-B2t8alvH.js +0 -2
  292. package/dist/components/p-B2t8alvH.js.map +0 -1
  293. package/dist/components/p-BEEYhbIb.js +0 -2
  294. package/dist/components/p-BEEYhbIb.js.map +0 -1
  295. package/dist/components/p-BNHPCCw8.js +0 -2
  296. package/dist/components/p-BNiIyZCn.js.map +0 -1
  297. package/dist/components/p-BUZLhvs1.js +0 -2
  298. package/dist/components/p-BUZLhvs1.js.map +0 -1
  299. package/dist/components/p-BgaF83uh.js +0 -2
  300. package/dist/components/p-BgaF83uh.js.map +0 -1
  301. package/dist/components/p-Br0fwWUG.js +0 -2
  302. package/dist/components/p-Br0fwWUG.js.map +0 -1
  303. package/dist/components/p-BydCwx7x.js +0 -2
  304. package/dist/components/p-BydCwx7x.js.map +0 -1
  305. package/dist/components/p-C3Z01Glr.js +0 -2
  306. package/dist/components/p-C3Z01Glr.js.map +0 -1
  307. package/dist/components/p-CCYgBUUS.js +0 -2
  308. package/dist/components/p-CSlTJWFG.js +0 -2
  309. package/dist/components/p-CdFnvBem.js +0 -2
  310. package/dist/components/p-CdFnvBem.js.map +0 -1
  311. package/dist/components/p-Ch5yT3UA.js +0 -2
  312. package/dist/components/p-Ch5yT3UA.js.map +0 -1
  313. package/dist/components/p-Cw1bbiCG.js +0 -2
  314. package/dist/components/p-CzV4gIxd.js +0 -2
  315. package/dist/components/p-D-F8eyXy.js +0 -2
  316. package/dist/components/p-D-F8eyXy.js.map +0 -1
  317. package/dist/components/p-D6g070eY.js +0 -2
  318. package/dist/components/p-D6g070eY.js.map +0 -1
  319. package/dist/components/p-DGvzGGcu.js +0 -2
  320. package/dist/components/p-DLwM1RNL.js.map +0 -1
  321. package/dist/components/p-DmblUQ4D.js +0 -2
  322. package/dist/components/p-DmblUQ4D.js.map +0 -1
  323. package/dist/components/p-Doz2uwRv.js +0 -2
  324. package/dist/components/p-Doz2uwRv.js.map +0 -1
  325. package/dist/components/p-DumWT7NN.js +0 -2
  326. package/dist/components/p-DumWT7NN.js.map +0 -1
  327. package/dist/components/p-bLCbOPYa.js +0 -2
  328. package/dist/components/p-bLCbOPYa.js.map +0 -1
  329. package/dist/components/p-cPh32CFB.js +0 -2
  330. /package/dist/components/{p-PQgDzzn9.js.map → p-00or0yGw.js.map} +0 -0
  331. /package/dist/components/{p-DGkWMhHO.js.map → p-B69Re7HW.js.map} +0 -0
  332. /package/dist/components/{p-B6z51yBf.js.map → p-BNkU9dcc.js.map} +0 -0
  333. /package/dist/components/{p-DBchq8Zw.js.map → p-BRze4tRe.js.map} +0 -0
  334. /package/dist/components/{p-C9StMCWg.js.map → p-Cohb8T7G.js.map} +0 -0
  335. /package/dist/components/{p-BFMV9TJO.js.map → p-DgIRyJoc.js.map} +0 -0
  336. /package/dist/components/{p-CE82aQZr.js.map → p-DyVAWGL9.js.map} +0 -0
  337. /package/dist/components/{p-DBJJiSP0.js.map → p-chA2WA5x.js.map} +0 -0
  338. /package/dist/components/{p-DwKC_9u2.js.map → p-dEouiXJ8.js.map} +0 -0
  339. /package/dist/components/{p-BAGTb6cZ.js.map → p-fKwbYrhi.js.map} +0 -0
package/dist/agent.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "13.13.0",
4
+ "packageVersion": "13.15.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -80,19 +80,138 @@
80
80
  "text"
81
81
  ]
82
82
  },
83
+ {
84
+ "id": "component:ds-agent-questionnaire",
85
+ "tag": "ds-agent-questionnaire",
86
+ "name": "agent-questionnaire",
87
+ "title": "AgentQuestionnaire",
88
+ "summary": "Temporary multi-step work surface for provider-neutral agent clarification questions and durable read-only answer records.",
89
+ "intentStatus": "complete",
90
+ "intent": {
91
+ "audience": "specialized",
92
+ "status": "experimental",
93
+ "summary": "Temporary multi-step work surface for provider-neutral agent clarification questions and durable read-only answer records.",
94
+ "useWhen": [
95
+ "An agent turn pauses for one or more structured single-choice, multiple-choice, or free-text answers."
96
+ ],
97
+ "avoidWhen": [
98
+ "The interaction is a conventional application form, a tool authorization policy, or an application-owned approval with consequences beyond collecting answers."
99
+ ],
100
+ "commonlyComposedWith": [
101
+ "component:ds-message-scroller",
102
+ "component:ds-message-composer",
103
+ "component:ds-agent-response",
104
+ "component:ds-radio",
105
+ "component:ds-checkbox",
106
+ "component:ds-button-filled",
107
+ "component:ds-button-unfilled"
108
+ ],
109
+ "patterns": [
110
+ "pattern:agent-chat"
111
+ ],
112
+ "accessibility": [
113
+ "Radio and checkbox primitives own choice semantics, target density, keyboard interaction, and selected or disabled presentation; progress, validation relationships, static answered summaries, and every action remain available without relying on color or visual position.",
114
+ "The component never takes focus when it mounts; the application calls setFocus only when shifting focus is appropriate.",
115
+ "Choice rows use large Radio and Checkbox targets, while every navigation action uses a small Button primitive and Cancel is an icon-only Cross with localized tooltip and accessible name.",
116
+ "Selection primitives preserve focus, selected, invalid, and disabled distinctions in forced colors."
117
+ ],
118
+ "states": [
119
+ "The component owns only the current step, validation, and unsaved in-progress draft; the application owns the request, submission, transport, resume operation, persistence, and transcript replacement.",
120
+ "Preparing communicates that questions are being assembled, submitting locks editing without clearing the draft, error retains it with application feedback, and answered is a quiet noninteractive record.",
121
+ "A changed request identifier resets to the first question and seeds a fresh local draft from the supplied answers.",
122
+ "Questionnaire selection primitives are isolated from ancestor forms; only dsAnswer emits the normalized ordered answer collection."
123
+ ],
124
+ "responsiveBehavior": [
125
+ "Descriptive choices remain full-row targets, while actions collapse into a single-column layout at narrow widths."
126
+ ],
127
+ "references": [
128
+ {
129
+ "label": "Questionnaire state stories",
130
+ "path": "src/wc/components/AgentQuestionnaire/AgentQuestionnaire.stories.ts"
131
+ },
132
+ {
133
+ "label": "Agent chat composition",
134
+ "path": "agent/patterns/agent-chat/pattern.agent.json"
135
+ }
136
+ ]
137
+ },
138
+ "api": {
139
+ "props": {
140
+ "allowCancel": {
141
+ "type": "boolean",
142
+ "required": false
143
+ },
144
+ "answers": {
145
+ "type": "AgentQuestionAnswer[]",
146
+ "required": false
147
+ },
148
+ "errorMessage": {
149
+ "type": "string",
150
+ "required": false
151
+ },
152
+ "labels": {
153
+ "type": "Partial<AgentQuestionnaireLabels>",
154
+ "required": false
155
+ },
156
+ "questions": {
157
+ "type": "AgentQuestion[]",
158
+ "required": true
159
+ },
160
+ "requestId": {
161
+ "type": "string",
162
+ "required": true
163
+ },
164
+ "status": {
165
+ "type": "AgentQuestionnaireStatus",
166
+ "required": false
167
+ }
168
+ },
169
+ "events": [
170
+ {
171
+ "name": "dsAnswer",
172
+ "detail": "AgentQuestionnaireAnswerEventDetail"
173
+ },
174
+ {
175
+ "name": "dsCancel",
176
+ "detail": "AgentQuestionnaireCancelEventDetail"
177
+ }
178
+ ],
179
+ "slots": []
180
+ },
181
+ "exports": {
182
+ "customElement": "ds-agent-questionnaire",
183
+ "react": "DsAgentQuestionnaire",
184
+ "angular": "DsAgentQuestionnaire"
185
+ },
186
+ "dependencies": [
187
+ "@ds-mo/ui",
188
+ "@ds-mo/tokens",
189
+ "@ds-mo/icons"
190
+ ],
191
+ "componentDependencies": [
192
+ "button-filled",
193
+ "button-unfilled",
194
+ "checkbox",
195
+ "icon",
196
+ "loader",
197
+ "radio",
198
+ "text",
199
+ "tooltip"
200
+ ]
201
+ },
83
202
  {
84
203
  "id": "component:ds-agent-response",
85
204
  "tag": "ds-agent-response",
86
205
  "name": "agent-response",
87
206
  "title": "AgentResponse",
88
- "summary": "Ordered renderer for normalized immutable agent response parts inside a generic incoming message.",
207
+ "summary": "Ordered renderer for normalized immutable agent response parts or an application-composed response body inside a generic incoming message.",
89
208
  "intentStatus": "complete",
90
209
  "intent": {
91
210
  "audience": "specialized",
92
211
  "status": "experimental",
93
- "summary": "Ordered renderer for normalized immutable agent response parts inside a generic incoming message.",
212
+ "summary": "Ordered renderer for normalized immutable agent response parts or an application-composed response body inside a generic incoming message.",
94
213
  "useWhen": [
95
- "An agent response combines Markdown, user-safe activity, display-only tools, attachments, and sources in authored order."
214
+ "An agent response combines Markdown, user-safe activity, display-only tools, attachments, answered questionnaires, sources, or application-specific content in authored order."
96
215
  ],
97
216
  "avoidWhen": [
98
217
  "The component would be expected to own a model, transport, persistence, title generation, approval policy, or private reasoning."
@@ -103,28 +222,30 @@
103
222
  "component:ds-markdown",
104
223
  "component:ds-agent-activity",
105
224
  "component:ds-agent-tool-call",
106
- "component:ds-agent-source-list"
225
+ "component:ds-agent-source-list",
226
+ "component:ds-agent-questionnaire"
107
227
  ],
108
228
  "patterns": [
109
229
  "pattern:agent-chat"
110
230
  ],
111
231
  "accessibility": [
112
- "Part order matches authored reading order and remains inside generic message semantics.",
232
+ "Part or composed-slot order matches authored reading order and remains inside generic message semantics.",
113
233
  "Streaming state supplements rather than replaces meaningful textual status.",
114
234
  "Forwarded metadata actions retain Message ordering, keyboard reveal, and touch visibility."
115
235
  ],
116
236
  "states": [
117
237
  "The owner replaces immutable part arrays as scripted or live output changes.",
238
+ "Parts mode remains the compatibility default for serializable content; composed mode ignores parts and gives the default slot ownership of the complete ordered response body.",
118
239
  "AgentResponse renders directly in Message without borrowing a plain MessageBubble surface.",
119
- "Markdown parts use the optional safe renderer; prose CSS owns only semantic-tree styling and never response ordering or streaming state.",
240
+ "Markdown parts use the optional safe renderer; the response sets the public prose text measure while code, tables, tools, sources, attachments, and other structured parts retain the full lane.",
120
241
  "The application may compose MessageActions for completed-response Copy and controlled feedback while retaining persistent retry or recovery controls in the separate actions slot."
121
242
  ],
122
243
  "responsiveBehavior": [
123
- "Rich content uses the available transcript width while respecting readable measure and local overflow constraints."
244
+ "Direct prose blocks use a readable text measure within the available transcript width, while narrow lanes and structured content retain their available width and local overflow constraints."
124
245
  ],
125
246
  "references": [
126
247
  {
127
- "label": "Representative streamed response",
248
+ "label": "Response modes and representative flow",
128
249
  "path": "src/wc/components/AgentResponse/AgentResponse.stories.ts"
129
250
  },
130
251
  {
@@ -151,6 +272,10 @@
151
272
  "type": "AgentResponsePart[]",
152
273
  "required": false
153
274
  },
275
+ "renderMode": {
276
+ "type": "AgentResponseRenderMode",
277
+ "required": false
278
+ },
154
279
  "showAuthor": {
155
280
  "type": "boolean",
156
281
  "required": false
@@ -178,6 +303,7 @@
178
303
  ],
179
304
  "componentDependencies": [
180
305
  "agent-activity",
306
+ "agent-questionnaire",
181
307
  "agent-source-list",
182
308
  "agent-tool-call",
183
309
  "attachment-list",
@@ -190,17 +316,17 @@
190
316
  "tag": "ds-agent-source-list",
191
317
  "name": "agent-source-list",
192
318
  "title": "AgentSourceList",
193
- "summary": "Collapsible list of agent response sources with title, description, and validated external links.",
319
+ "summary": "Inline collapsible agent-source list with safe external links, derived hostnames, optional descriptions, and observable disclosure state.",
194
320
  "intentStatus": "complete",
195
321
  "intent": {
196
322
  "audience": "specialized",
197
323
  "status": "experimental",
198
- "summary": "Collapsible list of agent response sources with title, description, and validated external links.",
324
+ "summary": "Inline collapsible agent-source list with safe external links, derived hostnames, optional descriptions, and observable disclosure state.",
199
325
  "useWhen": [
200
- "An agent response cites external material readers may inspect."
326
+ "A stable agent response cites external material readers may inspect inline."
201
327
  ],
202
328
  "avoidWhen": [
203
- "The links are ordinary body links or are not sources for the response."
329
+ "The links are ordinary body links, source discovery is still active, or the application expects a source drawer or deduplication behavior."
204
330
  ],
205
331
  "commonlyComposedWith": [
206
332
  "component:ds-agent-response",
@@ -210,16 +336,20 @@
210
336
  "pattern:agent-chat"
211
337
  ],
212
338
  "accessibility": [
213
- "Each source uses descriptive linked text and visible supporting context.",
214
- "Unsafe link schemes remain non-interactive text."
339
+ "Each interactive source uses descriptive linked text, a visible hostname, supporting context, and an external-link indication.",
340
+ "Malformed and unsafe schemes remain non-interactive text rather than producing executable links.",
341
+ "The native disclosure exposes keyboard and expanded-state semantics, while open-change events let applications observe participant intent."
342
+ ],
343
+ "states": [
344
+ "Applications collect and deduplicate sources, then append the stable list once; active discovery remains an activity or tool state."
215
345
  ],
216
346
  "responsiveBehavior": [
217
- "Source titles and descriptions wrap within the response width."
347
+ "Source titles, hostnames, and descriptions wrap within the response width."
218
348
  ],
219
349
  "references": [
220
350
  {
221
- "label": "Storybook examples",
222
- "path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
351
+ "label": "Source safety and disclosure stories",
352
+ "path": "src/wc/components/AgentSourceList/AgentSourceList.stories.ts"
223
353
  }
224
354
  ]
225
355
  },
@@ -238,7 +368,12 @@
238
368
  "required": false
239
369
  }
240
370
  },
241
- "events": [],
371
+ "events": [
372
+ {
373
+ "name": "dsOpenChange",
374
+ "detail": "{ open: boolean }"
375
+ }
376
+ ],
242
377
  "slots": []
243
378
  },
244
379
  "exports": {
@@ -261,39 +396,50 @@
261
396
  "tag": "ds-agent-tool-call",
262
397
  "name": "agent-tool-call",
263
398
  "title": "AgentToolCall",
264
- "summary": "Display-only disclosure for an agent tool call, its safe input or output, and execution status.",
399
+ "summary": "Compact display-only status row for a provider-neutral agent tool lifecycle with optional custom result and diagnostic disclosure surfaces.",
265
400
  "intentStatus": "complete",
266
401
  "intent": {
267
402
  "audience": "specialized",
268
403
  "status": "experimental",
269
- "summary": "Display-only disclosure for an agent tool call, its safe input or output, and execution status.",
404
+ "summary": "Compact display-only status row for a provider-neutral agent tool lifecycle with optional custom result and diagnostic disclosure surfaces.",
270
405
  "useWhen": [
271
- "A prototype or agent product needs to expose user-safe tool execution detail."
406
+ "An agent product needs to expose user-safe tool preparation, queueing, execution, participant wait, completion, failure, denial, or cancellation state."
272
407
  ],
273
408
  "avoidWhen": [
274
- "A participant must approve, deny, edit, or retry the tool call; those are product controls outside this component."
409
+ "A participant must approve, deny, edit, retry, or execute the tool call; those product controls and consequences remain outside this component."
275
410
  ],
276
411
  "commonlyComposedWith": [
277
412
  "component:ds-agent-response",
278
- "component:ds-code-block"
413
+ "component:ds-code-block",
414
+ "component:ds-text"
279
415
  ],
280
416
  "patterns": [
281
417
  "pattern:agent-chat"
282
418
  ],
283
419
  "accessibility": [
284
- "Queued, running, success, error, and denied states are available as text.",
285
- "The disclosure uses native keyboard and expanded-state semantics."
420
+ "Every lifecycle state remains visible as text and error or denied meaning does not depend on color.",
421
+ "A disclosure is rendered only when details exist and uses native keyboard and expanded-state semantics.",
422
+ "Structured input, output, and error details use the semantic code-family fallback and optional ligature override."
286
423
  ],
287
424
  "states": [
288
- "This component presents state but never executes a tool or owns approval policy."
425
+ "Applications normalize provider-specific tool states and may localize the visible status label before rendering.",
426
+ "A custom summary replaces the generated name, a custom result owns the primary result surface, and custom details replace generic input, output, and error diagnostics.",
427
+ "An ordinary text-only custom result inherits the body-medium interface-text baseline; structured result components retain ownership of their own layout and typography.",
428
+ "Compose semantic links around ds-text when a custom result is navigational so anchor semantics and design-system typography each have one owner.",
429
+ "Applications load font assets once at their root; tool details and results never fetch or package a font.",
430
+ "This component presents state but never executes a tool or owns approval, retry, authorization, transport, or consequence policy."
289
431
  ],
290
432
  "responsiveBehavior": [
291
- "Structured detail wraps and scrolls without widening the transcript."
433
+ "Long names and state labels wrap inside the compact row while custom results and structured diagnostics remain within the transcript lane without widening it."
292
434
  ],
293
435
  "references": [
294
436
  {
295
- "label": "Storybook examples",
296
- "path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
437
+ "label": "Lifecycle and slot stories",
438
+ "path": "src/wc/components/AgentToolCall/AgentToolCall.stories.ts"
439
+ },
440
+ {
441
+ "label": "Font ownership and loading",
442
+ "path": "docs/font-ownership.md"
297
443
  }
298
444
  ]
299
445
  },
@@ -326,9 +472,18 @@
326
472
  "state": {
327
473
  "type": "AgentToolState",
328
474
  "required": false
475
+ },
476
+ "statusLabel": {
477
+ "type": "string",
478
+ "required": false
329
479
  }
330
480
  },
331
- "events": [],
481
+ "events": [
482
+ {
483
+ "name": "dsOpenChange",
484
+ "detail": "{ open: boolean }"
485
+ }
486
+ ],
332
487
  "slots": []
333
488
  },
334
489
  "exports": {
@@ -1467,7 +1622,7 @@
1467
1622
  ],
1468
1623
  "states": [
1469
1624
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1470
- "Set isInset only when the button is nested inside a same-size control; it reduces the outer geometry while preserving the size's icon, label inset, gap, radius, and typography.",
1625
+ "Set isInset only when the button is nested inside a same-size control. The default single inset removes 4px overall; insetDepth double removes 8px overall so the parent can add 4px per edge while preserving its outer alignment box. Double inset falls back to single at xs to protect minimum icon geometry.",
1471
1626
  "Use only one filled action per local decision area; render all secondary actions with ButtonUnfilled.",
1472
1627
  "Choose brand or neutral for general commands. Reserve positive, negative, warning, and caution for matching action consequences, and AI, guide, or walkthrough for actions that enter those feature experiences.",
1473
1628
  "Contrast serves both surface adaptation and hierarchy, but never permits a second filled action in the same decision area.",
@@ -1540,6 +1695,10 @@
1540
1695
  "type": "string",
1541
1696
  "required": false
1542
1697
  },
1698
+ "insetDepth": {
1699
+ "type": "ControlInsetDepth",
1700
+ "required": false
1701
+ },
1543
1702
  "intent": {
1544
1703
  "type": "ButtonFilledIntent",
1545
1704
  "required": false
@@ -1660,7 +1819,7 @@
1660
1819
  ],
1661
1820
  "accessibility": [
1662
1821
  "Provide an explicit accessible name for every icon-only action.",
1663
- "Set hasMenu when the button triggers a Menu; it implies aria-haspopup of menu. Pass controls with the Menu id and expanded from the same open state given to Menu.",
1822
+ "Set hasMenu when the button triggers a Menu; it implies aria-haspopup of menu. Pass controls with the Menu id and expanded from the same open state given to Menu. Expanded popup triggers hold the pressed visual while open; expanded disclosure controls without popup semantics retain the normal resting appearance.",
1664
1823
  "Give an icon-only menu button an accessible name that states the role, such as More options, because no visible label or chevron carries it.",
1665
1824
  "Use haspopup directly for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
1666
1825
  "Use pressed only for a genuine toggle button; it supplies aria-pressed and dsChange intent. Use isActive only for owner-controlled visual emphasis inside a composite whose selection semantics live on the owner.",
@@ -1671,7 +1830,7 @@
1671
1830
  ],
1672
1831
  "states": [
1673
1832
  "Every size applies one complete control-density recipe across frame height, inline padding, icon zone, text-container inset, gap, and radius.",
1674
- "Set isInset only when the button is nested inside a same-size control; it reduces the outer geometry while preserving the size's icon, label inset, gap, radius, and typography.",
1833
+ "Set isInset only when the button is nested inside a same-size control. The default single inset removes 4px overall; insetDepth double removes 8px overall so the parent can add 4px per edge while preserving its outer alignment box. Double inset falls back to single at xs to protect minimum icon geometry.",
1675
1834
  "A true pressed toggle and owner-controlled isActive emphasis share the selected visual treatment, but only pressed supplies toggle semantics and dsChange.",
1676
1835
  "General content UI keeps the selected interaction fill and border for pressed or active emphasis.",
1677
1836
  "Shell, navigation, and tool-rail composites use isActive with foreground-only emphasis and no selected fill or border.",
@@ -1683,7 +1842,7 @@
1683
1842
  "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
1684
1843
  "hasMenu covers two distinct menu-button shapes and the variant selects between them. With label or icon-label the action has a menu, and a trailing chevron carries the affordance. With icon the button is a menu, meaning the overflow or more-options control, and no chevron is added.",
1685
1844
  "Because the icon-only shape has no chevron, its glyph must convey the menu on its own; use Ellipses. Never pair hasMenu with an icon-only glyph that does not read as a menu.",
1686
- "An open popup is a transient pressed state rather than a selected one. While expanded is true the pressed wash is held for the popup's complete rendered lifecycle and survives hover, including when chrome opts out of selected fills with activeFill set to false."
1845
+ "An open popup is a transient pressed state rather than a selected one. While expanded is true and haspopup or hasMenu identifies a popup, the pressed wash is held for the popup's complete rendered lifecycle and survives hover, including when chrome opts out of selected fills with activeFill set to false. Expanded disclosure buttons without popup semantics remain visually neutral."
1687
1846
  ],
1688
1847
  "responsiveBehavior": [
1689
1848
  "The consuming layout decides when an icon-label action becomes icon-only and must provide an explicit accessible name after changing variants.",
@@ -1754,6 +1913,10 @@
1754
1913
  "type": "string",
1755
1914
  "required": false
1756
1915
  },
1916
+ "insetDepth": {
1917
+ "type": "ControlInsetDepth",
1918
+ "required": false
1919
+ },
1757
1920
  "isActive": {
1758
1921
  "type": "boolean",
1759
1922
  "required": false
@@ -2510,12 +2673,12 @@
2510
2673
  "tag": "ds-checkbox",
2511
2674
  "name": "checkbox",
2512
2675
  "title": "Checkbox",
2513
- "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2676
+ "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with optional supporting description, checked, unchecked, mixed, and four density states.",
2514
2677
  "intentStatus": "complete",
2515
2678
  "intent": {
2516
2679
  "audience": "general",
2517
2680
  "status": "stable",
2518
- "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2681
+ "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with optional supporting description, checked, unchecked, mixed, and four density states.",
2519
2682
  "useWhen": [
2520
2683
  "A user may independently select zero or more choices.",
2521
2684
  "A form requires acknowledgment, consent, or an opt-in value before submission.",
@@ -2549,7 +2712,7 @@
2549
2712
  "component:ds-text"
2550
2713
  ],
2551
2714
  "accessibility": [
2552
- "Every interactive checkbox requires a visible label that provides its accessible name.",
2715
+ "Every interactive checkbox requires a visible label that provides its accessible name; an optional visible description is associated as supporting context.",
2553
2716
  "Enter and Space activate the checkbox; checked and mixed state are exposed through aria-checked.",
2554
2717
  "Disabled and inactive checkboxes leave the tab order and are omitted from form submission.",
2555
2718
  "Use presentation mode only inside a composite option that owns selection semantics, focus, and interaction."
@@ -2559,16 +2722,17 @@
2559
2722
  "Activating an indeterminate checkbox clears the mixed state, toggles checked, and emits dsChange with the resulting boolean.",
2560
2723
  "The initial checked and indeterminate values are restored by native form reset; checked values submit under name and unchecked values submit nothing.",
2561
2724
  "Sizes are lg with a 20px box in a 24px placement, md with a 16px box in a 20px placement, sm with a 12px box in a 16px placement, and xs with an 8px box in a 12px placement.",
2562
- "Presentation mode removes checkbox semantics, focus, interaction, label rendering, and form submission while preserving the visual state."
2725
+ "Presentation mode removes checkbox semantics, focus, interaction, label rendering, description rendering, and form submission while preserving the visual state.",
2726
+ "Description-rich checkboxes grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
2563
2727
  ],
2564
2728
  "responsiveBehavior": [
2565
- "Choose size from the density of the containing row; labels may wrap while the placement box stays fixed.",
2729
+ "Choose size from the density of the containing row; labels and descriptions may wrap while the placement box stays fixed.",
2566
2730
  "Use the same density as the shared option icon zone in multi-select rows."
2567
2731
  ],
2568
2732
  "frameworkCaveats": {
2569
2733
  "customElements": [
2570
2734
  "Bind checked and indeterminate as properties for application state updates and listen for dsChange.",
2571
- "Use the form attribute on the host when associating a checkbox rendered outside its owning form."
2735
+ "Use the form attribute on the host when associating a checkbox rendered outside its owning form or isolating it from an ancestor form."
2572
2736
  ],
2573
2737
  "react": [
2574
2738
  "Use DsCheckbox and handle onDsChange; checked and indeterminate are mutable and update after user activation."
@@ -2594,6 +2758,10 @@
2594
2758
  "type": "boolean",
2595
2759
  "required": false
2596
2760
  },
2761
+ "description": {
2762
+ "type": "string",
2763
+ "required": false
2764
+ },
2597
2765
  "disabled": {
2598
2766
  "type": "boolean",
2599
2767
  "required": false
@@ -2793,12 +2961,12 @@
2793
2961
  "tag": "ds-code-block",
2794
2962
  "name": "code-block",
2795
2963
  "title": "CodeBlock",
2796
- "summary": "Scrollable monospace code surface with optional language or filename context and copy action.",
2964
+ "summary": "Scrollable code surface with optional language or filename context and copy action.",
2797
2965
  "intentStatus": "complete",
2798
2966
  "intent": {
2799
2967
  "audience": "general",
2800
2968
  "status": "experimental",
2801
- "summary": "Scrollable monospace code surface with optional language or filename context and copy action.",
2969
+ "summary": "Scrollable code surface with optional language or filename context and copy action.",
2802
2970
  "useWhen": [
2803
2971
  "A message or document displays fenced code that readers may copy."
2804
2972
  ],
@@ -2811,7 +2979,11 @@
2811
2979
  ],
2812
2980
  "accessibility": [
2813
2981
  "The copy action has matching accessible-name and visible-tooltip status wording, and the code remains selectable text.",
2814
- "Language and filename labels supplement rather than replace the code content."
2982
+ "Language and filename labels supplement rather than replace the code content.",
2983
+ "The semantic code-family token retains a system-monospace fallback when an application does not load Fira Code; applications may disable programming ligatures through the shared code-surface custom property."
2984
+ ],
2985
+ "states": [
2986
+ "Applications load font assets once at their root. The component consumes --typography-font-family-code and never fetches or packages a font."
2815
2987
  ],
2816
2988
  "responsiveBehavior": [
2817
2989
  "Long lines scroll horizontally and do not widen the owning transcript."
@@ -2819,7 +2991,11 @@
2819
2991
  "references": [
2820
2992
  {
2821
2993
  "label": "Storybook examples",
2822
- "path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
2994
+ "path": "src/wc/components/CodeBlock/CodeBlock.stories.ts"
2995
+ },
2996
+ {
2997
+ "label": "Font ownership and loading",
2998
+ "path": "docs/font-ownership.md"
2823
2999
  }
2824
3000
  ]
2825
3001
  },
@@ -4418,12 +4594,12 @@
4418
4594
  "tag": "ds-message-composer",
4419
4595
  "name": "message-composer",
4420
4596
  "title": "MessageComposer",
4421
- "summary": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
4597
+ "summary": "Two-line auto-growing conversation textarea with submit, stop, an attached submission-error support surface, and extensible tool, action, and error-recovery regions.",
4422
4598
  "intentStatus": "complete",
4423
4599
  "intent": {
4424
4600
  "audience": "general",
4425
4601
  "status": "experimental",
4426
- "summary": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
4602
+ "summary": "Two-line auto-growing conversation textarea with submit, stop, an attached submission-error support surface, and extensible tool, action, and error-recovery regions.",
4427
4603
  "useWhen": [
4428
4604
  "A conversation accepts multi-line text and needs Enter-to-submit with a streaming stop action."
4429
4605
  ],
@@ -4441,14 +4617,17 @@
4441
4617
  "accessibility": [
4442
4618
  "Always provide a localized textarea label and submit or stop action names; the built-in icon action exposes the same name in its tooltip.",
4443
4619
  "Shift plus Enter inserts a newline while Enter submits non-empty content.",
4444
- "Streaming and error states remain perceivable without relying on icon shape alone."
4620
+ "Submission errors remain visible and announced above the editable box as part of one attached composer unit, and the editable control references their text while the error state is active.",
4621
+ "Streaming and error states remain perceivable without relying on icon shape or color alone."
4445
4622
  ],
4446
4623
  "states": [
4447
4624
  "The owner controls draft value and transport state; the composer emits intent without performing transport.",
4625
+ "Error status never clears or disables the draft; the application supplies recovery actions through error-actions and owns retry semantics. The negative support surface appears above and attached to the composer box, within the component's measured ownership.",
4448
4626
  "Use the tools slot for leading actions such as add and the actions slot for trailing actions such as dictation; the built-in submit or stop action remains last with an 8px gap from the preceding action. These icon buttons use the standard non-rounded control radius, and the application supplies tooltips for slotted icon actions.",
4449
4627
  "The composer surface uses the 10px --dimension-radius-125 token.",
4450
4628
  "Mouse or keyboard focus on the textarea gives the complete composer surface the same bold-brand inset stroke width and color as an active Input; the native textarea never draws a separate outline.",
4451
- "The empty or otherwise inactive submit action is a disabled bordered ButtonUnfilled. Ready submit actions use submitIntent, while the streaming stop action remains a bold-brand ButtonFilled."
4629
+ "The empty or otherwise inactive submit action is a disabled bordered ButtonUnfilled. Ready submit actions use submitIntent, while the streaming stop action remains a bold-brand ButtonFilled.",
4630
+ "The attached error unit keeps a real boundary in forced colors and lets message text and application-owned recovery actions wrap at narrow widths."
4452
4631
  ],
4453
4632
  "responsiveBehavior": [
4454
4633
  "The textarea begins at two body-medium lines, grows one line at a time through six lines, and then scrolls internally."
@@ -4466,6 +4645,10 @@
4466
4645
  },
4467
4646
  "api": {
4468
4647
  "props": {
4648
+ "errorMessage": {
4649
+ "type": "string",
4650
+ "required": false
4651
+ },
4469
4652
  "isInactive": {
4470
4653
  "type": "boolean",
4471
4654
  "required": false
@@ -4514,11 +4697,14 @@
4514
4697
  },
4515
4698
  "dependencies": [
4516
4699
  "@ds-mo/ui",
4517
- "@ds-mo/tokens"
4700
+ "@ds-mo/tokens",
4701
+ "@ds-mo/icons"
4518
4702
  ],
4519
4703
  "componentDependencies": [
4520
4704
  "button-filled",
4521
4705
  "button-unfilled",
4706
+ "icon",
4707
+ "text",
4522
4708
  "tooltip"
4523
4709
  ]
4524
4710
  },
@@ -4527,12 +4713,12 @@
4527
4713
  "tag": "ds-message-scroller",
4528
4714
  "name": "message-scroller",
4529
4715
  "title": "MessageScroller",
4530
- "summary": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
4716
+ "summary": "Focusable transcript scroller with turn anchoring, reader-controlled live-edge following, and a measured interaction-plus-composer overlay stack.",
4531
4717
  "intentStatus": "complete",
4532
4718
  "intent": {
4533
4719
  "audience": "general",
4534
4720
  "status": "experimental",
4535
- "summary": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
4721
+ "summary": "Focusable transcript scroller with turn anchoring, reader-controlled live-edge following, and a measured interaction-plus-composer overlay stack.",
4536
4722
  "useWhen": [
4537
4723
  "Messages can append or stream and transcript position must remain respectful of reader intent."
4538
4724
  ],
@@ -4541,10 +4727,12 @@
4541
4727
  ],
4542
4728
  "commonlyComposedWith": [
4543
4729
  "component:ds-message",
4544
- "component:ds-message-composer"
4730
+ "component:ds-message-composer",
4731
+ "component:ds-agent-questionnaire"
4545
4732
  ],
4546
4733
  "patterns": [
4547
- "pattern:conversation"
4734
+ "pattern:conversation",
4735
+ "pattern:agent-chat"
4548
4736
  ],
4549
4737
  "accessibility": [
4550
4738
  "Give each transcript a concise localized label.",
@@ -4552,11 +4740,12 @@
4552
4740
  "The scroll-to-latest control remains keyboard accessible when follow behavior is released and exposes its action name in a tooltip."
4553
4741
  ],
4554
4742
  "states": [
4555
- "Selection and transcript interaction release automatic following.",
4743
+ "Wheel, touch, keyboard navigation, selection, and transcript interaction release automatic following; Scroll to latest explicitly restores it.",
4744
+ "A newly appended outgoing Message marked scroll-anchor starts a turn near the top with the configurable previous-turn peek; mutations inside existing messages and prepended history do not re-anchor.",
4556
4745
  "Opening saved history, message jumps, and prepended history preserve deliberate position.",
4557
4746
  "The scroll-to-latest action is absent at the live edge, appears only after the reader moves away, and disappears again after returning to the newest message.",
4558
4747
  "Scroll to latest uses the shared md control-elevation wrapper with a pointer-transparent top highlight, preserving its transparent backdrop blur and borderless unfilled action while the press-scale modifier moves the complete elevated surface.",
4559
- "Place a composer container with 8px padding on every side in the overlay slot so messages scroll behind it; the shared scroll-overlay controller tracks every composer growth step, reserves matching transcript clearance, begins the fade 8px before the visible composer, and keeps scroll-to-latest above it."
4748
+ "Place a pending human-input surface in interaction and a composer container with 8px padding on every side in overlay; the shared scroll-overlay controller measures them as one stack, tracks every growth step, reserves matching transcript clearance, begins the fade before the stack, and keeps scroll-to-latest above it."
4560
4749
  ],
4561
4750
  "responsiveBehavior": [
4562
4751
  "Transcript width is readable while the scroll region fills available height.",
@@ -6054,12 +6243,12 @@
6054
6243
  "tag": "ds-radio",
6055
6244
  "name": "radio",
6056
6245
  "title": "Radio",
6057
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6246
+ "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, optional per-option descriptions, four densities, per-option inactive state, and roving keyboard focus.",
6058
6247
  "intentStatus": "complete",
6059
6248
  "intent": {
6060
6249
  "audience": "general",
6061
6250
  "status": "stable",
6062
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6251
+ "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, optional per-option descriptions, four densities, per-option inactive state, and roving keyboard focus.",
6063
6252
  "useWhen": [
6064
6253
  "A user must select exactly one visible option from a small set.",
6065
6254
  "All available choices should remain visible for comparison.",
@@ -6093,19 +6282,20 @@
6093
6282
  ],
6094
6283
  "accessibility": [
6095
6284
  "The host exposes radiogroup semantics and requires an accessible group name from aria-label or aria-labelledby.",
6096
- "Each visible option exposes radio semantics, its checked state, its label text, and any inactive state.",
6285
+ "Each visible option exposes radio semantics, its checked state, its label text, optional supporting description, and any inactive state.",
6097
6286
  "Arrow keys move and select through active options; Home and End select the first and last active options; Space and Enter select the focused option.",
6098
- "Roving tabindex keeps one active option in the tab order, preferring the selected option."
6287
+ "Roving tabindex keeps one active option in the tab order, preferring the selected option; setFocus uses that same public focus target."
6099
6288
  ],
6100
6289
  "states": [
6101
6290
  "Unchecked circles use a tertiary-foreground inset stroke: 1.5px at lg, 1.25px at md, 1px at sm, and 0.75px at xs.",
6102
6291
  "Selected circles remove the border, use a brand fill, and draw a centered on-bold foreground dot sized 10px at lg, 8px at md, 6px at sm, and 4px at xs.",
6103
6292
  "Sizes are lg with a 20px circle in a 24px placement, md with a 16px circle in a 20px placement, sm with a 12px circle in a 16px placement, and xs with an 8px circle in a 12px placement.",
6104
- "The initial value is restored by native form reset; the selected value submits under name and a required set is invalid until one active option is selected."
6293
+ "The initial value is restored by native form reset; the selected value submits under name and a required set is invalid until one active option is selected.",
6294
+ "Description-rich options grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
6105
6295
  ],
6106
6296
  "responsiveBehavior": [
6107
6297
  "Choose size from the density of the containing form or settings row.",
6108
- "Prefer vertical layout when labels may wrap or horizontal space is constrained; horizontal layout is appropriate for short labels in a small set."
6298
+ "Prefer vertical layout when labels or descriptions may wrap or horizontal space is constrained; horizontal layout is appropriate for short labels in a small set."
6109
6299
  ],
6110
6300
  "frameworkCaveats": {
6111
6301
  "customElements": [
@@ -7880,23 +8070,24 @@
7880
8070
  "component:ds-icon"
7881
8071
  ],
7882
8072
  "accessibility": [
7883
- "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty even when it is visually hidden.",
8073
+ "The rendered structure uses a native table, caption, column headers, row groups, and data cells; keep the caption non-empty. The native caption remains visually hidden as the table's accessible name. When caption visibility is enabled, a presentational title bar renders as component chrome outside the horizontal scrollport so it stays aligned with the table frame without duplicating the accessible name.",
7884
8074
  "Sorting controls remain buttons inside column headers. Member-row sort uses aria-sort, while independent group order is described by the grouped header control.",
7885
- "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window.",
8075
+ "Selection controls expose checkbox semantics and explicit row names; select-all affects selectable loaded rows only and preserves selected identities outside the loaded window. When grouping is active with multi-selection, each group section header also exposes a checkbox that selects or clears that group's selectable loaded rows.",
7886
8076
  "Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection or action controls.",
7887
8077
  "Scrollable table regions become keyboard focusable and named only when overflow exists.",
7888
- "Incremental loading, newly appended row counts, failures, and end-of-results transitions are announced through a polite status region without replacing visible state."
8078
+ "Incremental loading, newly appended row counts, failures, and end-of-results transitions are announced through a polite status region without replacing visible state.",
8079
+ "An optional result summary footer appears below the table frame when both displayedCount and totalCount are finite, formatting Displaying {displayed} of {total} in text-body-medium secondary."
7889
8080
  ],
7890
8081
  "states": [
7891
- "Columns, rows, groups, grouping, sorting, selected row IDs, and lazy-loading state are controlled inputs. Events communicate intent and never mutate those inputs.",
7892
- "Grouping supports one level. The application supplies ordered groups and ordered member rows; group order and member-row sort are independent controls.",
8082
+ "Columns, rows, groups, grouping, sorting, selected row IDs, collapsed group IDs, displayedCount, totalCount, and lazy-loading state are controlled inputs. Events communicate intent and never mutate those inputs.",
8083
+ "Grouping supports one level. The application supplies ordered groups and ordered member rows; group order and member-row sort are independent controls. Group section headers show an emphasized text-body-medium label followed by a rounded sm Tag containing only the numeric count. The Tag uses the group's faint intent surface (neutral when intent is absent) and a small-elevation, button-hugging wrapper; a localized countLabel remains available to assistive technology. Groups may declare an optional intent (brand, neutral, negative, warning, caution, positive) that paints an LTR gradient from the faint intent surface at the label edge into faint neutral at the trailing edge, plus a bold intent title color. Neutral groups remain solid faint neutral. Section separators are painted inside that viewport-width surface so translucent border tokens composite with each intent background; the final collapsed section does not duplicate the terminal table edge. A trailing visually neutral icon-only ButtonUnfilled uses the 24px md double-inset action recipe and toggles controlled collapsedGroupIds, showing ChevronUp while expanded and ChevronDown while collapsed. While any group remains expanded, a ChevronDownUp action uses the xs sort-control recipe widened to a table-owned 24px lane and collapses every group. It appears at the inline-end edge of the trailing column declared with kind action when one exists; otherwise a button-hugging 24px by 16px medium-elevation surface floats at the visible scrollport's header edge so the action remains reachable while member columns scroll beneath it. The section header stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width.",
7893
8084
  "An active member sort toggles only between ascending and descending; activating a different sortable label moves sorting to that key. Applications may still clear the controlled sort state explicitly. The grouped column toggles ascending and descending group order without clearing member sort.",
7894
8085
  "Compound headers can expose multiple related labels with independent sort keys. Each label owns only its content-width interaction target while the active direction remains in the column's alignment-aware sort lane.",
7895
- "Initial loading uses row-shaped skeletons. Empty and initial error states remain inside the table. Incremental loading retains existing rows and supports automatic sentinel, manual load-more, retry, and terminal states.",
8086
+ "Initial loading uses row-shaped skeletons that preserve the standard single-line cell padding, row dividers, column dividers, selection lane, and sticky-lane boundaries. Empty and initial error states remain inside the table. Incremental loading retains existing rows and supports automatic sentinel, manual load-more, retry, and terminal states.",
7896
8087
  "Lazy loading replaces pagination. The application owns requests, cancellation, cursors, deduplication, appended records, and query identity; loadIdentity resets the component request guard.",
7897
8088
  "Rows opt into complete-row activation with interactive and emit dsRowActivate without owning navigation. Selection paints through the shared selected ::before layer; interactive hover and press paint through the shared ::after layer.",
7898
8089
  "Row selection owns the single sticky start lane. One explicitly sized application column can own the sticky end lane, or the start lane when selection is absent. Each sticky boundary owns one fixed divider and a row-clipped directional shadow that paints into the adjacent scrolling columns only while more inline content remains beyond that edge.",
7899
- "Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, icon-only, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Single-track text, selection, tag-only, icon-only, Action, Empty, and Blank cells resolve a 40px base contract while multi-track cells grow downward. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled inside 8px padding, default to unbordered, and emit row, column, and action identities through dsCellAction. Image cells render a 52px-high bordered preview inside 6px outer padding, establishing a 64px row, and fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type and variant hooks keep every cell family independently styleable.",
8090
+ "Cells accept scalar content, standard primary-and-secondary or dual-primary text primitives, declarative Tag, icon-only, 16:9 Image, or ButtonUnfilled Action content, or explicit Empty and Blank absence values. Single-track text, selection, tag-only, icon-only, Action, Empty, and Blank cells resolve a 40px base contract while multi-track cells grow downward. Tag cells use the double-inset Tag recipe; the md tag-only recipe is 24px inside 8px padding, while compound tag tracks preserve their peer text alignment. Action cells primarily use an icon-only Ellipses treatment, render a 24px small ButtonUnfilled inside 8px padding, default to unbordered, and emit row, column, and action identities through dsCellAction. Image cells render a 48px-high 16:9 bordered preview inside 8px outer padding, establishing a 64px row and a 102px column recipe, and fall back to an accessible placeholder when no source is supplied. Empty means the data applies but has no value and renders an em dash with localized assistive text; Blank means the data is not applicable and renders no content. Nullish values remain backward-compatible Empty values. Stable type and variant hooks keep every cell family independently styleable.",
7900
8091
  "The public @ds-mo/ui/table.css export is the authoritative zero-specificity visual recipe. Override its --ds-table-* properties or target its stable element classes for product-specific styling."
7901
8092
  ],
7902
8093
  "responsiveBehavior": [
@@ -7910,12 +8101,12 @@
7910
8101
  ],
7911
8102
  "frameworkCaveats": {
7912
8103
  "customElements": [
7913
- "Assign columns, rows, groups, grouping, sort, and selectedRowIds through JavaScript properties rather than HTML attribute strings.",
7914
- "Replace controlled property values in response to dsSortChange, dsGroupingChange, dsSelectionChange, and dsLoadMore; route dsRowActivate in the application owner."
8104
+ "Assign columns, rows, groups, grouping, sort, selectedRowIds, collapsedGroupIds, displayedCount, and totalCount through JavaScript properties rather than HTML attribute strings.",
8105
+ "Replace controlled property values in response to dsSortChange, dsGroupingChange, dsGroupCollapseChange, dsSelectionChange, and dsLoadMore; route dsRowActivate in the application owner."
7915
8106
  ],
7916
8107
  "react": [
7917
8108
  "Pass new array and state-object references when the controlled data or query state changes.",
7918
- "Apply emitted sort, grouping, selection, action, or loading detail to application state and perform data transformations in the owning layer."
8109
+ "Apply emitted sort, grouping, collapse, selection, action, or loading detail to application state and perform data transformations in the owning layer."
7919
8110
  ],
7920
8111
  "angular": [
7921
8112
  "Bind complex table inputs as properties and update the controlled values from the corresponding output events.",
@@ -7943,10 +8134,18 @@
7943
8134
  "type": "TableCaptionVisibility",
7944
8135
  "required": false
7945
8136
  },
8137
+ "collapsedGroupIds": {
8138
+ "type": "string[]",
8139
+ "required": false
8140
+ },
7946
8141
  "columns": {
7947
8142
  "type": "TableColumn[]",
7948
8143
  "required": false
7949
8144
  },
8145
+ "displayedCount": {
8146
+ "type": "number | undefined",
8147
+ "required": false
8148
+ },
7950
8149
  "emptyBody": {
7951
8150
  "type": "string",
7952
8151
  "required": false
@@ -8027,6 +8226,10 @@
8027
8226
  "type": "string | number | undefined",
8028
8227
  "required": false
8029
8228
  },
8229
+ "resultSummaryLabel": {
8230
+ "type": "string",
8231
+ "required": false
8232
+ },
8030
8233
  "retryLabel": {
8031
8234
  "type": "string",
8032
8235
  "required": false
@@ -8062,6 +8265,10 @@
8062
8265
  "stickyHeader": {
8063
8266
  "type": "boolean",
8064
8267
  "required": false
8268
+ },
8269
+ "totalCount": {
8270
+ "type": "number | undefined",
8271
+ "required": false
8065
8272
  }
8066
8273
  },
8067
8274
  "events": [
@@ -8069,6 +8276,10 @@
8069
8276
  "name": "dsCellAction",
8070
8277
  "detail": "TableCellActionDetail"
8071
8278
  },
8279
+ {
8280
+ "name": "dsGroupCollapseChange",
8281
+ "detail": "TableGroupCollapseChangeDetail"
8282
+ },
8072
8283
  {
8073
8284
  "name": "dsGroupingChange",
8074
8285
  "detail": "TableGroupingChangeDetail"
@@ -8172,8 +8383,8 @@
8172
8383
  "Neutral is ordinary metadata; brand marks Motive or product affiliation; AI marks AI-generated or AI-assisted content; positive, caution, warning, and negative communicate increasingly specific status meaning.",
8173
8384
  "Warning signals higher urgency or risk than caution, which asks for attention before a possible issue.",
8174
8385
  "Contrast changes visual prominence without changing semantic intent or parent surface context.",
8175
- "Rounded is an optional visual style with no semantic difference.",
8176
- "isInset opts into reduced outer geometry only when Tag is nested inside a control of the same density; semantic styling, typography, icons, gaps, radius, and interaction remain unchanged.",
8386
+ "Rounded is an optional visual style with no semantic difference. Every size and inset depth keeps a minimum inline size equal to its resolved height, so short labels such as a one-digit count render as circles instead of vertically elongated pills.",
8387
+ "isInset opts into reduced outer geometry only when Tag is nested inside a control of the same density. The default single inset removes 4px overall; insetDepth double removes 8px overall and falls back to single at xs to protect minimum icon geometry. Semantic styling, typography, icons, gaps, radius, and interaction remain unchanged.",
8177
8388
  "Labels stay on one line and truncate only when the owner supplies a maximum width.",
8178
8389
  "Omitted interactive renders static metadata with no focus, event, or suffix. Interactive adds the fixed ChevronUpDown suffix and emits dsClick without toggling expanded internally.",
8179
8390
  "isInactive disables only the interactive button and applies the shared inactive treatment."
@@ -8218,6 +8429,10 @@
8218
8429
  "type": "string",
8219
8430
  "required": false
8220
8431
  },
8432
+ "insetDepth": {
8433
+ "type": "ControlInsetDepth",
8434
+ "required": false
8435
+ },
8221
8436
  "intent": {
8222
8437
  "type": "TagIntent",
8223
8438
  "required": false
@@ -8785,6 +9000,8 @@
8785
9000
  "The owning chart mounts the callout when a local interaction starts and unmounts it when that interaction ends.",
8786
9001
  "Coordinate updates track within one mounted interaction session without restarting the show delay.",
8787
9002
  "Placement flips horizontally or vertically when the rendered callout approaches a viewport edge.",
9003
+ "The heading and rows use the same medium-density section-heading and control-frame anatomy as menu-style choice content.",
9004
+ "When any grouped row supplies a swatch, every row reserves the shared leading icon zone so mixed-swatch labels and trailing values stay aligned.",
8788
9005
  "Placement is chosen as a quadrant rather than computed as coordinates: the component measures its own rendered rect and flips its side and align props, which CSS consumes. It therefore does not use the shared anchored-position utilities, which resolve an anchor element into x and y.",
8789
9006
  "This separation is deliberate. The callout follows the pointer instead of an element, so it has no anchor rect to resolve; adopting the shared geometry would mean rewriting its CSS to consume coordinates for no behavioral gain.",
8790
9007
  "Reduced motion preserves the final visible state without an opacity transition."