@ds-mo/ui 12.2.0 → 12.4.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 (301) hide show
  1. package/README.md +8 -2
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +94 -16
  4. package/dist/agent.json +1092 -53
  5. package/dist/angular/ds-bar-title.d.ts +7 -1
  6. package/dist/angular/ds-bar-title.js +7 -4
  7. package/dist/angular/ds-breadcrumb.d.ts +19 -0
  8. package/dist/angular/ds-breadcrumb.js +42 -0
  9. package/dist/angular/ds-card-data-viz-bar.d.ts +18 -0
  10. package/dist/angular/ds-card-data-viz-bar.js +42 -0
  11. package/dist/angular/ds-card-data-viz-line.d.ts +18 -0
  12. package/dist/angular/ds-card-data-viz-line.js +42 -0
  13. package/dist/angular/ds-chart-bar-stacked.d.ts +12 -0
  14. package/dist/angular/ds-chart-bar-stacked.js +38 -0
  15. package/dist/angular/ds-chart-legend.d.ts +1 -1
  16. package/dist/angular/ds-chart-legend.js +3 -3
  17. package/dist/angular/ds-shell-app.d.ts +13 -2
  18. package/dist/angular/ds-shell-app.js +9 -5
  19. package/dist/angular/ds-shell-mobile-bar.d.ts +18 -0
  20. package/dist/angular/ds-shell-mobile-bar.js +46 -0
  21. package/dist/angular/ds-shell-mobile-nav.d.ts +23 -0
  22. package/dist/angular/ds-shell-mobile-nav.js +51 -0
  23. package/dist/angular/ds-shell-mobile-section-nav.d.ts +18 -0
  24. package/dist/angular/ds-shell-mobile-section-nav.js +42 -0
  25. package/dist/angular/ds-shell-page.d.ts +1 -1
  26. package/dist/angular/ds-shell-page.js +3 -3
  27. package/dist/angular/ds-shell-tools.d.ts +42 -0
  28. package/dist/angular/ds-shell-tools.js +52 -0
  29. package/dist/angular/index.d.ts +1 -1
  30. package/dist/angular/index.js +8 -0
  31. package/dist/angular/proxies.d.ts +8 -0
  32. package/dist/angular/proxies.js +8 -0
  33. package/dist/components/ds-agent-activity.js +1 -1
  34. package/dist/components/ds-agent-response.js +1 -1
  35. package/dist/components/ds-agent-source-list.js +1 -1
  36. package/dist/components/ds-agent-tool-call.js +1 -1
  37. package/dist/components/ds-attachment-list.js +1 -1
  38. package/dist/components/ds-badge.js +1 -1
  39. package/dist/components/ds-bar-nav.js +1 -1
  40. package/dist/components/ds-bar-title.js +1 -1
  41. package/dist/components/ds-bar-title.js.map +1 -1
  42. package/dist/components/ds-bar-workflow.js +1 -1
  43. package/dist/components/ds-breadcrumb.d.ts +11 -0
  44. package/dist/components/ds-breadcrumb.js +2 -0
  45. package/dist/components/ds-breadcrumb.js.map +1 -0
  46. package/dist/components/ds-button-filled.js +1 -1
  47. package/dist/components/ds-button-unfilled.js +1 -1
  48. package/dist/components/ds-card-data-viz-bar.d.ts +11 -0
  49. package/dist/components/ds-card-data-viz-bar.js +2 -0
  50. package/dist/components/ds-card-data-viz-bar.js.map +1 -0
  51. package/dist/components/ds-card-data-viz-donut.js +1 -1
  52. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  53. package/dist/components/ds-card-data-viz-line.d.ts +11 -0
  54. package/dist/components/ds-card-data-viz-line.js +2 -0
  55. package/dist/components/ds-card-data-viz-line.js.map +1 -0
  56. package/dist/components/ds-card-setting.js +1 -1
  57. package/dist/components/ds-card-setting.js.map +1 -1
  58. package/dist/components/ds-card-shell-data-viz.js +1 -1
  59. package/dist/components/ds-chart-bar-stacked.d.ts +11 -0
  60. package/dist/components/ds-chart-bar-stacked.js +2 -0
  61. package/dist/components/ds-chart-bar-stacked.js.map +1 -0
  62. package/dist/components/ds-chart-bar.js +1 -1
  63. package/dist/components/ds-chart-bar.js.map +1 -1
  64. package/dist/components/ds-chart-donut.js +1 -1
  65. package/dist/components/ds-chart-legend.js +1 -1
  66. package/dist/components/ds-chart-legend.js.map +1 -1
  67. package/dist/components/ds-chart-line.js +1 -1
  68. package/dist/components/ds-chart-line.js.map +1 -1
  69. package/dist/components/ds-checkbox.js +1 -1
  70. package/dist/components/ds-chip.js +1 -1
  71. package/dist/components/ds-code-block.js +1 -1
  72. package/dist/components/ds-conversation-list-item.js +1 -1
  73. package/dist/components/ds-conversation-list-item.js.map +1 -1
  74. package/dist/components/ds-conversation-list-section.js +1 -1
  75. package/dist/components/ds-conversation-list.js +1 -1
  76. package/dist/components/ds-divider.js +1 -1
  77. package/dist/components/ds-empty-state.js +1 -1
  78. package/dist/components/ds-field.js +1 -1
  79. package/dist/components/ds-input.js +1 -1
  80. package/dist/components/ds-markdown.js +1 -1
  81. package/dist/components/ds-menu.js +1 -1
  82. package/dist/components/ds-message-bubble.js +1 -1
  83. package/dist/components/ds-message-bubble.js.map +1 -1
  84. package/dist/components/ds-message-composer.js +1 -1
  85. package/dist/components/ds-message-scroller.js +1 -1
  86. package/dist/components/ds-message-scroller.js.map +1 -1
  87. package/dist/components/ds-message.js +1 -1
  88. package/dist/components/ds-modal.js +1 -1
  89. package/dist/components/ds-modal.js.map +1 -1
  90. package/dist/components/ds-panel-nav.js +1 -1
  91. package/dist/components/ds-panel-nav.js.map +1 -1
  92. package/dist/components/ds-panel-sub-nav.js +1 -1
  93. package/dist/components/ds-panel-tool-header.js +1 -1
  94. package/dist/components/ds-panel-tool-search.js +1 -1
  95. package/dist/components/ds-panel-tools.js +1 -1
  96. package/dist/components/ds-panel-tools.js.map +1 -1
  97. package/dist/components/ds-radio.js +1 -1
  98. package/dist/components/ds-scroll-overlay.js +1 -1
  99. package/dist/components/ds-scroll-overlay.js.map +1 -1
  100. package/dist/components/ds-select-multi.js +1 -1
  101. package/dist/components/ds-select-multi.js.map +1 -1
  102. package/dist/components/ds-select.js +1 -1
  103. package/dist/components/ds-select.js.map +1 -1
  104. package/dist/components/ds-shell-app.js +1 -1
  105. package/dist/components/ds-shell-app.js.map +1 -1
  106. package/dist/components/ds-shell-gradient-picker.js +1 -1
  107. package/dist/components/ds-shell-gradient-picker.js.map +1 -1
  108. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  109. package/dist/components/ds-shell-mobile-bar.d.ts +11 -0
  110. package/dist/components/ds-shell-mobile-bar.js +2 -0
  111. package/dist/components/ds-shell-mobile-bar.js.map +1 -0
  112. package/dist/components/ds-shell-mobile-nav.d.ts +11 -0
  113. package/dist/components/ds-shell-mobile-nav.js +2 -0
  114. package/dist/components/ds-shell-mobile-nav.js.map +1 -0
  115. package/dist/components/ds-shell-mobile-section-nav.d.ts +11 -0
  116. package/dist/components/ds-shell-mobile-section-nav.js +2 -0
  117. package/dist/components/ds-shell-mobile-section-nav.js.map +1 -0
  118. package/dist/components/ds-shell-page.js +1 -1
  119. package/dist/components/ds-shell-page.js.map +1 -1
  120. package/dist/components/ds-shell-tools.d.ts +11 -0
  121. package/dist/components/ds-shell-tools.js +2 -0
  122. package/dist/components/ds-shell-tools.js.map +1 -0
  123. package/dist/components/ds-skeleton.js +1 -1
  124. package/dist/components/ds-slider.js +1 -1
  125. package/dist/components/ds-slider.js.map +1 -1
  126. package/dist/components/ds-swatch-picker.js +1 -1
  127. package/dist/components/ds-switch.js +1 -1
  128. package/dist/components/ds-tab-group.js +1 -1
  129. package/dist/components/ds-tab-group.js.map +1 -1
  130. package/dist/components/ds-tag.js +1 -1
  131. package/dist/components/ds-text.js +1 -1
  132. package/dist/components/ds-toast.js +1 -1
  133. package/dist/components/ds-toast.js.map +1 -1
  134. package/dist/components/ds-tooltip-data-viz.js +1 -1
  135. package/dist/components/ds-tooltip.js +1 -1
  136. package/dist/components/ds-typing-indicator.js +1 -1
  137. package/dist/components/ds-typing-indicator.js.map +1 -1
  138. package/dist/components/{p-DcGpdIlT.js → p-9dQQSgwT.js} +2 -2
  139. package/dist/components/p-B3rbhRAk.js +2 -0
  140. package/dist/components/p-B3rbhRAk.js.map +1 -0
  141. package/dist/components/p-B6Vuayt6.js +2 -0
  142. package/dist/components/p-B6Vuayt6.js.map +1 -0
  143. package/dist/components/{p-BWUTr_XN.js → p-BJMRBHKW.js} +2 -2
  144. package/dist/components/p-BJMRBHKW.js.map +1 -0
  145. package/dist/components/p-BPS9VExm.js +2 -0
  146. package/dist/components/{p-CCHqsF_H.js.map → p-BPS9VExm.js.map} +1 -1
  147. package/dist/components/p-BVV_rlIP.js +2 -0
  148. package/dist/components/p-BVV_rlIP.js.map +1 -0
  149. package/dist/components/{p-GMDGgtY8.js → p-BhxwpOH8.js} +2 -2
  150. package/dist/components/{p-2W-ZjZCR.js → p-Biz6xo-z.js} +2 -2
  151. package/dist/components/p-BrusnEYP.js +2 -0
  152. package/dist/components/p-BrusnEYP.js.map +1 -0
  153. package/dist/components/{p-CG5EX4NW.js → p-BtEjlcB9.js} +2 -2
  154. package/dist/components/{p-C0_8K4y7.js → p-BwGnhInj.js} +2 -2
  155. package/dist/components/p-BwGnhInj.js.map +1 -0
  156. package/dist/components/{p-D6jK2Hyi.js → p-C7bZ-jiU.js} +2 -2
  157. package/dist/components/p-CH3w-P2H.js +2 -0
  158. package/dist/components/p-CH3w-P2H.js.map +1 -0
  159. package/dist/components/{p-DOCKtrS4.js → p-CH6cNXXF.js} +2 -2
  160. package/dist/components/{p-BE_CDJeL.js → p-CY19gMiz.js} +2 -2
  161. package/dist/components/p-C_0Q8Cnp.js +2 -0
  162. package/dist/components/{p-Dg3xLna0.js.map → p-C_0Q8Cnp.js.map} +1 -1
  163. package/dist/components/p-C_ewSXTT.js +2 -0
  164. package/dist/components/p-C_ewSXTT.js.map +1 -0
  165. package/dist/components/{p-CHkI3oIS.js → p-Ce52yVXF.js} +2 -2
  166. package/dist/components/p-CgHTNfC1.js +2 -0
  167. package/dist/components/p-CgHTNfC1.js.map +1 -0
  168. package/dist/components/p-Co8hD3P-.js +2 -0
  169. package/dist/components/{p-Cxpl-rzP.js.map → p-Co8hD3P-.js.map} +1 -1
  170. package/dist/components/{p-xY3TjBF5.js → p-CoYFJD-w.js} +2 -2
  171. package/dist/components/{p-DBi1bmOL.js → p-CtD24EyI.js} +2 -2
  172. package/dist/components/{p-BRLDJmkh.js → p-D-xttdpn.js} +2 -2
  173. package/dist/components/{p-CNffejay.js → p-DSa0Hnd3.js} +2 -2
  174. package/dist/components/p-DXewjzkM.js +2 -0
  175. package/dist/components/p-DXewjzkM.js.map +1 -0
  176. package/dist/components/p-DXnFhmZF.js +2 -0
  177. package/dist/components/{p-BpA9uYKX.js.map → p-DXnFhmZF.js.map} +1 -1
  178. package/dist/components/{p-DyGB97Oy.js → p-DYqReipj.js} +2 -2
  179. package/dist/components/{p-ky1msbJ8.js → p-DjPZxzIG.js} +2 -2
  180. package/dist/components/{p-ky1msbJ8.js.map → p-DjPZxzIG.js.map} +1 -1
  181. package/dist/components/p-NUNsefU1.js +2 -0
  182. package/dist/components/{p-8OOCLGph.js.map → p-NUNsefU1.js.map} +1 -1
  183. package/dist/components/p-PZ6R_nGI.js +2 -0
  184. package/dist/components/p-PZ6R_nGI.js.map +1 -0
  185. package/dist/components/{p-B8CubPgQ.js → p-g40DTeV8.js} +2 -2
  186. package/dist/components/p-jCWtxthA.js +2 -0
  187. package/dist/components/{p-XgIQ3oI_.js.map → p-jCWtxthA.js.map} +1 -1
  188. package/dist/components/p-yhj1lIPx.js +2 -0
  189. package/dist/components/p-yhj1lIPx.js.map +1 -0
  190. package/dist/docs/components.json +8860 -6021
  191. package/dist/lib/components/BarNav/bar-nav-types.d.ts +2 -0
  192. package/dist/lib/components/PanelNav/panel-nav-types.d.ts +29 -0
  193. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +40 -0
  194. package/dist/lib/components/TabGroup/tab-item-utils.d.ts +31 -0
  195. package/dist/lib/shell/index.d.ts +5 -0
  196. package/dist/lib/shell/index.js +36 -0
  197. package/dist/lib/shell/index.js.map +3 -3
  198. package/dist/lib/shell/shell-responsive.d.ts +13 -0
  199. package/dist/lib/utils/index.js +3 -1
  200. package/dist/lib/utils/index.js.map +2 -2
  201. package/dist/mcp/cli.js +142 -18
  202. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  203. package/dist/mcp-data/registry/bar-title.json +68 -14
  204. package/dist/mcp-data/registry/breadcrumb.json +205 -0
  205. package/dist/mcp-data/registry/card-data-viz-bar.json +212 -0
  206. package/dist/mcp-data/registry/card-data-viz-line.json +206 -0
  207. package/dist/mcp-data/registry/card-shell-data-viz.json +7 -0
  208. package/dist/mcp-data/registry/chart-bar-stacked.json +225 -0
  209. package/dist/mcp-data/registry/chart-bar.json +9 -2
  210. package/dist/mcp-data/registry/chart-legend.json +29 -3
  211. package/dist/mcp-data/registry/chart-line.json +4 -2
  212. package/dist/mcp-data/registry/conversation-list-item.json +3 -3
  213. package/dist/mcp-data/registry/message-scroller.json +4 -2
  214. package/dist/mcp-data/registry/message.json +3 -2
  215. package/dist/mcp-data/registry/modal.json +1 -1
  216. package/dist/mcp-data/registry/registry.json +1107 -44
  217. package/dist/mcp-data/registry/shell-app.json +71 -11
  218. package/dist/mcp-data/registry/shell-mobile-bar.json +314 -0
  219. package/dist/mcp-data/registry/shell-mobile-nav.json +348 -0
  220. package/dist/mcp-data/registry/shell-mobile-section-nav.json +267 -0
  221. package/dist/mcp-data/registry/shell-page.json +31 -13
  222. package/dist/mcp-data/registry/shell-tools.json +450 -0
  223. package/dist/mcp-data/registry/text.json +1 -1
  224. package/dist/mcp-data/registry/typing-indicator.json +7 -7
  225. package/dist/react/components.d.ts +8 -0
  226. package/dist/react/components.js +8 -0
  227. package/dist/react/ds-bar-title.d.ts +2 -1
  228. package/dist/react/ds-bar-title.js +1 -0
  229. package/dist/react/ds-breadcrumb.d.ts +12 -0
  230. package/dist/react/ds-breadcrumb.js +12 -0
  231. package/dist/react/ds-card-data-viz-bar.d.ts +12 -0
  232. package/dist/react/ds-card-data-viz-bar.js +12 -0
  233. package/dist/react/ds-card-data-viz-line.d.ts +12 -0
  234. package/dist/react/ds-card-data-viz-line.js +12 -0
  235. package/dist/react/ds-chart-bar-stacked.d.ts +9 -0
  236. package/dist/react/ds-chart-bar-stacked.js +12 -0
  237. package/dist/react/ds-shell-app.d.ts +7 -2
  238. package/dist/react/ds-shell-app.js +1 -1
  239. package/dist/react/ds-shell-mobile-bar.d.ts +13 -0
  240. package/dist/react/ds-shell-mobile-bar.js +15 -0
  241. package/dist/react/ds-shell-mobile-nav.d.ts +15 -0
  242. package/dist/react/ds-shell-mobile-nav.js +17 -0
  243. package/dist/react/ds-shell-mobile-section-nav.d.ts +12 -0
  244. package/dist/react/ds-shell-mobile-section-nav.js +12 -0
  245. package/dist/react/ds-shell-tools.d.ts +25 -0
  246. package/dist/react/ds-shell-tools.js +17 -0
  247. package/dist/styles/prose.css +1 -0
  248. package/dist/types/components/BarTitle/BarTitle.d.ts +13 -1
  249. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +31 -0
  250. package/dist/types/components/Breadcrumb/breadcrumb-types.d.ts +17 -0
  251. package/dist/types/components/CardDataVizBar/CardDataVizBar.d.ts +24 -0
  252. package/dist/types/components/CardDataVizBar/index.d.ts +2 -0
  253. package/dist/types/components/CardDataVizLine/CardDataVizLine.d.ts +24 -0
  254. package/dist/types/components/CardDataVizLine/index.d.ts +2 -0
  255. package/dist/types/components/ChartBarStacked/ChartBarStacked.d.ts +15 -0
  256. package/dist/types/components/ChartBarStacked/index.d.ts +3 -0
  257. package/dist/types/components/ChartLegend/ChartLegend.d.ts +3 -0
  258. package/dist/types/components/ShellApp/ShellApp.d.ts +16 -0
  259. package/dist/types/components/ShellMobileBar/ShellMobileBar.d.ts +25 -0
  260. package/dist/types/components/ShellMobileBar/index.d.ts +4 -0
  261. package/dist/types/components/ShellMobileBar/shell-mobile-bar-types.d.ts +5 -0
  262. package/dist/types/components/ShellMobileNav/ShellMobileNav.d.ts +32 -0
  263. package/dist/types/components/ShellMobileNav/index.d.ts +2 -0
  264. package/dist/types/components/ShellMobileNav/shell-mobile-nav-types.d.ts +6 -0
  265. package/dist/types/components/ShellMobileSectionNav/ShellMobileSectionNav.d.ts +30 -0
  266. package/dist/types/components/ShellMobileSectionNav/index.d.ts +2 -0
  267. package/dist/types/components/ShellPage/ShellPage.d.ts +19 -7
  268. package/dist/types/components/ShellPage/shell-page-responsive.d.ts +0 -8
  269. package/dist/types/components/ShellTools/ShellTools.d.ts +61 -0
  270. package/dist/types/components/ShellTools/index.d.ts +3 -0
  271. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +1 -1
  272. package/dist/types/components.d.ts +953 -19
  273. package/dist/types/shell/index.d.ts +5 -0
  274. package/dist/types/shell/shell-responsive.d.ts +14 -0
  275. package/package.json +1 -1
  276. package/dist/components/p-8OOCLGph.js +0 -2
  277. package/dist/components/p-BWUTr_XN.js.map +0 -1
  278. package/dist/components/p-BpA9uYKX.js +0 -2
  279. package/dist/components/p-C0_8K4y7.js.map +0 -1
  280. package/dist/components/p-CA3kLO7K.js +0 -2
  281. package/dist/components/p-CA3kLO7K.js.map +0 -1
  282. package/dist/components/p-CCHqsF_H.js +0 -2
  283. package/dist/components/p-Cxpl-rzP.js +0 -2
  284. package/dist/components/p-CzBnvtcz.js +0 -2
  285. package/dist/components/p-CzBnvtcz.js.map +0 -1
  286. package/dist/components/p-Dg3xLna0.js +0 -2
  287. package/dist/components/p-XgIQ3oI_.js +0 -2
  288. /package/dist/components/{p-DcGpdIlT.js.map → p-9dQQSgwT.js.map} +0 -0
  289. /package/dist/components/{p-GMDGgtY8.js.map → p-BhxwpOH8.js.map} +0 -0
  290. /package/dist/components/{p-2W-ZjZCR.js.map → p-Biz6xo-z.js.map} +0 -0
  291. /package/dist/components/{p-CG5EX4NW.js.map → p-BtEjlcB9.js.map} +0 -0
  292. /package/dist/components/{p-D6jK2Hyi.js.map → p-C7bZ-jiU.js.map} +0 -0
  293. /package/dist/components/{p-DOCKtrS4.js.map → p-CH6cNXXF.js.map} +0 -0
  294. /package/dist/components/{p-BE_CDJeL.js.map → p-CY19gMiz.js.map} +0 -0
  295. /package/dist/components/{p-CHkI3oIS.js.map → p-Ce52yVXF.js.map} +0 -0
  296. /package/dist/components/{p-xY3TjBF5.js.map → p-CoYFJD-w.js.map} +0 -0
  297. /package/dist/components/{p-DBi1bmOL.js.map → p-CtD24EyI.js.map} +0 -0
  298. /package/dist/components/{p-BRLDJmkh.js.map → p-D-xttdpn.js.map} +0 -0
  299. /package/dist/components/{p-CNffejay.js.map → p-DSa0Hnd3.js.map} +0 -0
  300. /package/dist/components/{p-DyGB97Oy.js.map → p-DYqReipj.js.map} +0 -0
  301. /package/dist/components/{p-B8CubPgQ.js.map → p-g40DTeV8.js.map} +0 -0
