@ds-mo/ui 14.27.1 → 14.29.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 (338) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +28 -18
  3. package/dist/agent.json +436 -33
  4. package/dist/angular/ds-button-filled.d.ts +1 -1
  5. package/dist/angular/ds-button-filled.js +3 -3
  6. package/dist/angular/ds-button-unfilled.d.ts +1 -1
  7. package/dist/angular/ds-button-unfilled.js +3 -3
  8. package/dist/angular/ds-card-navigation.d.ts +20 -0
  9. package/dist/angular/ds-card-navigation.js +42 -0
  10. package/dist/angular/ds-card-settings-scope.d.ts +19 -0
  11. package/dist/angular/ds-card-settings-scope.js +42 -0
  12. package/dist/angular/ds-menu.d.ts +1 -1
  13. package/dist/angular/ds-menu.js +3 -3
  14. package/dist/angular/ds-mobile-bar-nav.d.ts +1 -1
  15. package/dist/angular/ds-mobile-bar-nav.js +3 -3
  16. package/dist/angular/ds-mobile-header.d.ts +1 -1
  17. package/dist/angular/ds-mobile-header.js +3 -3
  18. package/dist/angular/ds-mobile-section-switcher.d.ts +1 -1
  19. package/dist/angular/ds-mobile-section-switcher.js +3 -3
  20. package/dist/angular/ds-mobile-sheet-nav.d.ts +7 -1
  21. package/dist/angular/ds-mobile-sheet-nav.js +7 -4
  22. package/dist/angular/ds-panel-nav.d.ts +1 -1
  23. package/dist/angular/ds-panel-nav.js +3 -3
  24. package/dist/angular/ds-panel-tool-header.d.ts +1 -1
  25. package/dist/angular/ds-panel-tool-header.js +3 -3
  26. package/dist/angular/ds-panel-tool-search.d.ts +1 -1
  27. package/dist/angular/ds-panel-tool-search.js +3 -3
  28. package/dist/angular/ds-table.d.ts +1 -1
  29. package/dist/angular/ds-table.js +3 -3
  30. package/dist/angular/ds-tag.d.ts +1 -1
  31. package/dist/angular/ds-tag.js +3 -3
  32. package/dist/angular/index.d.ts +1 -1
  33. package/dist/angular/index.js +2 -0
  34. package/dist/angular/proxies.d.ts +2 -0
  35. package/dist/angular/proxies.js +2 -0
  36. package/dist/components/ds-agent-activity.js +1 -1
  37. package/dist/components/ds-agent-questionnaire.js +1 -1
  38. package/dist/components/ds-agent-response.js +1 -1
  39. package/dist/components/ds-agent-source-list.js +1 -1
  40. package/dist/components/ds-agent-tool-call.js +1 -1
  41. package/dist/components/ds-attachment-list.js +1 -1
  42. package/dist/components/ds-badge.js +1 -1
  43. package/dist/components/ds-banner.js +1 -1
  44. package/dist/components/ds-bar-action.js +1 -1
  45. package/dist/components/ds-bar-nav.js +1 -1
  46. package/dist/components/ds-bar-title.js +1 -1
  47. package/dist/components/ds-bar-workflow.js +1 -1
  48. package/dist/components/ds-breadcrumb.js +1 -1
  49. package/dist/components/ds-button-filled.js +1 -1
  50. package/dist/components/ds-button-unfilled.js +1 -1
  51. package/dist/components/ds-card-chart.js +1 -1
  52. package/dist/components/ds-card-navigation.d.ts +11 -0
  53. package/dist/components/ds-card-navigation.js +2 -0
  54. package/dist/components/ds-card-navigation.js.map +1 -0
  55. package/dist/components/ds-card-overview.js +1 -1
  56. package/dist/components/ds-card-overview.js.map +1 -1
  57. package/dist/components/ds-card-setting.js +1 -1
  58. package/dist/components/ds-card-settings-scope.d.ts +11 -0
  59. package/dist/components/ds-card-settings-scope.js +2 -0
  60. package/dist/components/ds-card-settings-scope.js.map +1 -0
  61. package/dist/components/ds-chart-legend.js +1 -1
  62. package/dist/components/ds-chart-legend.js.map +1 -1
  63. package/dist/components/ds-chart.js +1 -1
  64. package/dist/components/ds-checkbox.js +1 -1
  65. package/dist/components/ds-chip.js +1 -1
  66. package/dist/components/ds-code-block.js +1 -1
  67. package/dist/components/ds-conversation-list-item.js +1 -1
  68. package/dist/components/ds-conversation-list-item.js.map +1 -1
  69. package/dist/components/ds-conversation-list-section.js +1 -1
  70. package/dist/components/ds-conversation-list.js +1 -1
  71. package/dist/components/ds-divider.js +1 -1
  72. package/dist/components/ds-empty-state.js +1 -1
  73. package/dist/components/ds-field.js +1 -1
  74. package/dist/components/ds-filter-menu.js +1 -1
  75. package/dist/components/ds-input.js +1 -1
  76. package/dist/components/ds-markdown.js +1 -1
  77. package/dist/components/ds-menu.js +1 -1
  78. package/dist/components/ds-message-actions.js +1 -1
  79. package/dist/components/ds-message-bubble.js +1 -1
  80. package/dist/components/ds-message-composer.js +1 -1
  81. package/dist/components/ds-message-scroller.js +1 -1
  82. package/dist/components/ds-message.js +1 -1
  83. package/dist/components/ds-mobile-bar-nav.js +1 -1
  84. package/dist/components/ds-mobile-header.js +1 -1
  85. package/dist/components/ds-mobile-section-switcher.js +1 -1
  86. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  87. package/dist/components/ds-modal.js +1 -1
  88. package/dist/components/ds-pagination.js +1 -1
  89. package/dist/components/ds-panel-nav.js +1 -1
  90. package/dist/components/ds-panel-sub-nav.js +1 -1
  91. package/dist/components/ds-panel-sub-nav.js.map +1 -1
  92. package/dist/components/ds-panel-tool-header.js +1 -1
  93. package/dist/components/ds-panel-tool-search.js +1 -1
  94. package/dist/components/ds-panel-tool-search.js.map +1 -1
  95. package/dist/components/ds-panel-tools.js +1 -1
  96. package/dist/components/ds-paper-texture.js +1 -1
  97. package/dist/components/ds-radio.js +1 -1
  98. package/dist/components/ds-score.js +1 -1
  99. package/dist/components/ds-scroll-overlay.js +1 -1
  100. package/dist/components/ds-select.js +1 -1
  101. package/dist/components/ds-shell-app.js +1 -1
  102. package/dist/components/ds-shell-app.js.map +1 -1
  103. package/dist/components/ds-shell-page.js +1 -1
  104. package/dist/components/ds-shell-tools.js +1 -1
  105. package/dist/components/ds-skeleton.js +1 -1
  106. package/dist/components/ds-slider.js +1 -1
  107. package/dist/components/ds-swatch-picker.js +1 -1
  108. package/dist/components/ds-switch.js +1 -1
  109. package/dist/components/ds-tab-group.js +1 -1
  110. package/dist/components/ds-table-filter.js +1 -1
  111. package/dist/components/ds-table-group.js +1 -1
  112. package/dist/components/ds-table-group.js.map +1 -1
  113. package/dist/components/ds-table-saved-views.js +1 -1
  114. package/dist/components/ds-table-saved-views.js.map +1 -1
  115. package/dist/components/ds-table-search.js +1 -1
  116. package/dist/components/ds-table-search.js.map +1 -1
  117. package/dist/components/ds-table-sort.js +1 -1
  118. package/dist/components/ds-table-sort.js.map +1 -1
  119. package/dist/components/ds-table-toolbar.js +1 -1
  120. package/dist/components/ds-table.js +1 -1
  121. package/dist/components/ds-table.js.map +1 -1
  122. package/dist/components/ds-tag.js +1 -1
  123. package/dist/components/ds-text.js +1 -1
  124. package/dist/components/ds-textarea.js +1 -1
  125. package/dist/components/ds-textarea.js.map +1 -1
  126. package/dist/components/ds-toast.js +1 -1
  127. package/dist/components/ds-tooltip-chart.js +1 -1
  128. package/dist/components/ds-tooltip.js +1 -1
  129. package/dist/components/ds-typing-indicator.js +1 -1
  130. package/dist/components/p--yvQzZoO.js +2 -0
  131. package/dist/components/p--yvQzZoO.js.map +1 -0
  132. package/dist/components/{p-Is1lFmwp.js → p-1gt8QlyW.js} +2 -2
  133. package/dist/components/p-B5AZd41L.js +2 -0
  134. package/dist/components/p-B5AZd41L.js.map +1 -0
  135. package/dist/components/p-B5eMVBlz.js +2 -0
  136. package/dist/components/p-B5eMVBlz.js.map +1 -0
  137. package/dist/components/{p-Q7AOgrg5.js → p-BCFpqnAg.js} +2 -2
  138. package/dist/components/p-BFHWoNH3.js +2 -0
  139. package/dist/components/{p-BVz-r3g0.js.map → p-BFHWoNH3.js.map} +1 -1
  140. package/dist/components/p-BGnRFtBa.js +2 -0
  141. package/dist/components/p-BGnRFtBa.js.map +1 -0
  142. package/dist/components/p-BIDGQ4tc.js +2 -0
  143. package/dist/components/p-BIDGQ4tc.js.map +1 -0
  144. package/dist/components/{p-Ctnm9NJP.js → p-BLTHIBsE.js} +2 -2
  145. package/dist/components/{p-C68oSTb1.js → p-BXT2opmZ.js} +2 -2
  146. package/dist/components/p-BZDQLjE0.js +2 -0
  147. package/dist/components/p-BZDQLjE0.js.map +1 -0
  148. package/dist/components/{p-Q0dkeoJ6.js → p-BdC7wxhu.js} +2 -2
  149. package/dist/components/{p-Q0dkeoJ6.js.map → p-BdC7wxhu.js.map} +1 -1
  150. package/dist/components/p-BfVlFinS.js +2 -0
  151. package/dist/components/{p-CQjUOHiN.js.map → p-BfVlFinS.js.map} +1 -1
  152. package/dist/components/{p-DGkn8FwV.js → p-Bl5wd3v3.js} +2 -2
  153. package/dist/components/p-BmRHJ_jo.js +2 -0
  154. package/dist/components/p-BmRHJ_jo.js.map +1 -0
  155. package/dist/components/{p-Bb9dA7sl.js → p-BpB2EF9g.js} +2 -2
  156. package/dist/components/{p-2wIPUcSL.js → p-BwAWZAHk.js} +2 -2
  157. package/dist/components/{p-B3sRZBZk.js → p-By5TDnbF.js} +2 -2
  158. package/dist/components/{p-BVpn_e-r.js → p-CDXcINTO.js} +2 -2
  159. package/dist/components/p-CDXcINTO.js.map +1 -0
  160. package/dist/components/{p-B3Z5sQin.js → p-CE8gsv7V.js} +2 -2
  161. package/dist/components/p-CLcwh1kq.js +2 -0
  162. package/dist/components/p-CLcwh1kq.js.map +1 -0
  163. package/dist/components/{p-DW8ssbfI.js → p-CN8PQLZu.js} +2 -2
  164. package/dist/components/p-CcK3UiTu.js +2 -0
  165. package/dist/components/{p-1604KY3B.js.map → p-CcK3UiTu.js.map} +1 -1
  166. package/dist/components/{p-CaF5WCci.js → p-Cocq-utR.js} +2 -2
  167. package/dist/components/p-Cr5vn5JO.js +2 -0
  168. package/dist/components/{p-to8BxxgT.js.map → p-Cr5vn5JO.js.map} +1 -1
  169. package/dist/components/{p-Cf5Ai4xx.js → p-Crd3PEUx.js} +2 -2
  170. package/dist/components/{p-Cf5Ai4xx.js.map → p-Crd3PEUx.js.map} +1 -1
  171. package/dist/components/{p-BZiGtBBk.js → p-Ct90k-nz.js} +2 -2
  172. package/dist/components/p-Cx2dWjaW.js +2 -0
  173. package/dist/components/p-Cx2dWjaW.js.map +1 -0
  174. package/dist/components/p-CyoLh8su.js +2 -0
  175. package/dist/components/p-CyoLh8su.js.map +1 -0
  176. package/dist/components/{p-BXDLR072.js → p-CysCSinT.js} +2 -2
  177. package/dist/components/{p-BXDLR072.js.map → p-CysCSinT.js.map} +1 -1
  178. package/dist/components/p-CzbsTZt7.js.map +1 -1
  179. package/dist/components/p-D1pPq-y0.js +2 -0
  180. package/dist/components/p-D1pPq-y0.js.map +1 -0
  181. package/dist/components/{p-VT-5XDkB.js → p-DDOuPq-N.js} +2 -2
  182. package/dist/components/{p-DkxOEFHN.js → p-DF8W85Tz.js} +2 -2
  183. package/dist/components/{p-DDqRCDXh.js → p-DSJSnQ1U.js} +2 -2
  184. package/dist/components/{p-Cr6pDY-e.js → p-DYK0slTb.js} +2 -2
  185. package/dist/components/{p-D9wZlB_N.js → p-D_QtZZR8.js} +2 -2
  186. package/dist/components/{p-Bv6FSDPR.js → p-DbDYEEWq.js} +2 -2
  187. package/dist/components/{p-BEXkJ9lg.js → p-DnQN0pLp.js} +2 -2
  188. package/dist/components/{p-DIqAdmui.js → p-FiM3rF7B.js} +2 -2
  189. package/dist/components/p-GbtafFds.js +2 -0
  190. package/dist/components/p-GbtafFds.js.map +1 -0
  191. package/dist/components/{p-WFo1x6dN.js → p-Hzz2j1Je.js} +2 -2
  192. package/dist/components/{p-B9esvbYk.js → p-K39w53Bw.js} +2 -2
  193. package/dist/components/p-K39w53Bw.js.map +1 -0
  194. package/dist/components/{p-DQQsS9Rx.js → p-aMyflqva.js} +2 -2
  195. package/dist/components/{p-DZcIt_JJ.js → p-dgep63_i.js} +2 -2
  196. package/dist/components/p-frKsmPQn.js +2 -0
  197. package/dist/components/p-frKsmPQn.js.map +1 -0
  198. package/dist/components/{p-BMzn2Cmw.js → p-rSC7ZUpy.js} +2 -2
  199. package/dist/docs/components.json +1025 -44
  200. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +11 -3
  201. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +2 -0
  202. package/dist/lib/components/ShellApp/shell-app-types.d.ts +2 -0
  203. package/dist/lib/shell/index.js.map +1 -1
  204. package/dist/lib/utils/choice-list.d.ts +2 -0
  205. package/dist/mcp-data/registry/bar-nav.json +7 -2
  206. package/dist/mcp-data/registry/bar-title.json +8 -3
  207. package/dist/mcp-data/registry/button-filled.json +26 -5
  208. package/dist/mcp-data/registry/button-unfilled.json +27 -6
  209. package/dist/mcp-data/registry/card-navigation.json +255 -0
  210. package/dist/mcp-data/registry/card-settings-scope.json +314 -0
  211. package/dist/mcp-data/registry/filter-menu.json +7 -2
  212. package/dist/mcp-data/registry/menu.json +21 -2
  213. package/dist/mcp-data/registry/mobile-bar-nav.json +20 -1
  214. package/dist/mcp-data/registry/mobile-header.json +23 -3
  215. package/dist/mcp-data/registry/mobile-section-switcher.json +50 -6
  216. package/dist/mcp-data/registry/mobile-sheet-nav.json +40 -3
  217. package/dist/mcp-data/registry/panel-nav.json +27 -6
  218. package/dist/mcp-data/registry/panel-tool-header.json +23 -2
  219. package/dist/mcp-data/registry/panel-tool-search.json +23 -2
  220. package/dist/mcp-data/registry/panel-tools.json +7 -2
  221. package/dist/mcp-data/registry/registry.json +441 -32
  222. package/dist/mcp-data/registry/select.json +8 -3
  223. package/dist/mcp-data/registry/shell-app.json +14 -8
  224. package/dist/mcp-data/registry/shell-tools.json +7 -2
  225. package/dist/mcp-data/registry/table-group.json +7 -2
  226. package/dist/mcp-data/registry/table-saved-views.json +7 -2
  227. package/dist/mcp-data/registry/table-search.json +7 -2
  228. package/dist/mcp-data/registry/table-sort.json +7 -2
  229. package/dist/mcp-data/registry/table.json +24 -3
  230. package/dist/mcp-data/registry/tag.json +24 -3
  231. package/dist/react/components.d.ts +2 -0
  232. package/dist/react/components.js +2 -0
  233. package/dist/react/ds-card-navigation.d.ts +12 -0
  234. package/dist/react/ds-card-navigation.js +12 -0
  235. package/dist/react/ds-card-settings-scope.d.ts +12 -0
  236. package/dist/react/ds-card-settings-scope.js +12 -0
  237. package/dist/react/ds-mobile-sheet-nav.d.ts +2 -1
  238. package/dist/react/ds-mobile-sheet-nav.js +1 -0
  239. package/dist/styles/table.css +1 -0
  240. package/dist/types/components/BarTitle/BarTitle.d.ts +3 -0
  241. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +11 -3
  242. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +11 -5
  243. package/dist/types/components/CardNavigation/CardNavigation.d.ts +31 -0
  244. package/dist/types/components/CardNavigation/index.d.ts +2 -0
  245. package/dist/types/components/CardSettingsScope/CardSettingsScope.d.ts +33 -0
  246. package/dist/types/components/CardSettingsScope/index.d.ts +2 -0
  247. package/dist/types/components/Menu/Menu.d.ts +4 -0
  248. package/dist/types/components/MobileBarNav/MobileBarNav.d.ts +2 -0
  249. package/dist/types/components/MobileHeader/MobileHeader.d.ts +3 -0
  250. package/dist/types/components/MobileSectionSwitcher/MobileSectionSwitcher.d.ts +19 -0
  251. package/dist/types/components/MobileSheetNav/MobileSheetNav.d.ts +15 -2
  252. package/dist/types/components/PanelNav/PanelNav.d.ts +4 -1
  253. package/dist/types/components/PanelToolHeader/PanelToolHeader.d.ts +2 -0
  254. package/dist/types/components/PanelToolSearch/PanelToolSearch.d.ts +2 -0
  255. package/dist/types/components/PanelTools/panel-tools-types.d.ts +2 -0
  256. package/dist/types/components/ShellApp/ShellApp.d.ts +5 -2
  257. package/dist/types/components/ShellApp/shell-app-types.d.ts +2 -0
  258. package/dist/types/components/Table/Table.d.ts +10 -0
  259. package/dist/types/components/Table/table-row-view.d.ts +6 -1
  260. package/dist/types/components/TableSort/TableSort.d.ts +1 -0
  261. package/dist/types/components/Tag/Tag.d.ts +3 -0
  262. package/dist/types/components.d.ts +369 -8
  263. package/dist/types/utils/choice-list.d.ts +2 -0
  264. package/dist/vue/components.d.ts +2 -0
  265. package/dist/vue/components.js +2 -0
  266. package/dist/vue/ds-button-filled.js +1 -0
  267. package/dist/vue/ds-button-unfilled.js +1 -0
  268. package/dist/vue/ds-card-navigation.d.ts +3 -0
  269. package/dist/vue/ds-card-navigation.js +15 -0
  270. package/dist/vue/ds-card-settings-scope.d.ts +3 -0
  271. package/dist/vue/ds-card-settings-scope.js +20 -0
  272. package/dist/vue/ds-menu.js +1 -0
  273. package/dist/vue/ds-mobile-bar-nav.js +1 -0
  274. package/dist/vue/ds-mobile-header.js +1 -0
  275. package/dist/vue/ds-mobile-section-switcher.js +2 -0
  276. package/dist/vue/ds-mobile-sheet-nav.js +3 -0
  277. package/dist/vue/ds-panel-nav.js +1 -0
  278. package/dist/vue/ds-panel-tool-header.js +1 -0
  279. package/dist/vue/ds-panel-tool-search.js +1 -0
  280. package/dist/vue/ds-table.js +1 -0
  281. package/dist/vue/ds-tag.js +1 -0
  282. package/package.json +1 -1
  283. package/dist/components/p-1604KY3B.js +0 -2
  284. package/dist/components/p-537t6oRD.js +0 -2
  285. package/dist/components/p-537t6oRD.js.map +0 -1
  286. package/dist/components/p-6_CNVbqa.js +0 -2
  287. package/dist/components/p-6_CNVbqa.js.map +0 -1
  288. package/dist/components/p-B9esvbYk.js.map +0 -1
  289. package/dist/components/p-BIGpc__9.js +0 -2
  290. package/dist/components/p-BIGpc__9.js.map +0 -1
  291. package/dist/components/p-BRLDf-NK.js +0 -2
  292. package/dist/components/p-BRLDf-NK.js.map +0 -1
  293. package/dist/components/p-BUh2GkPJ.js +0 -2
  294. package/dist/components/p-BUh2GkPJ.js.map +0 -1
  295. package/dist/components/p-BVpn_e-r.js.map +0 -1
  296. package/dist/components/p-BVz-r3g0.js +0 -2
  297. package/dist/components/p-Bjt_8sLe.js +0 -2
  298. package/dist/components/p-Bjt_8sLe.js.map +0 -1
  299. package/dist/components/p-BssZ4SbT.js +0 -2
  300. package/dist/components/p-BssZ4SbT.js.map +0 -1
  301. package/dist/components/p-CGQnHNuW.js +0 -2
  302. package/dist/components/p-CGQnHNuW.js.map +0 -1
  303. package/dist/components/p-CQjUOHiN.js +0 -2
  304. package/dist/components/p-Cy1oWIaV.js +0 -2
  305. package/dist/components/p-Cy1oWIaV.js.map +0 -1
  306. package/dist/components/p-DQsFmleZ.js +0 -2
  307. package/dist/components/p-DQsFmleZ.js.map +0 -1
  308. package/dist/components/p-DlbhmXjH.js +0 -2
  309. package/dist/components/p-DlbhmXjH.js.map +0 -1
  310. package/dist/components/p-GEi3hDJQ.js +0 -2
  311. package/dist/components/p-GEi3hDJQ.js.map +0 -1
  312. package/dist/components/p-LMmrjmI_.js +0 -2
  313. package/dist/components/p-LMmrjmI_.js.map +0 -1
  314. package/dist/components/p-to8BxxgT.js +0 -2
  315. /package/dist/components/{p-Is1lFmwp.js.map → p-1gt8QlyW.js.map} +0 -0
  316. /package/dist/components/{p-Q7AOgrg5.js.map → p-BCFpqnAg.js.map} +0 -0
  317. /package/dist/components/{p-Ctnm9NJP.js.map → p-BLTHIBsE.js.map} +0 -0
  318. /package/dist/components/{p-C68oSTb1.js.map → p-BXT2opmZ.js.map} +0 -0
  319. /package/dist/components/{p-DGkn8FwV.js.map → p-Bl5wd3v3.js.map} +0 -0
  320. /package/dist/components/{p-Bb9dA7sl.js.map → p-BpB2EF9g.js.map} +0 -0
  321. /package/dist/components/{p-2wIPUcSL.js.map → p-BwAWZAHk.js.map} +0 -0
  322. /package/dist/components/{p-B3sRZBZk.js.map → p-By5TDnbF.js.map} +0 -0
  323. /package/dist/components/{p-B3Z5sQin.js.map → p-CE8gsv7V.js.map} +0 -0
  324. /package/dist/components/{p-DW8ssbfI.js.map → p-CN8PQLZu.js.map} +0 -0
  325. /package/dist/components/{p-CaF5WCci.js.map → p-Cocq-utR.js.map} +0 -0
  326. /package/dist/components/{p-BZiGtBBk.js.map → p-Ct90k-nz.js.map} +0 -0
  327. /package/dist/components/{p-VT-5XDkB.js.map → p-DDOuPq-N.js.map} +0 -0
  328. /package/dist/components/{p-DkxOEFHN.js.map → p-DF8W85Tz.js.map} +0 -0
  329. /package/dist/components/{p-DDqRCDXh.js.map → p-DSJSnQ1U.js.map} +0 -0
  330. /package/dist/components/{p-Cr6pDY-e.js.map → p-DYK0slTb.js.map} +0 -0
  331. /package/dist/components/{p-D9wZlB_N.js.map → p-D_QtZZR8.js.map} +0 -0
  332. /package/dist/components/{p-Bv6FSDPR.js.map → p-DbDYEEWq.js.map} +0 -0
  333. /package/dist/components/{p-BEXkJ9lg.js.map → p-DnQN0pLp.js.map} +0 -0
  334. /package/dist/components/{p-DIqAdmui.js.map → p-FiM3rF7B.js.map} +0 -0
  335. /package/dist/components/{p-WFo1x6dN.js.map → p-Hzz2j1Je.js.map} +0 -0
  336. /package/dist/components/{p-DQQsS9Rx.js.map → p-aMyflqva.js.map} +0 -0
  337. /package/dist/components/{p-DZcIt_JJ.js.map → p-dgep63_i.js.map} +0 -0
  338. /package/dist/components/{p-BMzn2Cmw.js.map → p-rSC7ZUpy.js.map} +0 -0
