@ds-mo/ui 15.11.1 → 15.12.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 (409) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +1 -1
  3. package/dist/agent.json +114 -18
  4. package/dist/angular/ds-card-action-center.d.ts +1 -1
  5. package/dist/angular/ds-card-action-center.js +3 -3
  6. package/dist/angular/ds-card-chart.d.ts +1 -1
  7. package/dist/angular/ds-card-chart.js +3 -3
  8. package/dist/angular/ds-card-navigation.d.ts +1 -1
  9. package/dist/angular/ds-card-navigation.js +3 -3
  10. package/dist/angular/ds-card-setting.d.ts +1 -1
  11. package/dist/angular/ds-card-setting.js +3 -3
  12. package/dist/angular/ds-card-settings-scope.d.ts +1 -1
  13. package/dist/angular/ds-card-settings-scope.js +3 -3
  14. package/dist/angular/ds-field.d.ts +1 -1
  15. package/dist/angular/ds-field.js +3 -3
  16. package/dist/angular/ds-inline-banner-settings.d.ts +1 -1
  17. package/dist/angular/ds-inline-banner-settings.js +3 -3
  18. package/dist/angular/ds-pagination.d.ts +1 -1
  19. package/dist/angular/ds-pagination.js +3 -3
  20. package/dist/angular/ds-radio.d.ts +1 -1
  21. package/dist/angular/ds-radio.js +3 -3
  22. package/dist/angular/ds-setting-row-radio.d.ts +1 -1
  23. package/dist/angular/ds-setting-row-radio.js +3 -3
  24. package/dist/angular/ds-setting-row-toggle.d.ts +1 -1
  25. package/dist/angular/ds-setting-row-toggle.js +3 -3
  26. package/dist/angular/ds-skeleton.d.ts +1 -1
  27. package/dist/angular/ds-skeleton.js +3 -3
  28. package/dist/components/THIRD-PARTY-NOTICES +1 -1
  29. package/dist/components/bundled-dependencies.json +1 -1
  30. package/dist/components/ds-agent-activity.js +1 -1
  31. package/dist/components/ds-agent-questionnaire.js +1 -1
  32. package/dist/components/ds-agent-response.js +1 -1
  33. package/dist/components/ds-agent-response.js.map +1 -1
  34. package/dist/components/ds-agent-source-list.js +1 -1
  35. package/dist/components/ds-agent-tool-call.js +1 -1
  36. package/dist/components/ds-attachment-list.js +1 -1
  37. package/dist/components/ds-badge.js +1 -1
  38. package/dist/components/ds-banner.js +1 -1
  39. package/dist/components/ds-bar-action.js +1 -1
  40. package/dist/components/ds-bar-nav.js +1 -1
  41. package/dist/components/ds-bar-page-title.js +1 -1
  42. package/dist/components/ds-bar-title.js +1 -1
  43. package/dist/components/ds-bar-workflow.js +1 -1
  44. package/dist/components/ds-breadcrumb.js +1 -1
  45. package/dist/components/ds-button-filled.js +1 -1
  46. package/dist/components/ds-button-inverted.js +1 -1
  47. package/dist/components/ds-button-unfilled.js +1 -1
  48. package/dist/components/ds-calendar.js +1 -1
  49. package/dist/components/ds-card-action-center.js +1 -1
  50. package/dist/components/ds-card-action-center.js.map +1 -1
  51. package/dist/components/ds-card-chart.js +1 -1
  52. package/dist/components/ds-card-chart.js.map +1 -1
  53. package/dist/components/ds-card-navigation.js +1 -1
  54. package/dist/components/ds-card-navigation.js.map +1 -1
  55. package/dist/components/ds-card-overview.js +1 -1
  56. package/dist/components/ds-card-overview.js.map +1 -1
  57. package/dist/components/ds-card-setting.js +1 -1
  58. package/dist/components/ds-card-setting.js.map +1 -1
  59. package/dist/components/ds-card-settings-scope.js +1 -1
  60. package/dist/components/ds-card-settings-scope.js.map +1 -1
  61. package/dist/components/ds-chart-legend.js +1 -1
  62. package/dist/components/ds-chart.js +1 -1
  63. package/dist/components/ds-checkbox-group.js +1 -1
  64. package/dist/components/ds-checkbox.js +1 -1
  65. package/dist/components/ds-chip.js +1 -1
  66. package/dist/components/ds-code-block.js +1 -1
  67. package/dist/components/ds-conversation-list-item.js +1 -1
  68. package/dist/components/ds-conversation-list-section.js +1 -1
  69. package/dist/components/ds-conversation-list.js +1 -1
  70. package/dist/components/ds-data-customize.js +1 -1
  71. package/dist/components/ds-data-customize.js.map +1 -1
  72. package/dist/components/ds-data-filter.js +1 -1
  73. package/dist/components/ds-data-group.js +1 -1
  74. package/dist/components/ds-data-preferences.js +1 -1
  75. package/dist/components/ds-data-saved-views.js +1 -1
  76. package/dist/components/ds-data-saved-views.js.map +1 -1
  77. package/dist/components/ds-data-search.js +1 -1
  78. package/dist/components/ds-data-sort.js +1 -1
  79. package/dist/components/ds-data-toolbar.js +1 -1
  80. package/dist/components/ds-divider.js +1 -1
  81. package/dist/components/ds-empty-state.js +1 -1
  82. package/dist/components/ds-field.js +1 -1
  83. package/dist/components/ds-filter-menu.js +1 -1
  84. package/dist/components/ds-inline-banner-settings.js +1 -1
  85. package/dist/components/ds-inline-banner-settings.js.map +1 -1
  86. package/dist/components/ds-input-date.js +1 -1
  87. package/dist/components/ds-input-time.js +1 -1
  88. package/dist/components/ds-input.js +1 -1
  89. package/dist/components/ds-map-cluster-marker.js +1 -1
  90. package/dist/components/ds-map-entity-marker.js +1 -1
  91. package/dist/components/ds-map-marker.js +1 -1
  92. package/dist/components/ds-markdown.js +1 -1
  93. package/dist/components/ds-menu.js +1 -1
  94. package/dist/components/ds-message-actions.js +1 -1
  95. package/dist/components/ds-message-bubble.js +1 -1
  96. package/dist/components/ds-message-composer.js +1 -1
  97. package/dist/components/ds-message-scroller.js +1 -1
  98. package/dist/components/ds-message.js +1 -1
  99. package/dist/components/ds-mobile-bar-nav.js +1 -1
  100. package/dist/components/ds-mobile-header.js +1 -1
  101. package/dist/components/ds-mobile-section-switcher.js +1 -1
  102. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  103. package/dist/components/ds-modal.js +1 -1
  104. package/dist/components/ds-navigation-tab-group.js +1 -1
  105. package/dist/components/ds-pagination.js +1 -1
  106. package/dist/components/ds-panel-nav.js +1 -1
  107. package/dist/components/ds-panel-sub-nav.js +1 -1
  108. package/dist/components/ds-panel-tool-header.js +1 -1
  109. package/dist/components/ds-panel-tool-search.js +1 -1
  110. package/dist/components/ds-panel-tools.js +1 -1
  111. package/dist/components/ds-paper-texture.js +1 -1
  112. package/dist/components/ds-radio-tile.js +1 -1
  113. package/dist/components/ds-radio.js +1 -1
  114. package/dist/components/ds-score.js +1 -1
  115. package/dist/components/ds-scroll-overlay.js +1 -1
  116. package/dist/components/ds-select-toggle.js +1 -1
  117. package/dist/components/ds-select.js +1 -1
  118. package/dist/components/ds-setting-row-checkbox.js +1 -1
  119. package/dist/components/ds-setting-row-radio.js +1 -1
  120. package/dist/components/ds-setting-row-radio.js.map +1 -1
  121. package/dist/components/ds-setting-row-toggle.js +1 -1
  122. package/dist/components/ds-setting-row-toggle.js.map +1 -1
  123. package/dist/components/ds-shell-app.js +1 -1
  124. package/dist/components/ds-shell-app.js.map +1 -1
  125. package/dist/components/ds-shell-page.js +1 -1
  126. package/dist/components/ds-shell-tools.js +1 -1
  127. package/dist/components/ds-skeleton.js +1 -1
  128. package/dist/components/ds-slider.js +1 -1
  129. package/dist/components/ds-swatch-picker.js +1 -1
  130. package/dist/components/ds-switch.js +1 -1
  131. package/dist/components/ds-tab-group.js +1 -1
  132. package/dist/components/ds-table.js +1 -1
  133. package/dist/components/ds-table.js.map +1 -1
  134. package/dist/components/ds-tag.js +1 -1
  135. package/dist/components/ds-text.js +1 -1
  136. package/dist/components/ds-textarea.js +1 -1
  137. package/dist/components/ds-time-picker.js +1 -1
  138. package/dist/components/ds-toast.js +1 -1
  139. package/dist/components/ds-tooltip-chart.js +1 -1
  140. package/dist/components/ds-tooltip.js +1 -1
  141. package/dist/components/ds-typing-indicator.js +1 -1
  142. package/dist/components/{p-6QYDIPd1.js → p-3dG9v5Aw.js} +2 -2
  143. package/dist/components/{p-DwFnt0W0.js → p-5PReYMiY.js} +2 -2
  144. package/dist/components/{p-CzTJAO2J.js → p-8fddX3V3.js} +2 -2
  145. package/dist/components/{p-Cw1ljgW1.js → p-9u2WDF0J.js} +2 -2
  146. package/dist/components/{p-M9pOLcyK.js → p-B-ChwMFE.js} +2 -2
  147. package/dist/components/{p-y2Sdv9M3.js → p-BAIYOobl.js} +2 -2
  148. package/dist/components/{p-DKG26pp5.js → p-BIMW5_Z7.js} +2 -2
  149. package/dist/components/p-BMI0F08u.js +2 -0
  150. package/dist/components/{p-B5rN3slq.js.map → p-BMI0F08u.js.map} +1 -1
  151. package/dist/components/p-BV8sNEVP.js +2 -0
  152. package/dist/components/p-BV8sNEVP.js.map +1 -0
  153. package/dist/components/p-BVUdtuog.js +2 -0
  154. package/dist/components/p-BVUdtuog.js.map +1 -0
  155. package/dist/components/{p-CgYDQSLW.js → p-BYo1-6b5.js} +2 -2
  156. package/dist/components/{p-S5QCVAdH.js → p-BZbJkJpG.js} +2 -2
  157. package/dist/components/{p-D2rASHHq.js → p-BcYzHn1E.js} +2 -2
  158. package/dist/components/{p-0EpjqRWc.js → p-BfRAVR40.js} +2 -2
  159. package/dist/components/p-BnE9MeXS.js +2 -0
  160. package/dist/components/{p-CEB8RFih.js.map → p-BnE9MeXS.js.map} +1 -1
  161. package/dist/components/p-BoFK9lmP.js +2 -0
  162. package/dist/components/p-BoFK9lmP.js.map +1 -0
  163. package/dist/components/{p-BBZz2Dvg.js → p-BoWpIl_m.js} +2 -2
  164. package/dist/components/{p-DixX2_Bd.js → p-BpPHCF63.js} +2 -2
  165. package/dist/components/p-BpssHpam.js +2 -0
  166. package/dist/components/p-BpssHpam.js.map +1 -0
  167. package/dist/components/{p-DfwvHxYi.js → p-By_jYvHp.js} +2 -2
  168. package/dist/components/p-C5HGwzy9.js +2 -0
  169. package/dist/components/{p-Ba-dSshd.js.map → p-C5HGwzy9.js.map} +1 -1
  170. package/dist/components/{p-D4r6oWyQ.js → p-C860ilDn.js} +2 -2
  171. package/dist/components/{p-DGDF4NMV.js → p-CEHhx4VQ.js} +2 -2
  172. package/dist/components/{p-BqIRExej.js → p-CL0FpMKo.js} +2 -2
  173. package/dist/components/{p-CEm0AoDR.js → p-CQnjpuMX.js} +2 -2
  174. package/dist/components/{p-B9Q7fXxW.js → p-CUG4EkKn.js} +2 -2
  175. package/dist/components/{p-D-cZ6cRI.js → p-CYmz92EF.js} +2 -2
  176. package/dist/components/{p-DfzXyVoM.js → p-CbP9ASmI.js} +2 -2
  177. package/dist/components/{p-DvMCOJwc.js → p-CbPGO7vl.js} +2 -2
  178. package/dist/components/{p-DfphSI9S.js → p-CdMIA5hz.js} +2 -2
  179. package/dist/components/{p-Cxk1A7Sx.js → p-CeaIWw1Q.js} +2 -2
  180. package/dist/components/{p-CW-7vLUB.js → p-Cfqvxxs2.js} +2 -2
  181. package/dist/components/{p-CsPqGA8B.js → p-CpqLGzv4.js} +2 -2
  182. package/dist/components/{p-DKg181YU.js → p-DFR9hqDU.js} +2 -2
  183. package/dist/components/p-DKZP3jCY.js +2 -0
  184. package/dist/components/p-DKZP3jCY.js.map +1 -0
  185. package/dist/components/{p-CTAF7SkL.js → p-DMPn_dt7.js} +2 -2
  186. package/dist/components/{p-CYRTkP1A.js → p-DYruK9cb.js} +2 -2
  187. package/dist/components/{p-CqfYCn-e.js → p-DiUaIJ91.js} +2 -2
  188. package/dist/components/{p-OFJpWJcN.js → p-DimFbKZH.js} +2 -2
  189. package/dist/components/p-DmyU1fd-.js +2 -0
  190. package/dist/components/p-DmyU1fd-.js.map +1 -0
  191. package/dist/components/{p-BkajUPiA.js → p-DuhJ49iN.js} +2 -2
  192. package/dist/components/{p-CqW2eyiF.js → p-E0RqkUNq.js} +2 -2
  193. package/dist/components/{p-D_iZPukF.js → p-G6r6yYg8.js} +2 -2
  194. package/dist/components/p-HNktxWtF.js +2 -0
  195. package/dist/components/p-HNktxWtF.js.map +1 -0
  196. package/dist/components/{p-87FjWil8.js → p-IQdLCfJJ.js} +2 -2
  197. package/dist/components/{p-CAARHqjE.js → p-KTaiJztz.js} +2 -2
  198. package/dist/components/{p-BM-UYlIS.js → p-N-2CZze7.js} +2 -2
  199. package/dist/components/{p-Ch00yccW.js → p-Nx52go85.js} +2 -2
  200. package/dist/components/{p-CaNMVLhm.js → p-WEffoQQD.js} +2 -2
  201. package/dist/components/{p-DDawngok.js → p-XKt6j1UN.js} +2 -2
  202. package/dist/components/{p-CeXf9-X3.js → p-mSCnWLhL.js} +2 -2
  203. package/dist/components/{p-C8D853vs.js → p-nakO4viw.js} +2 -2
  204. package/dist/components/{p-BC9xYdJD.js → p-pkJ3X3s7.js} +2 -2
  205. package/dist/components/{p-BNnw_O4e.js → p-r_e6_0nP.js} +2 -2
  206. package/dist/components/p-zsWHUNJ9.js +2 -0
  207. package/dist/components/p-zsWHUNJ9.js.map +1 -0
  208. package/dist/docs/components.json +642 -22
  209. package/dist/lint/index.js +1 -1
  210. package/dist/mcp-data/registry/agent-activity.json +2 -2
  211. package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
  212. package/dist/mcp-data/registry/agent-response.json +2 -2
  213. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  214. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  215. package/dist/mcp-data/registry/attachment-list.json +2 -2
  216. package/dist/mcp-data/registry/avatar.json +2 -2
  217. package/dist/mcp-data/registry/badge.json +2 -2
  218. package/dist/mcp-data/registry/banner.json +2 -2
  219. package/dist/mcp-data/registry/bar-action.json +2 -2
  220. package/dist/mcp-data/registry/bar-nav.json +2 -2
  221. package/dist/mcp-data/registry/bar-page-title.json +2 -2
  222. package/dist/mcp-data/registry/bar-title.json +2 -2
  223. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  224. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  225. package/dist/mcp-data/registry/button-filled.json +2 -2
  226. package/dist/mcp-data/registry/button-inverted.json +2 -2
  227. package/dist/mcp-data/registry/button-unfilled.json +2 -2
  228. package/dist/mcp-data/registry/calendar.json +2 -2
  229. package/dist/mcp-data/registry/card-action-center.json +25 -5
  230. package/dist/mcp-data/registry/card-chart.json +25 -5
  231. package/dist/mcp-data/registry/card-navigation.json +25 -5
  232. package/dist/mcp-data/registry/card-overview.json +4 -4
  233. package/dist/mcp-data/registry/card-setting.json +25 -5
  234. package/dist/mcp-data/registry/card-settings-scope.json +24 -4
  235. package/dist/mcp-data/registry/chart-legend.json +2 -2
  236. package/dist/mcp-data/registry/chart.json +2 -2
  237. package/dist/mcp-data/registry/checkbox-group.json +2 -2
  238. package/dist/mcp-data/registry/checkbox.json +2 -2
  239. package/dist/mcp-data/registry/chip.json +2 -2
  240. package/dist/mcp-data/registry/code-block.json +2 -2
  241. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  242. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  243. package/dist/mcp-data/registry/conversation-list.json +2 -2
  244. package/dist/mcp-data/registry/data-customize.json +2 -2
  245. package/dist/mcp-data/registry/data-filter.json +2 -2
  246. package/dist/mcp-data/registry/data-group.json +2 -2
  247. package/dist/mcp-data/registry/data-preferences.json +2 -2
  248. package/dist/mcp-data/registry/data-saved-views.json +2 -2
  249. package/dist/mcp-data/registry/data-search.json +2 -2
  250. package/dist/mcp-data/registry/data-sort.json +2 -2
  251. package/dist/mcp-data/registry/data-toolbar.json +2 -2
  252. package/dist/mcp-data/registry/divider.json +2 -2
  253. package/dist/mcp-data/registry/empty-state.json +2 -2
  254. package/dist/mcp-data/registry/field.json +24 -4
  255. package/dist/mcp-data/registry/filter-menu.json +2 -2
  256. package/dist/mcp-data/registry/icon.json +2 -2
  257. package/dist/mcp-data/registry/inline-banner-settings.json +24 -4
  258. package/dist/mcp-data/registry/input-date.json +3 -3
  259. package/dist/mcp-data/registry/input-time.json +3 -3
  260. package/dist/mcp-data/registry/input.json +2 -2
  261. package/dist/mcp-data/registry/loader.json +2 -2
  262. package/dist/mcp-data/registry/map-cluster-marker.json +2 -2
  263. package/dist/mcp-data/registry/map-entity-marker.json +2 -2
  264. package/dist/mcp-data/registry/map-marker.json +2 -2
  265. package/dist/mcp-data/registry/markdown.json +2 -2
  266. package/dist/mcp-data/registry/menu.json +2 -2
  267. package/dist/mcp-data/registry/message-actions.json +2 -2
  268. package/dist/mcp-data/registry/message-bubble.json +2 -2
  269. package/dist/mcp-data/registry/message-composer.json +2 -2
  270. package/dist/mcp-data/registry/message-scroller.json +2 -2
  271. package/dist/mcp-data/registry/message.json +2 -2
  272. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  273. package/dist/mcp-data/registry/mobile-header.json +2 -2
  274. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  275. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  276. package/dist/mcp-data/registry/modal.json +2 -2
  277. package/dist/mcp-data/registry/navigation-tab-group.json +2 -2
  278. package/dist/mcp-data/registry/pagination.json +24 -4
  279. package/dist/mcp-data/registry/panel-nav.json +2 -2
  280. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  281. package/dist/mcp-data/registry/panel-tool-header.json +2 -2
  282. package/dist/mcp-data/registry/panel-tool-search.json +2 -2
  283. package/dist/mcp-data/registry/panel-tools.json +2 -2
  284. package/dist/mcp-data/registry/paper-texture.json +2 -2
  285. package/dist/mcp-data/registry/radio-tile.json +2 -2
  286. package/dist/mcp-data/registry/radio.json +24 -4
  287. package/dist/mcp-data/registry/registry.json +115 -19
  288. package/dist/mcp-data/registry/score.json +2 -2
  289. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  290. package/dist/mcp-data/registry/select-toggle.json +2 -2
  291. package/dist/mcp-data/registry/select.json +2 -2
  292. package/dist/mcp-data/registry/setting-row-checkbox.json +2 -2
  293. package/dist/mcp-data/registry/setting-row-radio.json +24 -4
  294. package/dist/mcp-data/registry/setting-row-toggle.json +25 -5
  295. package/dist/mcp-data/registry/shell-app.json +5 -4
  296. package/dist/mcp-data/registry/shell-page.json +2 -2
  297. package/dist/mcp-data/registry/shell-tools.json +2 -2
  298. package/dist/mcp-data/registry/skeleton.json +102 -10
  299. package/dist/mcp-data/registry/slider.json +2 -2
  300. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  301. package/dist/mcp-data/registry/switch.json +2 -2
  302. package/dist/mcp-data/registry/tab-group.json +2 -2
  303. package/dist/mcp-data/registry/table.json +19 -8
  304. package/dist/mcp-data/registry/tag.json +2 -2
  305. package/dist/mcp-data/registry/text.json +2 -2
  306. package/dist/mcp-data/registry/textarea.json +2 -2
  307. package/dist/mcp-data/registry/time-picker.json +2 -2
  308. package/dist/mcp-data/registry/toast.json +2 -2
  309. package/dist/mcp-data/registry/tooltip-chart.json +2 -2
  310. package/dist/mcp-data/registry/tooltip.json +2 -2
  311. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  312. package/dist/types/components/CardActionCenter/CardActionCenter.d.ts +2 -0
  313. package/dist/types/components/CardChart/CardChart.d.ts +2 -0
  314. package/dist/types/components/CardNavigation/CardNavigation.d.ts +2 -0
  315. package/dist/types/components/CardSetting/CardSetting.d.ts +2 -0
  316. package/dist/types/components/CardSettingsScope/CardSettingsScope.d.ts +2 -0
  317. package/dist/types/components/Field/Field.d.ts +3 -0
  318. package/dist/types/components/InlineBannerSettings/InlineBannerSettings.d.ts +2 -0
  319. package/dist/types/components/InputDate/InputDate.d.ts +5 -6
  320. package/dist/types/components/InputTime/InputTime.d.ts +5 -6
  321. package/dist/types/components/Pagination/Pagination.d.ts +3 -0
  322. package/dist/types/components/Radio/Radio.d.ts +2 -0
  323. package/dist/types/components/SettingRowRadio/SettingRowRadio.d.ts +2 -0
  324. package/dist/types/components/SettingRowToggle/SettingRowToggle.d.ts +2 -0
  325. package/dist/types/components/Skeleton/Skeleton.d.ts +13 -1
  326. package/dist/types/components/Skeleton/index.d.ts +1 -1
  327. package/dist/types/components/Table/Table.d.ts +6 -49
  328. package/dist/types/components/Table/table-caption-controller.d.ts +54 -0
  329. package/dist/types/components/Table/table-cell-editor.d.ts +1 -1
  330. package/dist/types/components/Table/table-editing-controller.d.ts +37 -0
  331. package/dist/types/components.d.ts +169 -4
  332. package/dist/types/utils/picker-popup-controller.d.ts +24 -0
  333. package/dist/types/utils/select-controller.d.ts +1 -0
  334. package/dist/vue/ds-card-action-center.js +1 -0
  335. package/dist/vue/ds-card-chart.js +1 -0
  336. package/dist/vue/ds-card-navigation.js +1 -0
  337. package/dist/vue/ds-card-setting.js +1 -0
  338. package/dist/vue/ds-card-settings-scope.js +1 -0
  339. package/dist/vue/ds-field.js +2 -1
  340. package/dist/vue/ds-inline-banner-settings.js +2 -1
  341. package/dist/vue/ds-pagination.js +1 -0
  342. package/dist/vue/ds-radio.js +1 -0
  343. package/dist/vue/ds-setting-row-radio.js +2 -1
  344. package/dist/vue/ds-setting-row-toggle.js +1 -0
  345. package/dist/vue/ds-skeleton.js +4 -0
  346. package/package.json +6 -6
  347. package/dist/components/p-B5rN3slq.js +0 -2
  348. package/dist/components/p-BT6xQogY.js +0 -2
  349. package/dist/components/p-BT6xQogY.js.map +0 -1
  350. package/dist/components/p-Ba-dSshd.js +0 -2
  351. package/dist/components/p-CEB8RFih.js +0 -2
  352. package/dist/components/p-CMrHRjjH.js +0 -2
  353. package/dist/components/p-CMrHRjjH.js.map +0 -1
  354. package/dist/components/p-CPNA8raE.js +0 -2
  355. package/dist/components/p-CPNA8raE.js.map +0 -1
  356. package/dist/components/p-Cnzry0_v.js +0 -2
  357. package/dist/components/p-Cnzry0_v.js.map +0 -1
  358. package/dist/components/p-Djkk338n.js +0 -2
  359. package/dist/components/p-Djkk338n.js.map +0 -1
  360. package/dist/components/p-hWKa8Jn8.js +0 -2
  361. package/dist/components/p-hWKa8Jn8.js.map +0 -1
  362. package/dist/components/p-xCqqM1Rg.js +0 -2
  363. package/dist/components/p-xCqqM1Rg.js.map +0 -1
  364. package/dist/types/utils/cartesian-chart-layout.d.ts +0 -13
  365. package/dist/types/utils/chart-viewport-controller.d.ts +0 -21
  366. /package/dist/components/{p-6QYDIPd1.js.map → p-3dG9v5Aw.js.map} +0 -0
  367. /package/dist/components/{p-DwFnt0W0.js.map → p-5PReYMiY.js.map} +0 -0
  368. /package/dist/components/{p-CzTJAO2J.js.map → p-8fddX3V3.js.map} +0 -0
  369. /package/dist/components/{p-Cw1ljgW1.js.map → p-9u2WDF0J.js.map} +0 -0
  370. /package/dist/components/{p-M9pOLcyK.js.map → p-B-ChwMFE.js.map} +0 -0
  371. /package/dist/components/{p-y2Sdv9M3.js.map → p-BAIYOobl.js.map} +0 -0
  372. /package/dist/components/{p-DKG26pp5.js.map → p-BIMW5_Z7.js.map} +0 -0
  373. /package/dist/components/{p-CgYDQSLW.js.map → p-BYo1-6b5.js.map} +0 -0
  374. /package/dist/components/{p-S5QCVAdH.js.map → p-BZbJkJpG.js.map} +0 -0
  375. /package/dist/components/{p-D2rASHHq.js.map → p-BcYzHn1E.js.map} +0 -0
  376. /package/dist/components/{p-0EpjqRWc.js.map → p-BfRAVR40.js.map} +0 -0
  377. /package/dist/components/{p-BBZz2Dvg.js.map → p-BoWpIl_m.js.map} +0 -0
  378. /package/dist/components/{p-DixX2_Bd.js.map → p-BpPHCF63.js.map} +0 -0
  379. /package/dist/components/{p-DfwvHxYi.js.map → p-By_jYvHp.js.map} +0 -0
  380. /package/dist/components/{p-D4r6oWyQ.js.map → p-C860ilDn.js.map} +0 -0
  381. /package/dist/components/{p-DGDF4NMV.js.map → p-CEHhx4VQ.js.map} +0 -0
  382. /package/dist/components/{p-BqIRExej.js.map → p-CL0FpMKo.js.map} +0 -0
  383. /package/dist/components/{p-CEm0AoDR.js.map → p-CQnjpuMX.js.map} +0 -0
  384. /package/dist/components/{p-B9Q7fXxW.js.map → p-CUG4EkKn.js.map} +0 -0
  385. /package/dist/components/{p-D-cZ6cRI.js.map → p-CYmz92EF.js.map} +0 -0
  386. /package/dist/components/{p-DfzXyVoM.js.map → p-CbP9ASmI.js.map} +0 -0
  387. /package/dist/components/{p-DvMCOJwc.js.map → p-CbPGO7vl.js.map} +0 -0
  388. /package/dist/components/{p-DfphSI9S.js.map → p-CdMIA5hz.js.map} +0 -0
  389. /package/dist/components/{p-Cxk1A7Sx.js.map → p-CeaIWw1Q.js.map} +0 -0
  390. /package/dist/components/{p-CW-7vLUB.js.map → p-Cfqvxxs2.js.map} +0 -0
  391. /package/dist/components/{p-CsPqGA8B.js.map → p-CpqLGzv4.js.map} +0 -0
  392. /package/dist/components/{p-DKg181YU.js.map → p-DFR9hqDU.js.map} +0 -0
  393. /package/dist/components/{p-CTAF7SkL.js.map → p-DMPn_dt7.js.map} +0 -0
  394. /package/dist/components/{p-CYRTkP1A.js.map → p-DYruK9cb.js.map} +0 -0
  395. /package/dist/components/{p-CqfYCn-e.js.map → p-DiUaIJ91.js.map} +0 -0
  396. /package/dist/components/{p-OFJpWJcN.js.map → p-DimFbKZH.js.map} +0 -0
  397. /package/dist/components/{p-BkajUPiA.js.map → p-DuhJ49iN.js.map} +0 -0
  398. /package/dist/components/{p-CqW2eyiF.js.map → p-E0RqkUNq.js.map} +0 -0
  399. /package/dist/components/{p-D_iZPukF.js.map → p-G6r6yYg8.js.map} +0 -0
  400. /package/dist/components/{p-87FjWil8.js.map → p-IQdLCfJJ.js.map} +0 -0
  401. /package/dist/components/{p-CAARHqjE.js.map → p-KTaiJztz.js.map} +0 -0
  402. /package/dist/components/{p-BM-UYlIS.js.map → p-N-2CZze7.js.map} +0 -0
  403. /package/dist/components/{p-Ch00yccW.js.map → p-Nx52go85.js.map} +0 -0
  404. /package/dist/components/{p-CaNMVLhm.js.map → p-WEffoQQD.js.map} +0 -0
  405. /package/dist/components/{p-DDawngok.js.map → p-XKt6j1UN.js.map} +0 -0
  406. /package/dist/components/{p-CeXf9-X3.js.map → p-mSCnWLhL.js.map} +0 -0
  407. /package/dist/components/{p-C8D853vs.js.map → p-nakO4viw.js.map} +0 -0
  408. /package/dist/components/{p-BC9xYdJD.js.map → p-pkJ3X3s7.js.map} +0 -0
  409. /package/dist/components/{p-BNnw_O4e.js.map → p-r_e6_0nP.js.map} +0 -0