@@ -815,7 +815,7 @@
815
815
  {
816
816
  "name": "bar-title",
817
817
  "title": "BarTitle",
818
- "description": "Page-level title chrome with optional route navigation, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
818
+ "description": "Page-level title chrome with an optional expanded route breadcrumb, compact Back action, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
819
819
  "type": "registry:ui",
820
820
  "meta": {
821
821
  "library": "@ds-mo/ui",
@@ -826,11 +826,11 @@
826
826
  "intent": {
827
827
  "audience": "general",
828
828
  "status": "stable",
829
- "summary": "Page-level title chrome with optional route navigation, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
829
+ "summary": "Page-level title chrome with an optional expanded route breadcrumb, compact Back action, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
830
830
  "useWhen": [
831
831
  "A top-level page needs one h1 above its content.",
832
832
  "A list or detail page has multiple route-level sections that belong in the inline active-section menu.",
833
- "A detail page needs a page-level Back action.",
833
+ "A detail page needs route ancestors in expanded presentation and a page-level Back action in compact chrome.",
834
834
  "A page needs one primary action plus optional secondary or destructive overflow commands."
835
835
  ],
836
836
  "avoidWhen": [
@@ -861,6 +861,7 @@
861
861
  "component:ds-shell-page",
862
862
  "component:ds-button-filled",
863
863
  "component:ds-button-unfilled",
864
+ "component:ds-breadcrumb",
864
865
  "component:ds-menu",
865
866
  "component:ds-text"
866
867
  ],
@@ -869,7 +870,8 @@
869
870
  ],
870
871
  "accessibility": [
871
872
  "Provide one concise heading; BarTitle renders exactly one h1 and changes only its visual recipe between variants.",
872
- "Give Back a destination-specific accessible name such as Back to Drivers, provide the concise parent label such as Drivers for the expanded breadcrumb, and handle dsBack in the route owner.",
873
+ "Give compact Back a destination-specific accessible name such as Back to Drivers and handle dsBack in the route owner.",
874
+ "Provide ordered breadcrumb items for deeper expanded paths and handle dsBreadcrumbSelect when native href navigation is not used; backLabel remains the single-parent expanded fallback.",
873
875
  "Keep value synchronized with the current child route; dsSectionChange returns the selected section id.",
874
876
  "Section and overflow triggers expose menu relationships and restore focus after selection or dismissal.",
875
877
  "Use one filled primary action in the page decision area and mark destructive overflow actions explicitly."
@@ -878,7 +880,8 @@
878
880
  "Omitting Back, sections, primaryAction, and actions produces the top-level title-only header.",
879
881
  "Two or more selectable sections add the inline section trigger; one section does not render a redundant menu.",
880
882
  "Dividers in sections or actions create separate Menu groups without becoming selectable rows.",
881
- "expanded renders the larger heading, optional description, inset divider, and an xs icon-label Back breadcrumb in the top inset. The title and right-side actions share one top alignment whether Back is present, while the description remains in the left title column; compact renders 48px chrome with inline Back; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
883
+ "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.",
884
+ "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.",
882
885
  "primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts."
883
886
  ],
884
887
  "responsiveBehavior": [
@@ -889,15 +892,15 @@
889
892
  ],
890
893
  "frameworkCaveats": {
891
894
  "customElements": [
892
- "Assign sections, primaryAction, and actions as JavaScript properties and replace array or object identities when controlled state changes.",
893
- "Handle dsBack in the router owner, update value after dsSectionChange, and execute product commands from dsAction."
895
+ "Assign breadcrumbs, sections, primaryAction, and actions as JavaScript properties and replace array or object identities when controlled state changes.",
896
+ "Handle dsBack for compact navigation and dsBreadcrumbSelect for application-owned expanded breadcrumb navigation, update value after dsSectionChange, and execute product commands from dsAction."
894
897
  ],
895
898
  "react": [
896
- "Pass arrays and objects directly to DsBarTitle and keep value controlled from route state.",
899
+ "Pass breadcrumb, section, and action arrays directly to DsBarTitle and keep value controlled from route state.",
897
900
  "Place DsBarTitle in DsShellPage with slot=header when automatic page behavior is required."
898
901
  ],
899
902
  "angular": [
900
- "Bind complex values on the standalone DsBarTitle adapter and handle the three intent events in the route shell.",
903
+ "Bind complex values on the standalone DsBarTitle adapter and handle Back, breadcrumb, section, and action intent events in the route shell.",
901
904
  "Place ds-bar-title in ds-shell-page with slot=header; do not render router-outlet inside BarTitle."
902
905
  ]
903
906
  },
@@ -933,6 +936,14 @@
933
936
  "type": "string",
934
937
  "required": false
935
938
  },
939
+ "breadcrumbAriaLabel": {
940
+ "type": "string",
941
+ "required": false
942
+ },
943
+ "breadcrumbs": {
944
+ "type": "BreadcrumbItem[]",
945
+ "required": false
946
+ },
936
947
  "description": {
937
948
  "type": "string",
938
949
  "required": false
@@ -975,6 +986,10 @@
975
986
  "name": "dsBack",
976
987
  "detail": "MouseEvent"
977
988
  },
989
+ {
990
+ "name": "dsBreadcrumbSelect",
991
+ "detail": "BreadcrumbSelectDetail"
992
+ },
978
993
  {
979
994
  "name": "dsSectionChange",
980
995
  "detail": "string"
@@ -993,6 +1008,7 @@
993
1008
  "@ds-mo/icons"
994
1009
  ],
995
1010
  "registryDependencies": [
1011
+ "breadcrumb",
996
1012
  "button-filled",
997
1013
  "button-unfilled",
998
1014
  "icon",
@@ -1162,6 +1178,122 @@
1162
1178
  "tooltip"
1163
1179
  ]
1164
1180
  },