@@ -1 +1 @@
1
- {"schemaVersion":1,"package":"@ds-mo/ui","version":"14.27.1","components":79,"digest":"fa3e35d6fdc4c435453c66bbb097639ac08154f8958d3dc77f83c6ef1e1e509e","completedAt":"2026-09-03T17:37:14.629Z"}
1
+ {"schemaVersion":1,"package":"@ds-mo/ui","version":"14.29.0","components":81,"digest":"a6bac8343e279f3c65ca013b620cd8ce2c9486a0a4cf2b82bdbf21551e7d9fe3","completedAt":"2026-09-04T16:44:56.274Z"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "14.27.1",
4
+ "packageVersion": "14.29.0",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
@@ -209,7 +209,8 @@
209
209
  "The application owns account menus, tool product data, page actions, and the consequences of every emitted intent event.",
210
210
  "The application owns viewport and theme-color metadata, the dynamic-viewport framework root, and containing document overscroll so body never becomes a second application scroller; ShellApp fills that owner and keeps its existing internal scrollers.",
211
211
  "The application resolves competing global messages to one Banner and owns its actions, controlled open state, orientation for the available shell capacity, dismissal persistence, and removal after exit motion.",
212
- "Use composition=\"slotted\" only when a team intentionally needs to assemble the public lower-level chrome components itself."
212
+ "Use composition=\"slotted\" only when a team intentionally needs to assemble the public lower-level chrome components itself.",
213
+ "Keep external surface ownership separate from selected routes, toggled modes, and inline expansion. Forward surfaceOpen on header actions while their associated menu or panel remains rendered, including exit motion; clear it after closing. Internal popup controls manage this relationship themselves."
213
214
  ],
