@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.
- package/dist/.package-ready.json +1 -1
- package/dist/agent-patterns.json +4 -4
- package/dist/agent.json +16 -8
- package/dist/angular/ds-mobile-bar-nav.d.ts +1 -1
- package/dist/angular/ds-mobile-bar-nav.js +3 -3
- package/dist/components/ds-agent-activity.js +1 -1
- package/dist/components/ds-agent-response.js +1 -1
- package/dist/components/ds-agent-source-list.js +1 -1
- package/dist/components/ds-agent-tool-call.js +1 -1
- package/dist/components/ds-attachment-list.js +1 -1
- package/dist/components/ds-avatar.js +1 -1
- package/dist/components/ds-banner.js +1 -1
- package/dist/components/ds-bar-nav.js +1 -1
- package/dist/components/ds-bar-title.js +1 -1
- package/dist/components/ds-bar-workflow.js +1 -1
- package/dist/components/ds-button-filled.js +1 -1
- package/dist/components/ds-button-unfilled.js +1 -1
- package/dist/components/ds-card-chart.js +1 -1
- package/dist/components/ds-card-overview.js +1 -1
- package/dist/components/ds-card-overview.js.map +1 -1
- package/dist/components/ds-card-setting.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-empty-state.js +1 -1
- package/dist/components/ds-icon.js +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-message-actions.js +1 -1
- package/dist/components/ds-message-composer.js +1 -1
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-mobile-bar-nav.js +1 -1
- package/dist/components/ds-mobile-sheet-nav.js +1 -1
- package/dist/components/ds-modal.js +1 -1
- package/dist/components/ds-panel-nav.js +1 -1
- package/dist/components/ds-panel-tool-header.js +1 -1
- package/dist/components/ds-panel-tool-search.js +1 -1
- package/dist/components/ds-panel-tools.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-shell-app.js +1 -1
- package/dist/components/ds-shell-app.js.map +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/{p-BtS5na9O.js → p-BRajO-Za.js} +2 -2
- package/dist/components/{p-BQDi0v_h.js → p-BX57q1Lo.js} +2 -2
- package/dist/components/{p-BkWhTEqe.js → p-B_nHX-BW.js} +2 -2
- package/dist/components/{p-Dv8_hmUZ.js → p-C5gZHZHU.js} +2 -2
- package/dist/components/{p-HIg1XX62.js → p-CIlO_j3q.js} +2 -2
- package/dist/components/p-CIlO_j3q.js.map +1 -0
- package/dist/components/{p-CnbrksLl.js → p-CVmtbj-6.js} +2 -2
- package/dist/components/{p-BjoyHNaM.js → p-CdFnvBem.js} +2 -2
- package/dist/components/{p-BP-EtYbR.js → p-DAbaMtEX.js} +2 -2
- package/dist/components/{p-KFHFBznh.js → p-DBJJiSP0.js} +2 -2
- package/dist/components/{p-D8qgVmHn.js → p-DBchq8Zw.js} +2 -2
- package/dist/components/{p-BYB0f1_F.js → p-DCN04sgt.js} +2 -2
- package/dist/components/{p-D2dQyoyK.js → p-DGkWMhHO.js} +2 -2
- package/dist/components/{p-2inC7Jm-.js → p-DJGdoPMG.js} +2 -2
- package/dist/components/p-DNpE0RBz.js +2 -0
- package/dist/components/p-DNpE0RBz.js.map +1 -0
- package/dist/components/{p-BjIYFiuQ.js → p-DcmqsAMP.js} +2 -2
- package/dist/components/p-DkhE3BsH.js +2 -0
- package/dist/components/p-DkhE3BsH.js.map +1 -0
- package/dist/components/{p-B4VlfBNc.js → p-Doz2uwRv.js} +2 -2
- package/dist/components/p-DumWT7NN.js +2 -0
- package/dist/components/p-DumWT7NN.js.map +1 -0
- package/dist/components/{p-Cog5NTLa.js → p-Xftomzsv.js} +2 -2
- package/dist/components/{p-DJ0XMH9E.js → p-c1pY-Mqq.js} +2 -2
- package/dist/docs/components.json +76 -10
- package/dist/lib/components/PanelTools/panel-tools-types.d.ts +3 -3
- package/dist/lib/shell/index.js +12 -11
- package/dist/lib/shell/index.js.map +2 -2
- package/dist/lib/shell/shell-responsive.d.ts +1 -1
- package/dist/mcp-data/registry/agent-activity.json +1 -1
- package/dist/mcp-data/registry/agent-response.json +1 -1
- package/dist/mcp-data/registry/agent-source-list.json +1 -1
- package/dist/mcp-data/registry/agent-tool-call.json +1 -1
- package/dist/mcp-data/registry/attachment-list.json +1 -1
- package/dist/mcp-data/registry/avatar.json +1 -1
- package/dist/mcp-data/registry/badge.json +1 -1
- package/dist/mcp-data/registry/banner.json +1 -1
- package/dist/mcp-data/registry/bar-nav.json +1 -1
- package/dist/mcp-data/registry/bar-title.json +1 -1
- package/dist/mcp-data/registry/bar-workflow.json +1 -1
- package/dist/mcp-data/registry/breadcrumb.json +1 -1
- package/dist/mcp-data/registry/button-filled.json +1 -1
- package/dist/mcp-data/registry/button-unfilled.json +1 -1
- package/dist/mcp-data/registry/card-chart.json +1 -1
- package/dist/mcp-data/registry/card-overview.json +7 -7
- package/dist/mcp-data/registry/card-setting.json +1 -1
- package/dist/mcp-data/registry/chart-legend.json +1 -1
- package/dist/mcp-data/registry/chart.json +1 -1
- package/dist/mcp-data/registry/checkbox.json +1 -1
- package/dist/mcp-data/registry/chip.json +1 -1
- package/dist/mcp-data/registry/code-block.json +1 -1
- package/dist/mcp-data/registry/conversation-list-item.json +1 -1
- package/dist/mcp-data/registry/conversation-list-section.json +1 -1
- package/dist/mcp-data/registry/conversation-list.json +1 -1
- package/dist/mcp-data/registry/divider.json +1 -1
- package/dist/mcp-data/registry/empty-state.json +1 -1
- package/dist/mcp-data/registry/field.json +1 -1
- package/dist/mcp-data/registry/icon.json +2 -2
- package/dist/mcp-data/registry/input.json +1 -1
- package/dist/mcp-data/registry/loader.json +1 -1
- package/dist/mcp-data/registry/markdown.json +1 -1
- package/dist/mcp-data/registry/menu.json +1 -1
- package/dist/mcp-data/registry/message-actions.json +1 -1
- package/dist/mcp-data/registry/message-bubble.json +1 -1
- package/dist/mcp-data/registry/message-composer.json +1 -1
- package/dist/mcp-data/registry/message-scroller.json +1 -1
- package/dist/mcp-data/registry/message.json +1 -1
- package/dist/mcp-data/registry/mobile-bar-nav.json +39 -7
- package/dist/mcp-data/registry/mobile-header.json +1 -1
- package/dist/mcp-data/registry/mobile-section-switcher.json +1 -1
- package/dist/mcp-data/registry/mobile-sheet-nav.json +1 -1
- package/dist/mcp-data/registry/modal.json +1 -1
- package/dist/mcp-data/registry/panel-nav.json +1 -1
- package/dist/mcp-data/registry/panel-sub-nav.json +1 -1
- package/dist/mcp-data/registry/panel-tool-header.json +1 -1
- package/dist/mcp-data/registry/panel-tool-search.json +1 -1
- package/dist/mcp-data/registry/panel-tools.json +3 -3
- package/dist/mcp-data/registry/radio.json +1 -1
- package/dist/mcp-data/registry/registry.json +16 -8
- package/dist/mcp-data/registry/scroll-overlay.json +1 -1
- package/dist/mcp-data/registry/select.json +1 -1
- package/dist/mcp-data/registry/shell-app.json +4 -4
- package/dist/mcp-data/registry/shell-page.json +1 -1
- package/dist/mcp-data/registry/shell-tools.json +4 -4
- package/dist/mcp-data/registry/skeleton.json +1 -1
- package/dist/mcp-data/registry/slider.json +1 -1
- package/dist/mcp-data/registry/swatch-picker.json +1 -1
- package/dist/mcp-data/registry/switch.json +1 -1
- package/dist/mcp-data/registry/tab-group.json +1 -1
- package/dist/mcp-data/registry/tag.json +1 -1
- package/dist/mcp-data/registry/text.json +1 -1
- package/dist/mcp-data/registry/toast.json +1 -1
- package/dist/mcp-data/registry/tooltip-chart.json +1 -1
- package/dist/mcp-data/registry/tooltip.json +1 -1
- package/dist/mcp-data/registry/typing-indicator.json +1 -1
- package/dist/types/components/CardOverview/CardOverview.d.ts +2 -0
- package/dist/types/components/CardOverview/card-overview-controller.d.ts +15 -4
- package/dist/types/components/CardOverview/card-overview-types.d.ts +0 -2
- package/dist/types/components/MobileBarNav/MobileBarNav.d.ts +4 -2
- package/dist/types/components/PanelTools/panel-tools-types.d.ts +3 -3
- package/dist/types/components.d.ts +22 -4
- package/dist/types/shell/shell-responsive.d.ts +1 -1
- package/package.json +6 -5
- package/dist/components/p-B16OuqyJ.js +0 -2
- package/dist/components/p-B16OuqyJ.js.map +0 -1
- package/dist/components/p-BAfG3M8z.js +0 -2
- package/dist/components/p-BAfG3M8z.js.map +0 -1
- package/dist/components/p-BnQXAbif.js +0 -2
- package/dist/components/p-BnQXAbif.js.map +0 -1
- package/dist/components/p-HIg1XX62.js.map +0 -1
- /package/dist/components/{p-BtS5na9O.js.map → p-BRajO-Za.js.map} +0 -0
- /package/dist/components/{p-BQDi0v_h.js.map → p-BX57q1Lo.js.map} +0 -0
- /package/dist/components/{p-BkWhTEqe.js.map → p-B_nHX-BW.js.map} +0 -0
- /package/dist/components/{p-Dv8_hmUZ.js.map → p-C5gZHZHU.js.map} +0 -0
- /package/dist/components/{p-CnbrksLl.js.map → p-CVmtbj-6.js.map} +0 -0
- /package/dist/components/{p-BjoyHNaM.js.map → p-CdFnvBem.js.map} +0 -0
- /package/dist/components/{p-BP-EtYbR.js.map → p-DAbaMtEX.js.map} +0 -0
- /package/dist/components/{p-KFHFBznh.js.map → p-DBJJiSP0.js.map} +0 -0
- /package/dist/components/{p-D8qgVmHn.js.map → p-DBchq8Zw.js.map} +0 -0
- /package/dist/components/{p-BYB0f1_F.js.map → p-DCN04sgt.js.map} +0 -0
- /package/dist/components/{p-D2dQyoyK.js.map → p-DGkWMhHO.js.map} +0 -0
- /package/dist/components/{p-2inC7Jm-.js.map → p-DJGdoPMG.js.map} +0 -0
- /package/dist/components/{p-BjIYFiuQ.js.map → p-DcmqsAMP.js.map} +0 -0
- /package/dist/components/{p-B4VlfBNc.js.map → p-Doz2uwRv.js.map} +0 -0
- /package/dist/components/{p-Cog5NTLa.js.map → p-Xftomzsv.js.map} +0 -0
- /package/dist/components/{p-DJ0XMH9E.js.map → p-c1pY-Mqq.js.map} +0 -0
|
@@ -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,
|
|
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,
|
|
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.
|
|
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()
|
|
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
|
{
|
|
@@ -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
|
|
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.
|
|
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 | '
|
|
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
|
{
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"peerDependencies": {
|
|
14
14
|
"required": [
|
|
15
15
|
"@ds-mo/tokens ^6.0.0",
|
|
16
|
-
"@ds-mo/icons ^6.
|
|
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,
|
|
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,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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": [
|