@@ -136,8 +136,8 @@
136
136
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
137
137
  "peerDependencies": {
138
138
  "required": [
139
- "@ds-mo/tokens ^8.0.0",
140
- "@ds-mo/icons ^8.1.1"
139
+ "@ds-mo/tokens ^8.0.1",
140
+ "@ds-mo/icons ^8.1.2"
141
141
  ],
142
142
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
143
143
  }
@@ -241,8 +241,8 @@
241
241
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: answers, labels, questions.",
242
242
  "peerDependencies": {
243
243
  "required": [
244
- "@ds-mo/tokens ^8.0.0",
245
- "@ds-mo/icons ^8.1.1"
244
+ "@ds-mo/tokens ^8.0.1",
245
+ "@ds-mo/icons ^8.1.2"
246
246
  ],
247
247
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
248
248
  }
@@ -239,8 +239,8 @@
239
239
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: parts.",
240
240
  "peerDependencies": {
241
241
  "required": [
242
- "@ds-mo/tokens ^8.0.0",
243
- "@ds-mo/icons ^8.1.1"
242
+ "@ds-mo/tokens ^8.0.1",
243
+ "@ds-mo/icons ^8.1.2"
244
244
  ],
245
245
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
246
246
  }
@@ -152,8 +152,8 @@
152
152
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
153
153
  "peerDependencies": {
154
154
  "required": [
155
- "@ds-mo/tokens ^8.0.0",
156
- "@ds-mo/icons ^8.1.1"
155
+ "@ds-mo/tokens ^8.0.1",
156
+ "@ds-mo/icons ^8.1.2"
157
157
  ],
158
158
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
159
159
  }