214
215
  "accessibility": [
215
216
  "Render exactly one managed ShellApp and one active routed main landmark.",
@@ -229,7 +230,7 @@
229
230
  "An optional Banner spans the complete application above desktop navigation, workspace, tools, and mobile global surfaces while remaining below the operating-system top safe area.",
230
231
  "Desktop and tablet may render governed direct-action rail accessories. Mobile intentionally omits them, so applications provide equivalent persistent status in the top Banner lane when the product requires it.",
231
232
  "Switching breakpoints changes presentation and inert state without recreating route or tool elements.",
232
- "Switching sectionNavigation changes only desktop and tablet chrome; mobile composition, current route, routed content, and tool state remain stable.",
233
+ "Switching sectionNavigation changes where route sections live: panel expands them inside MobileSheetNav on mobile and combines the page title with any active local subsection in one sheet trigger. Detail pages use this combined trigger in both modes. The current route, routed content, and tool state remain stable.",
233
234
  "Search, Activity, Messages, and Agents use direct mobile destinations; products may explicitly group review tools under Inbox instead."
234
235
  ],
235
236
  "implementations": {
@@ -328,7 +329,8 @@
328
329
  "references": [
329
330
  "src/wc/components/ShellApp/ShellApp.mdx",
330
331
  "docs/framework-integration.md",
331
- "docs/migrations/v13.md"
332
+ "docs/migrations/v13.md",
333
+ "src/docs/SurfaceOwnership.mdx"
332
334
  ]
333
335
  },
