@ds-mo/ui 9.0.0 → 9.2.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 (385) hide show
  1. package/README.md +28 -0
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +397 -0
  4. package/dist/agent.json +2347 -735
  5. package/dist/angular/ds-agent-activity.d.ts +12 -0
  6. package/dist/angular/ds-agent-activity.js +38 -0
  7. package/dist/angular/ds-agent-response.d.ts +12 -0
  8. package/dist/angular/ds-agent-response.js +38 -0
  9. package/dist/angular/ds-agent-source-list.d.ts +12 -0
  10. package/dist/angular/ds-agent-source-list.js +38 -0
  11. package/dist/angular/ds-agent-tool-call.d.ts +12 -0
  12. package/dist/angular/ds-agent-tool-call.js +38 -0
  13. package/dist/angular/ds-attachment-list.d.ts +12 -0
  14. package/dist/angular/ds-attachment-list.js +38 -0
  15. package/dist/angular/ds-avatar.d.ts +12 -0
  16. package/dist/angular/ds-avatar.js +38 -0
  17. package/dist/angular/ds-code-block.d.ts +12 -0
  18. package/dist/angular/ds-code-block.js +38 -0
  19. package/dist/angular/ds-conversation-list-item.d.ts +19 -0
  20. package/dist/angular/ds-conversation-list-item.js +42 -0
  21. package/dist/angular/ds-conversation-list-section.d.ts +12 -0
  22. package/dist/angular/ds-conversation-list-section.js +38 -0
  23. package/dist/angular/ds-conversation-list.d.ts +12 -0
  24. package/dist/angular/ds-conversation-list.js +37 -0
  25. package/dist/angular/ds-markdown.d.ts +12 -0
  26. package/dist/angular/ds-markdown.js +38 -0
  27. package/dist/angular/ds-menu.d.ts +6 -1
  28. package/dist/angular/ds-menu.js +7 -4
  29. package/dist/angular/ds-message-bubble.d.ts +12 -0
  30. package/dist/angular/ds-message-bubble.js +38 -0
  31. package/dist/angular/ds-message-composer.d.ts +23 -0
  32. package/dist/angular/ds-message-composer.js +49 -0
  33. package/dist/angular/ds-message-scroller.d.ts +15 -0
  34. package/dist/angular/ds-message-scroller.js +43 -0
  35. package/dist/angular/ds-message.d.ts +12 -0
  36. package/dist/angular/ds-message.js +38 -0
  37. package/dist/angular/ds-panel-tool-header.d.ts +25 -0
  38. package/dist/angular/ds-panel-tool-header.js +49 -0
  39. package/dist/angular/ds-panel-tool-search.d.ts +19 -0
  40. package/dist/angular/ds-panel-tool-search.js +49 -0
  41. package/dist/angular/ds-panel-tools.d.ts +30 -1
  42. package/dist/angular/ds-panel-tools.js +14 -5
  43. package/dist/angular/ds-swatch-picker.d.ts +15 -0
  44. package/dist/angular/ds-swatch-picker.js +42 -0
  45. package/dist/angular/index.d.ts +1 -1
  46. package/dist/angular/index.js +18 -0
  47. package/dist/angular/proxies.d.ts +18 -0
  48. package/dist/angular/proxies.js +18 -0
  49. package/dist/components/ds-agent-activity.d.ts +11 -0
  50. package/dist/components/ds-agent-activity.js +2 -0
  51. package/dist/components/ds-agent-activity.js.map +1 -0
  52. package/dist/components/ds-agent-response.d.ts +11 -0
  53. package/dist/components/ds-agent-response.js +2 -0
  54. package/dist/components/ds-agent-response.js.map +1 -0
  55. package/dist/components/ds-agent-source-list.d.ts +11 -0
  56. package/dist/components/ds-agent-source-list.js +2 -0
  57. package/dist/components/ds-agent-source-list.js.map +1 -0
  58. package/dist/components/ds-agent-tool-call.d.ts +11 -0
  59. package/dist/components/ds-agent-tool-call.js +2 -0
  60. package/dist/components/ds-agent-tool-call.js.map +1 -0
  61. package/dist/components/ds-app-shell.js +1 -1
  62. package/dist/components/ds-app-shell.js.map +1 -1
  63. package/dist/components/ds-attachment-list.d.ts +11 -0
  64. package/dist/components/ds-attachment-list.js +2 -0
  65. package/dist/components/ds-attachment-list.js.map +1 -0
  66. package/dist/components/ds-avatar.d.ts +11 -0
  67. package/dist/components/ds-avatar.js +2 -0
  68. package/dist/components/ds-avatar.js.map +1 -0
  69. package/dist/components/ds-badge.js +1 -1
  70. package/dist/components/ds-banner.js +1 -1
  71. package/dist/components/ds-bar-nav.js +1 -1
  72. package/dist/components/ds-bar-nav.js.map +1 -1
  73. package/dist/components/ds-button-filled.js +1 -1
  74. package/dist/components/ds-button-unfilled.js +1 -1
  75. package/dist/components/ds-card-data-viz-donut.js +1 -1
  76. package/dist/components/ds-card-setting.js +1 -1
  77. package/dist/components/ds-card-shell-data-viz.js +1 -1
  78. package/dist/components/ds-card.js +1 -1
  79. package/dist/components/ds-chart-bar.js +1 -1
  80. package/dist/components/ds-chart-bar.js.map +1 -1
  81. package/dist/components/ds-chart-donut.js +1 -1
  82. package/dist/components/ds-chart-legend.js +1 -1
  83. package/dist/components/ds-chart-line.js +1 -1
  84. package/dist/components/ds-checkbox.js +1 -1
  85. package/dist/components/ds-chip.js +1 -1
  86. package/dist/components/ds-code-block.d.ts +11 -0
  87. package/dist/components/ds-code-block.js +2 -0
  88. package/dist/components/ds-code-block.js.map +1 -0
  89. package/dist/components/ds-conversation-list-item.d.ts +11 -0
  90. package/dist/components/ds-conversation-list-item.js +2 -0
  91. package/dist/components/ds-conversation-list-item.js.map +1 -0
  92. package/dist/components/ds-conversation-list-section.d.ts +11 -0
  93. package/dist/components/ds-conversation-list-section.js +2 -0
  94. package/dist/components/ds-conversation-list-section.js.map +1 -0
  95. package/dist/components/ds-conversation-list.d.ts +11 -0
  96. package/dist/components/ds-conversation-list.js +2 -0
  97. package/dist/components/ds-conversation-list.js.map +1 -0
  98. package/dist/components/ds-divider.js +1 -1
  99. package/dist/components/ds-divider.js.map +1 -1
  100. package/dist/components/ds-empty-state.js +1 -1
  101. package/dist/components/ds-field.js +1 -1
  102. package/dist/components/ds-icon.js +1 -1
  103. package/dist/components/ds-input.js +1 -1
  104. package/dist/components/ds-markdown.d.ts +11 -0
  105. package/dist/components/ds-markdown.js +2 -0
  106. package/dist/components/ds-markdown.js.map +1 -0
  107. package/dist/components/ds-menu.js +1 -1
  108. package/dist/components/ds-message-bubble.d.ts +11 -0
  109. package/dist/components/ds-message-bubble.js +2 -0
  110. package/dist/components/ds-message-bubble.js.map +1 -0
  111. package/dist/components/ds-message-composer.d.ts +11 -0
  112. package/dist/components/ds-message-composer.js +2 -0
  113. package/dist/components/ds-message-composer.js.map +1 -0
  114. package/dist/components/ds-message-scroller.d.ts +11 -0
  115. package/dist/components/ds-message-scroller.js +2 -0
  116. package/dist/components/ds-message-scroller.js.map +1 -0
  117. package/dist/components/ds-message.d.ts +11 -0
  118. package/dist/components/ds-message.js +2 -0
  119. package/dist/components/ds-message.js.map +1 -0
  120. package/dist/components/ds-modal.js +1 -1
  121. package/dist/components/ds-panel-nav.js +1 -1
  122. package/dist/components/ds-panel-nav.js.map +1 -1
  123. package/dist/components/ds-panel-sub-nav.js +1 -1
  124. package/dist/components/ds-panel-tool-header.d.ts +11 -0
  125. package/dist/components/ds-panel-tool-header.js +2 -0
  126. package/dist/components/ds-panel-tool-header.js.map +1 -0
  127. package/dist/components/ds-panel-tool-search.d.ts +11 -0
  128. package/dist/components/ds-panel-tool-search.js +2 -0
  129. package/dist/components/ds-panel-tool-search.js.map +1 -0
  130. package/dist/components/ds-panel-tools.js +1 -1
  131. package/dist/components/ds-panel-tools.js.map +1 -1
  132. package/dist/components/ds-radio.js +1 -1
  133. package/dist/components/ds-select-multi.js +1 -1
  134. package/dist/components/ds-select-multi.js.map +1 -1
  135. package/dist/components/ds-select.js +1 -1
  136. package/dist/components/ds-select.js.map +1 -1
  137. package/dist/components/ds-shell-gradient-picker.js +1 -1
  138. package/dist/components/ds-shell-gradient-picker.js.map +1 -1
  139. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  140. package/dist/components/ds-shell-gradient-swatch.js.map +1 -1
  141. package/dist/components/ds-skeleton.js +1 -1
  142. package/dist/components/ds-slider.js +1 -1
  143. package/dist/components/ds-slider.js.map +1 -1
  144. package/dist/components/ds-swatch-picker.d.ts +11 -0
  145. package/dist/components/ds-swatch-picker.js +2 -0
  146. package/dist/components/ds-swatch-picker.js.map +1 -0
  147. package/dist/components/ds-switch.js +1 -1
  148. package/dist/components/ds-tab-group.js +1 -1
  149. package/dist/components/ds-tab-group.js.map +1 -1
  150. package/dist/components/ds-tag.js +1 -1
  151. package/dist/components/ds-text.js +1 -1
  152. package/dist/components/ds-tooltip-data-viz.js +1 -1
  153. package/dist/components/ds-tooltip.js +1 -1
  154. package/dist/components/index.d.ts +14 -0
  155. package/dist/components/p--KbMQblZ.js +2 -0
  156. package/dist/components/p--KbMQblZ.js.map +1 -0
  157. package/dist/components/p-2br9YDbG.js +2 -0
  158. package/dist/components/p-2br9YDbG.js.map +1 -0
  159. package/dist/components/p-41UAx2eq.js +2 -0
  160. package/dist/components/p-41UAx2eq.js.map +1 -0
  161. package/dist/components/p-B1pWGQn1.js +2 -0
  162. package/dist/components/p-B1pWGQn1.js.map +1 -0
  163. package/dist/components/p-B7NbIYjS.js +2 -0
  164. package/dist/components/p-B7NbIYjS.js.map +1 -0
  165. package/dist/components/p-BBu_Svz7.js +2 -0
  166. package/dist/components/p-BBu_Svz7.js.map +1 -0
  167. package/dist/components/p-BEQB8EnB.js +2 -0
  168. package/dist/components/p-BEQB8EnB.js.map +1 -0
  169. package/dist/components/{p-CZ9wemOA.js → p-BFWC17em.js} +2 -2
  170. package/dist/components/{p-KRGBGTu5.js → p-BO6C8abO.js} +2 -2
  171. package/dist/components/{p-CbS_WWs2.js → p-BSOZXagj.js} +2 -2
  172. package/dist/components/p-BSOZXagj.js.map +1 -0
  173. package/dist/components/{p-DT2MK8Kt.js → p-BZAEZENv.js} +2 -2
  174. package/dist/components/p-BhC1YyId.js +2 -0
  175. package/dist/components/p-BhC1YyId.js.map +1 -0
  176. package/dist/components/p-BjtXYFhw.js +2 -0
  177. package/dist/components/p-BjtXYFhw.js.map +1 -0
  178. package/dist/components/{p-B-zhgAvL.js → p-Bo5wikia.js} +2 -2
  179. package/dist/components/p-Bx1G7P6W.js +2 -0
  180. package/dist/components/p-Bx1G7P6W.js.map +1 -0
  181. package/dist/components/p-C0sq948W.js +2 -0
  182. package/dist/components/p-C0sq948W.js.map +1 -0
  183. package/dist/components/p-CC1C8s6m.js +2 -0
  184. package/dist/components/p-CC1C8s6m.js.map +1 -0
  185. package/dist/components/p-CKaJx0IX.js +2 -0
  186. package/dist/components/p-CKaJx0IX.js.map +1 -0
  187. package/dist/components/{p-DyZj3k9S.js → p-CZMEhdlA.js} +2 -2
  188. package/dist/components/{p-BbV68F23.js → p-CiwdnKKp.js} +2 -2
  189. package/dist/components/{p-BLzivrE3.js → p-CnM9SW_8.js} +2 -2
  190. package/dist/components/{p-C7UFYvsO.js → p-CuKn9I5f.js} +2 -2
  191. package/dist/components/p-D1HFMTdC.js +2 -0
  192. package/dist/components/p-D1HFMTdC.js.map +1 -0
  193. package/dist/components/p-DFMM60My.js +2 -0
  194. package/dist/components/p-DFMM60My.js.map +1 -0
  195. package/dist/components/p-DIsDiGcp.js +2 -0
  196. package/dist/components/p-DIsDiGcp.js.map +1 -0
  197. package/dist/components/p-DVsje4AY.js +2 -0
  198. package/dist/components/p-DVsje4AY.js.map +1 -0
  199. package/dist/components/p-Di-ThR90.js +2 -0
  200. package/dist/components/p-Di-ThR90.js.map +1 -0
  201. package/dist/components/{p-C7RObioO.js → p-Di4HBckb.js} +2 -2
  202. package/dist/components/p-a9nGf1s6.js +2 -0
  203. package/dist/components/p-a9nGf1s6.js.map +1 -0
  204. package/dist/components/p-gidVv1FX.js +2 -0
  205. package/dist/components/p-gidVv1FX.js.map +1 -0
  206. package/dist/components/p-l6PmnW_P.js +2 -0
  207. package/dist/components/p-l6PmnW_P.js.map +1 -0
  208. package/dist/components/p-rEe-3KR_.js +2 -0
  209. package/dist/components/p-rEe-3KR_.js.map +1 -0
  210. package/dist/components/p-t9Ei1kHP.js +2 -0
  211. package/dist/components/p-t9Ei1kHP.js.map +1 -0
  212. package/dist/docs/components.json +8097 -3924
  213. package/dist/lib/components/Menu/menu-placement.d.ts +19 -3
  214. package/dist/lib/shell/index.d.ts +3 -3
  215. package/dist/lib/shell/index.js +48 -39
  216. package/dist/lib/shell/index.js.map +3 -3
  217. package/dist/lib/shell/shell-gradient-presets.d.ts +15 -0
  218. package/dist/lib/utils/choice-popup-alignment.d.ts +20 -0
  219. package/dist/lib/utils/index.d.ts +2 -0
  220. package/dist/lib/utils/index.js +16 -0
  221. package/dist/lib/utils/index.js.map +3 -3
  222. package/dist/mcp/cli.js +31409 -0
  223. package/dist/mcp-data/registry/agent-activity.json +158 -0
  224. package/dist/mcp-data/registry/agent-response.json +211 -0
  225. package/dist/mcp-data/registry/agent-source-list.json +153 -0
  226. package/dist/mcp-data/registry/agent-tool-call.json +213 -0
  227. package/dist/mcp-data/registry/app-shell.json +210 -0
  228. package/dist/mcp-data/registry/attachment-list.json +137 -0
  229. package/dist/mcp-data/registry/avatar.json +136 -0
  230. package/dist/mcp-data/registry/badge.json +289 -0
  231. package/dist/mcp-data/registry/banner.json +206 -0
  232. package/dist/mcp-data/registry/bar-nav.json +341 -0
  233. package/dist/mcp-data/registry/button-filled.json +386 -0
  234. package/dist/mcp-data/registry/button-unfilled.json +537 -0
  235. package/dist/mcp-data/registry/card-data-viz-donut.json +143 -0
  236. package/dist/mcp-data/registry/card-setting.json +194 -0
  237. package/dist/mcp-data/registry/card-shell-data-viz.json +173 -0
  238. package/dist/mcp-data/registry/card.json +126 -0
  239. package/dist/mcp-data/registry/chart-bar.json +121 -0
  240. package/dist/mcp-data/registry/chart-donut.json +257 -0
  241. package/dist/mcp-data/registry/chart-legend.json +209 -0
  242. package/dist/mcp-data/registry/chart-line.json +153 -0
  243. package/dist/mcp-data/registry/checkbox.json +361 -0
  244. package/dist/mcp-data/registry/chip.json +276 -0
  245. package/dist/mcp-data/registry/code-block.json +150 -0
  246. package/dist/mcp-data/registry/conversation-list-item.json +265 -0
  247. package/dist/mcp-data/registry/conversation-list-section.json +139 -0
  248. package/dist/mcp-data/registry/conversation-list.json +101 -0
  249. package/dist/mcp-data/registry/divider.json +225 -0
  250. package/dist/mcp-data/registry/empty-state.json +197 -0
  251. package/dist/mcp-data/registry/field.json +222 -0
  252. package/dist/mcp-data/registry/icon.json +242 -0
  253. package/dist/mcp-data/registry/input.json +597 -0
  254. package/dist/mcp-data/registry/loader.json +192 -0
  255. package/dist/mcp-data/registry/markdown.json +141 -0
  256. package/dist/mcp-data/registry/menu.json +479 -0
  257. package/dist/mcp-data/registry/message-bubble.json +119 -0
  258. package/dist/mcp-data/registry/message-composer.json +265 -0
  259. package/dist/mcp-data/registry/message-scroller.json +217 -0
  260. package/dist/mcp-data/registry/message.json +255 -0
  261. package/dist/mcp-data/registry/modal.json +150 -0
  262. package/dist/mcp-data/registry/panel-nav.json +622 -0
  263. package/dist/mcp-data/registry/panel-sub-nav.json +249 -0
  264. package/dist/mcp-data/registry/panel-tool-header.json +342 -0
  265. package/dist/mcp-data/registry/panel-tool-search.json +387 -0
  266. package/dist/mcp-data/registry/panel-tools.json +514 -0
  267. package/dist/mcp-data/registry/radio.json +374 -0
  268. package/dist/mcp-data/registry/registry.json +6916 -0
  269. package/dist/mcp-data/registry/select-multi.json +755 -0
  270. package/dist/mcp-data/registry/select.json +740 -0
  271. package/dist/mcp-data/registry/shell-gradient-picker.json +195 -0
  272. package/dist/mcp-data/registry/shell-gradient-swatch.json +215 -0
  273. package/dist/mcp-data/registry/skeleton.json +282 -0
  274. package/dist/mcp-data/registry/slider.json +657 -0
  275. package/dist/mcp-data/registry/swatch-picker.json +231 -0
  276. package/dist/mcp-data/registry/switch.json +361 -0
  277. package/dist/mcp-data/registry/tab-group.json +255 -0
  278. package/dist/mcp-data/registry/tag.json +352 -0
  279. package/dist/mcp-data/registry/text.json +371 -0
  280. package/dist/mcp-data/registry/tooltip-data-viz.json +158 -0
  281. package/dist/mcp-data/registry/tooltip.json +311 -0
  282. package/dist/react/components.d.ts +18 -0
  283. package/dist/react/components.js +18 -0
  284. package/dist/react/ds-agent-activity.d.ts +9 -0
  285. package/dist/react/ds-agent-activity.js +12 -0
  286. package/dist/react/ds-agent-response.d.ts +9 -0
  287. package/dist/react/ds-agent-response.js +12 -0
  288. package/dist/react/ds-agent-source-list.d.ts +9 -0
  289. package/dist/react/ds-agent-source-list.js +12 -0
  290. package/dist/react/ds-agent-tool-call.d.ts +9 -0
  291. package/dist/react/ds-agent-tool-call.js +12 -0
  292. package/dist/react/ds-attachment-list.d.ts +9 -0
  293. package/dist/react/ds-attachment-list.js +12 -0
  294. package/dist/react/ds-avatar.d.ts +9 -0
  295. package/dist/react/ds-avatar.js +12 -0
  296. package/dist/react/ds-code-block.d.ts +9 -0
  297. package/dist/react/ds-code-block.js +12 -0
  298. package/dist/react/ds-conversation-list-item.d.ts +14 -0
  299. package/dist/react/ds-conversation-list-item.js +12 -0
  300. package/dist/react/ds-conversation-list-section.d.ts +9 -0
  301. package/dist/react/ds-conversation-list-section.js +12 -0
  302. package/dist/react/ds-conversation-list.d.ts +9 -0
  303. package/dist/react/ds-conversation-list.js +12 -0
  304. package/dist/react/ds-markdown.d.ts +9 -0
  305. package/dist/react/ds-markdown.js +12 -0
  306. package/dist/react/ds-menu.d.ts +1 -0
  307. package/dist/react/ds-menu.js +2 -1
  308. package/dist/react/ds-message-bubble.d.ts +9 -0
  309. package/dist/react/ds-message-bubble.js +12 -0
  310. package/dist/react/ds-message-composer.d.ts +16 -0
  311. package/dist/react/ds-message-composer.js +16 -0
  312. package/dist/react/ds-message-scroller.d.ts +12 -0
  313. package/dist/react/ds-message-scroller.js +12 -0
  314. package/dist/react/ds-message.d.ts +9 -0
  315. package/dist/react/ds-message.js +12 -0
  316. package/dist/react/ds-panel-tool-header.d.ts +17 -0
  317. package/dist/react/ds-panel-tool-header.js +16 -0
  318. package/dist/react/ds-panel-tool-search.d.ts +14 -0
  319. package/dist/react/ds-panel-tool-search.js +16 -0
  320. package/dist/react/ds-panel-tools.d.ts +10 -0
  321. package/dist/react/ds-panel-tools.js +3 -0
  322. package/dist/react/ds-swatch-picker.d.ts +12 -0
  323. package/dist/react/ds-swatch-picker.js +12 -0
  324. package/dist/types/components/AgentActivity/AgentActivity.d.ts +14 -0
  325. package/dist/types/components/AgentResponse/AgentResponse.d.ts +12 -0
  326. package/dist/types/components/AgentSourceList/AgentSourceList.d.ts +9 -0
  327. package/dist/types/components/AgentToolCall/AgentToolCall.d.ts +13 -0
  328. package/dist/types/components/AppShell/AppShell.d.ts +4 -0
  329. package/dist/types/components/AttachmentList/AttachmentList.d.ts +8 -0
  330. package/dist/types/components/Avatar/Avatar.d.ts +8 -0
  331. package/dist/types/components/CodeBlock/CodeBlock.d.ts +11 -0
  332. package/dist/types/components/ConversationList/ConversationList.d.ts +4 -0
  333. package/dist/types/components/ConversationListItem/ConversationListItem.d.ts +22 -0
  334. package/dist/types/components/ConversationListSection/ConversationListSection.d.ts +9 -0
  335. package/dist/types/components/Markdown/Markdown.d.ts +15 -0
  336. package/dist/types/components/Menu/Menu.d.ts +10 -1
  337. package/dist/types/components/Menu/menu-placement.d.ts +19 -3
  338. package/dist/types/components/Menu/menu-types.d.ts +15 -2
  339. package/dist/types/components/Message/Message.d.ts +17 -0
  340. package/dist/types/components/MessageBubble/MessageBubble.d.ts +6 -0
  341. package/dist/types/components/MessageComposer/MessageComposer.d.ts +29 -0
  342. package/dist/types/components/MessageScroller/MessageScroller.d.ts +37 -0
  343. package/dist/types/components/PanelNav/PanelNav.d.ts +3 -0
  344. package/dist/types/components/PanelToolHeader/PanelToolHeader.d.ts +34 -0
  345. package/dist/types/components/PanelToolSearch/PanelToolSearch.d.ts +35 -0
  346. package/dist/types/components/PanelTools/PanelTools.d.ts +40 -1
  347. package/dist/types/components/PanelTools/panel-tools-types.d.ts +20 -0
  348. package/dist/types/components/PanelTools/panel-tools-utils.d.ts +2 -0
  349. package/dist/types/components/ShellGradientPicker/ShellGradientPicker.d.ts +2 -5
  350. package/dist/types/components/ShellGradientSwatch/ShellGradientSwatch.d.ts +1 -0
  351. package/dist/types/components/Slider/Slider.d.ts +1 -1
  352. package/dist/types/components/SwatchPicker/SwatchPicker.d.ts +21 -0
  353. package/dist/types/components/SwatchPicker/swatch-picker-types.d.ts +26 -0
  354. package/dist/types/components/conversation-types.d.ts +55 -0
  355. package/dist/types/components.d.ts +1298 -4
  356. package/dist/types/shell/index.d.ts +3 -3
  357. package/dist/types/shell/shell-gradient-presets.d.ts +15 -0
  358. package/dist/types/utils/choice-list-parts.d.ts +4 -1
  359. package/dist/types/utils/choice-popup-alignment.d.ts +21 -0
  360. package/dist/types/utils/index.d.ts +2 -0
  361. package/package.json +9 -2
  362. package/dist/components/p-Bafp65bw.js +0 -2
  363. package/dist/components/p-Bafp65bw.js.map +0 -1
  364. package/dist/components/p-BdnR3jxi.js +0 -2
  365. package/dist/components/p-BdnR3jxi.js.map +0 -1
  366. package/dist/components/p-CXF8yd-g.js +0 -2
  367. package/dist/components/p-CXF8yd-g.js.map +0 -1
  368. package/dist/components/p-C_cu-HIT.js +0 -2
  369. package/dist/components/p-C_cu-HIT.js.map +0 -1
  370. package/dist/components/p-CbS_WWs2.js.map +0 -1
  371. package/dist/components/p-D0B9uDTP.js +0 -2
  372. package/dist/components/p-D0B9uDTP.js.map +0 -1
  373. package/dist/components/p-DF0yLZG_.js +0 -2
  374. package/dist/components/p-DF0yLZG_.js.map +0 -1
  375. package/dist/components/p-VKIsOVza.js +0 -2
  376. package/dist/components/p-VKIsOVza.js.map +0 -1
  377. /package/dist/components/{p-CZ9wemOA.js.map → p-BFWC17em.js.map} +0 -0
  378. /package/dist/components/{p-KRGBGTu5.js.map → p-BO6C8abO.js.map} +0 -0
  379. /package/dist/components/{p-DT2MK8Kt.js.map → p-BZAEZENv.js.map} +0 -0
  380. /package/dist/components/{p-B-zhgAvL.js.map → p-Bo5wikia.js.map} +0 -0
  381. /package/dist/components/{p-DyZj3k9S.js.map → p-CZMEhdlA.js.map} +0 -0
  382. /package/dist/components/{p-BbV68F23.js.map → p-CiwdnKKp.js.map} +0 -0
  383. /package/dist/components/{p-BLzivrE3.js.map → p-CnM9SW_8.js.map} +0 -0
  384. /package/dist/components/{p-C7UFYvsO.js.map → p-CuKn9I5f.js.map} +0 -0
  385. /package/dist/components/{p-C7RObioO.js.map → p-Di4HBckb.js.map} +0 -0
