@ds-mo/ui 15.2.0 → 15.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 (504) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +3 -3
  3. package/dist/agent.json +936 -80
  4. package/dist/angular/ds-card-setting.d.ts +1 -1
  5. package/dist/angular/ds-card-setting.js +3 -3
  6. package/dist/angular/ds-checkbox-group.d.ts +12 -0
  7. package/dist/angular/ds-checkbox-group.js +38 -0
  8. package/dist/angular/ds-checkbox.d.ts +1 -1
  9. package/dist/angular/ds-checkbox.js +3 -3
  10. package/dist/angular/ds-inline-banner-settings.d.ts +12 -0
  11. package/dist/angular/ds-inline-banner-settings.js +38 -0
  12. package/dist/angular/ds-input-time.d.ts +1 -1
  13. package/dist/angular/ds-input-time.js +3 -3
  14. package/dist/angular/ds-input.d.ts +5 -1
  15. package/dist/angular/ds-input.js +10 -4
  16. package/dist/angular/ds-map-entity-marker.d.ts +1 -1
  17. package/dist/angular/ds-map-entity-marker.js +3 -3
  18. package/dist/angular/ds-radio-tile.d.ts +15 -0
  19. package/dist/angular/ds-radio-tile.js +43 -0
  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-checkbox.d.ts +12 -0
  23. package/dist/angular/ds-setting-row-checkbox.js +38 -0
  24. package/dist/angular/ds-setting-row-radio.d.ts +12 -0
  25. package/dist/angular/ds-setting-row-radio.js +38 -0
  26. package/dist/angular/ds-setting-row-toggle.d.ts +18 -0
  27. package/dist/angular/ds-setting-row-toggle.js +42 -0
  28. package/dist/angular/ds-slider.d.ts +1 -1
  29. package/dist/angular/ds-slider.js +3 -3
  30. package/dist/angular/ds-textarea.d.ts +1 -1
  31. package/dist/angular/ds-textarea.js +3 -3
  32. package/dist/angular/ds-time-picker.d.ts +1 -1
  33. package/dist/angular/ds-time-picker.js +3 -3
  34. package/dist/angular/index.d.ts +1 -1
  35. package/dist/angular/index.js +6 -0
  36. package/dist/angular/number-value-accessor.d.ts +9 -0
  37. package/dist/angular/number-value-accessor.js +39 -0
  38. package/dist/angular/proxies.d.ts +6 -0
  39. package/dist/angular/proxies.js +6 -0
  40. package/dist/angular/radio-value-accessor.d.ts +1 -1
  41. package/dist/angular/radio-value-accessor.js +2 -2
  42. package/dist/angular/select-value-accessor.d.ts +1 -1
  43. package/dist/angular/select-value-accessor.js +2 -2
  44. package/dist/angular/text-value-accessor.d.ts +1 -1
  45. package/dist/angular/text-value-accessor.js +2 -2
  46. package/dist/components/ds-agent-activity.js +1 -1
  47. package/dist/components/ds-agent-questionnaire.js +1 -1
  48. package/dist/components/ds-agent-response.js +1 -1
  49. package/dist/components/ds-agent-response.js.map +1 -1
  50. package/dist/components/ds-agent-source-list.js +1 -1
  51. package/dist/components/ds-agent-tool-call.js +1 -1
  52. package/dist/components/ds-attachment-list.js +1 -1
  53. package/dist/components/ds-badge.js +1 -1
  54. package/dist/components/ds-banner.js +1 -1
  55. package/dist/components/ds-bar-action.js +1 -1
  56. package/dist/components/ds-bar-nav.js +1 -1
  57. package/dist/components/ds-bar-page-title.js +1 -1
  58. package/dist/components/ds-bar-title.js +1 -1
  59. package/dist/components/ds-bar-workflow.js +1 -1
  60. package/dist/components/ds-breadcrumb.js +1 -1
  61. package/dist/components/ds-button-filled.js +1 -1
  62. package/dist/components/ds-button-inverted.js +1 -1
  63. package/dist/components/ds-button-inverted.js.map +1 -1
  64. package/dist/components/ds-button-unfilled.js +1 -1
  65. package/dist/components/ds-calendar.js +1 -1
  66. package/dist/components/ds-card-action-center.js +1 -1
  67. package/dist/components/ds-card-action-center.js.map +1 -1
  68. package/dist/components/ds-card-chart.js +1 -1
  69. package/dist/components/ds-card-navigation.js +1 -1
  70. package/dist/components/ds-card-navigation.js.map +1 -1
  71. package/dist/components/ds-card-overview.js +1 -1
  72. package/dist/components/ds-card-overview.js.map +1 -1
  73. package/dist/components/ds-card-setting.js +1 -1
  74. package/dist/components/ds-card-setting.js.map +1 -1
  75. package/dist/components/ds-card-settings-scope.js +1 -1
  76. package/dist/components/ds-card-settings-scope.js.map +1 -1
  77. package/dist/components/ds-chart-legend.js +1 -1
  78. package/dist/components/ds-chart-legend.js.map +1 -1
  79. package/dist/components/ds-chart.js +1 -1
  80. package/dist/components/ds-checkbox-group.d.ts +11 -0
  81. package/dist/components/ds-checkbox-group.js +2 -0
  82. package/dist/components/ds-checkbox-group.js.map +1 -0
  83. package/dist/components/ds-checkbox.js +1 -1
  84. package/dist/components/ds-chip.js +1 -1
  85. package/dist/components/ds-code-block.js +1 -1
  86. package/dist/components/ds-conversation-list-item.js +1 -1
  87. package/dist/components/ds-conversation-list-item.js.map +1 -1
  88. package/dist/components/ds-conversation-list-section.js +1 -1
  89. package/dist/components/ds-conversation-list.js +1 -1
  90. package/dist/components/ds-data-customize.js +1 -1
  91. package/dist/components/ds-data-customize.js.map +1 -1
  92. package/dist/components/ds-data-filter.js +1 -1
  93. package/dist/components/ds-data-filter.js.map +1 -1
  94. package/dist/components/ds-data-group.js +1 -1
  95. package/dist/components/ds-data-preferences.js +1 -1
  96. package/dist/components/ds-data-preferences.js.map +1 -1
  97. package/dist/components/ds-data-saved-views.js +1 -1
  98. package/dist/components/ds-data-saved-views.js.map +1 -1
  99. package/dist/components/ds-data-search.js +1 -1
  100. package/dist/components/ds-data-search.js.map +1 -1
  101. package/dist/components/ds-data-sort.js +1 -1
  102. package/dist/components/ds-data-toolbar.js +1 -1
  103. package/dist/components/ds-divider.js +1 -1
  104. package/dist/components/ds-empty-state.js +1 -1
  105. package/dist/components/ds-field.js +1 -1
  106. package/dist/components/ds-filter-menu.js +1 -1
  107. package/dist/components/ds-inline-banner-settings.d.ts +11 -0
  108. package/dist/components/ds-inline-banner-settings.js +2 -0
  109. package/dist/components/ds-inline-banner-settings.js.map +1 -0
  110. package/dist/components/ds-input-date.js +1 -1
  111. package/dist/components/ds-input-date.js.map +1 -1
  112. package/dist/components/ds-input-time.js +1 -1
  113. package/dist/components/ds-input-time.js.map +1 -1
  114. package/dist/components/ds-input.js +1 -1
  115. package/dist/components/ds-map-cluster-marker.js +1 -1
  116. package/dist/components/ds-map-entity-marker.js +1 -1
  117. package/dist/components/ds-map-entity-marker.js.map +1 -1
  118. package/dist/components/ds-markdown.js +1 -1
  119. package/dist/components/ds-menu.js +1 -1
  120. package/dist/components/ds-message-actions.js +1 -1
  121. package/dist/components/ds-message-bubble.js +1 -1
  122. package/dist/components/ds-message-bubble.js.map +1 -1
  123. package/dist/components/ds-message-composer.js +1 -1
  124. package/dist/components/ds-message-composer.js.map +1 -1
  125. package/dist/components/ds-message-scroller.js +1 -1
  126. package/dist/components/ds-message.js +1 -1
  127. package/dist/components/ds-mobile-bar-nav.js +1 -1
  128. package/dist/components/ds-mobile-header.js +1 -1
  129. package/dist/components/ds-mobile-section-switcher.js +1 -1
  130. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  131. package/dist/components/ds-modal.js +1 -1
  132. package/dist/components/ds-pagination.js +1 -1
  133. package/dist/components/ds-panel-nav.js +1 -1
  134. package/dist/components/ds-panel-sub-nav.js +1 -1
  135. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  136. package/dist/components/ds-panel-tool-header.js +1 -1
  137. package/dist/components/ds-panel-tool-search.js +1 -1
  138. package/dist/components/ds-panel-tool-search.js.map +1 -1
  139. package/dist/components/ds-panel-tools.js +1 -1
  140. package/dist/components/ds-paper-texture.js +1 -1
  141. package/dist/components/ds-radio-tile.d.ts +11 -0
  142. package/dist/components/ds-radio-tile.js +2 -0
  143. package/dist/components/ds-radio-tile.js.map +1 -0
  144. package/dist/components/ds-radio.js +1 -1
  145. package/dist/components/ds-score.js +1 -1
  146. package/dist/components/ds-scroll-overlay.js +1 -1
  147. package/dist/components/ds-select.js +1 -1
  148. package/dist/components/ds-setting-row-checkbox.d.ts +11 -0
  149. package/dist/components/ds-setting-row-checkbox.js +2 -0
  150. package/dist/components/ds-setting-row-checkbox.js.map +1 -0
  151. package/dist/components/ds-setting-row-radio.d.ts +11 -0
  152. package/dist/components/ds-setting-row-radio.js +2 -0
  153. package/dist/components/ds-setting-row-radio.js.map +1 -0
  154. package/dist/components/ds-setting-row-toggle.d.ts +11 -0
  155. package/dist/components/ds-setting-row-toggle.js +2 -0
  156. package/dist/components/ds-setting-row-toggle.js.map +1 -0
  157. package/dist/components/ds-shell-app.js +1 -1
  158. package/dist/components/ds-shell-app.js.map +1 -1
  159. package/dist/components/ds-shell-page.js +1 -1
  160. package/dist/components/ds-shell-tools.js +1 -1
  161. package/dist/components/ds-skeleton.js +1 -1
  162. package/dist/components/ds-slider.js +1 -1
  163. package/dist/components/ds-slider.js.map +1 -1
  164. package/dist/components/ds-swatch-picker.js +1 -1
  165. package/dist/components/ds-switch.js +1 -1
  166. package/dist/components/ds-tab-group.js +1 -1
  167. package/dist/components/ds-table.js +1 -1
  168. package/dist/components/ds-table.js.map +1 -1
  169. package/dist/components/ds-tag.js +1 -1
  170. package/dist/components/ds-text.js +1 -1
  171. package/dist/components/ds-textarea.js +1 -1
  172. package/dist/components/ds-textarea.js.map +1 -1
  173. package/dist/components/ds-time-picker.js +1 -1
  174. package/dist/components/ds-toast.js +1 -1
  175. package/dist/components/ds-tooltip-chart.js +1 -1
  176. package/dist/components/ds-tooltip.js +1 -1
  177. package/dist/components/ds-typing-indicator.js +1 -1
  178. package/dist/components/p-7TVdPhGR.js +2 -0
  179. package/dist/components/{p-YrnU2fM7.js.map → p-7TVdPhGR.js.map} +1 -1
  180. package/dist/components/{p-7V1AhetH.js → p-B0BQCVkq.js} +2 -2
  181. package/dist/components/p-B0EpvBDs.js +2 -0
  182. package/dist/components/{p-lamoJZE4.js.map → p-B0EpvBDs.js.map} +1 -1
  183. package/dist/components/{p-Cu8o2rOz.js → p-B39iJO8F.js} +2 -2
  184. package/dist/components/p-B9TM6FqC.js +2 -0
  185. package/dist/components/{p-BJJh-Bf7.js.map → p-B9TM6FqC.js.map} +1 -1
  186. package/dist/components/{p-B6qQaYkB.js → p-B9y6azEw.js} +2 -2
  187. package/dist/components/p-BDdlJZyL.js +2 -0
  188. package/dist/components/{p-CZ7hxDy_.js.map → p-BDdlJZyL.js.map} +1 -1
  189. package/dist/components/{p-5SVmAjXY.js → p-BERXvOCf.js} +2 -2
  190. package/dist/components/{p-xhn1cZgU.js → p-BFHpU-uU.js} +2 -2
  191. package/dist/components/{p-CuWPWC3t.js → p-BQspV5U7.js} +2 -2
  192. package/dist/components/p-BWSIw8AQ.js +2 -0
  193. package/dist/components/p-BWSIw8AQ.js.map +1 -0
  194. package/dist/components/p-BhjqYTiY.js +2 -0
  195. package/dist/components/p-BhjqYTiY.js.map +1 -0
  196. package/dist/components/{p-BOhefRMt.js → p-Bk3poU91.js} +2 -2
  197. package/dist/components/{p-QWukusRL.js → p-BnuNaXR2.js} +2 -2
  198. package/dist/components/p-BwdnVqAY.js +2 -0
  199. package/dist/components/p-BwdnVqAY.js.map +1 -0
  200. package/dist/components/p-C4huuwed.js +2 -0
  201. package/dist/components/{p-CRk0TjQv.js.map → p-C4huuwed.js.map} +1 -1
  202. package/dist/components/{p-BtnTQp4K.js → p-C8V4lkVy.js} +2 -2
  203. package/dist/components/p-CJ1NnOEW.js +2 -0
  204. package/dist/components/p-CJ1NnOEW.js.map +1 -0
  205. package/dist/components/p-CPamUzaj.js +2 -0
  206. package/dist/components/{p-CNZ6-kWd.js.map → p-CPamUzaj.js.map} +1 -1
  207. package/dist/components/{p-Dqfc6Nvd.js → p-CUDocY23.js} +2 -2
  208. package/dist/components/{p-Dqfc6Nvd.js.map → p-CUDocY23.js.map} +1 -1
  209. package/dist/components/p-CX6ZxUQT.js +2 -0
  210. package/dist/components/p-CX6ZxUQT.js.map +1 -0
  211. package/dist/components/p-CZNZTcYS.js +2 -0
  212. package/dist/components/p-CZNZTcYS.js.map +1 -0
  213. package/dist/components/p-CbCN9ew9.js +2 -0
  214. package/dist/components/p-CbCN9ew9.js.map +1 -0
  215. package/dist/components/p-CeXf9-X3.js.map +1 -1
  216. package/dist/components/p-Cgn-BORA.js +2 -0
  217. package/dist/components/p-Cgn-BORA.js.map +1 -0
  218. package/dist/components/{p-mux14tWZ.js → p-Co1rUdOR.js} +2 -2
  219. package/dist/components/p-Co1rUdOR.js.map +1 -0
  220. package/dist/components/{p-CGidq1iC.js → p-CuwopElg.js} +2 -2
  221. package/dist/components/p-CwUXroLs.js +2 -0
  222. package/dist/components/{p-etg-Uk1u.js.map → p-CwUXroLs.js.map} +1 -1
  223. package/dist/components/{p-Cn6AfzeF.js → p-CwdRaJER.js} +2 -2
  224. package/dist/components/p-D6FRqNhN.js +2 -0
  225. package/dist/components/p-D6FRqNhN.js.map +1 -0
  226. package/dist/components/{p-ZwRLjD5M.js → p-D8OWhnID.js} +2 -2
  227. package/dist/components/p-DCyJ3_PL.js +2 -0
  228. package/dist/components/{p-BZ_e69zx.js.map → p-DCyJ3_PL.js.map} +1 -1
  229. package/dist/components/{p-C_Ma6Xa-.js → p-DIQiHX0q.js} +2 -2
  230. package/dist/components/{p-B3CZvMXs.js → p-DJDbskZf.js} +2 -2
  231. package/dist/components/p-DRdoGSGX.js +2 -0
  232. package/dist/components/{p-CTGgXIXM.js.map → p-DRdoGSGX.js.map} +1 -1
  233. package/dist/components/{p-C1gaWjOm.js → p-DSZPO06T.js} +2 -2
  234. package/dist/components/{p-uADksYMl.js → p-DSmDyI2o.js} +2 -2
  235. package/dist/components/{p-UY63jmrO.js → p-DVEx-Xg9.js} +2 -2
  236. package/dist/components/p-DXk1eml1.js +2 -0
  237. package/dist/components/{p-Dlp1HqgS.js.map → p-DXk1eml1.js.map} +1 -1
  238. package/dist/components/{p-p0FVyEFa.js → p-DYQa1DVF.js} +2 -2
  239. package/dist/components/p-DYQa1DVF.js.map +1 -0
  240. package/dist/components/p-DYsE6HLk.js +2 -0
  241. package/dist/components/p-DYsE6HLk.js.map +1 -0
  242. package/dist/components/{p-vfCu7XSc.js → p-DZ58Sg5a.js} +2 -2
  243. package/dist/components/p-DebLYW7A.js +2 -0
  244. package/dist/components/p-DebLYW7A.js.map +1 -0
  245. package/dist/components/p-DhKvqh5G.js +2 -0
  246. package/dist/components/p-DhKvqh5G.js.map +1 -0
  247. package/dist/components/{p-DFO5lV_A.js → p-DmSnHVW6.js} +2 -2
  248. package/dist/components/p-Dnt5xUBD.js +2 -0
  249. package/dist/components/{p-BR5OC2PX.js.map → p-Dnt5xUBD.js.map} +1 -1
  250. package/dist/components/p-Doa2blZT.js +2 -0
  251. package/dist/components/{p-BLuqpHvp.js.map → p-Doa2blZT.js.map} +1 -1
  252. package/dist/components/{p-DsLXlxt3.js → p-Dyqd-cub.js} +2 -2
  253. package/dist/components/p-Dyqd-cub.js.map +1 -0
  254. package/dist/components/p-DzvTC27M.js +2 -0
  255. package/dist/components/p-DzvTC27M.js.map +1 -0
  256. package/dist/components/p-JBki_jyY.js +2 -0
  257. package/dist/components/{p-C0JkLR83.js.map → p-JBki_jyY.js.map} +1 -1
  258. package/dist/components/p-MOJmB6vX.js +2 -0
  259. package/dist/components/{p-BzYW1IqO.js.map → p-MOJmB6vX.js.map} +1 -1
  260. package/dist/components/p-TVkFIMXz.js +2 -0
  261. package/dist/components/p-TVkFIMXz.js.map +1 -0
  262. package/dist/components/{p-ER5M085B.js → p-UJMEz8_O.js} +2 -2
  263. package/dist/components/{p-CR-Jjdcn.js → p-_IqSPt5V.js} +2 -2
  264. package/dist/components/p-g0jsfEXz.js +2 -0
  265. package/dist/components/{p-BfF4RZdp.js.map → p-g0jsfEXz.js.map} +1 -1
  266. package/dist/components/{p-BLSSaVWm.js → p-pp1IQN4Z.js} +2 -2
  267. package/dist/docs/components.json +2901 -835
  268. package/dist/framework/angular.d.ts +1 -0
  269. package/dist/framework/angular.js +1 -0
  270. package/dist/lib/shell/index.js +1 -1
  271. package/dist/lib/shell/index.js.map +1 -1
  272. package/dist/lint/index.js +1 -1
  273. package/dist/mcp-data/registry/agent-activity.json +2 -2
  274. package/dist/mcp-data/registry/agent-questionnaire.json +2 -2
  275. package/dist/mcp-data/registry/agent-response.json +3 -3
  276. package/dist/mcp-data/registry/agent-source-list.json +2 -2
  277. package/dist/mcp-data/registry/agent-tool-call.json +2 -2
  278. package/dist/mcp-data/registry/attachment-list.json +2 -2
  279. package/dist/mcp-data/registry/avatar.json +2 -2
  280. package/dist/mcp-data/registry/badge.json +2 -2
  281. package/dist/mcp-data/registry/banner.json +2 -2
  282. package/dist/mcp-data/registry/bar-action.json +2 -2
  283. package/dist/mcp-data/registry/bar-nav.json +5 -5
  284. package/dist/mcp-data/registry/bar-page-title.json +4 -4
  285. package/dist/mcp-data/registry/bar-title.json +4 -4
  286. package/dist/mcp-data/registry/bar-workflow.json +2 -2
  287. package/dist/mcp-data/registry/breadcrumb.json +2 -2
  288. package/dist/mcp-data/registry/button-filled.json +2 -2
  289. package/dist/mcp-data/registry/button-inverted.json +2 -2
  290. package/dist/mcp-data/registry/button-unfilled.json +9 -9
  291. package/dist/mcp-data/registry/calendar.json +2 -2
  292. package/dist/mcp-data/registry/card-action-center.json +2 -2
  293. package/dist/mcp-data/registry/card-chart.json +2 -2
  294. package/dist/mcp-data/registry/card-navigation.json +2 -2
  295. package/dist/mcp-data/registry/card-overview.json +2 -2
  296. package/dist/mcp-data/registry/card-setting.json +50 -15
  297. package/dist/mcp-data/registry/card-settings-scope.json +2 -2
  298. package/dist/mcp-data/registry/chart-legend.json +2 -2
  299. package/dist/mcp-data/registry/chart.json +2 -2
  300. package/dist/mcp-data/registry/checkbox-group.json +246 -0
  301. package/dist/mcp-data/registry/checkbox.json +26 -6
  302. package/dist/mcp-data/registry/chip.json +2 -2
  303. package/dist/mcp-data/registry/code-block.json +2 -2
  304. package/dist/mcp-data/registry/conversation-list-item.json +2 -2
  305. package/dist/mcp-data/registry/conversation-list-section.json +2 -2
  306. package/dist/mcp-data/registry/conversation-list.json +2 -2
  307. package/dist/mcp-data/registry/data-customize.json +3 -3
  308. package/dist/mcp-data/registry/data-filter.json +2 -2
  309. package/dist/mcp-data/registry/data-group.json +2 -2
  310. package/dist/mcp-data/registry/data-preferences.json +2 -2
  311. package/dist/mcp-data/registry/data-saved-views.json +2 -2
  312. package/dist/mcp-data/registry/data-search.json +2 -2
  313. package/dist/mcp-data/registry/data-sort.json +2 -2
  314. package/dist/mcp-data/registry/data-toolbar.json +2 -2
  315. package/dist/mcp-data/registry/divider.json +2 -2
  316. package/dist/mcp-data/registry/empty-state.json +27 -14
  317. package/dist/mcp-data/registry/field.json +6 -5
  318. package/dist/mcp-data/registry/filter-menu.json +2 -2
  319. package/dist/mcp-data/registry/icon.json +2 -2
  320. package/dist/mcp-data/registry/inline-banner-settings.json +175 -0
  321. package/dist/mcp-data/registry/input-date.json +2 -2
  322. package/dist/mcp-data/registry/input-time.json +26 -7
  323. package/dist/mcp-data/registry/input.json +265 -15
  324. package/dist/mcp-data/registry/loader.json +2 -2
  325. package/dist/mcp-data/registry/map-cluster-marker.json +3 -3
  326. package/dist/mcp-data/registry/map-entity-marker.json +56 -56
  327. package/dist/mcp-data/registry/markdown.json +2 -2
  328. package/dist/mcp-data/registry/menu.json +2 -2
  329. package/dist/mcp-data/registry/message-actions.json +2 -2
  330. package/dist/mcp-data/registry/message-bubble.json +5 -5
  331. package/dist/mcp-data/registry/message-composer.json +7 -7
  332. package/dist/mcp-data/registry/message-scroller.json +2 -2
  333. package/dist/mcp-data/registry/message.json +3 -3
  334. package/dist/mcp-data/registry/mobile-bar-nav.json +2 -2
  335. package/dist/mcp-data/registry/mobile-header.json +2 -2
  336. package/dist/mcp-data/registry/mobile-section-switcher.json +2 -2
  337. package/dist/mcp-data/registry/mobile-sheet-nav.json +2 -2
  338. package/dist/mcp-data/registry/modal.json +2 -2
  339. package/dist/mcp-data/registry/pagination.json +2 -2
  340. package/dist/mcp-data/registry/panel-nav.json +4 -4
  341. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  342. package/dist/mcp-data/registry/panel-tool-header.json +4 -4
  343. package/dist/mcp-data/registry/panel-tool-search.json +3 -3
  344. package/dist/mcp-data/registry/panel-tools.json +4 -4
  345. package/dist/mcp-data/registry/paper-texture.json +2 -2
  346. package/dist/mcp-data/registry/radio-tile.json +399 -0
  347. package/dist/mcp-data/registry/radio.json +51 -9
  348. package/dist/mcp-data/registry/registry.json +954 -80
  349. package/dist/mcp-data/registry/score.json +2 -2
  350. package/dist/mcp-data/registry/scroll-overlay.json +2 -2
  351. package/dist/mcp-data/registry/select.json +2 -2
  352. package/dist/mcp-data/registry/setting-row-checkbox.json +197 -0
  353. package/dist/mcp-data/registry/setting-row-radio.json +196 -0
  354. package/dist/mcp-data/registry/setting-row-toggle.json +233 -0
  355. package/dist/mcp-data/registry/shell-app.json +4 -4
  356. package/dist/mcp-data/registry/shell-page.json +2 -2
  357. package/dist/mcp-data/registry/shell-tools.json +2 -2
  358. package/dist/mcp-data/registry/skeleton.json +2 -2
  359. package/dist/mcp-data/registry/slider.json +32 -12
  360. package/dist/mcp-data/registry/swatch-picker.json +2 -2
  361. package/dist/mcp-data/registry/switch.json +4 -4
  362. package/dist/mcp-data/registry/tab-group.json +2 -2
  363. package/dist/mcp-data/registry/table.json +5 -5
  364. package/dist/mcp-data/registry/tag.json +2 -2
  365. package/dist/mcp-data/registry/text.json +2 -2
  366. package/dist/mcp-data/registry/textarea.json +72 -5
  367. package/dist/mcp-data/registry/time-picker.json +28 -9
  368. package/dist/mcp-data/registry/toast.json +2 -2
  369. package/dist/mcp-data/registry/tooltip-chart.json +2 -2
  370. package/dist/mcp-data/registry/tooltip.json +2 -2
  371. package/dist/mcp-data/registry/typing-indicator.json +2 -2
  372. package/dist/react/components.d.ts +6 -0
  373. package/dist/react/components.js +6 -0
  374. package/dist/react/ds-checkbox-group.d.ts +9 -0
  375. package/dist/react/ds-checkbox-group.js +12 -0
  376. package/dist/react/ds-inline-banner-settings.d.ts +9 -0
  377. package/dist/react/ds-inline-banner-settings.js +12 -0
  378. package/dist/react/ds-input.d.ts +2 -0
  379. package/dist/react/ds-input.js +2 -0
  380. package/dist/react/ds-radio-tile.d.ts +12 -0
  381. package/dist/react/ds-radio-tile.js +12 -0
  382. package/dist/react/ds-setting-row-checkbox.d.ts +9 -0
  383. package/dist/react/ds-setting-row-checkbox.js +12 -0
  384. package/dist/react/ds-setting-row-radio.d.ts +9 -0
  385. package/dist/react/ds-setting-row-radio.js +12 -0
  386. package/dist/react/ds-setting-row-toggle.d.ts +12 -0
  387. package/dist/react/ds-setting-row-toggle.js +12 -0
  388. package/dist/types/components/BarPageTitle/BarPageTitle.d.ts +2 -0
  389. package/dist/types/components/BarTitle/bar-title-action-chrome.d.ts +4 -0
  390. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +5 -2
  391. package/dist/types/components/CardSetting/CardSetting.d.ts +15 -3
  392. package/dist/types/components/CardSetting/index.d.ts +1 -1
  393. package/dist/types/components/Checkbox/Checkbox.d.ts +2 -0
  394. package/dist/types/components/CheckboxGroup/CheckboxGroup.d.ts +20 -0
  395. package/dist/types/components/EmptyState/EmptyState.d.ts +3 -0
  396. package/dist/types/components/Field/Field.d.ts +4 -0
  397. package/dist/types/components/InlineBannerSettings/InlineBannerSettings.d.ts +6 -0
  398. package/dist/types/components/Input/Input.d.ts +50 -1
  399. package/dist/types/components/InputTime/InputTime.d.ts +3 -0
  400. package/dist/types/components/MapEntityMarker/MapEntityMarker.d.ts +5 -5
  401. package/dist/types/components/Radio/Radio.d.ts +8 -0
  402. package/dist/types/components/RadioTile/RadioTile.d.ts +40 -0
  403. package/dist/types/components/RadioTile/index.d.ts +2 -0
  404. package/dist/types/components/SettingRowCheckbox/SettingRowCheckbox.d.ts +19 -0
  405. package/dist/types/components/SettingRowRadio/SettingRowRadio.d.ts +19 -0
  406. package/dist/types/components/SettingRowToggle/SettingRowToggle.d.ts +21 -0
  407. package/dist/types/components/Slider/Slider.d.ts +8 -1
  408. package/dist/types/components/Slider/index.d.ts +1 -1
  409. package/dist/types/components/Switch/Switch.d.ts +7 -0
  410. package/dist/types/components/Textarea/Textarea.d.ts +12 -0
  411. package/dist/types/components/TimePicker/TimePicker.d.ts +4 -0
  412. package/dist/types/components.d.ts +728 -37
  413. package/dist/types/utils/text-constraints.d.ts +20 -0
  414. package/dist/vue/components.d.ts +6 -0
  415. package/dist/vue/components.js +6 -0
  416. package/dist/vue/ds-card-setting.js +1 -0
  417. package/dist/vue/ds-checkbox-group.d.ts +3 -0
  418. package/dist/vue/ds-checkbox-group.js +12 -0
  419. package/dist/vue/ds-checkbox.js +1 -0
  420. package/dist/vue/ds-inline-banner-settings.d.ts +3 -0
  421. package/dist/vue/ds-inline-banner-settings.js +8 -0
  422. package/dist/vue/ds-input-time.js +1 -0
  423. package/dist/vue/ds-input.js +17 -0
  424. package/dist/vue/ds-map-entity-marker.js +2 -2
  425. package/dist/vue/ds-radio-tile.d.ts +3 -0
  426. package/dist/vue/ds-radio-tile.js +24 -0
  427. package/dist/vue/ds-radio.js +2 -0
  428. package/dist/vue/ds-setting-row-checkbox.d.ts +3 -0
  429. package/dist/vue/ds-setting-row-checkbox.js +11 -0
  430. package/dist/vue/ds-setting-row-radio.d.ts +3 -0
  431. package/dist/vue/ds-setting-row-radio.js +11 -0
  432. package/dist/vue/ds-setting-row-toggle.d.ts +3 -0
  433. package/dist/vue/ds-setting-row-toggle.js +15 -0
  434. package/dist/vue/ds-slider.d.ts +1 -1
  435. package/dist/vue/ds-slider.js +2 -1
  436. package/dist/vue/ds-textarea.js +4 -0
  437. package/dist/vue/ds-time-picker.js +1 -0
  438. package/package.json +5 -5
  439. package/dist/components/p-BCnzbfma.js +0 -2
  440. package/dist/components/p-BCnzbfma.js.map +0 -1
  441. package/dist/components/p-BJJh-Bf7.js +0 -2
  442. package/dist/components/p-BLuqpHvp.js +0 -2
  443. package/dist/components/p-BR5OC2PX.js +0 -2
  444. package/dist/components/p-BX506yEW.js +0 -2
  445. package/dist/components/p-BX506yEW.js.map +0 -1
  446. package/dist/components/p-BZ_e69zx.js +0 -2
  447. package/dist/components/p-BfF4RZdp.js +0 -2
  448. package/dist/components/p-Br5e83Fr.js +0 -2
  449. package/dist/components/p-Br5e83Fr.js.map +0 -1
  450. package/dist/components/p-Bv9rSkp0.js +0 -2
  451. package/dist/components/p-Bv9rSkp0.js.map +0 -1
  452. package/dist/components/p-BzYW1IqO.js +0 -2
  453. package/dist/components/p-C0JkLR83.js +0 -2
  454. package/dist/components/p-C6Aavz9h.js +0 -2
  455. package/dist/components/p-C6Aavz9h.js.map +0 -1
  456. package/dist/components/p-C6zycbhC.js +0 -2
  457. package/dist/components/p-C6zycbhC.js.map +0 -1
  458. package/dist/components/p-CNZ6-kWd.js +0 -2
  459. package/dist/components/p-CRk0TjQv.js +0 -2
  460. package/dist/components/p-CTGgXIXM.js +0 -2
  461. package/dist/components/p-CZ7hxDy_.js +0 -2
  462. package/dist/components/p-Cc3ZUQlJ.js +0 -2
  463. package/dist/components/p-Cc3ZUQlJ.js.map +0 -1
  464. package/dist/components/p-D5HxZrMA.js +0 -2
  465. package/dist/components/p-D5HxZrMA.js.map +0 -1
  466. package/dist/components/p-D7K1ZHML.js +0 -2
  467. package/dist/components/p-D7K1ZHML.js.map +0 -1
  468. package/dist/components/p-Dlp1HqgS.js +0 -2
  469. package/dist/components/p-DsLXlxt3.js.map +0 -1
  470. package/dist/components/p-YrnU2fM7.js +0 -2
  471. package/dist/components/p-ZYWnJaye.js +0 -2
  472. package/dist/components/p-ZYWnJaye.js.map +0 -1
  473. package/dist/components/p-etg-Uk1u.js +0 -2
  474. package/dist/components/p-lamoJZE4.js +0 -2
  475. package/dist/components/p-mV4vSjSK.js +0 -2
  476. package/dist/components/p-mV4vSjSK.js.map +0 -1
  477. package/dist/components/p-mux14tWZ.js.map +0 -1
  478. package/dist/components/p-mxZoWfnS.js +0 -2
  479. package/dist/components/p-mxZoWfnS.js.map +0 -1
  480. package/dist/components/p-p0FVyEFa.js.map +0 -1
  481. package/dist/components/p-xtGGIZmU.js +0 -2
  482. package/dist/components/p-xtGGIZmU.js.map +0 -1
  483. /package/dist/components/{p-7V1AhetH.js.map → p-B0BQCVkq.js.map} +0 -0
  484. /package/dist/components/{p-Cu8o2rOz.js.map → p-B39iJO8F.js.map} +0 -0
  485. /package/dist/components/{p-B6qQaYkB.js.map → p-B9y6azEw.js.map} +0 -0
  486. /package/dist/components/{p-5SVmAjXY.js.map → p-BERXvOCf.js.map} +0 -0
  487. /package/dist/components/{p-xhn1cZgU.js.map → p-BFHpU-uU.js.map} +0 -0
  488. /package/dist/components/{p-CuWPWC3t.js.map → p-BQspV5U7.js.map} +0 -0
  489. /package/dist/components/{p-BOhefRMt.js.map → p-Bk3poU91.js.map} +0 -0
  490. /package/dist/components/{p-QWukusRL.js.map → p-BnuNaXR2.js.map} +0 -0
  491. /package/dist/components/{p-BtnTQp4K.js.map → p-C8V4lkVy.js.map} +0 -0
  492. /package/dist/components/{p-CGidq1iC.js.map → p-CuwopElg.js.map} +0 -0
  493. /package/dist/components/{p-Cn6AfzeF.js.map → p-CwdRaJER.js.map} +0 -0
  494. /package/dist/components/{p-ZwRLjD5M.js.map → p-D8OWhnID.js.map} +0 -0
  495. /package/dist/components/{p-C_Ma6Xa-.js.map → p-DIQiHX0q.js.map} +0 -0
  496. /package/dist/components/{p-B3CZvMXs.js.map → p-DJDbskZf.js.map} +0 -0
  497. /package/dist/components/{p-C1gaWjOm.js.map → p-DSZPO06T.js.map} +0 -0
  498. /package/dist/components/{p-uADksYMl.js.map → p-DSmDyI2o.js.map} +0 -0
  499. /package/dist/components/{p-UY63jmrO.js.map → p-DVEx-Xg9.js.map} +0 -0
  500. /package/dist/components/{p-vfCu7XSc.js.map → p-DZ58Sg5a.js.map} +0 -0
  501. /package/dist/components/{p-DFO5lV_A.js.map → p-DmSnHVW6.js.map} +0 -0
  502. /package/dist/components/{p-ER5M085B.js.map → p-UJMEz8_O.js.map} +0 -0
  503. /package/dist/components/{p-CR-Jjdcn.js.map → p-_IqSPt5V.js.map} +0 -0
  504. /package/dist/components/{p-BLSSaVWm.js.map → p-pp1IQN4Z.js.map} +0 -0