@@ -232,8 +232,8 @@
232
232
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: input, output.",
233
233
  "peerDependencies": {
234
234
  "required": [
235
- "@ds-mo/tokens ^8.0.0",
236
- "@ds-mo/icons ^8.1.1"
235
+ "@ds-mo/tokens ^8.0.1",
236
+ "@ds-mo/icons ^8.1.2"
237
237
  ],
238
238
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
239
239
  }
@@ -116,8 +116,8 @@
116
116
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
117
117
  "peerDependencies": {
118
118
  "required": [
119
- "@ds-mo/tokens ^8.0.0",
120
- "@ds-mo/icons ^8.1.1"
119
+ "@ds-mo/tokens ^8.0.1",
120
+ "@ds-mo/icons ^8.1.2"
121
121
  ],
122
122
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
123
123
  }
@@ -168,8 +168,8 @@
168
168
  },
169
169
  "peerDependencies": {
170
170
  "required": [
171
- "@ds-mo/tokens ^8.0.0",
172
- "@ds-mo/icons ^8.1.1"
171
+ "@ds-mo/tokens ^8.0.1",
172
+ "@ds-mo/icons ^8.1.2"
173
173
  ],
174
174
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
175
175
  }
@@ -291,8 +291,8 @@
291
291
  },
292
292
  "peerDependencies": {
293
293
  "required": [
294
- "@ds-mo/tokens ^8.0.0",
295
- "@ds-mo/icons ^8.1.1"
294
+ "@ds-mo/tokens ^8.0.1",
295
+ "@ds-mo/icons ^8.1.2"
296
296
  ],
297
297
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
298
298
  }