1181
+ {
1182
+ "name": "breadcrumb",
1183
+ "title": "Breadcrumb",
1184
+ "description": "Compact hierarchical page navigation with native links or application-owned selection, optional current-page semantics, and slash separators.",
1185
+ "type": "registry:ui",
1186
+ "meta": {
1187
+ "library": "@ds-mo/ui",
1188
+ "distribution": "npm",
1189
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/breadcrumb",
1190
+ "source": "src/wc/components/Breadcrumb/Breadcrumb.tsx",
1191
+ "intentStatus": "complete",
1192
+ "intent": {
1193
+ "audience": "general",
1194
+ "status": "stable",
1195
+ "summary": "Compact hierarchical page navigation with native links or application-owned selection, optional current-page semantics, and slash separators.",
1196
+ "useWhen": [
1197
+ "A page needs to expose its hierarchical ancestors above the current page title.",
1198
+ "Users need to move directly to a broader page in the current route hierarchy.",
1199
+ "BarTitle expanded presentation needs an ancestor path instead of a directional Back button."
1200
+ ],
1201
+ "avoidWhen": [
1202
+ "The navigation represents primary application destinations; use PanelNav or BarNav.",
1203
+ "The choices switch peer views within the current page; use TabGroup or the BarTitle section selector.",
1204
+ "Only a directional return command is needed in compact chrome; use the owning header's Back action.",
1205
+ "The path would repeat the same current-page label already communicated by a nearby h1 without adding useful ancestors."
1206
+ ],
1207
+ "alternatives": [
1208
+ {
1209
+ "when": "The title and breadcrumb belong to responsive page chrome with page-level actions.",
1210
+ "component": "component:ds-bar-title",
1211
+ "reason": "BarTitle composes Breadcrumb in expanded mode and preserves compact Back behavior."
1212
+ },
1213
+ {
1214
+ "when": "A small set of peer content views should remain directly selectable.",
1215
+ "component": "component:ds-tab-group",
1216
+ "reason": "TabGroup communicates peer selection rather than route ancestry."
1217
+ }
1218
+ ],
1219
+ "commonlyComposedWith": [
1220
+ "component:ds-bar-title",
1221
+ "component:ds-text",
1222
+ "component:ds-shell-page"
1223
+ ],
1224
+ "accessibility": [
1225
+ "The component renders a named navigation landmark containing an ordered list.",
1226
+ "Provide href for native navigation or handle dsSelect when the application router owns navigation.",
1227
+ "Mark at most one item current; it renders without interaction and exposes aria-current=page.",
1228
+ "Visible caption labels use secondary foreground and slash separators are decorative and hidden from assistive technology.",
1229
+ "Every interactive item remains keyboard reachable and receives the shared focus ring."
1230
+ ],
1231
+ "states": [
1232
+ "Items with href render native anchors; items without href render buttons and emit the same dsSelect detail.",
1233
+ "Preventing dsSelect cancels native anchor navigation.",
1234
+ "A current item is static text and never emits selection.",
1235
+ "Links have no resting underline and add a quaternary-foreground solid underline on hover; focus remains communicated by the shared focus ring."
1236
+ ],
1237
+ "responsiveBehavior": [
1238
+ "The path stays on one caption line and truncates long labels within the available width.",
1239
+ "Width is protected newest-to-oldest: the oldest ancestor collapses to a literal ellipsis before the next ancestor yields width, and the current location truncates only after every ancestor reaches its minimum.",
1240
+ "A fully collapsed item keeps its complete label available to assistive technology while rendering only the literal ellipsis visually.",
1241
+ "Separators remain visible while labels yield width."
1242
+ ],
1243
+ "frameworkCaveats": {
1244
+ "customElements": [
1245
+ "Assign items as a JavaScript property and replace its array identity when the route changes.",
1246
+ "Use relative or absolute href values for native navigation; omit href when the host router handles dsSelect."
1247
+ ],
1248
+ "react": [
1249
+ "Pass items to DsBreadcrumb and handle onDsSelect when navigation is application-owned."
1250
+ ],
1251
+ "angular": [
1252
+ "Bind items on the standalone DsBreadcrumb adapter and handle dsSelect when navigation is application-owned."
1253
+ ]
1254
+ },
1255
+ "references": [
1256
+ {
1257
+ "label": "Storybook examples",
1258
+ "path": "src/wc/components/Breadcrumb/Breadcrumb.stories.ts"
1259
+ },
1260
+ {
1261
+ "label": "Expanded page-header composition",
1262
+ "path": "src/wc/components/BarTitle/BarTitle.tsx"
1263
+ }
1264
+ ]
1265
+ },
1266
+ "props": {
1267
+ "ariaLabel": {
1268
+ "type": "string",
1269
+ "required": false
1270
+ },
1271
+ "items": {
1272
+ "type": "BreadcrumbItem[]",
1273
+ "required": false
1274
+ }
1275
+ },
1276
+ "events": [
1277
+ {
1278
+ "name": "dsSelect",
1279
+ "detail": "BreadcrumbSelectDetail"
1280
+ }
1281
+ ],
1282
+ "slots": [],
1283
+ "exports": {
1284
+ "customElement": "ds-breadcrumb",
1285
+ "react": "DsBreadcrumb",
1286
+ "angular": "DsBreadcrumb"
1287
+ }
1288
+ },
1289
+ "dependencies": [
1290
+ "@ds-mo/ui",
1291
+ "@ds-mo/tokens"
1292
+ ],
1293
+ "registryDependencies": [
1294
+ "text"
1295
+ ]
1296
+ },
1165
1297
  {
1166
1298
  "name": "button-filled",
1167
1299
  "title": "ButtonFilled",
@@ -1527,6 +1659,123 @@
1527
1659
  "text"
1528
1660
  ]
1529
1661
  },