334
336
  {
@@ -475,12 +477,13 @@
475
477
  "stateOwnership": [
476
478
  "The application owns the selected command or view value and derives the trigger label and each item's isSelected state from it.",
477
479
  "The application synchronizes one open boolean to the trigger's expanded prop and Menu.open.",
478
- "An open popup is a transient pressed state, not a selected one. The trigger holds only its pressed wash for the popup's rendered lifecycle from expanded alone, without changing foreground, so never also set isActive to represent an open menu.",
480
+ "The trigger owns a visible contextual surface, even when it appears far away. Set surfaceOpen when opening, retain it through exit motion, and clear it on dsAfterClose unless the surface reopened. This holds only the pressed wash; do not use isActive or a pressed toggle to represent the open menu.",
479
481
  "Menu owns popup placement and keyboard navigation; the application never calculates popup coordinates or applies positional CSS.",
480
482
  "On dsSelect from a command or single-selection row, update the selected value, close the Menu, and restore focus to the trigger.",
481
483
  "For button split mode, restore focus to the menu segment after a menu choice; the primary segment remains an independent command.",
482
484
  "Switch rows and reorderable rows report dsSelect or dsReorder without closing; replace the items array from those events.",
483
- "On dsClose, synchronize the application open state to false."
485
+ "On dsClose, synchronize the application open state to false.",
486
+ "Inline expansion does not establish surface ownership. Expanded controls accessibility disclosure; surfaceOpen independently tracks the rendered contextual surface. In split mode only the menu segment holds the wash."
484
487
  ],
485
488
  "accessibility": [
486
489
  "A button either has a menu or is a menu, and the trigger's variant selects between the two shapes.",
@@ -518,12 +521,13 @@
518
521
  {
519
522
  "path": "view-menu.ts",
520
523
  "language": "typescript",
521
- "content": "import '@ds-mo/ui/components/ds-button-unfilled.js'\nimport '@ds-mo/ui/components/ds-menu.js'\nimport type { MenuItemData } from '@ds-mo/ui'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nconst trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')!\nconst menu = document.querySelector<HTMLDsMenuElement>('#view-menu')!\nlet selectedValue = 'overview'\n\nfunction render() {\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n trigger.label = `View · ${selected.label}`\n menu.items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n}\n\nfunction setOpen(open: boolean) {\n trigger.expanded = open\n menu.open = open\n}\n\ntrigger.addEventListener('dsClick', event => {\n const mouseEvent = (event as CustomEvent<MouseEvent>).detail\n menu.initialFocusVisible = mouseEvent.detail === 0\n setOpen(!menu.open)\n})\nmenu.addEventListener('dsClose', () => setOpen(false))\nmenu.addEventListener('dsSelect', event => {\n selectedValue = (event as CustomEvent<MenuItemData>).detail.value ?? selectedValue\n render()\n setOpen(false)\n requestAnimationFrame(() => trigger.setFocus())\n})\n\nrender()"
524
+ "content": "import '@ds-mo/ui/components/ds-button-unfilled.js'\nimport '@ds-mo/ui/components/ds-menu.js'\nimport type { MenuItemData } from '@ds-mo/ui'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nconst trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')!\nconst menu = document.querySelector<HTMLDsMenuElement>('#view-menu')!\nlet selectedValue = 'overview'\n\nfunction render() {\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n trigger.label = `View · ${selected.label}`\n menu.items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n}\n\nfunction setOpen(open: boolean) {\n trigger.expanded = open\n if (open) trigger.surfaceOpen = true\n menu.open = open\n}\n\ntrigger.addEventListener('dsClick', event => {\n const mouseEvent = (event as CustomEvent<MouseEvent>).detail\n menu.initialFocusVisible = mouseEvent.detail === 0\n setOpen(!menu.open)\n})\ntrigger.surfaceOpen = false\nmenu.addEventListener('dsAfterClose', () => {\n if (!menu.open) trigger.surfaceOpen = false\n})\nmenu.addEventListener('dsClose', () => setOpen(false))\nmenu.addEventListener('dsSelect', event => {\n selectedValue = (event as CustomEvent<MenuItemData>).detail.value ?? selectedValue\n render()\n setOpen(false)\n requestAnimationFrame(() => trigger.setFocus())\n})\n\nrender()"
522
525
  }
523
526
  ],
524
527
  "notes": [
525
528
  "Assign Menu.items as a JavaScript property; complex arrays cannot be expressed as an HTML attribute.",
526
- "Do not add positioning styles to either element."
529
+ "Do not add positioning styles to either element.",
530
+ "Keep surfaceOpen true through exit motion and release it on dsAfterClose; expanded follows the logical open state."
527
531
  ]
528
532
  }