@@ -162,8 +162,8 @@
162
162
  },
163
163
  "peerDependencies": {
164
164
  "required": [
165
- "@ds-mo/tokens ^6.5.1",
166
- "@ds-mo/icons ^8.1.0"
165
+ "@ds-mo/tokens ^6.6.1",
166
+ "@ds-mo/icons ^8.1.1"
167
167
  ],
168
168
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
169
169
  }
@@ -281,8 +281,8 @@
281
281
  },
282
282
  "peerDependencies": {
283
283
  "required": [
284
- "@ds-mo/tokens ^6.5.1",
285
- "@ds-mo/icons ^8.1.0"
284
+ "@ds-mo/tokens ^6.6.1",
285
+ "@ds-mo/icons ^8.1.1"
286
286
  ],
287
287
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
288
288
  }
@@ -128,8 +128,8 @@
128
128
  },
129
129
  "peerDependencies": {
130
130
  "required": [
131
- "@ds-mo/tokens ^6.5.1",
132
- "@ds-mo/icons ^8.1.0"
131
+ "@ds-mo/tokens ^6.6.1",
132
+ "@ds-mo/icons ^8.1.1"
133
133
  ],
134
134
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
135
135
  }
@@ -90,8 +90,8 @@
90
90
  },
91
91
  "peerDependencies": {
92
92
  "required": [
93
- "@ds-mo/tokens ^6.5.1",
94
- "@ds-mo/icons ^8.1.0"
93
+ "@ds-mo/tokens ^6.6.1",
94
+ "@ds-mo/icons ^8.1.1"
95
95
  ],
96
96
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
97
97
  }
