@ds-mo/ui 14.22.2 → 14.24.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 (215) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +14 -7
  3. package/dist/agent.json +112 -26
  4. package/dist/angular/ds-bar-title.d.ts +1 -1
  5. package/dist/angular/ds-bar-title.js +3 -3
  6. package/dist/angular/ds-button-filled.d.ts +3 -1
  7. package/dist/angular/ds-button-filled.js +7 -4
  8. package/dist/angular/ds-button-unfilled.d.ts +3 -1
  9. package/dist/angular/ds-button-unfilled.js +7 -4
  10. package/dist/angular/ds-panel-tools.d.ts +7 -1
  11. package/dist/angular/ds-panel-tools.js +7 -4
  12. package/dist/angular/ds-shell-app.d.ts +7 -1
  13. package/dist/angular/ds-shell-app.js +5 -2
  14. package/dist/angular/ds-shell-tools.d.ts +4 -1
  15. package/dist/angular/ds-shell-tools.js +7 -4
  16. package/dist/components/ds-agent-questionnaire.js +1 -1
  17. package/dist/components/ds-agent-response.js +1 -1
  18. package/dist/components/ds-banner.js +1 -1
  19. package/dist/components/ds-bar-nav.js +1 -1
  20. package/dist/components/ds-bar-title.js +1 -1
  21. package/dist/components/ds-bar-workflow.js +1 -1
  22. package/dist/components/ds-button-filled.js +1 -1
  23. package/dist/components/ds-button-unfilled.js +1 -1
  24. package/dist/components/ds-card-chart.js +1 -1
  25. package/dist/components/ds-card-setting.js +1 -1
  26. package/dist/components/ds-code-block.js +1 -1
  27. package/dist/components/ds-filter-menu.js +1 -1
  28. package/dist/components/ds-input.js +1 -1
  29. package/dist/components/ds-markdown.js +1 -1
  30. package/dist/components/ds-message-actions.js +1 -1
  31. package/dist/components/ds-message-composer.js +1 -1
  32. package/dist/components/ds-message-scroller.js +1 -1
  33. package/dist/components/ds-message-scroller.js.map +1 -1
  34. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  35. package/dist/components/ds-modal.js +1 -1
  36. package/dist/components/ds-pagination.js +1 -1
  37. package/dist/components/ds-panel-nav.js +1 -1
  38. package/dist/components/ds-panel-tool-header.js +1 -1
  39. package/dist/components/ds-panel-tool-search.js +1 -1
  40. package/dist/components/ds-panel-tools.js +1 -1
  41. package/dist/components/ds-select.js +1 -1
  42. package/dist/components/ds-shell-app.js +1 -1
  43. package/dist/components/ds-shell-app.js.map +1 -1
  44. package/dist/components/ds-shell-tools.js +1 -1
  45. package/dist/components/ds-table-filter.js +1 -1
  46. package/dist/components/ds-table-group.js +1 -1
  47. package/dist/components/ds-table-saved-views.js +1 -1
  48. package/dist/components/ds-table-search.js +1 -1
  49. package/dist/components/ds-table-sort.js +1 -1
  50. package/dist/components/ds-table.js +1 -1
  51. package/dist/components/ds-toast.js +1 -1
  52. package/dist/components/p-BR1ayqMU.js +2 -0
  53. package/dist/components/p-BR1ayqMU.js.map +1 -0
  54. package/dist/components/{p-DzVYGJJv.js → p-BSRIF4m8.js} +2 -2
  55. package/dist/components/{p-FitB53eM.js → p-BZlhBJZL.js} +2 -2
  56. package/dist/components/{p-BmqnrfTf.js → p-Bo6uW_8T.js} +2 -2
  57. package/dist/components/{p-BIaHDBfP.js → p-Bq8svcPs.js} +2 -2
  58. package/dist/components/{p-DAFR4U9P.js → p-BqbdABo3.js} +2 -2
  59. package/dist/components/{p-nVv71P3f.js → p-CEXchU5N.js} +2 -2
  60. package/dist/components/p-CEfxLsbX.js +2 -0
  61. package/dist/components/p-CEfxLsbX.js.map +1 -0
  62. package/dist/components/{p-DXbryJHz.js → p-CYMKmJ2s.js} +2 -2
  63. package/dist/components/p-CZHIkVgj.js +2 -0
  64. package/dist/components/p-CZHIkVgj.js.map +1 -0
  65. package/dist/components/{p-CL0tECXf.js → p-CZjjDhUl.js} +2 -2
  66. package/dist/components/p-C_FFU6W3.js +2 -0
  67. package/dist/components/p-C_FFU6W3.js.map +1 -0
  68. package/dist/components/{p-CilwchJH.js → p-CglHiyY2.js} +2 -2
  69. package/dist/components/{p-9M0ak2q_.js → p-DLaN9BPq.js} +2 -2
  70. package/dist/components/{p-CrYJnDev.js → p-DiS5BgLA.js} +2 -2
  71. package/dist/components/{p-DiyO47xX.js → p-PXdvBMXB.js} +2 -2
  72. package/dist/components/{p-7MWaWl8w.js → p-kslioYhf.js} +2 -2
  73. package/dist/components/p-kslioYhf.js.map +1 -0
  74. package/dist/docs/components.json +434 -32
  75. package/dist/lib/components/BarTitle/bar-title-types.d.ts +54 -1
  76. package/dist/lib/components/ButtonFilled/ButtonFilled.d.ts +12 -1
  77. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +76 -1
  78. package/dist/lib/components/ShellApp/shell-app-types.d.ts +6 -2
  79. package/dist/lib/shell/index.d.ts +2 -1
  80. package/dist/lib/shell/index.js.map +2 -2
  81. package/dist/mcp-data/registry/agent-activity.json +1 -1
  82. package/dist/mcp-data/registry/agent-questionnaire.json +1 -1
  83. package/dist/mcp-data/registry/agent-response.json +1 -1
  84. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  85. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  86. package/dist/mcp-data/registry/attachment-list.json +1 -1
  87. package/dist/mcp-data/registry/avatar.json +1 -1
  88. package/dist/mcp-data/registry/badge.json +1 -1
  89. package/dist/mcp-data/registry/banner.json +1 -1
  90. package/dist/mcp-data/registry/bar-action.json +1 -1
  91. package/dist/mcp-data/registry/bar-nav.json +1 -1
  92. package/dist/mcp-data/registry/bar-title.json +35 -13
  93. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  94. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  95. package/dist/mcp-data/registry/button-filled.json +61 -7
  96. package/dist/mcp-data/registry/button-unfilled.json +61 -7
  97. package/dist/mcp-data/registry/card-chart.json +1 -1
  98. package/dist/mcp-data/registry/card-overview.json +1 -1
  99. package/dist/mcp-data/registry/card-setting.json +1 -1
  100. package/dist/mcp-data/registry/chart-legend.json +1 -1
  101. package/dist/mcp-data/registry/chart.json +1 -1
  102. package/dist/mcp-data/registry/checkbox.json +1 -1
  103. package/dist/mcp-data/registry/chip.json +1 -1
  104. package/dist/mcp-data/registry/code-block.json +1 -1
  105. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  106. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  107. package/dist/mcp-data/registry/conversation-list.json +1 -1
  108. package/dist/mcp-data/registry/divider.json +1 -1
  109. package/dist/mcp-data/registry/empty-state.json +1 -1
  110. package/dist/mcp-data/registry/field.json +1 -1
  111. package/dist/mcp-data/registry/filter-menu.json +1 -1
  112. package/dist/mcp-data/registry/icon.json +1 -1
  113. package/dist/mcp-data/registry/input.json +1 -1
  114. package/dist/mcp-data/registry/loader.json +1 -1
  115. package/dist/mcp-data/registry/markdown.json +1 -1
  116. package/dist/mcp-data/registry/menu.json +1 -1
  117. package/dist/mcp-data/registry/message-actions.json +1 -1
  118. package/dist/mcp-data/registry/message-bubble.json +1 -1
  119. package/dist/mcp-data/registry/message-composer.json +1 -1
  120. package/dist/mcp-data/registry/message-scroller.json +9 -2
  121. package/dist/mcp-data/registry/message.json +1 -1
  122. package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
  123. package/dist/mcp-data/registry/mobile-header.json +1 -1
  124. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  125. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  126. package/dist/mcp-data/registry/modal.json +1 -1
  127. package/dist/mcp-data/registry/pagination.json +1 -1
  128. package/dist/mcp-data/registry/panel-nav.json +1 -1
  129. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  130. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  131. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  132. package/dist/mcp-data/registry/panel-tools.json +62 -15
  133. package/dist/mcp-data/registry/paper-texture.json +1 -1
  134. package/dist/mcp-data/registry/radio.json +1 -1
  135. package/dist/mcp-data/registry/registry.json +112 -26
  136. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  137. package/dist/mcp-data/registry/select.json +1 -1
  138. package/dist/mcp-data/registry/shell-app.json +26 -3
  139. package/dist/mcp-data/registry/shell-page.json +1 -1
  140. package/dist/mcp-data/registry/shell-tools.json +39 -6
  141. package/dist/mcp-data/registry/skeleton.json +1 -1
  142. package/dist/mcp-data/registry/slider.json +1 -1
  143. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  144. package/dist/mcp-data/registry/switch.json +1 -1
  145. package/dist/mcp-data/registry/tab-group.json +1 -1
  146. package/dist/mcp-data/registry/table-filter.json +1 -1
  147. package/dist/mcp-data/registry/table-group.json +1 -1
  148. package/dist/mcp-data/registry/table-saved-views.json +1 -1
  149. package/dist/mcp-data/registry/table-search.json +1 -1
  150. package/dist/mcp-data/registry/table-sort.json +1 -1
  151. package/dist/mcp-data/registry/table-toolbar.json +1 -1
  152. package/dist/mcp-data/registry/table.json +1 -1
  153. package/dist/mcp-data/registry/tag.json +1 -1
  154. package/dist/mcp-data/registry/text.json +1 -1
  155. package/dist/mcp-data/registry/toast.json +1 -1
  156. package/dist/mcp-data/registry/tooltip-chart.json +1 -1
  157. package/dist/mcp-data/registry/tooltip.json +1 -1
  158. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  159. package/dist/react/ds-button-filled.d.ts +1 -0
  160. package/dist/react/ds-button-filled.js +4 -1
  161. package/dist/react/ds-button-unfilled.d.ts +1 -0
  162. package/dist/react/ds-button-unfilled.js +1 -0
  163. package/dist/react/ds-panel-tools.d.ts +2 -1
  164. package/dist/react/ds-panel-tools.js +1 -0
  165. package/dist/react/ds-shell-app.d.ts +2 -1
  166. package/dist/react/ds-shell-app.js +1 -0
  167. package/dist/react/ds-shell-tools.d.ts +2 -1
  168. package/dist/react/ds-shell-tools.js +2 -1
  169. package/dist/types/components/BarTitle/BarTitle.d.ts +19 -6
  170. package/dist/types/components/BarTitle/bar-title-actions.d.ts +11 -0
  171. package/dist/types/components/BarTitle/bar-title-types.d.ts +54 -1
  172. package/dist/types/components/BarTitle/index.d.ts +1 -1
  173. package/dist/types/components/ButtonFilled/ButtonFilled.d.ts +12 -1
  174. package/dist/types/components/ButtonUnfilled/ButtonUnfilled.d.ts +12 -1
  175. package/dist/types/components/MessageScroller/MessageScroller.d.ts +14 -0
  176. package/dist/types/components/MessageScroller/message-scroller-transcript.d.ts +9 -0
  177. package/dist/types/components/PanelTools/PanelTools.d.ts +17 -1
  178. package/dist/types/components/PanelTools/index.d.ts +1 -1
  179. package/dist/types/components/PanelTools/panel-tools-types.d.ts +76 -1
  180. package/dist/types/components/PanelTools/panel-tools-utils.d.ts +17 -1
  181. package/dist/types/components/ShellApp/ShellApp.d.ts +16 -1
  182. package/dist/types/components/ShellApp/shell-app-types.d.ts +6 -2
  183. package/dist/types/components/ShellTools/ShellTools.d.ts +5 -1
  184. package/dist/types/components/ShellTools/index.d.ts +1 -1
  185. package/dist/types/components.d.ts +94 -6
  186. package/dist/types/shell/index.d.ts +2 -1
  187. package/dist/types/utils/button-story-foundation.d.ts +2 -0
  188. package/dist/vue/ds-bar-title.js +1 -0
  189. package/dist/vue/ds-button-filled.js +6 -2
  190. package/dist/vue/ds-button-unfilled.js +4 -0
  191. package/dist/vue/ds-panel-tools.js +3 -0
  192. package/dist/vue/ds-shell-app.js +2 -0
  193. package/dist/vue/ds-shell-tools.js +5 -2
  194. package/package.json +3 -3
  195. package/dist/components/p--68f7nIx.js +0 -2
  196. package/dist/components/p--68f7nIx.js.map +0 -1
  197. package/dist/components/p-7MWaWl8w.js.map +0 -1
  198. package/dist/components/p-BnTPuV3x.js +0 -2
  199. package/dist/components/p-BnTPuV3x.js.map +0 -1
  200. package/dist/components/p-COFw_fcj.js +0 -2
  201. package/dist/components/p-COFw_fcj.js.map +0 -1
  202. package/dist/components/p-CvHrCyuz.js +0 -2
  203. package/dist/components/p-CvHrCyuz.js.map +0 -1
  204. /package/dist/components/{p-DzVYGJJv.js.map → p-BSRIF4m8.js.map} +0 -0
  205. /package/dist/components/{p-FitB53eM.js.map → p-BZlhBJZL.js.map} +0 -0
  206. /package/dist/components/{p-BmqnrfTf.js.map → p-Bo6uW_8T.js.map} +0 -0
  207. /package/dist/components/{p-BIaHDBfP.js.map → p-Bq8svcPs.js.map} +0 -0
  208. /package/dist/components/{p-DAFR4U9P.js.map → p-BqbdABo3.js.map} +0 -0
  209. /package/dist/components/{p-nVv71P3f.js.map → p-CEXchU5N.js.map} +0 -0
  210. /package/dist/components/{p-DXbryJHz.js.map → p-CYMKmJ2s.js.map} +0 -0
  211. /package/dist/components/{p-CL0tECXf.js.map → p-CZjjDhUl.js.map} +0 -0
  212. /package/dist/components/{p-CilwchJH.js.map → p-CglHiyY2.js.map} +0 -0
  213. /package/dist/components/{p-9M0ak2q_.js.map → p-DLaN9BPq.js.map} +0 -0
  214. /package/dist/components/{p-CrYJnDev.js.map → p-DiS5BgLA.js.map} +0 -0
  215. /package/dist/components/{p-DiyO47xX.js.map → p-PXdvBMXB.js.map} +0 -0