529
533
  ],
@@ -543,12 +547,13 @@
543
547
  {
544
548
  "path": "ViewMenu.tsx",
545
549
  "language": "tsx",
546
- "content": "import { useState } from 'react'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled, DsMenu } from '@ds-mo/ui/react'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nexport function ViewMenu() {\n const [selectedValue, setSelectedValue] = useState('overview')\n const [open, setOpen] = useState(false)\n const [initialFocusVisible, setInitialFocusVisible] = useState(false)\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n const items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n\n function focusTrigger() {\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n\n return (\n <>\n <DsButtonUnfilled\n id=\"view-menu-trigger\"\n label={`View · ${selected.label}`}\n hasMenu\n controls=\"view-menu\"\n expanded={open}\n onDsClick={event => {\n setInitialFocusVisible(event.detail.detail === 0)\n setOpen(current => !current)\n }}\n />\n <DsMenu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n items={items}\n open={open}\n initialFocusVisible={initialFocusVisible}\n onDsClose={() => setOpen(false)}\n onDsSelect={event => {\n setSelectedValue(event.detail.value ?? selectedValue)\n setOpen(false)\n focusTrigger()\n }}\n />\n </>\n )\n}"
550
+ "content": "import { useState } from 'react'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled, DsMenu } from '@ds-mo/ui/react'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nexport function ViewMenu() {\n const [selectedValue, setSelectedValue] = useState('overview')\n const [open, setOpen] = useState(false)\n const [surfaceOpen, setSurfaceOpen] = useState(false)\n const [initialFocusVisible, setInitialFocusVisible] = useState(false)\n const selected = choices.find(item => item.value === selectedValue) ?? choices[0]\n const items = choices.map(item => ({ ...item, isSelected: item.value === selectedValue }))\n\n function focusTrigger() {\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n\n return (\n <>\n <DsButtonUnfilled\n id=\"view-menu-trigger\"\n label={`View · ${selected.label}`}\n hasMenu\n controls=\"view-menu\"\n expanded={open}\n surfaceOpen={surfaceOpen}\n onDsClick={event => {\n setInitialFocusVisible(event.detail.detail === 0)\n if (!open) setSurfaceOpen(true)\n setOpen(current => !current)\n }}\n />\n <DsMenu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n items={items}\n open={open}\n initialFocusVisible={initialFocusVisible}\n onDsClose={() => setOpen(false)}\n onDsAfterClose={() => { if (!open) setSurfaceOpen(false) }}\n onDsSelect={event => {\n setSelectedValue(event.detail.value ?? selectedValue)\n setOpen(false)\n focusTrigger()\n }}\n />\n </>\n )\n}"
547
551
  }