package/README.md CHANGED
@@ -48,6 +48,34 @@ There is **no** published `@ds-mo/ui/loader` or global `@ds-mo/ui/css` bundle
48
48
 
49
49
  **SPA hosts (Angular / React):** `ds-panel-nav` and `ds-bar-nav` need a [first-paint integration contract](docs/framework-integration.md) on hard reload — seed bar-nav state and stamp `data-nav-style` before custom elements upgrade.
50
50
 
51
+ ## Agent recipes through MCP
52
+
53
+ The package includes a local stdio MCP server that exposes component metadata and
54
+ executable Custom Elements, React, and Angular composition recipes. It runs on the
55
+ developer's machine; no hosted MCP service or API key is required.
56
+
57
+ When `@ds-mo/ui` is installed in the consuming project, point Codex at the package binary:
58
+
59
+ ```toml
60
+ # .codex/config.toml
61
+ [mcp_servers.compomo]
62
+ command = "./node_modules/.bin/compomo-mcp"
63
+ ```
64
+
65
+ Or let npm obtain the latest public package when the MCP client starts:
66
+
67
+ ```toml
68
+ [mcp_servers.compomo]
69
+ command = "npx"
70
+ args = ["-y", "--package", "@ds-mo/ui@latest", "compomo-mcp"]
71
+ ```
72
+
73
+ The server provides `list_components`, `get_component`, `get_setup_guide`,
74
+ `get_component_source`, `list_patterns`, and `get_pattern`. Add a repository
75
+ instruction telling agents to retrieve the applicable pattern before composing
76
+ multiple design-system components; connecting the MCP makes recipes available,
77
+ while the instruction makes their use consistent.
78
+
51
79
  ## Components