@@ -334,8 +334,8 @@
334
334
  },
335
335
  "peerDependencies": {
336
336
  "required": [
337
- "@ds-mo/tokens ^8.0.0",
338
- "@ds-mo/icons ^8.1.1"
337
+ "@ds-mo/tokens ^8.0.1",
338
+ "@ds-mo/icons ^8.1.2"
339
339
  ],
340
340
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
341
341
  }
@@ -236,8 +236,8 @@
236
236
  },
237
237
  "peerDependencies": {
238
238
  "required": [
239
- "@ds-mo/tokens ^8.0.0",
240
- "@ds-mo/icons ^8.1.1"
239
+ "@ds-mo/tokens ^8.0.1",
240
+ "@ds-mo/icons ^8.1.2"
241
241
  ],
242
242
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
243
243
  }
@@ -291,8 +291,8 @@
291
291
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: tabs.",
292
292
  "peerDependencies": {
293
293
  "required": [
294
- "@ds-mo/tokens ^8.0.0",
295
- "@ds-mo/icons ^8.1.1"
294
+ "@ds-mo/tokens ^8.0.1",
295
+ "@ds-mo/icons ^8.1.2"
296
296
  ],
297
297
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
298
298
  }
@@ -421,8 +421,8 @@
421
421
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: actionItems, actions, primaryAction, sections.",
422
422
  "peerDependencies": {
423
423
  "required": [
424
- "@ds-mo/tokens ^8.0.0",
425
- "@ds-mo/icons ^8.1.1"
424
+ "@ds-mo/tokens ^8.0.1",
425
+ "@ds-mo/icons ^8.1.2"
426
426
  ],
427
427
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
428
428
  }
@@ -564,8 +564,8 @@
564
564
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: actionItems, actions, breadcrumbs, primaryAction, sections.",
565
565
  "peerDependencies": {
566
566
  "required": [
567
- "@ds-mo/tokens ^8.0.0",
568
- "@ds-mo/icons ^8.1.1"
567
+ "@ds-mo/tokens ^8.0.1",
568
+ "@ds-mo/icons ^8.1.2"
569
569
  ],
570
570
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
571
571
  }
@@ -379,8 +379,8 @@
379
379
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: steps, submitAction.",
380
380
  "peerDependencies": {
381
381
  "required": [
382
- "@ds-mo/tokens ^8.0.0",
383
- "@ds-mo/icons ^8.1.1"
382
+ "@ds-mo/tokens ^8.0.1",
383
+ "@ds-mo/icons ^8.1.2"
384
384
  ],
385
385
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
386
386
  }
@@ -181,8 +181,8 @@
181
181
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
182
182
  "peerDependencies": {
183
183
  "required": [
184
- "@ds-mo/tokens ^8.0.0",
185
- "@ds-mo/icons ^8.1.1"
184
+ "@ds-mo/tokens ^8.0.1",
185
+ "@ds-mo/icons ^8.1.2"
186
186
  ],
187
187
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
188
188
  }
@@ -695,8 +695,8 @@
695
695
  },
696
696
  "peerDependencies": {
697
697
  "required": [
698
- "@ds-mo/tokens ^8.0.0",
699
- "@ds-mo/icons ^8.1.1"
698
+ "@ds-mo/tokens ^8.0.1",
699
+ "@ds-mo/icons ^8.1.2"
700
700
  ],
701
701
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
702
702
  }
@@ -610,8 +610,8 @@
610
610
  },
611
611
  "peerDependencies": {
612
612
  "required": [
613
- "@ds-mo/tokens ^8.0.0",
614
- "@ds-mo/icons ^8.1.1"
613
+ "@ds-mo/tokens ^8.0.1",
614
+ "@ds-mo/icons ^8.1.2"
615
615
  ],
616
616
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
617
617
  }
@@ -775,8 +775,8 @@
775
775
  },
776
776
  "peerDependencies": {
777
777
  "required": [
778
- "@ds-mo/tokens ^8.0.0",
779
- "@ds-mo/icons ^8.1.1"
778
+ "@ds-mo/tokens ^8.0.1",
779
+ "@ds-mo/icons ^8.1.2"
780
780
  ],
781
781
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
782
782
  }
@@ -251,8 +251,8 @@
251
251
  },
252
252
  "peerDependencies": {
253
253
  "required": [
254
- "@ds-mo/tokens ^8.0.0",
255
- "@ds-mo/icons ^8.1.1"
254
+ "@ds-mo/tokens ^8.0.1",
255
+ "@ds-mo/icons ^8.1.2"
256
256
  ],
257
257
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
258
258
  }
@@ -51,7 +51,8 @@
51
51
  "states": [
52
52
  "Rows expose distinct rest, hover, pressed, keyboard-focus, and inactive states.",
53
53
  "An empty sections array or groups with no items render the configured empty message.",
54
- "The application owns loading, error, permission, routing, and post-activation consequences and reflects availability through the supplied item data."
54
+ "The application owns data fetching, error, permission, routing, and post-activation consequences and reflects availability through the supplied item data.",
55
+ "isLoading preserves the section and row layout while skeletonizing all headings, labels, and values; actions become inert and the card exposes its busy state."
55
56
  ],
56
57
  "responsiveBehavior": [
57
58
  "The card fills its parent width and never establishes a product breakpoint.",
@@ -117,6 +118,15 @@
117
118
  "mutable": false,
118
119
  "description": "Copy shown when no section contains an action."
119
120
  },
121
+ "isLoading": {
122
+ "type": "boolean",
123
+ "resolvedType": "boolean",
124
+ "attribute": "is-loading",
125
+ "default": "false",
126
+ "required": false,
127
+ "mutable": false,
128
+ "description": "Retain sections and rows while replacing their headings, labels, and values with skeletons."
129
+ },
120
130
  "sections": {
121
131
  "type": "ReadonlyArray<CardActionCenterSection>",
122
132
  "resolvedType": "readonly CardActionCenterSection[]",
@@ -149,6 +159,15 @@
149
159
  "mutable": false,
150
160
  "description": "Copy shown when no section contains an action."
151
161
  },
162
+ "isLoading": {
163
+ "type": "boolean",
164
+ "resolvedType": "boolean",
165
+ "attribute": "is-loading",
166
+ "default": "false",
167
+ "required": false,
168
+ "mutable": false,
169
+ "description": "Retain sections and rows while replacing their headings, labels, and values with skeletons."
170
+ },
152
171
  "sections": {
153
172
  "type": "ReadonlyArray<CardActionCenterSection>",
154
173
  "resolvedType": "readonly CardActionCenterSection[]",
@@ -198,8 +217,8 @@
198
217
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: sections.",
199
218
  "peerDependencies": {
200
219
  "required": [
201
- "@ds-mo/tokens ^8.0.0",
202
- "@ds-mo/icons ^8.1.1"
220
+ "@ds-mo/tokens ^8.0.1",
221
+ "@ds-mo/icons ^8.1.2"
203
222
  ],
204
223
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
205
224
  }
@@ -211,18 +230,19 @@
211
230
  ],
212
231
  "registryDependencies": [
213
232
  "divider",
233
+ "skeleton",
214
234
  "tag",
215
235
  "text"
216
236
  ],