548
552
  ],
549
553
  "notes": [
550
554
  "Use one React state value for both the trigger expanded prop and Menu open prop.",
551
- "Keep the stable trigger and menu ids unique when rendering more than one composition."
555
+ "Keep the stable trigger and menu ids unique when rendering more than one composition.",
556
+ "Keep surfaceOpen true through exit motion and release it on dsAfterClose; expanded follows the logical open state."
552
557
  ]
553
558
  }
554
559
  ],
@@ -568,12 +573,13 @@
568
573
  {
569
574
  "path": "ViewMenu.vue",
570
575
  "language": "vue",
571
- "content": "<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled, DsMenu } from '@ds-mo/ui/vue'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nconst selectedValue = ref('overview')\nconst open = ref(false)\nconst initialFocusVisible = ref(false)\nconst selected = computed(() => choices.find(item => item.value === selectedValue.value) ?? choices[0])\nconst items = computed(() => choices.map(item => ({ ...item, isSelected: item.value === selectedValue.value })))\n\nfunction focusTrigger() {\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n}\n\nfunction toggleMenu(event: CustomEvent<MouseEvent>) {\n initialFocusVisible.value = event.detail.detail === 0\n open.value = !open.value\n}\n\nfunction selectView(event: CustomEvent<MenuItemData>) {\n selectedValue.value = event.detail.value ?? selectedValue.value\n open.value = false\n focusTrigger()\n}\n</script>\n\n<template>\n <DsButtonUnfilled\n id=\"view-menu-trigger\"\n :label=\"`View · ${selected.label}`\"\n has-menu\n controls=\"view-menu\"\n :expanded=\"open\"\n @ds-click=\"toggleMenu\"\n />\n <DsMenu\n id=\"view-menu\"\n anchor-id=\"view-menu-trigger\"\n menu-label=\"Choose view\"\n :items=\"items\"\n :open=\"open\"\n :initial-focus-visible=\"initialFocusVisible\"\n @ds-close=\"open = false\"\n @ds-select=\"selectView\"\n />\n</template>"
576
+ "content": "<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled, DsMenu } from '@ds-mo/ui/vue'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\nconst selectedValue = ref('overview')\nconst open = ref(false)\nconst surfaceOpen = ref(false)\nconst initialFocusVisible = ref(false)\nconst selected = computed(() => choices.find(item => item.value === selectedValue.value) ?? choices[0])\nconst items = computed(() => choices.map(item => ({ ...item, isSelected: item.value === selectedValue.value })))\n\nfunction focusTrigger() {\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n}\n\nfunction toggleMenu(event: CustomEvent<MouseEvent>) {\n initialFocusVisible.value = event.detail.detail === 0\n if (!open.value) surfaceOpen.value = true\n open.value = !open.value\n}\n\nfunction selectView(event: CustomEvent<MenuItemData>) {\n selectedValue.value = event.detail.value ?? selectedValue.value\n open.value = false\n focusTrigger()\n}\n</script>\n\n<template>\n <DsButtonUnfilled\n id=\"view-menu-trigger\"\n :label=\"`View · ${selected.label}`\"\n has-menu\n controls=\"view-menu\"\n :expanded=\"open\"\n :surface-open=\"surfaceOpen\"\n @ds-click=\"toggleMenu\"\n />\n <DsMenu\n id=\"view-menu\"\n anchor-id=\"view-menu-trigger\"\n menu-label=\"Choose view\"\n :items=\"items\"\n :open=\"open\"\n :initial-focus-visible=\"initialFocusVisible\"\n @ds-close=\"open = false\"\n @ds-after-close=\"!open && (surfaceOpen = false)\"\n @ds-select=\"selectView\"\n />\n</template>"
572
577
  }
