@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
@@ -0,0 +1,205 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "breadcrumb",
4
+ "title": "Breadcrumb",
5
+ "description": "Compact hierarchical page navigation with native links or application-owned selection, optional current-page semantics, and slash separators.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/breadcrumb",
11
+ "source": "src/wc/components/Breadcrumb/Breadcrumb.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "stable",
16
+ "summary": "Compact hierarchical page navigation with native links or application-owned selection, optional current-page semantics, and slash separators.",
17
+ "useWhen": [
18
+ "A page needs to expose its hierarchical ancestors above the current page title.",
19
+ "Users need to move directly to a broader page in the current route hierarchy.",
20
+ "BarTitle expanded presentation needs an ancestor path instead of a directional Back button."
21
+ ],
22
+ "avoidWhen": [
23
+ "The navigation represents primary application destinations; use PanelNav or BarNav.",
24
+ "The choices switch peer views within the current page; use TabGroup or the BarTitle section selector.",
25
+ "Only a directional return command is needed in compact chrome; use the owning header's Back action.",
26
+ "The path would repeat the same current-page label already communicated by a nearby h1 without adding useful ancestors."
27
+ ],
28
+ "alternatives": [
29
+ {
30
+ "when": "The title and breadcrumb belong to responsive page chrome with page-level actions.",
31
+ "component": "component:ds-bar-title",
32
+ "reason": "BarTitle composes Breadcrumb in expanded mode and preserves compact Back behavior."
33
+ },
34
+ {
35
+ "when": "A small set of peer content views should remain directly selectable.",
36
+ "component": "component:ds-tab-group",
37
+ "reason": "TabGroup communicates peer selection rather than route ancestry."
38
+ }
39
+ ],
40
+ "commonlyComposedWith": [
41
+ "component:ds-bar-title",
42
+ "component:ds-text",
43
+ "component:ds-shell-page"
44
+ ],
45
+ "accessibility": [
46
+ "The component renders a named navigation landmark containing an ordered list.",
47
+ "Provide href for native navigation or handle dsSelect when the application router owns navigation.",
48
+ "Mark at most one item current; it renders without interaction and exposes aria-current=page.",
49
+ "Visible caption labels use secondary foreground and slash separators are decorative and hidden from assistive technology.",
50
+ "Every interactive item remains keyboard reachable and receives the shared focus ring."
51
+ ],
52
+ "states": [
53
+ "Items with href render native anchors; items without href render buttons and emit the same dsSelect detail.",
54
+ "Preventing dsSelect cancels native anchor navigation.",
55
+ "A current item is static text and never emits selection.",
56
+ "Links have no resting underline and add a quaternary-foreground solid underline on hover; focus remains communicated by the shared focus ring."
57
+ ],
58
+ "responsiveBehavior": [
59
+ "The path stays on one caption line and truncates long labels within the available width.",
60
+ "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.",
61
+ "A fully collapsed item keeps its complete label available to assistive technology while rendering only the literal ellipsis visually.",
62
+ "Separators remain visible while labels yield width."
63
+ ],
64
+ "frameworkCaveats": {
65
+ "customElements": [
66
+ "Assign items as a JavaScript property and replace its array identity when the route changes.",
67
+ "Use relative or absolute href values for native navigation; omit href when the host router handles dsSelect."
68
+ ],
69
+ "react": [
70
+ "Pass items to DsBreadcrumb and handle onDsSelect when navigation is application-owned."
71
+ ],
72
+ "angular": [
73
+ "Bind items on the standalone DsBreadcrumb adapter and handle dsSelect when navigation is application-owned."
74
+ ]
75
+ },
76
+ "references": [
77
+ {
78
+ "label": "Storybook examples",
79
+ "path": "src/wc/components/Breadcrumb/Breadcrumb.stories.ts"
80
+ },
81
+ {
82
+ "label": "Expanded page-header composition",
83
+ "path": "src/wc/components/BarTitle/BarTitle.tsx"
84
+ }
85
+ ]
86
+ },
87
+ "api": {
88
+ "props": {
89
+ "ariaLabel": {
90
+ "type": "string",
91
+ "resolvedType": "string",
92
+ "attribute": "aria-label",
93
+ "default": "'Breadcrumb'",
94
+ "required": false,
95
+ "mutable": false,
96
+ "description": "Accessible name for the breadcrumb navigation landmark."
97
+ },
98
+ "items": {
99
+ "type": "BreadcrumbItem[]",
100
+ "resolvedType": "BreadcrumbItem[]",
101
+ "default": "[]",
102
+ "required": false,
103
+ "mutable": false,
104
+ "description": "Ordered path from the broadest ancestor to the nearest page."
105
+ }
106
+ },
107
+ "events": [
108
+ {
109
+ "name": "dsSelect",
110
+ "detail": "BreadcrumbSelectDetail",
111
+ "bubbles": true,
112
+ "cancelable": true,
113
+ "composed": true,
114
+ "description": "Emitted when an interactive breadcrumb item is activated. Prevent to cancel native navigation."
115
+ }
116
+ ],
117
+ "methods": [],
118
+ "slots": []
119
+ },
120
+ "props": {
121
+ "ariaLabel": {
122
+ "type": "string",
123
+ "resolvedType": "string",
124
+ "attribute": "aria-label",
125
+ "default": "'Breadcrumb'",
126
+ "required": false,
127
+ "mutable": false,
128
+ "description": "Accessible name for the breadcrumb navigation landmark."
129
+ },
130
+ "items": {
131
+ "type": "BreadcrumbItem[]",
132
+ "resolvedType": "BreadcrumbItem[]",
133
+ "default": "[]",
134
+ "required": false,
135
+ "mutable": false,
136
+ "description": "Ordered path from the broadest ancestor to the nearest page."
137
+ }
138
+ },
139
+ "events": [
140
+ {
141
+ "name": "dsSelect",
142
+ "detail": "BreadcrumbSelectDetail",
143
+ "bubbles": true,
144
+ "cancelable": true,
145
+ "composed": true,
146
+ "description": "Emitted when an interactive breadcrumb item is activated. Prevent to cancel native navigation."
147
+ }
148
+ ],
149
+ "methods": [],
150
+ "slots": [],
151
+ "exports": {
152
+ "customElement": "ds-breadcrumb",
153
+ "react": "DsBreadcrumb",
154
+ "angular": "DsBreadcrumb"
155
+ },
156
+ "consumption": {
157
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
158
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
159
+ "customElements": {
160
+ "import": "import '@ds-mo/ui/dist/components/ds-breadcrumb.js';",
161
+ "example": "<ds-breadcrumb></ds-breadcrumb>"
162
+ },
163
+ "react": {
164
+ "import": "import { DsBreadcrumb } from '@ds-mo/ui/react';",
165
+ "example": "<DsBreadcrumb />"
166
+ },
167
+ "angular": {
168
+ "import": "import { DsBreadcrumb } from '@ds-mo/ui/angular/ds-breadcrumb';",
169
+ "example": "<ds-breadcrumb></ds-breadcrumb>"
170
+ },
171
+ "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
172
+ "peerDependencies": {
173
+ "required": [
174
+ "@ds-mo/tokens ^3.1.1",
175
+ "@ds-mo/icons ^6.4.0"
176
+ ],
177
+ "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
178
+ }
179
+ }
180
+ },
181
+ "dependencies": [
182
+ "@ds-mo/ui",
183
+ "@ds-mo/tokens"
184
+ ],
185
+ "registryDependencies": [
186
+ "text"
187
+ ],
188
+ "files": [
189
+ {
190
+ "path": "src/wc/components/Breadcrumb/Breadcrumb.css",
191
+ "content": "@import '../../utils/focus-ring.css';\n\n:host {\n position: relative;\n display: block;\n min-width: 0;\n box-sizing: border-box;\n}\n\n.breadcrumb {\n inline-size: 100%;\n min-width: 0;\n}\n\n.breadcrumb__list {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n inline-size: 100%;\n min-width: 0;\n margin: 0;\n padding: 0;\n overflow: hidden;\n list-style: none;\n}\n\n.breadcrumb__item {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n min-width: 0;\n}\n\n.breadcrumb__separator {\n flex: 0 0 auto;\n margin-inline: var(--dimension-space-050);\n user-select: none;\n}\n\n.breadcrumb__link,\n.breadcrumb__current {\n display: inline-flex;\n flex: 0 0 auto;\n min-width: 0;\n overflow: hidden;\n padding: 0;\n border: 0;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: var(--color-foreground-secondary);\n font: inherit;\n text-decoration: none;\n}\n\n.breadcrumb__link {\n cursor: pointer;\n}\n\n.breadcrumb__link:hover .breadcrumb__label {\n text-decoration: underline;\n text-decoration-color: var(--color-foreground-quaternary);\n text-underline-offset: var(--dimension-space-025);\n text-decoration-thickness: var(--dimension-stroke-width-012);\n}\n\n.breadcrumb__label {\n display: inline-block;\n inline-size: var(--breadcrumb-label-width, auto);\n min-width: 0;\n}\n\n.breadcrumb__measurements {\n position: absolute;\n inset: 0 auto auto 0;\n visibility: hidden;\n pointer-events: none;\n white-space: nowrap;\n}\n\n.breadcrumb__measurement {\n display: inline-block;\n inline-size: max-content;\n max-inline-size: none;\n}\n\n.breadcrumb__accessible-label {\n position: absolute;\n /* stylelint-disable declaration-property-value-disallowed-list -- classic visually-hidden clip pattern */\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n /* stylelint-enable declaration-property-value-disallowed-list */\n}\n",
192
+ "type": "registry:ui"
193
+ },
194
+ {
195
+ "path": "src/wc/components/Breadcrumb/Breadcrumb.tsx",
196
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop, State, Watch } from '@stencil/core';\nimport type { BreadcrumbItem, BreadcrumbSelectDetail } from './breadcrumb-types';\n\n@Component({\n tag: 'ds-breadcrumb',\n styleUrl: 'Breadcrumb.css',\n scoped: true,\n})\nexport class Breadcrumb {\n /** Ordered path from the broadest ancestor to the nearest page. */\n @Prop() items: BreadcrumbItem[] = [];\n\n /** Accessible name for the breadcrumb navigation landmark. */\n @Prop() ariaLabel: string = 'Breadcrumb';\n\n /** Emitted when an interactive breadcrumb item is activated. Prevent to cancel native navigation. */\n @Event({ cancelable: true }) dsSelect!: EventEmitter<BreadcrumbSelectDetail>;\n\n @State() private labelWidths: number[] = [];\n @State() private collapsedLabels: boolean[] = [];\n\n private navElement?: HTMLElement;\n private listElement?: HTMLOListElement;\n private measurementElements: HTMLElement[] = [];\n private separatorElements: HTMLElement[] = [];\n private ellipsisMeasurement?: HTMLElement;\n private resizeObserver?: ResizeObserver;\n private observedElement?: HTMLElement;\n private measurementFrame?: number;\n\n componentDidLoad() {\n this.observeContainer();\n this.scheduleMeasurement();\n void document.fonts?.ready.then(() => this.scheduleMeasurement());\n }\n\n componentDidRender() {\n this.observeContainer();\n this.scheduleMeasurement();\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.observedElement = undefined;\n if (this.measurementFrame !== undefined) cancelAnimationFrame(this.measurementFrame);\n }\n\n @Watch('items')\n handleItemsChange() {\n this.labelWidths = [];\n this.collapsedLabels = [];\n this.scheduleMeasurement();\n }\n\n private observeContainer() {\n if (!this.navElement || this.observedElement === this.navElement) return;\n this.resizeObserver ??= new ResizeObserver(() => this.scheduleMeasurement());\n this.resizeObserver.disconnect();\n this.resizeObserver.observe(this.navElement);\n this.observedElement = this.navElement;\n }\n\n private scheduleMeasurement() {\n if (this.measurementFrame !== undefined) return;\n this.measurementFrame = requestAnimationFrame(() => {\n this.measurementFrame = undefined;\n this.measureLabels();\n });\n }\n\n private measureLabels() {\n if (\n !this.navElement ||\n !this.listElement ||\n !this.ellipsisMeasurement ||\n this.items.length === 0\n ) return;\n\n const naturalWidths = this.items.map(\n (_, index) => this.measurementElements[index]?.getBoundingClientRect().width ?? 0\n );\n const ellipsisWidth = this.ellipsisMeasurement.getBoundingClientRect().width;\n if (naturalWidths.some(width => width === 0) || ellipsisWidth === 0) return;\n\n const separatorWidth = this.separatorElements.reduce((total, separator) => {\n const styles = getComputedStyle(separator);\n return (\n total +\n separator.getBoundingClientRect().width +\n Number.parseFloat(styles.marginInlineStart) +\n Number.parseFloat(styles.marginInlineEnd)\n );\n }, 0);\n const availableWidth = Math.max(0, this.navElement.clientWidth - separatorWidth);\n const minimumWidths = naturalWidths.map(width => Math.min(width, ellipsisWidth));\n const nextWidths = [...minimumWidths];\n let remainingWidth = Math.max(\n 0,\n availableWidth - minimumWidths.reduce((total, width) => total + width, 0)\n );\n\n // Protect the current/newest location. Extra width is granted newest-to-oldest,\n // so ancestors collapse in path order as the available space decreases.\n for (let index = naturalWidths.length - 1; index >= 0 && remainingWidth > 0; index -= 1) {\n const extraWidth = Math.min(\n remainingWidth,\n naturalWidths[index] - minimumWidths[index]\n );\n nextWidths[index] += extraWidth;\n remainingWidth -= extraWidth;\n }\n\n const widthsChanged =\n nextWidths.length !== this.labelWidths.length ||\n nextWidths.some(\n (width, index) => Math.abs(width - (this.labelWidths[index] ?? 0)) > 0.25\n );\n const nextCollapsedLabels = nextWidths.map(\n (width, index) =>\n naturalWidths[index] > minimumWidths[index] &&\n Math.abs(width - minimumWidths[index]) <= 0.25\n );\n const collapsedLabelsChanged =\n nextCollapsedLabels.length !== this.collapsedLabels.length ||\n nextCollapsedLabels.some(\n (isCollapsed, index) => isCollapsed !== this.collapsedLabels[index]\n );\n if (widthsChanged) this.labelWidths = nextWidths;\n if (collapsedLabelsChanged) this.collapsedLabels = nextCollapsedLabels;\n }\n\n private handleSelect(item: BreadcrumbItem, originalEvent: MouseEvent) {\n const event = this.dsSelect.emit({ item, originalEvent });\n if (event.defaultPrevented) originalEvent.preventDefault();\n }\n\n private renderItem(item: BreadcrumbItem, index: number) {\n const allocatedWidth = this.labelWidths[index];\n const isCollapsed = this.collapsedLabels[index] ?? false;\n const label = (\n [\n <ds-text\n class=\"breadcrumb__label\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n lineTruncation={isCollapsed ? 'none' : 1}\n aria-hidden={isCollapsed ? 'true' : undefined}\n style={\n allocatedWidth === undefined\n ? undefined\n : { '--breadcrumb-label-width': `${allocatedWidth}px` }\n }\n >\n {isCollapsed ? '…' : item.label}\n </ds-text>,\n isCollapsed ? <span class=\"breadcrumb__accessible-label\">{item.label}</span> : null,\n ]\n );\n\n if (item.isCurrent) {\n return (\n <span class=\"breadcrumb__current\" aria-current=\"page\" aria-label={item.ariaLabel}>\n {label}\n </span>\n );\n }\n\n if (item.href) {\n return (\n <a\n class=\"breadcrumb__link ds-focus-ring\"\n href={item.href}\n aria-label={item.ariaLabel}\n onClick={(event: MouseEvent) => this.handleSelect(item, event)}\n >\n {label}\n </a>\n );\n }\n\n return (\n <button\n class=\"breadcrumb__link ds-focus-ring\"\n type=\"button\"\n aria-label={item.ariaLabel}\n onClick={(event: MouseEvent) => this.handleSelect(item, event)}\n >\n {label}\n </button>\n );\n }\n\n render() {\n if (this.items.length === 0) return null;\n\n this.measurementElements = [];\n this.separatorElements = [];\n\n return (\n <Host>\n <nav\n class=\"breadcrumb\"\n aria-label={this.ariaLabel}\n ref={element => {\n this.navElement = element;\n }}\n >\n <div class=\"breadcrumb__measurements\" aria-hidden=\"true\">\n {this.items.map((item, index) => (\n <ds-text\n class=\"breadcrumb__measurement\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n ref={element => {\n if (element) this.measurementElements[index] = element;\n }}\n >\n {item.label}\n </ds-text>\n ))}\n <ds-text\n class=\"breadcrumb__measurement\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"inherit\"\n ref={element => {\n this.ellipsisMeasurement = element;\n }}\n >\n …\n </ds-text>\n </div>\n <ol\n class=\"breadcrumb__list\"\n ref={element => {\n this.listElement = element;\n }}\n >\n {this.items.map((item, index) => (\n <li class=\"breadcrumb__item\" key={item.id}>\n {index > 0 ? (\n <ds-text\n class=\"breadcrumb__separator\"\n as=\"span\"\n variant=\"text-caption\"\n color=\"tertiary\"\n aria-hidden=\"true\"\n ref={element => {\n if (element) this.separatorElements[index - 1] = element;\n }}\n >\n /\n </ds-text>\n ) : null}\n {this.renderItem(item, index)}\n </li>\n ))}\n </ol>\n </nav>\n </Host>\n );\n }\n}\n",
197
+ "type": "registry:ui"
198
+ },
199
+ {
200
+ "path": "src/wc/components/Breadcrumb/breadcrumb-types.ts",
201
+ "content": "export interface BreadcrumbItem {\n /** Stable value returned from dsSelect. */\n id: string;\n /** Visible caption label. */\n label: string;\n /** Optional accessible name when the visible label is not destination-specific enough. */\n ariaLabel?: string;\n /** Native destination. Omit when the route owner handles dsSelect. */\n href?: string;\n /** Marks this item as the current page and removes its interaction. */\n isCurrent?: boolean;\n}\n\nexport interface BreadcrumbSelectDetail {\n item: BreadcrumbItem;\n originalEvent: MouseEvent;\n}\n",
202
+ "type": "registry:ui"
203
+ }
204
+ ]
205
+ }
@@ -0,0 +1,212 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "card-data-viz-bar",
4
+ "title": "CardDataVizBar",
5
+ "description": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-data-viz-bar",
11
+ "source": "src/wc/components/CardDataVizBar/CardDataVizBar.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "specialized",
15
+ "status": "experimental",
16
+ "summary": "Canonical bar-chart dashboard card with shared data-viz chrome, a filter action, a fill chart region, and an optional static legend.",
17
+ "useWhen": [
18
+ "A dashboard widget needs a regular, stacked, or percentage bar chart in the standard data-viz card.",
19
+ "A stacked bar chart needs a visible static series key beneath the chart."
20
+ ],
21
+ "avoidWhen": [
22
+ "The visualization needs selectable legend rows or chart-to-legend hover synchronization.",
23
+ "The product needs supporting metrics or an alternate chart layout beyond the chart and optional legend."
24
+ ],
25
+ "alternatives": [
26
+ {
27
+ "when": "The bar chart needs a custom layout without card chrome.",
28
+ "component": "component:ds-chart-bar",
29
+ "reason": "Compose ChartBar directly in the product-owned layout."
30
+ },
31
+ {
32
+ "when": "The visualization communicates change as continuous lines.",
33
+ "component": "component:ds-card-data-viz-line",
34
+ "reason": "CardDataVizLine owns the canonical line-chart card layout."
35
+ },
36
+ {
37
+ "when": "The visualization communicates parts of one total with synchronized slice emphasis.",
38
+ "component": "component:ds-card-data-viz-donut",
39
+ "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
40
+ }
41
+ ],
42
+ "commonlyComposedWith": [
43
+ "component:ds-card-shell-data-viz",
44
+ "component:ds-chart-bar",
45
+ "component:ds-chart-bar-stacked",
46
+ "component:ds-chart-legend",
47
+ "component:ds-button-unfilled"
48
+ ],
49
+ "accessibility": [
50
+ "Provide a concise heading that identifies the measure and meaningful visible labels for every legend entry.",
51
+ "Keep essential series and value context available textually rather than relying on bar color alone.",
52
+ "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
53
+ ],
54
+ "states": [
55
+ "The chart region fills the remaining card body while an optional legend remains content-sized.",
56
+ "The card disables local hover highlighting on a slotted ChartLegend because bar legends are static keys.",
57
+ "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
58
+ "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
59
+ ],
60
+ "responsiveBehavior": [
61
+ "The selected sm, md, or lg shell size controls the card dimensions while the bar chart shrinks within its chart region.",
62
+ "The horizontal legend wraps complete entries when the available width is constrained.",
63
+ "The parent dashboard owns card wrapping and breakpoint changes."
64
+ ],
65
+ "frameworkCaveats": {
66
+ "customElements": [
67
+ "Assign data or series and categories as JavaScript properties, then place the bar chart and optional legend in their named slots."
68
+ ],
69
+ "react": [
70
+ "Keep filter and dataset state in the owner; pass the chart and optional legend with chart and legend slot attributes."
71
+ ],
72
+ "angular": [
73
+ "Keep filter and dataset state in the owner; project the chart and optional legend into the chart and legend slots."
74
+ ]
75
+ },
76
+ "references": [
77
+ {
78
+ "label": "Storybook examples",
79
+ "path": "src/wc/components/CardDataVizBar/CardDataVizBar.stories.ts"
80
+ }
81
+ ]
82
+ },
83
+ "api": {
84
+ "props": {
85
+ "cardWidth": {
86
+ "type": "CardDataVizBarWidth",
87
+ "resolvedType": "\"lg\" | \"md\" | \"sm\"",
88
+ "attribute": "card-width",
89
+ "default": "'md'",
90
+ "required": false,
91
+ "mutable": false,
92
+ "description": "Card width token — also sets matching min-height."
93
+ },
94
+ "filterLabel": {
95
+ "type": "string",
96
+ "resolvedType": "string",
97
+ "attribute": "filter-label",
98
+ "default": "'Filter'",
99
+ "required": false,
100
+ "mutable": false
101
+ },
102
+ "heading": {
103
+ "type": "string",
104
+ "resolvedType": "string",
105
+ "attribute": "heading",
106
+ "required": true,
107
+ "mutable": false,
108
+ "description": "Widget heading shown in the card header."
109
+ }
110
+ },
111
+ "events": [
112
+ {
113
+ "name": "dsFilterClick",
114
+ "detail": "void",
115
+ "bubbles": true,
116
+ "cancelable": true,
117
+ "composed": true,
118
+ "description": "Emits when the header filter control is activated."
119
+ }
120
+ ],
121
+ "methods": [],
122
+ "slots": []
123
+ },
124
+ "props": {
125
+ "cardWidth": {
126
+ "type": "CardDataVizBarWidth",
127
+ "resolvedType": "\"lg\" | \"md\" | \"sm\"",
128
+ "attribute": "card-width",
129
+ "default": "'md'",
130
+ "required": false,
131
+ "mutable": false,
132
+ "description": "Card width token — also sets matching min-height."
133
+ },
134
+ "filterLabel": {
135
+ "type": "string",
136
+ "resolvedType": "string",
137
+ "attribute": "filter-label",
138
+ "default": "'Filter'",
139
+ "required": false,
140
+ "mutable": false
141
+ },
142
+ "heading": {
143
+ "type": "string",
144
+ "resolvedType": "string",
145
+ "attribute": "heading",
146
+ "required": true,
147
+ "mutable": false,
148
+ "description": "Widget heading shown in the card header."
149
+ }
150
+ },
151
+ "events": [
152
+ {
153
+ "name": "dsFilterClick",
154
+ "detail": "void",
155
+ "bubbles": true,
156
+ "cancelable": true,
157
+ "composed": true,
158
+ "description": "Emits when the header filter control is activated."
159
+ }
160
+ ],
161
+ "methods": [],
162
+ "slots": [],
163
+ "exports": {
164
+ "customElement": "ds-card-data-viz-bar",
165
+ "react": "DsCardDataVizBar",
166
+ "angular": "DsCardDataVizBar"
167
+ },
168
+ "consumption": {
169
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
170
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
171
+ "customElements": {
172
+ "import": "import '@ds-mo/ui/dist/components/ds-card-data-viz-bar.js';",
173
+ "example": "<ds-card-data-viz-bar></ds-card-data-viz-bar>"
174
+ },
175
+ "react": {
176
+ "import": "import { DsCardDataVizBar } from '@ds-mo/ui/react';",
177
+ "example": "<DsCardDataVizBar />"
178
+ },
179
+ "angular": {
180
+ "import": "import { DsCardDataVizBar } from '@ds-mo/ui/angular/ds-card-data-viz-bar';",
181
+ "example": "<ds-card-data-viz-bar></ds-card-data-viz-bar>"
182
+ },
183
+ "peerDependencies": {
184
+ "required": [
185
+ "@ds-mo/tokens ^3.1.1",
186
+ "@ds-mo/icons ^6.4.0"
187
+ ],
188
+ "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
189
+ }
190
+ }
191
+ },
192
+ "dependencies": [
193
+ "@ds-mo/ui",
194
+ "@ds-mo/tokens"
195
+ ],
196
+ "registryDependencies": [
197
+ "button-unfilled",
198
+ "card-shell-data-viz"
199
+ ],
200
+ "files": [
201
+ {
202
+ "path": "src/wc/components/CardDataVizBar/CardDataVizBar.css",
203
+ "content": ":host {\n display: contents;\n}\n\n.card-data-viz-bar__layout {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n box-sizing: border-box;\n height: 100%;\n min-height: 0;\n gap: var(--dimension-space-200);\n}\n\n.card-data-viz-bar__chart-region {\n display: grid;\n flex: 1 1 auto;\n align-items: center;\n box-sizing: border-box;\n min-height: 0;\n padding: var(--dimension-space-400) var(--dimension-space-400) 0\n var(--dimension-space-400);\n}\n\n.card-data-viz-bar__chart-region > * {\n width: 100%;\n min-width: 0;\n max-width: 100%;\n}\n\n.card-data-viz-bar__legend-region {\n flex: 0 0 auto;\n box-sizing: border-box;\n padding: 0 var(--dimension-space-100) var(--dimension-space-100)\n var(--dimension-space-100);\n}\n",
204
+ "type": "registry:ui"
205
+ },
206
+ {
207
+ "path": "src/wc/components/CardDataVizBar/CardDataVizBar.tsx",
208
+ "content": "import { Component, Element, Event, EventEmitter, h, Host, Prop, State } from '@stencil/core';\nimport type { CardShellDataVizWidth } from '../CardShellDataViz/CardShellDataViz';\n\nexport type CardDataVizBarWidth = CardShellDataVizWidth;\n\ntype StaticLegendSlot = HTMLElement & {\n highlightOnHover?: boolean;\n};\n\n/**\n * Bar-chart data-viz card — dedicated `ds-card-shell-data-viz` chrome with a fill chart\n * region and an optional, content-sized static legend.\n */\n@Component({\n tag: 'ds-card-data-viz-bar',\n styleUrl: 'CardDataVizBar.css',\n scoped: true,\n})\nexport class CardDataVizBar {\n @Element() el!: HTMLElement;\n\n /** Widget heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Card width token — also sets matching min-height. */\n @Prop() cardWidth: CardDataVizBarWidth = 'md';\n @Prop() filterLabel: string = 'Filter';\n\n /** Emits when the header filter control is activated. */\n @Event() dsFilterClick!: EventEmitter<void>;\n\n @State() private hasChartSlot = false;\n @State() private hasLegendSlot = false;\n\n componentWillRender() {\n this.hasChartSlot = !!this.el.querySelector('[slot=\"chart\"]');\n this.hasLegendSlot = !!this.el.querySelector('[slot=\"legend\"]');\n }\n\n componentDidRender() {\n const legend = this.el.querySelector(\n 'ds-chart-legend[slot=\"legend\"]'\n ) as StaticLegendSlot | null;\n if (!legend) return;\n legend.setAttribute('highlight-on-hover', 'false');\n if ('highlightOnHover' in legend) legend.highlightOnHover = false;\n }\n\n private handleFilterClick = () => {\n this.dsFilterClick.emit();\n };\n\n render() {\n return (\n <Host class=\"card-data-viz-bar\">\n <ds-card-shell-data-viz heading={this.heading} cardWidth={this.cardWidth}>\n <ds-button-unfilled\n slot=\"actions\"\n variant=\"icon\"\n type=\"button\"\n icon=\"Filters\"\n aria-label={this.filterLabel}\n onDsClick={this.handleFilterClick}\n />\n <div class=\"card-data-viz-bar__layout\">\n {this.hasChartSlot && (\n <div class=\"card-data-viz-bar__chart-region\">\n <slot name=\"chart\" />\n </div>\n )}\n {this.hasLegendSlot && (\n <div class=\"card-data-viz-bar__legend-region\">\n <slot name=\"legend\" />\n </div>\n )}\n </div>\n </ds-card-shell-data-viz>\n </Host>\n );\n }\n}\n",
209
+ "type": "registry:ui"
210
+ }
211
+ ]
212
+ }
@@ -0,0 +1,206 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "card-data-viz-line",
4
+ "title": "CardDataVizLine",
5
+ "description": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-data-viz-line",
11
+ "source": "src/wc/components/CardDataVizLine/CardDataVizLine.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "specialized",
15
+ "status": "experimental",
16
+ "summary": "Canonical line-chart dashboard card with shared data-viz chrome, a filter action, fill chart region, and a static horizontal legend.",
17
+ "useWhen": [
18
+ "A dashboard widget needs the standard line chart and visible series key in one data-viz card.",
19
+ "The legend identifies static line series and should not highlight or dim rows on hover."
20
+ ],
21
+ "avoidWhen": [
22
+ "The visualization needs chart-to-legend hover synchronization or selectable series controls.",
23
+ "The product needs a custom legend treatment, supporting metrics, or an alternate chart layout."
24
+ ],
25
+ "alternatives": [
26
+ {
27
+ "when": "The line chart and legend need a custom layout without card chrome.",
28
+ "component": "component:ds-chart-line",
29
+ "reason": "Compose ChartLine and a static ChartLegend directly in the product-owned layout."
30
+ },
31
+ {
32
+ "when": "The visualization communicates parts of a total with synchronized slice emphasis.",
33
+ "component": "component:ds-card-data-viz-donut",
34
+ "reason": "CardDataVizDonut owns the donut layout and bidirectional hover synchronization."
35
+ }
36
+ ],
37
+ "commonlyComposedWith": [
38
+ "component:ds-card-shell-data-viz",
39
+ "component:ds-chart-line",
40
+ "component:ds-chart-legend",
41
+ "component:ds-button-unfilled"
42
+ ],
43
+ "accessibility": [
44
+ "Provide a concise heading that identifies the trend and meaningful visible labels for every legend entry.",
45
+ "Keep essential series and value context available textually rather than relying on line color alone.",
46
+ "The card disables decorative legend-row hover; genuine legend links retain native link semantics and affordances."
47
+ ],
48
+ "states": [
49
+ "The chart region fills the remaining card body while the legend remains content-sized.",
50
+ "The card disables local hover highlighting on a slotted ChartLegend because the line chart is static.",
51
+ "Chart and legend regions render only when their corresponding slots contain content, avoiding empty region spacing.",
52
+ "The owning product controls data, filtering, loading, empty, and error state; the card emits the filter action only."
53
+ ],
54
+ "responsiveBehavior": [
55
+ "The selected sm, md, or lg shell size controls the card dimensions while the line chart shrinks within its chart region.",
56
+ "The horizontal legend wraps complete entries when the available width is constrained.",
57
+ "The parent dashboard owns card wrapping and breakpoint changes."
58
+ ],
59
+ "frameworkCaveats": {
60
+ "customElements": [
61
+ "Assign series, categories, and legend items as JavaScript properties, then place the chart and legend in their named slots."
62
+ ],
63
+ "react": [
64
+ "Keep filter and dataset state in the owner; pass the chart and legend with chart and legend slot attributes."
65
+ ],
66
+ "angular": [
67
+ "Keep filter and dataset state in the owner; project the chart and legend into the chart and legend slots."
68
+ ]
69
+ },
70
+ "references": [
71
+ {
72
+ "label": "Storybook examples",
73
+ "path": "src/wc/components/CardDataVizLine/CardDataVizLine.stories.ts"
74
+ }
75
+ ]
76
+ },
77
+ "api": {
78
+ "props": {
79
+ "cardWidth": {
80
+ "type": "CardDataVizLineWidth",
81
+ "resolvedType": "\"lg\" | \"md\" | \"sm\"",
82
+ "attribute": "card-width",
83
+ "default": "'md'",
84
+ "required": false,
85
+ "mutable": false,
86
+ "description": "Card width token — also sets matching min-height."
87
+ },
88
+ "filterLabel": {
89
+ "type": "string",
90
+ "resolvedType": "string",
91
+ "attribute": "filter-label",
92
+ "default": "'Filter'",
93
+ "required": false,
94
+ "mutable": false
95
+ },
96
+ "heading": {
97
+ "type": "string",
98
+ "resolvedType": "string",
99
+ "attribute": "heading",
100
+ "required": true,
101
+ "mutable": false,
102
+ "description": "Widget heading shown in the card header."
103
+ }
104
+ },
105
+ "events": [
106
+ {
107
+ "name": "dsFilterClick",
108
+ "detail": "void",
109
+ "bubbles": true,
110
+ "cancelable": true,
111
+ "composed": true,
112
+ "description": "Emits when the header filter control is activated."
113
+ }
114
+ ],
115
+ "methods": [],
116
+ "slots": []
117
+ },
118
+ "props": {
119
+ "cardWidth": {
120
+ "type": "CardDataVizLineWidth",
121
+ "resolvedType": "\"lg\" | \"md\" | \"sm\"",
122
+ "attribute": "card-width",
123
+ "default": "'md'",
124
+ "required": false,
125
+ "mutable": false,
126
+ "description": "Card width token — also sets matching min-height."
127
+ },
128
+ "filterLabel": {
129
+ "type": "string",
130
+ "resolvedType": "string",
131
+ "attribute": "filter-label",
132
+ "default": "'Filter'",
133
+ "required": false,
134
+ "mutable": false
135
+ },
136
+ "heading": {
137
+ "type": "string",
138
+ "resolvedType": "string",
139
+ "attribute": "heading",
140
+ "required": true,
141
+ "mutable": false,
142
+ "description": "Widget heading shown in the card header."
143
+ }
144
+ },
145
+ "events": [
146
+ {
147
+ "name": "dsFilterClick",
148
+ "detail": "void",
149
+ "bubbles": true,
150
+ "cancelable": true,
151
+ "composed": true,
152
+ "description": "Emits when the header filter control is activated."
153
+ }
154
+ ],
155
+ "methods": [],
156
+ "slots": [],
157
+ "exports": {
158
+ "customElement": "ds-card-data-viz-line",
159
+ "react": "DsCardDataVizLine",
160
+ "angular": "DsCardDataVizLine"
161
+ },
162
+ "consumption": {
163
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
164
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
165
+ "customElements": {
166
+ "import": "import '@ds-mo/ui/dist/components/ds-card-data-viz-line.js';",
167
+ "example": "<ds-card-data-viz-line></ds-card-data-viz-line>"
168
+ },
169
+ "react": {
170
+ "import": "import { DsCardDataVizLine } from '@ds-mo/ui/react';",
171
+ "example": "<DsCardDataVizLine />"
172
+ },
173
+ "angular": {
174
+ "import": "import { DsCardDataVizLine } from '@ds-mo/ui/angular/ds-card-data-viz-line';",
175
+ "example": "<ds-card-data-viz-line></ds-card-data-viz-line>"
176
+ },
177
+ "peerDependencies": {
178
+ "required": [
179
+ "@ds-mo/tokens ^3.1.1",
180
+ "@ds-mo/icons ^6.4.0"
181
+ ],
182
+ "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
183
+ }
184
+ }
185
+ },
186
+ "dependencies": [
187
+ "@ds-mo/ui",
188
+ "@ds-mo/tokens"
189
+ ],
190
+ "registryDependencies": [
191
+ "button-unfilled",
192
+ "card-shell-data-viz"
193
+ ],
194
+ "files": [
195
+ {
196
+ "path": "src/wc/components/CardDataVizLine/CardDataVizLine.css",
197
+ "content": ":host {\n display: contents;\n}\n\n.card-data-viz-line__layout {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n box-sizing: border-box;\n height: 100%;\n min-height: 0;\n gap: var(--dimension-space-200);\n}\n\n.card-data-viz-line__chart-region {\n display: grid;\n flex: 1 1 auto;\n align-items: center;\n box-sizing: border-box;\n min-height: 0;\n padding: var(--dimension-space-400) var(--dimension-space-400) 0\n var(--dimension-space-400);\n}\n\n.card-data-viz-line__chart-region > * {\n width: 100%;\n min-width: 0;\n max-width: 100%;\n}\n\n.card-data-viz-line__legend-region {\n flex: 0 0 auto;\n box-sizing: border-box;\n padding: 0 var(--dimension-space-100) var(--dimension-space-100)\n var(--dimension-space-100);\n}\n",
198
+ "type": "registry:ui"
199
+ },
200
+ {
201
+ "path": "src/wc/components/CardDataVizLine/CardDataVizLine.tsx",
202
+ "content": "import { Component, Element, Event, EventEmitter, h, Host, Prop, State } from '@stencil/core';\nimport type { CardShellDataVizWidth } from '../CardShellDataViz/CardShellDataViz';\n\nexport type CardDataVizLineWidth = CardShellDataVizWidth;\n\ntype StaticLegendSlot = HTMLElement & {\n highlightOnHover?: boolean;\n};\n\n/**\n * Line-chart data-viz card — dedicated `ds-card-shell-data-viz` chrome with a fill chart\n * region and a content-sized, static legend.\n */\n@Component({\n tag: 'ds-card-data-viz-line',\n styleUrl: 'CardDataVizLine.css',\n scoped: true,\n})\nexport class CardDataVizLine {\n @Element() el!: HTMLElement;\n\n /** Widget heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Card width token — also sets matching min-height. */\n @Prop() cardWidth: CardDataVizLineWidth = 'md';\n @Prop() filterLabel: string = 'Filter';\n\n /** Emits when the header filter control is activated. */\n @Event() dsFilterClick!: EventEmitter<void>;\n\n @State() private hasChartSlot = false;\n @State() private hasLegendSlot = false;\n\n componentWillRender() {\n this.hasChartSlot = !!this.el.querySelector('[slot=\"chart\"]');\n this.hasLegendSlot = !!this.el.querySelector('[slot=\"legend\"]');\n }\n\n componentDidRender() {\n const legend = this.el.querySelector(\n 'ds-chart-legend[slot=\"legend\"]'\n ) as StaticLegendSlot | null;\n if (!legend) return;\n legend.setAttribute('highlight-on-hover', 'false');\n if ('highlightOnHover' in legend) legend.highlightOnHover = false;\n }\n\n private handleFilterClick = () => {\n this.dsFilterClick.emit();\n };\n\n render() {\n return (\n <Host class=\"card-data-viz-line\">\n <ds-card-shell-data-viz heading={this.heading} cardWidth={this.cardWidth}>\n <ds-button-unfilled\n slot=\"actions\"\n variant=\"icon\"\n type=\"button\"\n icon=\"Filters\"\n aria-label={this.filterLabel}\n onDsClick={this.handleFilterClick}\n />\n <div class=\"card-data-viz-line__layout\">\n {this.hasChartSlot && (\n <div class=\"card-data-viz-line__chart-region\">\n <slot name=\"chart\" />\n </div>\n )}\n {this.hasLegendSlot && (\n <div class=\"card-data-viz-line__legend-region\">\n <slot name=\"legend\" />\n </div>\n )}\n </div>\n </ds-card-shell-data-viz>\n </Host>\n );\n }\n}\n",
203
+ "type": "registry:ui"
204
+ }
205
+ ]
206
+ }