1662
+ {
1663
+ "name": "card-data-viz-bar",
1664
+ "title": "CardDataVizBar",
1665
+ "description": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
1666
+ "type": "registry:ui",
1667
+ "meta": {
1668
+ "library": "@ds-mo/ui",
1669
+ "distribution": "npm",
1670
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-data-viz-bar",
1671
+ "source": "src/wc/components/CardDataVizBar/CardDataVizBar.tsx",
1672
+ "intentStatus": "complete",
1673
+ "intent": {
1674
+ "audience": "specialized",
1675
+ "status": "experimental",
1676
+ "summary": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
1677
+ "useWhen": [
1678
+ "A dashboard widget needs a regular, stacked, or percentage bar chart in the standard data-viz card.",
1679
+ "A stacked bar chart needs a visible static series key beneath the chart."
1680
+ ],
1681
+ "avoidWhen": [
1682
+ "The visualization needs selectable legend rows or chart-to-legend hover synchronization.",
1683
+ "The product needs supporting metrics or an alternate chart layout beyond the chart and optional legend."
1684
+ ],
1685
+ "alternatives": [
1686
+ {
1687
+ "when": "The bar chart needs a custom layout without card chrome.",
1688
+ "component": "component:ds-chart-bar",
1689
+ "reason": "Compose ChartBar directly in the product-owned layout."
1690
+ },
1691
+ {
1692
+ "when": "The visualization communicates change as continuous lines.",
1693
+ "component": "component:ds-card-data-viz-line",
1694
+ "reason": "CardDataVizLine owns the canonical line-chart card layout."
1695
+ },
1696
+ {
1697
+ "when": "The visualization communicates parts of one total with synchronized slice emphasis.",
1698
+ "component": "component:ds-card-data-viz-donut",
1699
+ "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
1700
+ }
1701
+ ],
1702
+ "commonlyComposedWith": [
1703
+ "component:ds-card-shell-data-viz",
1704
+ "component:ds-chart-bar",
1705
+ "component:ds-chart-bar-stacked",
1706
+ "component:ds-chart-legend",
1707
+ "component:ds-button-unfilled"
1708
+ ],
1709
+ "accessibility": [
1710
+ "Provide a concise heading that identifies the measure and meaningful visible labels for every legend entry.",
1711
+ "Keep essential series and value context available textually rather than relying on bar color alone.",
1712
+ "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1713
+ ],
1714
+ "states": [
1715
+ "The chart region fills the remaining card body while an optional legend remains content-sized.",
1716
+ "The card disables local hover highlighting on a slotted ChartLegend because bar legends are static keys.",
1717
+ "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1718
+ "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1719
+ ],
1720
+ "responsiveBehavior": [
1721
+ "The selected sm, md, or lg shell size controls the card dimensions while the bar chart shrinks within its chart region.",
1722
+ "The horizontal legend wraps complete entries when the available width is constrained.",
1723
+ "The parent dashboard owns card wrapping and breakpoint changes."
1724
+ ],
1725
+ "frameworkCaveats": {
1726
+ "customElements": [
1727
+ "Assign data or series and categories as JavaScript properties, then place the bar chart and optional legend in their named slots."
1728
+ ],
1729
+ "react": [
1730
+ "Keep filter and dataset state in the owner; pass the chart and optional legend with chart and legend slot attributes."
1731
+ ],
1732
+ "angular": [
1733
+ "Keep filter and dataset state in the owner; project the chart and optional legend into the chart and legend slots."
1734
+ ]
1735
+ },
1736
+ "references": [
1737
+ {
1738
+ "label": "Storybook examples",
1739
+ "path": "src/wc/components/CardDataVizBar/CardDataVizBar.stories.ts"
1740
+ }
1741
+ ]
1742
+ },
1743
+ "props": {
1744
+ "cardWidth": {
1745
+ "type": "CardDataVizBarWidth",
1746
+ "required": false
1747
+ },
1748
+ "filterLabel": {
1749
+ "type": "string",
1750
+ "required": false
1751
+ },
1752
+ "heading": {
1753
+ "type": "string",
1754
+ "required": true
1755
+ }
1756
+ },
1757
+ "events": [
1758
+ {
1759
+ "name": "dsFilterClick",
1760
+ "detail": "void"
1761
+ }
1762
+ ],
1763
+ "slots": [],
1764
+ "exports": {
1765
+ "customElement": "ds-card-data-viz-bar",
1766
+ "react": "DsCardDataVizBar",
1767
+ "angular": "DsCardDataVizBar"
1768
+ }
1769
+ },
1770
+ "dependencies": [
1771
+ "@ds-mo/ui",
1772
+ "@ds-mo/tokens"
1773
+ ],
1774
+ "registryDependencies": [
1775
+ "button-unfilled",
1776
+ "card-shell-data-viz"
1777
+ ]
1778
+ },
1530
1779
  {
1531
1780
  "name": "card-data-viz-donut",
1532
1781
  "title": "CardDataVizDonut",
@@ -1644,6 +1893,117 @@
1644
1893
  "card-shell-data-viz"
1645
1894
  ]
1646
1895
  },
1896
+ {
1897
+ "name": "card-data-viz-line",
1898
+ "title": "CardDataVizLine",
1899
+ "description": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
1900
+ "type": "registry:ui",
1901
+ "meta": {
1902
+ "library": "@ds-mo/ui",
1903
+ "distribution": "npm",
1904
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-data-viz-line",
1905
+ "source": "src/wc/components/CardDataVizLine/CardDataVizLine.tsx",
1906
+ "intentStatus": "complete",
1907
+ "intent": {
1908
+ "audience": "specialized",
1909
+ "status": "experimental",
1910
+ "summary": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
1911
+ "useWhen": [
1912
+ "A dashboard widget needs the standard line chart and visible series key in one data-viz card.",
1913
+ "The legend identifies static line series and should not highlight or dim rows on hover."
1914
+ ],
1915
+ "avoidWhen": [
1916
+ "The visualization needs chart-to-legend hover synchronization or selectable series controls.",
1917
+ "The product needs a custom legend treatment, supporting metrics, or an alternate chart layout."
1918
+ ],
1919
+ "alternatives": [
1920
+ {
1921
+ "when": "The line chart and legend need a custom layout without card chrome.",
1922
+ "component": "component:ds-chart-line",
1923
+ "reason": "Compose ChartLine and a static ChartLegend directly in the product-owned layout."
1924
+ },
1925
+ {
1926
+ "when": "The visualization communicates parts of a total with synchronized slice emphasis.",
1927
+ "component": "component:ds-card-data-viz-donut",
1928
+ "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
1929
+ }
1930
+ ],
1931
+ "commonlyComposedWith": [
1932
+ "component:ds-card-shell-data-viz",
1933
+ "component:ds-chart-line",
1934
+ "component:ds-chart-legend",
1935
+ "component:ds-button-unfilled"
1936
+ ],
1937
+ "accessibility": [
1938
+ "Provide a concise heading that identifies the trend and meaningful visible labels for every legend entry.",
1939
+ "Keep essential series and value context available textually rather than relying on line color alone.",
1940
+ "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
1941
+ ],
1942
+ "states": [
1943
+ "The chart region fills the remaining card body while the legend remains content-sized.",
1944
+ "The card disables local hover highlighting on a slotted ChartLegend because the line chart is static.",
1945
+ "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
1946
+ "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
1947
+ ],
1948
+ "responsiveBehavior": [
1949
+ "The selected sm, md, or lg shell size controls the card dimensions while the line chart shrinks within its chart region.",
1950
+ "The horizontal legend wraps complete entries when the available width is constrained.",
1951
+ "The parent dashboard owns card wrapping and breakpoint changes."
1952
+ ],
1953
+ "frameworkCaveats": {
1954
+ "customElements": [
1955
+ "Assign series, categories, and legend items as JavaScript properties, then place the chart and legend in their named slots."
1956
+ ],
1957
+ "react": [
1958
+ "Keep filter and dataset state in the owner; pass the chart and legend with chart and legend slot attributes."
1959
+ ],
1960
+ "angular": [
1961
+ "Keep filter and dataset state in the owner; project the chart and legend into the chart and legend slots."
1962
+ ]
1963
+ },
1964
+ "references": [
1965
+ {
1966
+ "label": "Storybook examples",
1967
+ "path": "src/wc/components/CardDataVizLine/CardDataVizLine.stories.ts"
1968
+ }
1969
+ ]
1970
+ },
1971
+ "props": {
1972
+ "cardWidth": {
1973
+ "type": "CardDataVizLineWidth",
1974
+ "required": false
1975
+ },
1976
+ "filterLabel": {
1977
+ "type": "string",
1978
+ "required": false
1979
+ },
1980
+ "heading": {
1981
+ "type": "string",
1982
+ "required": true
1983
+ }
1984
+ },
1985
+ "events": [
1986
+ {
1987
+ "name": "dsFilterClick",
1988
+ "detail": "void"
1989
+ }
1990
+ ],
1991
+ "slots": [],
1992
+ "exports": {
1993
+ "customElement": "ds-card-data-viz-line",
1994
+ "react": "DsCardDataVizLine",
1995
+ "angular": "DsCardDataVizLine"
1996
+ }
1997
+ },
1998
+ "dependencies": [
1999
+ "@ds-mo/ui",
2000
+ "@ds-mo/tokens"
2001
+ ],
2002
+ "registryDependencies": [
2003
+ "button-unfilled",
2004
+ "card-shell-data-viz"
2005
+ ]
2006
+ },
1647
2007
  {
1648
2008
  "name": "card-setting",
1649
2009
  "title": "CardSetting",
@@ -1826,13 +2186,20 @@
1826
2186
  "when": "The composition is the standard donut chart plus synchronized legend.",
1827
2187
  "component": "component:ds-card-data-viz-donut",
1828
2188
  "reason": "CardDataVizDonut composes this shell with donut-specific regions and hover synchronization."
2189
+ },
2190
+ {
2191
+ "when": "The composition is the standard line chart plus static horizontal legend.",
2192
+ "component": "component:ds-card-data-viz-line",
2193
+ "reason": "CardDataVizLine composes this shell with line-specific regions and disables decorative legend hover."
1829
2194
  }
1830
2195
  ],
1831
2196
  "commonlyComposedWith": [
1832
2197
  "component:ds-chart-bar",
2198
+ "component:ds-chart-bar-stacked",
1833
2199
  "component:ds-chart-donut",
1834
2200
  "component:ds-chart-line",
1835
2201
  "component:ds-chart-legend",
2202
+ "component:ds-card-data-viz-line",
1836
2203
  "component:ds-button-unfilled"
1837
2204
  ],
1838
2205
  "accessibility": [
@@ -1921,6 +2288,11 @@
1921
2288
  "The data communicates a part-to-whole relationship."
1922
2289
  ],
1923
2290
  "alternatives": [
2291
+ {
2292
+ "when": "Each category contains several additive series or needs normalized composition.",
2293
+ "component": "component:ds-chart-bar-stacked",
2294
+ "reason": "ChartBarStacked compares raw stacked totals or normalized 0–100% composition."
2295
+ },
1924
2296
  {
1925
2297
  "when": "Users need to follow one or more trends across ordered categories.",
1926
2298
  "component": "component:ds-chart-line",
@@ -1933,6 +2305,7 @@
1933
2305
  }
1934
2306
  ],
1935
2307
  "commonlyComposedWith": [
2308
+ "component:ds-chart-bar-stacked",
1936
2309
  "component:ds-card-shell-data-viz",
1937
2310
  "component:ds-tooltip-data-viz"
1938
2311
  ],