52
80
 
53
81
  All tags are `ds-*` custom elements. Grouped by role (see Storybook for props and stories):
package/dist/.build-stamp CHANGED
@@ -1 +1 @@
1
- 1784322516816
1
+ 1784503227826
@@ -0,0 +1,397 @@
1
+ {
2
+ "schemaVersion": "1.0.0",
3
+ "package": "@ds-mo/ui",
4
+ "packageVersion": "9.2.0",
5
+ "kind": "patterns",
6
+ "entries": [
7
+ {
8
+ "id": "pattern:agent-chat",
9
+ "status": "experimental",
10
+ "summary": "Extend the generic conversation pattern with ordered agent response parts while keeping transport and product behavior outside the design system.",
11
+ "useWhen": [
12
+ "A chat presents rich agent output including Markdown, safe activity, display-only tool calls, attachments, or sources."
13
+ ],
14
+ "avoidWhen": [
15
+ "The channel is person-to-person or the component would be expected to execute models, tools, approvals, or persistence."
16
+ ],
17
+ "components": [
18
+ {
19
+ "component": "component:ds-message-scroller",
20
+ "role": "Provides generic transcript movement and live-edge behavior.",
21
+ "required": true
22
+ },
23
+ {
24
+ "component": "component:ds-message",
25
+ "role": "Renders participant turns with channel-neutral semantics.",
26
+ "required": true
27
+ },
28
+ {
29
+ "component": "component:ds-message-bubble",
30
+ "role": "Renders participant copy with the shared body-medium regular message baseline.",
31
+ "required": true
32
+ },
33
+ {
34
+ "component": "component:ds-agent-response",
35
+ "role": "Renders ordered normalized agent response parts.",
36
+ "required": true
37
+ },
38
+ {
39
+ "component": "component:ds-message-composer",
40
+ "role": "Emits participant submission and stop intent.",
41
+ "required": true
42
+ }
43
+ ],
44
+ "stateOwnership": [
45
+ "The application owns scripted or real transport, immutable response parts, retry, stop, generated titles, and persistence.",
46
+ "Participant turns use MessageBubble's body-medium regular default; the application does not promote ordinary sent-message copy to body-large.",
47
+ "AgentResponse owns ordered display only and never reveals private reasoning.",
48
+ "Tool-call components display execution state but do not request participant approval."
49
+ ],
50
+ "accessibility": [
51
+ "Agent activity must be concise user-safe summaries, never hidden chain-of-thought.",
52
+ "Sources use descriptive external links and unsafe schemes remain non-interactive.",
53
+ "Streaming and tool states remain available as text without relying on animation."
54
+ ],
55
+ "responsiveBehavior": [
56
+ "Use wider ghost responses for rich content while retaining readable text measure and horizontal scrolling for code or tables."
57
+ ],
58
+ "implementations": {
59
+ "customElements": {
60
+ "status": "planned",
61
+ "references": [
62
+ "src/wc/components/MessageScroller/MessageScroller.stories.ts"
63
+ ]
64
+ },
65
+ "react": {
66
+ "status": "planned",
67
+ "references": [
68
+ "src/react/components.ts"
69
+ ]
70
+ },
71
+ "angular": {
72
+ "status": "planned",
73
+ "references": [
74
+ "src/angular/index.ts"
75
+ ]
76
+ }
77
+ },
78
+ "references": [
79
+ "agent/patterns/conversation/pattern.agent.json",
80
+ "src/wc/components/AgentResponse/AgentResponse.tsx"
81
+ ]
82
+ },
83
+ {
84
+ "id": "pattern:application-shell",
85
+ "status": "experimental",
86
+ "summary": "Required base-page composition for standard authenticated applications, with one AppShell coordinating primary destinations, secondary route sections, tools chrome, responsive modes, and stable main content geometry.",
87
+ "useWhen": [
88
+ "Building any standard authenticated product or workspace page with CompoMo.",
89
+ "Application navigation and tools must remain consistent around changing route content.",
90
+ "Creating a reusable base-page template for CompoMo applications."
91
+ ],
92
+ "avoidWhen": [
93
+ "Building authentication, onboarding, public, marketing, print, error, or intentionally focused full-screen experiences.",
94
+ "The page is already rendered inside an AppShell.",
95
+ "A nested or second application shell is being considered."
96
+ ],
97
+ "components": [
98
+ {
99
+ "component": "component:ds-app-shell",
100
+ "role": "Provides the single workspace root and coordinates shell composition, shared chrome, responsive modes, and stable content geometry.",
101
+ "required": true
102
+ },
103
+ {
104
+ "component": "component:ds-panel-nav",
105
+ "role": "Provides the application's one primary navigation with top-level destinations and standard Dashboard/Settings and account footer controls.",
106
+ "required": true
107
+ },
108
+ {
109
+ "component": "component:ds-bar-nav",
110
+ "role": "Provides secondary route-section navigation or the active primary destination label while preserving shell height.",
111
+ "required": true
112
+ },
113
+ {
114
+ "component": "component:ds-panel-tools",
115
+ "role": "Provides required tools chrome with Search and Help as the minimum standard tools and optional additional product tools.",
116
+ "required": true
117
+ }
118
+ ],
119
+ "stateOwnership": [
120
+ "The application router owns the current route, Dashboard or Settings context, authorization filtering, destination and section collections, localized labels, and navigation execution.",
121
+ "AppShell owns desktop, tablet, and mobile composition, shell geometry, navStyle propagation, gradient alignment, chrome transitions, metrics, and shell shortcuts.",
122
+ "PanelNav owns primary-destination presentation and the user-controlled desktop collapse preference.",
123
+ "BarNav derives the active secondary route from currentUrl and basePath and receives the active PanelNav destination label as heading.",
124
+ "PanelTools owns tool-rail and drawer interaction while the application owns available tool content and active-tool state.",
125
+ "PanelNav groups and BarNav dividers visually organize peers and never introduce nested navigation hierarchy."
126
+ ],
127
+ "accessibility": [
128
+ "Render one main landmark in the default content region.",
129
+ "Use PanelNav exclusively for primary destinations and BarNav exclusively for secondary route sections.",
130
+ "Keep localized visible labels and accessible names available when navigation is collapsed or moved into overflow.",
131
+ "Provide Search and Help as the minimum accessible PanelTools actions.",
132
+ "Preserve keyboard focus and route state across responsive and Dashboard/Settings context changes."
133
+ ],
134
+ "responsiveBehavior": [
135
+ "Use fixed system breakpoints: desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
136
+ "Desktop permits PanelNav expansion and collapse and restores the persisted user preference.",
137
+ "Tablet keeps PanelNav permanently collapsed and does not overwrite the desktop preference.",
138
+ "Mobile keeps AppShell as the root while replacing desktop navigation with a future dedicated mobile navigation design.",
139
+ "Keep BarNav height, PanelTools chrome, and main-content origin stable across route changes.",
140
+ "Treat the complete responsive composition as an intended contract that is not yet fully implemented by the current AppShell runtime."
141
+ ],
142
+ "implementations": {
143
+ "customElements": {
144
+ "status": "verified",
145
+ "references": [
146
+ "src/wc/components/AppShell/AppShell.stories.ts",
147
+ "docs/framework-integration.md"
148
+ ]
149
+ },
150
+ "react": {
151
+ "status": "planned",
152
+ "references": [
153
+ "scripts/verify-package-imports.mjs",
154
+ "docs/framework-integration.md"
155
+ ]
156
+ },
157
+ "angular": {
158
+ "status": "verified",
159
+ "references": [
160
+ "scripts/verify-package-imports.mjs",
161
+ "docs/framework-integration.md"
162
+ ]
163
+ }
164
+ },
165
+ "references": [
166
+ "src/wc/components/AppShell/AppShell.mdx",
167
+ "docs/framework-integration.md"
168
+ ]
169
+ },
170
+ {
171
+ "id": "pattern:conversation",
172
+ "status": "experimental",
173
+ "summary": "Compose channel-neutral history, transcript, message surfaces, attachments, and composer behavior for reusable conversations.",
174
+ "useWhen": [
175
+ "A product needs threaded conversation UX that may serve agent or person-to-person channels."
176
+ ],
177
+ "avoidWhen": [
178
+ "The experience is a static activity feed or form without conversational turns."
179
+ ],
180
+ "components": [
181
+ {
182
+ "component": "component:ds-conversation-list",
183
+ "role": "Owns history scrolling, empty layout, and floating action placement.",
184
+ "required": true
185
+ },
186
+ {
187
+ "component": "component:ds-panel-tool-search",
188
+ "role": "Collects a product-owned conversation history search query when the conversation is presented as a PanelTools product.",
189
+ "required": false
190
+ },
191
+ {
192
+ "component": "component:ds-message-scroller",
193
+ "role": "Owns transcript position and live-edge following.",
194
+ "required": true
195
+ },
196
+ {
197
+ "component": "component:ds-message",
198
+ "role": "Owns each turn's direction, grouping, and metadata.",
199
+ "required": true
200
+ },
201
+ {
202
+ "component": "component:ds-message-bubble",
203
+ "role": "Owns the visible content surface and body-medium default independently of row semantics.",
204
+ "required": true
205
+ },
206
+ {
207
+ "component": "component:ds-message-composer",
208
+ "role": "Emits draft, submit, and stop intent without transport ownership.",
209
+ "required": true
210
+ },
211
+ {
212
+ "component": "component:ds-attachment-list",
213
+ "role": "Displays existing attachment metadata when present.",
214
+ "required": false
215
+ }
216
+ ],
217
+ "stateOwnership": [
218
+ "The application owns conversations, messages, selection, drafts, persistence, transport, unread policy, and any history search query or matching policy. ConversationListItem presents every positive unreadCount as one dot aligned with the title row; unread titles are primary and read titles are secondary.",
219
+ "The application owns contextual row-menu commands such as pin, rename, members, and delete; ConversationListItem supplies the sibling actions slot and hover/focus/touch presentation.",
220
+ "When history search is present, distinguish an empty history from a populated history with no matching conversations.",
221
+ "Plain incoming and outgoing message copy uses MessageBubble's body-medium regular default; the application must not promote ordinary conversation turns to body-large.",
222
+ "MessageScroller owns reader-relative transcript position and follow behavior. Compose MessageComposer in its overlay slot so transcript content moves behind the surface while measured bottom clearance keeps the latest turn readable.",
223
+ "MessageComposer emits intent while the application controls its value and status. Its submit action defaults to brand for agent and person-to-person channels; select another submitIntent only for a different semantic consequence, never merely to identify AI content."
224
+ ],
225
+ "accessibility": [
226
+ "Give history and transcript regions distinct localized names.",
227
+ "Preserve message author, order, time, status, and delivery meaning in text.",
228
+ "Do not force the reader back to the live edge after deliberate transcript interaction."
229
+ ],
230
+ "responsiveBehavior": [
231
+ "Let the containing product select drawer or full-width layout while keeping transcript measure readable and rich content horizontally scrollable."
232
+ ],
233
+ "implementations": {
234
+ "customElements": {
235
+ "status": "planned",
236
+ "references": [
237
+ "src/wc/components/MessageScroller/MessageScroller.stories.ts"
238
+ ]
239
+ },
240
+ "react": {
241
+ "status": "planned",
242
+ "references": [
243
+ "src/react/components.ts"
244
+ ]
245
+ },
246
+ "angular": {
247
+ "status": "planned",
248
+ "references": [
249
+ "src/angular/index.ts"
250
+ ]
251
+ }
252
+ },
253
+ "references": [
254
+ "src/wc/components/ConversationList/ConversationList.stories.ts",
255
+ "src/wc/components/MessageScroller/MessageScroller.stories.ts"
256
+ ]
257
+ },
258
+ {
259
+ "id": "pattern:menu-trigger",
260
+ "status": "stable",
261
+ "summary": "Connect a ButtonUnfilled trigger to an anchored Menu for a compact command or view-selection popup without application-authored positioning.",
262
+ "useWhen": [
263
+ "A button should reveal a short contextual collection of commands.",
264
+ "A compact button should show the current view or mode and let the user choose another one from a menu."
265
+ ],
266
+ "avoidWhen": [
267
+ "The choice is a submitted form value with a field label or validation; use Select.",
268
+ "The available local views can remain visible; use TabGroup.",
269
+ "The choices are primary or secondary application destinations; use the matching navigation component.",
270
+ "The popup contains substantial content, confirmation, or a form; use Modal."
271
+ ],
272
+ "components": [
273
+ {
274
+ "component": "component:ds-button-unfilled",
275
+ "role": "Provides the visible trigger, popup relationship attributes, and focus target.",
276
+ "required": true
277
+ },
278
+ {
279
+ "component": "component:ds-menu",
280
+ "role": "Owns anchored placement, menu semantics, keyboard navigation, viewport clamping, selection, and close behavior.",
281
+ "required": true
282
+ }
283
+ ],
284
+ "stateOwnership": [
285
+ "The application owns the selected command or view value and derives the trigger label and each item's isSelected state from it.",
286
+ "The application synchronizes one open boolean to ButtonUnfilled.expanded and Menu.open.",
287
+ "Menu owns popup placement and keyboard navigation; the application never calculates popup coordinates or applies positional CSS.",
288
+ "On dsSelect, update the selected value, close the Menu, and restore focus to the trigger.",
289
+ "On dsClose, synchronize the application open state to false."
290
+ ],
291
+ "accessibility": [
292
+ "Set ButtonUnfilled.haspopup to menu, controls to the Menu id, and expanded from the same open state passed to Menu.",
293
+ "Give Menu a concise menuLabel describing the available commands or views.",
294
+ "Set Menu.initialFocusVisible only when the trigger MouseEvent detail is zero, indicating keyboard activation.",
295
+ "Keep visible selected styling synchronized with the application's selected value; Menu exposes the selected command through aria-current.",
296
+ "Return focus to the trigger after selection; Menu already restores it for Escape and outside dismissal."
297
+ ],
298
+ "responsiveBehavior": [
299
+ "Keep Menu's default choice-cell anchor alignment unless deliberate custom frame geometry is required.",
300
+ "Let Menu clamp to the viewport and avoid application-authored fixed or absolute positioning.",
301
+ "Use a concise trigger label that can fit the owning layout without hiding the selected meaning."
302
+ ],
303
+ "implementations": {
304
+ "customElements": {
305
+ "status": "verified",
306
+ "recipes": [
307
+ {
308
+ "id": "selected-view-menu",
309
+ "title": "Selected view menu",
310
+ "summary": "A ButtonUnfilled displays the active view and opens a Menu whose selected row updates that view.",
311
+ "files": [
312
+ {
313
+ "path": "view-menu.html",
314
+ "language": "html",
315
+ "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n label=\"View · Overview\"\n haspopup=\"menu\"\n controls=\"view-menu\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchor-id=\"view-menu-trigger\"\n menu-label=\"Choose view\"\n></ds-menu>"
316
+ },
317
+ {
318
+ "path": "view-menu.ts",
319
+ "language": "typescript",
320
+ "content": "import '@ds-mo/ui/components/ds-button-unfilled.js'\nimport '@ds-mo/ui/components/ds-menu.js'\nimport type { MenuItemData } from '@ds-mo/ui'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nconst trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')!\nconst menu = document.querySelector<HTMLDsMenuElement>('#view-menu')!\nlet selectedValue = 'overview'\n\nfunction render() {\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n trigger.label = `View · ${selected.label}`\n menu.items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n}\n\nfunction setOpen(open: boolean) {\n trigger.expanded = open\n menu.open = open\n}\n\ntrigger.addEventListener('dsClick', event => {\n const mouseEvent = (event as CustomEvent<MouseEvent>).detail\n menu.initialFocusVisible = mouseEvent.detail === 0\n setOpen(!menu.open)\n})\nmenu.addEventListener('dsClose', () => setOpen(false))\nmenu.addEventListener('dsSelect', event => {\n selectedValue = (event as CustomEvent<MenuItemData>).detail.value ?? selectedValue\n render()\n setOpen(false)\n requestAnimationFrame(() => trigger.setFocus())\n})\n\nrender()"
321
+ }
322
+ ],
323
+ "notes": [
324
+ "Assign Menu.items as a JavaScript property; complex arrays cannot be expressed as an HTML attribute.",
325
+ "Do not add positioning styles to either element."
326
+ ]
327
+ }
328
+ ],
329
+ "references": [
330
+ "src/wc/components/Tag/Tag.stories.ts",
331
+ "src/wc/components/Menu/Menu.stories.ts"
332
+ ]
333
+ },
334
+ "react": {
335
+ "status": "verified",
336
+ "recipes": [
337
+ {
338
+ "id": "selected-view-menu",
339
+ "title": "Selected view menu",
340
+ "summary": "A controlled React composition using generated ButtonUnfilled and Menu wrappers.",
341
+ "files": [
342
+ {
343
+ "path": "ViewMenu.tsx",
344
+ "language": "tsx",
345
+ "content": "import { useState } from 'react'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled, DsMenu } from '@ds-mo/ui/react'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nexport function ViewMenu() {\n const [selectedValue, setSelectedValue] = useState('overview')\n const [open, setOpen] = useState(false)\n const [initialFocusVisible, setInitialFocusVisible] = useState(false)\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n const items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n\n function focusTrigger() {\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n\n return (\n <>\n <DsButtonUnfilled\n id=\"view-menu-trigger\"\n label={`View · ${selected.label}`}\n haspopup=\"menu\"\n controls=\"view-menu\"\n expanded={open}\n onDsClick={event => {\n setInitialFocusVisible(event.detail.detail === 0)\n setOpen(current => !current)\n }}\n />\n <DsMenu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n items={items}\n open={open}\n initialFocusVisible={initialFocusVisible}\n onDsClose={() => setOpen(false)}\n onDsSelect={event => {\n setSelectedValue(event.detail.value ?? selectedValue)\n setOpen(false)\n focusTrigger()\n }}\n />\n </>\n )\n}"
346
+ }
347
+ ],
348
+ "notes": [
349
+ "Use one React state value for both the trigger expanded prop and Menu open prop.",
350
+ "Keep the stable trigger and menu ids unique when rendering more than one composition."
351
+ ]
352
+ }
353
+ ],
354
+ "references": [
355
+ "src/react/ds-button-unfilled.ts",
356
+ "src/react/ds-menu.ts"
357
+ ]
358
+ },
359
+ "angular": {
360
+ "status": "verified",
361
+ "recipes": [
362
+ {
363
+ "id": "selected-view-menu",
364
+ "title": "Selected view menu",
365
+ "summary": "A controlled Angular composition using generated standalone ButtonUnfilled and Menu adapters.",
366
+ "files": [
367
+ {
368
+ "path": "view-menu.component.html",
369
+ "language": "html",
370
+ "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n [label]=\"'View · ' + selectedLabel\"\n haspopup=\"menu\"\n controls=\"view-menu\"\n [expanded]=\"open\"\n (dsClick)=\"toggleMenu($event)\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n [items]=\"menuItems\"\n [open]=\"open\"\n [initialFocusVisible]=\"initialFocusVisible\"\n (dsClose)=\"open = false\"\n (dsSelect)=\"selectView($event)\"\n></ds-menu>"
371
+ },
372
+ {
373
+ "path": "view-menu.component.ts",
374
+ "language": "typescript",
375
+ "content": "import { Component } from '@angular/core'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled } from '@ds-mo/ui/angular/ds-button-unfilled'\nimport { DsMenu } from '@ds-mo/ui/angular/ds-menu'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\n@Component({\n selector: 'app-view-menu',\n standalone: true,\n imports: [DsButtonUnfilled, DsMenu],\n templateUrl: './view-menu.component.html',\n})\nexport class ViewMenuComponent {\n selectedValue = 'overview'\n open = false\n initialFocusVisible = false\n\n get selectedLabel() {\n return choices.find(item => item.value === this.selectedValue)?.label ?? choices[0].label\n }\n\n get menuItems() {\n return choices.map(item => ({ ...item, isSelected: item.value === this.selectedValue }))\n }\n\n toggleMenu(event: CustomEvent<MouseEvent>) {\n this.initialFocusVisible = event.detail.detail === 0\n this.open = !this.open\n }\n\n selectView(event: CustomEvent<MenuItemData>) {\n this.selectedValue = event.detail.value ?? this.selectedValue\n this.open = false\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n}"
376
+ }
377
+ ],
378
+ "notes": [
379
+ "Bind items as a property and import both generated standalone adapters.",
380
+ "Keep the stable trigger and menu ids unique when rendering more than one composition."
381
+ ]
382
+ }
383
+ ],
384
+ "references": [
385
+ "src/angular/ds-button-unfilled.ts",
386
+ "src/angular/ds-menu.ts"
387
+ ]
388
+ }
389
+ },
390
+ "references": [
391
+ "src/wc/components/Tag/Tag.stories.ts",
392
+ "src/wc/components/Menu/Menu.agent.json",
393
+ "docs/framework-integration.md"
394
+ ]
395
+ }
396
+ ]
397
+ }