@@ -369,8 +369,8 @@
369
369
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: fieldOrder, fields, hiddenFieldIds, options.",
370
370
  "peerDependencies": {
371
371
  "required": [
372
- "@ds-mo/tokens ^6.5.1",
373
- "@ds-mo/icons ^8.1.0"
372
+ "@ds-mo/tokens ^6.6.1",
373
+ "@ds-mo/icons ^8.1.1"
374
374
  ],
375
375
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
376
376
  }
@@ -392,7 +392,7 @@
392
392
  },
393
393
  {
394
394
  "path": "src/wc/components/DataCustomize/DataCustomize.tsx",
395
- "content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n} from '@stencil/core';\nimport type { DataField } from '../../utils/data-field';\nimport type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport {\n listCustomizerMenuItems,\n resolveListOrder,\n toggleListHidden,\n type ListCustomizerOptions,\n} from '../../utils/list-customizer';\n\nexport interface DataCustomizeChangeDetail {\n /** Fields the viewer has hidden, in the order they were hidden. */\n hiddenFieldIds: string[];\n /** Field ids in display order. Unchanged unless the catalog reorders. */\n fieldOrder: string[];\n}\n\nlet dataCustomizeSeq = 0;\n\n/**\n * Show, hide and optionally reorder the data points a view renders.\n *\n * The table owns its own column customizer inside the caption, because a table\n * locks its last visible column and reorders columns. This control is the same\n * catalog for every other surface — a card list, a map overlay — where the\n * fields are independent and usually only show and hide.\n */\n@Component({\n tag: 'ds-data-customize',\n styleUrl: 'DataCustomize.css',\n scoped: true,\n})\nexport class DataCustomize {\n @Element() private el!: HTMLElement;\n\n /** Show the trigger border. */\n @Prop() hasBorder: boolean = true;\n /** Catalog of data points the view can render. */\n @Prop() fields: DataField[] = [];\n /** Controlled hidden field ids. */\n @Prop() hiddenFieldIds: string[] = [];\n /** Controlled display order. Ids missing from it keep catalog order. */\n @Prop() fieldOrder: string[] = [];\n /**\n * Drag-reorder the catalog rows. Off by default: most surfaces only show and\n * hide, and a card layout has no column order to express.\n */\n @Prop() reorderable: boolean = false;\n /**\n * Fields that must stay visible. Zero by default, so a view whose identity\n * lives outside this catalog can hide every entry in it.\n */\n @Prop() minVisible: number = 0;\n /** Section header above the catalog rows. Omitted when there is no second section. */\n @Prop() catalogHeader?: string;\n /** Extra switch rows rendered in their own Options section. */\n @Prop() options: MenuItemData[] = [];\n /** Header for the options section. */\n @Prop() optionsHeader: string = 'Options';\n /** Accessible name for the trigger and menu. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Visible trigger label. Collapses to the icon when space is tight. */\n @Prop() label: string = 'Customize';\n\n @Event({ bubbles: false }) dsFieldsConfigChange!: EventEmitter<DataCustomizeChangeDetail>;\n @Event({ bubbles: false }) dsOptionChange!: EventEmitter<string>;\n\n @State() private menuOpen = false;\n @State() private menuSurfaceOpen = false;\n @State() private initialFocusVisible = false;\n\n private readonly componentId = `ds-data-customize-${++dataCustomizeSeq}`;\n private readonly triggerId = `${this.componentId}-trigger`;\n private readonly menuId = `${this.componentId}-menu`;\n\n @Method()\n async setFocus() {\n const trigger = this.el.querySelector<HTMLElement & { setFocus?: () => Promise<void> }>(\n `#${CSS.escape(this.triggerId)}`\n );\n await trigger?.setFocus?.();\n }\n\n private get customizerOptions(): ListCustomizerOptions {\n return { minVisible: this.minVisible, reorderable: this.reorderable };\n }\n\n private get catalog(): { id: string; label: string }[] {\n return this.fields.map(field => ({\n id: field.id,\n label: field.label.trim() || field.accessibleLabel?.trim() || field.id,\n }));\n }\n\n private get sections(): MenuSection[] {\n const rows = listCustomizerMenuItems(\n this.catalog,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.customizerOptions\n );\n\n return [\n ...(rows.length\n ? [\n {\n header: this.catalogHeader ?? (this.options.length ? 'Data' : undefined),\n items: rows,\n },\n ]\n : []),\n ...(this.options.length ? [{ header: this.optionsHeader, items: this.options }] : []),\n ];\n }\n\n render() {\n const name = this.ariaLabel?.trim() || this.label?.trim() || 'Customize';\n const empty = this.fields.length === 0 && this.options.length === 0;\n\n return (\n <Host hidden={empty ? true : undefined}>\n {empty ? null : (\n <ds-button-unfilled\n hasBorder={this.hasBorder}\n id={this.triggerId}\n variant=\"icon-label\"\n size=\"md\"\n icon=\"ViewMenu\"\n label={this.label}\n labelEmphasis={false}\n pressScale={false}\n aria-label={name}\n haspopup=\"menu\"\n collapseLabel={true}\n expanded={this.menuOpen}\n surfaceOpen={this.menuSurfaceOpen}\n controls={this.menuId}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n this.toggle(event.detail.detail === 0);\n }}\n />\n )}\n {empty ? null : (\n <ds-menu\n id={this.menuId}\n open={this.menuOpen}\n anchorId={this.triggerId}\n align=\"start\"\n side=\"bottom\"\n menuLabel={name}\n selectionMode=\"none\"\n initialFocusVisible={this.initialFocusVisible}\n sections={this.sections}\n onDsClose={() => this.close()}\n onDsAfterClose={() => {\n if (!this.menuOpen) this.menuSurfaceOpen = false;\n }}\n onDsSelect={event => this.handleSelect(event.detail)}\n onDsReorder={event => this.handleReorder(event.detail.items)}\n />\n )}\n </Host>\n );\n }\n\n private toggle(fromKeyboard = false): void {\n if (this.menuOpen) this.close();\n else this.open(fromKeyboard);\n }\n\n private open(fromKeyboard = false): void {\n if (this.menuOpen) return;\n this.initialFocusVisible = fromKeyboard;\n this.menuOpen = true;\n this.menuSurfaceOpen = true;\n }\n\n private close(): void {\n this.menuOpen = false;\n }\n\n private handleSelect(item: MenuItemData): void {\n const value = item.value;\n if (!value || item.isInactive) return;\n\n if (this.options.some(option => option.value === value)) {\n this.dsOptionChange.emit(value);\n return;\n }\n\n const ids = this.catalog.map(entry => entry.id);\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: toggleListHidden(ids, this.hiddenFieldIds, value, this.customizerOptions),\n fieldOrder: resolveListOrder(ids, this.fieldOrder),\n });\n }\n\n private handleReorder(items: MenuItemData[]): void {\n if (!this.reorderable) return;\n\n // Menu reports the new order of the reorderable run. resolveListOrder\n // rebuilds the full order from it, appending anything the run omitted.\n const next = items\n .filter(item => item.reorderable && item.value)\n .map(item => item.value as string);\n if (next.length === 0) return;\n\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: resolveListOrder(\n this.catalog.map(entry => entry.id),\n next\n ),\n });\n }\n}\n",
395
+ "content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n} from '@stencil/core';\nimport type { DataField } from '../../utils/data-field';\nimport type { MenuItemData, MenuSection } from '../Menu/menu-types';\nimport {\n listCustomizerMenuItems,\n resolveListOrder,\n toggleListHidden,\n type ListCustomizerOptions,\n} from '../../utils/list-customizer';\n\nexport interface DataCustomizeChangeDetail {\n /** Fields the viewer has hidden, in the order they were hidden. */\n hiddenFieldIds: string[];\n /** Field ids in display order. Unchanged unless the catalog reorders. */\n fieldOrder: string[];\n}\n\nlet dataCustomizeSeq = 0;\n\n/**\n * Show, hide and optionally reorder the data points a view renders.\n *\n * The table owns its own column customizer inside the caption, because a table\n * locks its last visible column and reorders columns. This control is the same\n * catalog for every other surface — a card list, a map overlay — where the\n * fields are independent and usually only show and hide.\n */\n@Component({\n tag: 'ds-data-customize',\n styleUrl: 'DataCustomize.css',\n scoped: true,\n})\nexport class DataCustomize {\n @Element() private el!: HTMLElement;\n\n /** Show the trigger border. */\n @Prop() hasBorder: boolean = true;\n /** Catalog of data points the view can render. */\n @Prop() fields: DataField[] = [];\n /** Controlled hidden field ids. */\n @Prop() hiddenFieldIds: string[] = [];\n /** Controlled display order. Ids missing from it keep catalog order. */\n @Prop() fieldOrder: string[] = [];\n /**\n * Drag-reorder the catalog rows. Off by default: most surfaces only show and\n * hide, and a card layout has no column order to express.\n */\n @Prop() reorderable: boolean = false;\n /**\n * Fields that must stay visible. Zero by default, so a view whose identity\n * lives outside this catalog can hide every entry in it.\n */\n @Prop() minVisible: number = 0;\n /** Section header above the catalog rows. Omitted when there is no second section. */\n @Prop() catalogHeader?: string;\n /** Extra switch rows rendered in their own Options section. */\n @Prop() options: MenuItemData[] = [];\n /** Header for the options section. */\n @Prop() optionsHeader: string = 'Options';\n /** Accessible name for the trigger and menu. */\n @Prop({ attribute: 'aria-label' }) ariaLabel: string | null = null;\n /** Visible trigger label. Collapses to the icon when space is tight. */\n @Prop() label: string = 'Customize';\n\n @Event({ bubbles: false }) dsFieldsConfigChange!: EventEmitter<DataCustomizeChangeDetail>;\n @Event({ bubbles: false }) dsOptionChange!: EventEmitter<string>;\n\n @State() private menuOpen = false;\n @State() private menuSurfaceOpen = false;\n @State() private initialFocusVisible = false;\n\n private readonly componentId = `ds-data-customize-${++dataCustomizeSeq}`;\n private readonly triggerId = `${this.componentId}-trigger`;\n private readonly menuId = `${this.componentId}-menu`;\n\n @Method()\n async setFocus() {\n const trigger = this.el.querySelector<HTMLElement & { setFocus?: () => Promise<void> }>(\n `#${CSS.escape(this.triggerId)}`\n );\n await trigger?.setFocus?.();\n }\n\n private get customizerOptions(): ListCustomizerOptions {\n return { minVisible: this.minVisible, reorderable: this.reorderable };\n }\n\n private get catalog(): { id: string; label: string }[] {\n return this.fields.map(field => ({\n id: field.id,\n label: field.label.trim() || field.accessibleLabel?.trim() || field.id,\n }));\n }\n\n private get sections(): MenuSection[] {\n const rows = listCustomizerMenuItems(\n this.catalog,\n this.hiddenFieldIds,\n this.fieldOrder,\n this.customizerOptions\n );\n\n return [\n ...(rows.length\n ? [\n {\n header: this.catalogHeader ?? (this.options.length ? 'Data' : undefined),\n items: rows,\n },\n ]\n : []),\n ...(this.options.length ? [{ header: this.optionsHeader, items: this.options }] : []),\n ];\n }\n\n render() {\n const name = this.ariaLabel?.trim() || this.label?.trim() || 'Customize';\n const empty = this.fields.length === 0 && this.options.length === 0;\n\n return (\n <Host hidden={empty ? true : undefined}>\n {empty ? null : (\n <ds-button-unfilled\n hasBorder={this.hasBorder}\n id={this.triggerId}\n variant=\"icon-label\"\n size=\"md\"\n icon=\"Preferences\"\n label={this.label}\n labelEmphasis={false}\n pressScale={false}\n aria-label={name}\n haspopup=\"menu\"\n collapseLabel={true}\n expanded={this.menuOpen}\n surfaceOpen={this.menuSurfaceOpen}\n controls={this.menuId}\n onDsClick={(event: CustomEvent<MouseEvent>) => {\n this.toggle(event.detail.detail === 0);\n }}\n />\n )}\n {empty ? null : (\n <ds-menu\n id={this.menuId}\n open={this.menuOpen}\n anchorId={this.triggerId}\n align=\"start\"\n side=\"bottom\"\n menuLabel={name}\n selectionMode=\"none\"\n initialFocusVisible={this.initialFocusVisible}\n sections={this.sections}\n onDsClose={() => this.close()}\n onDsAfterClose={() => {\n if (!this.menuOpen) this.menuSurfaceOpen = false;\n }}\n onDsSelect={event => this.handleSelect(event.detail)}\n onDsReorder={event => this.handleReorder(event.detail.items)}\n />\n )}\n </Host>\n );\n }\n\n private toggle(fromKeyboard = false): void {\n if (this.menuOpen) this.close();\n else this.open(fromKeyboard);\n }\n\n private open(fromKeyboard = false): void {\n if (this.menuOpen) return;\n this.initialFocusVisible = fromKeyboard;\n this.menuOpen = true;\n this.menuSurfaceOpen = true;\n }\n\n private close(): void {\n this.menuOpen = false;\n }\n\n private handleSelect(item: MenuItemData): void {\n const value = item.value;\n if (!value || item.isInactive) return;\n\n if (this.options.some(option => option.value === value)) {\n this.dsOptionChange.emit(value);\n return;\n }\n\n const ids = this.catalog.map(entry => entry.id);\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: toggleListHidden(ids, this.hiddenFieldIds, value, this.customizerOptions),\n fieldOrder: resolveListOrder(ids, this.fieldOrder),\n });\n }\n\n private handleReorder(items: MenuItemData[]): void {\n if (!this.reorderable) return;\n\n // Menu reports the new order of the reorderable run. resolveListOrder\n // rebuilds the full order from it, appending anything the run omitted.\n const next = items\n .filter(item => item.reorderable && item.value)\n .map(item => item.value as string);\n if (next.length === 0) return;\n\n this.dsFieldsConfigChange.emit({\n hiddenFieldIds: this.hiddenFieldIds,\n fieldOrder: resolveListOrder(\n this.catalog.map(entry => entry.id),\n next\n ),\n });\n }\n}\n",
396
396
  "type": "registry:ui"
397
397
  }