@@ -1 +1 @@
1
- {"schemaVersion":1,"package":"@ds-mo/ui","version":"14.22.2","components":77,"digest":"bb5af3012a271c23692af664558b40c32dac4a66836b8610cb8d578b7dce0ac7","completedAt":"2026-08-30T20:03:22.884Z"}
1
+ {"schemaVersion":1,"package":"@ds-mo/ui","version":"14.24.0","components":77,"digest":"788194112cd3c2dab0ded8853b1d03149a99921edc98cba5ac8e62d1b5439b62","completedAt":"2026-09-01T20:08:31.239Z"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "14.22.2",
4
+ "packageVersion": "14.24.0",
5
5
  "kind": "patterns",
6
6
  "entries": [
7
7
  {
@@ -204,6 +204,8 @@
204
204
  "ShellApp emits stable navigation and page intent events; it never mutates router history.",
205
205
  "ShellApp owns responsive mode, PanelNav presentation, tool open state, active tool, direct mobile destinations, optional Inbox grouping, Menu state, fullscreen presentation, focus restoration, and breakpoint state preservation.",
206
206
  "Tool products and routed content are instantiated once by the application in named tool-view and default slots; ShellApp changes presentation without recreating those owners.",
207
+ "The application owns rail accessory state, labels, timers, permissions, navigation, and action consequences. ShellApp forwards governed desktop and tablet accessory definitions and intents without changing tool selection or drawer state.",
208
+ "When a transient status group and shortcut group coexist in the same rail region, the application assigns explicit orders for status, decorative boundary, then shortcuts; component behavior never infers grouping from product-specific ids.",
207
209
  "The application owns account menus, tool product data, page actions, and the consequences of every emitted intent event.",
208
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.",
209
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.",
@@ -213,6 +215,7 @@
213
215
  "Render exactly one managed ShellApp and one active routed main landmark.",
214
216
  "Provide visible labels and accessible names in navigation, pageChrome, and tool definitions before passing them to ShellApp.",
215
217
  "Handle ShellApp intent events without replacing focusable owners during responsive or fullscreen transitions.",
218
+ "Pair accessory status indicators with accessible status text and keep decorative accessory boundaries out of the accessibility tree.",
216
219
  "Keep the canonical Agents and Help tools available; expose Activity directly on mobile unless the product explicitly opts into grouped Inbox behavior.",
217
220
  "Do not override browser keyboard chords when enabling shell shortcuts."
218
221
  ],
@@ -224,6 +227,7 @@
224
227
  "Below 768px the application root owns a 100dvh fixed stage with a 100vh fallback while ShellApp continues to fill its owner with height 100%; JavaScript viewport measurement synchronizes only the chrome wash and does not own layout height.",
225
228
  "With viewport-fit=cover, ShellApp consumes the shared top safe-area inset once and MobileBarNav consumes the persistent bottom inset; nested routed, tool, sheet, and consumer headers do not duplicate either inset.",
226
229
  "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
+ "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.",
227
231
  "Switching breakpoints changes presentation and inert state without recreating route or tool elements.",
228
232
  "Switching sectionNavigation changes only desktop and tablet chrome; mobile composition, current route, routed content, and tool state remain stable.",
229
233
  "Search, Activity, Messages, and Agents use direct mobile destinations; products may explicitly group review tools under Inbox instead."
@@ -454,7 +458,7 @@
454
458
  "components": [
455
459
  {
456
460
  "component": "component:ds-button-unfilled",
457
- "role": "Provides the visible trigger, popup relationship attributes, and focus target. Carries both shapes, and is the only component that carries the icon-only overflow role.",
461
+ "role": "Provides the visible trigger, popup relationship attributes, focus target, and optional split-menu segment. Carries both menu-button shapes, and is the only component that carries the icon-only overflow role.",
458
462
  "required": true
459
463
  },
460
464
  {
@@ -464,7 +468,7 @@
464
468
  },
465
469
  {
466
470
  "component": "component:ds-button-filled",
467
- "role": "Substitutes for the trigger when the menu belongs to the single primary action in a local decision area, using the label or icon-label shape only.",
471
+ "role": "Substitutes for the trigger when the menu belongs to the single primary action in a local decision area, and supports split mode when the primary command must remain independently available.",
468
472
  "required": false
469
473
  }
470
474
  ],
@@ -474,6 +478,7 @@
474
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.",
475
479
  "Menu owns popup placement and keyboard navigation; the application never calculates popup coordinates or applies positional CSS.",
476
480
  "On dsSelect from a command or single-selection row, update the selected value, close the Menu, and restore focus to the trigger.",
481
+ "For button split mode, restore focus to the menu segment after a menu choice; the primary segment remains an independent command.",
477
482
  "Switch rows and reorderable rows report dsSelect or dsReorder without closing; replace the items array from those events.",
478
483
  "On dsClose, synchronize the application open state to false."
479
484
  ],
@@ -481,6 +486,7 @@
481
486
  "A button either has a menu or is a menu, and the trigger's variant selects between the two shapes.",
482
487
  "Has a menu: a label or icon-label action that opens a menu. Set hasMenu, which implies aria-haspopup of menu and renders the trailing chevron that communicates the popup. Both button primitives support this shape.",
483
488
  "Is a menu: an icon-only control. Set hasMenu, which adds no chevron, so the glyph must convey the menu alone. Use Ellipses for generic more-options or overflow. Use a specific icon when the menu has a named purpose, such as Table for Customize table. Only ButtonUnfilled carries this shape, because the role is chrome rather than a primary action.",
489
+ "Split mode: set split and menuAriaLabel on either button primitive. The selected variant continues to define the primary segment; the appended ChevronDown segment owns controls, expanded, aria-haspopup, and dsMenuClick.",
484
490
  "Set controls to the Menu id and expanded from the same open state passed to Menu.",
485
491
  "Give an icon-only trigger an accessible name that states the role, such as More options or Customize table, because no visible label or chevron carries it.",
486
492
  "Use haspopup directly instead of hasMenu for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
@@ -649,7 +655,7 @@
649
655
  }
