@ds-mo/ui 13.9.0 → 13.11.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 (172) hide show
  1. package/dist/.package-ready.json +1 -1
  2. package/dist/agent-patterns.json +4 -4
  3. package/dist/agent.json +16 -8
  4. package/dist/angular/ds-mobile-bar-nav.d.ts +1 -1
  5. package/dist/angular/ds-mobile-bar-nav.js +3 -3
  6. package/dist/components/ds-agent-activity.js +1 -1
  7. package/dist/components/ds-agent-response.js +1 -1
  8. package/dist/components/ds-agent-source-list.js +1 -1
  9. package/dist/components/ds-agent-tool-call.js +1 -1
  10. package/dist/components/ds-attachment-list.js +1 -1
  11. package/dist/components/ds-avatar.js +1 -1
  12. package/dist/components/ds-banner.js +1 -1
  13. package/dist/components/ds-bar-nav.js +1 -1
  14. package/dist/components/ds-bar-title.js +1 -1
  15. package/dist/components/ds-bar-workflow.js +1 -1
  16. package/dist/components/ds-button-filled.js +1 -1
  17. package/dist/components/ds-button-unfilled.js +1 -1
  18. package/dist/components/ds-card-chart.js +1 -1
  19. package/dist/components/ds-card-overview.js +1 -1
  20. package/dist/components/ds-card-overview.js.map +1 -1
  21. package/dist/components/ds-card-setting.js +1 -1
  22. package/dist/components/ds-chip.js +1 -1
  23. package/dist/components/ds-code-block.js +1 -1
  24. package/dist/components/ds-empty-state.js +1 -1
  25. package/dist/components/ds-icon.js +1 -1
  26. package/dist/components/ds-input.js +1 -1
  27. package/dist/components/ds-markdown.js +1 -1
  28. package/dist/components/ds-message-actions.js +1 -1
  29. package/dist/components/ds-message-composer.js +1 -1
  30. package/dist/components/ds-message-scroller.js +1 -1
  31. package/dist/components/ds-mobile-bar-nav.js +1 -1
  32. package/dist/components/ds-mobile-sheet-nav.js +1 -1
  33. package/dist/components/ds-modal.js +1 -1
  34. package/dist/components/ds-panel-nav.js +1 -1
  35. package/dist/components/ds-panel-tool-header.js +1 -1
  36. package/dist/components/ds-panel-tool-search.js +1 -1
  37. package/dist/components/ds-panel-tools.js +1 -1
  38. package/dist/components/ds-select.js +1 -1
  39. package/dist/components/ds-shell-app.js +1 -1
  40. package/dist/components/ds-shell-app.js.map +1 -1
  41. package/dist/components/ds-shell-tools.js +1 -1
  42. package/dist/components/ds-tab-group.js +1 -1
  43. package/dist/components/ds-tag.js +1 -1
  44. package/dist/components/ds-toast.js +1 -1
  45. package/dist/components/index.js +1 -1
  46. package/dist/components/index.js.map +1 -1
  47. package/dist/components/{p-BtS5na9O.js → p-BRajO-Za.js} +2 -2
  48. package/dist/components/{p-BQDi0v_h.js → p-BX57q1Lo.js} +2 -2
  49. package/dist/components/{p-BkWhTEqe.js → p-B_nHX-BW.js} +2 -2
  50. package/dist/components/{p-Dv8_hmUZ.js → p-C5gZHZHU.js} +2 -2
  51. package/dist/components/{p-HIg1XX62.js → p-CIlO_j3q.js} +2 -2
  52. package/dist/components/p-CIlO_j3q.js.map +1 -0
  53. package/dist/components/{p-CnbrksLl.js → p-CVmtbj-6.js} +2 -2
  54. package/dist/components/{p-BjoyHNaM.js → p-CdFnvBem.js} +2 -2
  55. package/dist/components/{p-BP-EtYbR.js → p-DAbaMtEX.js} +2 -2
  56. package/dist/components/{p-KFHFBznh.js → p-DBJJiSP0.js} +2 -2
  57. package/dist/components/{p-D8qgVmHn.js → p-DBchq8Zw.js} +2 -2
  58. package/dist/components/{p-BYB0f1_F.js → p-DCN04sgt.js} +2 -2
  59. package/dist/components/{p-D2dQyoyK.js → p-DGkWMhHO.js} +2 -2
  60. package/dist/components/{p-2inC7Jm-.js → p-DJGdoPMG.js} +2 -2
  61. package/dist/components/p-DNpE0RBz.js +2 -0
  62. package/dist/components/p-DNpE0RBz.js.map +1 -0
  63. package/dist/components/{p-BjIYFiuQ.js → p-DcmqsAMP.js} +2 -2
  64. package/dist/components/p-DkhE3BsH.js +2 -0
  65. package/dist/components/p-DkhE3BsH.js.map +1 -0
  66. package/dist/components/{p-B4VlfBNc.js → p-Doz2uwRv.js} +2 -2
  67. package/dist/components/p-DumWT7NN.js +2 -0
  68. package/dist/components/p-DumWT7NN.js.map +1 -0
  69. package/dist/components/{p-Cog5NTLa.js → p-Xftomzsv.js} +2 -2
  70. package/dist/components/{p-DJ0XMH9E.js → p-c1pY-Mqq.js} +2 -2
  71. package/dist/docs/components.json +76 -10
  72. package/dist/lib/components/PanelTools/panel-tools-types.d.ts +3 -3
  73. package/dist/lib/shell/index.js +12 -11
  74. package/dist/lib/shell/index.js.map +2 -2
  75. package/dist/lib/shell/shell-responsive.d.ts +1 -1
  76. package/dist/mcp-data/registry/agent-activity.json +1 -1
  77. package/dist/mcp-data/registry/agent-response.json +1 -1
  78. package/dist/mcp-data/registry/agent-source-list.json +1 -1
  79. package/dist/mcp-data/registry/agent-tool-call.json +1 -1
  80. package/dist/mcp-data/registry/attachment-list.json +1 -1
  81. package/dist/mcp-data/registry/avatar.json +1 -1
  82. package/dist/mcp-data/registry/badge.json +1 -1
  83. package/dist/mcp-data/registry/banner.json +1 -1
  84. package/dist/mcp-data/registry/bar-nav.json +1 -1
  85. package/dist/mcp-data/registry/bar-title.json +1 -1
  86. package/dist/mcp-data/registry/bar-workflow.json +1 -1
  87. package/dist/mcp-data/registry/breadcrumb.json +1 -1
  88. package/dist/mcp-data/registry/button-filled.json +1 -1
  89. package/dist/mcp-data/registry/button-unfilled.json +1 -1
  90. package/dist/mcp-data/registry/card-chart.json +1 -1
  91. package/dist/mcp-data/registry/card-overview.json +7 -7
  92. package/dist/mcp-data/registry/card-setting.json +1 -1
  93. package/dist/mcp-data/registry/chart-legend.json +1 -1
  94. package/dist/mcp-data/registry/chart.json +1 -1
  95. package/dist/mcp-data/registry/checkbox.json +1 -1
  96. package/dist/mcp-data/registry/chip.json +1 -1
  97. package/dist/mcp-data/registry/code-block.json +1 -1
  98. package/dist/mcp-data/registry/conversation-list-item.json +1 -1
  99. package/dist/mcp-data/registry/conversation-list-section.json +1 -1
  100. package/dist/mcp-data/registry/conversation-list.json +1 -1
  101. package/dist/mcp-data/registry/divider.json +1 -1
  102. package/dist/mcp-data/registry/empty-state.json +1 -1
  103. package/dist/mcp-data/registry/field.json +1 -1
  104. package/dist/mcp-data/registry/icon.json +2 -2
  105. package/dist/mcp-data/registry/input.json +1 -1
  106. package/dist/mcp-data/registry/loader.json +1 -1
  107. package/dist/mcp-data/registry/markdown.json +1 -1
  108. package/dist/mcp-data/registry/menu.json +1 -1
  109. package/dist/mcp-data/registry/message-actions.json +1 -1
  110. package/dist/mcp-data/registry/message-bubble.json +1 -1
  111. package/dist/mcp-data/registry/message-composer.json +1 -1
  112. package/dist/mcp-data/registry/message-scroller.json +1 -1
  113. package/dist/mcp-data/registry/message.json +1 -1
  114. package/dist/mcp-data/registry/mobile-bar-nav.json +39 -7
  115. package/dist/mcp-data/registry/mobile-header.json +1 -1
  116. package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
  117. package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
  118. package/dist/mcp-data/registry/modal.json +1 -1
  119. package/dist/mcp-data/registry/panel-nav.json +1 -1
  120. package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
  121. package/dist/mcp-data/registry/panel-tool-header.json +1 -1
  122. package/dist/mcp-data/registry/panel-tool-search.json +1 -1
  123. package/dist/mcp-data/registry/panel-tools.json +3 -3
  124. package/dist/mcp-data/registry/radio.json +1 -1
  125. package/dist/mcp-data/registry/registry.json +16 -8
  126. package/dist/mcp-data/registry/scroll-overlay.json +1 -1
  127. package/dist/mcp-data/registry/select.json +1 -1
  128. package/dist/mcp-data/registry/shell-app.json +4 -4
  129. package/dist/mcp-data/registry/shell-page.json +1 -1
  130. package/dist/mcp-data/registry/shell-tools.json +4 -4
  131. package/dist/mcp-data/registry/skeleton.json +1 -1
  132. package/dist/mcp-data/registry/slider.json +1 -1
  133. package/dist/mcp-data/registry/swatch-picker.json +1 -1
  134. package/dist/mcp-data/registry/switch.json +1 -1
  135. package/dist/mcp-data/registry/tab-group.json +1 -1
  136. package/dist/mcp-data/registry/tag.json +1 -1
  137. package/dist/mcp-data/registry/text.json +1 -1
  138. package/dist/mcp-data/registry/toast.json +1 -1
  139. package/dist/mcp-data/registry/tooltip-chart.json +1 -1
  140. package/dist/mcp-data/registry/tooltip.json +1 -1
  141. package/dist/mcp-data/registry/typing-indicator.json +1 -1
  142. package/dist/types/components/CardOverview/CardOverview.d.ts +2 -0
  143. package/dist/types/components/CardOverview/card-overview-controller.d.ts +15 -4
  144. package/dist/types/components/CardOverview/card-overview-types.d.ts +0 -2
  145. package/dist/types/components/MobileBarNav/MobileBarNav.d.ts +4 -2
  146. package/dist/types/components/PanelTools/panel-tools-types.d.ts +3 -3
  147. package/dist/types/components.d.ts +22 -4
  148. package/dist/types/shell/shell-responsive.d.ts +1 -1
  149. package/package.json +6 -5
  150. package/dist/components/p-B16OuqyJ.js +0 -2
  151. package/dist/components/p-B16OuqyJ.js.map +0 -1
  152. package/dist/components/p-BAfG3M8z.js +0 -2
  153. package/dist/components/p-BAfG3M8z.js.map +0 -1
  154. package/dist/components/p-BnQXAbif.js +0 -2
  155. package/dist/components/p-BnQXAbif.js.map +0 -1
  156. package/dist/components/p-HIg1XX62.js.map +0 -1
  157. /package/dist/components/{p-BtS5na9O.js.map → p-BRajO-Za.js.map} +0 -0
  158. /package/dist/components/{p-BQDi0v_h.js.map → p-BX57q1Lo.js.map} +0 -0
  159. /package/dist/components/{p-BkWhTEqe.js.map → p-B_nHX-BW.js.map} +0 -0
  160. /package/dist/components/{p-Dv8_hmUZ.js.map → p-C5gZHZHU.js.map} +0 -0
  161. /package/dist/components/{p-CnbrksLl.js.map → p-CVmtbj-6.js.map} +0 -0
  162. /package/dist/components/{p-BjoyHNaM.js.map → p-CdFnvBem.js.map} +0 -0
  163. /package/dist/components/{p-BP-EtYbR.js.map → p-DAbaMtEX.js.map} +0 -0
  164. /package/dist/components/{p-KFHFBznh.js.map → p-DBJJiSP0.js.map} +0 -0
  165. /package/dist/components/{p-D8qgVmHn.js.map → p-DBchq8Zw.js.map} +0 -0
  166. /package/dist/components/{p-BYB0f1_F.js.map → p-DCN04sgt.js.map} +0 -0
  167. /package/dist/components/{p-D2dQyoyK.js.map → p-DGkWMhHO.js.map} +0 -0
  168. /package/dist/components/{p-2inC7Jm-.js.map → p-DJGdoPMG.js.map} +0 -0
  169. /package/dist/components/{p-BjIYFiuQ.js.map → p-DcmqsAMP.js.map} +0 -0
  170. /package/dist/components/{p-B4VlfBNc.js.map → p-Doz2uwRv.js.map} +0 -0
  171. /package/dist/components/{p-Cog5NTLa.js.map → p-Xftomzsv.js.map} +0 -0
  172. /package/dist/components/{p-DJ0XMH9E.js.map → p-c1pY-Mqq.js.map} +0 -0