398
398
  ]
@@ -487,8 +487,8 @@
487
487
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: filters, matchModes, values.",
488
488
  "peerDependencies": {
489
489
  "required": [
490
- "@ds-mo/tokens ^6.5.1",
491
- "@ds-mo/icons ^8.1.0"
490
+ "@ds-mo/tokens ^6.6.1",
491
+ "@ds-mo/icons ^8.1.1"
492
492
  ],
493
493
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
494
494
  }
@@ -351,8 +351,8 @@
351
351
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: grouping, options.",
352
352
  "peerDependencies": {
353
353
  "required": [
354
- "@ds-mo/tokens ^6.5.1",
355
- "@ds-mo/icons ^8.1.0"
354
+ "@ds-mo/tokens ^6.6.1",
355
+ "@ds-mo/icons ^8.1.1"
356
356
  ],
357
357
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
358
358
  }
@@ -557,8 +557,8 @@
557
557
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: customizeOptions, customizeSections, fieldOrder, fields, filters, grouping, groupingOptions, hiddenFieldIds, matchModes, sort, sortColumns, values.",
558
558
  "peerDependencies": {
559
559
  "required": [
560
- "@ds-mo/tokens ^6.5.1",
561
- "@ds-mo/icons ^8.1.0"
560
+ "@ds-mo/tokens ^6.6.1",
561
+ "@ds-mo/icons ^8.1.1"
562
562
  ],
563
563
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
564
564
  }
