@ds-mo/ui 13.14.0 → 13.16.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 (329) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +73 -22
  3. package/dist/agent.json +300 -69
  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-bar-title.d.ts +1 -1
  13. package/dist/angular/ds-bar-title.js +3 -3
  14. package/dist/angular/ds-checkbox.d.ts +1 -1
  15. package/dist/angular/ds-checkbox.js +3 -3
  16. package/dist/angular/ds-message-composer.d.ts +1 -1
  17. package/dist/angular/ds-message-composer.js +3 -3
  18. package/dist/angular/ds-radio.js +2 -1
  19. package/dist/angular/ds-shell-page.d.ts +1 -1
  20. package/dist/angular/ds-shell-page.js +3 -3
  21. package/dist/angular/ds-table.d.ts +1 -1
  22. package/dist/angular/ds-table.js +3 -3
  23. package/dist/angular/index.d.ts +1 -1
  24. package/dist/angular/index.js +1 -0
  25. package/dist/angular/proxies.d.ts +1 -0
  26. package/dist/angular/proxies.js +1 -0
  27. package/dist/components/ds-agent-activity.js +1 -1
  28. package/dist/components/ds-agent-questionnaire.d.ts +24 -0
  29. package/dist/components/ds-agent-questionnaire.js +2 -0
  30. package/dist/components/ds-agent-questionnaire.js.map +1 -0
  31. package/dist/components/ds-agent-response.js +1 -1
  32. package/dist/components/ds-agent-response.js.map +1 -1
  33. package/dist/components/ds-agent-source-list.js +1 -1
  34. package/dist/components/ds-agent-tool-call.js +1 -1
  35. package/dist/components/ds-attachment-list.js +1 -1
  36. package/dist/components/ds-badge.js +1 -1
  37. package/dist/components/ds-banner.js +1 -1
  38. package/dist/components/ds-bar-nav.js +1 -1
  39. package/dist/components/ds-bar-title.js +1 -1
  40. package/dist/components/ds-bar-workflow.js +1 -1
  41. package/dist/components/ds-breadcrumb.js +1 -1
  42. package/dist/components/ds-button-filled.js +1 -1
  43. package/dist/components/ds-button-unfilled.js +1 -1
  44. package/dist/components/ds-card-chart.js +1 -1
  45. package/dist/components/ds-card-overview.js +1 -1
  46. package/dist/components/ds-card-overview.js.map +1 -1
  47. package/dist/components/ds-card-setting.js +1 -1
  48. package/dist/components/ds-chart-legend.js +1 -1
  49. package/dist/components/ds-chart-legend.js.map +1 -1
  50. package/dist/components/ds-chart.js +1 -1
  51. package/dist/components/ds-chart.js.map +1 -1
  52. package/dist/components/ds-checkbox.js +1 -1
  53. package/dist/components/ds-chip.js +1 -1
  54. package/dist/components/ds-chip.js.map +1 -1
  55. package/dist/components/ds-code-block.js +1 -1
  56. package/dist/components/ds-conversation-list-item.js +1 -1
  57. package/dist/components/ds-conversation-list-item.js.map +1 -1
  58. package/dist/components/ds-conversation-list-section.js +1 -1
  59. package/dist/components/ds-conversation-list.js +1 -1
  60. package/dist/components/ds-divider.js +1 -1
  61. package/dist/components/ds-empty-state.js +1 -1
  62. package/dist/components/ds-field.js +1 -1
  63. package/dist/components/ds-input.js +1 -1
  64. package/dist/components/ds-input.js.map +1 -1
  65. package/dist/components/ds-markdown.js +1 -1
  66. package/dist/components/ds-menu.js +1 -1
  67. package/dist/components/ds-message-actions.js +1 -1
  68. package/dist/components/ds-message-bubble.js +1 -1
  69. package/dist/components/ds-message-bubble.js.map +1 -1
  70. package/dist/components/ds-message-composer.js +1 -1
  71. package/dist/components/ds-message-composer.js.map +1 -1
  72. package/dist/components/ds-message-scroller.js +1 -1
  73. package/dist/components/ds-message-scroller.js.map +1 -1
  74. package/dist/components/ds-message.js +1 -1
  75. package/dist/components/ds-mobile-bar-nav.js +1 -1
  76. package/dist/components/ds-mobile-header.js +1 -1
  77. package/dist/components/ds-mobile-section-switcher.js +1 -1
  78. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  79. package/dist/components/ds-modal.js +1 -1
  80. package/dist/components/ds-panel-nav.js +1 -1
  81. package/dist/components/ds-panel-sub-nav.js +1 -1
  82. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  83. package/dist/components/ds-panel-tool-header.js +1 -1
  84. package/dist/components/ds-panel-tool-search.js +1 -1
  85. package/dist/components/ds-panel-tools.js +1 -1
  86. package/dist/components/ds-radio.js +1 -1
  87. package/dist/components/ds-radio.js.map +1 -1
  88. package/dist/components/ds-scroll-overlay.js +1 -1
  89. package/dist/components/ds-select.js +1 -1
  90. package/dist/components/ds-select.js.map +1 -1
  91. package/dist/components/ds-shell-app.js +1 -1
  92. package/dist/components/ds-shell-app.js.map +1 -1
  93. package/dist/components/ds-shell-page.js +1 -1
  94. package/dist/components/ds-shell-tools.js +1 -1
  95. package/dist/components/ds-skeleton.js +1 -1
  96. package/dist/components/ds-slider.js +1 -1
  97. package/dist/components/ds-slider.js.map +1 -1
  98. package/dist/components/ds-swatch-picker.js +1 -1
  99. package/dist/components/ds-switch.js +1 -1
  100. package/dist/components/ds-tab-group.js +1 -1
  101. package/dist/components/ds-table.js +1 -1
  102. package/dist/components/ds-table.js.map +1 -1
  103. package/dist/components/ds-tag.js +1 -1
  104. package/dist/components/ds-text.js +1 -1
  105. package/dist/components/ds-toast.js +1 -1
  106. package/dist/components/ds-tooltip-chart.js +1 -1
  107. package/dist/components/ds-tooltip.js +1 -1
  108. package/dist/components/ds-typing-indicator.js +1 -1
  109. package/dist/components/index.d.ts +10 -0
  110. package/dist/components/{p-PQgDzzn9.js → p-00or0yGw.js} +2 -2
  111. package/dist/components/p-B2SoinWf.js +2 -0
  112. package/dist/components/p-B2SoinWf.js.map +1 -0
  113. package/dist/components/{p-C5ecLNZA.js → p-B53Vpuqq.js} +2 -2
  114. package/dist/components/{p-BULWzaBs.js → p-B69Re7HW.js} +2 -2
  115. package/dist/components/{p-CeyoHpPn.js → p-B94M62Tx.js} +2 -2
  116. package/dist/components/p-BAAjiAIF.js +2 -0
  117. package/dist/components/p-BAAjiAIF.js.map +1 -0
  118. package/dist/components/p-BMAZWEDa.js +2 -0
  119. package/dist/components/p-BMAZWEDa.js.map +1 -0
  120. package/dist/components/p-BMc0DE59.js +2 -0
  121. package/dist/components/p-BMc0DE59.js.map +1 -0
  122. package/dist/components/{p-B6z51yBf.js → p-BNkU9dcc.js} +2 -2
  123. package/dist/components/p-BPbE-Kbl.js +2 -0
  124. package/dist/components/p-BPbE-Kbl.js.map +1 -0
  125. package/dist/components/{p-B6linhwY.js → p-BRze4tRe.js} +2 -2
  126. package/dist/components/p-BtUgncSJ.js +2 -0
  127. package/dist/components/p-BtUgncSJ.js.map +1 -0
  128. package/dist/components/p-BxR8omPQ.js +2 -0
  129. package/dist/components/p-BxR8omPQ.js.map +1 -0
  130. package/dist/components/p-C891ueIx.js +2 -0
  131. package/dist/components/p-C891ueIx.js.map +1 -0
  132. package/dist/components/{p-CY19gMiz.js → p-CJq3n5kA.js} +2 -2
  133. package/dist/components/p-CKo3OFG1.js +2 -0
  134. package/dist/components/p-CKo3OFG1.js.map +1 -0
  135. package/dist/components/p-CMbcRN92.js +2 -0
  136. package/dist/components/{p-cPh32CFB.js.map → p-CMbcRN92.js.map} +1 -1
  137. package/dist/components/p-CXduurfd.js.map +1 -1
  138. package/dist/components/{p-DLwM1RNL.js → p-CdKz-QT2.js} +2 -2
  139. package/dist/components/p-CdKz-QT2.js.map +1 -0
  140. package/dist/components/p-CnIvWEVm.js +2 -0
  141. package/dist/components/{p-BPS17WvI.js.map → p-CnIvWEVm.js.map} +1 -1
  142. package/dist/components/p-CnUq7E8S.js +2 -0
  143. package/dist/components/{p-DyDkQ8H9.js.map → p-CnUq7E8S.js.map} +1 -1
  144. package/dist/components/{p-C9StMCWg.js → p-Cohb8T7G.js} +2 -2
  145. package/dist/components/p-CqDJRVT8.js +2 -0
  146. package/dist/components/p-CqDJRVT8.js.map +1 -0
  147. package/dist/components/p-CsXC1cHI.js +2 -0
  148. package/dist/components/{p-DYAQVvOu.js.map → p-CsXC1cHI.js.map} +1 -1
  149. package/dist/components/p-D4j0deyd.js +2 -0
  150. package/dist/components/{p-DAM4CDXT.js.map → p-D4j0deyd.js.map} +1 -1
  151. package/dist/components/p-D5sIwLjA.js +2 -0
  152. package/dist/components/p-D5sIwLjA.js.map +1 -0
  153. package/dist/components/p-D9CDoQBx.js +2 -0
  154. package/dist/components/{p-C-aCs6ID.js.map → p-D9CDoQBx.js.map} +1 -1
  155. package/dist/components/p-D9FdOR_m.js +2 -0
  156. package/dist/components/{p-BSdAFIcG.js.map → p-D9FdOR_m.js.map} +1 -1
  157. package/dist/components/p-DStd98dM.js +2 -0
  158. package/dist/components/{p-Azjx2SsL.js.map → p-DStd98dM.js.map} +1 -1
  159. package/dist/components/p-Dbobj7DI.js +2 -0
  160. package/dist/components/p-Dbobj7DI.js.map +1 -0
  161. package/dist/components/{p-BNiIyZCn.js → p-Dhx_3_tf.js} +2 -2
  162. package/dist/components/p-Dhx_3_tf.js.map +1 -0
  163. package/dist/components/p-DrvEhJhO.js +2 -0
  164. package/dist/components/p-DrvEhJhO.js.map +1 -0
  165. package/dist/components/p-DyqLVdJp.js +2 -0
  166. package/dist/components/{p-CCYgBUUS.js.map → p-DyqLVdJp.js.map} +1 -1
  167. package/dist/components/p-GWUTrIlk.js +2 -0
  168. package/dist/components/p-GWUTrIlk.js.map +1 -0
  169. package/dist/components/p-NQOI5gN1.js +2 -0
  170. package/dist/components/p-NQOI5gN1.js.map +1 -0
  171. package/dist/components/p-Qf-os3lG.js +2 -0
  172. package/dist/components/{p-B8HG9OFh.js.map → p-Qf-os3lG.js.map} +1 -1
  173. package/dist/components/{p-DMJEOAwP.js → p-chA2WA5x.js} +2 -2
  174. package/dist/components/{p-DwKC_9u2.js → p-dEouiXJ8.js} +2 -2
  175. package/dist/components/p-m5CSrx_s.js +2 -0
  176. package/dist/components/{p-B1JB0Zn-.js.map → p-m5CSrx_s.js.map} +1 -1
  177. package/dist/docs/components.json +964 -11
  178. package/dist/lib/components/ShellApp/shell-app-types.d.ts +12 -0
  179. package/dist/lib/utils/index.js +41 -4
  180. package/dist/lib/utils/index.js.map +2 -2
  181. package/dist/lib/utils/resolve-css-length-px.d.ts +1 -1
  182. package/dist/mcp-data/registry/agent-activity.json +1 -1
  183. package/dist/mcp-data/registry/agent-questionnaire.json +273 -0
  184. package/dist/mcp-data/registry/agent-response.json +32 -11
  185. package/dist/mcp-data/registry/agent-source-list.json +33 -13
  186. package/dist/mcp-data/registry/agent-tool-call.json +59 -18
  187. package/dist/mcp-data/registry/attachment-list.json +1 -1
  188. package/dist/mcp-data/registry/avatar.json +1 -1
  189. package/dist/mcp-data/registry/badge.json +1 -1
  190. package/dist/mcp-data/registry/banner.json +1 -1
  191. package/dist/mcp-data/registry/bar-nav.json +2 -2
  192. package/dist/mcp-data/registry/bar-title.json +39 -4
  193. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  194. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  195. package/dist/mcp-data/registry/button-filled.json +1 -1
  196. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  197. package/dist/mcp-data/registry/card-chart.json +1 -1
  198. package/dist/mcp-data/registry/card-overview.json +1 -1
  199. package/dist/mcp-data/registry/card-setting.json +1 -1
  200. package/dist/mcp-data/registry/chart-legend.json +2 -2
  201. package/dist/mcp-data/registry/chart.json +2 -2
  202. package/dist/mcp-data/registry/checkbox.json +26 -9
  203. package/dist/mcp-data/registry/chip.json +2 -2
  204. package/dist/mcp-data/registry/code-block.json +14 -6
  205. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  206. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  207. package/dist/mcp-data/registry/conversation-list.json +1 -1
  208. package/dist/mcp-data/registry/divider.json +1 -1
  209. package/dist/mcp-data/registry/empty-state.json +1 -1
  210. package/dist/mcp-data/registry/field.json +1 -1
  211. package/dist/mcp-data/registry/icon.json +1 -1
  212. package/dist/mcp-data/registry/input.json +1 -1
  213. package/dist/mcp-data/registry/loader.json +1 -1
  214. package/dist/mcp-data/registry/markdown.json +1 -1
  215. package/dist/mcp-data/registry/menu.json +2 -2
  216. package/dist/mcp-data/registry/message-actions.json +1 -1
  217. package/dist/mcp-data/registry/message-bubble.json +2 -2
  218. package/dist/mcp-data/registry/message-composer.json +30 -8
  219. package/dist/mcp-data/registry/message-scroller.json +17 -9
  220. package/dist/mcp-data/registry/message.json +1 -1
  221. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  222. package/dist/mcp-data/registry/mobile-header.json +1 -1
  223. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  224. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  225. package/dist/mcp-data/registry/modal.json +1 -1
  226. package/dist/mcp-data/registry/panel-nav.json +2 -2
  227. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  228. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  229. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  230. package/dist/mcp-data/registry/panel-tools.json +2 -2
  231. package/dist/mcp-data/registry/radio.json +24 -11
  232. package/dist/mcp-data/registry/registry.json +303 -69
  233. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  234. package/dist/mcp-data/registry/select.json +2 -2
  235. package/dist/mcp-data/registry/shell-app.json +5 -5
  236. package/dist/mcp-data/registry/shell-page.json +78 -5
  237. package/dist/mcp-data/registry/shell-tools.json +1 -1
  238. package/dist/mcp-data/registry/skeleton.json +1 -1
  239. package/dist/mcp-data/registry/slider.json +2 -2
  240. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  241. package/dist/mcp-data/registry/switch.json +2 -2
  242. package/dist/mcp-data/registry/tab-group.json +1 -1
  243. package/dist/mcp-data/registry/table.json +89 -13
  244. package/dist/mcp-data/registry/tag.json +1 -1
  245. package/dist/mcp-data/registry/text.json +2 -2
  246. package/dist/mcp-data/registry/toast.json +1 -1
  247. package/dist/mcp-data/registry/tooltip-chart.json +5 -3
  248. package/dist/mcp-data/registry/tooltip.json +1 -1
  249. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  250. package/dist/react/components.d.ts +1 -0
  251. package/dist/react/components.js +1 -0
  252. package/dist/react/ds-agent-questionnaire.d.ts +13 -0
  253. package/dist/react/ds-agent-questionnaire.js +15 -0
  254. package/dist/react/ds-agent-source-list.d.ts +7 -2
  255. package/dist/react/ds-agent-source-list.js +1 -1
  256. package/dist/react/ds-agent-tool-call.d.ts +7 -2
  257. package/dist/react/ds-agent-tool-call.js +1 -1
  258. package/dist/styles/prose.css +21 -4
  259. package/dist/styles/table.css +161 -10
  260. package/dist/types/components/AgentQuestionnaire/AgentQuestionnaire.d.ts +49 -0
  261. package/dist/types/components/AgentQuestionnaire/agent-questionnaire-model.d.ts +13 -0
  262. package/dist/types/components/AgentResponse/AgentResponse.d.ts +3 -1
  263. package/dist/types/components/AgentSourceList/AgentSourceList.d.ts +5 -0
  264. package/dist/types/components/AgentToolCall/AgentToolCall.d.ts +21 -0
  265. package/dist/types/components/BarTitle/BarTitle.d.ts +5 -0
  266. package/dist/types/components/Checkbox/Checkbox.d.ts +3 -0
  267. package/dist/types/components/MessageComposer/MessageComposer.d.ts +3 -0
  268. package/dist/types/components/MessageScroller/MessageScroller.d.ts +21 -1
  269. package/dist/types/components/Radio/Radio.d.ts +4 -0
  270. package/dist/types/components/ShellApp/shell-app-types.d.ts +12 -0
  271. package/dist/types/components/ShellPage/ShellPage.d.ts +9 -0
  272. package/dist/types/components/Table/Table.d.ts +30 -0
  273. package/dist/types/components/Table/table-cell-model.d.ts +2 -0
  274. package/dist/types/components/Table/table-layout-controller.d.ts +6 -0
  275. package/dist/types/components/Table/table-types.d.ts +3 -0
  276. package/dist/types/components/Table/table-viewport-fit-controller.d.ts +53 -0
  277. package/dist/types/components/conversation-types.d.ts +51 -2
  278. package/dist/types/components.d.ts +249 -2
  279. package/dist/types/utils/resolve-css-length-px.d.ts +1 -1
  280. package/package.json +5 -3
  281. package/dist/components/p-Azjx2SsL.js +0 -2
  282. package/dist/components/p-B1JB0Zn-.js +0 -2
  283. package/dist/components/p-B2t8alvH.js +0 -2
  284. package/dist/components/p-B2t8alvH.js.map +0 -1
  285. package/dist/components/p-B8HG9OFh.js +0 -2
  286. package/dist/components/p-BJMRBHKW.js +0 -2
  287. package/dist/components/p-BJMRBHKW.js.map +0 -1
  288. package/dist/components/p-BJVzrR_P.js +0 -2
  289. package/dist/components/p-BJVzrR_P.js.map +0 -1
  290. package/dist/components/p-BL0JHLJp.js +0 -2
  291. package/dist/components/p-BL0JHLJp.js.map +0 -1
  292. package/dist/components/p-BNiIyZCn.js.map +0 -1
  293. package/dist/components/p-BPS17WvI.js +0 -2
  294. package/dist/components/p-BSdAFIcG.js +0 -2
  295. package/dist/components/p-C-aCs6ID.js +0 -2
  296. package/dist/components/p-CCYgBUUS.js +0 -2
  297. package/dist/components/p-CE82aQZr.js +0 -2
  298. package/dist/components/p-CE82aQZr.js.map +0 -1
  299. package/dist/components/p-COmqMfQo.js +0 -2
  300. package/dist/components/p-COmqMfQo.js.map +0 -1
  301. package/dist/components/p-Ch5yT3UA.js +0 -2
  302. package/dist/components/p-Ch5yT3UA.js.map +0 -1
  303. package/dist/components/p-CiUciD5Z.js +0 -2
  304. package/dist/components/p-CiUciD5Z.js.map +0 -1
  305. package/dist/components/p-D6g070eY.js +0 -2
  306. package/dist/components/p-D6g070eY.js.map +0 -1
  307. package/dist/components/p-DAM4CDXT.js +0 -2
  308. package/dist/components/p-DLwM1RNL.js.map +0 -1
  309. package/dist/components/p-DYAQVvOu.js +0 -2
  310. package/dist/components/p-DmblUQ4D.js +0 -2
  311. package/dist/components/p-DmblUQ4D.js.map +0 -1
  312. package/dist/components/p-DyDkQ8H9.js +0 -2
  313. package/dist/components/p-Dz3Ufmr4.js +0 -2
  314. package/dist/components/p-Dz3Ufmr4.js.map +0 -1
  315. package/dist/components/p-cPh32CFB.js +0 -2
  316. package/dist/components/p-fkQhr5s9.js +0 -2
  317. package/dist/components/p-fkQhr5s9.js.map +0 -1
  318. package/dist/components/p-oOKTL-yx.js +0 -2
  319. package/dist/components/p-oOKTL-yx.js.map +0 -1
  320. /package/dist/components/{p-PQgDzzn9.js.map → p-00or0yGw.js.map} +0 -0
  321. /package/dist/components/{p-C5ecLNZA.js.map → p-B53Vpuqq.js.map} +0 -0
  322. /package/dist/components/{p-BULWzaBs.js.map → p-B69Re7HW.js.map} +0 -0
  323. /package/dist/components/{p-CeyoHpPn.js.map → p-B94M62Tx.js.map} +0 -0
  324. /package/dist/components/{p-B6z51yBf.js.map → p-BNkU9dcc.js.map} +0 -0
  325. /package/dist/components/{p-B6linhwY.js.map → p-BRze4tRe.js.map} +0 -0
  326. /package/dist/components/{p-CY19gMiz.js.map → p-CJq3n5kA.js.map} +0 -0
  327. /package/dist/components/{p-C9StMCWg.js.map → p-Cohb8T7G.js.map} +0 -0
  328. /package/dist/components/{p-DMJEOAwP.js.map → p-chA2WA5x.js.map} +0 -0
  329. /package/dist/components/{p-DwKC_9u2.js.map → p-dEouiXJ8.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.14.0",
4
+ "packageVersion": "13.16.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": {
@@ -992,7 +1147,8 @@
992
1147
  "Dividers in sections or actions create separate Menu groups without becoming selectable rows.",
993
1148
  "The overflow trigger uses its bordered treatment whenever the primary action is visible beside it; overflow-only and auto-collapsed-primary presentations keep the trigger borderless.",
994
1149
  "expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 32px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
995
- "primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts."
1150
+ "primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts.",
1151
+ "showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants."
996
1152
  ],
997
1153
  "responsiveBehavior": [
998
1154
  "BarTitle does not observe viewport, shell, scroll, or container state. Its owner selects an explicit variant.",
@@ -1080,6 +1236,14 @@
1080
1236
  "type": "boolean",
1081
1237
  "required": false
1082
1238
  },
1239
+ "showCompactDivider": {
1240
+ "type": "boolean",
1241
+ "required": false
1242
+ },
1243
+ "showDivider": {
1244
+ "type": "boolean",
1245
+ "required": false
1246
+ },
1083
1247
  "value": {
1084
1248
  "type": "string",
1085
1249
  "required": false
@@ -2518,12 +2682,12 @@
2518
2682
  "tag": "ds-checkbox",
2519
2683
  "name": "checkbox",
2520
2684
  "title": "Checkbox",
2521
- "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2685
+ "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with optional supporting description, checked, unchecked, mixed, and four density states.",
2522
2686
  "intentStatus": "complete",
2523
2687
  "intent": {
2524
2688
  "audience": "general",
2525
2689
  "status": "stable",
2526
- "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with checked, unchecked, mixed, and four density states.",
2690
+ "summary": "Form-associated checkbox for independent choices, acknowledgment, or consent, with optional supporting description, checked, unchecked, mixed, and four density states.",
2527
2691
  "useWhen": [
2528
2692
  "A user may independently select zero or more choices.",
2529
2693
  "A form requires acknowledgment, consent, or an opt-in value before submission.",
@@ -2557,7 +2721,7 @@
2557
2721
  "component:ds-text"
2558
2722
  ],
2559
2723
  "accessibility": [
2560
- "Every interactive checkbox requires a visible label that provides its accessible name.",
2724
+ "Every interactive checkbox requires a visible label that provides its accessible name; an optional visible description is associated as supporting context.",
2561
2725
  "Enter and Space activate the checkbox; checked and mixed state are exposed through aria-checked.",
2562
2726
  "Disabled and inactive checkboxes leave the tab order and are omitted from form submission.",
2563
2727
  "Use presentation mode only inside a composite option that owns selection semantics, focus, and interaction."
@@ -2567,16 +2731,17 @@
2567
2731
  "Activating an indeterminate checkbox clears the mixed state, toggles checked, and emits dsChange with the resulting boolean.",
2568
2732
  "The initial checked and indeterminate values are restored by native form reset; checked values submit under name and unchecked values submit nothing.",
2569
2733
  "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.",
2570
- "Presentation mode removes checkbox semantics, focus, interaction, label rendering, and form submission while preserving the visual state."
2734
+ "Presentation mode removes checkbox semantics, focus, interaction, label rendering, description rendering, and form submission while preserving the visual state.",
2735
+ "Description-rich checkboxes grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
2571
2736
  ],
2572
2737
  "responsiveBehavior": [
2573
- "Choose size from the density of the containing row; labels may wrap while the placement box stays fixed.",
2738
+ "Choose size from the density of the containing row; labels and descriptions may wrap while the placement box stays fixed.",
2574
2739
  "Use the same density as the shared option icon zone in multi-select rows."
2575
2740
  ],
2576
2741
  "frameworkCaveats": {
2577
2742
  "customElements": [
2578
2743
  "Bind checked and indeterminate as properties for application state updates and listen for dsChange.",
2579
- "Use the form attribute on the host when associating a checkbox rendered outside its owning form."
2744
+ "Use the form attribute on the host when associating a checkbox rendered outside its owning form or isolating it from an ancestor form."
2580
2745
  ],
2581
2746
  "react": [
2582
2747
  "Use DsCheckbox and handle onDsChange; checked and indeterminate are mutable and update after user activation."
@@ -2602,6 +2767,10 @@
2602
2767
  "type": "boolean",
2603
2768
  "required": false
2604
2769
  },
2770
+ "description": {
2771
+ "type": "string",
2772
+ "required": false
2773
+ },
2605
2774
  "disabled": {
2606
2775
  "type": "boolean",
2607
2776
  "required": false
@@ -2801,12 +2970,12 @@
2801
2970
  "tag": "ds-code-block",
2802
2971
  "name": "code-block",
2803
2972
  "title": "CodeBlock",
2804
- "summary": "Scrollable monospace code surface with optional language or filename context and copy action.",
2973
+ "summary": "Scrollable code surface with optional language or filename context and copy action.",
2805
2974
  "intentStatus": "complete",
2806
2975
  "intent": {
2807
2976
  "audience": "general",
2808
2977
  "status": "experimental",
2809
- "summary": "Scrollable monospace code surface with optional language or filename context and copy action.",
2978
+ "summary": "Scrollable code surface with optional language or filename context and copy action.",
2810
2979
  "useWhen": [
2811
2980
  "A message or document displays fenced code that readers may copy."
2812
2981
  ],
@@ -2819,7 +2988,11 @@
2819
2988
  ],
2820
2989
  "accessibility": [
2821
2990
  "The copy action has matching accessible-name and visible-tooltip status wording, and the code remains selectable text.",
2822
- "Language and filename labels supplement rather than replace the code content."
2991
+ "Language and filename labels supplement rather than replace the code content.",
2992
+ "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."
2993
+ ],
2994
+ "states": [
2995
+ "Applications load font assets once at their root. The component consumes --typography-font-family-code and never fetches or packages a font."
2823
2996
  ],
2824
2997
  "responsiveBehavior": [
2825
2998
  "Long lines scroll horizontally and do not widen the owning transcript."
@@ -2827,7 +3000,11 @@
2827
3000
  "references": [
2828
3001
  {
2829
3002
  "label": "Storybook examples",
2830
- "path": "src/wc/components/MessageScroller/MessageScroller.stories.ts"
3003
+ "path": "src/wc/components/CodeBlock/CodeBlock.stories.ts"
3004
+ },
3005
+ {
3006
+ "label": "Font ownership and loading",
3007
+ "path": "docs/font-ownership.md"
2831
3008
  }
2832
3009
  ]
2833
3010
  },
@@ -4426,12 +4603,12 @@
4426
4603
  "tag": "ds-message-composer",
4427
4604
  "name": "message-composer",
4428
4605
  "title": "MessageComposer",
4429
- "summary": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
4606
+ "summary": "Two-line auto-growing conversation textarea with submit, stop, an attached submission-error support surface, and extensible tool, action, and error-recovery regions.",
4430
4607
  "intentStatus": "complete",
4431
4608
  "intent": {
4432
4609
  "audience": "general",
4433
4610
  "status": "experimental",
4434
- "summary": "Two-line auto-growing conversation textarea with submit, stop, error, and extensible leading-tool or trailing-action regions.",
4611
+ "summary": "Two-line auto-growing conversation textarea with submit, stop, an attached submission-error support surface, and extensible tool, action, and error-recovery regions.",
4435
4612
  "useWhen": [
4436
4613
  "A conversation accepts multi-line text and needs Enter-to-submit with a streaming stop action."
4437
4614
  ],
@@ -4449,14 +4626,17 @@
4449
4626
  "accessibility": [
4450
4627
  "Always provide a localized textarea label and submit or stop action names; the built-in icon action exposes the same name in its tooltip.",
4451
4628
  "Shift plus Enter inserts a newline while Enter submits non-empty content.",
4452
- "Streaming and error states remain perceivable without relying on icon shape alone."
4629
+ "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.",
4630
+ "Streaming and error states remain perceivable without relying on icon shape or color alone."
4453
4631
  ],
4454
4632
  "states": [
4455
4633
  "The owner controls draft value and transport state; the composer emits intent without performing transport.",
4634
+ "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.",
4456
4635
  "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.",
4457
4636
  "The composer surface uses the 10px --dimension-radius-125 token.",
4458
4637
  "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.",
4459
- "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."
4638
+ "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.",
4639
+ "The attached error unit keeps a real boundary in forced colors and lets message text and application-owned recovery actions wrap at narrow widths."
4460
4640
  ],
4461
4641
  "responsiveBehavior": [
4462
4642
  "The textarea begins at two body-medium lines, grows one line at a time through six lines, and then scrolls internally."
@@ -4474,6 +4654,10 @@
4474
4654
  },
4475
4655
  "api": {
4476
4656
  "props": {
4657
+ "errorMessage": {
4658
+ "type": "string",
4659
+ "required": false
4660
+ },
4477
4661
  "isInactive": {
4478
4662
  "type": "boolean",
4479
4663
  "required": false
@@ -4522,11 +4706,14 @@
4522
4706
  },
4523
4707
  "dependencies": [
4524
4708
  "@ds-mo/ui",
4525
- "@ds-mo/tokens"
4709
+ "@ds-mo/tokens",
4710
+ "@ds-mo/icons"
4526
4711
  ],
4527
4712
  "componentDependencies": [
4528
4713
  "button-filled",
4529
4714
  "button-unfilled",
4715
+ "icon",
4716
+ "text",
4530
4717
  "tooltip"
4531
4718
  ]
4532
4719
  },
@@ -4535,12 +4722,12 @@
4535
4722
  "tag": "ds-message-scroller",
4536
4723
  "name": "message-scroller",
4537
4724
  "title": "MessageScroller",
4538
- "summary": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
4725
+ "summary": "Focusable transcript scroller with turn anchoring, reader-controlled live-edge following, and a measured interaction-plus-composer overlay stack.",
4539
4726
  "intentStatus": "complete",
4540
4727
  "intent": {
4541
4728
  "audience": "general",
4542
4729
  "status": "experimental",
4543
- "summary": "Focusable transcript scroller that follows the live edge only while the reader remains there.",
4730
+ "summary": "Focusable transcript scroller with turn anchoring, reader-controlled live-edge following, and a measured interaction-plus-composer overlay stack.",
4544
4731
  "useWhen": [
4545
4732
  "Messages can append or stream and transcript position must remain respectful of reader intent."
4546
4733
  ],
@@ -4549,10 +4736,12 @@
4549
4736
  ],
4550
4737
  "commonlyComposedWith": [
4551
4738
  "component:ds-message",
4552
- "component:ds-message-composer"
4739
+ "component:ds-message-composer",
4740
+ "component:ds-agent-questionnaire"
4553
4741
  ],
4554
4742
  "patterns": [
4555
- "pattern:conversation"
4743
+ "pattern:conversation",
4744
+ "pattern:agent-chat"
4556
4745
  ],
4557
4746
  "accessibility": [
4558
4747
  "Give each transcript a concise localized label.",
@@ -4560,11 +4749,12 @@
4560
4749
  "The scroll-to-latest control remains keyboard accessible when follow behavior is released and exposes its action name in a tooltip."
4561
4750
  ],
4562
4751
  "states": [
4563
- "Selection and transcript interaction release automatic following.",
4752
+ "Wheel, touch, keyboard navigation, selection, and transcript interaction release automatic following; Scroll to latest explicitly restores it.",
4753
+ "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.",
4564
4754
  "Opening saved history, message jumps, and prepended history preserve deliberate position.",
4565
4755
  "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.",
4566
4756
  "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.",
4567
- "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."
4757
+ "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."
4568
4758
  ],
4569
4759
  "responsiveBehavior": [
4570
4760
  "Transcript width is readable while the scroll region fills available height.",
@@ -6062,12 +6252,12 @@
6062
6252
  "tag": "ds-radio",
6063
6253
  "name": "radio",
6064
6254
  "title": "Radio",
6065
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6255
+ "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.",
6066
6256
  "intentStatus": "complete",
6067
6257
  "intent": {
6068
6258
  "audience": "general",
6069
6259
  "status": "stable",
6070
- "summary": "Form-associated one-of-many radio selection set with vertical or horizontal layout, four densities, per-option inactive state, and roving keyboard focus.",
6260
+ "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.",
6071
6261
  "useWhen": [
6072
6262
  "A user must select exactly one visible option from a small set.",
6073
6263
  "All available choices should remain visible for comparison.",
@@ -6101,19 +6291,20 @@
6101
6291
  ],
6102
6292
  "accessibility": [
6103
6293
  "The host exposes radiogroup semantics and requires an accessible group name from aria-label or aria-labelledby.",
6104
- "Each visible option exposes radio semantics, its checked state, its label text, and any inactive state.",
6294
+ "Each visible option exposes radio semantics, its checked state, its label text, optional supporting description, and any inactive state.",
6105
6295
  "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.",
6106
- "Roving tabindex keeps one active option in the tab order, preferring the selected option."
6296
+ "Roving tabindex keeps one active option in the tab order, preferring the selected option; setFocus uses that same public focus target."
6107
6297
  ],
6108
6298
  "states": [
6109
6299
  "Unchecked circles use a tertiary-foreground inset stroke: 1.5px at lg, 1.25px at md, 1px at sm, and 0.75px at xs.",
6110
6300
  "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.",
6111
6301
  "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.",
6112
- "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."
6302
+ "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.",
6303
+ "Description-rich options grow beyond the fixed density height while retaining its minimum target size and primitive-owned selection anatomy."
6113
6304
  ],
6114
6305
  "responsiveBehavior": [
6115
6306
  "Choose size from the density of the containing form or settings row.",
6116
- "Prefer vertical layout when labels may wrap or horizontal space is constrained; horizontal layout is appropriate for short labels in a small set."
6307
+ "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."
6117
6308
  ],
6118
6309
  "frameworkCaveats": {
6119
6310
  "customElements": [
@@ -6616,7 +6807,7 @@
6616
6807
  "Replace navigation and pageChrome together from one completed route state.",
6617
6808
  "When pageChrome.showBack marks a detail depth, mobile chrome keeps the page heading as its identity and presents only local subsections; peer route tabs remain in desktop BarNav rather than replacing the detail heading.",
6618
6809
  "Managed ShellApp keeps BarNav and ShellPage presentations present and owns page header stickiness and the content scroller.",
6619
- "Route-owned pageChrome selects ShellPage contentInset and contentSurface independently; ShellApp forwards both without making page-specific layout or surface decisions.",
6810
+ "Route-owned pageChrome independently selects ShellPage contentInset, roomy and compact top seams, scroll compaction, expanded and compact header-divider visibility, and contentSurface; ShellApp forwards them without making page-specific layout or surface decisions.",
6620
6811
  "The application filters unauthorized destinations, sections, and tools before passing them into shell components."
6621
6812
  ],
6622
6813
  "responsiveBehavior": [
@@ -6792,12 +6983,12 @@
6792
6983
  "tag": "ds-shell-page",
6793
6984
  "name": "shell-page",
6794
6985
  "title": "ShellPage",
6795
- "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, stable scroll compaction, and independent page-content inset and canvas surface without creating a nested scroll container.",
6986
+ "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, optional scroll compaction, and independent page-content inset and canvas surface without creating a nested scroll container.",
6796
6987
  "intentStatus": "complete",
6797
6988
  "intent": {
6798
6989
  "audience": "general",
6799
6990
  "status": "stable",
6800
- "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, stable scroll compaction, and independent page-content inset and canvas surface without creating a nested scroll container.",
6991
+ "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, optional scroll compaction, and independent page-content inset and canvas surface without creating a nested scroll container.",
6801
6992
  "useWhen": [
6802
6993
  "Rendering a standard routed page inside ShellApp's default content region.",
6803
6994
  "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the application shell reports reduced capacity.",
@@ -6842,6 +7033,9 @@
6842
7033
  "headerPresentation=auto selects the matching header variant from headerCapacity and scroll position.",
6843
7034
  "expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
6844
7035
  "contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
7036
+ "contentInsetBlockStart=none removes only the gutter adjacent to the page header while retaining the responsive inline and bottom gutters.",
7037
+ "contentInsetBlockStartSize can provide an exact roomy top seam, while compactContentInsetBlockStartSize independently defines the compact and constrained seam. ShellPage exposes their resolved sticky-header offset through --ds-shell-page-content-block-start-offset for viewport-fitted descendants.",
7038
+ "scrollCompaction=false keeps a roomy header expanded and pinned during page scrolling; capacity changes still select compact or constrained variants.",
6845
7039
  "contentSurface=primary keeps the standard page canvas; secondary paints both the inset gutter and the canvas beneath routed content. Desktop and tablet BarTitle chrome matches that canvas in expanded, compact, and constrained presentations; MobileHeader remains primary.",
6846
7040
  "contentInset and contentSurface are independent: either surface supports standard responsive gutters or a full-bleed page-owned layout.",
6847
7041
  "The header slot accepts one desktop BarTitle or BarWorkflow; mobile-header accepts the corresponding MobileHeader presentation. The default slot owns router output and all page product content."
@@ -6849,10 +7043,12 @@
6849
7043
  "responsiveBehavior": [
6850
7044
  "The owning application shell resolves viewport and persistent-chrome state into the explicit headerCapacity prop; ShellPage never guesses the cause of reduced width from its own rendered size.",
6851
7045
  "Roomy capacity expands at the top and compacts after scroll; compact capacity stays compact; constrained capacity uses the constrained action layout.",
7046
+ "Pages with scrollCompaction=false keep roomy headers expanded while still responding to compact or constrained capacity from tools and breakpoints.",
6852
7047
  "A ShellPage-managed BarTitle remains concealed until headerCapacity is available and its rendered variant matches the resolved presentation, preventing a default-variant flash during route activation.",
6853
7048
  "responsiveMode=mobile hides and inerts the desktop header, exposes mobile-header, and disables desktop scroll-compaction geometry.",
6854
7049
  "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
6855
7050
  "The default content inset is balanced on every side: 32px in desktop mode and 16px in tablet and mobile modes.",
7051
+ "contentInsetBlockStart can independently remove the top gutter for table and canvas pages that should meet the sticky header; exact roomy and compact block-start sizes support pages whose seam changes with header capacity.",
6856
7052
  "The selected content surface persists unchanged across desktop, tablet, and mobile modes.",
6857
7053
  "On a secondary desktop or tablet page, BarTitle matches the page canvas across capacity and scroll-driven variant changes; the separate mobile-header presentation remains primary.",
6858
7054
  "The flow-preservation spacer follows contentSurface so compacting a secondary page cannot expose a primary strip before its content.",
@@ -6892,10 +7088,22 @@
6892
7088
  },
6893
7089
  "api": {
6894
7090
  "props": {
7091
+ "compactContentInsetBlockStartSize": {
7092
+ "type": "string",
7093
+ "required": false
7094
+ },
6895
7095
  "contentInset": {
6896
7096
  "type": "ShellPageContentInset",
6897
7097
  "required": false
6898
7098
  },
7099
+ "contentInsetBlockStart": {
7100
+ "type": "ShellPageContentInset",
7101
+ "required": false
7102
+ },
7103
+ "contentInsetBlockStartSize": {
7104
+ "type": "string",
7105
+ "required": false
7106
+ },
6899
7107
  "contentSurface": {
6900
7108
  "type": "ShellPageContentSurface",
6901
7109
  "required": false
@@ -6911,6 +7119,10 @@
6911
7119
  "responsiveMode": {
6912
7120
  "type": "ShellResponsiveMode",
6913
7121
  "required": false
7122
+ },
7123
+ "scrollCompaction": {
7124
+ "type": "boolean",
7125
+ "required": false
6914
7126
  }
6915
7127
  },
6916
7128
  "events": [],
@@ -7888,29 +8100,30 @@
7888
8100
  "component:ds-icon"
7889
8101
  ],
7890
8102
  "accessibility": [
7891
- "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.",
8103
+ "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 48px header bar renders as component chrome outside the horizontal scrollport. It defaults to a presentational caption title that does not duplicate the accessible name; application-owned labeled controls supplied through the named header slot replace that fallback. header-leading and header-trailing place actions in the matching compact-bar zones without transferring ownership of the bar's outer or copy padding to the application. Their slot outlets remain mounted so dynamically shown selection and filtering summaries cannot briefly enter the table's outer flow or move its frame.",
7892
8104
  "Sorting controls remain buttons inside column headers. Member-row sort uses aria-sort, while independent group order is described by the grouped header control.",
7893
8105
  "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.",
7894
8106
  "Interactive rows are focusable as native rows, activate with Enter or Space, and do not steal activation from their nested selection or action controls.",
7895
8107
  "Scrollable table regions become keyboard focusable and named only when overflow exists.",
7896
8108
  "Incremental loading, newly appended row counts, failures, and end-of-results transitions are announced through a polite status region without replacing visible state.",
7897
- "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."
8109
+ "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. The footer slot can replace that copy, while footer-leading and footer-trailing compose actions into the same compact-bar anatomy. Authored footer content can also opt into the 48px footer without controlled counts."
7898
8110
  ],
7899
8111
  "states": [
7900
- "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.",
7901
- "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.",
8112
+ "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. The optional header and footer slots are composable table-local bars: the component owns their 48px chrome, 8px outer inset, md copy-container padding, balanced text inset, action zones, and sticky placement while the application owns its controls, labels, filtering behavior, and action handling. Content-sized tables remain natural for sparse or fixed-count results. height bounds the complete header, frame, and footer composition. fitViewport reserves the compact-state composition height in the nearest vertical scrollport while growing the visible table into that reservation as surrounding page chrome collapses.",
8113
+ "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. With stickyHeader enabled, each section header scrolls with its group, pins directly below the column header when reached, and yields when the next section arrives. It also stays pinned to the visible horizontal scrollport and spans the smaller of the visible viewport or table width.",
7902
8114
  "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.",
7903
8115
  "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.",
7904
- "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.",
8116
+ "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, initial error, load-more, retry, loading-more, and terminal bands remain fixed to the visible table width while data columns scroll horizontally beneath them. Incremental loading retains existing rows and supports automatic sentinel, manual load-more, retry, and terminal states.",
7905
8117
  "Lazy loading replaces pagination. The application owns requests, cancellation, cursors, deduplication, appended records, and query identity; loadIdentity resets the component request guard.",
7906
8118
  "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.",
7907
8119
  "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.",
7908
- "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.",
8120
+ "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. Standard secondary copy defaults to the secondary foreground and may declare a semantic Text color when the application data carries intent; dual-primary copy keeps both tracks primary unless explicitly colored. 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.",
7909
8121
  "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."
7910
8122
  ],
7911
8123
  "responsiveBehavior": [
7912
8124
  "The table keeps native semantics at narrow widths and scrolls horizontally instead of transforming into cards.",
7913
- "stickyHeader follows the active vertical scroll owner: a maxHeight table keeps its native header inside the bounded table scrollport, while a document-flow table retains a semantic native header and renders a sticky control header whose columns follow the body's native inline scroll timeline. Consumers set --ds-table-sticky-header-offset when page chrome occupies the scrollport edge.",
8125
+ "stickyHeader follows the active vertical scroll owner: a maxHeight, height, or fitViewport table keeps its native header and group sections inside one bounded table scrollport, while a document-flow table retains a semantic native header and renders a sticky control header whose columns follow the body's native inline scroll timeline. Consumers set --ds-table-sticky-header-offset when page chrome occupies an unbounded document scrollport edge. When the 48px table header bar is visible, it sticks at that external offset and the column header stacks immediately below it.",
8126
+ "fitViewport uses viewportInsetBlockStart and viewportInsetBlockEnd to describe compact surrounding chrome and page gutters relative to the nearest vertical scroll owner. Before the table reaches that compact position, its host reserves the eventual height while the visible composition grows and vertical input remains owned by the outer page. Once settled, the internal table viewport becomes the vertical scroll owner. In both bounded and document-flow modes, native row-group headers remain the semantic source while one table-owned visual sticky lane is clamped to the active row group's ending boundary, so each incoming section pushes the previous section away without duplicate overlap.",
7914
8127
  "Without maxHeight the table grows the document and automatic lazy loading observes the browser viewport. Horizontal scrolling chains vertical wheel and trackpad movement to the page instead of trapping it.",
7915
8128
  "Explicit column sizes establish the horizontal overflow width; unsized columns share remaining space.",
7916
8129
  "Prefer the named xs through xl column sizes, which resolve through TokoMo's table-column width tokens; numeric pixel sizes remain an escape hatch for exceptional application-owned widths.",
@@ -7992,6 +8205,10 @@
7992
8205
  "type": "string",
7993
8206
  "required": false
7994
8207
  },
8208
+ "fitViewport": {
8209
+ "type": "boolean",
8210
+ "required": false
8211
+ },
7995
8212
  "grouping": {
7996
8213
  "type": "TableGroupingState | null",
7997
8214
  "required": false
@@ -8004,6 +8221,10 @@
8004
8221
  "type": "boolean",
8005
8222
  "required": false
8006
8223
  },
8224
+ "height": {
8225
+ "type": "string | number | undefined",
8226
+ "required": false
8227
+ },
8007
8228
  "lazyLoading": {
8008
8229
  "type": "boolean",
8009
8230
  "required": false
@@ -8087,6 +8308,14 @@
8087
8308
  "totalCount": {
8088
8309
  "type": "number | undefined",
8089
8310
  "required": false
8311
+ },
8312
+ "viewportInsetBlockEnd": {
8313
+ "type": "string | number",
8314
+ "required": false
8315
+ },
8316
+ "viewportInsetBlockStart": {
8317
+ "type": "string | number",
8318
+ "required": false
8090
8319
  }
8091
8320
  },
8092
8321
  "events": [
@@ -8818,6 +9047,8 @@
8818
9047
  "The owning chart mounts the callout when a local interaction starts and unmounts it when that interaction ends.",
8819
9048
  "Coordinate updates track within one mounted interaction session without restarting the show delay.",
8820
9049
  "Placement flips horizontally or vertically when the rendered callout approaches a viewport edge.",
9050
+ "The heading and rows use the same medium-density section-heading and control-frame anatomy as menu-style choice content.",
9051
+ "When any grouped row supplies a swatch, every row reserves the shared leading icon zone so mixed-swatch labels and trailing values stay aligned.",
8821
9052
  "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.",
8822
9053
  "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.",
8823
9054
  "Reduced motion preserves the final visible state without an opacity transition."