650
656
  ],
651
657
  "stateOwnership": [
652
- "The router owns heading copy, selected section, depth, available actions, content inset, divider visibility, scroll-compaction policy, content surface, route data, and product outcomes.",
658
+ "The router owns heading copy, selected section, depth, ordered available actions, content inset, divider visibility, scroll-compaction policy, content surface, route data, and product outcomes.",
653
659
  "The application replaces pageChrome from completed route state and handles ShellApp page intent events.",
654
660
  "ShellApp owns ShellPage, BarTitle, MobileHeader, the content scroller, sticky presentation, and responsive switching.",
655
661
  "The default slot contains application-owned routed content and is not recreated for header compaction or breakpoint changes.",
@@ -663,6 +669,7 @@
663
669
  ],
664
670
  "responsiveBehavior": [
665
671
  "ShellApp derives the desktop BarTitle and mobile MobileHeader from the same pageChrome object.",
672
+ "Ordered page actions keep icon commands visible on mobile by default and flatten labeled, menu, split, and explicit overflow commands into one ShellApp-owned mobile menu.",
666
673
  "Route-level sections remain pageChrome tabs; subordinate local views use subsections.",
667
674
  "Use contentInset none only for deliberately full-bleed products such as maps and canvases.",
668
675
  "Table pages can retain responsive inline and bottom gutters while tuning their roomy and compact block-start seams; set scrollCompaction false when their roomy title must stay pinned, and let shell capacity continue to compact it for tools or tablet layouts.",
@@ -683,7 +690,7 @@
683
690
  {
684
691
  "path": "drivers-page.ts",
685
692
  "language": "typescript",
686
- "content": "import type { ShellPageChromeConfig } from '@ds-mo/ui/shell'\n\nconst shell = document.querySelector<HTMLDsShellAppElement>('ds-shell-app')!\nconst pageChrome: ShellPageChromeConfig = {\n heading: 'Drivers',\n tabs: [{ id: 'active', label: 'Active' }, { id: 'inactive', label: 'Inactive' }],\n value: 'active',\n primaryAction: { id: 'create', label: 'Create driver' },\n}\nshell.pageChrome = pageChrome\nshell.addEventListener('dsTabChange', event => appRouter.navigate(event.detail))\nshell.addEventListener('dsPageAction', event => driverActions.run(event.detail))"
693
+ "content": "import type { ShellPageChromeConfig } from '@ds-mo/ui/shell'\n\nconst shell = document.querySelector<HTMLDsShellAppElement>('ds-shell-app')!\nconst pageChrome: ShellPageChromeConfig = {\n heading: 'Drivers',\n tabs: [{ id: 'active', label: 'Active' }, { id: 'inactive', label: 'Inactive' }],\n value: 'active',\n actionItems: [\n { type: 'button', id: 'create', label: 'Create driver', appearance: 'filled' },\n { type: 'overflow', id: 'export', label: 'Export drivers' },\n ],\n}\nshell.pageChrome = pageChrome\nshell.addEventListener('dsTabChange', event => appRouter.navigate(event.detail))\nshell.addEventListener('dsPageAction', event => driverActions.run(event.detail))"
687
694
  }
688
695
  ],
689
696
  "notes": [
@@ -708,7 +715,7 @@
708
715
  {
709
716
  "path": "DriversRoute.tsx",
710
717
  "language": "tsx",
711
- "content": "import type { ShellPageChromeConfig } from '@ds-mo/ui/shell'\n\nexport const driversPageChrome: ShellPageChromeConfig = {\n heading: 'Drivers',\n tabs: [{ id: 'active', label: 'Active' }, { id: 'inactive', label: 'Inactive' }],\n value: 'active',\n primaryAction: { id: 'create', label: 'Create driver' },\n}\n\nexport function DriversRoute() {\n return <section aria-label=\"Driver results\">Page content</section>\n}"
718
+ "content": "import type { ShellPageChromeConfig } from '@ds-mo/ui/shell'\n\nexport const driversPageChrome: ShellPageChromeConfig = {\n heading: 'Drivers',\n tabs: [{ id: 'active', label: 'Active' }, { id: 'inactive', label: 'Inactive' }],\n value: 'active',\n actionItems: [{ type: 'button', id: 'create', label: 'Create driver', appearance: 'filled' }],\n}\n\nexport function DriversRoute() {\n return <section aria-label=\"Driver results\">Page content</section>\n}"
712
719
  }
713
720
  ],