@@ -418,8 +418,8 @@
418
418
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: views.",
419
419
  "peerDependencies": {
420
420
  "required": [
421
- "@ds-mo/tokens ^6.5.1",
422
- "@ds-mo/icons ^8.1.0"
421
+ "@ds-mo/tokens ^6.6.1",
422
+ "@ds-mo/icons ^8.1.1"
423
423
  ],
424
424
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
425
425
  }
@@ -348,8 +348,8 @@
348
348
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: fields, selectedFieldIds.",
349
349
  "peerDependencies": {
350
350
  "required": [
351
- "@ds-mo/tokens ^6.5.1",
352
- "@ds-mo/icons ^8.1.0"
351
+ "@ds-mo/tokens ^6.6.1",
352
+ "@ds-mo/icons ^8.1.1"
353
353
  ],
354
354
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
355
355
  }
@@ -244,8 +244,8 @@
244
244
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: fields, sort.",
245
245
  "peerDependencies": {
246
246
  "required": [
247
- "@ds-mo/tokens ^6.5.1",
248
- "@ds-mo/icons ^8.1.0"
247
+ "@ds-mo/tokens ^6.6.1",
248
+ "@ds-mo/icons ^8.1.1"
249
249
  ],
250
250
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
251
251
  }
@@ -165,8 +165,8 @@
165
165
  },
166
166
  "peerDependencies": {
167
167
  "required": [
168
- "@ds-mo/tokens ^6.5.1",
169
- "@ds-mo/icons ^8.1.0"
168
+ "@ds-mo/tokens ^6.6.1",
169
+ "@ds-mo/icons ^8.1.1"
170
170
  ],
171
171
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
172
172
  }
@@ -208,8 +208,8 @@
208
208
  },