573
578
  ],
574
579
  "notes": [
575
580
  "Use one Vue ref for both the trigger expanded prop and Menu open prop.",
576
- "Keep the stable trigger and menu ids unique when rendering more than one composition."
581
+ "Keep the stable trigger and menu ids unique when rendering more than one composition.",
582
+ "Keep surfaceOpen true through exit motion and release it on dsAfterClose; expanded follows the logical open state."
577
583
  ]
578
584
  }
579
585
  ],
@@ -593,17 +599,18 @@
593
599
  {
594
600
  "path": "view-menu.component.html",
595
601
  "language": "html",
596
- "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n [label]=\"'View · ' + selectedLabel\"\n has-menu\n controls=\"view-menu\"\n [expanded]=\"open\"\n (dsClick)=\"toggleMenu($event)\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n [items]=\"menuItems\"\n [open]=\"open\"\n [initialFocusVisible]=\"initialFocusVisible\"\n (dsClose)=\"open = false\"\n (dsSelect)=\"selectView($event)\"\n></ds-menu>"
602
+ "content": "<ds-button-unfilled\n id=\"view-menu-trigger\"\n [label]=\"'View · ' + selectedLabel\"\n has-menu\n controls=\"view-menu\"\n [expanded]=\"open\"\n [surfaceOpen]=\"surfaceOpen\"\n (dsClick)=\"toggleMenu($event)\"\n></ds-button-unfilled>\n<ds-menu\n id=\"view-menu\"\n anchorId=\"view-menu-trigger\"\n menuLabel=\"Choose view\"\n [items]=\"menuItems\"\n [open]=\"open\"\n [initialFocusVisible]=\"initialFocusVisible\"\n (dsClose)=\"open = false\"\n (dsAfterClose)=\"!open && (surfaceOpen = false)\"\n (dsSelect)=\"selectView($event)\"\n></ds-menu>"
597
603
  },