@@ -454,7 +454,7 @@
454
454
  "peerDependencies": {
455
455
  "required": [
456
456
  "@ds-mo/tokens ^6.0.0",
457
- "@ds-mo/icons ^6.4.0"
457
+ "@ds-mo/icons ^6.5.0"
458
458
  ],
459
459
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
460
460
  }
@@ -158,7 +158,7 @@
158
158
  "peerDependencies": {
159
159
  "required": [
160
160
  "@ds-mo/tokens ^6.0.0",
161
- "@ds-mo/icons ^6.4.0"
161
+ "@ds-mo/icons ^6.5.0"
162
162
  ],
163
163
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
164
164
  }
@@ -98,7 +98,7 @@
98
98
  "peerDependencies": {
99
99
  "required": [
100
100
  "@ds-mo/tokens ^6.0.0",
101
- "@ds-mo/icons ^6.4.0"
101
+ "@ds-mo/icons ^6.5.0"
102
102
  ],
103
103
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
104
104
  }
@@ -239,7 +239,7 @@
239
239
  "peerDependencies": {
240
240
  "required": [
241
241
  "@ds-mo/tokens ^6.0.0",
242
- "@ds-mo/icons ^6.4.0"
242
+ "@ds-mo/icons ^6.5.0"
243
243
  ],
244
244
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
245
245
  }