@@ -1944,6 +2317,7 @@
1944
2317
  "states": [
1945
2318
  "The chart is currently a static single-series rendering without hover, selection, loading, or empty-state policy.",
1946
2319
  "An empty dataset renders no bars; the owning card or product supplies meaningful empty-state messaging.",
2320
+ "Bars use 2px top corner radii while the lower corners touching the zero axis remain square.",
1947
2321
  "Use one consistent bar color across time buckets when every bar is the same measure at a different interval; categorical color changes are for genuinely distinct categories.",
1948
2322
  "Authored datum colors override the shared categorical palette."
1949
2323
  ],
@@ -1999,29 +2373,149 @@
1999
2373
  "registryDependencies": []
2000
2374
  },
2001
2375
  {
2002
- "name": "chart-donut",
2003
- "title": "ChartDonut",
2004
- "description": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2376
+ "name": "chart-bar-stacked",
2377
+ "title": "ChartBarStacked",
2378
+ "description": "Multi-series stacked bar chart for comparing raw totals or normalized 0–100% composition across ordered categories and time buckets.",
2005
2379
  "type": "registry:ui",
2006
2380
  "meta": {
2007
2381
  "library": "@ds-mo/ui",
2008
2382
  "distribution": "npm",
2009
- "storybook": "https://zainadeel.github.io/compomo/?path=/story/chart-donut",
2010
- "source": "src/wc/components/ChartDonut/ChartDonut.tsx",
2383
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/chart-bar-stacked",
2384
+ "source": "src/wc/components/ChartBarStacked/ChartBarStacked.tsx",
2011
2385
  "intentStatus": "complete",
2012
2386
  "intent": {
2013
2387
  "audience": "specialized",
2014
2388
  "status": "experimental",
2015
- "summary": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2389
+ "summary": "Multi-series stacked bar chart for comparing raw totals or normalized 0–100% composition across ordered categories and time buckets.",
2016
2390
  "useWhen": [
2017
- "Users need to understand a small part-to-whole breakdown with a prominent total or status in the center.",
2018
- "A standalone donut needs pointer and keyboard-focus value feedback through a chart-owned data-viz tooltip.",
2019
- "A donut and visible ChartLegend should cross-highlight by matching stable labels."
2391
+ "Users need to compare both a category total and the contribution of several consistent series.",
2392
+ "A time series needs to show how its composition changes across equal time buckets.",
2393
+ "Every category should normalize to 100% so proportional composition can be compared independently of total magnitude."
2020
2394
  ],
2021
2395
  "avoidWhen": [
2022
- "The data is a trend, time sequence, or independent magnitude comparison.",
2023
- "The category count creates slices too small to understand reliably.",
2024
- "Hover is intended to select, filter, or navigate rather than temporarily highlight data."
2396
+ "Users need to compare individual series values precisely across categories; use grouped bars or separate charts.",
2397
+ "The visualization has only one measure per category; use ChartBar.",
2398
+ "The primary task is following continuous trends; use ChartLine.",
2399
+ "Series contain negative values or do not align with the shared category list."
2400
+ ],
2401
+ "alternatives": [
2402
+ {
2403
+ "when": "Each category contains one independent value.",
2404
+ "component": "component:ds-chart-bar",
2405
+ "reason": "ChartBar provides the simpler single-series magnitude comparison."
2406
+ },
2407
+ {
2408
+ "when": "Users need to follow one or more trends rather than compare stack composition.",
2409
+ "component": "component:ds-chart-line",
2410
+ "reason": "ChartLine preserves each series as a continuous path across the ordered axis."
2411
+ },
2412
+ {
2413
+ "when": "One category's parts-to-whole composition is the focus.",
2414
+ "component": "component:ds-chart-donut",
2415
+ "reason": "ChartDonut provides the dedicated single-total composition treatment."
2416
+ }
2417
+ ],
2418
+ "commonlyComposedWith": [
2419
+ "component:ds-chart-legend",
2420
+ "component:ds-card-shell-data-viz",
2421
+ "component:ds-tooltip-data-viz"
2422
+ ],
2423
+ "accessibility": [
2424
+ "Provide a visible legend or adjacent textual summary that names every series; do not rely on segment color alone.",
2425
+ "The chart image name includes each category and series value, using normalized percentages in percentage mode.",
2426
+ "Use an adjacent data table when exact cross-category comparisons are necessary to complete the task."
2427
+ ],
2428
+ "states": [
2429
+ "Stacked mode preserves raw magnitudes and scales the y-axis to the largest category total.",
2430
+ "Percentage mode normalizes each non-empty category independently and renders a fixed 0%, 25%, 50%, 75%, and 100% axis.",
2431
+ "Series render bottom-to-top in authored order; keep that order and color mapping stable across categories.",
2432
+ "Stacked mode gives only the top visible segment 2px top corners. Percentage mode keeps every corner square because the normalized stack touches both axis edges.",
2433
+ "Adjacent segments are separated by a non-scaling 1px gap; the stack's outer edges do not receive that separator.",
2434
+ "Negative values are unsupported and render as zero; the owning product supplies loading, empty, and error states."
2435
+ ],
2436
+ "responsiveBehavior": [
2437
+ "The SVG preserves its authored aspect ratio while shrinking to fit a narrower parent.",
2438
+ "The parent supplies dimensions and chooses how many time buckets remain legible at each width.",
2439
+ "Pre-format category labels and reduce bucket count before rendering when horizontal space becomes constrained."
2440
+ ],
2441
+ "frameworkCaveats": {
2442
+ "customElements": [
2443
+ "Assign series and categories as JavaScript properties and keep every series aligned to the category count."
2444
+ ],
2445
+ "react": [
2446
+ "Pass stable series and category arrays; choose percentage variant only when each category represents a meaningful whole."
2447
+ ],
2448
+ "angular": [
2449
+ "Bind series and categories as properties; choose percentage variant only when each category represents a meaningful whole."
2450
+ ]
2451
+ },
2452
+ "references": [
2453
+ {
2454
+ "label": "Storybook examples",
2455
+ "path": "src/wc/components/ChartBarStacked/ChartBarStacked.stories.ts"
2456
+ }
2457
+ ]
2458
+ },
2459
+ "props": {
2460
+ "categories": {
2461
+ "type": "string[]",
2462
+ "required": false
2463
+ },
2464
+ "height": {
2465
+ "type": "number",
2466
+ "required": false
2467
+ },
2468
+ "series": {
2469
+ "type": "ChartSeries[]",
2470
+ "required": false
2471
+ },
2472
+ "variant": {
2473
+ "type": "ChartBarStackedVariant",
2474
+ "required": false
2475
+ },
2476
+ "width": {
2477
+ "type": "number",
2478
+ "required": false
2479
+ }
2480
+ },
2481
+ "events": [],
2482
+ "slots": [],
2483
+ "exports": {
2484
+ "customElement": "ds-chart-bar-stacked",
2485
+ "react": "DsChartBarStacked",
2486
+ "angular": "DsChartBarStacked"
2487
+ }
2488
+ },
2489
+ "dependencies": [
2490
+ "@ds-mo/ui",
2491
+ "@ds-mo/tokens"
2492
+ ],
2493
+ "registryDependencies": []
2494
+ },
2495
+ {
2496
+ "name": "chart-donut",
2497
+ "title": "ChartDonut",
2498
+ "description": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2499
+ "type": "registry:ui",
2500
+ "meta": {
2501
+ "library": "@ds-mo/ui",
2502
+ "distribution": "npm",
2503
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/chart-donut",
2504
+ "source": "src/wc/components/ChartDonut/ChartDonut.tsx",
2505
+ "intentStatus": "complete",
2506
+ "intent": {
2507
+ "audience": "specialized",
2508
+ "status": "experimental",
2509
+ "summary": "Part-to-whole donut chart with a center aggregate, responsive fill sizing, local slice tooltip feedback, and externally controlled legend highlighting.",
2510
+ "useWhen": [
2511
+ "Users need to understand a small part-to-whole breakdown with a prominent total or status in the center.",
2512
+ "A standalone donut needs pointer and keyboard-focus value feedback through a chart-owned data-viz tooltip.",
2513
+ "A donut and visible ChartLegend should cross-highlight by matching stable labels."
2514
+ ],
2515
+ "avoidWhen": [
2516
+ "The data is a trend, time sequence, or independent magnitude comparison.",
2517
+ "The category count creates slices too small to understand reliably.",
2518
+ "Hover is intended to select, filter, or navigate rather than temporarily highlight data."
2025
2519
  ],
2026
2520
  "alternatives": [
2027
2521
  {
@@ -2178,12 +2672,19 @@
2178
2672
  "when": "The donut belongs in the canonical dashboard card.",
2179
2673
  "component": "component:ds-card-data-viz-donut",
2180
2674
  "reason": "The dedicated card places the legend and handles bidirectional highlight synchronization."
2675
+ },
2676
+ {
2677
+ "when": "A static line chart and series key belong in the canonical dashboard card.",
2678
+ "component": "component:ds-card-data-viz-line",
2679
+ "reason": "The dedicated card places the horizontal legend and disables decorative local hover highlighting."
2181
2680
  }
2182
2681
  ],
2183
2682
  "commonlyComposedWith": [
2184
2683
  "component:ds-chart-donut",
2684
+ "component:ds-chart-bar-stacked",
2185
2685
  "component:ds-chart-line",
2186
2686
  "component:ds-card-data-viz-donut",
2687
+ "component:ds-card-data-viz-line",
2187
2688
  "component:ds-card-shell-data-viz"
2188
2689
  ],
2189
2690
  "accessibility": [
@@ -2193,7 +2694,8 @@
2193
2694
  "Do not rely on swatch color alone; every entry requires a meaningful visible label."
2194
2695
  ],
2195
2696
  "states": [
2196
- "Local pointer or focus interaction and external chart highlight remain separate; both may dim peers, but only a real link row receives interactive affordances.",
2697
+ "Local pointer or focus interaction and external chart highlight remain separate; both may dim peers, but only a real link row receives navigation affordances.",
2698
+ "Disable local hover highlighting for static keys such as a line-chart legend; externally controlled activeLabel highlighting and genuine link affordances remain available.",
2197
2699
  "Hover synchronization is temporary emphasis, never filtering, toggling, or selected state.",
2198
2700
  "Percentage values use one consistent precision across the complete legend.",
2199
2701
  "The list owns pointer leave so moving across row gaps does not clear and reapply highlight."
@@ -2234,6 +2736,10 @@
2234
2736
  "type": "ChartLegendDirection",
2235
2737
  "required": false
2236
2738
  },
2739
+ "highlightOnHover": {
2740
+ "type": "boolean",
2741
+ "required": false
2742
+ },
2237
2743
  "items": {
2238
2744
  "type": "ChartLegendItem[]",
2239
2745
  "required": false
@@ -2316,6 +2822,7 @@
2316
2822
  ],
2317
2823
  "commonlyComposedWith": [
2318
2824
  "component:ds-chart-legend",
2825
+ "component:ds-card-data-viz-line",
2319
2826
  "component:ds-card-shell-data-viz",
2320
2827
  "component:ds-tooltip-data-viz"
2321
2828
  ],
@@ -2326,11 +2833,12 @@
2326
2833
  ],
2327
2834
  "states": [
2328
2835
  "The chart is currently static and does not own hover, selection, loading, or empty-state policy.",
2836
+ "Its standard horizontal legend is a static key with local hover highlighting disabled.",
2329
2837
  "Point markers may be shown or hidden without changing the underlying series meaning.",
2330
2838
  "Authored series colors override the shared categorical palette."
2331
2839
  ],
2332
2840
  "responsiveBehavior": [
2333
- "The owner supplies dimensions and updates them when its layout changes.",
2841
+ "The owner supplies intrinsic dimensions; the SVG preserves its aspect ratio while shrinking to fit a narrower parent.",
2334
2842
  "Category positions are always equally spaced, even when labels represent time.",
2335
2843
  "Reduce or pre-format dense labels before passing them; the chart renders authored labels without a continuous time scale."
2336
2844
  ],
@@ -2855,7 +3363,7 @@
2855
3363
  ],
2856
3364
  "states": [
2857
3365
  "Rows reuse the md choice-item label/subtext recipe used by Menu, including 6px row padding, 2px text inset, and the shared content gap. The enclosing conversation-list scroll region supplies the larger 8px outer container padding.",
2858
- "Busy and error are generic channel-neutral states; the owning product supplies suitable status wording. A busy row pairs its body-small status with the sm 16px Loader at an 8px gap.",
3366
+ "Busy and error are generic channel-neutral states; the owning product supplies suitable status wording. A busy row pairs its body-small status with the sm 16px Loader at a 4px gap.",
2859
3367
  "Any positive unreadCount renders one dot on the title row rather than a visible counter; the accessible row name may still announce the exact unread quantity.",
2860
3368
  "Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
2861
3369
  "The title uses body-medium, not title-small, and the body-small preview truncates after one line. Unread titles use emphasis with primary foreground; read titles use regular weight with secondary foreground.",
@@ -4101,10 +4609,11 @@
4101
4609
  ],
4102
4610
  "accessibility": [
4103
4611
  "Author and time metadata remain textual when they are necessary to interpret the transcript.",
4104
- "Delivery failure uses negative Failed to send text in the footer while the message bubble keeps its normal outgoing treatment."
4612
+ "Delivery failure uses negative Failed to send text in the footer while the message bubble keeps its normal outgoing treatment; when time is also visible, a tertiary middle dot separates the failure label and timestamp."
4105
4613
  ],
4106
4614
  "states": [
4107
4615
  "Pass an ISO timestamp. Message keeps the full value in dateTime and formats the visible value as a localized time; applications must not render a raw ISO string as visible transcript metadata.",
4616
+ "A visible incoming author uses body-small emphasis with primary foreground; timestamp and delivery metadata remain caption text.",
4108
4617
  "Visible author, bubble content, and timestamp or delivery footer use consistent 4px vertical gaps.",
4109
4618
  "Grouping joins adjacent bubble corners, shows the incoming author only at the start, and shows delivery/time metadata only at the end. Outgoing author remains in the accessible message label without repeating a visible You label.",
4110
4619
  "Set showAuthor false only when the product makes participant and assistant roles visually self-evident; continue passing author so the accessible message label remains specific."
@@ -4393,7 +4902,9 @@
4393
4902
  "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."
4394
4903
  ],
4395
4904
  "responsiveBehavior": [
4396
- "Transcript width is readable while the scroll region fills available height."
4905
+ "Transcript width is readable while the scroll region fills available height.",
4906
+ "For a narrower fullscreen conversation lane, set --ds-message-scroller-content-max-width on the host instead of constraining the host; the full-width viewport then keeps its scrollbar at the outer edge while the transcript remains centered.",
4907
+ "The custom property sizes the padded transcript box. If the target is the usable conversation width, add the transcript's two 16px inline paddings and size the centered overlay container to the same target plus its two 8px paddings so messages and the visible composer align."
4397
4908
  ],
4398
4909
  "references": [
4399
4910
  {
@@ -6218,7 +6729,7 @@
6218
6729
  "summary": "The single required workspace root for standard authenticated application pages, coordinating primary and secondary navigation, tools chrome, responsive composition, content geometry, shared styling, and shell behavior.",
6219
6730
  "useWhen": [
6220
6731
  "Building any standard authenticated product or workspace page with CompoMo.",
6221
- "PanelNav, BarNav, PanelTools, page content, shared chrome, responsive behavior, and shell shortcuts must be composed as one application frame.",
6732
+ "PanelNav, BarNav, ShellTools, mobile navigation, page content, shared chrome, responsive behavior, and shell shortcuts must be composed as one application frame.",
6222
6733
  "Future application templates need the supported base-page composition boundary."
6223
6734
  ],
6224
6735
  "avoidWhen": [
@@ -6230,6 +6741,10 @@
6230
6741
  "component:ds-panel-nav",
6231
6742
  "component:ds-bar-nav",
6232
6743
  "component:ds-panel-tools",
6744
+ "component:ds-shell-tools",
6745
+ "component:ds-shell-mobile-nav",
6746
+ "component:ds-shell-mobile-section-nav",
6747
+ "component:ds-shell-mobile-bar",
6233
6748
  "component:ds-shell-page",
6234
6749
  "component:ds-swatch-picker"
6235
6750
  ],
@@ -6240,16 +6755,17 @@
6240
6755
  "accessibility": [
6241
6756
  "Keep primary destinations in PanelNav and secondary route sections in BarNav.",
6242
6757
  "Ensure the default content region contains the page's single main landmark.",
6243
- "Keep PanelNav, BarNav, and PanelTools chrome available in the shell's supported desktop and tablet compositions.",
6758
+ "Keep PanelNav, BarNav, and PanelTools-compatible chrome available in desktop and tablet compositions and the persistent mobile bar available below 768px.",
6244
6759
  "Do not override browser keyboard chords when enabling shell shortcuts.",
6245
6760
  "Require Search and Help as the minimum PanelTools actions and provide accessible labels for every tool.",
6246
6761
  "Preserve focus and accessible names across navigation, collapse, overflow, and responsive presentation changes."
6247
6762
  ],
6248
6763
  "states": [
6249
6764
  "Render exactly one ShellApp as the workspace root and never nest it.",
6250
- "PanelNav, BarNav, and PanelTools are required shell regions; PanelTools contains at least Search and Help even when no additional product tools apply.",
6765
+ "PanelNav, BarNav, and ShellTools are the responsive shell regions; ShellTools contains at least Search and Help even when no additional product tools apply.",
6251
6766
  "The application router owns the current route, authorization filtering, Dashboard or Settings context, destination collections, section collections, and localized content labels.",
6252
- "ShellApp propagates navStyle and coordinates layout, gradient alignment, transitions, metrics, shortcuts, and responsive composition.",
6767
+ "ShellApp propagates navStyle and resolved responsive mode and coordinates layout, gradient alignment, transitions, metrics, shortcuts, and mobile-stage visibility.",
6768
+ "The application controls mobileDestination and mobileNavigationOpen and keeps router state independent from global tool-surface changes.",
6253
6769
  "Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
6254
6770
  "The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; ShellApp owns rendering the resolved preset across authenticated routes.",
6255
6771
  "Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
@@ -6262,9 +6778,10 @@
6262
6778
  "ShellApp owns the fixed system breakpoints and resolves desktop at 1200px and wider, tablet from 768px through 1199px, and mobile below 768px.",
6263
6779
  "On desktop, PanelNav defaults expanded, permits user collapse or expansion, and respects the locally persisted desktop preference.",
6264
6780
  "On tablet, ShellApp keeps PanelNav permanently collapsed and prevents user expansion without overwriting the desktop preference.",
6265
- "On mobile, ShellApp remains the page root but replaces PanelNav and desktop navigation composition with a future dedicated mobile navigation design.",
6781
+ "On mobile, ShellApp hides and inerts PanelNav and BarNav, uses a solid primary stage, and composes MobileNav, MobileSectionNav, ShellTools, and the persistent five-item MobileBar.",
6782
+ "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
6266
6783
  "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
6267
- "The current runtime does not yet implement the complete desktop, tablet, and mobile composition contract; consuming applications must enforce missing breakpoint behavior until ShellApp provides it."
6784
+ "The bottom bar remains visible at all route and tool depths in the foundation release."
6268
6785
  ],
6269
6786
  "frameworkCaveats": {
6270
6787
  "customElements": [
@@ -6272,7 +6789,7 @@
6272
6789
  "Stamp route-derived nav-style before components connect when deterministic first paint is required."
6273
6790
  ],
6274
6791
  "react": [
6275
- "Use generated wrappers and preserve native slot names for PanelNav, BarNav, PanelTools, and main content.",
6792
+ "Use generated wrappers and preserve native slot names for desktop navigation, responsive tools, mobile navigation, and main content.",
6276
6793
  "Resolve all shell inputs from one router state before rendering the composition."
6277
6794
  ],
6278
6795
  "angular": [
@@ -6305,6 +6822,14 @@
6305
6822
  "type": "ShellGradientPreset",
6306
6823
  "required": false
6307
6824
  },
6825
+ "mobileDestination": {
6826
+ "type": "ShellMobileDestination",
6827
+ "required": false
6828
+ },
6829
+ "mobileNavigationOpen": {
6830
+ "type": "boolean",
6831
+ "required": false
6832
+ },
6308
6833
  "navStyle": {
6309
6834
  "type": "NavChromeStyle",
6310
6835
  "required": false
@@ -6314,7 +6839,12 @@
6314
6839
  "required": false
6315
6840
  }
6316
6841
  },
6317
- "events": [],
6842
+ "events": [
6843
+ {
6844
+ "name": "dsResponsiveModeChange",
6845
+ "detail": "{ mode: ShellResponsiveMode }"
6846
+ }
6847
+ ],
6318
6848
  "slots": [],
6319
6849
  "exports": {
6320
6850
  "customElement": "ds-shell-app",
@@ -6545,10 +7075,371 @@
6545
7075
  ],
6546
7076
  "registryDependencies": []
6547
7077
  },
7078
+ {
7079
+ "name": "shell-mobile-bar",
7080
+ "title": "ShellMobileBar",
7081
+ "description": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
7082
+ "type": "registry:ui",
7083
+ "meta": {
7084
+ "library": "@ds-mo/ui",
7085
+ "distribution": "npm",
7086
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/shell-mobile-bar",
7087
+ "source": "src/wc/components/ShellMobileBar/ShellMobileBar.tsx",
7088
+ "intentStatus": "complete",
7089
+ "intent": {
7090
+ "audience": "specialized",
7091
+ "status": "experimental",
7092
+ "summary": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
7093
+ "useWhen": [
7094
+ "ShellApp is rendering its dedicated below-768px application composition."
7095
+ ],
7096
+ "avoidWhen": [
7097
+ "Rendering desktop or tablet shell chrome.",
7098
+ "An arbitrary set of product tabs is required."
7099
+ ],
7100
+ "commonlyComposedWith": [
7101
+ "component:ds-shell-app"
7102
+ ],
7103
+ "patterns": [
7104
+ "pattern:application-shell"
7105
+ ],
7106
+ "accessibility": [
7107
+ "Every item keeps a visible label and accessible name.",
7108
+ "Only the active destination exposes aria-current; Menu exposes its controlled pane through aria-expanded."
7109
+ ],
7110
+ "states": [
7111
+ "The item order is fixed: Menu, current area, Search, Agents, Inbox.",
7112
+ "Reselecting an active destination does not reset its nested state."
7113
+ ],
7114
+ "responsiveBehavior": [
7115
+ "Render only below the mobile breakpoint and preserve safe-area clearance."
7116
+ ],
7117
+ "references": [
7118
+ {
7119
+ "label": "Storybook",
7120
+ "path": "src/wc/components/ShellMobileBar/ShellMobileBar.stories.ts"
7121
+ }
7122
+ ]
7123
+ },
7124
+ "props": {
7125
+ "activeDestination": {
7126
+ "type": "ShellMobileDestination",
7127
+ "required": false
7128
+ },
7129
+ "agentsDot": {
7130
+ "type": "boolean",
7131
+ "required": false
7132
+ },
7133
+ "agentsLabel": {
7134
+ "type": "string",
7135
+ "required": false
7136
+ },
7137
+ "currentArea": {
7138
+ "type": "PanelNavItem",
7139
+ "required": false
7140
+ },
7141
+ "inboxDot": {
7142
+ "type": "boolean",
7143
+ "required": false
7144
+ },
7145
+ "inboxLabel": {
7146
+ "type": "string",
7147
+ "required": false
7148
+ },
7149
+ "menuLabel": {
7150
+ "type": "string",
7151
+ "required": false
7152
+ },
7153
+ "navigationExpanded": {
7154
+ "type": "boolean",
7155
+ "required": false
7156
+ },
7157
+ "searchDot": {
7158
+ "type": "boolean",
7159
+ "required": false
7160
+ },
7161
+ "searchLabel": {
7162
+ "type": "string",
7163
+ "required": false
7164
+ }
7165
+ },
7166
+ "events": [
7167
+ {
7168
+ "name": "dsDestinationChange",
7169
+ "detail": "ShellMobileBarDestinationDetail"
7170
+ },
7171
+ {
7172
+ "name": "dsNavigationToggle",
7173
+ "detail": "boolean"
7174
+ }
7175
+ ],
7176
+ "slots": [],
7177
+ "exports": {
7178
+ "customElement": "ds-shell-mobile-bar",
7179
+ "react": "DsShellMobileBar",
7180
+ "angular": "DsShellMobileBar"
7181
+ }
7182
+ },
7183
+ "dependencies": [
7184
+ "@ds-mo/ui",
7185
+ "@ds-mo/tokens",
7186
+ "@ds-mo/icons"
7187
+ ],
7188
+ "registryDependencies": [
7189
+ "icon",
7190
+ "text"
7191
+ ]
7192
+ },
7193
+ {
7194
+ "name": "shell-mobile-nav",
7195
+ "title": "ShellMobileNav",
7196
+ "description": "Full-height mobile primary navigation pane with local Dashboard and Settings browsing.",
7197
+ "type": "registry:ui",
7198
+ "meta": {
7199
+ "library": "@ds-mo/ui",
7200
+ "distribution": "npm",
7201
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/shell-mobile-nav",
7202
+ "source": "src/wc/components/ShellMobileNav/ShellMobileNav.tsx",
7203
+ "intentStatus": "complete",
7204
+ "intent": {
7205
+ "audience": "specialized",
7206
+ "status": "experimental",
7207
+ "summary": "Full-height mobile primary navigation pane with local Dashboard and Settings browsing.",
7208
+ "useWhen": [
7209
+ "The mobile ShellApp Menu control needs to expose the complete primary navigation collection."
7210
+ ],
7211
+ "avoidWhen": [
7212
+ "Rendering desktop PanelNav.",
7213
+ "Switching local page content."
7214
+ ],
7215
+ "commonlyComposedWith": [
7216
+ "component:ds-shell-app",
7217
+ "component:ds-shell-mobile-bar"
7218
+ ],
7219
+ "patterns": [
7220
+ "pattern:application-shell"
7221
+ ],
7222
+ "accessibility": [
7223
+ "The pane is a named navigation landmark and retains visible labels for every destination.",
7224
+ "Escape requests dismissal and opening moves focus to the selected or first available area."
7225
+ ],
7226
+ "states": [
7227
+ "Dashboard and Settings change only the collection being browsed.",
7228
+ "Area, Help, and Account events express intent while the application owns navigation and product behavior."
7229
+ ],
7230
+ "responsiveBehavior": [
7231
+ "The pane fills the mobile content stage while the bottom bar remains available."
7232
+ ],
7233
+ "references": [
7234
+ {
7235
+ "label": "Storybook",
7236
+ "path": "src/wc/components/ShellMobileNav/ShellMobileNav.stories.ts"
7237
+ }
7238
+ ]
7239
+ },
7240
+ "props": {
7241
+ "accountLabel": {
7242
+ "type": "string",
7243
+ "required": false
7244
+ },
7245
+ "browseContext": {
7246
+ "type": "NavChromeStyle",
7247
+ "required": false
7248
+ },
7249
+ "currentUrl": {
7250
+ "type": "string",
7251
+ "required": false
7252
+ },
7253
+ "dashboardGroups": {
7254
+ "type": "PanelNavGroup[]",
7255
+ "required": false
7256
+ },
7257
+ "dashboardLabel": {
7258
+ "type": "string",
7259
+ "required": false
7260
+ },
7261
+ "heading": {
7262
+ "type": "string",
7263
+ "required": false
7264
+ },
7265
+ "helpLabel": {
7266
+ "type": "string",
7267
+ "required": false
7268
+ },
7269
+ "navigationLabel": {
7270
+ "type": "string",
7271
+ "required": false
7272
+ },
7273
+ "open": {
7274
+ "type": "boolean",
7275
+ "required": false
7276
+ },
7277
+ "settingsGroups": {
7278
+ "type": "PanelNavGroup[]",
7279
+ "required": false
7280
+ },
7281
+ "settingsLabel": {
7282
+ "type": "string",
7283
+ "required": false
7284
+ }
7285
+ },
7286
+ "events": [
7287
+ {
7288
+ "name": "dsAreaSelect",
7289
+ "detail": "string"
7290
+ },
7291
+ {
7292
+ "name": "dsAuxiliarySelect",
7293
+ "detail": "ShellMobileNavAuxiliaryDetail"
7294
+ },
7295
+ {
7296
+ "name": "dsBrowseContextChange",
7297
+ "detail": "NavChromeStyle"
7298
+ },
7299
+ {
7300
+ "name": "dsClose",
7301
+ "detail": "void"
7302
+ }
7303
+ ],
7304
+ "slots": [],
7305
+ "exports": {
7306
+ "customElement": "ds-shell-mobile-nav",
7307
+ "react": "DsShellMobileNav",
7308
+ "angular": "DsShellMobileNav"
7309
+ }
7310
+ },
7311
+ "dependencies": [
7312
+ "@ds-mo/ui",
7313
+ "@ds-mo/tokens",
7314
+ "@ds-mo/icons"
7315
+ ],
7316
+ "registryDependencies": [
7317
+ "icon",
7318
+ "tab-group",
7319
+ "text"
7320
+ ]
7321
+ },
7322
+ {
7323
+ "name": "shell-mobile-section-nav",
7324
+ "title": "ShellMobileSectionNav",
7325
+ "description": "Horizontally scrollable mobile route navigation corresponding to the active area's desktop BarNav.",
7326
+ "type": "registry:ui",
7327
+ "meta": {
7328
+ "library": "@ds-mo/ui",
7329
+ "distribution": "npm",
7330
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/shell-mobile-section-nav",
7331
+ "source": "src/wc/components/ShellMobileSectionNav/ShellMobileSectionNav.tsx",
7332
+ "intentStatus": "complete",
7333
+ "intent": {
7334
+ "audience": "specialized",
7335
+ "status": "experimental",
7336
+ "summary": "Horizontally scrollable mobile route navigation corresponding to the active area's desktop BarNav.",
7337
+ "useWhen": [
7338
+ "ShellApp is rendering the below-768px routed workspace and the active area has peer route sections."
7339
+ ],
7340
+ "avoidWhen": [
7341
+ "Choices switch local content without navigation; use TabGroup.",
7342
+ "Rendering the desktop or tablet secondary navigation; use BarNav."
7343
+ ],
7344
+ "alternatives": [
7345
+ {
7346
+ "when": "The choices switch local content without changing routes.",
7347
+ "component": "component:ds-tab-group",
7348
+ "reason": "TabGroup owns local view selection."
7349
+ }
7350
+ ],
7351
+ "commonlyComposedWith": [
7352
+ "component:ds-shell-app",
7353
+ "component:ds-shell-mobile-bar",
7354
+ "component:ds-bar-nav"
7355
+ ],
7356
+ "patterns": [
7357
+ "pattern:application-shell"
7358
+ ],
7359
+ "accessibility": [
7360
+ "The row is a named navigation landmark and the selected section exposes aria-current.",
7361
+ "Disabled route sections remain visible but cannot emit navigation intent."
7362
+ ],
7363
+ "states": [
7364
+ "The host router owns the current URL and handles dsTabChange.",
7365
+ "Detail routes that do not match a section show the active-area heading."
7366
+ ],
7367
+ "responsiveBehavior": [
7368
+ "The row scrolls horizontally without wrapping and centers the selected section when selection changes."
7369
+ ],
7370
+ "frameworkCaveats": {
7371
+ "customElements": [
7372
+ "Assign tabs as a JavaScript property and update currentUrl and basePath with router state."
7373
+ ],
7374
+ "react": [
7375
+ "Pass the same BarNavTab array used by the desktop BarNav through the generated React wrapper."
7376
+ ],
7377
+ "angular": [
7378
+ "Import the generated standalone adapter and bind tabs as a property."
7379
+ ]
7380
+ },
7381
+ "references": [
7382
+ {
7383
+ "label": "Storybook",
7384
+ "path": "src/wc/components/ShellMobileSectionNav/ShellMobileSectionNav.stories.ts"
7385
+ }
7386
+ ]
7387
+ },
7388
+ "props": {
7389
+ "basePath": {
7390
+ "type": "string",
7391
+ "required": false
7392
+ },
7393
+ "currentUrl": {
7394
+ "type": "string",
7395
+ "required": false
7396
+ },
7397
+ "heading": {
7398
+ "type": "string | undefined",
7399
+ "required": false
7400
+ },
7401
+ "navigationLabel": {
7402
+ "type": "string",
7403
+ "required": false
7404
+ },
7405
+ "tabs": {
7406
+ "type": "BarNavTab[]",
7407
+ "required": false
7408
+ },
7409
+ "tabsJson": {
7410
+ "type": "string",
7411
+ "required": false
7412
+ },
7413
+ "value": {
7414
+ "type": "string",
7415
+ "required": false
7416
+ }
7417
+ },
7418
+ "events": [
7419
+ {
7420
+ "name": "dsTabChange",
7421
+ "detail": "string"
7422
+ }
7423
+ ],
7424
+ "slots": [],
7425
+ "exports": {
7426
+ "customElement": "ds-shell-mobile-section-nav",
7427
+ "react": "DsShellMobileSectionNav",
7428
+ "angular": "DsShellMobileSectionNav"
7429
+ }
7430
+ },
7431
+ "dependencies": [
7432
+ "@ds-mo/ui",
7433
+ "@ds-mo/tokens"
7434
+ ],
7435
+ "registryDependencies": [
7436
+ "text"
7437
+ ]
7438
+ },
6548
7439
  {
6549
7440
  "name": "shell-page",
6550
7441
  "title": "ShellPage",
6551
- "description": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, container-aware BarTitle variants, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
7442
+ "description": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6552
7443
  "type": "registry:ui",
6553
7444
  "meta": {
6554
7445
  "library": "@ds-mo/ui",
@@ -6559,10 +7450,10 @@
6559
7450
  "intent": {
6560
7451
  "audience": "general",
6561
7452
  "status": "stable",
6562
- "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, container-aware BarTitle variants, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
7453
+ "summary": "The standard routed-page boundary inside ShellApp, owning sticky BarTitle or BarWorkflow placement, application-supplied BarTitle capacity, stable scroll compaction, and optional page-content inset without creating a nested scroll container.",
6563
7454
  "useWhen": [
6564
7455
  "Rendering a standard routed page inside ShellApp's default content region.",
6565
- "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the page column narrows.",
7456
+ "BarTitle should expand at a roomy page top, compact after scroll, or use constrained action layout when the application shell reports reduced capacity.",
6566
7457
  "BarWorkflow needs sticky page-level placement while remaining compact.",
6567
7458
  "Pages need consistent content gutters with an explicit full-bleed option."
6568
7459
  ],
@@ -6599,16 +7490,18 @@
6599
7490
  "Responsive variant changes preserve the same heading, controls, accessible names, and keyboard focus targets."
6600
7491
  ],
6601
7492
  "states": [
6602
- "headerPresentation=auto selects expanded, compact, or constrained from ShellPage's own inline capacity and scroll position.",
7493
+ "headerCapacity=roomy, compact, or constrained is supplied before paint by the owning application shell and describes the page-header space available after viewport and shell-chrome policy are applied.",
7494
+ "headerPresentation=auto selects the matching header variant from headerCapacity and scroll position.",
6603
7495
  "expanded, compact, and constrained are explicit overrides for exceptional layouts and deterministic examples.",
6604
7496
  "contentInset=default supplies standard page gutters; none permits maps, canvases, and other full-bleed content.",
6605
7497
  "The required header slot accepts one BarTitle or BarWorkflow. The default slot owns router output and all page product content."
6606
7498
  ],
6607
7499
  "responsiveBehavior": [
6608
- "ShellPage observes its own rendered width instead of viewport media queries or ShellApp desktop/tablet modes.",
6609
- "Roomy pages expand at the top and compact after scroll; medium-capacity pages start compact; narrow pages use the constrained header variant.",
6610
- "A newly navigated header resolves current page capacity before it is revealed, so persistent tool or navigation chrome cannot flash the expanded presentation first.",
6611
- "Token-based capacity bands use hysteresis so opening tools or resizing navigation cannot oscillate near a boundary.",
7500
+ "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.",
7501
+ "Roomy capacity expands at the top and compacts after scroll; compact capacity stays compact; constrained capacity uses the constrained action layout.",
7502
+ "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.",
7503
+ "Update headerCapacity synchronously with shell layout state so opening tools or crossing application breakpoints cannot briefly render the wrong presentation.",
7504
+ "On roomy pages, the expanded header scrolls upward until its title and action row reaches the compact row position, then snaps variants without moving that shared visual anchor.",
6612
7505
  "Scroll compaction preserves the expanded page flow offset so content never jumps beneath the sticky header.",
6613
7506
  "ShellPage relies on ShellApp's content scroller and never introduces nested scrolling.",
6614
7507
  "BarWorkflow remains compact and is not assigned BarTitle's capacity or scroll variants."
@@ -6647,6 +7540,10 @@
6647
7540
  "type": "ShellPageContentInset",
6648
7541
  "required": false
6649
7542
  },
7543
+ "headerCapacity": {
7544
+ "type": "ShellPageCapacity",
7545
+ "required": false
7546
+ },
6650
7547
  "headerPresentation": {
6651
7548
  "type": "ShellPageHeaderPresentation",
6652
7549
  "required": false
@@ -6666,6 +7563,172 @@
6666
7563
  ],
6667
7564
  "registryDependencies": []
6668
7565
  },
7566
+ {
7567
+ "name": "shell-tools",
7568
+ "title": "ShellTools",
7569
+ "description": "Responsive persistent host for shell tools, adapting PanelTools rail and drawer chrome to full-stage mobile Search, Agents, and Inbox surfaces.",
7570
+ "type": "registry:ui",
7571
+ "meta": {
7572
+ "library": "@ds-mo/ui",
7573
+ "distribution": "npm",
7574
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/shell-tools",
7575
+ "source": "src/wc/components/ShellTools/ShellTools.tsx",
7576
+ "intentStatus": "complete",
7577
+ "intent": {
7578
+ "audience": "specialized",
7579
+ "status": "experimental",
7580
+ "summary": "Responsive persistent host for shell tools, adapting PanelTools rail and drawer chrome to full-stage mobile Search, Agents, and Inbox surfaces.",
7581
+ "useWhen": [
7582
+ "A ShellApp must preserve the same Search, Agents, Messages, Stacks, Activity, and Help product owners across desktop, tablet, and mobile."
7583
+ ],
7584
+ "avoidWhen": [
7585
+ "The tools exist only in desktop and tablet chrome; PanelTools remains supported for that case.",
7586
+ "The content is a routed primary application area."
7587
+ ],
7588
+ "alternatives": [
7589
+ {
7590
+ "when": "Only legacy rail and drawer behavior is required.",
7591
+ "component": "component:ds-panel-tools",
7592
+ "reason": "PanelTools remains the backward-compatible desktop and tablet primitive."
7593
+ }
7594
+ ],
7595
+ "commonlyComposedWith": [
7596
+ "component:ds-shell-app",
7597
+ "component:ds-panel-tool-header",
7598
+ "component:ds-shell-mobile-bar"
7599
+ ],
7600
+ "patterns": [
7601
+ "pattern:application-shell"
7602
+ ],
7603
+ "accessibility": [
7604
+ "Only the active mobile tool view participates in focus or the accessibility tree.",
7605
+ "Header Back and application-owned header actions preserve the PanelTools event contract.",
7606
+ "Inbox uses TabGroup semantics for Messages, Stacks, and Activity."
7607
+ ],
7608
+ "states": [
7609
+ "The application owns open and activeTool and replaces headers when tool depth changes.",
7610
+ "Messages, Stacks, and Activity map to one mobile Inbox destination while retaining the actual active tool id.",
7611
+ "Switching responsive mode must not recreate application-owned slotted product elements."
7612
+ ],
7613
+ "responsiveBehavior": [
7614
+ "Desktop and tablet compose PanelTools-compatible rail and drawer chrome.",
7615
+ "Mobile renders the active tool across the shell stage and groups available inbox tools in a segmented control."
7616
+ ],
7617
+ "frameworkCaveats": {
7618
+ "customElements": [
7619
+ "Assign items and headers as JavaScript properties and place each persistent owner in its named *-view slot."
7620
+ ],
7621
+ "react": [
7622
+ "Keep stable keyed product owner elements in the generated wrapper's named slots."
7623
+ ],
7624
+ "angular": [
7625
+ "Bind structured items and headers as properties and keep each tool owner mounted under a named *-view slot."
7626
+ ]
7627
+ },
7628
+ "references": [
7629
+ {
7630
+ "label": "Storybook",
7631
+ "path": "src/wc/components/ShellTools/ShellTools.stories.ts"
7632
+ },
7633
+ {
7634
+ "label": "PanelTools contract",
7635
+ "path": "src/wc/components/PanelTools/PanelTools.agent.json"
7636
+ }
7637
+ ]
7638
+ },
7639
+ "props": {
7640
+ "activeTool": {
7641
+ "type": "PanelToolsToolId | ''",
7642
+ "required": false
7643
+ },
7644
+ "fullscreenHeaderMode": {
7645
+ "type": "'shared' | 'split'",
7646
+ "required": false
7647
+ },
7648
+ "headers": {
7649
+ "type": "PanelToolsHeaders",
7650
+ "required": false
7651
+ },
7652
+ "headersJson": {
7653
+ "type": "string",
7654
+ "required": false
7655
+ },
7656
+ "inboxLabel": {
7657
+ "type": "string",
7658
+ "required": false
7659
+ },
7660
+ "inboxNavigationLabel": {
7661
+ "type": "string",
7662
+ "required": false
7663
+ },
7664
+ "items": {
7665
+ "type": "PanelToolsItem[]",
7666
+ "required": false
7667
+ },
7668
+ "itemsJson": {
7669
+ "type": "string",
7670
+ "required": false
7671
+ },
7672
+ "open": {
7673
+ "type": "boolean",
7674
+ "required": false
7675
+ },
7676
+ "presentation": {
7677
+ "type": "'drawer' | 'fullscreen'",
7678
+ "required": false
7679
+ },
7680
+ "responsiveMode": {
7681
+ "type": "ShellResponsiveMode",
7682
+ "required": false
7683
+ },
7684
+ "storageKey": {
7685
+ "type": "string",
7686
+ "required": false
7687
+ },
7688
+ "toolShortcutsLabel": {
7689
+ "type": "string",
7690
+ "required": false
7691
+ },
7692
+ "toolsLabel": {
7693
+ "type": "string",
7694
+ "required": false
7695
+ }
7696
+ },
7697
+ "events": [
7698
+ {
7699
+ "name": "dsHeaderAction",
7700
+ "detail": "{\n tool: PanelToolsToolId;\n id: string;\n }"
7701
+ },
7702
+ {
7703
+ "name": "dsHeaderBack",
7704
+ "detail": "{\n tool: PanelToolsToolId;\n }"
7705
+ },
7706
+ {
7707
+ "name": "dsPresentationChange",
7708
+ "detail": "{\n presentation: 'drawer' | 'fullscreen';\n }"
7709
+ },
7710
+ {
7711
+ "name": "dsToolChange",
7712
+ "detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }"
7713
+ }
7714
+ ],
7715
+ "slots": [],
7716
+ "exports": {
7717
+ "customElement": "ds-shell-tools",
7718
+ "react": "DsShellTools",
7719
+ "angular": "DsShellTools"
7720
+ }
7721
+ },
7722
+ "dependencies": [
7723
+ "@ds-mo/ui",
7724
+ "@ds-mo/tokens"
7725
+ ],
7726
+ "registryDependencies": [
7727
+ "panel-tool-header",
7728
+ "panel-tools",
7729
+ "tab-group"
7730
+ ]
7731
+ },
6669
7732
  {
6670
7733
  "name": "skeleton",
6671
7734
  "title": "Skeleton",
@@ -8217,12 +9280,12 @@
8217
9280
  "pattern:conversation"
8218
9281
  ],
8219
9282
  "accessibility": [
8220
- "Provide concise localized status text that names the participant when that context is not otherwise clear.",
9283
+ "Provide concise localized status text; the standard label is Typing followed by a three-dot ellipsis.",
8221
9284
  "The polite atomic status announces typing without representing it as a message bubble."
8222
9285
  ],
8223
9286
  "states": [
8224
9287
  "TypingIndicator is transient conversation status, never persisted message content.",
8225
- "Its body-small secondary text may shimmer, while reduced-motion preferences retain a static readable status."
9288
+ "Its body-medium secondary text may shimmer, while reduced-motion preferences retain a static readable status."
8226
9289
  ],
8227
9290
  "responsiveBehavior": [
8228
9291
  "The indicator fills the message content width and wraps only when localized status text requires it."