217
237
  "files": [
218
238
  {
219
239
  "path": "src/wc/components/CardActionCenter/CardActionCenter.css",
220
- "content": "@import '../../utils/radius.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n display: flex;\n flex-direction: column;\n gap: 0;\n min-width: 0;\n padding: calc(var(--dimension-space-100) - var(--dimension-stroke-width-012));\n box-sizing: border-box;\n border: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n border-radius: var(--ds-radius-card);\n background: var(--color-background-primary);\n}\n\n.card-action-center__group,\n.card-action-center__section {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.card-action-center__section {\n gap: var(--dimension-space-050);\n}\n\n.card-action-center__divider {\n display: flex;\n flex: 0 0 var(--dimension-space-400);\n align-items: center;\n min-width: 0;\n}\n\n.card-action-center__section-heading {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n min-height: var(--dimension-size-400);\n padding-inline: var(--dimension-space-100);\n box-sizing: border-box;\n user-select: none;\n}\n\n.card-action-center__list {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.card-action-center__item {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0 var(--dimension-space-075);\n overflow: hidden;\n box-sizing: border-box;\n appearance: none;\n border: none;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n text-decoration: none;\n}\n\n.card-action-center__item--tagged {\n padding-inline-end: var(--dimension-space-075);\n}\n\n.card-action-center__item-content {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--dimension-space-025);\n min-width: 0;\n padding-inline: var(--dimension-space-025);\n}\n\n.card-action-center__item-label {\n display: block;\n min-width: 0;\n}\n\n.card-action-center__item-value {\n flex: 0 0 auto;\n}\n\nds-tag.card-action-center__item-value {\n font-variant-numeric: tabular-nums;\n font-feature-settings: 'tnum';\n}\n\n.card-action-center__empty {\n margin: 0;\n padding: var(--dimension-space-100);\n text-align: center;\n}\n\n@media (forced-colors: active) {\n :host {\n border-color: var(--ds-forced-color-content);\n background: var(--ds-forced-color-surface);\n }\n}\n",
240
+ "content": "@import '../../utils/radius.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/control-inactive.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n display: flex;\n flex-direction: column;\n gap: 0;\n min-width: 0;\n padding: calc(var(--dimension-space-100) - var(--dimension-stroke-width-012));\n box-sizing: border-box;\n border: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n border-radius: var(--ds-radius-card);\n background: var(--color-background-primary);\n}\n\n.card-action-center__group,\n.card-action-center__section {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n\n.card-action-center__section {\n gap: var(--dimension-space-050);\n}\n\n.card-action-center__divider {\n display: flex;\n flex: 0 0 var(--dimension-space-400);\n align-items: center;\n min-width: 0;\n}\n\n.card-action-center__section-heading {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n min-height: var(--dimension-size-400);\n padding-inline: var(--dimension-space-100);\n box-sizing: border-box;\n user-select: none;\n}\n\n.card-action-center__list {\n display: flex;\n flex-direction: column;\n gap: var(--dimension-space-050);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.card-action-center__item {\n display: flex;\n align-items: center;\n gap: var(--dimension-space-050);\n width: 100%;\n height: var(--dimension-size-400);\n padding: 0 var(--dimension-space-075);\n overflow: hidden;\n box-sizing: border-box;\n appearance: none;\n border: none;\n border-radius: var(--dimension-radius-025);\n background: transparent;\n color: inherit;\n font: inherit;\n text-align: start;\n text-decoration: none;\n}\n\n.card-action-center__item--tagged {\n padding-inline-end: var(--dimension-space-075);\n}\n\n.card-action-center__item-content {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n gap: var(--dimension-space-025);\n min-width: 0;\n padding-inline: var(--dimension-space-025);\n}\n\n.card-action-center__item-label {\n display: block;\n min-width: 0;\n}\n\n.card-action-center__item-value {\n flex: 0 0 auto;\n}\n\n.card-action-center__item-value ds-tag {\n font-variant-numeric: tabular-nums;\n font-feature-settings: 'tnum';\n}\n\n.card-action-center__section-heading,\n.card-action-center__item-label {\n position: relative;\n}\n\n:host(.card-action-center--loading) .card-action-center__copy {\n visibility: hidden;\n}\n\n.card-action-center__copy-skeleton {\n position: absolute;\n inset-block-start: 50%;\n transform: translateY(-50%);\n}\n\n.card-action-center__empty {\n margin: 0;\n padding: var(--dimension-space-100);\n text-align: center;\n}\n\n@media (forced-colors: active) {\n :host {\n border-color: var(--ds-forced-color-content);\n background: var(--ds-forced-color-surface);\n }\n}\n\n.card-action-center__section-heading .card-action-center__copy-skeleton {\n inset-inline-start: var(--dimension-space-100);\n}\n.card-action-center__item-label .card-action-center__copy-skeleton {\n inset-inline-start: var(--dimension-space-025);\n}\n",
221
241
  "type": "registry:ui"
222
242
  },
223
243
  {
224
244
  "path": "src/wc/components/CardActionCenter/CardActionCenter.tsx",
225
- "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport { resolveSafeUrl } from '../../utils';\nimport type { TagContrast, TagIntent } from '../Tag/Tag';\n\nexport interface CardActionCenterTag {\n intent?: TagIntent;\n contrast?: TagContrast;\n}\n\nexport interface CardActionCenterItem {\n id: string;\n label: string;\n value?: string | number;\n tag?: CardActionCenterTag;\n href?: string;\n isInactive?: boolean;\n}\n\nexport interface CardActionCenterSection {\n id: string;\n heading: string;\n items: ReadonlyArray<CardActionCenterItem>;\n}\n\nexport interface CardActionCenterActionDetail {\n sectionId: string;\n itemId: string;\n item: CardActionCenterItem;\n href?: string;\n originalEvent: MouseEvent;\n}\n\nlet nextCardActionCenterId = 0;\n\n@Component({\n tag: 'ds-card-action-center',\n styleUrl: 'CardActionCenter.css',\n scoped: true,\n})\nexport class CardActionCenter {\n /** Ordered groups of actions rendered in the card. Empty groups are omitted. */\n @Prop() sections: ReadonlyArray<CardActionCenterSection> = [];\n\n /** Copy shown when no section contains an action. */\n @Prop() emptyMessage: string = 'No actions available';\n\n /**\n * Emitted when an available row is activated. When a row has an `href`,\n * prevent this event to take over navigation with an application router.\n */\n @Event({ cancelable: true }) dsAction!: EventEmitter<CardActionCenterActionDetail>;\n\n private readonly instanceId = ++nextCardActionCenterId;\n\n private get visibleSections(): ReadonlyArray<CardActionCenterSection> {\n return this.sections.filter(section => section.items.length > 0);\n }\n\n private headingId(section: CardActionCenterSection, index: number): string {\n const sectionId = section.id.replace(/[^a-zA-Z0-9_-]/g, '-');\n return `ds-card-action-center-${this.instanceId}-${index}-${sectionId}`;\n }\n\n private handleAction(\n section: CardActionCenterSection,\n item: CardActionCenterItem,\n href: string | undefined,\n originalEvent: MouseEvent\n ) {\n if (item.isInactive) return;\n\n const actionEvent = this.dsAction.emit({\n sectionId: section.id,\n itemId: item.id,\n item,\n href,\n originalEvent,\n });\n if (href && actionEvent.defaultPrevented) originalEvent.preventDefault();\n }\n\n private renderValue(item: CardActionCenterItem) {\n if (item.value === undefined || item.value === null) return null;\n const value = String(item.value);\n\n if (item.tag) {\n return (\n <ds-tag\n class=\"card-action-center__item-value ds-interaction-fill__content\"\n label={value}\n intent={item.tag.intent ?? 'neutral'}\n contrast={item.tag.contrast ?? 'faint'}\n size=\"sm\"\n isInset\n rounded\n ></ds-tag>\n );\n }\n\n return (\n <ds-text\n class=\"card-action-center__item-value ds-interaction-fill__content\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n emphasis\n wrap=\"nowrap\"\n fontFeature=\"tabular-nums\"\n as=\"span\"\n >\n {value}\n </ds-text>\n );\n }\n\n private renderItem(section: CardActionCenterSection, item: CardActionCenterItem) {\n const href = item.isInactive ? undefined : resolveSafeUrl(item.href);\n const classes = {\n 'card-action-center__item': true,\n 'card-action-center__item--tagged': !!item.tag && item.value != null,\n 'ds-interaction-fill': true,\n 'ds-focus-ring-inset': true,\n 'ds-control-inactive': !!item.isInactive,\n };\n const content = [\n <ds-text\n class=\"card-action-center__item-content card-action-center__item-label ds-interaction-fill__content\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n wrap=\"balance\"\n as=\"span\"\n >\n {item.label}\n </ds-text>,\n this.renderValue(item),\n ];\n\n if (href) {\n return (\n <a\n class={classes}\n href={href}\n onClick={(event: MouseEvent) => this.handleAction(section, item, href, event)}\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n class={classes}\n disabled={item.isInactive || undefined}\n onClick={(event: MouseEvent) => this.handleAction(section, item, undefined, event)}\n >\n {content}\n </button>\n );\n }\n\n render() {\n const sections = this.visibleSections;\n\n return (\n <Host>\n {sections.length ? (\n sections.map((section, sectionIndex) => (\n <div class=\"card-action-center__group\">\n {sectionIndex > 0 ? (\n <div class=\"card-action-center__divider\">\n <ds-divider\n inset=\"space-100\"\n length=\"calc(100% - var(--dimension-space-200))\"\n ></ds-divider>\n </div>\n ) : null}\n <section\n class=\"card-action-center__section\"\n aria-labelledby={this.headingId(section, sectionIndex)}\n >\n <ds-text\n id={this.headingId(section, sectionIndex)}\n class=\"card-action-center__section-heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n wrap=\"balance\"\n as=\"h2\"\n >\n {section.heading}\n </ds-text>\n <ul class=\"card-action-center__list\">\n {section.items.map(item => (\n <li>{this.renderItem(section, item)}</li>\n ))}\n </ul>\n </section>\n </div>\n ))\n ) : (\n <ds-text\n class=\"card-action-center__empty\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n wrap=\"balance\"\n as=\"p\"\n >\n {this.emptyMessage}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
245
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport { resolveSafeUrl } from '../../utils';\nimport type { TagContrast, TagIntent } from '../Tag/Tag';\n\nexport interface CardActionCenterTag {\n intent?: TagIntent;\n contrast?: TagContrast;\n}\n\nexport interface CardActionCenterItem {\n id: string;\n label: string;\n value?: string | number;\n tag?: CardActionCenterTag;\n href?: string;\n isInactive?: boolean;\n}\n\nexport interface CardActionCenterSection {\n id: string;\n heading: string;\n items: ReadonlyArray<CardActionCenterItem>;\n}\n\nexport interface CardActionCenterActionDetail {\n sectionId: string;\n itemId: string;\n item: CardActionCenterItem;\n href?: string;\n originalEvent: MouseEvent;\n}\n\nlet nextCardActionCenterId = 0;\n\n@Component({\n tag: 'ds-card-action-center',\n styleUrl: 'CardActionCenter.css',\n scoped: true,\n})\nexport class CardActionCenter {\n /** Ordered groups of actions rendered in the card. Empty groups are omitted. */\n @Prop() sections: ReadonlyArray<CardActionCenterSection> = [];\n\n /** Copy shown when no section contains an action. */\n @Prop() emptyMessage: string = 'No actions available';\n /** Retain sections and rows while replacing their headings, labels, and values with skeletons. */\n @Prop() isLoading: boolean = false;\n\n /**\n * Emitted when an available row is activated. When a row has an `href`,\n * prevent this event to take over navigation with an application router.\n */\n @Event({ cancelable: true }) dsAction!: EventEmitter<CardActionCenterActionDetail>;\n\n private readonly instanceId = ++nextCardActionCenterId;\n\n private get visibleSections(): ReadonlyArray<CardActionCenterSection> {\n return this.sections.filter(section => section.items.length > 0);\n }\n\n private headingId(section: CardActionCenterSection, index: number): string {\n const sectionId = section.id.replace(/[^a-zA-Z0-9_-]/g, '-');\n return `ds-card-action-center-${this.instanceId}-${index}-${sectionId}`;\n }\n\n private handleAction(\n section: CardActionCenterSection,\n item: CardActionCenterItem,\n href: string | undefined,\n originalEvent: MouseEvent\n ) {\n if (item.isInactive || this.isLoading) return;\n\n const actionEvent = this.dsAction.emit({\n sectionId: section.id,\n itemId: item.id,\n item,\n href,\n originalEvent,\n });\n if (href && actionEvent.defaultPrevented) originalEvent.preventDefault();\n }\n\n private renderValue(item: CardActionCenterItem) {\n if (item.value === undefined || item.value === null) return null;\n const value = String(item.value);\n\n if (item.tag) {\n return (\n <ds-skeleton\n class=\"card-action-center__item-value\"\n preserveLayout\n isLoading={this.isLoading}\n variant=\"control\"\n rounded\n >\n <ds-tag\n class=\"ds-interaction-fill__content\"\n label={value}\n intent={item.tag.intent ?? 'neutral'}\n contrast={item.tag.contrast ?? 'faint'}\n size=\"sm\"\n isInset\n rounded\n ></ds-tag>\n </ds-skeleton>\n );\n }\n\n return (\n <ds-skeleton class=\"card-action-center__item-value\" preserveLayout isLoading={this.isLoading}>\n <ds-text\n class=\"ds-interaction-fill__content\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n emphasis\n wrap=\"nowrap\"\n fontFeature=\"tabular-nums\"\n as=\"span\"\n >\n {value}\n </ds-text>\n </ds-skeleton>\n );\n }\n\n private renderItem(section: CardActionCenterSection, item: CardActionCenterItem) {\n const href = item.isInactive || this.isLoading ? undefined : resolveSafeUrl(item.href);\n const classes = {\n 'card-action-center__item': true,\n 'card-action-center__item--tagged': !!item.tag && item.value != null,\n 'ds-interaction-fill': true,\n 'ds-focus-ring-inset': true,\n 'ds-control-inactive': !!item.isInactive && !this.isLoading,\n };\n const content = [\n <ds-text\n class=\"card-action-center__item-content card-action-center__item-label ds-interaction-fill__content\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n wrap=\"balance\"\n as=\"span\"\n aria-hidden={this.isLoading ? 'true' : undefined}\n >\n <span class=\"card-action-center__copy\">{item.label}</span>\n {this.isLoading && <ds-skeleton class=\"card-action-center__copy-skeleton\" width=\"75%\" />}\n </ds-text>,\n this.renderValue(item),\n ];\n\n if (href) {\n return (\n <a\n class={classes}\n href={href}\n onClick={(event: MouseEvent) => this.handleAction(section, item, href, event)}\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n class={classes}\n disabled={this.isLoading || item.isInactive || undefined}\n inert={this.isLoading}\n aria-hidden={this.isLoading ? 'true' : undefined}\n onClick={(event: MouseEvent) => this.handleAction(section, item, undefined, event)}\n >\n {content}\n </button>\n );\n }\n\n render() {\n const sections = this.visibleSections;\n\n return (\n <Host\n class={{ 'card-action-center--loading': this.isLoading }}\n aria-busy={this.isLoading ? 'true' : undefined}\n >\n {sections.length ? (\n sections.map((section, sectionIndex) => (\n <div class=\"card-action-center__group\">\n {sectionIndex > 0 ? (\n <div class=\"card-action-center__divider\">\n <ds-divider\n inset=\"space-100\"\n length=\"calc(100% - var(--dimension-space-200))\"\n ></ds-divider>\n </div>\n ) : null}\n <section\n class=\"card-action-center__section\"\n aria-labelledby={this.headingId(section, sectionIndex)}\n >\n <ds-text\n id={this.headingId(section, sectionIndex)}\n class=\"card-action-center__section-heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n wrap=\"balance\"\n as=\"h2\"\n aria-hidden={this.isLoading ? 'true' : undefined}\n >\n <span class=\"card-action-center__copy\">{section.heading}</span>\n {this.isLoading && (\n <ds-skeleton\n class=\"card-action-center__copy-skeleton\"\n textVariant=\"text-title-small\"\n width=\"min(60%, calc(var(--dimension-size-800) * 2))\"\n />\n )}\n </ds-text>\n <ul class=\"card-action-center__list\">\n {section.items.map(item => (\n <li>{this.renderItem(section, item)}</li>\n ))}\n </ul>\n </section>\n </div>\n ))\n ) : (\n <ds-text\n class=\"card-action-center__empty\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n wrap=\"balance\"\n as=\"p\"\n >\n {this.emptyMessage}\n </ds-text>\n )}\n </Host>\n );\n }\n}\n",
226
246
  "type": "registry:ui"
227
247
  }
228
248
  ]
@@ -45,7 +45,8 @@
45
45
  "states": [
46
46
  "Custom mode provides flexible body chrome and does not mutate chart or legend interaction.",
47
47
  "Chart mode keeps a slotted external legend static by disabling hover emphasis.",
48
- "showFilter adds the standard filter action and emits dsFilterClick without owning filter state."
48
+ "showFilter adds the standard filter action and emits dsFilterClick without owning filter state.",
49
+ "isLoading preserves card geometry, skeletonizes the heading and standard filter control, and replaces a chart canvas with one quiet placeholder. The owner supplies skeletons for custom body content and slotted actions."
49
50
  ],
50
51
  "responsiveBehavior": [
51
52
  "The sm, md, or lg width sets a matching token-based minimum height and remains constrained by its parent.",
@@ -132,6 +133,15 @@
132
133
  "mutable": false,
133
134
  "description": "Chart heading shown in the card header."
134
135
  },
136
+ "isLoading": {
137
+ "type": "boolean",
138
+ "resolvedType": "boolean",
139
+ "attribute": "is-loading",
140
+ "default": "false",
141
+ "required": false,
142
+ "mutable": false,
143
+ "description": "Skeletonize the header and chart canvas; custom body content owns its loading atoms."
144
+ },
135
145
  "showFilter": {
136
146
  "type": "boolean",
137
147
  "resolvedType": "boolean",
@@ -190,6 +200,15 @@
190
200
  "mutable": false,
191
201
  "description": "Chart heading shown in the card header."
192
202
  },
203
+ "isLoading": {
204
+ "type": "boolean",
205
+ "resolvedType": "boolean",
206
+ "attribute": "is-loading",
207
+ "default": "false",
208
+ "required": false,
209
+ "mutable": false,
210
+ "description": "Skeletonize the header and chart canvas; custom body content owns its loading atoms."
211
+ },
193
212
  "showFilter": {
194
213
  "type": "boolean",
195
214
  "resolvedType": "boolean",
@@ -248,8 +267,8 @@
248
267
  },
249
268
  "peerDependencies": {
250
269
  "required": [
251
- "@ds-mo/tokens ^8.0.0",
252
- "@ds-mo/icons ^8.1.1"
270
+ "@ds-mo/tokens ^8.0.1",
271
+ "@ds-mo/icons ^8.1.2"
253
272
  ],
254
273
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
255
274
  }
@@ -261,17 +280,18 @@
261
280
  ],
262
281
  "registryDependencies": [
263
282
  "button-unfilled",
283
+ "skeleton",
264
284
  "text"
265
285
  ],
266
286
  "files": [
267
287
  {
268
288
  "path": "src/wc/components/CardChart/CardChart.css",
269
- "content": "@import '../../utils/radius.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: relative;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--_card-chart-width);\n min-height: var(--_card-chart-min-height);\n max-width: 100%;\n overflow: visible;\n border: none;\n border-radius: var(--ds-radius-card);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-shadow-elevated-sm);\n}\n\n:host::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 4;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-sm);\n pointer-events: none;\n}\n\n.card-chart__header {\n flex-shrink: 0;\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.card-chart__copy {\n align-items: center;\n}\n\nds-text.card-chart__title {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.card-chart__actions {\n flex-shrink: 0;\n}\n\n.card-chart__actions:empty {\n display: none;\n}\n\n.card-chart__body,\n.card-chart__layout {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n box-sizing: border-box;\n min-height: 0;\n}\n\n.card-chart__body {\n border-radius: 0 0 var(--ds-radius-card) var(--ds-radius-card);\n background-color: var(--color-background-primary);\n}\n\n.card-chart__layout {\n height: 100%;\n gap: var(--dimension-space-200);\n}\n\n.card-chart__chart {\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-200) var(--dimension-space-200) 0 var(--dimension-space-200);\n}\n\n.card-chart__chart > * {\n width: 100%;\n min-width: 0;\n max-width: 100%;\n}\n\n.card-chart__chart > ds-chart {\n --ds-chart-container-height: 100%;\n}\n\n.card-chart__legend {\n flex: 0 0 auto;\n box-sizing: border-box;\n padding: 0 var(--dimension-space-100) var(--dimension-space-100) var(--dimension-space-100);\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n\n :host::after {\n box-shadow: none;\n }\n}\n",
289
+ "content": "@import '../../utils/radius.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: relative;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--_card-chart-width);\n min-height: var(--_card-chart-min-height);\n max-width: 100%;\n overflow: visible;\n border: none;\n border-radius: var(--ds-radius-card);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-shadow-elevated-sm);\n}\n\n:host::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 4;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-sm);\n pointer-events: none;\n}\n\n.card-chart__header {\n flex-shrink: 0;\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.card-chart__copy {\n position: relative;\n align-items: center;\n}\n\nds-text.card-chart__title {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.card-chart__actions {\n flex-shrink: 0;\n}\n\n.card-chart__actions:empty {\n display: none;\n}\n\n.card-chart__body,\n.card-chart__layout {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n box-sizing: border-box;\n min-height: 0;\n}\n\n.card-chart__body {\n border-radius: 0 0 var(--ds-radius-card) var(--ds-radius-card);\n background-color: var(--color-background-primary);\n}\n\n.card-chart__layout {\n height: 100%;\n gap: var(--dimension-space-200);\n}\n\n.card-chart__chart {\n position: relative;\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-200) var(--dimension-space-200) 0 var(--dimension-space-200);\n}\n\n.card-chart__chart > * {\n width: 100%;\n min-width: 0;\n max-width: 100%;\n}\n\n.card-chart__chart > ds-chart {\n --ds-chart-container-height: 100%;\n}\n\n.card-chart__legend {\n position: relative;\n flex: 0 0 auto;\n box-sizing: border-box;\n padding: 0 var(--dimension-space-100) var(--dimension-space-100) var(--dimension-space-100);\n}\n\n:host(.card-chart--loading) .card-chart__title,\n:host(.card-chart--loading) .card-chart__chart,\n:host(.card-chart--loading) .card-chart__legend {\n visibility: hidden;\n}\n\n.card-chart__heading-skeleton {\n position: absolute;\n inset-inline-start: calc(var(--ds-control-padding-inline) + var(--ds-control-label-inset));\n width: min(60%, calc(var(--dimension-size-800) * 2));\n}\n\n.card-chart__chart > .card-chart__plot-skeleton {\n visibility: visible;\n position: absolute;\n inset: var(--dimension-space-200);\n width: auto;\n height: auto;\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n\n :host::after {\n box-shadow: none;\n }\n}\n\n.card-chart__legend-skeleton {\n position: absolute;\n inset-block-start: 0;\n inset-inline-start: var(--dimension-space-100);\n visibility: visible;\n}\n",
270
290
  "type": "registry:ui"
271
291
  },
272
292
  {
273
293
  "path": "src/wc/components/CardChart/CardChart.tsx",
274
- "content": "import { Component, Element, Event, EventEmitter, h, Host, Prop, State } from '@stencil/core';\n\nexport type CardChartWidth = 'sm' | 'md' | 'lg';\nexport type CardChartVariant = 'custom' | 'chart';\n\ntype LegendSlot = HTMLElement & {\n activeLabel?: string | null;\n highlightOnHover?: boolean;\n};\n\nconst CARD_WIDTH_VARS: Record<CardChartWidth, string> = {\n sm: 'var(--dimension-card-width-sm)',\n md: 'var(--dimension-card-width-md)',\n lg: 'var(--dimension-card-width-lg)',\n};\n\nconst CARD_HEIGHT_VARS: Record<CardChartWidth, string> = {\n sm: 'var(--dimension-card-height-sm)',\n md: 'var(--dimension-card-height-md)',\n lg: 'var(--dimension-card-height-lg)',\n};\n\n/**\n * Standard chart card chrome and composition. The variant owns\n * only the chart/legend relationship; applications continue to own data.\n */\n@Component({\n tag: 'ds-card-chart',\n styleUrl: 'CardChart.css',\n scoped: true,\n})\nexport class CardChart {\n @Element() el!: HTMLElement;\n\n /** Chart heading shown in the card header. */\n @Prop() heading!: string;\n /** Chart composition behavior. */\n @Prop() variant: CardChartVariant = 'custom';\n /** Width token with the matching chart-card min-height. */\n @Prop() cardWidth: CardChartWidth = 'md';\n /** Renders the standard filter action before custom actions. */\n @Prop() showFilter: boolean = false;\n @Prop() filterLabel: string = 'Filter';\n\n /** Emits when the standard 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('ds-chart-legend[slot=\"legend\"]') as LegendSlot | null;\n if (this.variant === 'chart' && legend) {\n legend.setAttribute('highlight-on-hover', 'false');\n if ('highlightOnHover' in legend) legend.highlightOnHover = false;\n }\n }\n\n private handleFilterClick = () => {\n this.dsFilterClick.emit();\n };\n\n render() {\n const usesChartLayout = this.variant !== 'custom' || this.hasChartSlot;\n return (\n <Host\n class={{\n 'card-chart': true,\n [`card-chart--${this.variant}`]: true,\n }}\n style={{\n '--_card-chart-width': CARD_WIDTH_VARS[this.cardWidth],\n '--_card-chart-min-height': CARD_HEIGHT_VARS[this.cardWidth],\n }}\n >\n <header class=\"card-chart__header ds-chrome-header\">\n {/* eslint-disable-next-line compomo/prefer-direct-ds-text -- Shared header copy owns the control-density geometry around the semantic heading. */}\n <div class=\"card-chart__copy ds-chrome-header__copy ds-control--md\">\n <ds-text\n class=\"card-chart__title ds-chrome-header__heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n as=\"h2\"\n >\n {this.heading}\n </ds-text>\n </div>\n <div class=\"card-chart__actions ds-chrome-header__trailing\">\n {this.showFilter ? (\n <ds-button-unfilled\n variant=\"icon\"\n type=\"button\"\n icon=\"Filters\"\n aria-label={this.filterLabel}\n onDsClick={this.handleFilterClick}\n />\n ) : null}\n <slot name=\"actions\" />\n </div>\n </header>\n <div class=\"card-chart__body\">\n {usesChartLayout ? (\n <div class=\"card-chart__layout\">\n {this.hasChartSlot ? (\n <div\n class={{\n 'card-chart__chart': true,\n }}\n >\n <slot name=\"chart\" />\n </div>\n ) : null}\n {this.hasLegendSlot ? (\n <div class=\"card-chart__legend\">\n <slot name=\"legend\" />\n </div>\n ) : null}\n <slot />\n </div>\n ) : (\n <slot />\n )}\n </div>\n </Host>\n );\n }\n}\n",
294
+ "content": "import { Component, Element, Event, EventEmitter, h, Host, Prop, State } from '@stencil/core';\n\nexport type CardChartWidth = 'sm' | 'md' | 'lg';\nexport type CardChartVariant = 'custom' | 'chart';\n\ntype LegendSlot = HTMLElement & {\n activeLabel?: string | null;\n highlightOnHover?: boolean;\n};\n\nconst CARD_WIDTH_VARS: Record<CardChartWidth, string> = {\n sm: 'var(--dimension-card-width-sm)',\n md: 'var(--dimension-card-width-md)',\n lg: 'var(--dimension-card-width-lg)',\n};\n\nconst CARD_HEIGHT_VARS: Record<CardChartWidth, string> = {\n sm: 'var(--dimension-card-height-sm)',\n md: 'var(--dimension-card-height-md)',\n lg: 'var(--dimension-card-height-lg)',\n};\n\n/**\n * Standard chart card chrome and composition. The variant owns\n * only the chart/legend relationship; applications continue to own data.\n */\n@Component({\n tag: 'ds-card-chart',\n styleUrl: 'CardChart.css',\n scoped: true,\n})\nexport class CardChart {\n @Element() el!: HTMLElement;\n\n /** Chart heading shown in the card header. */\n @Prop() heading!: string;\n /** Chart composition behavior. */\n @Prop() variant: CardChartVariant = 'custom';\n /** Width token with the matching chart-card min-height. */\n @Prop() cardWidth: CardChartWidth = 'md';\n /** Renders the standard filter action before custom actions. */\n @Prop() showFilter: boolean = false;\n @Prop() filterLabel: string = 'Filter';\n /** Skeletonize the header and chart canvas; custom body content owns its loading atoms. */\n @Prop() isLoading: boolean = false;\n\n /** Emits when the standard 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('ds-chart-legend[slot=\"legend\"]') as LegendSlot | null;\n if (this.variant === 'chart' && legend) {\n legend.setAttribute('highlight-on-hover', 'false');\n if ('highlightOnHover' in legend) legend.highlightOnHover = false;\n }\n }\n\n private handleFilterClick = () => {\n if (this.isLoading) return;\n this.dsFilterClick.emit();\n };\n\n render() {\n const usesChartLayout = this.variant !== 'custom' || this.hasChartSlot;\n return (\n <Host\n class={{\n 'card-chart': true,\n [`card-chart--${this.variant}`]: true,\n 'card-chart--loading': this.isLoading,\n }}\n aria-busy={this.isLoading ? 'true' : undefined}\n style={{\n '--_card-chart-width': CARD_WIDTH_VARS[this.cardWidth],\n '--_card-chart-min-height': CARD_HEIGHT_VARS[this.cardWidth],\n }}\n >\n <header class=\"card-chart__header ds-chrome-header\">\n <div class=\"card-chart__copy ds-chrome-header__copy ds-control--md\">\n <ds-text\n class=\"card-chart__title ds-chrome-header__heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n as=\"h2\"\n aria-hidden={this.isLoading ? 'true' : undefined}\n >\n {this.heading}\n </ds-text>\n {this.isLoading && (\n <ds-skeleton class=\"card-chart__heading-skeleton\" textVariant=\"text-title-small\" />\n )}\n </div>\n <div class=\"card-chart__actions ds-chrome-header__trailing\">\n {this.showFilter ? (\n <ds-skeleton\n preserveLayout\n isLoading={this.isLoading}\n variant=\"control\"\n controlAppearance=\"outlined\"\n controlContent=\"icon\"\n >\n <ds-button-unfilled\n variant=\"icon\"\n type=\"button\"\n icon=\"Filters\"\n aria-label={this.filterLabel}\n onDsClick={this.handleFilterClick}\n />\n </ds-skeleton>\n ) : null}\n <slot name=\"actions\" />\n </div>\n </header>\n <div class=\"card-chart__body\">\n {usesChartLayout ? (\n <div class=\"card-chart__layout\">\n {this.hasChartSlot || this.isLoading ? (\n <div\n class={{\n 'card-chart__chart': true,\n }}\n >\n <slot name=\"chart\" />\n {this.isLoading && (\n <ds-skeleton class=\"card-chart__plot-skeleton\" variant=\"control\" />\n )}\n </div>\n ) : null}\n {this.hasLegendSlot ? (\n <div class=\"card-chart__legend\">\n <slot name=\"legend\" />\n {this.isLoading && (\n <ds-skeleton\n class=\"card-chart__legend-skeleton\"\n width=\"min(60%, calc(var(--dimension-size-800) * 2))\"\n />\n )}\n </div>\n ) : null}\n <slot />\n </div>\n ) : (\n <slot />\n )}\n </div>\n </Host>\n );\n }\n}\n",
275
295
  "type": "registry:ui"
276
296
  }
277
297
  ]
@@ -52,7 +52,8 @@
52
52
  "In content mode, the native link owns those interaction states only across the header while the body remains application-owned.",
53
53
  "An empty or unsafe href renders non-interactive card chrome without a false keyboard target.",
54
54
  "Copy is always stacked, so a missing description keeps the heading at the start of the column instead of centering it in the header.",
55
- "The application owns destination loading, authorization, not-found, and recovery states after navigation."
55
+ "The application owns destination loading, authorization, not-found, and recovery states after navigation.",
56
+ "isLoading preserves card geometry and copy wrapping while showing skeletons and preventing navigation."
56
57
  ],
57
58
  "responsiveBehavior": [
58
59
  "Choose sm, md, or lg from the parent layout; the surface never exceeds its parent width.",
@@ -155,6 +156,15 @@
155
156
  "mutable": false,
156
157
  "description": "Destination for the card's native link."
157
158
  },
159
+ "isLoading": {
160
+ "type": "boolean",
161
+ "resolvedType": "boolean",
162
+ "attribute": "is-loading",
163
+ "default": "false",
164
+ "required": false,
165
+ "mutable": false,
166
+ "description": "Preserve the card layout while its copy and navigation affordance show skeletons."
167
+ },
158
168
  "variant": {
159
169
  "type": "CardNavigationVariant",
160
170
  "resolvedType": "\"content\" | \"navigation-only\"",
@@ -212,6 +222,15 @@
212
222
  "mutable": false,
213
223
  "description": "Destination for the card's native link."
214
224
  },
225
+ "isLoading": {
226
+ "type": "boolean",
227
+ "resolvedType": "boolean",
228
+ "attribute": "is-loading",
229
+ "default": "false",
230
+ "required": false,
231
+ "mutable": false,
232
+ "description": "Preserve the card layout while its copy and navigation affordance show skeletons."
233
+ },
215
234
  "variant": {
216
235
  "type": "CardNavigationVariant",
217
236
  "resolvedType": "\"content\" | \"navigation-only\"",
@@ -261,8 +280,8 @@
261
280
  },
262
281
  "peerDependencies": {
263
282
  "required": [
264
- "@ds-mo/tokens ^8.0.0",
265
- "@ds-mo/icons ^8.1.1"
283
+ "@ds-mo/tokens ^8.0.1",
284
+ "@ds-mo/icons ^8.1.2"
266
285
  ],
267
286
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
268
287
  }
@@ -275,17 +294,18 @@
275
294
  ],
276
295
  "registryDependencies": [
277
296
  "icon",
297
+ "skeleton",
278
298
  "text"
279
299
  ],
280
300
  "files": [
281
301
  {
282
302
  "path": "src/wc/components/CardNavigation/CardNavigation.css",
283
- "content": "@import '../../utils/radius.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: relative;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--_card-navigation-width);\n max-width: 100%;\n overflow: hidden;\n border: none;\n border-radius: var(--ds-radius-card);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-shadow-elevated-sm);\n}\n\n:host(.card-navigation--content) {\n min-height: var(--_card-navigation-min-height);\n}\n\n:host::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 4;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-sm);\n pointer-events: none;\n}\n\n.card-navigation__target {\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n}\n\n.card-navigation__header {\n flex: 0 0 auto;\n align-items: flex-start;\n border-radius: inherit;\n}\n\n:host(.card-navigation--content) .card-navigation__header {\n border-radius: var(--ds-radius-card) var(--ds-radius-card) 0 0;\n --ds-interaction-divider-width: var(--dimension-stroke-width-012);\n --ds-interaction-divider-color: var(--color-border-tertiary);\n}\n\n.card-navigation__copy {\n min-height: var(--dimension-size-400);\n justify-content: flex-start;\n}\n\nds-text.card-navigation__title,\nds-text.card-navigation__description {\n overflow-wrap: anywhere;\n}\n\n.card-navigation__chevron {\n align-self: center;\n justify-content: center;\n width: var(--dimension-size-400);\n color: var(--color-foreground-secondary);\n}\n\n.card-navigation__body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n border-radius: 0 0 var(--ds-radius-card) var(--ds-radius-card);\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n\n :host::after {\n box-shadow: none;\n }\n}\n",
303
+ "content": "@import '../../utils/radius.css';\n@import '../../utils/chrome-header.css';\n@import '../../utils/interaction-fill.css';\n@import '../../utils/focus-ring.css';\n@import '../../utils/forced-colors.css';\n\n:host {\n position: relative;\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--_card-navigation-width);\n max-width: 100%;\n overflow: hidden;\n border: none;\n border-radius: var(--ds-radius-card);\n background-color: var(--color-background-primary);\n box-shadow: var(--effect-shadow-elevated-sm);\n}\n\n:host(.card-navigation--content) {\n min-height: var(--_card-navigation-min-height);\n}\n\n:host::after {\n content: '';\n position: absolute;\n inset: 0;\n z-index: 4;\n border-radius: inherit;\n box-shadow: var(--effect-highlight-elevated-sm);\n pointer-events: none;\n}\n\n.card-navigation__target {\n color: inherit;\n text-decoration: none;\n cursor: pointer;\n}\n\n.card-navigation__header {\n flex: 0 0 auto;\n align-items: flex-start;\n border-radius: inherit;\n}\n\n:host(.card-navigation--content) .card-navigation__header {\n border-radius: var(--ds-radius-card) var(--ds-radius-card) 0 0;\n --ds-interaction-divider-width: var(--dimension-stroke-width-012);\n --ds-interaction-divider-color: var(--color-border-tertiary);\n}\n\n.card-navigation__copy {\n min-height: var(--dimension-size-400);\n justify-content: flex-start;\n}\n\n.card-navigation__line {\n display: grid;\n min-width: 0;\n align-items: start;\n}\n\n.card-navigation__line > * {\n grid-area: 1 / 1;\n}\n\n:host(.card-navigation--loading) ds-text {\n visibility: hidden;\n}\n\nds-text.card-navigation__title,\nds-text.card-navigation__description {\n overflow-wrap: anywhere;\n}\n\n.card-navigation__chevron {\n align-self: center;\n justify-content: center;\n width: var(--dimension-size-400);\n color: var(--color-foreground-secondary);\n}\n\n.card-navigation__body {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n min-height: 0;\n box-sizing: border-box;\n background-color: var(--color-background-primary);\n border-radius: 0 0 var(--ds-radius-card) var(--ds-radius-card);\n}\n\n@media (forced-colors: active) {\n :host {\n box-shadow: none;\n outline: var(--dimension-stroke-width-012) solid var(--ds-forced-color-content);\n outline-offset: calc(-1 * var(--dimension-stroke-width-012));\n }\n\n :host::after {\n box-shadow: none;\n }\n}\n",
284
304
  "type": "registry:ui"
285
305
  },
286
306
  {
287
307
  "path": "src/wc/components/CardNavigation/CardNavigation.tsx",
288
- "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport { resolveSafeUrl } from '../../utils';\n\nexport type CardNavigationWidth = 'sm' | 'md' | 'lg';\nexport type CardNavigationVariant = 'navigation-only' | 'content';\n\nexport interface CardNavigationDetail {\n href: string;\n originalEvent: MouseEvent;\n}\n\nconst CARD_WIDTH_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-width-sm)',\n md: 'var(--dimension-card-width-md)',\n lg: 'var(--dimension-card-width-lg)',\n};\n\nconst CARD_HEIGHT_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-height-sm)',\n md: 'var(--dimension-card-height-md)',\n lg: 'var(--dimension-card-height-lg)',\n};\n\n@Component({\n tag: 'ds-card-navigation',\n styleUrl: 'CardNavigation.css',\n scoped: true,\n})\nexport class CardNavigation {\n /** Destination for the card's native link. */\n @Prop() href!: string;\n\n /** Section or destination heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Optional supporting copy shown below the heading. */\n @Prop() description: string | undefined;\n\n /**\n * `navigation-only` makes the complete card the link. `content` keeps the\n * header as the link and exposes a non-interactive body slot below it.\n */\n @Prop() variant: CardNavigationVariant = 'navigation-only';\n\n /** Card width token (`sm` / `md` / `lg`). */\n @Prop() cardWidth: CardNavigationWidth = 'md';\n\n /**\n * Emits before native navigation. Prevent this event to take over routing;\n * the component will then prevent the original link navigation.\n */\n @Event({ cancelable: true }) dsNavigate!: EventEmitter<CardNavigationDetail>;\n\n private handleNavigation(href: string, originalEvent: MouseEvent) {\n const navigateEvent = this.dsNavigate.emit({ href, originalEvent });\n if (navigateEvent.defaultPrevented) originalEvent.preventDefault();\n }\n\n private renderHeader(href: string | undefined) {\n const Target = href ? 'a' : 'div';\n const description = this.description?.trim();\n\n return (\n <Target\n class={{\n 'card-navigation__target': true,\n 'card-navigation__header': true,\n 'ds-chrome-header': true,\n 'ds-interaction-fill': !!href,\n 'ds-focus-ring-inset': !!href,\n }}\n href={href}\n onClick={href ? (event: MouseEvent) => this.handleNavigation(href, event) : undefined}\n >\n <div\n class={{\n 'card-navigation__copy': true,\n 'ds-chrome-header__copy': true,\n 'ds-chrome-header__copy--stacked': true,\n 'ds-control--md': true,\n 'ds-interaction-fill__content': true,\n }}\n >\n <ds-text\n class=\"card-navigation__title ds-chrome-header__heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n as=\"h2\"\n >\n {this.heading}\n </ds-text>\n {description ? (\n <ds-text\n class=\"card-navigation__description ds-chrome-header__description\"\n variant=\"text-body-small\"\n color=\"secondary\"\n as=\"span\"\n >\n {description}\n </ds-text>\n ) : null}\n </div>\n <span class=\"card-navigation__chevron ds-chrome-header__trailing ds-interaction-fill__content\">\n <ds-icon name=\"ChevronRight\" size=\"md\" color=\"inherit\" aria-hidden=\"true\" />\n </span>\n </Target>\n );\n }\n\n render() {\n const href = resolveSafeUrl(this.href);\n const hasContent = this.variant === 'content';\n\n return (\n <Host\n class={{\n 'card-navigation': true,\n 'card-navigation--navigation-only': !hasContent,\n 'card-navigation--content': hasContent,\n }}\n style={{\n '--_card-navigation-width': CARD_WIDTH_VARS[this.cardWidth],\n '--_card-navigation-min-height': CARD_HEIGHT_VARS[this.cardWidth],\n }}\n >\n {this.renderHeader(href)}\n {hasContent ? (\n <div class=\"card-navigation__body\">\n <slot />\n </div>\n ) : null}\n </Host>\n );\n }\n}\n",
308
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport { resolveSafeUrl } from '../../utils';\n\nexport type CardNavigationWidth = 'sm' | 'md' | 'lg';\nexport type CardNavigationVariant = 'navigation-only' | 'content';\n\nexport interface CardNavigationDetail {\n href: string;\n originalEvent: MouseEvent;\n}\n\nconst CARD_WIDTH_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-width-sm)',\n md: 'var(--dimension-card-width-md)',\n lg: 'var(--dimension-card-width-lg)',\n};\n\nconst CARD_HEIGHT_VARS: Record<CardNavigationWidth, string> = {\n sm: 'var(--dimension-card-height-sm)',\n md: 'var(--dimension-card-height-md)',\n lg: 'var(--dimension-card-height-lg)',\n};\n\n@Component({\n tag: 'ds-card-navigation',\n styleUrl: 'CardNavigation.css',\n scoped: true,\n})\nexport class CardNavigation {\n /** Destination for the card's native link. */\n @Prop() href!: string;\n\n /** Section or destination heading shown in the card header. */\n @Prop() heading!: string;\n\n /** Optional supporting copy shown below the heading. */\n @Prop() description: string | undefined;\n /** Preserve the card layout while its copy and navigation affordance show skeletons. */\n @Prop() isLoading = false;\n\n /**\n * `navigation-only` makes the complete card the link. `content` keeps the\n * header as the link and exposes a non-interactive body slot below it.\n */\n @Prop() variant: CardNavigationVariant = 'navigation-only';\n\n /** Card width token (`sm` / `md` / `lg`). */\n @Prop() cardWidth: CardNavigationWidth = 'md';\n\n /**\n * Emits before native navigation. Prevent this event to take over routing;\n * the component will then prevent the original link navigation.\n */\n @Event({ cancelable: true }) dsNavigate!: EventEmitter<CardNavigationDetail>;\n\n private handleNavigation(href: string, originalEvent: MouseEvent) {\n const navigateEvent = this.dsNavigate.emit({ href, originalEvent });\n if (navigateEvent.defaultPrevented) originalEvent.preventDefault();\n }\n\n private renderHeader(href: string | undefined) {\n const Target = href ? 'a' : 'div';\n const description = this.description?.trim();\n\n return (\n <Target\n class={{\n 'card-navigation__target': true,\n 'card-navigation__header': true,\n 'ds-chrome-header': true,\n 'ds-interaction-fill': !!href,\n 'ds-focus-ring-inset': !!href,\n }}\n href={href}\n inert={this.isLoading}\n onClick={href ? (event: MouseEvent) => this.handleNavigation(href, event) : undefined}\n >\n <div\n class={{\n 'card-navigation__copy': true,\n 'ds-chrome-header__copy': true,\n 'ds-chrome-header__copy--stacked': true,\n 'ds-control--md': true,\n 'ds-interaction-fill__content': true,\n }}\n >\n <div class=\"card-navigation__line\">\n <ds-text\n class=\"card-navigation__title ds-chrome-header__heading\"\n variant=\"text-title-small\"\n emphasis\n color=\"primary\"\n as=\"h2\"\n >\n {this.heading}\n </ds-text>\n {this.isLoading && (\n <ds-skeleton\n width=\"min(60%, calc(var(--dimension-size-800) * 2))\"\n textVariant=\"text-title-small\"\n />\n )}\n </div>\n {description ? (\n <div class=\"card-navigation__line\">\n <ds-text\n class=\"card-navigation__description ds-chrome-header__description\"\n variant=\"text-body-small\"\n color=\"secondary\"\n as=\"span\"\n >\n {description}\n </ds-text>\n {this.isLoading && <ds-skeleton width=\"95%\" textVariant=\"text-body-small\" />}\n </div>\n ) : null}\n </div>\n <span class=\"card-navigation__chevron ds-chrome-header__trailing ds-interaction-fill__content\">\n {this.isLoading ? (\n <ds-skeleton variant=\"icon\" iconSize=\"md\" />\n ) : (\n <ds-icon name=\"ChevronRight\" size=\"md\" color=\"inherit\" aria-hidden=\"true\" />\n )}\n </span>\n </Target>\n );\n }\n\n render() {\n const href = this.isLoading ? undefined : resolveSafeUrl(this.href);\n const hasContent = this.variant === 'content';\n\n return (\n <Host\n aria-busy={this.isLoading ? 'true' : undefined}\n class={{\n 'card-navigation': true,\n 'card-navigation--loading': this.isLoading,\n 'card-navigation--navigation-only': !hasContent,\n 'card-navigation--content': hasContent,\n }}\n style={{\n '--_card-navigation-width': CARD_WIDTH_VARS[this.cardWidth],\n '--_card-navigation-min-height': CARD_HEIGHT_VARS[this.cardWidth],\n }}\n >\n {this.renderHeader(href)}\n {hasContent ? (\n <div class=\"card-navigation__body\">\n <slot />\n </div>\n ) : null}\n </Host>\n );\n }\n}\n",
289
309
  "type": "registry:ui"
290
310
  }
291
311
  ]