@@ -192,7 +192,7 @@
192
192
  "peerDependencies": {
193
193
  "required": [
194
194
  "@ds-mo/tokens ^6.0.0",
195
- "@ds-mo/icons ^6.4.0"
195
+ "@ds-mo/icons ^6.5.0"
196
196
  ],
197
197
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
198
198
  }
@@ -250,7 +250,7 @@
250
250
  "peerDependencies": {
251
251
  "required": [
252
252
  "@ds-mo/tokens ^6.0.0",
253
- "@ds-mo/icons ^6.4.0"
253
+ "@ds-mo/icons ^6.5.0"
254
254
  ],
255
255
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
256
256
  }
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
3
  "name": "mobile-bar-nav",
4
4
  "title": "MobileBarNav",
5
- "description": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
5
+ "description": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Inbox, Messages, and Agents.",
6
6
  "type": "registry:ui",
7
7
  "meta": {
8
8
  "library": "@ds-mo/ui",
@@ -13,7 +13,7 @@
13
13
  "intent": {
14
14
  "audience": "specialized",
15
15
  "status": "experimental",
16
- "summary": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
16
+ "summary": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Inbox, Messages, and Agents.",
17
17
  "useWhen": [
18
18
  "ShellApp is rendering its dedicated below-768px application composition."
19
19
  ],
@@ -32,7 +32,7 @@
32
32
  "Only the active destination exposes aria-current; Menu exposes its controlled pane through aria-expanded."
33
33
  ],
34
34
  "states": [
35
- "The fixed groups are Menu plus current area, followed by Search, Inbox, and Agents.",
35
+ "The fixed groups are Menu plus current area, followed by Search, Inbox, Messages, and Agents.",
36
36
  "Selection promotes foreground to primary without painting a selected fill; unselected destinations use tertiary foreground.",
37
37
  "Opening Mobile Sheet Nav replaces the Menu glyph with Cross while preserving its accessible name.",
38
38
  "Reselecting an active destination does not reset its nested state.",
@@ -54,7 +54,7 @@
54
54
  "props": {
55
55
  "activeDestination": {
56
56
  "type": "MobileDestination",
57
- "resolvedType": "\"agents\" | \"area\" | \"help\" | \"inbox\" | \"search\"",
57
+ "resolvedType": "\"agents\" | \"area\" | \"help\" | \"inbox\" | \"messages\" | \"search\"",
58
58
  "attribute": "active-destination",
59
59
  "default": "'area'",
60
60
  "required": false,
@@ -115,6 +115,22 @@
115
115
  "required": false,
116
116
  "mutable": false
117
117
  },
118
+ "messagesDot": {
119
+ "type": "boolean",
120
+ "resolvedType": "boolean",
121
+ "attribute": "messages-dot",
122
+ "default": "false",
123
+ "required": false,
124
+ "mutable": false
125
+ },
126
+ "messagesLabel": {
127
+ "type": "string",
128
+ "resolvedType": "string",
129
+ "attribute": "messages-label",
130
+ "default": "'Messages'",
131
+ "required": false,
132
+ "mutable": false
133
+ },
118
134
  "searchDot": {
119
135
  "type": "boolean",
120
136
  "resolvedType": "boolean",
@@ -167,7 +183,7 @@
167
183
  "props": {
168
184
  "activeDestination": {
169
185
  "type": "MobileDestination",
170
- "resolvedType": "\"agents\" | \"area\" | \"help\" | \"inbox\" | \"search\"",
186
+ "resolvedType": "\"agents\" | \"area\" | \"help\" | \"inbox\" | \"messages\" | \"search\"",
171
187
  "attribute": "active-destination",
172
188
  "default": "'area'",
173
189
  "required": false,
@@ -228,6 +244,22 @@
228
244
  "required": false,
229
245
  "mutable": false
230
246
  },
247
+ "messagesDot": {
248
+ "type": "boolean",
249
+ "resolvedType": "boolean",
250
+ "attribute": "messages-dot",
251
+ "default": "false",
252
+ "required": false,
253
+ "mutable": false
254
+ },
255
+ "messagesLabel": {
256
+ "type": "string",
257
+ "resolvedType": "string",
258
+ "attribute": "messages-label",
259
+ "default": "'Messages'",
260
+ "required": false,
261
+ "mutable": false
262
+ },
231
263
  "searchDot": {
232
264
  "type": "boolean",
233
265
  "resolvedType": "boolean",
@@ -300,7 +332,7 @@
300
332
  "peerDependencies": {
301
333
  "required": [
302
334
  "@ds-mo/tokens ^6.0.0",
303
- "@ds-mo/icons ^6.4.0"
335
+ "@ds-mo/icons ^6.5.0"
304
336
  ],
305
337
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
306
338
  }
@@ -323,7 +355,7 @@
323
355
  },
324
356
  {
325
357
  "path": "src/wc/components/MobileBarNav/MobileBarNav.tsx",
326
- "content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n} from '@stencil/core';\nimport {\n shouldEmitMobileDestinationChange,\n type MobileDestination,\n} from '../../shell/shell-responsive';\nimport type { PanelNavItem } from '../PanelNav/panel-nav-types';\nimport type { MobileBarNavDestinationDetail } from './mobile-bar-nav-types';\n\ninterface DestinationConfig {\n id: MobileDestination;\n icon: string;\n label: string;\n dot: boolean;\n}\n\nconst MINIMUM_DIRECT_PRESS_MS = 120;\n\n@Component({\n tag: 'ds-mobile-bar-nav',\n styleUrl: 'MobileBarNav.css',\n scoped: true,\n})\nexport class MobileBarNav {\n @Element() el!: HTMLElement;\n\n @Prop() activeDestination: MobileDestination = 'area';\n @Prop() currentArea: PanelNavItem = {\n id: 'tracking',\n icon: 'MapPage',\n label: 'Tracking',\n };\n @Prop() sheetNavExpanded: boolean = false;\n @Prop() menuLabel: string = 'Menu';\n @Prop() searchLabel: string = 'Search';\n @Prop() agentsLabel: string = 'Agents';\n @Prop() inboxLabel: string = 'Inbox';\n @Prop() helpLabel: string = 'Help & Support';\n @Prop() searchDot: boolean = false;\n @Prop() agentsDot: boolean = false;\n @Prop() inboxDot: boolean = false;\n\n @State() private pressedItemId: string | null = null;\n\n @Event() dsSheetNavToggle!: EventEmitter<boolean>;\n @Event() dsDestinationChange!: EventEmitter<MobileBarNavDestinationDetail>;\n\n private activePointerId: number | null = null;\n private pressedAt = 0;\n private pressClearTimer: ReturnType<typeof setTimeout> | null = null;\n\n disconnectedCallback() {\n this.clearPressedItem();\n }\n\n private clearPressTimer() {\n if (this.pressClearTimer === null) return;\n clearTimeout(this.pressClearTimer);\n this.pressClearTimer = null;\n }\n\n private clearPressedItem() {\n this.clearPressTimer();\n this.activePointerId = null;\n this.pressedItemId = null;\n }\n\n private beginDirectPress(itemId: string, event: PointerEvent) {\n if (!event.isPrimary || event.pointerType === 'mouse' || event.button !== 0) return;\n\n this.clearPressTimer();\n this.activePointerId = event.pointerId;\n this.pressedAt = performance.now();\n this.pressedItemId = itemId;\n\n const target = event.currentTarget as HTMLElement;\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Pointer capture can fail if Safari has already cancelled the stream.\n }\n }\n\n private finishDirectPress(event: PointerEvent) {\n if (event.pointerId !== this.activePointerId) return;\n\n this.activePointerId = null;\n const remaining = Math.max(\n 0,\n MINIMUM_DIRECT_PRESS_MS - (performance.now() - this.pressedAt)\n );\n\n this.clearPressTimer();\n this.pressClearTimer = setTimeout(() => {\n this.pressClearTimer = null;\n this.pressedItemId = null;\n }, remaining);\n }\n\n private cancelDirectPress(event: PointerEvent) {\n if (event.pointerId !== this.activePointerId) return;\n this.clearPressedItem();\n }\n\n private pressHandlers(itemId: string) {\n return {\n onPointerDown: (event: PointerEvent) => this.beginDirectPress(itemId, event),\n onPointerUp: (event: PointerEvent) => this.finishDirectPress(event),\n onPointerCancel: (event: PointerEvent) => this.cancelDirectPress(event),\n onLostPointerCapture: (event: PointerEvent) => this.finishDirectPress(event),\n };\n }\n\n private destinationConfig(): DestinationConfig[] {\n const currentArea =\n this.activeDestination === 'help'\n ? {\n id: 'help' as const,\n icon: 'CircleQuestion',\n label: this.helpLabel,\n dot: false,\n }\n : {\n id: 'area' as const,\n icon: this.currentArea.icon || 'MapPage',\n label: this.currentArea.label || 'Area',\n dot: false,\n };\n\n return [\n currentArea,\n { id: 'search', icon: 'MagnifyingGlass', label: this.searchLabel, dot: this.searchDot },\n { id: 'inbox', icon: 'Inbox', label: this.inboxLabel, dot: this.inboxDot },\n { id: 'agents', icon: 'AI', label: this.agentsLabel, dot: this.agentsDot },\n ];\n }\n\n private selectDestination(destination: MobileDestination) {\n if (\n !shouldEmitMobileDestinationChange(\n this.activeDestination,\n destination,\n this.sheetNavExpanded\n )\n ) {\n return;\n }\n this.dsDestinationChange.emit({ destination });\n // Owners may replace the visible mobile stage (and transiently drop focus\n // in WebKit) while handling the controlled destination change.\n requestAnimationFrame(() => {\n void this.focusDestination(destination);\n });\n }\n\n @Method()\n async focusDestination(destination: MobileDestination | 'sheet-nav') {\n const target = this.el.querySelector<HTMLElement>(\n `#${\n destination === 'sheet-nav'\n ? 'ds-mobile-sheet-nav-trigger'\n : `ds-mobile-bar-${destination}-trigger`\n }`\n );\n target?.focus({ preventScroll: true });\n }\n\n private renderDestination(item: DestinationConfig) {\n const selected = !this.sheetNavExpanded && item.id === this.activeDestination;\n return (\n <button\n id={`ds-mobile-bar-${item.id}-trigger`}\n type=\"button\"\n class={{\n 'mobile-bar-nav__item': true,\n 'mobile-bar-nav__item--selected': selected,\n 'mobile-bar-nav__item--pressed': this.pressedItemId === item.id,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n aria-label={item.label}\n aria-current={selected ? 'page' : undefined}\n onClick={() => this.selectDestination(item.id)}\n {...this.pressHandlers(item.id)}\n >\n <span class=\"mobile-bar-nav__icon ds-interaction-fill__content\">\n <ds-icon name={item.icon} size=\"lg\" color=\"inherit\" />\n {item.dot && (\n <ds-badge class=\"mobile-bar-nav__dot\" variant=\"dot\" label=\"\" aria-hidden=\"true\" />\n )}\n </span>\n </button>\n );\n }\n\n render() {\n const [currentArea, ...tools] = this.destinationConfig();\n\n return (\n <Host>\n <nav class=\"mobile-bar-nav ds-chrome-row ds-chrome-space--md\" aria-label=\"Primary\">\n <div class=\"mobile-bar-nav__group mobile-bar-nav__group--context\">\n <button\n id=\"ds-mobile-sheet-nav-trigger\"\n type=\"button\"\n class={{\n 'mobile-bar-nav__item': true,\n 'mobile-bar-nav__item--selected': this.sheetNavExpanded,\n 'mobile-bar-nav__item--pressed':\n this.pressedItemId === 'sheet-nav',\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n aria-label={this.menuLabel}\n aria-expanded={String(this.sheetNavExpanded)}\n aria-controls=\"ds-mobile-sheet-nav\"\n onClick={() => this.dsSheetNavToggle.emit(!this.sheetNavExpanded)}\n {...this.pressHandlers('sheet-nav')}\n >\n <span class=\"mobile-bar-nav__icon ds-interaction-fill__content\">\n <ds-icon\n name={this.sheetNavExpanded ? 'Cross' : 'Hamburger'}\n size=\"lg\"\n color=\"inherit\"\n />\n </span>\n </button>\n <span class=\"mobile-bar-nav__divider\" aria-hidden=\"true\" />\n {this.renderDestination(currentArea)}\n </div>\n <div class=\"mobile-bar-nav__group mobile-bar-nav__group--tools\">\n {tools.map(item => this.renderDestination(item))}\n </div>\n </nav>\n </Host>\n );\n }\n}\n",
358
+ "content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n} from '@stencil/core';\nimport {\n shouldEmitMobileDestinationChange,\n type MobileDestination,\n} from '../../shell/shell-responsive';\nimport type { PanelNavItem } from '../PanelNav/panel-nav-types';\nimport type { MobileBarNavDestinationDetail } from './mobile-bar-nav-types';\n\ninterface DestinationConfig {\n id: MobileDestination;\n icon: string;\n label: string;\n dot: boolean;\n}\n\nconst MINIMUM_DIRECT_PRESS_MS = 120;\n\n@Component({\n tag: 'ds-mobile-bar-nav',\n styleUrl: 'MobileBarNav.css',\n scoped: true,\n})\nexport class MobileBarNav {\n @Element() el!: HTMLElement;\n\n @Prop() activeDestination: MobileDestination = 'area';\n @Prop() currentArea: PanelNavItem = {\n id: 'tracking',\n icon: 'MapPage',\n label: 'Tracking',\n };\n @Prop() sheetNavExpanded: boolean = false;\n @Prop() menuLabel: string = 'Menu';\n @Prop() searchLabel: string = 'Search';\n @Prop() inboxLabel: string = 'Inbox';\n @Prop() messagesLabel: string = 'Messages';\n @Prop() agentsLabel: string = 'Agents';\n @Prop() helpLabel: string = 'Help & Support';\n @Prop() searchDot: boolean = false;\n @Prop() inboxDot: boolean = false;\n @Prop() messagesDot: boolean = false;\n @Prop() agentsDot: boolean = false;\n\n @State() private pressedItemId: string | null = null;\n\n @Event() dsSheetNavToggle!: EventEmitter<boolean>;\n @Event() dsDestinationChange!: EventEmitter<MobileBarNavDestinationDetail>;\n\n private activePointerId: number | null = null;\n private pressedAt = 0;\n private pressClearTimer: ReturnType<typeof setTimeout> | null = null;\n\n disconnectedCallback() {\n this.clearPressedItem();\n }\n\n private clearPressTimer() {\n if (this.pressClearTimer === null) return;\n clearTimeout(this.pressClearTimer);\n this.pressClearTimer = null;\n }\n\n private clearPressedItem() {\n this.clearPressTimer();\n this.activePointerId = null;\n this.pressedItemId = null;\n }\n\n private beginDirectPress(itemId: string, event: PointerEvent) {\n if (!event.isPrimary || event.pointerType === 'mouse' || event.button !== 0) return;\n\n this.clearPressTimer();\n this.activePointerId = event.pointerId;\n this.pressedAt = performance.now();\n this.pressedItemId = itemId;\n\n const target = event.currentTarget as HTMLElement;\n try {\n target.setPointerCapture(event.pointerId);\n } catch {\n // Pointer capture can fail if Safari has already cancelled the stream.\n }\n }\n\n private finishDirectPress(event: PointerEvent) {\n if (event.pointerId !== this.activePointerId) return;\n\n this.activePointerId = null;\n const remaining = Math.max(\n 0,\n MINIMUM_DIRECT_PRESS_MS - (performance.now() - this.pressedAt)\n );\n\n this.clearPressTimer();\n this.pressClearTimer = setTimeout(() => {\n this.pressClearTimer = null;\n this.pressedItemId = null;\n }, remaining);\n }\n\n private cancelDirectPress(event: PointerEvent) {\n if (event.pointerId !== this.activePointerId) return;\n this.clearPressedItem();\n }\n\n private pressHandlers(itemId: string) {\n return {\n onPointerDown: (event: PointerEvent) => this.beginDirectPress(itemId, event),\n onPointerUp: (event: PointerEvent) => this.finishDirectPress(event),\n onPointerCancel: (event: PointerEvent) => this.cancelDirectPress(event),\n onLostPointerCapture: (event: PointerEvent) => this.finishDirectPress(event),\n };\n }\n\n private destinationConfig(): DestinationConfig[] {\n const currentArea =\n this.activeDestination === 'help'\n ? {\n id: 'help' as const,\n icon: 'CircleQuestion',\n label: this.helpLabel,\n dot: false,\n }\n : {\n id: 'area' as const,\n icon: this.currentArea.icon || 'MapPage',\n label: this.currentArea.label || 'Area',\n dot: false,\n };\n\n return [\n currentArea,\n { id: 'search', icon: 'MagnifyingGlass', label: this.searchLabel, dot: this.searchDot },\n { id: 'inbox', icon: 'Inbox', label: this.inboxLabel, dot: this.inboxDot },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: this.messagesLabel,\n dot: this.messagesDot,\n },\n { id: 'agents', icon: 'AI', label: this.agentsLabel, dot: this.agentsDot },\n ];\n }\n\n private selectDestination(destination: MobileDestination) {\n if (\n !shouldEmitMobileDestinationChange(\n this.activeDestination,\n destination,\n this.sheetNavExpanded\n )\n ) {\n return;\n }\n this.dsDestinationChange.emit({ destination });\n // Owners may replace the visible mobile stage (and transiently drop focus\n // in WebKit) while handling the controlled destination change.\n requestAnimationFrame(() => {\n void this.focusDestination(destination);\n });\n }\n\n @Method()\n async focusDestination(destination: MobileDestination | 'sheet-nav') {\n const target = this.el.querySelector<HTMLElement>(\n `#${\n destination === 'sheet-nav'\n ? 'ds-mobile-sheet-nav-trigger'\n : `ds-mobile-bar-${destination}-trigger`\n }`\n );\n target?.focus({ preventScroll: true });\n }\n\n private renderDestination(item: DestinationConfig) {\n const selected = !this.sheetNavExpanded && item.id === this.activeDestination;\n return (\n <button\n id={`ds-mobile-bar-${item.id}-trigger`}\n type=\"button\"\n class={{\n 'mobile-bar-nav__item': true,\n 'mobile-bar-nav__item--selected': selected,\n 'mobile-bar-nav__item--pressed': this.pressedItemId === item.id,\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n aria-label={item.label}\n aria-current={selected ? 'page' : undefined}\n onClick={() => this.selectDestination(item.id)}\n {...this.pressHandlers(item.id)}\n >\n <span class=\"mobile-bar-nav__icon ds-interaction-fill__content\">\n <ds-icon name={item.icon} size=\"lg\" color=\"inherit\" />\n {item.dot && (\n <ds-badge class=\"mobile-bar-nav__dot\" variant=\"dot\" label=\"\" aria-hidden=\"true\" />\n )}\n </span>\n </button>\n );\n }\n\n render() {\n const [currentArea, ...tools] = this.destinationConfig();\n\n return (\n <Host>\n <nav class=\"mobile-bar-nav ds-chrome-row ds-chrome-space--md\" aria-label=\"Primary\">\n <div class=\"mobile-bar-nav__group mobile-bar-nav__group--context\">\n <button\n id=\"ds-mobile-sheet-nav-trigger\"\n type=\"button\"\n class={{\n 'mobile-bar-nav__item': true,\n 'mobile-bar-nav__item--selected': this.sheetNavExpanded,\n 'mobile-bar-nav__item--pressed':\n this.pressedItemId === 'sheet-nav',\n 'ds-focus-ring-inset': true,\n 'ds-interaction-fill': true,\n }}\n aria-label={this.menuLabel}\n aria-expanded={String(this.sheetNavExpanded)}\n aria-controls=\"ds-mobile-sheet-nav\"\n onClick={() => this.dsSheetNavToggle.emit(!this.sheetNavExpanded)}\n {...this.pressHandlers('sheet-nav')}\n >\n <span class=\"mobile-bar-nav__icon ds-interaction-fill__content\">\n <ds-icon\n name={this.sheetNavExpanded ? 'Cross' : 'Hamburger'}\n size=\"lg\"\n color=\"inherit\"\n />\n </span>\n </button>\n <span class=\"mobile-bar-nav__divider\" aria-hidden=\"true\" />\n {this.renderDestination(currentArea)}\n </div>\n <div class=\"mobile-bar-nav__group mobile-bar-nav__group--tools\">\n {tools.map(item => this.renderDestination(item))}\n </div>\n </nav>\n </Host>\n );\n }\n}\n",
327
359
  "type": "registry:ui"
328
360
  },
329
361
  {
@@ -281,7 +281,7 @@
281
281
  "peerDependencies": {
282
282
  "required": [
283
283
  "@ds-mo/tokens ^6.0.0",
284
- "@ds-mo/icons ^6.4.0"
284
+ "@ds-mo/icons ^6.5.0"
285
285
  ],
286
286
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
287
287
  }
@@ -154,7 +154,7 @@
154
154
  "peerDependencies": {
155
155
  "required": [
156
156
  "@ds-mo/tokens ^6.0.0",
157
- "@ds-mo/icons ^6.4.0"
157
+ "@ds-mo/icons ^6.5.0"
158
158
  ],
159
159
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
160
160
  }
@@ -285,7 +285,7 @@
285
285
  "peerDependencies": {
286
286
  "required": [
287
287
  "@ds-mo/tokens ^6.0.0",
288
- "@ds-mo/icons ^6.4.0"
288
+ "@ds-mo/icons ^6.5.0"
289
289
  ],
290
290
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
291
291
  }
@@ -271,7 +271,7 @@
271
271
  "peerDependencies": {
272
272
  "required": [
273
273
  "@ds-mo/tokens ^6.0.0",
274
- "@ds-mo/icons ^6.4.0"
274
+ "@ds-mo/icons ^6.5.0"
275
275
  ],
276
276
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
277
277
  }
@@ -598,7 +598,7 @@
598
598
  "peerDependencies": {
599
599
  "required": [
600
600
  "@ds-mo/tokens ^6.0.0",
601
- "@ds-mo/icons ^6.4.0"
601
+ "@ds-mo/icons ^6.5.0"
602
602
  ],
603
603
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
604
604
  }
@@ -216,7 +216,7 @@
216
216
  "peerDependencies": {
217
217
  "required": [
218
218
  "@ds-mo/tokens ^6.0.0",
219
- "@ds-mo/icons ^6.4.0"
219
+ "@ds-mo/icons ^6.5.0"
220
220
  ],
221
221
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
222
222
  }
@@ -313,7 +313,7 @@
313
313
  "peerDependencies": {
314
314
  "required": [
315
315
  "@ds-mo/tokens ^6.0.0",
316
- "@ds-mo/icons ^6.4.0"
316
+ "@ds-mo/icons ^6.5.0"
317
317
  ],
318
318
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
319
319
  }
@@ -355,7 +355,7 @@
355
355
  "peerDependencies": {
356
356
  "required": [
357
357
  "@ds-mo/tokens ^6.0.0",
358
- "@ds-mo/icons ^6.4.0"
358
+ "@ds-mo/icons ^6.5.0"
359
359
  ],
360
360
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
361
361
  }
@@ -63,7 +63,7 @@
63
63
  "states": [
64
64
  "Every tool has a stable explicit id and accessible label. The application filters definitions for authorization and entitlement.",
65
65
  "Tool order, header or footer rail placement, shortcut, and mobile grouping come from explicit item metadata rather than id-based layout assumptions.",
66
- "PANEL_TOOLS_DEFAULT_ITEMS is the canonical Lab recipe: Search pinned first, Help pinned last, current shortcuts, and Messages, Stacks, and Activity grouped under mobile Inbox.",
66
+ "PANEL_TOOLS_DEFAULT_ITEMS is the canonical Lab recipe: Search pinned first, Messages before Agents, Help pinned last, current shortcuts, and only Stacks and Activity grouped under mobile Inbox.",
67
67
  "Only one drawer is open at a time; selecting another tool switches directly and selecting the active tool closes to rail-only mode.",
68
68
  "The drawer starts closed, remains open across ordinary route changes, and retains every mounted tool's independent conversation, query, scroll, and work state.",
69
69
  "When storageKey is set, persist only the last active tool in this browser and still restore the drawer closed after reload.",
@@ -440,7 +440,7 @@
440
440
  "peerDependencies": {
441
441
  "required": [
442
442
  "@ds-mo/tokens ^6.0.0",
443
- "@ds-mo/icons ^6.4.0"
443
+ "@ds-mo/icons ^6.5.0"
444
444
  ],
445
445
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
446
446
  }
@@ -468,7 +468,7 @@
468
468
  },
469
469
  {
470
470
  "path": "src/wc/components/PanelTools/panel-tools-types.ts",
471
- "content": "/** Application-owned tool id for the shell rail and responsive tool views. */\nexport type PanelToolsToolId = string;\n\n/** Canonical Motive shell recipe used when item metadata is omitted. */\nexport type CanonicalPanelToolsToolId =\n | 'search'\n | 'agents'\n | 'messages'\n | 'stacks'\n | 'activity'\n | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: CanonicalPanelToolsToolId[] = [\n 'search',\n 'agents',\n 'messages',\n 'stacks',\n 'activity',\n 'help',\n];\n\n/** Rail header slot — mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'search';\n\n/** Rail footer slot — flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: CanonicalPanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<CanonicalPanelToolsToolId, string> = {\n search: 'Search',\n messages: 'Messages',\n stacks: 'Stacks',\n activity: 'Activity',\n agents: 'Agents',\n help: 'Help & Support',\n};\n\nexport const PANEL_TOOLS_SHORTCUTS: Partial<Record<CanonicalPanelToolsToolId, string>> = {\n search: 'K',\n agents: 'A',\n messages: 'M',\n stacks: 'S',\n activity: 'N',\n help: '/',\n};\n\nexport interface PanelToolsItem {\n id: PanelToolsToolId;\n /** Icon name for <ds-icon>. */\n icon: string;\n /** Visible and accessible fallback label for custom tool ids. */\n label?: string;\n /** Explicit rail region; canonical Search/Help placement is the fallback. */\n railPlacement?: 'header' | 'body' | 'footer';\n /** Stable ordering within the selected rail region. */\n order?: number;\n /** Optional shortcut label displayed by the tooltip. */\n shortcutKey?: string;\n /** Mobile destination recipe; canonical ids retain their existing defaults. */\n mobileDestination?: 'search' | 'agents' | 'inbox' | 'help';\n /** Whether this rail button is currently pressed/active. */\n selected?: boolean;\n /** Show a notification dot. */\n dot?: boolean;\n isInactive?: boolean;\n ariaLabel?: string;\n}\n\n/** Canonical shell recipe used by Lab and by managed ShellApp examples. */\nexport const PANEL_TOOLS_DEFAULT_ITEMS: PanelToolsItem[] = [\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'agents',\n icon: 'AI',\n label: PANEL_TOOLS_LABELS.agents,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'inbox',\n },\n {\n id: 'stacks',\n icon: 'ViewMenu',\n label: PANEL_TOOLS_LABELS.stacks,\n order: 3,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.stacks,\n mobileDestination: 'inbox',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 4,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'inbox',\n },\n {\n id: 'help',\n icon: 'CircleQuestion',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 5,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.help,\n mobileDestination: 'help',\n },\n];\n\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsHeaderConfig {\n title?: string;\n showBack?: boolean;\n backIcon?: string;\n backAriaLabel?: string;\n actions?: PanelToolsHeaderAction[];\n}\n\n/** Per-tool header state. The application replaces the object when a tool changes depth or actions. */\nexport type PanelToolsHeaders = Partial<Record<PanelToolsToolId, PanelToolsHeaderConfig>>;\n",
471
+ "content": "/** Application-owned tool id for the shell rail and responsive tool views. */\nexport type PanelToolsToolId = string;\n\n/** Canonical Motive shell recipe used when item metadata is omitted. */\nexport type CanonicalPanelToolsToolId =\n | 'search'\n | 'messages'\n | 'agents'\n | 'stacks'\n | 'activity'\n | 'help';\n\nexport const PANEL_TOOLS_TOOL_IDS: CanonicalPanelToolsToolId[] = [\n 'search',\n 'messages',\n 'agents',\n 'stacks',\n 'activity',\n 'help',\n];\n\n/** Rail header slot — mirrors panel-nav M logo row. */\nexport const PANEL_TOOLS_PRIMARY_TOOL_ID: CanonicalPanelToolsToolId = 'search';\n\n/** Rail footer slot — flush to the bottom of the tools column. */\nexport const PANEL_TOOLS_FOOTER_TOOL_ID: CanonicalPanelToolsToolId = 'help';\n\nexport const PANEL_TOOLS_LABELS: Record<CanonicalPanelToolsToolId, string> = {\n search: 'Search',\n messages: 'Messages',\n stacks: 'Stacks',\n activity: 'Activity',\n agents: 'Agents',\n help: 'Help & Support',\n};\n\nexport const PANEL_TOOLS_SHORTCUTS: Partial<Record<CanonicalPanelToolsToolId, string>> = {\n search: 'K',\n agents: 'A',\n messages: 'M',\n stacks: 'S',\n activity: 'N',\n help: '/',\n};\n\nexport interface PanelToolsItem {\n id: PanelToolsToolId;\n /** Icon name for <ds-icon>. */\n icon: string;\n /** Visible and accessible fallback label for custom tool ids. */\n label?: string;\n /** Explicit rail region; canonical Search/Help placement is the fallback. */\n railPlacement?: 'header' | 'body' | 'footer';\n /** Stable ordering within the selected rail region. */\n order?: number;\n /** Optional shortcut label displayed by the tooltip. */\n shortcutKey?: string;\n /** Mobile destination recipe; canonical ids retain their explicit defaults. */\n mobileDestination?: 'search' | 'inbox' | 'messages' | 'agents' | 'help';\n /** Whether this rail button is currently pressed/active. */\n selected?: boolean;\n /** Show a notification dot. */\n dot?: boolean;\n isInactive?: boolean;\n ariaLabel?: string;\n}\n\n/** Canonical shell recipe used by Lab and by managed ShellApp examples. */\nexport const PANEL_TOOLS_DEFAULT_ITEMS: PanelToolsItem[] = [\n {\n id: 'search',\n icon: 'MagnifyingGlass',\n label: PANEL_TOOLS_LABELS.search,\n railPlacement: 'header',\n order: 0,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.search,\n mobileDestination: 'search',\n },\n {\n id: 'messages',\n icon: 'MessageBubbleStack',\n label: PANEL_TOOLS_LABELS.messages,\n order: 1,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.messages,\n mobileDestination: 'messages',\n },\n {\n id: 'agents',\n icon: 'AI',\n label: PANEL_TOOLS_LABELS.agents,\n order: 2,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.agents,\n mobileDestination: 'agents',\n },\n {\n id: 'stacks',\n icon: 'ViewMenu',\n label: PANEL_TOOLS_LABELS.stacks,\n order: 3,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.stacks,\n mobileDestination: 'inbox',\n },\n {\n id: 'activity',\n icon: 'Bell',\n label: PANEL_TOOLS_LABELS.activity,\n order: 4,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.activity,\n mobileDestination: 'inbox',\n },\n {\n id: 'help',\n icon: 'CircleQuestion',\n label: PANEL_TOOLS_LABELS.help,\n railPlacement: 'footer',\n order: 5,\n shortcutKey: PANEL_TOOLS_SHORTCUTS.help,\n mobileDestination: 'help',\n },\n];\n\nexport interface PanelToolsHeaderAction {\n id: string;\n icon: string;\n ariaLabel: string;\n triggerId?: string;\n controls?: string;\n expanded?: boolean;\n haspopup?: 'menu' | 'dialog' | 'listbox' | 'tree' | 'grid';\n pressed?: boolean;\n isInactive?: boolean;\n}\n\nexport interface PanelToolsHeaderConfig {\n title?: string;\n showBack?: boolean;\n backIcon?: string;\n backAriaLabel?: string;\n actions?: PanelToolsHeaderAction[];\n}\n\n/** Per-tool header state. The application replaces the object when a tool changes depth or actions. */\nexport type PanelToolsHeaders = Partial<Record<PanelToolsToolId, PanelToolsHeaderConfig>>;\n",
472
472
  "type": "registry:ui"
473
473
  },
474
474
  {
@@ -346,7 +346,7 @@
346
346
  "peerDependencies": {
347
347
  "required": [
348
348
  "@ds-mo/tokens ^6.0.0",
349
- "@ds-mo/icons ^6.4.0"
349
+ "@ds-mo/icons ^6.5.0"
350
350
  ],
351
351
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
352
352
  }
@@ -13,7 +13,7 @@
13
13
  "peerDependencies": {
14
14
  "required": [
15
15
  "@ds-mo/tokens ^6.0.0",
16
- "@ds-mo/icons ^6.4.0"
16
+ "@ds-mo/icons ^6.5.0"
17
17
  ],
18
18
  "optional": [],
19
19
  "frameworks": "None required for Custom Elements; generated React and Angular adapters are included."
@@ -4733,7 +4733,7 @@
4733
4733
  {
4734
4734
  "name": "mobile-bar-nav",
4735
4735
  "title": "MobileBarNav",
4736
- "description": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
4736
+ "description": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Inbox, Messages, and Agents.",
4737
4737
  "type": "registry:ui",
4738
4738
  "meta": {
4739
4739
  "library": "@ds-mo/ui",
@@ -4744,7 +4744,7 @@
4744
4744
  "intent": {
4745
4745
  "audience": "specialized",
4746
4746
  "status": "experimental",
4747
- "summary": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Agents, and Inbox.",
4747
+ "summary": "Persistent mobile shell navigation for Menu, the router-derived current area, Search, Inbox, Messages, and Agents.",
4748
4748
  "useWhen": [
4749
4749
  "ShellApp is rendering its dedicated below-768px application composition."
4750
4750
  ],
@@ -4763,7 +4763,7 @@
4763
4763
  "Only the active destination exposes aria-current; Menu exposes its controlled pane through aria-expanded."
4764
4764
  ],
4765
4765
  "states": [
4766
- "The fixed groups are Menu plus current area, followed by Search, Inbox, and Agents.",
4766
+ "The fixed groups are Menu plus current area, followed by Search, Inbox, Messages, and Agents.",
4767
4767
  "Selection promotes foreground to primary without painting a selected fill; unselected destinations use tertiary foreground.",
4768
4768
  "Opening Mobile Sheet Nav replaces the Menu glyph with Cross while preserving its accessible name.",
4769
4769
  "Reselecting an active destination does not reset its nested state.",
@@ -4814,6 +4814,14 @@
4814
4814
  "type": "string",
4815
4815
  "required": false
4816
4816
  },
4817
+ "messagesDot": {
4818
+ "type": "boolean",
4819
+ "required": false
4820
+ },
4821
+ "messagesLabel": {
4822
+ "type": "string",
4823
+ "required": false
4824
+ },
4817
4825
  "searchDot": {
4818
4826
  "type": "boolean",
4819
4827
  "required": false
@@ -6040,7 +6048,7 @@
6040
6048
  "states": [
6041
6049
  "Every tool has a stable explicit id and accessible label. The application filters definitions for authorization and entitlement.",
6042
6050
  "Tool order, header or footer rail placement, shortcut, and mobile grouping come from explicit item metadata rather than id-based layout assumptions.",
6043
- "PANEL_TOOLS_DEFAULT_ITEMS is the canonical Lab recipe: Search pinned first, Help pinned last, current shortcuts, and Messages, Stacks, and Activity grouped under mobile Inbox.",
6051
+ "PANEL_TOOLS_DEFAULT_ITEMS is the canonical Lab recipe: Search pinned first, Messages before Agents, Help pinned last, current shortcuts, and only Stacks and Activity grouped under mobile Inbox.",
6044
6052
  "Only one drawer is open at a time; selecting another tool switches directly and selecting the active tool closes to rail-only mode.",
6045
6053
  "The drawer starts closed, remains open across ordinary route changes, and retains every mounted tool's independent conversation, query, scroll, and work state.",
6046
6054
  "When storageKey is set, persist only the last active tool in this browser and still restore the drawer closed after reload.",
@@ -7094,17 +7102,17 @@
7094
7102
  "accessibility": [
7095
7103
  "Only the active mobile tool view participates in focus or the accessibility tree.",
7096
7104
  "Header Back and application-owned header actions preserve the PanelTools event contract.",
7097
- "Inbox uses the MobileSectionSwitcher popup trigger for Messages, Stacks, and Activity and never relies on a gesture-only interaction."
7105
+ "Inbox uses the MobileSectionSwitcher popup trigger for Stacks and Activity and never relies on a gesture-only interaction; Messages remains a direct mobile destination."
7098
7106
  ],
7099
7107
  "states": [
7100
7108
  "The application owns open and activeTool and replaces headers when tool depth changes.",
7101
- "Items with mobileDestination inbox map to one mobile Inbox destination while retaining the actual active tool id; the canonical recipe groups Messages, Stacks, and Activity.",
7109
+ "Items with mobileDestination inbox map to one mobile Inbox destination while retaining the actual active tool id; the canonical recipe groups Stacks and Activity, while Messages remains a separate destination.",
7102
7110
  "Stable tool ids own named slots; label, order, rail placement, shortcut, and mobile destination are explicit item data.",
7103
7111
  "Switching responsive mode must not recreate application-owned slotted product elements."
7104
7112
  ],
7105
7113
  "responsiveBehavior": [
7106
7114
  "Desktop and tablet compose PanelTools-compatible rail and drawer chrome.",
7107
- "Mobile renders one centered MobileHeader for every tool and presents Messages, Stacks, and Activity directly as peer section titles without an additional Inbox heading."
7115
+ "Mobile renders one centered MobileHeader for every tool; Stacks and Activity use Inbox section titles, while Messages remains a direct tool destination."
7108
7116
  ],
7109
7117
  "frameworkCaveats": {
7110
7118
  "customElements": [
@@ -157,7 +157,7 @@
157
157
  "peerDependencies": {
158
158
  "required": [
159
159
  "@ds-mo/tokens ^6.0.0",
160
- "@ds-mo/icons ^6.4.0"
160
+ "@ds-mo/icons ^6.5.0"
161
161
  ],
162
162
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
163
163
  }
@@ -742,7 +742,7 @@
742
742
  "peerDependencies": {
743
743
  "required": [
744
744
  "@ds-mo/tokens ^6.0.0",
745
- "@ds-mo/icons ^6.4.0"
745
+ "@ds-mo/icons ^6.5.0"
746
746
  ],
747
747
  "frameworks": "Custom Elements; React 18/19 wrappers; Angular 19-22 standalone adapters."
748
748
  }