@ds-mo/ui 9.2.1 → 11.0.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 (326) hide show
  1. package/README.md +2 -2
  2. package/dist/.build-stamp +1 -1
  3. package/dist/agent-patterns.json +15 -9
  4. package/dist/agent.json +473 -150
  5. package/dist/angular/boolean-value-accessor.js +3 -3
  6. package/dist/angular/ds-agent-activity.js +3 -3
  7. package/dist/angular/ds-agent-response.js +3 -3
  8. package/dist/angular/ds-agent-source-list.js +3 -3
  9. package/dist/angular/ds-agent-tool-call.js +3 -3
  10. package/dist/angular/ds-app-shell.js +3 -3
  11. package/dist/angular/ds-attachment-list.js +3 -3
  12. package/dist/angular/ds-avatar.js +3 -3
  13. package/dist/angular/ds-badge.js +3 -3
  14. package/dist/angular/ds-bar-nav.js +3 -3
  15. package/dist/angular/ds-button-filled.js +3 -3
  16. package/dist/angular/ds-button-unfilled.js +3 -3
  17. package/dist/angular/ds-card-data-viz-donut.js +3 -3
  18. package/dist/angular/ds-card-setting.d.ts +5 -4
  19. package/dist/angular/ds-card-setting.js +6 -6
  20. package/dist/angular/ds-card-shell-data-viz.js +3 -3
  21. package/dist/angular/ds-chart-bar.js +3 -3
  22. package/dist/angular/ds-chart-donut.js +3 -3
  23. package/dist/angular/ds-chart-legend.js +3 -3
  24. package/dist/angular/ds-chart-line.js +3 -3
  25. package/dist/angular/ds-checkbox.js +3 -3
  26. package/dist/angular/ds-chip.js +3 -3
  27. package/dist/angular/ds-code-block.js +3 -3
  28. package/dist/angular/ds-conversation-list-item.js +3 -3
  29. package/dist/angular/ds-conversation-list-section.js +3 -3
  30. package/dist/angular/ds-conversation-list.js +3 -3
  31. package/dist/angular/ds-divider.js +3 -3
  32. package/dist/angular/ds-empty-state.js +3 -3
  33. package/dist/angular/ds-field.js +3 -3
  34. package/dist/angular/ds-icon.js +3 -3
  35. package/dist/angular/ds-input.js +3 -3
  36. package/dist/angular/ds-loader.js +3 -3
  37. package/dist/angular/ds-markdown.js +3 -3
  38. package/dist/angular/ds-menu.js +3 -3
  39. package/dist/angular/ds-message-bubble.js +3 -3
  40. package/dist/angular/ds-message-composer.js +3 -3
  41. package/dist/angular/ds-message-scroller.js +3 -3
  42. package/dist/angular/ds-message.js +3 -3
  43. package/dist/angular/ds-modal.d.ts +12 -3
  44. package/dist/angular/ds-modal.js +9 -6
  45. package/dist/angular/ds-panel-nav.js +3 -3
  46. package/dist/angular/ds-panel-sub-nav.js +3 -3
  47. package/dist/angular/ds-panel-tool-header.js +3 -3
  48. package/dist/angular/ds-panel-tool-search.js +3 -3
  49. package/dist/angular/ds-panel-tools.js +3 -3
  50. package/dist/angular/ds-radio.js +3 -3
  51. package/dist/angular/ds-select-multi.js +3 -3
  52. package/dist/angular/ds-select.js +3 -3
  53. package/dist/angular/ds-shell-gradient-picker.js +3 -3
  54. package/dist/angular/ds-shell-gradient-swatch.js +3 -3
  55. package/dist/angular/ds-skeleton.js +3 -3
  56. package/dist/angular/ds-slider.js +3 -3
  57. package/dist/angular/ds-swatch-picker.js +3 -3
  58. package/dist/angular/ds-switch.js +3 -3
  59. package/dist/angular/ds-tab-group.js +3 -3
  60. package/dist/angular/ds-tag.js +3 -3
  61. package/dist/angular/ds-text.js +3 -3
  62. package/dist/angular/ds-toast.d.ts +22 -0
  63. package/dist/angular/{ds-banner.js → ds-toast.js} +21 -15
  64. package/dist/angular/ds-tooltip-data-viz.js +3 -3
  65. package/dist/angular/ds-tooltip.js +3 -3
  66. package/dist/angular/ds-typing-indicator.d.ts +12 -0
  67. package/dist/angular/{ds-card.js → ds-typing-indicator.js} +12 -12
  68. package/dist/angular/index.d.ts +1 -1
  69. package/dist/angular/index.js +3 -3
  70. package/dist/angular/proxies.d.ts +2 -2
  71. package/dist/angular/proxies.js +2 -2
  72. package/dist/angular/radio-value-accessor.js +3 -3
  73. package/dist/angular/select-value-accessor.js +3 -3
  74. package/dist/angular/text-value-accessor.js +3 -3
  75. package/dist/angular/value-accessor.js +3 -3
  76. package/dist/components/ds-agent-activity.js +1 -1
  77. package/dist/components/ds-agent-response.js +1 -1
  78. package/dist/components/ds-agent-response.js.map +1 -1
  79. package/dist/components/ds-agent-source-list.js +1 -1
  80. package/dist/components/ds-agent-tool-call.js +1 -1
  81. package/dist/components/ds-app-shell.js +1 -1
  82. package/dist/components/ds-attachment-list.js +1 -1
  83. package/dist/components/ds-avatar.js +1 -1
  84. package/dist/components/ds-avatar.js.map +1 -1
  85. package/dist/components/ds-badge.js +1 -1
  86. package/dist/components/ds-bar-nav.js +1 -1
  87. package/dist/components/ds-bar-nav.js.map +1 -1
  88. package/dist/components/ds-button-filled.js +1 -1
  89. package/dist/components/ds-button-unfilled.js +1 -1
  90. package/dist/components/ds-card-data-viz-donut.js +1 -1
  91. package/dist/components/ds-card-data-viz-donut.js.map +1 -1
  92. package/dist/components/ds-card-setting.js +1 -1
  93. package/dist/components/ds-card-setting.js.map +1 -1
  94. package/dist/components/ds-card-shell-data-viz.js +1 -1
  95. package/dist/components/ds-chart-bar.js +1 -1
  96. package/dist/components/ds-chart-donut.js +1 -1
  97. package/dist/components/ds-chart-legend.js +1 -1
  98. package/dist/components/ds-chart-legend.js.map +1 -1
  99. package/dist/components/ds-chart-line.js +1 -1
  100. package/dist/components/ds-checkbox.js +1 -1
  101. package/dist/components/ds-chip.js +1 -1
  102. package/dist/components/ds-chip.js.map +1 -1
  103. package/dist/components/ds-code-block.js +1 -1
  104. package/dist/components/ds-conversation-list-item.js +1 -1
  105. package/dist/components/ds-conversation-list-item.js.map +1 -1
  106. package/dist/components/ds-conversation-list-section.js +1 -1
  107. package/dist/components/ds-conversation-list.js +1 -1
  108. package/dist/components/ds-divider.js +1 -1
  109. package/dist/components/ds-empty-state.js +1 -1
  110. package/dist/components/ds-field.js +1 -1
  111. package/dist/components/ds-icon.js +1 -1
  112. package/dist/components/ds-input.js +1 -1
  113. package/dist/components/ds-input.js.map +1 -1
  114. package/dist/components/ds-markdown.js +1 -1
  115. package/dist/components/ds-menu.js +1 -1
  116. package/dist/components/ds-message-bubble.js +1 -1
  117. package/dist/components/ds-message-bubble.js.map +1 -1
  118. package/dist/components/ds-message-composer.js +1 -1
  119. package/dist/components/ds-message-composer.js.map +1 -1
  120. package/dist/components/ds-message-scroller.js +1 -1
  121. package/dist/components/ds-message-scroller.js.map +1 -1
  122. package/dist/components/ds-message.js +1 -1
  123. package/dist/components/ds-modal.js +1 -1
  124. package/dist/components/ds-modal.js.map +1 -1
  125. package/dist/components/ds-panel-nav.js +1 -1
  126. package/dist/components/ds-panel-nav.js.map +1 -1
  127. package/dist/components/ds-panel-sub-nav.js +1 -1
  128. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  129. package/dist/components/ds-panel-tool-header.js +1 -1
  130. package/dist/components/ds-panel-tool-search.js +1 -1
  131. package/dist/components/ds-panel-tool-search.js.map +1 -1
  132. package/dist/components/ds-panel-tools.js +1 -1
  133. package/dist/components/ds-panel-tools.js.map +1 -1
  134. package/dist/components/ds-radio.js +1 -1
  135. package/dist/components/ds-radio.js.map +1 -1
  136. package/dist/components/ds-select-multi.js +1 -1
  137. package/dist/components/ds-select-multi.js.map +1 -1
  138. package/dist/components/ds-select.js +1 -1
  139. package/dist/components/ds-select.js.map +1 -1
  140. package/dist/components/ds-shell-gradient-picker.js +1 -1
  141. package/dist/components/ds-shell-gradient-swatch.js +1 -1
  142. package/dist/components/ds-skeleton.js +1 -1
  143. package/dist/components/ds-skeleton.js.map +1 -1
  144. package/dist/components/ds-slider.js +1 -1
  145. package/dist/components/ds-slider.js.map +1 -1
  146. package/dist/components/ds-swatch-picker.js +1 -1
  147. package/dist/components/ds-switch.js +1 -1
  148. package/dist/components/ds-tab-group.js +1 -1
  149. package/dist/components/ds-tab-group.js.map +1 -1
  150. package/dist/components/ds-tag.js +1 -1
  151. package/dist/components/ds-tag.js.map +1 -1
  152. package/dist/components/ds-text.js +1 -1
  153. package/dist/components/{ds-card.d.ts → ds-toast.d.ts} +4 -4
  154. package/dist/components/ds-toast.js +2 -0
  155. package/dist/components/ds-toast.js.map +1 -0
  156. package/dist/components/ds-tooltip-data-viz.js +1 -1
  157. package/dist/components/ds-tooltip-data-viz.js.map +1 -1
  158. package/dist/components/ds-tooltip.js +1 -1
  159. package/dist/components/{ds-banner.d.ts → ds-typing-indicator.d.ts} +4 -4
  160. package/dist/components/ds-typing-indicator.js +2 -0
  161. package/dist/components/ds-typing-indicator.js.map +1 -0
  162. package/dist/components/{p-DnMCRAwx.js → p-0kEg-Z4f.js} +2 -2
  163. package/dist/components/p-B8C_yfLQ.js +2 -0
  164. package/dist/components/p-B8C_yfLQ.js.map +1 -0
  165. package/dist/components/{p-DiooIO2B.js → p-BEWtqFX7.js} +2 -2
  166. package/dist/components/p-BMwnjAIq.js +2 -0
  167. package/dist/components/p-BMwnjAIq.js.map +1 -0
  168. package/dist/components/{p-Ci_nVk5P.js → p-BkwBtZs3.js} +2 -2
  169. package/dist/components/p-C3nDIMX5.js +2 -0
  170. package/dist/components/{p-Dj5MejHv.js.map → p-C3nDIMX5.js.map} +1 -1
  171. package/dist/components/{p-CJlgONwR.js → p-C8e2A66f.js} +2 -2
  172. package/dist/components/{p-BRfOCc_h.js → p-CLn7QnE0.js} +2 -2
  173. package/dist/components/{p-kezp2_Xu.js → p-CPPAndX2.js} +2 -2
  174. package/dist/components/p-CTFBf97-.js +2 -0
  175. package/dist/components/{p-CblAABEo.js.map → p-CTFBf97-.js.map} +1 -1
  176. package/dist/components/{p-BSOZXagj.js → p-CZZYGqKz.js} +2 -2
  177. package/dist/components/p-C_0Q8Cnp.js +2 -0
  178. package/dist/components/p-C_0Q8Cnp.js.map +1 -0
  179. package/dist/components/{p-T0Mzhv3-.js → p-CbckeueL.js} +2 -2
  180. package/dist/components/p-CjP8sYlo.js +2 -0
  181. package/dist/components/{p-xB0GPG3-.js.map → p-CjP8sYlo.js.map} +1 -1
  182. package/dist/components/{p-DaQ0ZE_V.js → p-DJ78wdNv.js} +2 -2
  183. package/dist/components/p-DTqCBjUj.js +2 -0
  184. package/dist/components/{p-Dst-OliP.js.map → p-DTqCBjUj.js.map} +1 -1
  185. package/dist/components/{p-CeFBA7Dx.js → p-Dh4q5TSS.js} +2 -2
  186. package/dist/components/p-DirD-b2y.js +2 -0
  187. package/dist/components/{p-BHpWYKtP.js.map → p-DirD-b2y.js.map} +1 -1
  188. package/dist/components/{p-CiwdnKKp.js → p-DrDHC7V6.js} +2 -2
  189. package/dist/components/p-DuNZGFkV.js +2 -0
  190. package/dist/components/p-DuNZGFkV.js.map +1 -0
  191. package/dist/components/{p-Cijzn3YQ.js → p-Hw-HMjCk.js} +2 -2
  192. package/dist/components/p-M5pt9I13.js +2 -0
  193. package/dist/components/p-M5pt9I13.js.map +1 -0
  194. package/dist/components/{p-B1pWGQn1.js → p-bDx_rlLm.js} +2 -2
  195. package/dist/docs/components.json +1509 -1530
  196. package/dist/framework/select-multi-value-accessor.js +3 -3
  197. package/dist/lib/toast/index.d.ts +2 -0
  198. package/dist/lib/toast/index.js +158 -0
  199. package/dist/lib/toast/index.js.map +7 -0
  200. package/dist/lib/toast/toast-manager.d.ts +3 -0
  201. package/dist/lib/toast/toast-types.d.ts +85 -0
  202. package/dist/mcp-data/registry/agent-activity.json +1 -1
  203. package/dist/mcp-data/registry/agent-response.json +6 -6
  204. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  205. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  206. package/dist/mcp-data/registry/app-shell.json +1 -1
  207. package/dist/mcp-data/registry/attachment-list.json +1 -1
  208. package/dist/mcp-data/registry/avatar.json +1 -1
  209. package/dist/mcp-data/registry/badge.json +1 -1
  210. package/dist/mcp-data/registry/bar-nav.json +1 -1
  211. package/dist/mcp-data/registry/button-filled.json +1 -1
  212. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  213. package/dist/mcp-data/registry/card-data-viz-donut.json +2 -2
  214. package/dist/mcp-data/registry/card-setting.json +99 -13
  215. package/dist/mcp-data/registry/card-shell-data-viz.json +8 -8
  216. package/dist/mcp-data/registry/chart-bar.json +1 -1
  217. package/dist/mcp-data/registry/chart-donut.json +1 -1
  218. package/dist/mcp-data/registry/chart-legend.json +1 -1
  219. package/dist/mcp-data/registry/chart-line.json +1 -1
  220. package/dist/mcp-data/registry/checkbox.json +1 -1
  221. package/dist/mcp-data/registry/chip.json +1 -1
  222. package/dist/mcp-data/registry/code-block.json +1 -1
  223. package/dist/mcp-data/registry/conversation-list-item.json +5 -5
  224. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  225. package/dist/mcp-data/registry/conversation-list.json +1 -1
  226. package/dist/mcp-data/registry/divider.json +5 -5
  227. package/dist/mcp-data/registry/empty-state.json +1 -1
  228. package/dist/mcp-data/registry/field.json +1 -1
  229. package/dist/mcp-data/registry/icon.json +2 -2
  230. package/dist/mcp-data/registry/input.json +1 -1
  231. package/dist/mcp-data/registry/loader.json +1 -1
  232. package/dist/mcp-data/registry/markdown.json +1 -1
  233. package/dist/mcp-data/registry/menu.json +1 -1
  234. package/dist/mcp-data/registry/message-bubble.json +21 -16
  235. package/dist/mcp-data/registry/message-composer.json +6 -4
  236. package/dist/mcp-data/registry/message-scroller.json +2 -2
  237. package/dist/mcp-data/registry/message.json +7 -6
  238. package/dist/mcp-data/registry/modal.json +154 -24
  239. package/dist/mcp-data/registry/panel-nav.json +4 -3
  240. package/dist/mcp-data/registry/panel-sub-nav.json +2 -2
  241. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  242. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  243. package/dist/mcp-data/registry/panel-tools.json +1 -1
  244. package/dist/mcp-data/registry/radio.json +1 -1
  245. package/dist/mcp-data/registry/registry.json +479 -156
  246. package/dist/mcp-data/registry/select-multi.json +1 -1
  247. package/dist/mcp-data/registry/select.json +1 -1
  248. package/dist/mcp-data/registry/shell-gradient-picker.json +1 -1
  249. package/dist/mcp-data/registry/shell-gradient-swatch.json +1 -1
  250. package/dist/mcp-data/registry/skeleton.json +4 -4
  251. package/dist/mcp-data/registry/slider.json +1 -1
  252. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  253. package/dist/mcp-data/registry/switch.json +1 -1
  254. package/dist/mcp-data/registry/tab-group.json +1 -1
  255. package/dist/mcp-data/registry/tag.json +2 -2
  256. package/dist/mcp-data/registry/text.json +2 -2
  257. package/dist/mcp-data/registry/toast.json +318 -0
  258. package/dist/mcp-data/registry/tooltip-data-viz.json +1 -1
  259. package/dist/mcp-data/registry/tooltip.json +1 -1
  260. package/dist/mcp-data/registry/typing-indicator.json +127 -0
  261. package/dist/react/components.d.ts +2 -2
  262. package/dist/react/components.js +2 -2
  263. package/dist/react/ds-card-setting.d.ts +2 -2
  264. package/dist/react/ds-card-setting.js +1 -1
  265. package/dist/react/ds-modal.d.ts +3 -2
  266. package/dist/react/ds-modal.js +4 -1
  267. package/dist/react/ds-toast.d.ts +14 -0
  268. package/dist/react/ds-toast.js +16 -0
  269. package/dist/react/{ds-card.d.ts → ds-typing-indicator.d.ts} +3 -3
  270. package/dist/react/ds-typing-indicator.js +12 -0
  271. package/dist/types/components/CardSetting/CardSetting.d.ts +9 -6
  272. package/dist/types/components/CardSetting/index.d.ts +1 -1
  273. package/dist/types/components/MessageBubble/MessageBubble.d.ts +1 -1
  274. package/dist/types/components/Modal/Modal.d.ts +21 -18
  275. package/dist/types/components/Toast/Toast.d.ts +106 -0
  276. package/dist/types/components/Toast/index.d.ts +2 -0
  277. package/dist/types/components/TypingIndicator/TypingIndicator.d.ts +6 -0
  278. package/dist/types/components.d.ts +164 -182
  279. package/dist/types/toast/index.d.ts +3 -0
  280. package/dist/types/toast/toast-manager.d.ts +4 -0
  281. package/dist/types/toast/toast-types.d.ts +86 -0
  282. package/package.json +12 -8
  283. package/dist/angular/ds-banner.d.ts +0 -15
  284. package/dist/angular/ds-card.d.ts +0 -12
  285. package/dist/components/ds-banner.js +0 -2
  286. package/dist/components/ds-banner.js.map +0 -1
  287. package/dist/components/ds-card.js +0 -2
  288. package/dist/components/ds-card.js.map +0 -1
  289. package/dist/components/p-BHpWYKtP.js +0 -2
  290. package/dist/components/p-BO6C8abO.js +0 -2
  291. package/dist/components/p-BO6C8abO.js.map +0 -1
  292. package/dist/components/p-CBYuvZKM.js +0 -2
  293. package/dist/components/p-CBYuvZKM.js.map +0 -1
  294. package/dist/components/p-CWNdl52Y.js +0 -2
  295. package/dist/components/p-CWNdl52Y.js.map +0 -1
  296. package/dist/components/p-CblAABEo.js +0 -2
  297. package/dist/components/p-CiKGqsA2.js +0 -2
  298. package/dist/components/p-CiKGqsA2.js.map +0 -1
  299. package/dist/components/p-DFxqk71w.js +0 -2
  300. package/dist/components/p-DFxqk71w.js.map +0 -1
  301. package/dist/components/p-Dj5MejHv.js +0 -2
  302. package/dist/components/p-Dst-OliP.js +0 -2
  303. package/dist/components/p-drBA73M_.js +0 -2
  304. package/dist/components/p-drBA73M_.js.map +0 -1
  305. package/dist/components/p-xB0GPG3-.js +0 -2
  306. package/dist/mcp-data/registry/banner.json +0 -206
  307. package/dist/mcp-data/registry/card.json +0 -126
  308. package/dist/react/ds-banner.d.ts +0 -12
  309. package/dist/react/ds-banner.js +0 -12
  310. package/dist/react/ds-card.js +0 -12
  311. package/dist/types/components/Banner/Banner.d.ts +0 -31
  312. package/dist/types/components/Card/Card.d.ts +0 -21
  313. package/dist/types/components/Card/index.d.ts +0 -2
  314. /package/dist/components/{p-DnMCRAwx.js.map → p-0kEg-Z4f.js.map} +0 -0
  315. /package/dist/components/{p-DiooIO2B.js.map → p-BEWtqFX7.js.map} +0 -0
  316. /package/dist/components/{p-Ci_nVk5P.js.map → p-BkwBtZs3.js.map} +0 -0
  317. /package/dist/components/{p-CJlgONwR.js.map → p-C8e2A66f.js.map} +0 -0
  318. /package/dist/components/{p-BRfOCc_h.js.map → p-CLn7QnE0.js.map} +0 -0
  319. /package/dist/components/{p-kezp2_Xu.js.map → p-CPPAndX2.js.map} +0 -0
  320. /package/dist/components/{p-BSOZXagj.js.map → p-CZZYGqKz.js.map} +0 -0
  321. /package/dist/components/{p-T0Mzhv3-.js.map → p-CbckeueL.js.map} +0 -0
  322. /package/dist/components/{p-DaQ0ZE_V.js.map → p-DJ78wdNv.js.map} +0 -0
  323. /package/dist/components/{p-CeFBA7Dx.js.map → p-Dh4q5TSS.js.map} +0 -0
  324. /package/dist/components/{p-CiwdnKKp.js.map → p-DrDHC7V6.js.map} +0 -0
  325. /package/dist/components/{p-Cijzn3YQ.js.map → p-Hw-HMjCk.js.map} +0 -0
  326. /package/dist/components/{p-B1pWGQn1.js.map → p-bDx_rlLm.js.map} +0 -0