598
604
  {
599
605
  "path": "view-menu.component.ts",
600
606
  "language": "typescript",
601
- "content": "import { Component } from '@angular/core'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled } from '@ds-mo/ui/angular/ds-button-unfilled'\nimport { DsMenu } from '@ds-mo/ui/angular/ds-menu'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\n@Component({\n selector: 'app-view-menu',\n standalone: true,\n imports: [DsButtonUnfilled, DsMenu],\n templateUrl: './view-menu.component.html',\n})\nexport class ViewMenuComponent {\n selectedValue = 'overview'\n open = false\n initialFocusVisible = false\n\n get selectedLabel() {\n return choices.find(item => item.value === this.selectedValue)?.label ?? choices[0].label\n }\n\n get menuItems() {\n return choices.map(item => ({ ...item, isSelected: item.value === this.selectedValue }))\n }\n\n toggleMenu(event: CustomEvent<MouseEvent>) {\n this.initialFocusVisible = event.detail.detail === 0\n this.open = !this.open\n }\n\n selectView(event: CustomEvent<MenuItemData>) {\n this.selectedValue = event.detail.value ?? this.selectedValue\n this.open = false\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n}"
607
+ "content": "import { Component } from '@angular/core'\nimport type { HTMLDsButtonUnfilledElement, MenuItemData } from '@ds-mo/ui'\nimport { DsButtonUnfilled } from '@ds-mo/ui/angular/ds-button-unfilled'\nimport { DsMenu } from '@ds-mo/ui/angular/ds-menu'\n\nconst choices: MenuItemData[] = [\n { label: 'Overview', value: 'overview' },\n { label: 'Map', value: 'map' },\n { label: 'Timeline', value: 'timeline' },\n]\n\n@Component({\n selector: 'app-view-menu',\n standalone: true,\n imports: [DsButtonUnfilled, DsMenu],\n templateUrl: './view-menu.component.html',\n})\nexport class ViewMenuComponent {\n selectedValue = 'overview'\n open = false\n surfaceOpen = false\n initialFocusVisible = false\n\n get selectedLabel() {\n return choices.find(item => item.value === this.selectedValue)?.label ?? choices[0].label\n }\n\n get menuItems() {\n return choices.map(item => ({ ...item, isSelected: item.value === this.selectedValue }))\n }\n\n toggleMenu(event: CustomEvent<MouseEvent>) {\n this.initialFocusVisible = event.detail.detail === 0\n if (!this.open) this.surfaceOpen = true\n this.open = !this.open\n }\n\n selectView(event: CustomEvent<MenuItemData>) {\n this.selectedValue = event.detail.value ?? this.selectedValue\n this.open = false\n requestAnimationFrame(() => {\n const trigger = document.querySelector<HTMLDsButtonUnfilledElement>('#view-menu-trigger')\n trigger?.setFocus()\n })\n }\n}"
602
608
  }
603
609
  ],
604
610
  "notes": [
605
611
  "Bind items as a property and import both generated standalone adapters.",
606
- "Keep the stable trigger and menu ids unique when rendering more than one composition."
612
+ "Keep the stable trigger and menu ids unique when rendering more than one composition.",
613
+ "Keep surfaceOpen true through exit motion and release it on dsAfterClose; expanded follows the logical open state."
607
614
  ]
608
615
  }
609
616
  ],
@@ -616,7 +623,8 @@
616
623
  "references": [
617
624
  "src/wc/components/Tag/Tag.stories.ts",
618
625
  "src/wc/components/Menu/Menu.agent.json",
619
- "docs/framework-integration.md"
626
+ "docs/framework-integration.md",
627
+ "src/docs/SurfaceOwnership.mdx"
620
628
  ]
621
629
  },
622
630
  {
@@ -659,7 +667,8 @@
659
667
  "The application replaces pageChrome from completed route state and handles ShellApp page intent events.",
660
668
  "ShellApp owns ShellPage, BarTitle, MobileHeader, the content scroller, sticky presentation, and responsive switching.",
661
669
  "The default slot contains application-owned routed content and is not recreated for header compaction or breakpoint changes.",
662
- "Use a directly slotted ShellPage only inside composition=\"slotted\"."
670
+ "Use a directly slotted ShellPage only inside composition=\"slotted\".",
671
+ "Keep external surface ownership separate from selected routes, toggled modes, and inline expansion. Forward surfaceOpen on header actions while their associated menu or panel remains rendered, including exit motion; clear it after closing. Internal popup controls manage this relationship themselves."
663
672
  ],
664
673
  "accessibility": [
665
674
  "Keep exactly one active routed main landmark, supplied by the managed ShellPage.",
@@ -764,7 +773,8 @@
764
773
  "references": [
765
774
  "src/wc/components/ShellPage/ShellPage.agent.json",
766
775
  "src/wc/components/BarTitle/BarTitle.agent.json",
767
- "src/wc/components/ShellApp/ShellApp.agent.json"
776
+ "src/wc/components/ShellApp/ShellApp.agent.json",
777
+ "src/docs/SurfaceOwnership.mdx"
768
778
  ]
769
779
  }
770
780
  ]