209
209
  "peerDependencies": {
210
210
  "required": [
211
- "@ds-mo/tokens ^6.5.1",
212
- "@ds-mo/icons ^8.1.0"
211
+ "@ds-mo/tokens ^6.6.1",
212
+ "@ds-mo/icons ^8.1.1"
213
213
  ],
214
214
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
215
215
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "empty-state",
4
4
  "title": "EmptyState",
5
- "description": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
5
+ "description": "Centered empty-content message with optional consumer-owned recovery actions.",
6
6
  "type": "registry:ui",
7
7
  "meta": {
8
8
  "library": "@ds-mo/ui",
@@ -13,16 +13,16 @@
13
13
  "intent": {
14
14
  "audience": "general",
15
15
  "status": "stable",
16
- "summary": "Centered empty-content message composed as icon plus title plus body, title plus body, or compact body-only content.",
16
+ "summary": "Centered empty-content message with optional consumer-owned recovery actions.",
17
17
  "useWhen": [
18
18
  "A bounded content area is in a first-use, no-content, filtered no-results, or no-access state and needs a calm explanatory message tailored to that cause.",
19
19
  "A prominent empty region benefits from a decorative icon, visual title, and supporting body copy.",
20
- "A compact owner such as a Select popup needs only centered body copy."
20
+ "A compact owner such as a Select popup needs only centered body copy.",
21
+ "An empty region needs a concise recovery action that helps the user reveal or create content."
21
22
  ],
22
23
  "avoidWhen": [
23
24
  "Content is still loading; use Skeleton for predictable structure or Loader for an indeterminate operation.",
24
25
  "The state is an error, warning, or confirmation that needs semantic intent and announcement from the owning workflow.",
25
- "The state needs a recovery action, link, or other interactive content; the current EmptyState pattern is intentionally message-only.",
26
26
  "A decorative illustration, arbitrary rich content, or custom layout is required."
27
27
  ],
28
28
  "alternatives": [
@@ -46,20 +46,23 @@
46
46
  "component:ds-table",
47
47
  "component:ds-select",
48
48
  "component:ds-text",
49
- "component:ds-icon"
49
+ "component:ds-icon",
50
+ "component:ds-button-unfilled"
50
51
  ],
51
52
  "accessibility": [
52
53
  "The optional icon is decorative; the title and body provide all meaning in text.",
53
54
  "EmptyState does not create a live region or alert automatically. The owner decides whether a dynamic transition requires announcement.",
54
55
  "The visual title does not impose a document heading level because the correct hierarchy belongs to the consuming page or region.",
55
- "Keep localized body copy concise and sufficient when using the body-only variant."
56
+ "Keep localized body copy concise and sufficient when using the body-only variant.",
57
+ "Give recovery controls explicit accessible names and keep their behavior with the owning workflow."
56
58
  ],
57
59
  "states": [
58
60
  "Supported compositions are icon plus title plus body, title plus body, and body only; body copy is present in every supported composition.",
59
61
  "The decorative icon renders at xl in the primary foreground with an 8px gap before the text group and only when a title is also provided.",
60
62
  "The visual title uses title-small primary text; body uses body-medium secondary text with a 4px title-to-body gap.",
61
- "All content is centered. The owner supplies container size and surrounding padding; repeated panel and master-detail owners should share one empty-region geometry instead of wrapping each EmptyState differently. Do not compose actions into or immediately alongside the current EmptyState pattern.",
62
- "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants."
63
+ "All content is centered. The owner supplies container size and surrounding padding; repeated panel and master-detail owners should share one empty-region geometry instead of wrapping each EmptyState differently.",
64
+ "First-use, no-content, no-results, and no-access states reuse this primitive with cause-specific localized messages rather than visual variants.",
65
+ "Recovery actions are optional. The consumer owns the action labels, control choice, and behavior; the component centers them below the message and wraps multiple actions when needed."
63
66
  ],
64
67
  "responsiveBehavior": [
65
68
  "The owner controls available width and height; text wraps naturally while remaining centered.",
@@ -122,7 +125,12 @@
122
125
  },
123
126
  "events": [],
124
127
  "methods": [],
125
- "slots": []
128
+ "slots": [
129
+ {
130
+ "name": "actions",
131
+ "description": "Optional recovery buttons or links. The consumer owns their labels and behavior."
132
+ }
133
+ ]
126
134
  },
127
135
  "props": {
128
136
  "body": {
@@ -153,7 +161,12 @@
153
161
  },
154
162
  "events": [],
155
163
  "methods": [],
156
- "slots": [],
164
+ "slots": [
165
+ {
166
+ "name": "actions",
167
+ "description": "Optional recovery buttons or links. The consumer owns their labels and behavior."
168
+ }
169
+ ],
157
170
  "exports": {
158
171
  "customElement": "ds-empty-state",
159
172
  "react": "DsEmptyState",
@@ -181,8 +194,8 @@
181
194
  },
182
195
  "peerDependencies": {
183
196
  "required": [
184
- "@ds-mo/tokens ^6.5.1",
185
- "@ds-mo/icons ^8.1.0"
197
+ "@ds-mo/tokens ^6.6.1",
198
+ "@ds-mo/icons ^8.1.1"
186
199
  ],
187
200
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
188
201
  }
@@ -200,12 +213,12 @@
200
213
  "files": [
201
214
  {
202
215
  "path": "src/wc/components/EmptyState/EmptyState.css",
203
- "content": ":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n:host,\n.empty-state,\n.empty-state__text {\n box-sizing: border-box;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--dimension-space-100);\n height: 100%;\n width: 100%;\n text-align: center;\n}\n\n.empty-state__icon {\n flex: 0 0 auto;\n}\n\n.empty-state__text {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--dimension-space-050);\n width: 100%;\n}\n",
216
+ "content": ":host {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n:host,\n.empty-state,\n.empty-state__text {\n box-sizing: border-box;\n}\n\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n text-align: center;\n}\n\n.empty-state__icon {\n margin-block-end: var(--dimension-space-100);\n flex: 0 0 auto;\n}\n\n.empty-state__text {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--dimension-space-050);\n width: 100%;\n}\n\n.empty-state__actions {\n margin-block-start: var(--dimension-space-200);\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n gap: var(--dimension-space-100);\n}\n\n.empty-state__actions:not(:has([slot='actions'])) {\n display: none;\n}\n\n.empty-state__title,\n.empty-state__body {\n text-wrap: balance;\n}\n",
204
217
  "type": "registry:ui"
205
218
  },
206
219
  {
207
220
  "path": "src/wc/components/EmptyState/EmptyState.tsx",
208
- "content": "import { Component, Prop, h, Host } from '@stencil/core';\n\n@Component({\n tag: 'ds-empty-state',\n styleUrl: 'EmptyState.css',\n scoped: true,\n})\nexport class EmptyState {\n /** Optional decorative prefix glyph for the complete icon + title + body variant. */\n @Prop() icon: string | undefined;\n /** Optional visual title. Use with body; required when icon is provided. */\n @Prop() heading: string | undefined;\n /** Explanatory empty-state copy. Every supported variant includes body text. */\n @Prop() body: string = '';\n\n render() {\n const showHeading = Boolean(this.heading?.trim());\n const showIcon = showHeading && Boolean(this.icon);\n\n return (\n <Host>\n <div class=\"empty-state\">\n {showIcon && (\n <ds-icon class=\"empty-state__icon\" name={this.icon} size=\"xl\" color=\"primary\" />\n )}\n <div class=\"empty-state__text\">\n {showHeading && (\n <ds-text\n class=\"empty-state__title\"\n as=\"div\"\n variant=\"text-title-small\"\n color=\"primary\"\n align=\"center\"\n >\n {this.heading}\n </ds-text>\n )}\n {this.body && (\n <ds-text\n class=\"empty-state__body\"\n as=\"p\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n align=\"center\"\n >\n {this.body}\n </ds-text>\n )}\n </div>\n </div>\n </Host>\n );\n }\n}\n",
221
+ "content": "import { Component, Prop, h, Host } from '@stencil/core';\n\n/**\n * @slot actions - Optional recovery buttons or links. The consumer owns their labels and behavior.\n */\n@Component({\n tag: 'ds-empty-state',\n styleUrl: 'EmptyState.css',\n scoped: true,\n})\nexport class EmptyState {\n /** Optional decorative prefix glyph for the complete icon + title + body variant. */\n @Prop() icon: string | undefined;\n /** Optional visual title. Use with body; required when icon is provided. */\n @Prop() heading: string | undefined;\n /** Explanatory empty-state copy. Every supported variant includes body text. */\n @Prop() body: string = '';\n\n render() {\n const showHeading = Boolean(this.heading?.trim());\n const showIcon = showHeading && Boolean(this.icon);\n\n return (\n <Host>\n <div class=\"empty-state\">\n {showIcon && (\n <ds-icon class=\"empty-state__icon\" name={this.icon} size=\"xl\" color=\"primary\" />\n )}\n <div class=\"empty-state__text\">\n {showHeading && (\n <ds-text\n class=\"empty-state__title\"\n as=\"div\"\n variant=\"text-title-small\"\n color=\"primary\"\n align=\"center\"\n >\n {this.heading}\n </ds-text>\n )}\n {this.body && (\n <ds-text\n class=\"empty-state__body\"\n as=\"p\"\n variant=\"text-body-medium\"\n color=\"secondary\"\n align=\"center\"\n >\n {this.body}\n </ds-text>\n )}\n </div>\n <div class=\"empty-state__actions\">\n <slot name=\"actions\" />\n </div>\n </div>\n </Host>\n );\n }\n}\n",
209
222
  "type": "registry:ui"
210
223
  }
211
224
  ]
@@ -54,7 +54,8 @@
54
54
  "Field exposes data-focused, data-filled, data-dirty, data-touched, data-invalid, data-disabled, and data-required hooks while the slotted control remains the source of value and interaction behavior.",
55
55
  "A rendered error replaces the description; preserve essential guidance in the error message so users retain what they need to correct the field.",
56
56
  "Field owns validation presentation but not validation timing; the form decides when to set error and errorMessage.",
57
- "The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text."
57
+ "The label uses primary body-small emphasis, description uses secondary body-small text, and error uses negative body-small text.",
58
+ "Input and Textarea contribute constraint messages and character counts to the supporting row. Helper text yields to an error, with the count at the opposite edge; a count alone begins at the text origin."
58
59
  ],
59
60
  "responsiveBehavior": [
60
61
  "Field fills the width supplied by its parent and makes the slotted control fill that field width.",
@@ -217,8 +218,8 @@
217
218
  },
218
219
  "peerDependencies": {
219
220
  "required": [
220
- "@ds-mo/tokens ^6.5.1",
221
- "@ds-mo/icons ^8.1.0"
221
+ "@ds-mo/tokens ^6.6.1",
222
+ "@ds-mo/icons ^8.1.1"
222
223
  ],
223
224
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
224
225
  }
@@ -234,12 +235,12 @@
234
235
  "files": [
235
236
  {
236
237
  "path": "src/wc/components/Field/Field.css",
237
- "content": "@import '../../utils/control-density.css';\n@import '../../utils/field-stack.css';\n\n:host {\n display: block;\n}\n\n.field__control {\n display: flex;\n min-width: 0;\n}\n\n.field__control > * {\n width: 100%;\n}\n",
238
+ "content": "@import '../../utils/text-field-support.css';\n@import '../../utils/control-density.css';\n@import '../../utils/field-stack.css';\n\n:host {\n display: block;\n}\n\n.field__control {\n display: flex;\n min-width: 0;\n}\n\n.field__control > * {\n width: 100%;\n}\n",
238
239
  "type": "registry:ui"
239
240
  },
240
241
  {
241
242
  "path": "src/wc/components/Field/Field.tsx",
242
- "content": "import { Component, Element, Prop, State, Watch, h, Host } from '@stencil/core';\n\ninterface FieldControl extends HTMLElement {\n value?: string | string[];\n inputId?: string;\n error?: boolean;\n disabled?: boolean;\n isInactive?: boolean;\n required?: boolean;\n hasBorder?: boolean;\n size?: string;\n setFocus?: () => Promise<void> | void;\n}\n\ninterface AuthoredAria {\n labelledby: string[];\n describedby: string[];\n}\n\nlet fieldCounter = 0;\n\nconst tokens = (value: string | null | undefined): string[] =>\n value?.split(/\\s+/).filter(Boolean) ?? [];\n\nconst uniqueTokens = (...groups: string[][]): string[] => [...new Set(groups.flat())];\n\nconst CONTROL_SIZES = ['lg', 'md', 'sm', 'xs'] as const;\ntype FieldControlSize = (typeof CONTROL_SIZES)[number];\n\nconst readControlSize = (control: FieldControl): FieldControlSize =>\n CONTROL_SIZES.includes(control.size as FieldControlSize)\n ? (control.size as FieldControlSize)\n : 'md';\n\n@Component({\n tag: 'ds-field',\n styleUrl: 'Field.css',\n scoped: true,\n})\nexport class Field {\n @Element() el!: HTMLElement;\n\n /** Visible label for the slotted control. Omit when a nearby heading already names the field. */\n @Prop() label?: string;\n /** Explicit ID for the slotted control; generated when omitted. */\n @Prop() fieldId: string | undefined;\n /** Optional guidance associated with the slotted control while no visible error is shown. */\n @Prop() description: string | undefined;\n /** Invalid visual and accessible state forwarded to supported ds controls. */\n @Prop() error: boolean = false;\n /** Visible error associated with the slotted control while error is true. */\n @Prop() errorMessage: string | undefined;\n\n @State() private focused = false;\n @State() private filled = false;\n @State() private dirty = false;\n @State() private touched = false;\n @State() private controlDisabled = false;\n @State() private controlRequired = false;\n @State() private controlBorderless = false;\n @State() private controlSize: 'lg' | 'md' | 'sm' | 'xs' = 'md';\n /** Bumped to let Stencil relocate a control added after the initial render. */\n @State() private slotRevision = 0;\n\n private readonly generatedId = `ds-field-${++fieldCounter}`;\n private controlContainer?: HTMLDivElement;\n private control?: FieldControl;\n private initialValue = '';\n private authoredAria = new WeakMap<FieldControl, AuthoredAria>();\n private childObserver?: MutationObserver;\n private controlAttrObserver?: MutationObserver;\n private didLoad = false;\n\n connectedCallback() {\n if (this.didLoad) this.observeLateControls();\n }\n\n disconnectedCallback() {\n this.childObserver?.disconnect();\n this.childObserver = undefined;\n this.controlAttrObserver?.disconnect();\n this.controlAttrObserver = undefined;\n }\n\n componentDidLoad() {\n this.syncControl();\n this.didLoad = true;\n this.observeLateControls();\n requestAnimationFrame(() => this.syncControl());\n }\n\n componentDidRender() {\n this.syncControl();\n }\n\n @Watch('fieldId')\n @Watch('label')\n @Watch('description')\n @Watch('error')\n @Watch('errorMessage')\n onFieldContractChange() {\n this.syncControl();\n }\n\n private get hasLabel(): boolean {\n return Boolean(this.label?.trim());\n }\n\n private get controlId(): string {\n return this.fieldId || this.generatedId;\n }\n\n private get labelId(): string {\n return `${this.controlId}-label`;\n }\n\n private get descriptionId(): string {\n return `${this.controlId}-description`;\n }\n\n private get errorId(): string {\n return `${this.controlId}-error`;\n }\n\n private get renderedDescription(): boolean {\n return Boolean(this.description) && !this.renderedError;\n }\n\n private get renderedError(): boolean {\n return this.error && Boolean(this.errorMessage);\n }\n\n private readValue(control: FieldControl): string {\n const value = control.value;\n return Array.isArray(value) ? value.join('\\u001f') : String(value ?? '');\n }\n\n private updateControlAttribute(control: FieldControl, name: string, value: string | undefined) {\n if (value === undefined) {\n if (control.hasAttribute(name)) control.removeAttribute(name);\n return;\n }\n if (control.getAttribute(name) !== value) control.setAttribute(name, value);\n }\n\n private findControl(): FieldControl | undefined {\n return this.controlContainer?.querySelector<FieldControl>(':scope > :not(slot)') ?? undefined;\n }\n\n private observeLateControls() {\n if (this.childObserver || typeof MutationObserver === 'undefined') return;\n this.childObserver = new MutationObserver(records => {\n const addedControl = records.some(record =>\n Array.from(record.addedNodes).some(node => node.nodeType === 1)\n );\n if (addedControl) this.slotRevision++;\n });\n this.childObserver.observe(this.el, { childList: true });\n }\n\n private syncControl = () => {\n const control = this.findControl();\n if (!control) return;\n\n if (control !== this.control) {\n this.control = control;\n this.initialValue = this.readValue(control);\n this.authoredAria.set(control, {\n labelledby: tokens(control.getAttribute('aria-labelledby')),\n describedby: tokens(control.getAttribute('aria-describedby')),\n });\n this.observeControlAttributes(control);\n }\n\n const isDsControl = control.tagName.startsWith('DS-');\n if (isDsControl && 'inputId' in control) control.inputId = this.controlId;\n else this.updateControlAttribute(control, 'id', this.controlId);\n\n const authored = this.authoredAria.get(control) ?? { labelledby: [], describedby: [] };\n const labelledby = uniqueTokens(authored.labelledby, this.hasLabel ? [this.labelId] : []).join(\n ' '\n );\n const describedby = uniqueTokens(\n authored.describedby,\n this.renderedDescription ? [this.descriptionId] : [],\n this.renderedError ? [this.errorId] : []\n ).join(' ');\n\n this.updateControlAttribute(control, 'aria-labelledby', labelledby || undefined);\n this.updateControlAttribute(control, 'aria-describedby', describedby || undefined);\n this.updateControlAttribute(control, 'aria-invalid', this.error ? 'true' : undefined);\n\n if (isDsControl && 'error' in control && control.error !== this.error)\n control.error = this.error;\n\n const value = this.readValue(control);\n this.filled = value.length > 0;\n this.dirty = value !== this.initialValue;\n this.controlDisabled = Boolean(\n control.disabled || control.isInactive || control.hasAttribute('disabled')\n );\n this.controlRequired = Boolean(control.required || control.hasAttribute('required'));\n this.controlBorderless = control.hasBorder === false;\n this.controlSize = readControlSize(control);\n };\n\n private observeControlAttributes(control: FieldControl) {\n this.controlAttrObserver?.disconnect();\n this.controlAttrObserver = new MutationObserver(() => this.syncControl());\n this.controlAttrObserver.observe(control, {\n attributes: true,\n attributeFilter: ['has-border', 'size', 'class'],\n });\n }\n\n private handleLabelClick = (event: MouseEvent) => {\n if (!this.control?.tagName.startsWith('DS-')) return;\n event.preventDefault();\n this.control.setFocus?.();\n };\n\n private handleFocusIn = () => {\n this.focused = true;\n };\n\n private handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget instanceof Node && this.el.contains(event.relatedTarget)) return;\n this.focused = false;\n this.touched = true;\n };\n\n private handleValueChange = () => {\n this.syncControl();\n };\n\n render() {\n return (\n <Host\n data-focused={this.focused ? '' : undefined}\n data-filled={this.filled ? '' : undefined}\n data-dirty={this.dirty ? '' : undefined}\n data-touched={this.touched ? '' : undefined}\n data-invalid={this.error ? '' : undefined}\n data-disabled={this.controlDisabled ? '' : undefined}\n data-required={this.controlRequired ? '' : undefined}\n onFocusin={this.handleFocusIn}\n onFocusout={this.handleFocusOut}\n onInput={this.handleValueChange}\n onChange={this.handleValueChange}\n onDsChange={this.handleValueChange}\n >\n <div\n class={{\n field: true,\n 'ds-field-stack': true,\n 'ds-field-stack--supporting-inset': this.controlBorderless,\n [`ds-control--${this.controlSize}`]: true,\n }}\n >\n {this.hasLabel ? (\n <ds-text\n class=\"field__label\"\n as=\"label\"\n variant=\"text-body-small\"\n color=\"primary\"\n emphasis\n for={this.controlId}\n textId={this.labelId}\n onClick={this.handleLabelClick}\n >\n {this.label}\n </ds-text>\n ) : null}\n <div class=\"field__control\" ref={el => (this.controlContainer = el)}>\n <slot onSlotchange={this.syncControl} />\n </div>\n {this.renderedDescription && (\n <ds-text\n class=\"field__description\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"secondary\"\n textId={this.descriptionId}\n >\n {this.description}\n </ds-text>\n )}\n {this.renderedError && (\n <ds-text\n class=\"field__error\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.errorMessage}\n </ds-text>\n )}\n </div>\n </Host>\n );\n }\n}\n",
243
+ "content": "import { Component, Element, Prop, State, Watch, h, Host } from '@stencil/core';\n\ninterface FieldControl extends HTMLElement {\n value?: string | string[];\n tokens?: string[];\n tokenized?: boolean;\n inputId?: string;\n error?: boolean;\n disabled?: boolean;\n isInactive?: boolean;\n required?: boolean;\n hasBorder?: boolean;\n size?: string;\n setFocus?: () => Promise<void> | void;\n}\n\ninterface AuthoredAria {\n labelledby: string[];\n describedby: string[];\n}\n\nlet fieldCounter = 0;\n\nconst tokens = (value: string | null | undefined): string[] =>\n value?.split(/\\s+/).filter(Boolean) ?? [];\n\nconst uniqueTokens = (...groups: string[][]): string[] => [...new Set(groups.flat())];\n\nconst CONTROL_SIZES = ['lg', 'md', 'sm', 'xs'] as const;\ntype FieldControlSize = (typeof CONTROL_SIZES)[number];\n\nconst readControlSize = (control: FieldControl): FieldControlSize =>\n CONTROL_SIZES.includes(control.size as FieldControlSize)\n ? (control.size as FieldControlSize)\n : 'md';\n\n@Component({\n tag: 'ds-field',\n styleUrl: 'Field.css',\n scoped: true,\n})\nexport class Field {\n @Element() el!: HTMLElement;\n\n /** Visible label for the slotted control. Omit when a nearby heading already names the field. */\n @Prop() label?: string;\n /** Explicit ID for the slotted control; generated when omitted. */\n @Prop() fieldId: string | undefined;\n /** Optional guidance associated with the slotted control while no visible error is shown. */\n @Prop() description: string | undefined;\n /** Invalid visual and accessible state forwarded to supported ds controls. */\n @Prop() error: boolean = false;\n /** Visible error associated with the slotted control while error is true. */\n @Prop() errorMessage: string | undefined;\n\n @State() private constraintMessage = '';\n @State() private characterCount: string | undefined;\n @State() private characterLimit: string | undefined;\n @State() private focused = false;\n @State() private filled = false;\n @State() private dirty = false;\n @State() private touched = false;\n @State() private controlDisabled = false;\n @State() private controlRequired = false;\n @State() private controlBorderless = false;\n @State() private controlSize: 'lg' | 'md' | 'sm' | 'xs' = 'md';\n /** Bumped to let Stencil relocate a control added after the initial render. */\n @State() private slotRevision = 0;\n\n private readonly generatedId = `ds-field-${++fieldCounter}`;\n private controlContainer?: HTMLDivElement;\n private control?: FieldControl;\n private initialValue = '';\n private authoredAria = new WeakMap<FieldControl, AuthoredAria>();\n private childObserver?: MutationObserver;\n private controlAttrObserver?: MutationObserver;\n private didLoad = false;\n\n connectedCallback() {\n if (this.didLoad) this.observeLateControls();\n }\n\n disconnectedCallback() {\n this.childObserver?.disconnect();\n this.childObserver = undefined;\n this.controlAttrObserver?.disconnect();\n this.controlAttrObserver = undefined;\n }\n\n componentDidLoad() {\n this.syncControl();\n this.didLoad = true;\n this.observeLateControls();\n requestAnimationFrame(() => this.syncControl());\n }\n\n componentDidRender() {\n this.syncControl();\n }\n\n @Watch('fieldId')\n @Watch('label')\n @Watch('description')\n @Watch('error')\n @Watch('errorMessage')\n onFieldContractChange() {\n this.syncControl();\n }\n\n private get hasLabel(): boolean {\n return Boolean(this.label?.trim());\n }\n\n private get controlId(): string {\n return this.fieldId || this.generatedId;\n }\n\n private get labelId(): string {\n return `${this.controlId}-label`;\n }\n\n private get descriptionId(): string {\n return `${this.controlId}-description`;\n }\n\n private get errorId(): string {\n return `${this.controlId}-error`;\n }\n\n private get renderedDescription(): boolean {\n return Boolean(this.description) && !this.renderedError;\n }\n\n private get renderedError(): boolean {\n return Boolean(this.visibleError);\n }\n\n private get visibleError(): string {\n return this.error && this.errorMessage ? this.errorMessage : this.constraintMessage;\n }\n\n private readValue(control: FieldControl): string {\n if (control.tokenized)\n return [...(control.tokens ?? []), String(control.value ?? '')]\n .filter(Boolean)\n .join('\\u001f');\n const value = control.value;\n return Array.isArray(value) ? value.join('\\u001f') : String(value ?? '');\n }\n\n private updateControlAttribute(control: FieldControl, name: string, value: string | undefined) {\n if (value === undefined) {\n if (control.hasAttribute(name)) control.removeAttribute(name);\n return;\n }\n if (control.getAttribute(name) !== value) control.setAttribute(name, value);\n }\n\n private findControl(): FieldControl | undefined {\n return this.controlContainer?.querySelector<FieldControl>(':scope > :not(slot)') ?? undefined;\n }\n\n private observeLateControls() {\n if (this.childObserver || typeof MutationObserver === 'undefined') return;\n this.childObserver = new MutationObserver(records => {\n const addedControl = records.some(record =>\n Array.from(record.addedNodes).some(node => node.nodeType === 1)\n );\n if (addedControl) this.slotRevision++;\n });\n this.childObserver.observe(this.el, { childList: true });\n }\n\n private syncControl = () => {\n const control = this.findControl();\n if (!control) return;\n\n if (control !== this.control) {\n this.control = control;\n this.initialValue = this.readValue(control);\n this.authoredAria.set(control, {\n labelledby: tokens(control.getAttribute('aria-labelledby')),\n describedby: tokens(control.getAttribute('aria-describedby')),\n });\n this.observeControlAttributes(control);\n }\n\n this.constraintMessage = control.getAttribute('data-constraint-message') ?? '';\n this.characterCount = control.getAttribute('data-character-count') ?? undefined;\n this.characterLimit = control.getAttribute('data-character-limit') ?? undefined;\n\n const isDsControl = control.tagName.startsWith('DS-');\n if (isDsControl && 'inputId' in control) control.inputId = this.controlId;\n else this.updateControlAttribute(control, 'id', this.controlId);\n\n const authored = this.authoredAria.get(control) ?? { labelledby: [], describedby: [] };\n const labelledby = uniqueTokens(authored.labelledby, this.hasLabel ? [this.labelId] : []).join(\n ' '\n );\n const describedby = uniqueTokens(\n authored.describedby,\n this.renderedDescription ? [this.descriptionId] : [],\n this.renderedError ? [this.errorId] : [],\n this.characterCount !== undefined ? [`${this.controlId}-count`] : []\n ).join(' ');\n\n this.updateControlAttribute(control, 'aria-labelledby', labelledby || undefined);\n this.updateControlAttribute(control, 'aria-describedby', describedby || undefined);\n this.updateControlAttribute(control, 'aria-invalid', this.error ? 'true' : undefined);\n\n if (isDsControl && 'error' in control && control.error !== this.error)\n control.error = this.error;\n\n const value = this.readValue(control);\n this.filled = value.length > 0;\n this.dirty = value !== this.initialValue;\n this.controlDisabled = Boolean(\n control.disabled || control.isInactive || control.hasAttribute('disabled')\n );\n this.controlRequired = Boolean(control.required || control.hasAttribute('required'));\n this.controlBorderless = control.hasBorder === false;\n this.controlSize = readControlSize(control);\n };\n\n private observeControlAttributes(control: FieldControl) {\n this.controlAttrObserver?.disconnect();\n this.controlAttrObserver = new MutationObserver(() => this.syncControl());\n this.controlAttrObserver.observe(control, {\n attributes: true,\n attributeFilter: [\n 'has-border',\n 'size',\n 'class',\n 'data-constraint-message',\n 'data-character-count',\n 'data-character-limit',\n ],\n });\n }\n\n private handleLabelClick = (event: MouseEvent) => {\n if (!this.control?.tagName.startsWith('DS-')) return;\n event.preventDefault();\n this.control.setFocus?.();\n };\n\n private handleFocusIn = () => {\n this.focused = true;\n };\n\n private handleFocusOut = (event: FocusEvent) => {\n if (event.relatedTarget instanceof Node && this.el.contains(event.relatedTarget)) return;\n this.focused = false;\n this.touched = true;\n };\n\n private handleValueChange = () => {\n this.syncControl();\n };\n\n render() {\n return (\n <Host\n data-focused={this.focused ? '' : undefined}\n data-filled={this.filled ? '' : undefined}\n data-dirty={this.dirty ? '' : undefined}\n data-touched={this.touched ? '' : undefined}\n data-invalid={this.error || this.constraintMessage ? '' : undefined}\n data-disabled={this.controlDisabled ? '' : undefined}\n data-required={this.controlRequired ? '' : undefined}\n onFocusin={this.handleFocusIn}\n onFocusout={this.handleFocusOut}\n onInput={this.handleValueChange}\n onChange={this.handleValueChange}\n onDsChange={this.handleValueChange}\n onDsTokensChange={this.handleValueChange}\n >\n <div\n class={{\n field: true,\n 'ds-field-stack': true,\n 'ds-field-stack--supporting-inset': this.controlBorderless,\n [`ds-control--${this.controlSize}`]: true,\n }}\n >\n {this.hasLabel ? (\n <ds-text\n class=\"field__label\"\n as=\"label\"\n variant=\"text-body-small\"\n color=\"primary\"\n emphasis\n for={this.controlId}\n textId={this.labelId}\n onClick={this.handleLabelClick}\n >\n {this.label}\n </ds-text>\n ) : null}\n <div class=\"field__control\" ref={el => (this.controlContainer = el)}>\n <slot onSlotchange={this.syncControl} />\n </div>\n {(this.renderedDescription ||\n this.renderedError ||\n this.characterCount !== undefined) && (\n <div class=\"text-field-support\">\n {this.renderedDescription && (\n <ds-text\n class=\"field__description\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"secondary\"\n textId={this.descriptionId}\n >\n {this.description}\n </ds-text>\n )}\n {this.renderedError && (\n <ds-text\n class=\"field__error\"\n as=\"div\"\n variant=\"text-body-small\"\n color=\"negative\"\n textId={this.errorId}\n role=\"alert\"\n >\n {this.visibleError}\n </ds-text>\n )}\n {this.characterCount !== undefined && (\n <ds-text\n class=\"text-field-count\"\n as=\"span\"\n variant=\"text-body-small\"\n color={this.error || this.constraintMessage ? 'negative' : 'secondary'}\n textId={`${this.controlId}-count`}\n >\n {this.characterCount}/{this.characterLimit}\n </ds-text>\n )}\n </div>\n )}\n </div>\n </Host>\n );\n }\n}\n",
243
244
  "type": "registry:ui"
244
245
  }
245
246
  ]
@@ -899,8 +899,8 @@
899
899
  "complexPropertyNote": "Assign these non-primitive values as JavaScript properties: anchor, boundary, filters, matchModes, values.",
900
900
  "peerDependencies": {
901
901
  "required": [
902
- "@ds-mo/tokens ^6.5.1",
903
- "@ds-mo/icons ^8.1.0"
902
+ "@ds-mo/tokens ^6.6.1",
903
+ "@ds-mo/icons ^8.1.1"
904
904
  ],
905
905
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
906
906
  }
@@ -220,8 +220,8 @@
220
220
  },
221
221
  "peerDependencies": {
222
222
  "required": [
223
- "@ds-mo/tokens ^6.5.1",
224
- "@ds-mo/icons ^8.1.0"
223
+ "@ds-mo/tokens ^6.6.1",
224
+ "@ds-mo/icons ^8.1.1"
225
225
  ],
226
226
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
227
227
  }
@@ -0,0 +1,175 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "inline-banner-settings",
4
+ "title": "InlineBannerSettings",
5
+ "description": "Compact non-interactive informational copy row for settings cards.",
6
+ "type": "registry:ui",
7
+ "meta": {
8
+ "library": "@ds-mo/ui",
9
+ "distribution": "npm",
10
+ "storybook": "https://zainadeel.github.io/compomo/?path=/story/inline-banner-settings",
11
+ "source": "src/wc/components/InlineBannerSettings/InlineBannerSettings.tsx",
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "stable",
16
+ "summary": "Compact non-interactive informational copy row for settings cards.",
17
+ "useWhen": [
18
+ "A settings card needs persistent informational copy above its content.",
19
+ "The message should remain visible in both read-only and editing presentations of the settings card.",
20
+ "The message needs body-small typography, compact spacing, and a single tertiary bottom boundary."
21
+ ],
22
+ "avoidWhen": [
23
+ "The message belongs in general bounded content outside a settings card; reserve the general inline-banner component for that use case.",
24
+ "The message is application-wide or needs dismissal, actions, or announcement urgency; use Banner.",
25
+ "The message is transient or follows a completed action; use Toast."
26
+ ],
27
+ "alternatives": [
28
+ {
29
+ "when": "A persistent application-wide condition needs optional actions or dismissal.",
30
+ "component": "component:ds-banner",
31
+ "reason": "Banner owns shell-level messaging, actions, dismissal, and announcement behavior."
32
+ },
33
+ {
34
+ "when": "A field needs supporting or validation copy tied to its control.",
35
+ "component": "component:ds-field",
36
+ "reason": "Field owns the control relationship and supporting-message semantics."
37
+ }
38
+ ],
39
+ "commonlyComposedWith": [
40
+ "component:ds-card-setting",
41
+ "component:ds-text"
42
+ ],
43
+ "accessibility": [
44
+ "Keep the description concise and authored; InlineBannerSettings does not transform, truncate, or announce the copy.",
45
+ "Use InlineBannerSettings for static context. Applications must choose a live-region component when a dynamic announcement is required.",
46
+ "The informational copy remains plain text and has no interactive controls or dismissal affordance."
47
+ ],
48
+ "states": [
49
+ "The description renders verbatim in every state in which the owning settings card projects the component.",
50
+ "The component has no internal visibility, editing, or dismissal state; the owning settings card controls whether it is present.",
51
+ "The content height is intrinsic: the banner contributes 8px block padding and its inner content container contributes 4px block padding. A single body-small line is 24px inside that container (4px + 16px line-height + 4px), followed by the tertiary bottom boundary."
52
+ ],
53
+ "responsiveBehavior": [
54
+ "The component fills the available inline size and lets body-small copy wrap naturally.",
55
+ "The effective inline inset remains 16px: 8px banner padding, 6px inner content padding, and 2px text-side padding."
56
+ ],
57
+ "frameworkCaveats": {
58
+ "customElements": [
59
+ "Pass the complete authored message through description, assign slot=\"banner\" on CardSetting, and do not apply a CSS casing transform or mutate the text for presentation."
60
+ ],
61
+ "react": [
62
+ "Pass the complete authored message through the description prop, set slot=\"banner\" on CardSetting, and keep the component mounted for every settings-card state that needs the context."
63
+ ],
64
+ "angular": [
65
+ "Bind [description] from the settings card's stable copy source and project the component into CardSetting's banner slot for every state that needs the context."
66
+ ]
67
+ },
68
+ "references": [
69
+ {
70
+ "label": "Settings inline banner examples",
71
+ "path": "src/wc/components/InlineBannerSettings/InlineBannerSettings.stories.ts"
72
+ },
73
+ {
74
+ "label": "Rendered geometry coverage",
75
+ "path": "tests/e2e/inline-banner-settings.spec.ts"
76
+ }
77
+ ],
78
+ "styling": {
79
+ "rationale": "The component owns only the compact settings informational row recipe; its card owns the surrounding surface and layout.",
80
+ "protected": [
81
+ {
82
+ "properties": [
83
+ "border-bottom",
84
+ "color",
85
+ "padding"
86
+ ],
87
+ "reason": "The component owns the readable informational row treatment and keeps its spacing consistent across settings cards.",
88
+ "props": []
89
+ }
90
+ ],
91
+ "customProperties": []
92
+ }
93
+ },
94
+ "api": {
95
+ "props": {
96
+ "description": {
97
+ "type": "string",
98
+ "resolvedType": "string",
99
+ "attribute": "description",
100
+ "required": true,
101
+ "mutable": false,
102
+ "description": "Authored informational copy rendered without transformation."
103
+ }
104
+ },
105
+ "events": [],
106
+ "methods": [],
107
+ "slots": []
108
+ },
109
+ "props": {
110
+ "description": {
111
+ "type": "string",
112
+ "resolvedType": "string",
113
+ "attribute": "description",
114
+ "required": true,
115
+ "mutable": false,
116
+ "description": "Authored informational copy rendered without transformation."
117
+ }
118
+ },
119
+ "events": [],
120
+ "methods": [],
121
+ "slots": [],
122
+ "exports": {
123
+ "customElement": "ds-inline-banner-settings",
124
+ "react": "DsInlineBannerSettings",
125
+ "vue": "DsInlineBannerSettings",
126
+ "angular": "DsInlineBannerSettings"
127
+ },
128
+ "consumption": {
129
+ "install": "npm install @ds-mo/ui @ds-mo/tokens @ds-mo/icons",
130
+ "cssSetup": "import '@ds-mo/tokens';\nimport '@ds-mo/tokens/reset';\nimport '@ds-mo/tokens/globals';",
131
+ "customElements": {
132
+ "import": "import '@ds-mo/ui/dist/components/ds-inline-banner-settings.js';",
133
+ "example": "<ds-inline-banner-settings></ds-inline-banner-settings>"
134
+ },
135
+ "react": {
136
+ "import": "import { DsInlineBannerSettings } from '@ds-mo/ui/react';",
137
+ "example": "<DsInlineBannerSettings />"
138
+ },
139
+ "vue": {
140
+ "import": "import { DsInlineBannerSettings } from '@ds-mo/ui/vue';",
141
+ "example": "<DsInlineBannerSettings />"
142
+ },
143
+ "angular": {
144
+ "import": "import { DsInlineBannerSettings } from '@ds-mo/ui/angular/ds-inline-banner-settings';",
145
+ "example": "<ds-inline-banner-settings></ds-inline-banner-settings>"
146
+ },
147
+ "peerDependencies": {
148
+ "required": [
149
+ "@ds-mo/tokens ^6.6.1",
150
+ "@ds-mo/icons ^8.1.1"
151
+ ],
152
+ "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
153
+ }
154
+ }
155
+ },
156
+ "dependencies": [
157
+ "@ds-mo/ui",
158
+ "@ds-mo/tokens"
159
+ ],
160
+ "registryDependencies": [
161
+ "text"
162
+ ],
163
+ "files": [
164
+ {
165
+ "path": "src/wc/components/InlineBannerSettings/InlineBannerSettings.css",
166
+ "content": "@import '../../utils/forced-colors.css';\n\n:host {\n display: block;\n box-sizing: border-box;\n min-width: 0;\n padding: var(--dimension-space-100);\n border-block-end: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n.inline-banner-settings__content {\n padding-block: var(--dimension-space-050);\n padding-inline: var(--dimension-space-075);\n}\n\nds-text.inline-banner-settings__description {\n overflow-wrap: anywhere;\n padding-inline: var(--dimension-space-025);\n}\n\n@media (forced-colors: active) {\n :host {\n border-block-end-color: var(--ds-forced-color-content);\n }\n}\n",
167
+ "type": "registry:ui"
168
+ },
169
+ {
170
+ "path": "src/wc/components/InlineBannerSettings/InlineBannerSettings.tsx",
171
+ "content": "import { Component, h, Host, Prop } from '@stencil/core';\n\n@Component({\n tag: 'ds-inline-banner-settings',\n styleUrl: 'InlineBannerSettings.css',\n scoped: true,\n})\nexport class InlineBannerSettings {\n /** Authored informational copy rendered without transformation. */\n @Prop() description!: string;\n\n render() {\n return (\n <Host>\n {/* eslint-disable-next-line compomo/prefer-direct-ds-text -- This structural layer owns the banner's inner padding separately from the ds-text balance padding. */}\n <div class=\"inline-banner-settings__content\">\n <ds-text\n class=\"inline-banner-settings__description\"\n as=\"p\"\n variant=\"text-body-small\"\n color=\"secondary\"\n >\n {this.description}\n </ds-text>\n </div>\n </Host>\n );\n }\n}\n",
172
+ "type": "registry:ui"
173
+ }
174
+ ]
175
+ }
@@ -532,8 +532,8 @@
532
532
  },
533
533
  "peerDependencies": {
534
534
  "required": [
535
- "@ds-mo/tokens ^6.5.1",
536
- "@ds-mo/icons ^8.1.0"
535
+ "@ds-mo/tokens ^6.6.1",
536
+ "@ds-mo/icons ^8.1.1"
537
537
  ],
538
538
  "frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
539
539
  }