714
721
  "notes": [
@@ -739,7 +746,7 @@
739
746
  {
740
747
  "path": "drivers-page-chrome.ts",
741
748
  "language": "typescript",
742
- "content": "import type { ShellPageChromeConfig } from '@ds-mo/ui/shell'\n\nexport const DRIVERS_PAGE_CHROME: ShellPageChromeConfig = {\n heading: 'Drivers',\n tabs: [{ id: 'active', label: 'Active' }, { id: 'inactive', label: 'Inactive' }],\n value: 'active',\n primaryAction: { id: 'create', label: 'Create driver' },\n}"
749
+ "content": "import type { ShellPageChromeConfig } from '@ds-mo/ui/shell'\n\nexport const DRIVERS_PAGE_CHROME: ShellPageChromeConfig = {\n heading: 'Drivers',\n tabs: [{ id: 'active', label: 'Active' }, { id: 'inactive', label: 'Inactive' }],\n value: 'active',\n actionItems: [{ type: 'button', id: 'create', label: 'Create driver', appearance: 'filled' }],\n}"
743
750
  }
744
751
  ],
745
752
  "notes": [
package/dist/agent.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
3
  "package": "@ds-mo/ui",
4
- "packageVersion": "14.22.2",
4
+ "packageVersion": "14.24.0",
5
5
  "kind": "components",
6
6
  "entries": [
7
7
  {
@@ -1218,17 +1218,17 @@
1218
1218
  "tag": "ds-bar-title",
1219
1219
  "name": "bar-title",
1220
1220
  "title": "BarTitle",
1221
- "summary": "Page-level title chrome with an optional expanded route breadcrumb, compact Back action, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
1221
+ "summary": "Page-level title chrome with route identity, responsive ordered button, icon, menu, split, and overflow actions, plus explicit expanded, compact, or constrained variants.",
1222
1222
  "intentStatus": "complete",
1223
1223
  "intent": {
1224
1224
  "audience": "general",
1225
1225
  "status": "stable",
1226
- "summary": "Page-level title chrome with an optional expanded route breadcrumb, compact Back action, supporting description, inline active-section menu, one primary action, grouped overflow actions, and explicit expanded, compact, or constrained variants.",
1226
+ "summary": "Page-level title chrome with route identity, responsive ordered button, icon, menu, split, and overflow actions, plus explicit expanded, compact, or constrained variants.",
1227
1227
  "useWhen": [
1228
1228
  "A top-level page needs one h1 above its content.",
1229
1229
  "A list or detail page has multiple route-level sections that belong in the inline active-section menu.",
1230
1230
  "A detail page needs route ancestors in expanded presentation and a page-level Back action in compact chrome.",
1231
- "A page needs one primary action plus optional secondary or destructive overflow commands."
1231
+ "A page needs an ordered set of primary, secondary, icon, menu, split, or overflow commands."
1232
1232
  ],
1233
1233
  "avoidWhen": [
1234
1234
  "The title belongs to a PanelTools drawer or fullscreen pane; use PanelToolHeader through PanelTools instead.",
@@ -1272,15 +1272,17 @@
1272
1272
  "Provide ordered breadcrumb items for deeper expanded paths and handle dsBreadcrumbSelect when native href navigation is not used; backLabel remains the single-parent expanded fallback.",
1273
1273
  "Keep value synchronized with the current child route; dsSectionChange returns the selected section id.",
1274
1274
  "Section and overflow triggers expose menu relationships and restore focus after selection or dismissal.",
1275
- "Use one filled primary action in the page decision area and mark destructive overflow actions explicitly."
1275
+ "Use one filled primary action in the page decision area, give icon and menu triggers specific accessible names, and mark destructive overflow actions explicitly.",
1276
+ "Keep every top-level action and nested menu-choice id non-empty and unique; dsAction emits the selected id without adding a parent prefix."
1276
1277
  ],
1277
1278
  "states": [
1278
1279
  "Omitting Back, sections, primaryAction, and actions produces the top-level title-only header.",
1279
1280
  "Two or more selectable sections add the inline section trigger; one section does not render a redundant menu.",
1280
1281
  "Dividers in sections or actions create separate Menu groups without becoming selectable rows.",
1281
- "The overflow trigger uses its bordered treatment whenever the primary action is visible beside it; overflow-only and auto-collapsed-primary presentations keep the trigger borderless.",
1282
+ "The overflow trigger uses its bordered treatment whenever any visible action sits beside it; overflow-only presentations keep the trigger borderless.",
1283
+ "Ordered actions preserve authored order, but only the first eligible filled button, unfilled button, icon button, labeled menu button, or split button renders beside the title. Remaining commands use the shared overflow, whose rows are text-only. Menu choices and overflowed split commands become separate rows and share the same flat action event.",
1282
1284
  "expanded renders the larger heading, optional description, inset divider, and a full-width caption breadcrumb row above the title. The breadcrumb begins after 32px top padding; the following title and right-side actions share one top alignment. Compact renders 48px chrome with the existing icon Back action; constrained uses compact chrome and moves an auto-collapse primary action into overflow.",
1283
- "primaryAction collapse defaults to auto. Use never for exceptional actions whose hierarchy must remain visible in constrained layouts.",
1285
+ "The one visible ordered action collapses by default in constrained presentation. Use never for an exceptional action whose hierarchy must remain visible; explicit overflow actions never leave the shared menu.",
1284
1286
  "showDivider=false removes the bottom divider when the surrounding page composition supplies the boundary; showCompactDivider can independently restore or remove that boundary in compact and constrained variants.",
1285
1287
  "placement=shell-bar is reserved for ShellApp panel section navigation. It remains compact, omits description and breadcrumb presentation, and preserves applicable Back, section, primary, and overflow controls."
1286
1288
  ],
@@ -1290,15 +1292,16 @@
1290
1292
  "ShellApp owns shell-bar placement and always selects compact presentation there; mobile continues to use MobileHeader.",
1291
1293
  "When ShellPage owns BarTitle on a secondary desktop or tablet page, its expanded, compact, and constrained presentations all match that canvas; the separate MobileHeader component remains primary.",
1292
1294
  "Compact titles use the shared compact-header geometry and md control inset so top-level headings align with BarNav and inline Back geometry aligns with PanelToolHeader. Long headings and section labels truncate independently while Back and action controls retain complete hit targets and accessible names.",
1293
- "A never-collapse primary action remains visible in constrained mode; the title and section label yield space first."
1295
+ "A never-collapse action remains visible in constrained mode; the title and section label yield space first.",
1296
+ "On mobile, icon commands remain visible by default while labeled buttons, labeled menus, split buttons, and explicit overflow commands become one flat overflow menu derived by ShellApp."
1294
1297
  ],
1295
1298
  "frameworkCaveats": {
1296
1299
  "customElements": [
1297
- "Assign breadcrumbs, sections, primaryAction, and actions as JavaScript properties and replace array or object identities when controlled state changes.",
1300
+ "Assign breadcrumbs, sections, actionItems, primaryAction, and actions as JavaScript properties and replace array or object identities when controlled state changes.",
1298
1301
  "Handle dsBack for compact navigation and dsBreadcrumbSelect for application-owned expanded breadcrumb navigation, update value after dsSectionChange, and execute product commands from dsAction."
1299
1302
  ],
1300
1303
  "react": [
1301
- "Pass breadcrumb, section, and action arrays directly to DsBarTitle and keep value controlled from route state.",
1304
+ "Pass breadcrumb, section, and ordered action arrays directly to DsBarTitle and keep value controlled from route state.",
1302
1305
  "Place DsBarTitle in DsShellPage with slot=header when automatic page behavior is required."
1303
1306
  ],
1304
1307
  "angular": [
@@ -1323,6 +1326,10 @@
1323
1326
  },
1324
1327
  "api": {
1325
1328
  "props": {
1329
+ "actionItems": {
1330
+ "type": "BarTitleActionConfigItem[]",
1331
+ "required": false
1332
+ },
1326
1333
  "actions": {
1327
1334
  "type": "BarTitleActionItem[]",
1328
1335
  "required": false
@@ -1727,7 +1734,8 @@
1727
1734
  "useWhen": [
1728
1735
  "The user initiates the single primary command in a local decision area.",
1729
1736
  "An action's consequence requires a matching semantic treatment.",
1730
- "A standalone compact primary action needs an icon-only presentation with an explicit accessible name."
1737
+ "A standalone compact primary action needs an icon-only presentation with an explicit accessible name.",
1738
+ "The primary command has closely related alternatives and needs split mode without losing its filled intent, contrast, variant, or loading treatment."
1731
1739
  ],
1732
1740
  "avoidWhen": [
1733
1741
  "Another filled action already exists in the same local decision area.",
@@ -1764,6 +1772,7 @@
1764
1772
  ],
1765
1773
  "accessibility": [
1766
1774
  "Provide an explicit accessible name for icon-only buttons.",
1775
+ "In split mode, provide menuAriaLabel for the appended ChevronDown segment, pass controls with the Menu id, and synchronize expanded with the Menu open state.",
1767
1776
  "Set hasMenu when the action opens a Menu; it implies aria-haspopup of menu and renders the trailing chevron. Pass controls with the Menu id and expanded from the same open state given to Menu.",
1768
1777
  "Use haspopup directly for a non-menu popup such as a dialog; that case gets no chevron.",
1769
1778
  "Use inactive state only when the action must remain visible but unavailable.",
@@ -1787,7 +1796,9 @@
1787
1796
  "Visible labels are emphasized by default. Set labelEmphasis to false when a composed surface deliberately needs the button label to match adjacent regular-weight control labels; this does not change the action hierarchy, foreground, icon, or interaction states.",
1788
1797
  "ButtonFilled has no active, pressed, or selected state; a filled action is a command, not a toggle or a persistent selection.",
1789
1798
  "An open popup is a transient pressed state instead. While expanded is true the pressed wash is held for the popup's complete rendered lifecycle and survives hover, so the trigger reads as held open without introducing a selected treatment.",
1790
- "hasMenu supports only the label and icon-label variants. The chevron is what communicates that a menu will open, so an icon-only filled menu button would leave the affordance unstated."
1799
+ "hasMenu supports only the label and icon-label variants. The chevron is what communicates that a menu will open, so an icon-only filled menu button would leave the affordance unstated.",
1800
+ "Split mode supports label, icon, and icon-label primary segments. The primary segment emits dsClick and the appended menu segment emits dsMenuClick.",
1801
+ "Split mode keeps both segments flush and uses a tertiary on-background separator. Rounded changes the shared outer radius without separating the segments."
1791
1802
  ],
1792
1803
  "responsiveBehavior": [
1793
1804
  "Use fill width only when the parent layout calls for a full-width action, commonly on narrow form layouts."
@@ -1876,6 +1887,10 @@
1876
1887
  "type": "boolean",
1877
1888
  "required": false
1878
1889
  },
1890
+ "menuAriaLabel": {
1891
+ "type": "string",
1892
+ "required": false
1893
+ },
1879
1894
  "pressScale": {
1880
1895
  "type": "boolean",
1881
1896
  "required": false
@@ -1888,6 +1903,10 @@
1888
1903
  "type": "ButtonFilledSize",
1889
1904
  "required": false
1890
1905
  },
1906
+ "split": {
1907
+ "type": "boolean",
1908
+ "required": false
1909
+ },
1891
1910
  "type": {
1892
1911
  "type": "'button' | 'submit' | 'reset'",
1893
1912
  "required": false
@@ -1905,6 +1924,10 @@
1905
1924
  {
1906
1925
  "name": "dsClick",
1907
1926
  "detail": "MouseEvent"
1927
+ },
1928
+ {
1929
+ "name": "dsMenuClick",
1930
+ "detail": "MouseEvent"
1908
1931
  }
1909
1932
  ],
1910
1933
  "slots": []
@@ -1942,7 +1965,8 @@
1942
1965
  "A secondary command accompanies the single filled primary action in a local decision area.",
1943
1966
  "A toolbar, tool rail, overflow area, or shell region needs a compact icon action.",
1944
1967
  "A command represents a persistent toggle or mode whose active state remains meaningful after activation.",
1945
- "A row, card, or toolbar needs an overflow or more-options menu; this is the only component that carries that role."
1968
+ "A row, card, or toolbar needs an overflow or more-options menu; this is the only component that carries that role.",
1969
+ "A secondary command has closely related alternatives and needs split mode without losing its border, surface, active, variant, or loading treatment."
1946
1970
  ],
1947
1971
  "avoidWhen": [
1948
1972
  "The command is the single primary action in a local decision area; use ButtonFilled instead.",
@@ -1977,6 +2001,7 @@
1977
2001
  ],
1978
2002
  "accessibility": [
1979
2003
  "Provide an explicit accessible name for every icon-only action.",
2004
+ "In split mode, provide menuAriaLabel for the appended ChevronDown segment, pass controls with the Menu id, and synchronize expanded with the Menu open state.",
1980
2005
  "Set hasMenu when the button triggers a Menu; it implies aria-haspopup of menu. Pass controls with the Menu id and expanded from the same open state given to Menu. Expanded popup triggers hold only the pressed wash while open, without changing their resting foreground; expanded disclosure controls without popup semantics retain the normal resting appearance.",
1981
2006
  "Give an icon-only menu button an accessible name that states the role, such as More options or Customize table, because no visible label or chevron carries it.",
1982
2007
  "Use haspopup directly for a non-menu popup such as a listbox or dialog; those cases get no chevron.",
@@ -2002,7 +2027,9 @@
2002
2027
  "Icon and icon-label loading replace the icon in place. Label-only loading centers the loader while preserving the button's measured width.",
2003
2028
  "hasMenu covers two distinct menu-button shapes and the variant selects between them. With label or icon-label the action has a menu, and a trailing chevron carries the affordance. With icon the button is a menu and no chevron is added.",
2004
2029
  "Because the icon-only shape has no chevron, its glyph must convey the menu on its own. Use Ellipses for a generic more-options or overflow control. Use a specific icon when the menu has a named purpose, such as Table for Customize table.",
2005
- "An open popup is a transient pressed state rather than a selected one. While expanded is true and haspopup or hasMenu identifies a popup, the pressed wash is held for the popup's complete rendered lifecycle and survives hover without promoting foreground or selected fill, including when chrome opts out of selected fills with activeFill set to false. Expanded disclosure buttons without popup semantics remain visually neutral."
2030
+ "An open popup is a transient pressed state rather than a selected one. While expanded is true and haspopup or hasMenu identifies a popup, the pressed wash is held for the popup's complete rendered lifecycle and survives hover without promoting foreground or selected fill, including when chrome opts out of selected fills with activeFill set to false. Expanded disclosure buttons without popup semantics remain visually neutral.",
2031
+ "Split mode supports label, icon, and icon-label primary segments. The primary segment emits dsClick and the appended menu segment emits dsMenuClick.",
2032
+ "Split mode keeps both segments flush and uses a tertiary surface-aware separator. Bordered mode also preserves the shared outer border; borderless mode limits the separator to the content line height."
2006
2033
  ],
2007
2034
  "responsiveBehavior": [
2008
2035
  "The consuming layout decides when an icon-label action becomes icon-only and must provide an explicit accessible name after changing variants. Table caption Customize is one such layout: below 900px it uses the icon shape while keeping the same neutral resting foreground regardless of the controlled column configuration.",
@@ -2106,6 +2133,10 @@
2106
2133
  "type": "boolean",
2107
2134
  "required": false
2108
2135
  },
2136
+ "menuAriaLabel": {
2137
+ "type": "string",
2138
+ "required": false
2139
+ },
2109
2140
  "pressScale": {
2110
2141
  "type": "boolean",
2111
2142
  "required": false
@@ -2122,6 +2153,10 @@
2122
2153
  "type": "ButtonUnfilledSize",
2123
2154
  "required": false
2124
2155
  },
2156
+ "split": {
2157
+ "type": "boolean",
2158
+ "required": false
2159
+ },
2125
2160
  "type": {
2126
2161
  "type": "'button' | 'submit' | 'reset'",
2127
2162
  "required": false
@@ -2143,6 +2178,10 @@
2143
2178
  {
2144
2179
  "name": "dsClick",
2145
2180
  "detail": "MouseEvent"
2181
+ },
2182
+ {
2183
+ "name": "dsMenuClick",
2184
+ "detail": "MouseEvent"
2146
2185
  }
2147
2186
  ],
2148
2187
  "slots": []
@@ -5271,6 +5310,8 @@
5271
5310
  "Wheel, touch, keyboard navigation, selection, and transcript interaction release automatic following; Scroll to latest explicitly restores it.",
5272
5311
  "A newly appended outgoing Message marked scroll-anchor starts a turn near the top with the configurable previous-turn peek; mutations inside existing messages and prepended history do not re-anchor.",
5273
5312
  "Opening saved history, message jumps, and prepended history preserve deliberate position.",
5313
+ "When a persistent scroller receives a cleared or wholly replaced transcript, it releases internal references to the previous message elements, invalidates their pending anchor work, and treats the replacement as a new baseline at defaultPosition rather than as an appended turn.",
5314
+ "MessageScroller bounds its internal element tracking to the currently rendered transcript. The application still owns transcript data and must cap or window the rendered message collection when conversation history can grow without limit.",
5274
5315
  "The scroll-to-latest action is absent at the live edge, appears only after the reader moves away, and disappears again after returning to the newest message.",
5275
5316
  "Scroll to latest uses the shared md control-elevation wrapper with a pointer-transparent top highlight, preserving its transparent backdrop blur and borderless unfilled action while the press-scale modifier moves the complete elevated surface.",
5276
5317
  "Place a pending human-input surface in interaction and a composer container with 8px padding on every side in overlay; the shared scroll-overlay controller measures them as one stack, tracks every growth step, reserves matching transcript clearance, begins the fade before the stack, and keeps scroll-to-latest above it."
@@ -6780,23 +6821,25 @@
6780
6821
  "tag": "ds-panel-tools",
6781
6822
  "name": "panel-tools",
6782
6823
  "title": "PanelTools",
6783
- "summary": "Desktop and tablet utility rail-and-drawer primitive for explicitly defined application-wide tools, normally assembled by managed ShellApp through ShellTools.",
6824
+ "summary": "Desktop and tablet utility rail-and-drawer primitive for explicitly defined application-wide tools and governed application-owned rail accessories, normally assembled by managed ShellApp through ShellTools.",
6784
6825
  "intentStatus": "complete",
6785
6826
  "intent": {
6786
6827
  "audience": "specialized",
6787
6828
  "status": "stable",
6788
- "summary": "Desktop and tablet utility rail-and-drawer primitive for explicitly defined application-wide tools, normally assembled by managed ShellApp through ShellTools.",
6829
+ "summary": "Desktop and tablet utility rail-and-drawer primitive for explicitly defined application-wide tools and governed application-owned rail accessories, normally assembled by managed ShellApp through ShellTools.",
6789
6830
  "useWhen": [
6790
6831
  "An advanced slotted ShellApp needs the desktop and tablet global-tools primitive directly.",
6791
6832
  "Users need to move between application-wide utilities without losing each tool's in-progress state.",
6792
- "Search, AI conversations, user messages, review stacks, notifications, or help content must remain available alongside route content."
6833
+ "Search, AI conversations, user messages, review stacks, notifications, or help content must remain available alongside route content.",
6834
+ "A persistent desktop or tablet rail needs a generic direct-action status surface or shortcut that must not become a tool drawer."
6793
6835
  ],
6794
6836
  "avoidWhen": [
6795
6837
  "The action is specific to the current page or selected content rather than globally available across the application.",
6796
6838
  "The item navigates to a primary or secondary route; use PanelNav or BarNav instead.",
6797
6839
  "Tool definitions lack stable ids, visible labels, explicit rail placement, or application-owned view content.",
6798
6840
  "Building the mobile tools experience; use ShellTools or managed ShellApp.",
6799
- "PanelTools would be mounted outside the application's single ShellApp."
6841
+ "PanelTools would be mounted outside the application's single ShellApp.",
6842
+ "An application wants unrestricted rail markup that bypasses PanelTools ordering, geometry, focus, overflow, or action semantics."
6800
6843
  ],
6801
6844
  "alternatives": [
6802
6845
  {
@@ -6830,7 +6873,9 @@
6830
6873
  "When the shortcut rail overflows, its labeled body becomes a keyboard-focusable scroll region without changing the rail action order.",
6831
6874
  "Do not trigger global shortcuts while focus is in an editable control.",
6832
6875
  "Use notification dots only as supplemental unread or new-content status and never as the sole status indication.",
6833
- "Explain temporarily inactive tools through an accessible label or adjacent product guidance; omit unauthorized tools entirely."
6876
+ "Explain temporarily inactive tools through an accessible label or adjacent product guidance; omit unauthorized tools entirely.",
6877
+ "Give each interactive accessory a localized action label. Every transient surface requires short status text so its active or positive state is not color-only; shortcut notification dots remain supplemental and decorative accessory boundaries remain hidden from assistive technology.",
6878
+ "Accessory primary and optional secondary actions participate in the same visual and roving keyboard order as tool actions."
6834
6879
  ],
6835
6880
  "states": [
6836
6881
  "Every tool has a stable explicit id and accessible label. The application filters definitions for authorization and entitlement.",
@@ -6848,6 +6893,11 @@
6848
6893
  "Tool view roots stay transparent so ShellApp's chrome wash remains visible; only explicitly designed child surfaces introduce a fill.",
6849
6894
  "Tools with search compose ds-panel-tool-search immediately below the shared header. Its 48px row always contains the md search control and must not be reduced to sm or xs.",
6850
6895
  "If an active optional tool becomes unavailable, PanelTools closes the drawer, clears activeTool, and emits its deselection.",
6896
+ "Application-owned accessories are direct intents rather than tools. Activating one never selects a tool, changes activeTool, opens or closes the drawer, or changes mounted tool-view identity.",
6897
+ "Accessory definitions use stable ids, explicit regions, and explicit order. The governed transient recipe is a 32px by 64px half-radius bold surface with 4px padding: a bordered 24px primary visual above an optional unbordered rounded 24px secondary icon action, separated by 8px. It requires accessible status text, supports active-brand or positive semantic tone, and never renders a notification dot.",
6898
+ "The governed shortcut recipe is one standard-height action: a transparent 24px initial orb with a secondary token border centered in a 32px sizing frame, one or two caption-emphasis initials, an optional ds-badge notification dot aligned exactly with standard tool dots, circular hover and press paint, and no selected state or secondary control.",
6899
+ "When transient status and shortcut groups coexist in one rail region, assign explicit orders that place the transient status first, then a decorative divider, then the shortcuts. Do not infer this grouping from application-specific ids.",
6900
+ "Adding, removing, or reordering accessories preserves a surviving focused action when possible and moves focus to the nearest surviving rail action when the focused accessory is removed.",
6851
6901
  "Use isInactive only for a temporarily unavailable visible tool; omit tools the user is not authorized to access.",
6852
6902
  "Rail actions disable physical press scaling so notification-dot halos remain aligned to the shell gradient; hover and pressed washes continue to paint above the dot and halo.",
6853
6903
  "Rail tooltips are shell-owned and position against the viewport so the narrow tools-lane collision boundary cannot clamp them beyond the viewport edge.",
@@ -6860,22 +6910,23 @@
6860
6910
  "The open drawer reduces main-content width and uses --dimension-panel-width-xs (300px) on every supported desktop and tablet viewport.",
6861
6911
  "ShellApp owns the fixed drawer-width variable; consumers must not hardcode alternate drawer widths.",
6862
6912
  "Below 768px, do not reuse PanelTools directly; ShellTools and managed ShellApp present the same persistent tool owners through mobile chrome.",
6913
+ "Rail accessories are intentionally desktop and tablet only. Consuming applications provide equivalent persistent mobile status through ShellApp's top banner or status region rather than converting an accessory into a tool view.",
6863
6914
  "Keep named-slot content mounted while tools switch or the drawer closes so users can return to in-progress global work.",
6864
6915
  "Conversation products may use fullscreenHeaderMode split for a 300px history rail beside a flexible detail pane, each with its own canonical header; the application owns that internal split layout.",
6865
6916
  "Use fixed drawer widths for now; do not add user resizing or width persistence."
6866
6917
  ],
6867
6918
  "frameworkCaveats": {
6868
6919
  "customElements": [
6869
- "Assign items and headers as JavaScript properties and replace their references when collections change.",
6920
+ "Assign items, accessories, and headers as JavaScript properties and replace their references when collections change.",
6870
6921
  "Assign headers as a JavaScript property and replace its object identity whenever an active tool changes title, depth, or actions.",
6871
6922
  "Keep PanelTools mounted at ShellApp scope across route changes and provide each product through its matching named slot."
6872
6923
  ],
6873
6924
  "react": [
6874
- "Pass a stable explicitly ordered item collection through the generated React wrapper and keep named-slot product content mounted at ShellApp scope.",
6925
+ "Pass stable explicitly ordered tool and accessory collections through the generated React wrapper and keep named-slot product content mounted at ShellApp scope.",
6875
6926
  "Use storageKey only for same-browser last-tool continuity; do not persist the open drawer."
6876
6927
  ],
6877
6928
  "angular": [
6878
- "Import DsPanelTools from @ds-mo/ui/angular/ds-panel-tools and bind items as a property.",
6929
+ "Import DsPanelTools from @ds-mo/ui/angular/ds-panel-tools and bind structured tool and accessory collections as properties.",
6879
6930
  "Bind headers as a replaced object and route dsHeaderBack and dsHeaderAction to the active tool owner.",
6880
6931
  "Keep the component in the persistent shell layout rather than recreating it in routed page components."
6881
6932
  ]
@@ -6897,6 +6948,10 @@
6897
6948
  },
6898
6949
  "api": {
6899
6950
  "props": {
6951
+ "accessories": {
6952
+ "type": "PanelToolsRailAccessory[]",
6953
+ "required": false
6954
+ },
6900
6955
  "activeTool": {
6901
6956
  "type": "PanelToolsToolId | ''",
6902
6957
  "required": false
@@ -6955,6 +7010,10 @@
6955
7010
  "name": "dsPresentationChange",
6956
7011
  "detail": "{\n presentation: 'drawer' | 'fullscreen';\n }"
6957
7012
  },
7013
+ {
7014
+ "name": "dsRailAccessoryAction",
7015
+ "detail": "PanelToolsRailAccessoryActionDetail"
7016
+ },
6958
7017
  {
6959
7018
  "name": "dsToolChange",
6960
7019
  "detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }"
@@ -6970,11 +7029,16 @@
6970
7029
  },
6971
7030
  "dependencies": [
6972
7031
  "@ds-mo/ui",
6973
- "@ds-mo/tokens"
7032
+ "@ds-mo/tokens",
7033
+ "@ds-mo/icons"
6974
7034
  ],
6975
7035
  "componentDependencies": [
7036
+ "badge",
6976
7037
  "button-unfilled",
7038
+ "divider",
7039
+ "icon",
6977
7040
  "panel-tool-header",
7041
+ "text",
6978
7042
  "tooltip"
6979
7043
  ]
6980
7044
  },
@@ -7677,6 +7741,8 @@
7677
7741
  "In panel mode, supply the same route sections as children on their PanelNav parent and handle dsNavChildSelect as structured parent, child, and href navigation intent.",
7678
7742
  "The application supplies each routed content owner and tool view once. ShellApp changes visibility, inert state, and presentation without recreating those nodes.",
7679
7743
  "The optional banner slot accepts one application-owned ds-banner above the complete shell row. The application owns its open state, orientation for the current shell capacity, action consequences, dismissal persistence, and resolution when several messages compete.",
7744
+ "Managed tools may include governed desktop and tablet rail accessories for transient status or direct shortcuts. ShellApp forwards their intents without changing the selected tool, drawer state, or mounted tool views.",
7745
+ "Consuming applications own accessory state, labels, timers, permissions, navigation, and action consequences; ShellApp owns only managed forwarding and responsive placement.",
7680
7746
  "Use composition=slotted only for advanced application architectures that intentionally own all lower-level chrome wiring.",
7681
7747
  "Set gradientPreset to the single resolved global chrome preference: neutral by default, none for solid chrome, or cool, neutral, warm, and fresh for token-based washes.",
7682
7748
  "The application owns gradient preference persistence, cross-tab synchronization, and server or account precedence; ShellApp owns rendering the resolved preset across authenticated routes.",
@@ -7684,6 +7750,7 @@
7684
7750
  "Dashboard represents day-to-day operational work while Settings represents administrative and configuration work; route state selects the context.",
7685
7751
  "Replace navigation and pageChrome together from one completed route state.",
7686
7752
  "When pageChrome.showBack marks a detail depth, mobile chrome keeps the page heading as its identity and presents only local subsections; peer route tabs remain in desktop BarNav rather than replacing the detail heading.",
7753
+ "Route-owned ordered page actions drive both BarTitle and MobileHeader. ShellApp forwards one flat page-action id and owns the derived mobile overflow menu so routes do not duplicate menu state or choices.",
7687
7754
  "Managed ShellApp keeps the selected desktop section-navigation presentation and ShellPage present and owns page header stickiness and the content scroller.",
7688
7755
  "Route-owned pageChrome independently selects ShellPage contentInset, page-header seams, scroll compaction, expanded and compact header-divider visibility, and contentSurface. ShellApp forwards them while resolving whether desktop title geometry is page-local or shell-bar-owned.",
7689
7756
  "The application filters unauthorized destinations, sections, and tools before passing them into shell components."
@@ -7703,10 +7770,12 @@
7703
7770
  "When the application enables viewport-fit=cover, ShellApp reserves the shared top safe-area inset once for the complete mobile stage; nested routed, sheet, and tool headers must not add a second top inset.",
7704
7771
  "A slotted Banner remains below the top safe-area inset and above routed, navigation, fullscreen-tool, and mobile global-surface presentations.",
7705
7772
  "Mobile global surfaces conceal and inert the routed workspace without unmounting it, preserving nested routes and scroll state.",
7773
+ "Managed rail accessories are intentionally omitted below 768px. Applications that need equivalent persistent mobile status provide it through the top banner or status region; ShellApp does not convert rail accessories into mobile tool views.",
7706
7774
  "Keep PanelNav width, BarNav height, PanelTools chrome, and main-content origin stable except during intentional responsive or collapse transitions.",
7707
7775
  "The routed content cell and tools cell expose separate anchored-overlay collision boundaries, so top-layer menus and tooltips remain above local clipping without crossing into neighboring shell lanes. Full-screen modal overlays remain viewport-owned.",
7708
7776
  "Paper texture chrome is desktop/tablet-only and follows the fixed viewport phase of the shell chrome; mobile remains a solid primary stage.",
7709
7777
  "Managed page-header capacity follows only the fixed shell breakpoint: roomy on desktop and compact on tablet. Opening PanelTools does not compact or constrain BarTitle.",
7778
+ "Mobile keeps at most the first eligible ordered icon command visible and moves labeled buttons, menu choices, split actions, and explicit overflow commands into one shell-owned text-only page-actions menu.",
7710
7779
  "The bottom bar remains visible at all route and tool depths in the foundation release."
7711
7780
  ],
7712
7781
  "frameworkCaveats": {
@@ -7838,6 +7907,10 @@
7838
7907
  "name": "dsPresentationChange",
7839
7908
  "detail": "{ presentation: 'drawer' | 'fullscreen' }"
7840
7909
  },
7910
+ {
7911
+ "name": "dsRailAccessoryAction",
7912
+ "detail": "PanelToolsRailAccessoryActionDetail"
7913
+ },
7841
7914
  {
7842
7915
  "name": "dsResponsiveModeChange",
7843
7916
  "detail": "{ mode: ShellResponsiveMode }"
@@ -7870,7 +7943,9 @@
7870
7943
  "componentDependencies": [
7871
7944
  "bar-nav",
7872
7945
  "bar-title",
7946
+ "button-filled",
7873
7947
  "button-unfilled",
7948
+ "menu",
7874
7949
  "mobile-bar-nav",
7875
7950
  "mobile-header",
7876
7951
  "mobile-sheet-nav",
@@ -8087,21 +8162,24 @@
8087
8162
  "accessibility": [
8088
8163
  "Only the active mobile tool view participates in focus or the accessibility tree.",
8089
8164
  "Header Back and application-owned header actions preserve the PanelTools event contract.",
8090
- "A direct Activity destination renders its own named tool view; an explicitly grouped Inbox uses a named label-only TabGroup."
8165
+ "A direct Activity destination renders its own named tool view; an explicitly grouped Inbox uses a named label-only TabGroup.",
8166
+ "Desktop and tablet rail accessories retain PanelTools-owned labels, focus order, decorative-boundary semantics, and direct-action events."
8091
8167
  ],
8092
8168
  "states": [
8093
8169
  "The application owns open and activeTool and replaces headers when tool depth changes.",
8094
8170
  "Items with mobileDestination inbox map to one mobile Inbox destination while retaining the actual active tool id; the canonical recipe exposes Activity directly and keeps Inbox grouping opt-in.",
8095
8171
  "Stable tool ids own named slots; label, order, rail placement, shortcut, and mobile destination are explicit item data.",
8172
+ "Application-owned rail accessories are forwarded unchanged to PanelTools on desktop and tablet and remain independent from activeTool and open.",
8096
8173
  "Switching responsive mode must not recreate application-owned slotted product elements."
8097
8174
  ],
8098
8175
  "responsiveBehavior": [
8099
8176
  "Desktop and tablet compose PanelTools-compatible rail and drawer chrome.",
8100
- "Mobile renders one centered MobileHeader for every direct tool; explicitly grouped Inbox tools use the large segmented section control."
8177
+ "Mobile renders one centered MobileHeader for every direct tool; explicitly grouped Inbox tools use the large segmented section control.",
8178
+ "Mobile intentionally omits desktop and tablet rail accessories instead of promoting them into tool views. Applications provide an equivalent persistent mobile status surface through ShellApp's top banner or status region."
8101
8179
  ],
8102
8180
  "frameworkCaveats": {
8103
8181
  "customElements": [
8104
- "Assign items and headers as JavaScript properties and place each persistent owner in its named *-view slot."
8182
+ "Assign items, accessories, and headers as JavaScript properties and place each persistent owner in its named *-view slot."
8105
8183
  ],
8106
8184
  "react": [
8107
8185
  "Keep stable keyed product owner elements in the generated wrapper's named slots."
@@ -8123,6 +8201,10 @@
8123
8201
  },
8124
8202
  "api": {
8125
8203
  "props": {
8204
+ "accessories": {
8205
+ "type": "PanelToolsRailAccessory[]",
8206
+ "required": false
8207
+ },
8126
8208
  "activeTool": {
8127
8209
  "type": "PanelToolsToolId | ''",
8128
8210
  "required": false
@@ -8185,6 +8267,10 @@
8185
8267
  "name": "dsPresentationChange",
8186
8268
  "detail": "{\n presentation: 'drawer' | 'fullscreen';\n }"
8187
8269
  },
8270
+ {
8271
+ "name": "dsRailAccessoryAction",
8272
+ "detail": "PanelToolsRailAccessoryActionDetail"
8273
+ },
8188
8274
  {
8189
8275
  "name": "dsToolChange",
8190
8276
  "detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }"
@@ -12,7 +12,7 @@ export declare class DsBarTitle {
12
12
  dsAction: EventEmitter<DsBarTitleCustomEvent<string>>;
13
13
  constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
14
14
  static ɵfac: i0.ɵɵFactoryDeclaration<DsBarTitle, never>;
15
- static ɵcmp: i0.ɵɵComponentDeclaration<DsBarTitle, "ds-bar-title", never, { "actions": { "alias": "actions"; "required": false; }; "actionsAriaLabel": { "alias": "actionsAriaLabel"; "required": false; }; "backAriaLabel": { "alias": "backAriaLabel"; "required": false; }; "backLabel": { "alias": "backLabel"; "required": false; }; "breadcrumbAriaLabel": { "alias": "breadcrumbAriaLabel"; "required": false; }; "breadcrumbs": { "alias": "breadcrumbs"; "required": false; }; "description": { "alias": "description"; "required": false; }; "heading": { "alias": "heading"; "required": true; }; "placement": { "alias": "placement"; "required": false; }; "primaryAction": { "alias": "primaryAction"; "required": false; }; "sections": { "alias": "sections"; "required": false; }; "sectionsAriaLabel": { "alias": "sectionsAriaLabel"; "required": false; }; "showBack": { "alias": "showBack"; "required": false; }; "showCompactDivider": { "alias": "showCompactDivider"; "required": false; }; "showDivider": { "alias": "showDivider"; "required": false; }; "value": { "alias": "value"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; }, { "dsBack": "dsBack"; "dsBreadcrumbSelect": "dsBreadcrumbSelect"; "dsSectionChange": "dsSectionChange"; "dsAction": "dsAction"; }, never, ["*"], true, never>;
15
+ static ɵcmp: i0.ɵɵComponentDeclaration<DsBarTitle, "ds-bar-title", never, { "actionItems": { "alias": "actionItems"; "required": false; }; "actions": { "alias": "actions"; "required": false; }; "actionsAriaLabel": { "alias": "actionsAriaLabel"; "required": false; }; "backAriaLabel": { "alias": "backAriaLabel"; "required": false; }; "backLabel": { "alias": "backLabel"; "required": false; }; "breadcrumbAriaLabel": { "alias": "breadcrumbAriaLabel"; "required": false; }; "breadcrumbs": { "alias": "breadcrumbs"; "required": false; }; "description": { "alias": "description"; "required": false; }; "heading": { "alias": "heading"; "required": true; }; "placement": { "alias": "placement"; "required": false; }; "primaryAction": { "alias": "primaryAction"; "required": false; }; "sections": { "alias": "sections"; "required": false; }; "sectionsAriaLabel": { "alias": "sectionsAriaLabel"; "required": false; }; "showBack": { "alias": "showBack"; "required": false; }; "showCompactDivider": { "alias": "showCompactDivider"; "required": false; }; "showDivider": { "alias": "showDivider"; "required": false; }; "value": { "alias": "value"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; }, { "dsBack": "dsBack"; "dsBreadcrumbSelect": "dsBreadcrumbSelect"; "dsSectionChange": "dsSectionChange"; "dsAction": "dsAction"; }, never, ["*"], true, never>;
16
16
  }
17
17
  export declare interface DsBarTitle extends Components.DsBarTitle {
18
18
  /**
@@ -21,12 +21,12 @@ let DsBarTitle = class DsBarTitle {
21
21
  this.el = r.nativeElement;
22
22
  }
23
23
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: DsBarTitle, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
24
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: DsBarTitle, isStandalone: true, selector: "ds-bar-title", inputs: { actions: "actions", actionsAriaLabel: "actionsAriaLabel", backAriaLabel: "backAriaLabel", backLabel: "backLabel", breadcrumbAriaLabel: "breadcrumbAriaLabel", breadcrumbs: "breadcrumbs", description: "description", heading: "heading", placement: "placement", primaryAction: "primaryAction", sections: "sections", sectionsAriaLabel: "sectionsAriaLabel", showBack: "showBack", showCompactDivider: "showCompactDivider", showDivider: "showDivider", value: "value", variant: "variant" }, outputs: { dsBack: "dsBack", dsBreadcrumbSelect: "dsBreadcrumbSelect", dsSectionChange: "dsSectionChange", dsAction: "dsAction" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: DsBarTitle, isStandalone: true, selector: "ds-bar-title", inputs: { actionItems: "actionItems", actions: "actions", actionsAriaLabel: "actionsAriaLabel", backAriaLabel: "backAriaLabel", backLabel: "backLabel", breadcrumbAriaLabel: "breadcrumbAriaLabel", breadcrumbs: "breadcrumbs", description: "description", heading: "heading", placement: "placement", primaryAction: "primaryAction", sections: "sections", sectionsAriaLabel: "sectionsAriaLabel", showBack: "showBack", showCompactDivider: "showCompactDivider", showDivider: "showDivider", value: "value", variant: "variant" }, outputs: { dsBack: "dsBack", dsBreadcrumbSelect: "dsBreadcrumbSelect", dsSectionChange: "dsSectionChange", dsAction: "dsAction" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25
25
  };
26
26
  DsBarTitle = __decorate([
27
27
  ProxyCmp({
28
28
  defineCustomElementFn: defineDsBarTitle,
29
- inputs: ['actions', 'actionsAriaLabel', 'backAriaLabel', 'backLabel', 'breadcrumbAriaLabel', 'breadcrumbs', 'description', 'heading', 'placement', 'primaryAction', 'sections', 'sectionsAriaLabel', 'showBack', 'showCompactDivider', 'showDivider', 'value', 'variant']
29
+ inputs: ['actionItems', 'actions', 'actionsAriaLabel', 'backAriaLabel', 'backLabel', 'breadcrumbAriaLabel', 'breadcrumbs', 'description', 'heading', 'placement', 'primaryAction', 'sections', 'sectionsAriaLabel', 'showBack', 'showCompactDivider', 'showDivider', 'value', 'variant']
30
30
  })
31
31
  ], DsBarTitle);
32
32
  export { DsBarTitle };
@@ -37,7 +37,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
37
37
  changeDetection: ChangeDetectionStrategy.OnPush,
38
38
  template: '<ng-content></ng-content>',
39
39
  // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
40
- inputs: ['actions', 'actionsAriaLabel', 'backAriaLabel', 'backLabel', 'breadcrumbAriaLabel', 'breadcrumbs', 'description', { name: 'heading', required: true }, 'placement', 'primaryAction', 'sections', 'sectionsAriaLabel', 'showBack', 'showCompactDivider', 'showDivider', 'value', 'variant'],
40
+ inputs: ['actionItems', 'actions', 'actionsAriaLabel', 'backAriaLabel', 'backLabel', 'breadcrumbAriaLabel', 'breadcrumbs', 'description', { name: 'heading', required: true }, 'placement', 'primaryAction', 'sections', 'sectionsAriaLabel', 'showBack', 'showCompactDivider', 'showDivider', 'value', 'variant'],
41
41
  outputs: ['dsBack', 'dsBreadcrumbSelect', 'dsSectionChange', 'dsAction'],
42
42
  }]
43
43
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { dsBack: [{