@ds-mo/ui 14.22.2 → 14.23.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 +5 -1
- package/dist/agent.json +56 -13
- package/dist/angular/ds-panel-tools.d.ts +7 -1
- package/dist/angular/ds-panel-tools.js +7 -4
- package/dist/angular/ds-shell-app.d.ts +7 -1
- package/dist/angular/ds-shell-app.js +5 -2
- package/dist/angular/ds-shell-tools.d.ts +4 -1
- package/dist/angular/ds-shell-tools.js +7 -4
- package/dist/components/ds-message-scroller.js +1 -1
- package/dist/components/ds-message-scroller.js.map +1 -1
- package/dist/components/ds-panel-tools.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/p-Bd-Kpekh.js +2 -0
- package/dist/components/p-Bd-Kpekh.js.map +1 -0
- package/dist/components/p-C13fWp2x.js +2 -0
- package/dist/components/p-C13fWp2x.js.map +1 -0
- package/dist/docs/components.json +178 -3
- package/dist/lib/components/PanelTools/panel-tools-types.d.ts +76 -1
- package/dist/lib/components/ShellApp/shell-app-types.d.ts +3 -1
- package/dist/lib/shell/index.d.ts +1 -1
- package/dist/lib/shell/index.js.map +2 -2
- package/dist/mcp-data/registry/agent-activity.json +1 -1
- package/dist/mcp-data/registry/agent-questionnaire.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-action.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 +1 -1
- 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/filter-menu.json +1 -1
- package/dist/mcp-data/registry/icon.json +1 -1
- 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 +9 -2
- package/dist/mcp-data/registry/message.json +1 -1
- package/dist/mcp-data/registry/mobile-bar-nav.json +1 -1
- 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/pagination.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 +62 -15
- package/dist/mcp-data/registry/paper-texture.json +1 -1
- package/dist/mcp-data/registry/radio.json +1 -1
- package/dist/mcp-data/registry/registry.json +56 -13
- 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 +22 -3
- package/dist/mcp-data/registry/shell-page.json +1 -1
- package/dist/mcp-data/registry/shell-tools.json +39 -6
- 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/table-filter.json +1 -1
- package/dist/mcp-data/registry/table-group.json +1 -1
- package/dist/mcp-data/registry/table-saved-views.json +1 -1
- package/dist/mcp-data/registry/table-search.json +1 -1
- package/dist/mcp-data/registry/table-sort.json +1 -1
- package/dist/mcp-data/registry/table-toolbar.json +1 -1
- package/dist/mcp-data/registry/table.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/react/ds-panel-tools.d.ts +2 -1
- package/dist/react/ds-panel-tools.js +1 -0
- package/dist/react/ds-shell-app.d.ts +2 -1
- package/dist/react/ds-shell-app.js +1 -0
- package/dist/react/ds-shell-tools.d.ts +2 -1
- package/dist/react/ds-shell-tools.js +2 -1
- package/dist/types/components/MessageScroller/MessageScroller.d.ts +14 -0
- package/dist/types/components/MessageScroller/message-scroller-transcript.d.ts +9 -0
- package/dist/types/components/PanelTools/PanelTools.d.ts +17 -1
- package/dist/types/components/PanelTools/index.d.ts +1 -1
- package/dist/types/components/PanelTools/panel-tools-types.d.ts +76 -1
- package/dist/types/components/PanelTools/panel-tools-utils.d.ts +17 -1
- package/dist/types/components/ShellApp/ShellApp.d.ts +4 -1
- package/dist/types/components/ShellApp/shell-app-types.d.ts +3 -1
- package/dist/types/components/ShellTools/ShellTools.d.ts +5 -1
- package/dist/types/components/ShellTools/index.d.ts +1 -1
- package/dist/types/components.d.ts +34 -2
- package/dist/types/shell/index.d.ts +1 -1
- package/dist/vue/ds-panel-tools.js +3 -0
- package/dist/vue/ds-shell-app.js +2 -0
- package/dist/vue/ds-shell-tools.js +5 -2
- package/package.json +3 -3
- package/dist/components/p-COFw_fcj.js +0 -2
- package/dist/components/p-COFw_fcj.js.map +0 -1
- package/dist/components/p-CvHrCyuz.js +0 -2
- package/dist/components/p-CvHrCyuz.js.map +0 -1
|
@@ -41,21 +41,24 @@
|
|
|
41
41
|
"accessibility": [
|
|
42
42
|
"Only the active mobile tool view participates in focus or the accessibility tree.",
|
|
43
43
|
"Header Back and application-owned header actions preserve the PanelTools event contract.",
|
|
44
|
-
"A direct Activity destination renders its own named tool view; an explicitly grouped Inbox uses a named label-only TabGroup."
|
|
44
|
+
"A direct Activity destination renders its own named tool view; an explicitly grouped Inbox uses a named label-only TabGroup.",
|
|
45
|
+
"Desktop and tablet rail accessories retain PanelTools-owned labels, focus order, decorative-boundary semantics, and direct-action events."
|
|
45
46
|
],
|
|
46
47
|
"states": [
|
|
47
48
|
"The application owns open and activeTool and replaces headers when tool depth changes.",
|
|
48
49
|
"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.",
|
|
49
50
|
"Stable tool ids own named slots; label, order, rail placement, shortcut, and mobile destination are explicit item data.",
|
|
51
|
+
"Application-owned rail accessories are forwarded unchanged to PanelTools on desktop and tablet and remain independent from activeTool and open.",
|
|
50
52
|
"Switching responsive mode must not recreate application-owned slotted product elements."
|
|
51
53
|
],
|
|
52
54
|
"responsiveBehavior": [
|
|
53
55
|
"Desktop and tablet compose PanelTools-compatible rail and drawer chrome.",
|
|
54
|
-
"Mobile renders one centered MobileHeader for every direct tool; explicitly grouped Inbox tools use the large segmented section control."
|
|
56
|
+
"Mobile renders one centered MobileHeader for every direct tool; explicitly grouped Inbox tools use the large segmented section control.",
|
|
57
|
+
"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."
|
|
55
58
|
],
|
|
56
59
|
"frameworkCaveats": {
|
|
57
60
|
"customElements": [
|
|
58
|
-
"Assign items and headers as JavaScript properties and place each persistent owner in its named *-view slot."
|
|
61
|
+
"Assign items, accessories, and headers as JavaScript properties and place each persistent owner in its named *-view slot."
|
|
59
62
|
],
|
|
60
63
|
"react": [
|
|
61
64
|
"Keep stable keyed product owner elements in the generated wrapper's named slots."
|
|
@@ -77,6 +80,14 @@
|
|
|
77
80
|
},
|
|
78
81
|
"api": {
|
|
79
82
|
"props": {
|
|
83
|
+
"accessories": {
|
|
84
|
+
"type": "PanelToolsRailAccessory[]",
|
|
85
|
+
"resolvedType": "PanelToolsRailAccessory[]",
|
|
86
|
+
"default": "[]",
|
|
87
|
+
"required": false,
|
|
88
|
+
"mutable": false,
|
|
89
|
+
"description": "Desktop/tablet rail accessories. Intentionally omitted from the mobile tool stage."
|
|
90
|
+
},
|
|
80
91
|
"activeTool": {
|
|
81
92
|
"type": "PanelToolsToolId | ''",
|
|
82
93
|
"resolvedType": "string",
|
|
@@ -195,6 +206,13 @@
|
|
|
195
206
|
"cancelable": true,
|
|
196
207
|
"composed": true
|
|
197
208
|
},
|
|
209
|
+
{
|
|
210
|
+
"name": "dsRailAccessoryAction",
|
|
211
|
+
"detail": "PanelToolsRailAccessoryActionDetail",
|
|
212
|
+
"bubbles": true,
|
|
213
|
+
"cancelable": true,
|
|
214
|
+
"composed": true
|
|
215
|
+
},
|
|
198
216
|
{
|
|
199
217
|
"name": "dsToolChange",
|
|
200
218
|
"detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }",
|
|
@@ -223,6 +241,14 @@
|
|
|
223
241
|
"slots": []
|
|
224
242
|
},
|
|
225
243
|
"props": {
|
|
244
|
+
"accessories": {
|
|
245
|
+
"type": "PanelToolsRailAccessory[]",
|
|
246
|
+
"resolvedType": "PanelToolsRailAccessory[]",
|
|
247
|
+
"default": "[]",
|
|
248
|
+
"required": false,
|
|
249
|
+
"mutable": false,
|
|
250
|
+
"description": "Desktop/tablet rail accessories. Intentionally omitted from the mobile tool stage."
|
|
251
|
+
},
|
|
226
252
|
"activeTool": {
|
|
227
253
|
"type": "PanelToolsToolId | ''",
|
|
228
254
|
"resolvedType": "string",
|
|
@@ -341,6 +367,13 @@
|
|
|
341
367
|
"cancelable": true,
|
|
342
368
|
"composed": true
|
|
343
369
|
},
|
|
370
|
+
{
|
|
371
|
+
"name": "dsRailAccessoryAction",
|
|
372
|
+
"detail": "PanelToolsRailAccessoryActionDetail",
|
|
373
|
+
"bubbles": true,
|
|
374
|
+
"cancelable": true,
|
|
375
|
+
"composed": true
|
|
376
|
+
},
|
|
344
377
|
{
|
|
345
378
|
"name": "dsToolChange",
|
|
346
379
|
"detail": "{\n id: PanelToolsToolId;\n selected: boolean;\n }",
|
|
@@ -392,10 +425,10 @@
|
|
|
392
425
|
"import": "import { DsShellTools } from '@ds-mo/ui/angular/ds-shell-tools';",
|
|
393
426
|
"example": "<ds-shell-tools></ds-shell-tools>"
|
|
394
427
|
},
|
|
395
|
-
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: headers, items.",
|
|
428
|
+
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: accessories, headers, items.",
|
|
396
429
|
"peerDependencies": {
|
|
397
430
|
"required": [
|
|
398
|
-
"@ds-mo/tokens ^6.5.
|
|
431
|
+
"@ds-mo/tokens ^6.5.1",
|
|
399
432
|
"@ds-mo/icons ^7.0.0"
|
|
400
433
|
],
|
|
401
434
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -420,7 +453,7 @@
|
|
|
420
453
|
},
|
|
421
454
|
{
|
|
422
455
|
"path": "src/wc/components/ShellTools/ShellTools.tsx",
|
|
423
|
-
"content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n Watch,\n} from '@stencil/core';\nimport {\n PANEL_TOOLS_LABELS,\n type PanelToolsHeaderConfig,\n type PanelToolsHeaders,\n type PanelToolsItem,\n type PanelToolsToolId,\n} from '../PanelTools/panel-tools-types';\nimport {\n orderPanelToolsItems,\n reconcilePanelToolsAvailability,\n resolvePanelToolActivation,\n} from '../PanelTools/panel-tools-utils';\nimport {\n itemUsesShellInbox,\n isShellInboxTool,\n resolveAvailableInboxTool,\n type ShellInboxToolId,\n type ShellResponsiveMode,\n} from '../../shell/shell-responsive';\n\n@Component({\n tag: 'ds-shell-tools',\n styleUrl: 'ShellTools.css',\n shadow: true,\n})\nexport class ShellTools {\n @Element() el!: HTMLElement;\n\n /** Resolved by ShellApp; mobile uses a full-stage tool presentation. */\n @Prop({ attribute: 'responsive-mode', reflect: true })\n responsiveMode: ShellResponsiveMode = 'desktop';\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n @Prop({ mutable: true, attribute: 'active-tool', reflect: true })\n activeTool: PanelToolsToolId | '' = '';\n @Prop({ mutable: true, reflect: true }) presentation: 'drawer' | 'fullscreen' = 'drawer';\n @Prop({ attribute: 'fullscreen-header-mode', reflect: true })\n fullscreenHeaderMode: 'shared' | 'split' = 'shared';\n @Prop() items: PanelToolsItem[] = [];\n @Prop() headers: PanelToolsHeaders = {};\n @Prop({ attribute: 'storage-key' }) storageKey: string = '';\n @Prop() toolsLabel: string = 'Tools';\n @Prop() toolShortcutsLabel: string = 'Tool shortcuts';\n @Prop() inboxLabel: string = 'Inbox';\n @Prop() inboxNavigationLabel: string = 'Inbox sections';\n\n @Watch('presentation')\n presentationChanged(next: 'drawer' | 'fullscreen', previous: 'drawer' | 'fullscreen') {\n if (next === previous) return;\n\n /*\n * Consumers update ShellTools and their slotted master/detail layout in the\n * same render. Forward the request immediately so PanelTools can conceal\n * its surface until its matching render class commits on the next frame.\n */\n if (this.panelToolsEl && this.panelToolsEl.getAttribute('presentation') !== next) {\n this.panelToolsEl.setAttribute('presentation', next);\n }\n }\n\n @Event({ bubbles: true, composed: true }) dsToolChange!: EventEmitter<{\n id: PanelToolsToolId;\n selected: boolean;\n }>;\n @Event({ bubbles: true, composed: true }) dsPresentationChange!: EventEmitter<{\n presentation: 'drawer' | 'fullscreen';\n }>;\n @Event({ bubbles: true, composed: true }) dsHeaderBack!: EventEmitter<{\n tool: PanelToolsToolId;\n }>;\n @Event({ bubbles: true, composed: true }) dsHeaderAction!: EventEmitter<{\n tool: PanelToolsToolId;\n id: string;\n }>;\n\n private panelToolsEl: HTMLDsPanelToolsElement | null = null;\n\n private get resolvedItems(): PanelToolsItem[] {\n return this.items ?? [];\n }\n\n private get availableInboxTools(): ShellInboxToolId[] {\n return this.resolvedItems\n .filter(item => !item.isInactive && itemUsesShellInbox(item))\n .map(item => item.id as ShellInboxToolId);\n }\n\n private get mobileViewOrder(): PanelToolsToolId[] {\n return orderPanelToolsItems(this.resolvedItems).map(item => item.id);\n }\n\n private toolLabel(id: PanelToolsToolId): string {\n const item = this.resolvedItems.find(candidate => candidate.id === id);\n return (\n item?.label ??\n item?.ariaLabel ??\n PANEL_TOOLS_LABELS[id as keyof typeof PANEL_TOOLS_LABELS] ??\n id\n );\n }\n\n private get mobileActiveTool(): PanelToolsToolId | '' {\n const item = this.resolvedItems.find(candidate => candidate.id === this.activeTool);\n const inbox = item ? itemUsesShellInbox(item) : isShellInboxTool(this.activeTool);\n if (!inbox) return this.activeTool;\n return resolveAvailableInboxTool(this.activeTool, this.availableInboxTools);\n }\n\n componentWillLoad() {\n this.reconcileAvailability();\n }\n\n @Watch('items')\n handleItemsChange() {\n this.reconcileAvailability();\n }\n\n private reconcileAvailability() {\n const next = reconcilePanelToolsAvailability(this.resolvedItems, this.open, this.activeTool);\n this.open = next.open;\n this.activeTool = next.activeTool;\n }\n\n private resolvedHeaders(): PanelToolsHeaders {\n return this.headers ?? {};\n }\n\n private activeHeader(tool: PanelToolsToolId): PanelToolsHeaderConfig {\n return this.resolvedHeaders()[tool] ?? {};\n }\n\n private activateMobileTool(id: PanelToolsToolId) {\n const item = this.resolvedItems.find(entry => entry.id === id);\n if (!item || item.isInactive) return;\n const next = resolvePanelToolActivation(this.open, this.activeTool, id);\n this.open = next.open;\n this.activeTool = next.activeTool;\n this.dsToolChange.emit({ id, selected: next.selected });\n }\n\n private selectInboxTool = (event: CustomEvent<string>) => {\n const id = event.detail;\n if (!this.availableInboxTools.includes(id) || id === this.mobileActiveTool) return;\n this.open = true;\n this.activeTool = id;\n this.dsToolChange.emit({ id, selected: true });\n };\n\n private handlePanelToolChange = (\n event: CustomEvent<{ id: PanelToolsToolId; selected: boolean }>\n ) => {\n this.activeTool = event.detail.id;\n this.open = event.detail.selected;\n };\n\n private handlePanelPresentationChange = (\n event: CustomEvent<{ presentation: 'drawer' | 'fullscreen' }>\n ) => {\n this.presentation = event.detail.presentation;\n };\n\n private handleMobileHeaderAction = (\n tool: PanelToolsToolId,\n id: string,\n event: CustomEvent<MouseEvent>\n ) => {\n event.stopPropagation();\n this.dsHeaderAction.emit({ tool, id });\n };\n\n /** Match PanelTools' imperative activation contract in every responsive mode. */\n @Method()\n async activateTool(id: PanelToolsToolId) {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.activateTool(id);\n return;\n }\n this.activateMobileTool(id);\n }\n\n /** Close the active global tool surface. */\n @Method()\n async closeDrawer() {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.closeDrawer();\n return;\n }\n if (!this.open) return;\n const id = this.activeTool;\n this.open = false;\n if (id) this.dsToolChange.emit({ id, selected: false });\n }\n\n /** Focus an application-owned action in the visible shared tool header. */\n @Method()\n async focusHeaderAction(id: string) {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.focusHeaderAction(id);\n return;\n }\n const action = (this.el.shadowRoot ?? this.el).querySelector(\n `[data-header-action-id=\"${CSS.escape(id)}\"]`\n ) as (HTMLElement & { setFocus?: () => Promise<void> }) | null;\n await action?.setFocus?.();\n }\n\n private renderForwardedSlots() {\n return this.mobileViewOrder.flatMap(id => [\n <div key={`tool:${id}`} class=\"shell-tools__slot-proxy\" slot={id}>\n <slot name={id} />\n </div>,\n <div key={`tool-view:${id}`} class=\"shell-tools__slot-proxy\" slot={`${id}-view`}>\n <slot name={`${id}-view`} />\n </div>,\n ]);\n }\n\n private renderDesktop() {\n return (\n <div class=\"shell-tools__desktop\">\n <ds-panel-tools\n open={this.open}\n activeTool={this.activeTool}\n presentation={this.presentation}\n fullscreenHeaderMode={this.fullscreenHeaderMode}\n items={this.resolvedItems}\n headers={this.resolvedHeaders()}\n storageKey={this.storageKey}\n toolsLabel={this.toolsLabel}\n toolShortcutsLabel={this.toolShortcutsLabel}\n ref={element => {\n this.panelToolsEl = element as HTMLDsPanelToolsElement | null;\n }}\n onDsToolChange={this.handlePanelToolChange}\n onDsPresentationChange={this.handlePanelPresentationChange}\n >\n {this.renderForwardedSlots()}\n </ds-panel-tools>\n </div>\n );\n }\n\n private renderMobileHeader(tool: PanelToolsToolId) {\n const header = this.activeHeader(tool);\n const configuredTitle = header.title?.trim();\n const title = configuredTitle || this.toolLabel(tool);\n const actions = (header.actions ?? []).filter(action => action.id !== 'fullscreen');\n const item = this.resolvedItems.find(candidate => candidate.id === tool);\n const inboxRoot = Boolean(item && itemUsesShellInbox(item) && !header.showBack);\n const sections = inboxRoot\n ? this.availableInboxTools.map(id => {\n const item = this.resolvedItems.find(candidate => candidate.id === id);\n return {\n id,\n label: this.toolLabel(id),\n variant: 'label' as const,\n dot: item?.dot,\n };\n })\n : [];\n\n return (\n <ds-mobile-header\n class=\"shell-tools__mobile-header\"\n heading={title}\n headingLevel=\"h2\"\n sections={sections}\n value={tool}\n sectionsAriaLabel={this.inboxNavigationLabel}\n sectionsPresentation={inboxRoot ? 'segmented' : 'switcher'}\n sectionsSize=\"lg\"\n onDsSectionChange={this.selectInboxTool}\n >\n {header.showBack ? (\n <ds-tooltip slot=\"leading\" label={header.backAriaLabel || 'Back'} side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n variant=\"icon\"\n icon={header.backIcon || 'ChevronLeft'}\n size=\"md\"\n aria-label={header.backAriaLabel || 'Back'}\n activeFill={false}\n hasBorder={false}\n onDsClick={() => this.dsHeaderBack.emit({ tool })}\n />\n </ds-tooltip>\n ) : null}\n {actions.map(action => (\n <ds-tooltip\n slot=\"trailing\"\n key={action.id}\n label={action.ariaLabel}\n side=\"bottom\"\n size=\"sm\"\n >\n <ds-button-unfilled\n id={action.triggerId || undefined}\n data-header-action-id={action.id}\n variant=\"icon\"\n icon={action.icon}\n size=\"md\"\n aria-label={action.ariaLabel}\n haspopup={action.haspopup}\n controls={action.controls}\n expanded={action.expanded}\n pressed={action.pressed}\n isInactive={action.isInactive}\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.handleMobileHeaderAction(tool, action.id, event)\n }\n />\n </ds-tooltip>\n ))}\n </ds-mobile-header>\n );\n }\n\n private renderMobile() {\n const tool = this.mobileActiveTool;\n return (\n <div\n class=\"shell-tools__mobile\"\n aria-hidden={this.open && tool ? undefined : 'true'}\n inert={this.open && tool ? undefined : true}\n >\n {tool ? this.renderMobileHeader(tool) : null}\n <div class=\"shell-tools__mobile-body\">\n {this.mobileViewOrder.map(id => {\n const active = this.open && id === tool;\n return (\n <div\n key={`mobile-tool-view:${id}`}\n class={{\n 'shell-tools__view': true,\n 'shell-tools__view--active': active,\n }}\n hidden={!active}\n aria-hidden={active ? undefined : 'true'}\n inert={active ? undefined : true}\n >\n <slot name={`${id}-view`}>\n <slot name={id} />\n </slot>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n render() {\n const mobile = this.responsiveMode === 'mobile';\n return (\n <Host\n role={\n mobile ? (this.presentation === 'fullscreen' ? 'dialog' : 'complementary') : undefined\n }\n aria-modal={mobile && this.presentation === 'fullscreen' ? 'true' : undefined}\n aria-label={mobile ? this.toolsLabel : undefined}\n >\n {mobile ? this.renderMobile() : this.renderDesktop()}\n </Host>\n );\n }\n}\n",
|
|
456
|
+
"content": "import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n Watch,\n} from '@stencil/core';\nimport {\n PANEL_TOOLS_LABELS,\n type PanelToolsHeaderConfig,\n type PanelToolsHeaders,\n type PanelToolsItem,\n type PanelToolsRailAccessory,\n type PanelToolsRailAccessoryActionDetail,\n type PanelToolsToolId,\n} from '../PanelTools/panel-tools-types';\nimport {\n orderPanelToolsItems,\n reconcilePanelToolsAvailability,\n resolvePanelToolActivation,\n} from '../PanelTools/panel-tools-utils';\nimport {\n itemUsesShellInbox,\n isShellInboxTool,\n resolveAvailableInboxTool,\n type ShellInboxToolId,\n type ShellResponsiveMode,\n} from '../../shell/shell-responsive';\n\n@Component({\n tag: 'ds-shell-tools',\n styleUrl: 'ShellTools.css',\n shadow: true,\n})\nexport class ShellTools {\n @Element() el!: HTMLElement;\n\n /** Resolved by ShellApp; mobile uses a full-stage tool presentation. */\n @Prop({ attribute: 'responsive-mode', reflect: true })\n responsiveMode: ShellResponsiveMode = 'desktop';\n @Prop({ mutable: true, reflect: true }) open: boolean = false;\n @Prop({ mutable: true, attribute: 'active-tool', reflect: true })\n activeTool: PanelToolsToolId | '' = '';\n @Prop({ mutable: true, reflect: true }) presentation: 'drawer' | 'fullscreen' = 'drawer';\n @Prop({ attribute: 'fullscreen-header-mode', reflect: true })\n fullscreenHeaderMode: 'shared' | 'split' = 'shared';\n @Prop() items: PanelToolsItem[] = [];\n /** Desktop/tablet rail accessories. Intentionally omitted from the mobile tool stage. */\n @Prop() accessories: PanelToolsRailAccessory[] = [];\n @Prop() headers: PanelToolsHeaders = {};\n @Prop({ attribute: 'storage-key' }) storageKey: string = '';\n @Prop() toolsLabel: string = 'Tools';\n @Prop() toolShortcutsLabel: string = 'Tool shortcuts';\n @Prop() inboxLabel: string = 'Inbox';\n @Prop() inboxNavigationLabel: string = 'Inbox sections';\n\n @Watch('presentation')\n presentationChanged(next: 'drawer' | 'fullscreen', previous: 'drawer' | 'fullscreen') {\n if (next === previous) return;\n\n /*\n * Consumers update ShellTools and their slotted master/detail layout in the\n * same render. Forward the request immediately so PanelTools can conceal\n * its surface until its matching render class commits on the next frame.\n */\n if (this.panelToolsEl && this.panelToolsEl.getAttribute('presentation') !== next) {\n this.panelToolsEl.setAttribute('presentation', next);\n }\n }\n\n @Event({ bubbles: true, composed: true }) dsToolChange!: EventEmitter<{\n id: PanelToolsToolId;\n selected: boolean;\n }>;\n @Event({ bubbles: true, composed: true }) dsPresentationChange!: EventEmitter<{\n presentation: 'drawer' | 'fullscreen';\n }>;\n @Event({ bubbles: true, composed: true }) dsHeaderBack!: EventEmitter<{\n tool: PanelToolsToolId;\n }>;\n @Event({ bubbles: true, composed: true }) dsHeaderAction!: EventEmitter<{\n tool: PanelToolsToolId;\n id: string;\n }>;\n @Event({ bubbles: true, composed: true })\n dsRailAccessoryAction!: EventEmitter<PanelToolsRailAccessoryActionDetail>;\n\n private panelToolsEl: HTMLDsPanelToolsElement | null = null;\n\n private get resolvedItems(): PanelToolsItem[] {\n return this.items ?? [];\n }\n\n private get availableInboxTools(): ShellInboxToolId[] {\n return this.resolvedItems\n .filter(item => !item.isInactive && itemUsesShellInbox(item))\n .map(item => item.id as ShellInboxToolId);\n }\n\n private get mobileViewOrder(): PanelToolsToolId[] {\n return orderPanelToolsItems(this.resolvedItems).map(item => item.id);\n }\n\n private toolLabel(id: PanelToolsToolId): string {\n const item = this.resolvedItems.find(candidate => candidate.id === id);\n return (\n item?.label ??\n item?.ariaLabel ??\n PANEL_TOOLS_LABELS[id as keyof typeof PANEL_TOOLS_LABELS] ??\n id\n );\n }\n\n private get mobileActiveTool(): PanelToolsToolId | '' {\n const item = this.resolvedItems.find(candidate => candidate.id === this.activeTool);\n const inbox = item ? itemUsesShellInbox(item) : isShellInboxTool(this.activeTool);\n if (!inbox) return this.activeTool;\n return resolveAvailableInboxTool(this.activeTool, this.availableInboxTools);\n }\n\n componentWillLoad() {\n this.reconcileAvailability();\n }\n\n @Watch('items')\n handleItemsChange() {\n this.reconcileAvailability();\n }\n\n private reconcileAvailability() {\n const next = reconcilePanelToolsAvailability(this.resolvedItems, this.open, this.activeTool);\n this.open = next.open;\n this.activeTool = next.activeTool;\n }\n\n private resolvedHeaders(): PanelToolsHeaders {\n return this.headers ?? {};\n }\n\n private activeHeader(tool: PanelToolsToolId): PanelToolsHeaderConfig {\n return this.resolvedHeaders()[tool] ?? {};\n }\n\n private activateMobileTool(id: PanelToolsToolId) {\n const item = this.resolvedItems.find(entry => entry.id === id);\n if (!item || item.isInactive) return;\n const next = resolvePanelToolActivation(this.open, this.activeTool, id);\n this.open = next.open;\n this.activeTool = next.activeTool;\n this.dsToolChange.emit({ id, selected: next.selected });\n }\n\n private selectInboxTool = (event: CustomEvent<string>) => {\n const id = event.detail;\n if (!this.availableInboxTools.includes(id) || id === this.mobileActiveTool) return;\n this.open = true;\n this.activeTool = id;\n this.dsToolChange.emit({ id, selected: true });\n };\n\n private handlePanelToolChange = (\n event: CustomEvent<{ id: PanelToolsToolId; selected: boolean }>\n ) => {\n this.activeTool = event.detail.id;\n this.open = event.detail.selected;\n };\n\n private handlePanelPresentationChange = (\n event: CustomEvent<{ presentation: 'drawer' | 'fullscreen' }>\n ) => {\n this.presentation = event.detail.presentation;\n };\n\n private handlePanelRailAccessoryAction = (\n event: CustomEvent<PanelToolsRailAccessoryActionDetail>\n ) => {\n event.stopPropagation();\n this.dsRailAccessoryAction.emit(event.detail);\n };\n\n private handleMobileHeaderAction = (\n tool: PanelToolsToolId,\n id: string,\n event: CustomEvent<MouseEvent>\n ) => {\n event.stopPropagation();\n this.dsHeaderAction.emit({ tool, id });\n };\n\n /** Match PanelTools' imperative activation contract in every responsive mode. */\n @Method()\n async activateTool(id: PanelToolsToolId) {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.activateTool(id);\n return;\n }\n this.activateMobileTool(id);\n }\n\n /** Close the active global tool surface. */\n @Method()\n async closeDrawer() {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.closeDrawer();\n return;\n }\n if (!this.open) return;\n const id = this.activeTool;\n this.open = false;\n if (id) this.dsToolChange.emit({ id, selected: false });\n }\n\n /** Focus an application-owned action in the visible shared tool header. */\n @Method()\n async focusHeaderAction(id: string) {\n if (this.responsiveMode !== 'mobile') {\n await this.panelToolsEl?.focusHeaderAction(id);\n return;\n }\n const action = (this.el.shadowRoot ?? this.el).querySelector(\n `[data-header-action-id=\"${CSS.escape(id)}\"]`\n ) as (HTMLElement & { setFocus?: () => Promise<void> }) | null;\n await action?.setFocus?.();\n }\n\n private renderForwardedSlots() {\n return this.mobileViewOrder.flatMap(id => [\n <div key={`tool:${id}`} class=\"shell-tools__slot-proxy\" slot={id}>\n <slot name={id} />\n </div>,\n <div key={`tool-view:${id}`} class=\"shell-tools__slot-proxy\" slot={`${id}-view`}>\n <slot name={`${id}-view`} />\n </div>,\n ]);\n }\n\n private renderDesktop() {\n return (\n <div class=\"shell-tools__desktop\">\n <ds-panel-tools\n open={this.open}\n activeTool={this.activeTool}\n presentation={this.presentation}\n fullscreenHeaderMode={this.fullscreenHeaderMode}\n items={this.resolvedItems}\n accessories={this.accessories ?? []}\n headers={this.resolvedHeaders()}\n storageKey={this.storageKey}\n toolsLabel={this.toolsLabel}\n toolShortcutsLabel={this.toolShortcutsLabel}\n ref={element => {\n this.panelToolsEl = element as HTMLDsPanelToolsElement | null;\n }}\n onDsToolChange={this.handlePanelToolChange}\n onDsPresentationChange={this.handlePanelPresentationChange}\n onDsRailAccessoryAction={this.handlePanelRailAccessoryAction}\n >\n {this.renderForwardedSlots()}\n </ds-panel-tools>\n </div>\n );\n }\n\n private renderMobileHeader(tool: PanelToolsToolId) {\n const header = this.activeHeader(tool);\n const configuredTitle = header.title?.trim();\n const title = configuredTitle || this.toolLabel(tool);\n const actions = (header.actions ?? []).filter(action => action.id !== 'fullscreen');\n const item = this.resolvedItems.find(candidate => candidate.id === tool);\n const inboxRoot = Boolean(item && itemUsesShellInbox(item) && !header.showBack);\n const sections = inboxRoot\n ? this.availableInboxTools.map(id => {\n const item = this.resolvedItems.find(candidate => candidate.id === id);\n return {\n id,\n label: this.toolLabel(id),\n variant: 'label' as const,\n dot: item?.dot,\n };\n })\n : [];\n\n return (\n <ds-mobile-header\n class=\"shell-tools__mobile-header\"\n heading={title}\n headingLevel=\"h2\"\n sections={sections}\n value={tool}\n sectionsAriaLabel={this.inboxNavigationLabel}\n sectionsPresentation={inboxRoot ? 'segmented' : 'switcher'}\n sectionsSize=\"lg\"\n onDsSectionChange={this.selectInboxTool}\n >\n {header.showBack ? (\n <ds-tooltip slot=\"leading\" label={header.backAriaLabel || 'Back'} side=\"bottom\" size=\"sm\">\n <ds-button-unfilled\n variant=\"icon\"\n icon={header.backIcon || 'ChevronLeft'}\n size=\"md\"\n aria-label={header.backAriaLabel || 'Back'}\n activeFill={false}\n hasBorder={false}\n onDsClick={() => this.dsHeaderBack.emit({ tool })}\n />\n </ds-tooltip>\n ) : null}\n {actions.map(action => (\n <ds-tooltip\n slot=\"trailing\"\n key={action.id}\n label={action.ariaLabel}\n side=\"bottom\"\n size=\"sm\"\n >\n <ds-button-unfilled\n id={action.triggerId || undefined}\n data-header-action-id={action.id}\n variant=\"icon\"\n icon={action.icon}\n size=\"md\"\n aria-label={action.ariaLabel}\n haspopup={action.haspopup}\n controls={action.controls}\n expanded={action.expanded}\n pressed={action.pressed}\n isInactive={action.isInactive}\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.handleMobileHeaderAction(tool, action.id, event)\n }\n />\n </ds-tooltip>\n ))}\n </ds-mobile-header>\n );\n }\n\n private renderMobile() {\n const tool = this.mobileActiveTool;\n return (\n <div\n class=\"shell-tools__mobile\"\n aria-hidden={this.open && tool ? undefined : 'true'}\n inert={this.open && tool ? undefined : true}\n >\n {tool ? this.renderMobileHeader(tool) : null}\n <div class=\"shell-tools__mobile-body\">\n {this.mobileViewOrder.map(id => {\n const active = this.open && id === tool;\n return (\n <div\n key={`mobile-tool-view:${id}`}\n class={{\n 'shell-tools__view': true,\n 'shell-tools__view--active': active,\n }}\n hidden={!active}\n aria-hidden={active ? undefined : 'true'}\n inert={active ? undefined : true}\n >\n <slot name={`${id}-view`}>\n <slot name={id} />\n </slot>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n render() {\n const mobile = this.responsiveMode === 'mobile';\n return (\n <Host\n role={\n mobile ? (this.presentation === 'fullscreen' ? 'dialog' : 'complementary') : undefined\n }\n aria-modal={mobile && this.presentation === 'fullscreen' ? 'true' : undefined}\n aria-label={mobile ? this.toolsLabel : undefined}\n >\n {mobile ? this.renderMobile() : this.renderDesktop()}\n </Host>\n );\n }\n}\n",
|
|
424
457
|
"type": "registry:ui"
|
|
425
458
|
}
|
|
426
459
|
]
|
|
@@ -634,7 +634,7 @@
|
|
|
634
634
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: formatOptions, valueTexts.",
|
|
635
635
|
"peerDependencies": {
|
|
636
636
|
"required": [
|
|
637
|
-
"@ds-mo/tokens ^6.5.
|
|
637
|
+
"@ds-mo/tokens ^6.5.1",
|
|
638
638
|
"@ds-mo/icons ^7.0.0"
|
|
639
639
|
],
|
|
640
640
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -204,7 +204,7 @@
|
|
|
204
204
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: options, sections.",
|
|
205
205
|
"peerDependencies": {
|
|
206
206
|
"required": [
|
|
207
|
-
"@ds-mo/tokens ^6.5.
|
|
207
|
+
"@ds-mo/tokens ^6.5.1",
|
|
208
208
|
"@ds-mo/icons ^7.0.0"
|
|
209
209
|
],
|
|
210
210
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -281,7 +281,7 @@
|
|
|
281
281
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: tabs.",
|
|
282
282
|
"peerDependencies": {
|
|
283
283
|
"required": [
|
|
284
|
-
"@ds-mo/tokens ^6.5.
|
|
284
|
+
"@ds-mo/tokens ^6.5.1",
|
|
285
285
|
"@ds-mo/icons ^7.0.0"
|
|
286
286
|
],
|
|
287
287
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -442,7 +442,7 @@
|
|
|
442
442
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: filters, matchModes, values.",
|
|
443
443
|
"peerDependencies": {
|
|
444
444
|
"required": [
|
|
445
|
-
"@ds-mo/tokens ^6.5.
|
|
445
|
+
"@ds-mo/tokens ^6.5.1",
|
|
446
446
|
"@ds-mo/icons ^7.0.0"
|
|
447
447
|
],
|
|
448
448
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: grouping, options.",
|
|
270
270
|
"peerDependencies": {
|
|
271
271
|
"required": [
|
|
272
|
-
"@ds-mo/tokens ^6.5.
|
|
272
|
+
"@ds-mo/tokens ^6.5.1",
|
|
273
273
|
"@ds-mo/icons ^7.0.0"
|
|
274
274
|
],
|
|
275
275
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -348,7 +348,7 @@
|
|
|
348
348
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: views.",
|
|
349
349
|
"peerDependencies": {
|
|
350
350
|
"required": [
|
|
351
|
-
"@ds-mo/tokens ^6.5.
|
|
351
|
+
"@ds-mo/tokens ^6.5.1",
|
|
352
352
|
"@ds-mo/icons ^7.0.0"
|
|
353
353
|
],
|
|
354
354
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -298,7 +298,7 @@
|
|
|
298
298
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: columns, selectedFieldIds.",
|
|
299
299
|
"peerDependencies": {
|
|
300
300
|
"required": [
|
|
301
|
-
"@ds-mo/tokens ^6.5.
|
|
301
|
+
"@ds-mo/tokens ^6.5.1",
|
|
302
302
|
"@ds-mo/icons ^7.0.0"
|
|
303
303
|
],
|
|
304
304
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -195,7 +195,7 @@
|
|
|
195
195
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: columns, sort.",
|
|
196
196
|
"peerDependencies": {
|
|
197
197
|
"required": [
|
|
198
|
-
"@ds-mo/tokens ^6.5.
|
|
198
|
+
"@ds-mo/tokens ^6.5.1",
|
|
199
199
|
"@ds-mo/icons ^7.0.0"
|
|
200
200
|
],
|
|
201
201
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -1294,7 +1294,7 @@
|
|
|
1294
1294
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: collapsedGroupIds, columnOrder, columns, grouping, groups, hiddenColumnIds, highlightFieldIds, highlightTerms, pagination, rows, selectedRowIds, sort.",
|
|
1295
1295
|
"peerDependencies": {
|
|
1296
1296
|
"required": [
|
|
1297
|
-
"@ds-mo/tokens ^6.5.
|
|
1297
|
+
"@ds-mo/tokens ^6.5.1",
|
|
1298
1298
|
"@ds-mo/icons ^7.0.0"
|
|
1299
1299
|
],
|
|
1300
1300
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -312,7 +312,7 @@
|
|
|
312
312
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: manager, swipeDirections.",
|
|
313
313
|
"peerDependencies": {
|
|
314
314
|
"required": [
|
|
315
|
-
"@ds-mo/tokens ^6.5.
|
|
315
|
+
"@ds-mo/tokens ^6.5.1",
|
|
316
316
|
"@ds-mo/icons ^7.0.0"
|
|
317
317
|
],
|
|
318
318
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -231,7 +231,7 @@
|
|
|
231
231
|
"complexPropertyNote": "Assign these non-primitive values as JavaScript properties: items.",
|
|
232
232
|
"peerDependencies": {
|
|
233
233
|
"required": [
|
|
234
|
-
"@ds-mo/tokens ^6.5.
|
|
234
|
+
"@ds-mo/tokens ^6.5.1",
|
|
235
235
|
"@ds-mo/icons ^7.0.0"
|
|
236
236
|
],
|
|
237
237
|
"frameworks": "Custom Elements; React 18/19 wrappers; Vue 3 wrappers; Angular 19-22 standalone adapters."
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
4
|
*/
|
|
5
5
|
import type { EventName, StencilReactComponent } from './react-runtime.js';
|
|
6
|
-
import { type ChromeTransitionDetail, type DsPanelToolsCustomEvent, type PanelToolsHeaderActionDetail, type PanelToolsToolId } from "@ds-mo/ui";
|
|
6
|
+
import { type ChromeTransitionDetail, type DsPanelToolsCustomEvent, type PanelToolsHeaderActionDetail, type PanelToolsRailAccessoryActionDetail, type PanelToolsToolId } from "@ds-mo/ui";
|
|
7
7
|
import type { Components } from "@ds-mo/ui/dist/components";
|
|
8
8
|
import { DsPanelTools as DsPanelToolsElement } from "@ds-mo/ui/dist/components/ds-panel-tools.js";
|
|
9
9
|
export type DsPanelToolsEvents = {
|
|
@@ -18,6 +18,7 @@ export type DsPanelToolsEvents = {
|
|
|
18
18
|
tool: PanelToolsToolId;
|
|
19
19
|
}>>;
|
|
20
20
|
onDsHeaderAction: EventName<DsPanelToolsCustomEvent<PanelToolsHeaderActionDetail>>;
|
|
21
|
+
onDsRailAccessoryAction: EventName<DsPanelToolsCustomEvent<PanelToolsRailAccessoryActionDetail>>;
|
|
21
22
|
onDsChromeTransitionStart: EventName<DsPanelToolsCustomEvent<ChromeTransitionDetail>>;
|
|
22
23
|
onDsChromeTransitionEnd: EventName<DsPanelToolsCustomEvent<ChromeTransitionDetail>>;
|
|
23
24
|
};
|
|
@@ -12,6 +12,7 @@ export const DsPanelTools = /*@__PURE__*/ createComponent({
|
|
|
12
12
|
onDsPresentationChange: 'dsPresentationChange',
|
|
13
13
|
onDsHeaderBack: 'dsHeaderBack',
|
|
14
14
|
onDsHeaderAction: 'dsHeaderAction',
|
|
15
|
+
onDsRailAccessoryAction: 'dsRailAccessoryAction',
|
|
15
16
|
onDsChromeTransitionStart: 'dsChromeTransitionStart',
|
|
16
17
|
onDsChromeTransitionEnd: 'dsChromeTransitionEnd'
|
|
17
18
|
},
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
4
|
*/
|
|
5
5
|
import type { EventName, StencilReactComponent } from './react-runtime.js';
|
|
6
|
-
import { type BreadcrumbSelectDetail, type DsShellAppCustomEvent, type NavChromeStyle, type PanelNavChildSelectDetail, type PanelNavUserActionDetail, type PanelToolsToolId, type ShellResponsiveMode } from "@ds-mo/ui";
|
|
6
|
+
import { type BreadcrumbSelectDetail, type DsShellAppCustomEvent, type NavChromeStyle, type PanelNavChildSelectDetail, type PanelNavUserActionDetail, type PanelToolsRailAccessoryActionDetail, type PanelToolsToolId, type ShellResponsiveMode } from "@ds-mo/ui";
|
|
7
7
|
import type { Components } from "@ds-mo/ui/dist/components";
|
|
8
8
|
import { DsShellApp as DsShellAppElement } from "@ds-mo/ui/dist/components/ds-shell-app.js";
|
|
9
9
|
export type DsShellAppEvents = {
|
|
@@ -28,6 +28,7 @@ export type DsShellAppEvents = {
|
|
|
28
28
|
tool: PanelToolsToolId;
|
|
29
29
|
id: string;
|
|
30
30
|
}>>;
|
|
31
|
+
onDsRailAccessoryAction: EventName<DsShellAppCustomEvent<PanelToolsRailAccessoryActionDetail>>;
|
|
31
32
|
onDsPresentationChange: EventName<DsShellAppCustomEvent<{
|
|
32
33
|
presentation: 'drawer' | 'fullscreen';
|
|
33
34
|
}>>;
|
|
@@ -19,6 +19,7 @@ export const DsShellApp = /*@__PURE__*/ createComponent({
|
|
|
19
19
|
onDsToolChange: 'dsToolChange',
|
|
20
20
|
onDsHeaderBack: 'dsHeaderBack',
|
|
21
21
|
onDsHeaderAction: 'dsHeaderAction',
|
|
22
|
+
onDsRailAccessoryAction: 'dsRailAccessoryAction',
|
|
22
23
|
onDsPresentationChange: 'dsPresentationChange',
|
|
23
24
|
onDsBrowseContextChange: 'dsBrowseContextChange',
|
|
24
25
|
onDsNavFooterAction: 'dsNavFooterAction',
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
4
4
|
*/
|
|
5
5
|
import type { EventName, StencilReactComponent } from './react-runtime.js';
|
|
6
|
-
import { type DsShellToolsCustomEvent, type PanelToolsToolId } from "@ds-mo/ui";
|
|
6
|
+
import { type DsShellToolsCustomEvent, type PanelToolsRailAccessoryActionDetail, type PanelToolsToolId } from "@ds-mo/ui";
|
|
7
7
|
import type { Components } from "@ds-mo/ui/dist/components";
|
|
8
8
|
import { DsShellTools as DsShellToolsElement } from "@ds-mo/ui/dist/components/ds-shell-tools.js";
|
|
9
9
|
export type DsShellToolsEvents = {
|
|
@@ -21,5 +21,6 @@ export type DsShellToolsEvents = {
|
|
|
21
21
|
tool: PanelToolsToolId;
|
|
22
22
|
id: string;
|
|
23
23
|
}>>;
|
|
24
|
+
onDsRailAccessoryAction: EventName<DsShellToolsCustomEvent<PanelToolsRailAccessoryActionDetail>>;
|
|
24
25
|
};
|
|
25
26
|
export declare const DsShellTools: StencilReactComponent<DsShellToolsElement, DsShellToolsEvents, Components.DsShellTools>;
|
|
@@ -11,7 +11,8 @@ export const DsShellTools = /*@__PURE__*/ createComponent({
|
|
|
11
11
|
onDsToolChange: 'dsToolChange',
|
|
12
12
|
onDsPresentationChange: 'dsPresentationChange',
|
|
13
13
|
onDsHeaderBack: 'dsHeaderBack',
|
|
14
|
-
onDsHeaderAction: 'dsHeaderAction'
|
|
14
|
+
onDsHeaderAction: 'dsHeaderAction',
|
|
15
|
+
onDsRailAccessoryAction: 'dsRailAccessoryAction'
|
|
15
16
|
},
|
|
16
17
|
defineCustomElement: defineDsShellTools
|
|
17
18
|
});
|
|
@@ -28,13 +28,26 @@ export declare class MessageScroller {
|
|
|
28
28
|
private activeTurnAnchorViewportTop?;
|
|
29
29
|
private turnClearance;
|
|
30
30
|
private prependReconciliation;
|
|
31
|
+
private turnPositionGeneration;
|
|
32
|
+
private defaultPositionGeneration;
|
|
33
|
+
private transcriptResetPending;
|
|
34
|
+
private hasLoaded;
|
|
31
35
|
componentDidLoad(): void;
|
|
36
|
+
connectedCallback(): void;
|
|
32
37
|
disconnectedCallback(): void;
|
|
33
38
|
scrollToMessage(id: string): Promise<boolean>;
|
|
34
39
|
scrollToStart(): Promise<void>;
|
|
35
40
|
scrollToEnd(): Promise<void>;
|
|
36
41
|
private motionBehavior;
|
|
37
42
|
private scrollTo;
|
|
43
|
+
private invalidateTranscriptWork;
|
|
44
|
+
private clearActiveTurnAnchor;
|
|
45
|
+
private resetTranscriptTracking;
|
|
46
|
+
private resetTranscriptPositionState;
|
|
47
|
+
private trackTranscript;
|
|
48
|
+
private seedTranscriptBaseline;
|
|
49
|
+
private pruneTranscriptTracking;
|
|
50
|
+
private scheduleDefaultPosition;
|
|
38
51
|
private connectObservers;
|
|
39
52
|
private handleContentGrowth;
|
|
40
53
|
private rememberFirstChildTop;
|
|
@@ -43,6 +56,7 @@ export declare class MessageScroller {
|
|
|
43
56
|
private reconcilePrependPosition;
|
|
44
57
|
private schedulePrependReconciliation;
|
|
45
58
|
private handleTranscriptSlotChange;
|
|
59
|
+
private scheduleNewTurnPosition;
|
|
46
60
|
private positionNewTurn;
|
|
47
61
|
private finishPositionNewTurn;
|
|
48
62
|
private rememberActiveTurnAnchorTop;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A transcript reset replaces the current baseline instead of appending or
|
|
3
|
+
* prepending around surviving nodes. Emptying a populated transcript also
|
|
4
|
+
* starts a reset that completes when its next baseline is supplied.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isMessageScrollerTranscriptReset<T>(previous: readonly T[], current: readonly T[]): boolean;
|
|
7
|
+
/** Keep identity tracking bounded to nodes in the current transcript. */
|
|
8
|
+
export declare function pruneMessageScrollerTranscriptSet<T>(known: Set<T>, current: readonly T[]): void;
|
|
9
|
+
//# sourceMappingURL=message-scroller-transcript.d.ts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { EventEmitter } from '../../stencil-public-runtime';
|
|
2
2
|
import type { ChromeTransitionDetail } from '../../shell/chrome-transition';
|
|
3
|
-
import { type PanelToolsHeaderActionDetail, type PanelToolsHeaders, type PanelToolsItem, type PanelToolsToolId } from './panel-tools-types';
|
|
3
|
+
import { type PanelToolsHeaderActionDetail, type PanelToolsHeaders, type PanelToolsItem, type PanelToolsRailAccessory, type PanelToolsRailAccessoryActionDetail, type PanelToolsToolId } from './panel-tools-types';
|
|
4
4
|
export declare class PanelTools {
|
|
5
5
|
el: HTMLElement;
|
|
6
6
|
/** When false, only the icon rail is shown. */
|
|
@@ -16,6 +16,11 @@ export declare class PanelTools {
|
|
|
16
16
|
* Set via JS property: `el.items = [...]`. Replace the array reference to update.
|
|
17
17
|
*/
|
|
18
18
|
items: PanelToolsItem[];
|
|
19
|
+
/**
|
|
20
|
+
* Desktop/tablet-only application-owned rail boundaries and direct intents.
|
|
21
|
+
* Set via JS property and replace the array reference to update.
|
|
22
|
+
*/
|
|
23
|
+
accessories: PanelToolsRailAccessory[];
|
|
19
24
|
toolsLabel: string;
|
|
20
25
|
toolShortcutsLabel: string;
|
|
21
26
|
/** Active header state per tool. Replace the object when title, depth, or actions change. */
|
|
@@ -40,6 +45,8 @@ export declare class PanelTools {
|
|
|
40
45
|
}>;
|
|
41
46
|
/** Requests one application-owned action from the active tool header. */
|
|
42
47
|
dsHeaderAction: EventEmitter<PanelToolsHeaderActionDetail>;
|
|
48
|
+
/** Direct accessory intent. Emitting this event never changes the active tool or drawer. */
|
|
49
|
+
dsRailAccessoryAction: EventEmitter<PanelToolsRailAccessoryActionDetail>;
|
|
43
50
|
/** Bubbling lifecycle — `ds-bar-nav` defers overflow checks during drawer motion. */
|
|
44
51
|
dsChromeTransitionStart: EventEmitter<ChromeTransitionDetail>;
|
|
45
52
|
dsChromeTransitionEnd: EventEmitter<ChromeTransitionDetail>;
|
|
@@ -66,6 +73,8 @@ export declare class PanelTools {
|
|
|
66
73
|
private railBodyObserver?;
|
|
67
74
|
private get railItems();
|
|
68
75
|
private get orderedRailItems();
|
|
76
|
+
private get railAccessories();
|
|
77
|
+
private get orderedRailEntries();
|
|
69
78
|
disconnectedCallback(): void;
|
|
70
79
|
presentationChanged(next: 'drawer' | 'fullscreen', previous?: 'drawer' | 'fullscreen'): void;
|
|
71
80
|
handleFullscreenEscape(event: KeyboardEvent): void;
|
|
@@ -82,6 +91,7 @@ export declare class PanelTools {
|
|
|
82
91
|
private disconnectRailBodyObserver;
|
|
83
92
|
private updateRailBodyScrollable;
|
|
84
93
|
itemsChanged(): void;
|
|
94
|
+
accessoriesChanged(next?: PanelToolsRailAccessory[], previous?: PanelToolsRailAccessory[]): void;
|
|
85
95
|
private restoreLastActiveTool;
|
|
86
96
|
private persistLastActiveTool;
|
|
87
97
|
private clearPersistedTool;
|
|
@@ -112,6 +122,12 @@ export declare class PanelTools {
|
|
|
112
122
|
private focusRailAt;
|
|
113
123
|
private handleRailKeyDown;
|
|
114
124
|
private renderRailAction;
|
|
125
|
+
private accessoryPrimaryLabel;
|
|
126
|
+
private emitAccessoryAction;
|
|
127
|
+
private renderAccessoryVisual;
|
|
128
|
+
private renderRailShortcut;
|
|
129
|
+
private renderRailAccessory;
|
|
130
|
+
private renderRailEntry;
|
|
115
131
|
render(): any;
|
|
116
132
|
}
|
|
117
133
|
//# sourceMappingURL=PanelTools.d.ts.map
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { PanelToolsItem, PanelToolsToolId } from './panel-tools-types';
|
|
1
|
+
export type { PanelToolsItem, PanelToolsRailAccessory, PanelToolsRailAccessoryAction, PanelToolsRailAccessoryActionDetail, PanelToolsRailAccessorySecondaryAction, PanelToolsRailAccessoryVisual, PanelToolsRailDividerAccessory, PanelToolsRailPlacement, PanelToolsRailShortcutAccessory, PanelToolsRailTransientAccessory, PanelToolsRailTransientTone, PanelToolsToolId, } from './panel-tools-types';
|
|
2
2
|
export { PANEL_TOOLS_FOOTER_TOOL_ID, PANEL_TOOLS_DEFAULT_ITEMS, PANEL_TOOLS_LABELS, PANEL_TOOLS_PRIMARY_TOOL_ID, PANEL_TOOLS_SHORTCUTS, PANEL_TOOLS_TOOL_IDS, } from './panel-tools-types';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|