@@ -2,15 +2,101 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "card-setting",
4
4
  "title": "CardSetting",
5
- "description": "Settings page section shell composed on ds-card with view/edit header actions. Edit state is controlled by the parent.",
5
+ "description": "Persistent settings-section surface with a heading, controlled view/edit chrome, fixed edit-save-cancel actions, and application-owned body content.",
6
6
  "type": "registry:ui",
7
7
  "meta": {
8
8
  "library": "@ds-mo/ui",
9
9
  "distribution": "npm",
10
10
  "storybook": "https://zainadeel.github.io/compomo/?path=/story/card-setting",
11
11
  "source": "src/wc/components/CardSetting/CardSetting.tsx",
12
- "intentStatus": "migration-pending",
13
- "intent": null,
12
+ "intentStatus": "complete",
13
+ "intent": {
14
+ "audience": "general",
15
+ "status": "stable",
16
+ "summary": "Persistent settings-section surface with a heading, controlled view/edit chrome, fixed edit-save-cancel actions, and application-owned body content.",
17
+ "useWhen": [
18
+ "A settings page needs a persistent section that switches between read-only and editable content.",
19
+ "The parent can control one active editing section and owns validation, persistence, cancellation, and body content.",
20
+ "The section uses the standard Pencil, Save, and Cancel header workflow."
21
+ ],
22
+ "avoidWhen": [
23
+ "The surface contains a chart, legend, metric visualization, or other data-visualization composition.",
24
+ "The content is a general-purpose read-only card with no settings edit workflow.",
25
+ "The task must block the rest of the interface or requires confirmation in a modal.",
26
+ "Several sections must remain editable at the same time.",
27
+ "The header requires custom actions beyond the fixed edit-save-cancel workflow."
28
+ ],
29
+ "alternatives": [
30
+ {
31
+ "when": "The surface contains a chart or specialized data-visualization composition.",
32
+ "component": "component:ds-card-shell-data-viz",
33
+ "reason": "CardShellDataViz owns the independently evolving data-visualization shell contract."
34
+ },
35
+ {
36
+ "when": "The task must block the interface for one focused decision or short workflow.",
37
+ "component": "component:ds-modal",
38
+ "reason": "Modal provides top-layer focus containment and explicit blocking-task dismissal."
39
+ },
40
+ {
41
+ "when": "Only one labeled form control is needed without a section surface.",
42
+ "component": "component:ds-field",
43
+ "reason": "Field provides the control label, supporting copy, and validation relationship without card chrome."
44
+ }
45
+ ],
46
+ "commonlyComposedWith": [
47
+ "component:ds-field",
48
+ "component:ds-input",
49
+ "component:ds-select",
50
+ "component:ds-switch",
51
+ "component:ds-text"
52
+ ],
53
+ "accessibility": [
54
+ "Provide a concise heading that identifies the settings section; CardSetting renders it as an h2.",
55
+ "Edit, Save, and Cancel are icon-only controls with localized accessible labels supplied by the matching label props. When several sections share a page, include the section name in each label.",
56
+ "The owner must expose persistent field labels, descriptions, and validation messages inside the body.",
57
+ "Save must not remove validation errors or exit editing until the parent accepts the action and updates the controlled editing state.",
58
+ "Cancel must restore or retain the last persisted values according to product policy before the parent exits editing.",
59
+ "Keep only one CardSetting in edit mode so keyboard and screen-reader users have one unambiguous set of Save and Cancel actions.",
60
+ "When another section requests editing, resolve dirty changes in the current section before switching; never silently discard user input."
61
+ ],
62
+ "states": [
63
+ "The editing property is controlled; CardSetting never changes it internally.",
64
+ "dsAction emits edit, save, or cancel with the original pointer event. The parent decides whether and when editing changes.",
65
+ "When another section requests edit, the parent keeps one active section and resolves any dirty current section before switching.",
66
+ "The parent owns read-only versus editable body composition, dirty state, validation, persistence, loading, success, and error consequences.",
67
+ "A save request keeps the section editing while validation or persistence is pending; the parent exits only after success.",
68
+ "A cancel request does not persist changes; the parent restores its chosen value snapshot and exits editing."
69
+ ],
70
+ "responsiveBehavior": [
71
+ "Choose sm, md, or lg from the parent layout; each width uses its matching token-based minimum height.",
72
+ "The surface never exceeds its parent width, while the parent owns wrapping, columns, stacking, and breakpoint changes.",
73
+ "At narrow widths, keep the fixed header actions visible and let application-owned body layouts collapse before allowing horizontal overflow."
74
+ ],
75
+ "frameworkCaveats": {
76
+ "customElements": [
77
+ "Set editing as a JavaScript property and inspect dsAction.detail.action before updating the controlled state.",
78
+ "When one section emits edit, update every sibling CardSetting so only the requested section remains editing."
79
+ ],
80
+ "react": [
81
+ "Pass editing from parent state and inspect onDsAction event detail; do not treat Save as successful until validation and persistence complete.",
82
+ "Store one active section id and derive each CardSetting editing prop from that id."
83
+ ],
84
+ "angular": [
85
+ "Bind [editing] and inspect $event.detail.action from (dsAction); do not treat Save as successful until validation and persistence complete.",
86
+ "Store one active section id and derive each CardSetting editing binding from that id."
87
+ ]
88
+ },
89
+ "references": [
90
+ {
91
+ "label": "Storybook controlled and single-edit examples",
92
+ "path": "src/wc/components/CardSetting/CardSetting.stories.ts"
93
+ },
94
+ {
95
+ "label": "Cross-browser shell and action coverage",
96
+ "path": "tests/e2e/card-setting.spec.ts"
97
+ }
98
+ ]
99
+ },
14
100
  "api": {
15
101
  "props": {
16
102
  "cancelLabel": {
@@ -66,12 +152,12 @@
66
152
  },
67
153
  "events": [
68
154
  {
69
- "name": "dsEditingChange",
70
- "detail": "boolean",
155
+ "name": "dsAction",
156
+ "detail": "CardSettingActionDetail",
71
157
  "bubbles": true,
72
158
  "cancelable": true,
73
159
  "composed": true,
74
- "description": "Emits when the user enters or exits edit mode."
160
+ "description": "Emits a controlled edit, save, or cancel request."
75
161
  }
76
162
  ],
77
163
  "methods": [],
@@ -131,12 +217,12 @@
131
217
  },
132
218
  "events": [
133
219
  {
134
- "name": "dsEditingChange",
135
- "detail": "boolean",
220
+ "name": "dsAction",
221
+ "detail": "CardSettingActionDetail",
136
222
  "bubbles": true,
137
223
  "cancelable": true,
138
224
  "composed": true,
139
- "description": "Emits when the user enters or exits edit mode."
225
+ "description": "Emits a controlled edit, save, or cancel request."
140
226
  }
141
227
  ],
142
228
  "methods": [],
@@ -164,7 +250,7 @@
164
250
  "peerDependencies": {
165
251
  "required": [
166
252
  "@ds-mo/tokens ^3.1.1",
167
- "@ds-mo/icons ^6.2.0"
253
+ "@ds-mo/icons ^6.3.0"
168
254
  ],
169
255
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
170
256
  }
@@ -177,17 +263,17 @@
177
263
  "registryDependencies": [
178
264
  "button-filled",
179
265
  "button-unfilled",
180
- "card"
266
+ "text"
181
267
  ],
182
268
  "files": [
183
269
  {
184
270
  "path": "src/wc/components/CardSetting/CardSetting.css",
185
- "content": ":host {\n display: contents;\n}\n\n.card-setting__actions {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--dimension-space-100);\n}\n",
271
+ "content": ":host {\n display: flex;\n flex-direction: column;\n box-sizing: border-box;\n width: var(--_card-setting-width);\n min-height: var(--_card-setting-min-height);\n max-width: 100%;\n overflow: hidden;\n background-color: var(--color-background-primary);\n border: none;\n border-radius: var(--dimension-radius-025);\n box-shadow: 0 0 0 var(--dimension-stroke-width-012) var(--color-border-tertiary);\n}\n\n:host(.card-setting--editing) {\n background-color: var(--color-background-bold-brand);\n box-shadow: 0 0 0 var(--dimension-stroke-width-025) var(--color-border-bold-brand);\n}\n\n.card-setting__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--dimension-space-100);\n height: var(--dimension-size-600);\n padding: var(--dimension-space-100);\n flex: 0 0 auto;\n box-sizing: border-box;\n background-color: var(--color-background-secondary);\n border-bottom: var(--dimension-stroke-width-012) solid var(--color-border-tertiary);\n}\n\n:host(.card-setting--editing) .card-setting__header {\n background-color: transparent;\n border-bottom-color: transparent;\n}\n\nds-text.card-setting__title {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n padding: calc(var(--dimension-space-075) + var(--dimension-space-025));\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.card-setting__actions {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n gap: var(--dimension-space-100);\n}\n\n.card-setting__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(--dimension-radius-025) var(--dimension-radius-025);\n}\n\n:host(.card-setting--editing) .card-setting__body {\n border-radius: var(--dimension-radius-025);\n}\n",
186
272
  "type": "registry:ui"
187
273
  },
188
274
  {
189
275
  "path": "src/wc/components/CardSetting/CardSetting.tsx",
190
- "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport type { CardWidth } from '../Card/Card';\n\nexport type CardSettingWidth = CardWidth;\n\n@Component({\n tag: 'ds-card-setting',\n styleUrl: 'CardSetting.css',\n scoped: true,\n})\nexport class CardSetting {\n /** Section heading shown in the card header. */\n @Prop() heading!: string;\n\n /**\n * Card width token (`sm` / `md` / `lg`). Also sets host `min-height` to the\n * matching `--dimension-card-height-*` so the body fills available space\n * even when the slot is empty.\n */\n @Prop() cardWidth: CardSettingWidth = 'md';\n\n /** Controlled edit state — parent owns single-edit orchestration. */\n @Prop() editing = false;\n @Prop() editLabel: string = 'Edit';\n @Prop() cancelLabel: string = 'Cancel';\n @Prop() saveLabel: string = 'Save';\n\n /** Emits when the user enters or exits edit mode. */\n @Event() dsEditingChange!: EventEmitter<boolean>;\n\n private enterEdit = () => {\n this.dsEditingChange.emit(true);\n };\n\n private exitEdit = () => {\n this.dsEditingChange.emit(false);\n };\n\n render() {\n const editing = this.editing;\n\n return (\n <Host class=\"card-setting\">\n <ds-card\n heading={this.heading}\n cardWidth={this.cardWidth}\n appearance={editing ? 'editing' : 'default'}\n >\n {!editing ? (\n <ds-button-unfilled\n slot=\"actions\"\n variant=\"icon\"\n type=\"button\"\n icon=\"Pencil\"\n aria-label={this.editLabel}\n onDsClick={this.enterEdit}\n />\n ) : (\n <div slot=\"actions\" class=\"card-setting__actions\">\n <ds-button-unfilled\n variant=\"icon\"\n type=\"button\"\n icon=\"Cross\"\n background=\"bold\"\n aria-label={this.cancelLabel}\n onDsClick={this.exitEdit}\n />\n <ds-button-filled\n variant=\"icon\"\n type=\"button\"\n icon=\"Check\"\n intent=\"brand\"\n contrast=\"faint\"\n aria-label={this.saveLabel}\n onDsClick={this.exitEdit}\n />\n </div>\n )}\n <slot />\n </ds-card>\n </Host>\n );\n }\n}\n",
276
+ "content": "import { Component, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\n\nexport type CardSettingWidth = 'sm' | 'md' | 'lg';\nexport type CardSettingAction = 'edit' | 'save' | 'cancel';\n\nexport interface CardSettingActionDetail {\n action: CardSettingAction;\n originalEvent: MouseEvent;\n}\n\nconst CARD_WIDTH_VARS: Record<CardSettingWidth, 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<CardSettingWidth, string> = {\n sm: 'var(--dimension-card-height-sm)',\n md: 'var(--dimension-card-height-md)',\n lg: 'var(--dimension-card-height-lg)',\n};\n\nconst FAINT_BRAND_TITLE_COLOR = 'var(--color-foreground-faint-brand)';\n\n@Component({\n tag: 'ds-card-setting',\n styleUrl: 'CardSetting.css',\n scoped: true,\n})\nexport class CardSetting {\n /** Section heading shown in the card header. */\n @Prop() heading!: string;\n\n /**\n * Card width token (`sm` / `md` / `lg`). Also sets host `min-height` to the\n * matching `--dimension-card-height-*` so the body fills available space\n * even when the slot is empty.\n */\n @Prop() cardWidth: CardSettingWidth = 'md';\n\n /** Controlled edit state — parent owns single-edit orchestration. */\n @Prop() editing = false;\n @Prop() editLabel: string = 'Edit';\n @Prop() cancelLabel: string = 'Cancel';\n @Prop() saveLabel: string = 'Save';\n\n /** Emits a controlled edit, save, or cancel request. */\n @Event() dsAction!: EventEmitter<CardSettingActionDetail>;\n\n private emitAction(action: CardSettingAction, originalEvent: MouseEvent) {\n this.dsAction.emit({ action, originalEvent });\n }\n\n render() {\n const editing = this.editing;\n\n return (\n <Host\n class={{\n 'card-setting': true,\n 'card-setting--editing': editing,\n }}\n style={{\n '--_card-setting-width': CARD_WIDTH_VARS[this.cardWidth],\n '--_card-setting-min-height': CARD_HEIGHT_VARS[this.cardWidth],\n }}\n >\n <header class=\"card-setting__header\">\n <ds-text\n class=\"card-setting__title\"\n variant=\"text-title-small\"\n emphasis\n color={editing ? FAINT_BRAND_TITLE_COLOR : 'primary'}\n as=\"h2\"\n >\n {this.heading}\n </ds-text>\n <div class=\"card-setting__actions\">\n {!editing ? (\n <ds-button-unfilled\n variant=\"icon\"\n type=\"button\"\n icon=\"Pencil\"\n aria-label={this.editLabel}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.emitAction('edit', event.detail)\n }\n />\n ) : (\n [\n <ds-button-unfilled\n key=\"cancel\"\n variant=\"icon\"\n type=\"button\"\n icon=\"Cross\"\n background=\"bold\"\n aria-label={this.cancelLabel}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.emitAction('cancel', event.detail)\n }\n />,\n <ds-button-filled\n key=\"save\"\n variant=\"icon\"\n type=\"button\"\n icon=\"Check\"\n intent=\"brand\"\n contrast=\"faint\"\n aria-label={this.saveLabel}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.emitAction('save', event.detail)\n }\n />,\n ]\n )}\n </div>\n </header>\n <div class=\"card-setting__body\">\n <slot />\n </div>\n </Host>\n );\n }\n}\n",
191
277
  "type": "registry:ui"
192
278
  }
193
279
  ]
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "card-shell-data-viz",
4
4
  "title": "CardShellDataViz",
5
- "description": "Dedicated header, action, sizing, and body chrome for data-visualization cards whose layouts will evolve independently from general and settings cards.",
5
+ "description": "Dedicated header, action, sizing, and body chrome for data-visualization cards whose layouts evolve independently from settings sections.",
6
6
  "type": "registry:ui",
7
7
  "meta": {
8
8
  "library": "@ds-mo/ui",
@@ -13,22 +13,22 @@
13
13
  "intent": {
14
14
  "audience": "specialized",
15
15
  "status": "experimental",
16
- "summary": "Dedicated header, action, sizing, and body chrome for data-visualization cards whose layouts will evolve independently from general and settings cards.",
16
+ "summary": "Dedicated header, action, sizing, and body chrome for data-visualization cards whose layouts evolve independently from settings sections.",
17
17
  "useWhen": [
18
18
  "A card contains a chart, data-visualization legend, metric visualization, or a specialized data-viz composition.",
19
19
  "A data-visualization card needs a heading and optional header actions while retaining a flexible body for its composing component.",
20
- "Several chart-specific cards need one shell boundary that can evolve without changing general or settings cards."
20
+ "Several chart-specific cards need one shell boundary that can evolve without changing settings sections."
21
21
  ],
22
22
  "avoidWhen": [
23
23
  "The card contains settings or editable form content; use the settings card composition.",
24
- "The surface is ordinary content without data visualization; use the general card shell.",
24
+ "The surface is ordinary content without data visualization; use a product-owned layout rather than data-viz card chrome.",
25
25
  "The shell would own chart-specific layout, hover synchronization, legends, or empty-state policy; keep those in the composing data-viz card."
26
26
  ],
27
27
  "alternatives": [
28
28
  {
29
- "when": "The card contains general content rather than data visualization.",
30
- "component": "component:ds-card",
31
- "reason": "Card owns the existing general and settings-compatible chrome contract."
29
+ "when": "The surface contains editable settings rather than data visualization.",
30
+ "component": "component:ds-card-setting",
31
+ "reason": "CardSetting owns the persistent controlled settings-section workflow."
32
32
  },
33
33
  {
34
34
  "when": "The composition is the standard donut chart plus synchronized legend.",
@@ -145,7 +145,7 @@
145
145
  "peerDependencies": {
146
146
  "required": [
147
147
  "@ds-mo/tokens ^3.1.1",
148
- "@ds-mo/icons ^6.2.0"
148
+ "@ds-mo/icons ^6.3.0"
149
149
  ],
150
150
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
151
151
  }
@@ -95,7 +95,7 @@
95
95
  "peerDependencies": {
96
96
  "required": [
97
97
  "@ds-mo/tokens ^3.1.1",
98
- "@ds-mo/icons ^6.2.0"
98
+ "@ds-mo/icons ^6.3.0"
99
99
  ],
100
100
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
101
101
  }
@@ -231,7 +231,7 @@
231
231
  "peerDependencies": {
232
232
  "required": [
233
233
  "@ds-mo/tokens ^3.1.1",
234
- "@ds-mo/icons ^6.2.0"
234
+ "@ds-mo/icons ^6.3.0"
235
235
  ],
236
236
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
237
237
  }
@@ -181,7 +181,7 @@
181
181
  "peerDependencies": {
182
182
  "required": [
183
183
  "@ds-mo/tokens ^3.1.1",
184
- "@ds-mo/icons ^6.2.0"
184
+ "@ds-mo/icons ^6.3.0"
185
185
  ],
186
186
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
187
187
  }
@@ -127,7 +127,7 @@
127
127
  "peerDependencies": {
128
128
  "required": [
129
129
  "@ds-mo/tokens ^3.1.1",
130
- "@ds-mo/icons ^6.2.0"
130
+ "@ds-mo/icons ^6.3.0"
131
131
  ],
132
132
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
133
133
  }
@@ -333,7 +333,7 @@
333
333
  "peerDependencies": {
334
334
  "required": [
335
335
  "@ds-mo/tokens ^3.1.1",
336
- "@ds-mo/icons ^6.2.0"
336
+ "@ds-mo/icons ^6.3.0"
337
337
  ],
338
338
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
339
339
  }
@@ -246,7 +246,7 @@
246
246
  "peerDependencies": {
247
247
  "required": [
248
248
  "@ds-mo/tokens ^3.1.1",
249
- "@ds-mo/icons ^6.2.0"
249
+ "@ds-mo/icons ^6.3.0"
250
250
  ],
251
251
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
252
252
  }
@@ -121,7 +121,7 @@
121
121
  "peerDependencies": {
122
122
  "required": [
123
123
  "@ds-mo/tokens ^3.1.1",
124
- "@ds-mo/icons ^6.2.0"
124
+ "@ds-mo/icons ^6.3.0"
125
125
  ],
126
126
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
127
127
  }
@@ -36,10 +36,10 @@
36
36
  ],
37
37
  "states": [
38
38
  "Rows reuse the md choice-item label/subtext recipe used by Menu, including 6px row padding, 2px text inset, and the shared content gap. The enclosing conversation-list scroll region supplies the larger 8px outer container padding.",
39
- "Busy and error are generic channel-neutral states; the owning product supplies suitable status wording.",
39
+ "Busy and error are generic channel-neutral states; the owning product supplies suitable status wording. A busy row pairs its body-small status with the sm 16px Loader at an 8px gap.",
40
40
  "Any positive unreadCount renders one dot on the title row rather than a visible counter; the accessible row name may still announce the exact unread quantity.",
41
41
  "Hover and press use the shared interaction hover and pressed overlays. Only the selected conversation uses the persistent active fill.",
42
- "The title uses body-medium emphasis, not title-small, and the body-small preview truncates after one line. Unread titles use primary foreground; read titles use secondary foreground.",
42
+ "The title uses body-medium, not title-small, and the body-small preview truncates after one line. Unread titles use emphasis with primary foreground; read titles use regular weight with secondary foreground.",
43
43
  "The actions slot overlays the row at an 8px right inset without changing title or preview measure, and paints above the row interaction wash while that wash remains active."
44
44
  ],
45
45
  "responsiveBehavior": [
@@ -253,7 +253,7 @@
253
253
  "peerDependencies": {
254
254
  "required": [
255
255
  "@ds-mo/tokens ^3.1.1",
256
- "@ds-mo/icons ^6.2.0"
256
+ "@ds-mo/icons ^6.3.0"
257
257
  ],
258
258
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
259
259
  }
@@ -271,12 +271,12 @@
271
271
  "files": [
272
272
  {
273
273
  "path": "src/wc/components/ConversationListItem/ConversationListItem.css",
274
- "content": "@import '../../utils/choice-list.css';\n\n:host {\n display: block;\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.conversation-list-item__row {\n position: relative;\n isolation: isolate;\n}\n\n.conversation-list-item {\n color: var(--color-foreground-primary);\n}\n\n.conversation-list-item--error {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--color-border-bold-negative);\n}\n\n.conversation-list-item__leading:empty,\n.conversation-list-item__trailing:empty {\n display: none;\n}\n\n.conversation-list-item__leading,\n.conversation-list-item__trailing,\n.conversation-list-item__preview-row {\n display: flex;\n align-items: center;\n}\n\n.conversation-list-item__leading {\n align-self: center;\n width: auto;\n height: auto;\n margin-inline-start: var(--ds-control-label-inset, var(--dimension-space-025));\n margin-inline-end: var(--dimension-space-050);\n}\n\n.conversation-list-item__content {\n min-width: 0;\n}\n\n.conversation-list-item__title-row {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.conversation-list-item__preview-row {\n min-width: 0;\n gap: var(--dimension-space-050);\n}\n\nds-text.conversation-list-item__title,\nds-text.conversation-list-item__preview {\n display: block;\n min-width: 0;\n}\n\nds-text.conversation-list-item__title {\n flex: 1;\n}\n\n.conversation-list-item__unread {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--dimension-size-200);\n margin-inline-end: var(--dimension-space-025);\n}\n\nds-text.conversation-list-item__preview.ds-choice-item__subtext {\n -webkit-line-clamp: 1;\n}\n\n.conversation-list-item__actions {\n position: absolute;\n top: 50%;\n right: var(--dimension-space-100);\n z-index: var(--dimension-z-index-floating);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--dimension-radius-half);\n background: var(--color-background-transparent);\n box-shadow: var(--effect-elevation-elevated-md);\n -webkit-backdrop-filter: blur(var(--effect-blur-sm));\n backdrop-filter: blur(var(--effect-blur-sm));\n opacity: 0;\n pointer-events: none;\n transform: translateY(-50%);\n}\n\n.conversation-list-item__row:hover .conversation-list-item__actions,\n.conversation-list-item__row:has(:focus-visible) .conversation-list-item__actions,\n:host(.conversation-list-item--actions-open) .conversation-list-item__actions {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* Keep the row wash continuous while the pointer moves onto its sibling action. */\n.conversation-list-item__row:hover .conversation-list-item::after {\n background: var(--ds-interaction-hover);\n}\n\n:host(.conversation-list-item--actions-open) .conversation-list-item::after {\n background: var(--ds-interaction-hover);\n}\n\n.conversation-list-item__row:active .conversation-list-item::after {\n background: var(--ds-interaction-pressed);\n}\n\n@media (hover: none) {\n .conversation-list-item__actions {\n opacity: 1;\n pointer-events: auto;\n }\n\n :host(.conversation-list-item--has-actions) .conversation-list-item__title-row {\n padding-inline-end: var(--dimension-size-400);\n }\n}\n\n.conversation-list-item__time {\n position: absolute;\n width: var(--dimension-size-050);\n height: var(--dimension-size-050);\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n",
274
+ "content": "@import '../../utils/choice-list.css';\n\n:host {\n display: block;\n box-sizing: border-box;\n -webkit-user-select: none;\n user-select: none;\n}\n\n.conversation-list-item__row {\n position: relative;\n isolation: isolate;\n}\n\n.conversation-list-item {\n color: var(--color-foreground-primary);\n}\n\n.conversation-list-item--error {\n --ds-interaction-border-width: var(--dimension-stroke-width-012);\n --ds-interaction-border-color: var(--color-border-bold-negative);\n}\n\n.conversation-list-item__leading:empty,\n.conversation-list-item__trailing:empty {\n display: none;\n}\n\n.conversation-list-item__leading,\n.conversation-list-item__trailing,\n.conversation-list-item__preview-row {\n display: flex;\n align-items: center;\n}\n\n.conversation-list-item__leading {\n align-self: center;\n width: auto;\n height: auto;\n margin-inline-start: var(--ds-control-label-inset, var(--dimension-space-025));\n margin-inline-end: var(--dimension-space-050);\n}\n\n.conversation-list-item__content {\n min-width: 0;\n}\n\n.conversation-list-item__title-row {\n display: flex;\n align-items: center;\n min-width: 0;\n}\n\n.conversation-list-item__preview-row {\n min-width: 0;\n gap: var(--dimension-space-100);\n}\n\nds-text.conversation-list-item__title,\nds-text.conversation-list-item__preview {\n display: block;\n min-width: 0;\n}\n\nds-text.conversation-list-item__title {\n flex: 1;\n}\n\n.conversation-list-item__unread {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: var(--dimension-size-200);\n margin-inline-end: var(--dimension-space-025);\n}\n\nds-text.conversation-list-item__preview.ds-choice-item__subtext {\n -webkit-line-clamp: 1;\n}\n\n.conversation-list-item__actions {\n position: absolute;\n top: 50%;\n right: var(--dimension-space-100);\n z-index: var(--dimension-z-index-floating);\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--dimension-radius-half);\n background: var(--color-background-transparent);\n box-shadow: var(--effect-elevation-elevated-md);\n -webkit-backdrop-filter: blur(var(--effect-blur-sm));\n backdrop-filter: blur(var(--effect-blur-sm));\n opacity: 0;\n pointer-events: none;\n transform: translateY(-50%);\n}\n\n.conversation-list-item__row:hover .conversation-list-item__actions,\n.conversation-list-item__row:has(:focus-visible) .conversation-list-item__actions,\n:host(.conversation-list-item--actions-open) .conversation-list-item__actions {\n opacity: 1;\n pointer-events: auto;\n}\n\n/* Keep the row wash continuous while the pointer moves onto its sibling action. */\n.conversation-list-item__row:hover .conversation-list-item::after {\n background: var(--ds-interaction-hover);\n}\n\n:host(.conversation-list-item--actions-open) .conversation-list-item::after {\n background: var(--ds-interaction-hover);\n}\n\n.conversation-list-item__row:active .conversation-list-item::after {\n background: var(--ds-interaction-pressed);\n}\n\n@media (hover: none) {\n .conversation-list-item__actions {\n opacity: 1;\n pointer-events: auto;\n }\n\n :host(.conversation-list-item--has-actions) .conversation-list-item__title-row {\n padding-inline-end: var(--dimension-size-400);\n }\n}\n\n.conversation-list-item__time {\n position: absolute;\n width: var(--dimension-size-050);\n height: var(--dimension-size-050);\n overflow: hidden;\n clip-path: inset(50%);\n white-space: nowrap;\n}\n",
275
275
  "type": "registry:ui"
276
276
  },
277
277
  {
278
278
  "path": "src/wc/components/ConversationListItem/ConversationListItem.tsx",
279
- "content": "import { Component, Element, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport type { ConversationItemState } from '../conversation-types';\n\n@Component({\n tag: 'ds-conversation-list-item',\n styleUrl: 'ConversationListItem.css',\n scoped: true,\n})\nexport class ConversationListItem {\n @Element() el!: HTMLElement;\n\n @Prop() conversationId: string = '';\n /** Visible conversation title. Named to avoid the native HTMLElement.title contract. */\n @Prop() conversationTitle: string = '';\n @Prop() preview: string = '';\n /** ISO timestamp for semantic activity metadata. */\n @Prop() updatedAt: string = '';\n @Prop() selected: boolean = false;\n @Prop() state: ConversationItemState = 'default';\n @Prop() statusLabel: string = '';\n @Prop() unreadCount: number = 0;\n /** Keep the contextual-actions surface visible while its popup is open or closing. */\n @Prop({ reflect: true }) actionsOpen: boolean = false;\n\n @Event() dsSelect!: EventEmitter<{ id: string }>;\n\n private handleClick = () => this.dsSelect.emit({ id: this.conversationId });\n\n private handleActionsSlotChange = (event: Event) => {\n const slot = event.target as HTMLSlotElement;\n this.el.classList.toggle(\n 'conversation-list-item--has-actions',\n slot.assignedElements({ flatten: true }).length > 0\n );\n };\n\n render() {\n const busy = this.state === 'busy';\n const subtext = busy && this.statusLabel ? this.statusLabel : this.preview;\n const accessibleName = [\n this.conversationTitle,\n subtext,\n this.unreadCount > 0 ? `${this.unreadCount} unread` : '',\n ]\n .filter(Boolean)\n .join('. ');\n\n return (\n <Host\n role=\"listitem\"\n class={{ 'conversation-list-item--actions-open': this.actionsOpen }}\n >\n <div class=\"conversation-list-item__row\">\n <button\n type=\"button\"\n class={{\n 'conversation-list-item': true,\n 'ds-choice-item': true,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': this.selected,\n 'conversation-list-item--error': this.state === 'error',\n }}\n aria-label={accessibleName}\n aria-current={this.selected ? 'true' : undefined}\n aria-busy={busy ? 'true' : undefined}\n onClick={this.handleClick}\n >\n <span class=\"conversation-list-item__leading ds-choice-item__icon ds-interaction-fill__content\">\n <slot name=\"leading\" />\n </span>\n <span class=\"conversation-list-item__content ds-choice-item__content ds-interaction-fill__content\">\n <span class=\"conversation-list-item__title-row\">\n <ds-text\n class=\"conversation-list-item__title ds-choice-item__label\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis\n color={this.unreadCount > 0 ? 'primary' : 'secondary'}\n lineTruncation={1}\n >\n {this.conversationTitle}\n </ds-text>\n {this.unreadCount > 0 ? (\n <span class=\"conversation-list-item__unread\">\n <ds-badge variant=\"dot\" surface=\"secondary\" />\n </span>\n ) : null}\n </span>\n <span class=\"conversation-list-item__preview-row\">\n {busy ? <ds-loader size=\"xs\" color=\"secondary\" /> : null}\n <ds-text\n class=\"conversation-list-item__preview ds-choice-item__subtext\"\n as=\"span\"\n variant=\"text-body-small\"\n color={this.state === 'error' ? 'negative' : 'secondary'}\n lineTruncation={1}\n >\n {subtext}\n </ds-text>\n </span>\n {this.updatedAt ? (\n <time class=\"conversation-list-item__time\" dateTime={this.updatedAt}>\n {this.updatedAt}\n </time>\n ) : null}\n </span>\n <span class=\"conversation-list-item__trailing ds-interaction-fill__content\">\n <slot name=\"trailing\" />\n </span>\n </button>\n <div class=\"conversation-list-item__actions\">\n <slot name=\"actions\" onSlotchange={this.handleActionsSlotChange} />\n </div>\n </div>\n </Host>\n );\n }\n}\n",
279
+ "content": "import { Component, Element, Event, EventEmitter, h, Host, Prop } from '@stencil/core';\nimport type { ConversationItemState } from '../conversation-types';\n\n@Component({\n tag: 'ds-conversation-list-item',\n styleUrl: 'ConversationListItem.css',\n scoped: true,\n})\nexport class ConversationListItem {\n @Element() el!: HTMLElement;\n\n @Prop() conversationId: string = '';\n /** Visible conversation title. Named to avoid the native HTMLElement.title contract. */\n @Prop() conversationTitle: string = '';\n @Prop() preview: string = '';\n /** ISO timestamp for semantic activity metadata. */\n @Prop() updatedAt: string = '';\n @Prop() selected: boolean = false;\n @Prop() state: ConversationItemState = 'default';\n @Prop() statusLabel: string = '';\n @Prop() unreadCount: number = 0;\n /** Keep the contextual-actions surface visible while its popup is open or closing. */\n @Prop({ reflect: true }) actionsOpen: boolean = false;\n\n @Event() dsSelect!: EventEmitter<{ id: string }>;\n\n private handleClick = () => this.dsSelect.emit({ id: this.conversationId });\n\n private handleActionsSlotChange = (event: Event) => {\n const slot = event.target as HTMLSlotElement;\n this.el.classList.toggle(\n 'conversation-list-item--has-actions',\n slot.assignedElements({ flatten: true }).length > 0\n );\n };\n\n render() {\n const busy = this.state === 'busy';\n const subtext = busy && this.statusLabel ? this.statusLabel : this.preview;\n const accessibleName = [\n this.conversationTitle,\n subtext,\n this.unreadCount > 0 ? `${this.unreadCount} unread` : '',\n ]\n .filter(Boolean)\n .join('. ');\n\n return (\n <Host\n role=\"listitem\"\n class={{ 'conversation-list-item--actions-open': this.actionsOpen }}\n >\n <div class=\"conversation-list-item__row\">\n <button\n type=\"button\"\n class={{\n 'conversation-list-item': true,\n 'ds-choice-item': true,\n 'ds-control--md': true,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n 'ds-interaction-fill--selected': this.selected,\n 'conversation-list-item--error': this.state === 'error',\n }}\n aria-label={accessibleName}\n aria-current={this.selected ? 'true' : undefined}\n aria-busy={busy ? 'true' : undefined}\n onClick={this.handleClick}\n >\n <span class=\"conversation-list-item__leading ds-choice-item__icon ds-interaction-fill__content\">\n <slot name=\"leading\" />\n </span>\n <span class=\"conversation-list-item__content ds-choice-item__content ds-interaction-fill__content\">\n <span class=\"conversation-list-item__title-row\">\n <ds-text\n class=\"conversation-list-item__title ds-choice-item__label\"\n as=\"span\"\n variant=\"text-body-medium\"\n emphasis={this.unreadCount > 0}\n color={this.unreadCount > 0 ? 'primary' : 'secondary'}\n lineTruncation={1}\n >\n {this.conversationTitle}\n </ds-text>\n {this.unreadCount > 0 ? (\n <span class=\"conversation-list-item__unread\">\n <ds-badge variant=\"dot\" surface=\"secondary\" />\n </span>\n ) : null}\n </span>\n <span class=\"conversation-list-item__preview-row\">\n {busy ? <ds-loader size=\"sm\" color=\"secondary\" /> : null}\n <ds-text\n class=\"conversation-list-item__preview ds-choice-item__subtext\"\n as=\"span\"\n variant=\"text-body-small\"\n color={this.state === 'error' ? 'negative' : 'secondary'}\n lineTruncation={1}\n >\n {subtext}\n </ds-text>\n </span>\n {this.updatedAt ? (\n <time class=\"conversation-list-item__time\" dateTime={this.updatedAt}>\n {this.updatedAt}\n </time>\n ) : null}\n </span>\n <span class=\"conversation-list-item__trailing ds-interaction-fill__content\">\n <slot name=\"trailing\" />\n </span>\n </button>\n <div class=\"conversation-list-item__actions\">\n <slot name=\"actions\" onSlotchange={this.handleActionsSlotChange} />\n </div>\n </div>\n </Host>\n );\n }\n}\n",
280
280
  "type": "registry:ui"
281
281
  }
282
282
  ]
@@ -111,7 +111,7 @@
111
111
  "peerDependencies": {
112
112
  "required": [
113
113
  "@ds-mo/tokens ^3.1.1",
114
- "@ds-mo/icons ^6.2.0"
114
+ "@ds-mo/icons ^6.3.0"
115
115
  ],
116
116
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
117
117
  }
@@ -75,7 +75,7 @@
75
75
  "peerDependencies": {
76
76
  "required": [
77
77
  "@ds-mo/tokens ^3.1.1",
78
- "@ds-mo/icons ^6.2.0"
78
+ "@ds-mo/icons ^6.3.0"
79
79
  ],
80
80
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
81
81
  }
@@ -27,9 +27,9 @@
27
27
  ],
28
28
  "alternatives": [
29
29
  {
30
- "when": "Content needs an enclosing surface and outer boundary.",
31
- "component": "component:ds-card",
32
- "reason": "Card owns container chrome, structure, and edge treatment."
30
+ "when": "Editable settings need an enclosing section surface and outer boundary.",
31
+ "component": "component:ds-card-setting",
32
+ "reason": "CardSetting owns settings-section chrome, structure, and edge treatment."
33
33
  },
34
34
  {
35
35
  "when": "A static compact label is being used to name a group.",
@@ -38,7 +38,7 @@
38
38
  }
39
39
  ],
40
40
  "commonlyComposedWith": [
41
- "component:ds-card",
41
+ "component:ds-card-setting",
42
42
  "component:ds-menu",
43
43
  "component:ds-panel-sub-nav"
44
44
  ],
@@ -199,7 +199,7 @@
199
199
  "peerDependencies": {
200
200
  "required": [
201
201
  "@ds-mo/tokens ^3.1.1",
202
- "@ds-mo/icons ^6.2.0"
202
+ "@ds-mo/icons ^6.3.0"
203
203
  ],
204
204
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
205
205
  }
@@ -167,7 +167,7 @@
167
167
  "peerDependencies": {
168
168
  "required": [
169
169
  "@ds-mo/tokens ^3.1.1",
170
- "@ds-mo/icons ^6.2.0"
170
+ "@ds-mo/icons ^6.3.0"
171
171
  ],
172
172
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
173
173
  }
@@ -194,7 +194,7 @@
194
194
  "peerDependencies": {
195
195
  "required": [
196
196
  "@ds-mo/tokens ^3.1.1",
197
- "@ds-mo/icons ^6.2.0"
197
+ "@ds-mo/icons ^6.3.0"
198
198
  ],
199
199
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
200
200
  }