@ds-mo/ui 14.0.1 → 14.2.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 +1 -1
- package/dist/agent.json +59 -12
- package/dist/angular/ds-mobile-sheet-nav.d.ts +1 -1
- package/dist/angular/ds-mobile-sheet-nav.js +3 -3
- package/dist/angular/ds-tab-group.d.ts +1 -1
- package/dist/angular/ds-tab-group.js +3 -3
- package/dist/angular/ds-table.d.ts +4 -1
- package/dist/angular/ds-table.js +7 -4
- package/dist/components/ds-agent-questionnaire.js +1 -1
- package/dist/components/ds-agent-response.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-chart-legend.js +1 -1
- package/dist/components/ds-chart-legend.js.map +1 -1
- package/dist/components/ds-checkbox.js +1 -1
- package/dist/components/ds-chip.js +1 -1
- package/dist/components/ds-chip.js.map +1 -1
- package/dist/components/ds-code-block.js +1 -1
- package/dist/components/ds-conversation-list-item.js +1 -1
- package/dist/components/ds-conversation-list-item.js.map +1 -1
- package/dist/components/ds-filter-menu.js +1 -1
- package/dist/components/ds-filter-menu.js.map +1 -1
- package/dist/components/ds-input.js +1 -1
- package/dist/components/ds-input.js.map +1 -1
- package/dist/components/ds-markdown.js +1 -1
- package/dist/components/ds-menu.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-header.js +1 -1
- package/dist/components/ds-mobile-section-switcher.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-sub-nav.js +1 -1
- package/dist/components/ds-panel-sub-nav.js.map +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-radio.js +1 -1
- package/dist/components/ds-select.js +1 -1
- package/dist/components/ds-select.js.map +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-page.js +1 -1
- package/dist/components/ds-shell-tools.js +1 -1
- package/dist/components/ds-tab-group.js +1 -1
- package/dist/components/ds-table.js +1 -1
- package/dist/components/ds-table.js.map +1 -1
- package/dist/components/ds-tag.js +1 -1
- package/dist/components/ds-toast.js +1 -1
- package/dist/components/p-1tOy4H51.js +2 -0
- package/dist/components/{p-DatlGTJp.js.map → p-1tOy4H51.js.map} +1 -1
- package/dist/components/{p-DXgSSxyB.js → p-BMJcBo8B.js} +2 -2
- package/dist/components/p-BMJcBo8B.js.map +1 -0
- package/dist/components/{p-nMkoXLC0.js → p-BiOfbCke.js} +2 -2
- package/dist/components/{p-1KtrhAC7.js → p-BnPcWBA8.js} +2 -2
- package/dist/components/p-C-GNvCk0.js +2 -0
- package/dist/components/p-C-GNvCk0.js.map +1 -0
- package/dist/components/{p-D0i_J2rj.js → p-CRjpqqAI.js} +2 -2
- package/dist/components/{p-D0i_J2rj.js.map → p-CRjpqqAI.js.map} +1 -1
- package/dist/components/p-CTTDiW33.js +2 -0
- package/dist/components/{p--z-DWRkg.js.map → p-CTTDiW33.js.map} +1 -1
- package/dist/components/{p-BKsWDUnX.js → p-CTVMXN9s.js} +2 -2
- package/dist/components/p-CbfmzgdW.js +2 -0
- package/dist/components/p-CbfmzgdW.js.map +1 -0
- package/dist/components/{p-CQS5aWiC.js → p-ChlRsQYY.js} +2 -2
- package/dist/components/{p-BaiGt_o6.js → p-DD5OCVXx.js} +2 -2
- package/dist/components/{p-BaiGt_o6.js.map → p-DD5OCVXx.js.map} +1 -1
- package/dist/components/p-DJ_FsLCc.js +2 -0
- package/dist/components/{p-DofS_hVZ.js.map → p-DJ_FsLCc.js.map} +1 -1
- package/dist/components/{p-DXHq_AfZ.js → p-DT4WdAup.js} +2 -2
- package/dist/components/{p-DYoCb_sj.js → p-DYzjeIAT.js} +2 -2
- package/dist/components/{p-DYoCb_sj.js.map → p-DYzjeIAT.js.map} +1 -1
- package/dist/components/p-DmZupC1-.js +2 -0
- package/dist/components/p-DmZupC1-.js.map +1 -0
- package/dist/components/p-DmwMiaWL.js +2 -0
- package/dist/components/{p-vT4pgp8o.js.map → p-DmwMiaWL.js.map} +1 -1
- package/dist/components/p-Dr4AgJbV.js +2 -0
- package/dist/components/{p-DAW6G8Sl.js.map → p-Dr4AgJbV.js.map} +1 -1
- package/dist/components/p-DuFm-ieS.js +2 -0
- package/dist/components/p-DuFm-ieS.js.map +1 -0
- package/dist/components/p-DvJkkdIO.js +2 -0
- package/dist/components/{p-DY_sA9Jz.js.map → p-DvJkkdIO.js.map} +1 -1
- package/dist/components/p-NTU5jrG_.js +2 -0
- package/dist/components/{p-ZtJM0cZm.js.map → p-NTU5jrG_.js.map} +1 -1
- package/dist/components/p-NdahPypA.js.map +1 -1
- package/dist/components/{p-S9IjLCGj.js → p-c9QiNOc7.js} +2 -2
- package/dist/components/{p-CIhETsHv.js → p-eKARJmWs.js} +2 -2
- package/dist/components/p-jMCRaxQW.js +2 -0
- package/dist/components/{p-CUeuemsF.js.map → p-jMCRaxQW.js.map} +1 -1
- package/dist/docs/components.json +312 -9
- package/dist/lib/components/ShellApp/shell-app-types.d.ts +2 -0
- package/dist/mcp-data/registry/card-overview.json +1 -1
- package/dist/mcp-data/registry/mobile-header.json +4 -3
- package/dist/mcp-data/registry/mobile-sheet-nav.json +43 -4
- package/dist/mcp-data/registry/registry.json +58 -11
- package/dist/mcp-data/registry/shell-app.json +5 -3
- package/dist/mcp-data/registry/shell-page.json +2 -2
- package/dist/mcp-data/registry/tab-group.json +23 -4
- package/dist/mcp-data/registry/table.json +135 -10
- package/dist/react/ds-table.d.ts +2 -1
- package/dist/react/ds-table.js +1 -0
- package/dist/styles/table.css +1 -5
- package/dist/types/components/MobileSheetNav/MobileSheetNav.d.ts +4 -0
- package/dist/types/components/ShellApp/ShellApp.d.ts +1 -0
- package/dist/types/components/ShellApp/shell-app-types.d.ts +2 -0
- package/dist/types/components/ShellPage/ShellPage.d.ts +3 -0
- package/dist/types/components/TabGroup/TabGroup.d.ts +4 -0
- package/dist/types/components/Table/Table.d.ts +17 -1
- package/dist/types/components/Table/index.d.ts +1 -1
- package/dist/types/components/Table/table-group-load-controller.d.ts +40 -0
- package/dist/types/components/Table/table-types.d.ts +11 -0
- package/dist/types/components.d.ts +105 -6
- package/package.json +2 -2
- package/dist/components/p--z-DWRkg.js +0 -2
- package/dist/components/p-CElfUmMp.js +0 -2
- package/dist/components/p-CElfUmMp.js.map +0 -1
- package/dist/components/p-CUeuemsF.js +0 -2
- package/dist/components/p-Cae9PFPE.js +0 -2
- package/dist/components/p-Cae9PFPE.js.map +0 -1
- package/dist/components/p-Cih1XCy3.js +0 -2
- package/dist/components/p-Cih1XCy3.js.map +0 -1
- package/dist/components/p-DAW6G8Sl.js +0 -2
- package/dist/components/p-DXgSSxyB.js.map +0 -1
- package/dist/components/p-DY_sA9Jz.js +0 -2
- package/dist/components/p-DatlGTJp.js +0 -2
- package/dist/components/p-DofS_hVZ.js +0 -2
- package/dist/components/p-ZtJM0cZm.js +0 -2
- package/dist/components/p-vT4pgp8o.js +0 -2
- /package/dist/components/{p-nMkoXLC0.js.map → p-BiOfbCke.js.map} +0 -0
- /package/dist/components/{p-1KtrhAC7.js.map → p-BnPcWBA8.js.map} +0 -0
- /package/dist/components/{p-BKsWDUnX.js.map → p-CTVMXN9s.js.map} +0 -0
- /package/dist/components/{p-CQS5aWiC.js.map → p-ChlRsQYY.js.map} +0 -0
- /package/dist/components/{p-DXHq_AfZ.js.map → p-DT4WdAup.js.map} +0 -0
- /package/dist/components/{p-S9IjLCGj.js.map → p-c9QiNOc7.js.map} +0 -0
- /package/dist/components/{p-CIhETsHv.js.map → p-eKARJmWs.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SHELL_GRADIENT_PRESETS","DEFAULT_SHELL_GRADIENT_PRESET","SHELL_GRADIENT_RECIPES","cool","opacity","stops","color","position","neutral","warm","fresh","GRADIENT_GEOMETRY","shellGradientPresetRecipe","preset","normalized","normalizeShellGradientPreset","shellGradientPresetOpacity","String","isShellGradientPreset","value","includes","buildShellRadialGradientForPreset","buildShellRadialGradientFromStops","serialized","map","stop","join","SHELL_GRADIENT_IMAGE_VAR","SHELL_GRADIENT_SIZE_VAR","SHELL_GRADIENT_POSITION_PANEL_VAR","SHELL_GRADIENT_POSITION_BAR_VAR","SHELL_GRADIENT_OPACITY_VAR","buildShellRadialGradient","readShellViewportDimensions","win","w","globalThis","window","undefined","width","height","visual","visualViewport","Math","round","innerWidth","innerHeight","shellGradientSize","layout","shellGradientPositionPanel","shellGradientPositionBar","panelWidth","TOOL_SHORTCUT_KEYS","k","a","s","m","n","isBareShellShortcutKey","e","metaKey","ctrlKey","altKey","shiftKey","isEditableShortcutTarget","target","closest","el","editable","role","getAttribute","Boolean","isContentEditable","normalizedShortcutKey","key","code","length","toLowerCase","resolveShellShortcut","toolId","readCssVarWidthPx","context","cssVarName","document","probe","createElement","style","cssText","appendChild","getBoundingClientRect","removeChild","readPanelNavWidthTokens","navRoot","expandedPx","collapsedPx","isPanelNavCollapsed","panelNavHost","classList","contains","collapsedProp","collapsed","panelWidthPxFromTokens","tokens","shellAppCss","ShellApp","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","composition","navigation","pageChrome","tools","navStyle","gradientPreset","shortcutsEnabled","mobileDestination","mobileSheetNavOpen","toolsFullscreen","resolvedMode","managedToolsOpen","managedToolsClosing","managedActiveTool","managedToolPresentation","managedMobileDestination","managedMobileSheetNavOpen","managedInboxTool","managedBrowseContext","resizeObserver","hasLoaded","foregroundRefreshTimer","panelNavTransition","ChromeTransitionDepth","chromeSyncCoalescer","createRafCoalescer","syncChrome","panelWidthTokens","cachedViewportWidth","cachedViewportHeight","onWindowResize","updateResponsiveMode","isActive","scheduleChromeSync","onVisualViewportChange","onChromeTransitionStart","event","source","readChromeTransitionSource","readChromeTransitionPhase","enter","viewport","onChromeTransitionEnd","exit","onDocumentVisibilityChange","hidden","refreshAfterForegroundRestore","onPageShow","persisted","handleManagedNavSelect","stopPropagation","dsNavSelect","emit","detail","handleManagedTabChange","dsTabChange","handleManagedPageBack","dsPageBack","handleManagedBreadcrumbSelect","forwarded","dsBreadcrumbSelect","defaultPrevented","preventDefault","handleManagedSubsectionChange","dsSubsectionChange","handleManagedPageAction","dsPageAction","handleManagedToolChange","id","selected","item","resolvedToolItems","find","candidate","isShellInboxTool","shellMobileDestinationForTool","dsToolChange","handleManagedPresentationChange","presentation","dsPresentationChange","handleManagedHeaderBack","dsHeaderBack","handleManagedHeaderAction","dsHeaderAction","handleManagedSheetToggle","handleManagedMobileDestination","destination","canonicalId","resolveAvailableInboxTool","availableInboxTools","isInactive","handleManagedAreaSelect","handleManagedBrowseContext","dsBrowseContextChange","handleManagedSheetClose","handleManagedNavFooterAction","dsNavFooterAction","handleManagedNavUserAction","dsNavUserAction","managed","effectiveMobileDestination","effectiveMobileSheetNavOpen","resolvedNavigationGroups","groups","settingsGroups","dashboardGroups","items","PANEL_TOOLS_DEFAULT_ITEMS","filter","componentWillLoad","resolveShellResponsiveMode","browseContext","componentDidLoad","syncSlottedNavStyle","syncSlottedMobileState","connectMetricsObserver","connectViewportListeners","connectPageLifecycleListeners","addEventListener","CHROME_TRANSITION_START","CHROME_TRANSITION_END","requestAnimationFrame","cachePanelWidthTokens","querySelector","handleToolsPresentation","disconnectedCallback","disconnect","disconnectViewportListeners","disconnectPageLifecycleListeners","cancelForegroundRefresh","cancel","removeEventListener","onShellPropsChange","handleNavigationChange","handleToolsChange","some","onMobileStateChange","_next","previous","bar","activeElement","focusDestination","next","dsResponsiveModeChange","mode","schedule","panel","setAttribute","sheetNav","responsiveMode","activeDestination","sheetNavExpanded","open","ResizeObserver","observe","panelWrap","passive","clearTimeout","remove","add","setTimeout","offsetHeight","FOREGROUND_REFRESH_MS","applyGradientVars","vars","name","Object","entries","removeProperty","setProperty","clearGradientPaintVars","targets","keys","syncChromeLayoutVars","panelPosition","barPosition","resolvePanelWidthPx","panelNav","measured","resolveViewportDimensions","chromeLayerActive","handleWindowKeyDown","action","toggleCollapsed","closeDrawer","startsWith","slice","activateTool","closeGlobalSurface","setToolPresentation","currentArea","flatMap","group","activeId","deriveActiveIdFromUrl","currentUrl","icon","label","heading","toolDot","dot","clearLayoutVars","image","size","isBar","tagName","renderManagedPanelNav","h","breakpoint","SHELL_DESKTOP_BREAKPOINT","routerMode","storageKey","userName","userInitial","accountMenuExpanded","dashboardLabel","settingsLabel","accountLabel","dashboardNavigationLabel","settingsNavigationLabel","navigationItemsLabel","navigationLabel","onDsNavSelect","onDsNavFooterAction","onDsNavUserAction","renderManagedBarNav","tabs","routeHeading","basePath","onDsTabChange","renderManagedToolSlots","ids","Set","sort","slot","renderManagedTools","activeTool","fullscreenHeaderMode","headers","toolsLabel","toolShortcutsLabel","inboxLabel","inboxNavigationLabel","onDsToolChange","onDsPresentationChange","onDsHeaderBack","onDsHeaderAction","renderManagedMobileSheetNav","onDsAreaSelect","onDsBrowseContextChange","onDsClose","renderManagedMobileBarNav","mobileBarHidden","searchLabel","ariaLabel","messagesLabel","agentsLabel","helpLabel","searchDot","inboxDot","messagesDot","agentsDot","onDsSheetNavToggle","onDsDestinationChange","renderManagedMobileLeading","showBack","backAriaLabel","side","variant","backIcon","activeFill","hasBorder","onDsClick","renderManagedMobileActions","actions","mobileActions","triggerId","haspopup","controls","expanded","pressed","renderManagedPage","page","mobileSections","barTitleSections","subsections","type","headerCapacity","resolveManagedShellPageCapacity","contentInset","contentInsetBlockStart","contentInsetBlockStartSize","compactContentInsetBlockStartSize","scrollCompaction","contentSurface","description","backLabel","breadcrumbs","breadcrumbAriaLabel","sections","subvalue","sectionsAriaLabel","subsectionsAriaLabel","primaryAction","actionsAriaLabel","showDivider","showHeaderDivider","showCompactDivider","showCompactHeaderDivider","onDsBack","onDsBreadcrumbSelect","onDsSectionChange","onDsAction","headingLevel","tone","onDsSubsectionChange","renderSlottedShell","shellCls","mobile","mobileToolActive","mobileStageBlocked","fullscreen","Host","class","inert","tabIndex","render","chromeActive"],"sources":["src/wc/shell/shell-gradient-presets.ts","src/wc/shell/shell-gradient.ts","src/wc/shell/shell-shortcuts.ts","src/wc/shell/shell-chrome-metrics.ts","src/wc/components/ShellApp/ShellApp.css?tag=ds-shell-app&encapsulation=scoped","src/wc/components/ShellApp/ShellApp.tsx"],"sourcesContent":["/** Built-in shell chrome wash presets. */\nexport type ShellGradientPreset = 'none' | 'cool' | 'neutral' | 'warm' | 'fresh';\n\nexport const SHELL_GRADIENT_PRESETS: ShellGradientPreset[] = [\n 'none',\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Wash presets shown after the `none` option in pickers. */\nexport const SHELL_GRADIENT_WASH_PRESETS: Exclude<ShellGradientPreset, 'none'>[] = [\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Default wash when `gradient-preset` is omitted. */\nexport const DEFAULT_SHELL_GRADIENT_PRESET: ShellGradientPreset = 'neutral';\n\nexport const SHELL_GRADIENT_PRESET_LABELS: Record<ShellGradientPreset, string> = {\n none: 'None',\n cool: 'Cool',\n neutral: 'Neutral',\n warm: 'Warm',\n fresh: 'Fresh',\n};\n\nexport interface ShellGradientStop {\n color: string;\n position: number;\n}\n\nexport interface ShellGradientRecipe {\n opacity: number;\n stops: readonly ShellGradientStop[];\n}\n\nexport interface ShellGradientPickerPreview {\n backgroundColor: string;\n backgroundImage?: string;\n opacity?: number;\n}\n\nexport interface ShellGradientPickerOption {\n value: ShellGradientPreset;\n label: string;\n preview: ShellGradientPickerPreview;\n}\n\nexport interface ShellGradientPickerSection {\n options: ShellGradientPickerOption[];\n}\n\nconst SHELL_GRADIENT_RECIPES: Record<Exclude<ShellGradientPreset, 'none'>, ShellGradientRecipe> = {\n cool: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-blue-strong-background)', position: 100 },\n ],\n },\n neutral: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-grey-strong-background)', position: 100 },\n ],\n },\n warm: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-yellow-strong-background)', position: 100 },\n ],\n },\n fresh: {\n opacity: 0.4,\n stops: [\n { color: 'var(--color-color-intent-cyan-faint-background)', position: 0 },\n { color: 'var(--color-background-transparent)', position: 47 },\n { color: 'var(--color-background-transparent)', position: 58 },\n { color: 'var(--color-color-intent-red-faint-background)', position: 83 },\n { color: 'var(--color-color-intent-pink-faint-background)', position: 100 },\n ],\n },\n};\n\nconst GRADIENT_GEOMETRY = '100% 100% at 0% 0%';\n\nexport function shellGradientPresetStopToken(preset: ShellGradientPreset): string | null {\n if (preset === 'none') return null;\n const stops = SHELL_GRADIENT_RECIPES[preset].stops;\n return stops[stops.length - 1]?.color ?? null;\n}\n\nexport function shellGradientPresetRecipe(preset: ShellGradientPreset): ShellGradientRecipe | null {\n const normalized = normalizeShellGradientPreset(preset);\n return normalized === 'none' ? null : SHELL_GRADIENT_RECIPES[normalized];\n}\n\nexport function shellGradientPresetOpacity(preset: ShellGradientPreset): string {\n return String(shellGradientPresetRecipe(preset)?.opacity ?? 0);\n}\n\nexport function isShellGradientPreset(value: string): value is ShellGradientPreset {\n return (SHELL_GRADIENT_PRESETS as string[]).includes(value);\n}\n\n/**\n * Coerce unknown/absent presets to the default. Runtime values escape the\n * type: removing the reflected `gradient-preset` attribute (e.g. an Angular\n * `[attr.gradient-preset]=\"null\"` binding) drives the prop to null past its\n * field default — without normalization the stop lookup interpolates the\n * literal string \"undefined\" into CSS and the wash silently disappears.\n */\nexport function normalizeShellGradientPreset(\n value: string | null | undefined,\n): ShellGradientPreset {\n return value != null && isShellGradientPreset(value) ? value : DEFAULT_SHELL_GRADIENT_PRESET;\n}\n\n/** Radial wash for a preset — transparent at top-left into the intent stop. `none` returns no image. */\nexport function buildShellRadialGradientForPreset(preset: ShellGradientPreset): string {\n const normalized = normalizeShellGradientPreset(preset);\n if (normalized === 'none') return 'none';\n\n return buildShellRadialGradientFromStops(SHELL_GRADIENT_RECIPES[normalized].stops);\n}\n\n/** Build the production shell geometry from an ordered set of design-time stops. */\nexport function buildShellRadialGradientFromStops(stops: readonly ShellGradientStop[]): string {\n const serialized = stops.map(stop => `${stop.color} ${stop.position}%`).join(', ');\n return `radial-gradient(${GRADIENT_GEOMETRY}, ${serialized})`;\n}\n\n/** Generic SwatchPicker sections for the fixed shell appearance presets. */\nexport function shellGradientPickerSections(): ShellGradientPickerSection[] {\n return [\n {\n options: [{\n value: 'none',\n label: SHELL_GRADIENT_PRESET_LABELS.none,\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n },\n }],\n },\n {\n options: SHELL_GRADIENT_WASH_PRESETS.map(preset => ({\n value: preset,\n label: SHELL_GRADIENT_PRESET_LABELS[preset],\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n backgroundImage: buildShellRadialGradientForPreset(preset),\n opacity: Number(shellGradientPresetOpacity(preset)),\n },\n })),\n },\n ];\n}\n","/** CSS var names consumed by `ds-panel-nav` / `ds-bar-nav` inside `ds-shell-app`. */\nimport type { ShellGradientPreset } from './shell-gradient-presets';\nimport {\n DEFAULT_SHELL_GRADIENT_PRESET,\n buildShellRadialGradientForPreset,\n normalizeShellGradientPreset,\n} from './shell-gradient-presets';\n\nexport type { ShellGradientPreset } from './shell-gradient-presets';\nexport {\n DEFAULT_SHELL_GRADIENT_PRESET,\n SHELL_GRADIENT_PRESETS,\n SHELL_GRADIENT_PRESET_LABELS,\n buildShellRadialGradientForPreset,\n buildShellRadialGradientFromStops,\n isShellGradientPreset,\n shellGradientPresetOpacity,\n shellGradientPresetRecipe,\n shellGradientPresetStopToken,\n} from './shell-gradient-presets';\n\nexport const SHELL_GRADIENT_IMAGE_VAR = '--ds-shell-gradient-image';\nexport const SHELL_GRADIENT_SIZE_VAR = '--ds-shell-gradient-size';\nexport const SHELL_GRADIENT_POSITION_PANEL_VAR = '--ds-shell-gradient-position-panel';\nexport const SHELL_GRADIENT_POSITION_BAR_VAR = '--ds-shell-gradient-position-bar';\nexport const SHELL_GRADIENT_OPACITY_VAR = '--ds-shell-gradient-opacity';\n/** Per chrome-surface background-position — offsets wash + grid to shell row origin. */\nexport const SHELL_CHROME_SURFACE_POSITION_VAR = '--ds-shell-chrome-surface-position';\n\n/** Whether the shared chrome layer (secondary bg + optional wash) should mount. */\nexport function shellChromeLayerActive(preset: ShellGradientPreset): boolean {\n return normalizeShellGradientPreset(preset) !== 'none';\n}\n\n/**\n * Shell radial wash — same for panel and bar nav.\n * Tokens follow `data-theme` (light/dark intent stops).\n */\nexport function buildShellRadialGradient(\n preset: ShellGradientPreset = DEFAULT_SHELL_GRADIENT_PRESET,\n): string {\n return buildShellRadialGradientForPreset(preset);\n}\n\n/** Built-in radial image for the selected shell preset. */\nexport function shellGradientImage(\n preset: ShellGradientPreset = DEFAULT_SHELL_GRADIENT_PRESET,\n): string {\n return buildShellRadialGradient(preset);\n}\n\nexport interface ShellViewportDimensions {\n width: number;\n height: number;\n}\n\n/**\n * Viewport size for shell chrome with `background-attachment: fixed`.\n * Must not use the `ds-shell-app` element box — the shell can be shorter or\n * taller than the viewport when host height chains break or content overflows.\n */\nexport function readShellViewportDimensions(win?: Window): ShellViewportDimensions {\n const w = win ?? (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n if (!w) return { width: 0, height: 0 };\n\n const visual = w.visualViewport;\n return {\n width: Math.round(visual?.width ?? w.innerWidth),\n height: Math.round(visual?.height ?? w.innerHeight),\n };\n}\n\nexport interface ShellGradientLayout {\n width: number;\n height: number;\n panelWidth: number;\n}\n\n/** Pixel `background-size` for the fixed-attachment radial wash. */\nexport function shellGradientSize(layout: Pick<ShellGradientLayout, 'width' | 'height'>): string {\n return `${Math.round(layout.width)}px ${Math.round(layout.height)}px`;\n}\n\nexport function shellGradientPositionPanel(): string {\n return '0 0';\n}\n\nexport function shellGradientPositionBar(panelWidth: number): string {\n return `${-Math.round(panelWidth)}px 0`;\n}\n\n/** Phase-lock a chrome rect to the shell row coordinate system (wash + grid). */\nexport function shellChromeSurfacePosition(leftPx: number, topPx: number): string {\n return `${-Math.round(leftPx)}px ${-Math.round(topPx)}px`;\n}\n","import type { PanelToolsToolId } from '../components/PanelTools/panel-tools-types';\n\nexport type ShellShortcutAction =\n | 'toggle-panel-nav'\n | 'close-panel-tools'\n | `open-tool:${PanelToolsToolId}`;\n\nconst TOOL_SHORTCUT_KEYS: Record<string, PanelToolsToolId> = {\n k: 'search',\n a: 'agents',\n s: 'stacks',\n m: 'messages',\n n: 'activity',\n '/': 'help',\n};\n\n/** Tool shortcut keys (K, A, S, M, N, /) toggle open/closed via `ds-panel-tools.activateTool`. */\n\n/** True when no modifier keys are held — avoids browser/app chords like ⌘N. */\nexport function isBareShellShortcutKey(\n e: Pick<KeyboardEvent, 'metaKey' | 'ctrlKey' | 'altKey' | 'shiftKey'>,\n): boolean {\n return !e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey;\n}\n\n/** Skip shell shortcuts while typing in an editable control. */\nexport function isEditableShortcutTarget(target: EventTarget | null): boolean {\n if (!target || typeof target !== 'object') return false;\n if (!('closest' in target) || typeof target.closest !== 'function') return false;\n\n const el = target as Element & { isContentEditable?: boolean };\n\n const editable = el.closest(\n 'input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"], [contenteditable=\"plaintext-only\"]',\n );\n if (editable) return true;\n\n const role = el.getAttribute('role');\n if (role === 'textbox' || role === 'combobox' || role === 'searchbox') return true;\n\n return Boolean(el.isContentEditable);\n}\n\nfunction normalizedShortcutKey(e: Pick<KeyboardEvent, 'key' | 'code'>): string {\n if (e.key === '[' || e.code === 'BracketLeft') return '[';\n if (e.key === ']' || e.code === 'BracketRight') return ']';\n return e.key.length === 1 ? e.key.toLowerCase() : e.key.toLowerCase();\n}\n\n/** Resolve a shell chrome shortcut, or `null` when the key is not handled. */\nexport function resolveShellShortcut(\n e: Pick<KeyboardEvent, 'key' | 'code' | 'metaKey' | 'ctrlKey' | 'altKey' | 'shiftKey'>,\n): ShellShortcutAction | null {\n if (!isBareShellShortcutKey(e)) return null;\n\n const key = normalizedShortcutKey(e);\n if (key === '[') return 'toggle-panel-nav';\n if (key === ']') return 'close-panel-tools';\n\n const toolId = TOOL_SHORTCUT_KEYS[key];\n if (toolId) return `open-tool:${toolId}`;\n\n return null;\n}\n","import { shellGradientPositionBar } from './shell-gradient';\n\n/** Read a `var(--token)` width in px using a hidden probe (works with calc() tokens). */\nexport function readCssVarWidthPx(context: HTMLElement, cssVarName: string): number {\n if (typeof document === 'undefined') return 0;\n\n const probe = document.createElement('div');\n probe.style.cssText =\n 'position:absolute;visibility:hidden;pointer-events:none;height:0;width:var(' +\n cssVarName +\n ');';\n context.appendChild(probe);\n const width = probe.getBoundingClientRect().width;\n context.removeChild(probe);\n return width;\n}\n\nexport interface PanelNavWidthTokens {\n expandedPx: number;\n collapsedPx: number;\n}\n\n/** Resolve panel-nav expanded/collapsed widths from scoped CSS vars on `.panel-nav`. */\nexport function readPanelNavWidthTokens(navRoot: HTMLElement): PanelNavWidthTokens {\n return {\n expandedPx: readCssVarWidthPx(navRoot, '--_nav-width'),\n collapsedPx: readCssVarWidthPx(navRoot, '--_nav-width-collapsed'),\n };\n}\n\nexport function isPanelNavCollapsed(\n panelNavHost: HTMLElement | null,\n navRoot: HTMLElement | null,\n): boolean {\n if (navRoot?.classList.contains('panel-nav--collapsed')) return true;\n const collapsedProp = (panelNavHost as (HTMLElement & { collapsed?: boolean }) | null)?.collapsed;\n return collapsedProp === true;\n}\n\nexport function panelWidthPxFromTokens(\n tokens: PanelNavWidthTokens,\n collapsed: boolean,\n): number {\n return collapsed ? tokens.collapsedPx : tokens.expandedPx;\n}\n\nexport function barGradientPositionFromPanelWidth(panelWidthPx: number): string {\n return shellGradientPositionBar(panelWidthPx);\n}\n","@import '../../utils/focus-ring.css';\n\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n overscroll-behavior: none;\n font-family: var(--typography-font-family-ui, system-ui);\n --ds-shell-panel-tools-width: var(--dimension-panel-width-xs);\n}\n\n:host {\n --_shell-chrome-bg: var(--color-background-secondary);\n}\n\n.shell-app__row {\n display: flex;\n flex: 1 1 0;\n min-height: 0;\n position: relative;\n}\n\n.shell-app__banner {\n flex: 0 0 auto;\n min-width: 0;\n position: relative;\n z-index: 5;\n}\n\n.shell-app__banner ::slotted(ds-banner) {\n display: grid;\n width: 100%;\n}\n\n/*\n * One chrome layer behind the shell row. Wash uses background-attachment: fixed\n * so the pattern is locked to the viewport — panel/tools collapse only changes the\n * transparent window, not the pattern phase. JS sets wash background-size from\n * readShellViewportDimensions(), not the shell element box.\n */\n.shell-app__chrome {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n background-color: var(--_shell-chrome-bg);\n}\n\n:host(.shell-app--gradient) .shell-app__chrome::before {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-position: 0 0;\n background-attachment: fixed;\n z-index: 1;\n opacity: var(--ds-shell-gradient-opacity, 1);\n background-image: var(--ds-shell-gradient-image, none);\n background-size: var(--ds-shell-gradient-size, auto);\n background-repeat: no-repeat;\n}\n\n.shell-app__panel {\n flex: 0 0 auto;\n min-height: 0;\n height: 100%;\n position: relative;\n /* Above main so resize handle line can paint over the workspace edge */\n z-index: 2;\n}\n\n.shell-app__panel ::slotted(ds-panel-nav) {\n display: block;\n height: 100%;\n}\n\n.shell-app__panel > ds-panel-nav {\n display: block;\n height: 100%;\n}\n\n.shell-app__main {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr);\n grid-template-areas:\n 'bar tools'\n 'content tools';\n position: relative;\n z-index: 1;\n}\n\n.shell-app__mobile-sheet-nav,\n.shell-app__mobile-bar-nav {\n display: none;\n}\n\n.shell-app__bar {\n grid-area: bar;\n flex: 0 0 auto;\n min-width: 0;\n}\n\n.shell-app__bar ::slotted(ds-bar-nav) {\n display: block;\n}\n\n.shell-app__bar > ds-bar-nav {\n display: block;\n}\n\n.shell-app__content {\n grid-area: content;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: none;\n /* Limit reflow to the page column — not on __main (breaks tools flex shrink). */\n contain: layout;\n}\n\n/* Opaque page surface — masks the fixed chrome layer in the content column. */\n.shell-app__content {\n position: relative;\n z-index: 1;\n background-color: var(--color-background-primary);\n}\n\n.shell-app__tools {\n grid-area: tools;\n flex: 0 0 auto;\n min-width: 0;\n min-height: 0;\n height: 100%;\n display: flex;\n position: relative;\n z-index: 0;\n overflow: hidden;\n}\n\n.shell-app__tools ::slotted(ds-panel-tools) {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.shell-app__tools ::slotted(ds-shell-tools) {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.shell-app__tools > ds-shell-tools {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.shell-app__content > ds-shell-page {\n display: block;\n min-height: 100%;\n}\n\n:host(.shell-app--tools-fullscreen) .shell-app__panel,\n:host(.shell-app--tools-fullscreen) .shell-app__bar,\n:host(.shell-app--tools-fullscreen) .shell-app__content {\n visibility: hidden;\n}\n\n:host(.shell-app--mobile) {\n --_shell-chrome-bg: var(--color-background-primary);\n padding-block-start: env(safe-area-inset-top);\n}\n\n/* Refresh the Mobile WebKit stage layer without remounting app content. */\n:host(.shell-app--mobile.shell-app--foreground-refresh) .shell-app__main {\n transform: translateZ(0);\n}\n\n:host(.shell-app--mobile) .shell-app__chrome,\n:host(.shell-app--mobile) .shell-app__panel,\n:host(.shell-app--mobile) .shell-app__bar {\n display: none;\n}\n\n:host(.shell-app--mobile) .shell-app__main {\n width: 100%;\n box-sizing: border-box;\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: minmax(0, 1fr) auto;\n grid-template-areas:\n 'stage'\n 'mobile-bar-nav';\n background: var(--color-background-primary);\n}\n\n:host(.shell-app--mobile) .shell-app__content,\n:host(.shell-app--mobile) .shell-app__tools,\n:host(.shell-app--mobile) .shell-app__mobile-sheet-nav {\n grid-area: stage;\n min-width: 0;\n min-height: 0;\n height: 100%;\n position: relative;\n}\n\n:host(.shell-app--mobile) .shell-app__content {\n z-index: 1;\n overflow: auto;\n}\n\n:host(.shell-app--mobile) .shell-app__tools {\n z-index: 2;\n width: 100%;\n overflow: hidden;\n background: var(--color-background-primary);\n}\n\n:host(.shell-app--mobile) .shell-app__mobile-sheet-nav {\n display: block;\n z-index: 3;\n overflow: hidden;\n background: var(--color-background-primary);\n}\n\n:host(.shell-app--mobile) .shell-app__mobile-bar-nav {\n grid-area: mobile-bar-nav;\n display: block;\n min-width: 0;\n position: relative;\n z-index: 4;\n}\n\n:host(.shell-app--mobile) .shell-app__tools[hidden],\n:host(.shell-app--mobile) .shell-app__mobile-sheet-nav[hidden],\n:host(.shell-app--mobile) .shell-app__mobile-bar-nav[hidden] {\n display: none;\n}\n\n:host(.shell-app--mobile-tool-active) .shell-app__content,\n:host(.shell-app--mobile-sheet-nav-open) .shell-app__content,\n:host(.shell-app--mobile-sheet-nav-open) .shell-app__tools {\n visibility: hidden;\n}\n","import {\n Component,\n Prop,\n Element,\n Event,\n EventEmitter,\n State,\n Watch,\n Listen,\n Method,\n h,\n Host,\n} from '@stencil/core';\nimport type { NavChromeStyle } from '../../shell/nav-chrome';\nimport {\n isEditableShortcutTarget,\n resolveShellShortcut,\n} from '../../shell/shell-shortcuts';\nimport type {\n PanelToolsToolId,\n PanelToolsHeaderAction,\n} from '../PanelTools/panel-tools-types';\nimport { PANEL_TOOLS_DEFAULT_ITEMS } from '../PanelTools/panel-tools-types';\nimport type { BarTitleSectionItem } from '../BarTitle/bar-title-types';\nimport type { BreadcrumbSelectDetail } from '../Breadcrumb/breadcrumb-types';\nimport {\n DEFAULT_SHELL_GRADIENT_PRESET,\n normalizeShellGradientPreset,\n type ShellGradientPreset,\n} from '../../shell/shell-gradient-presets';\nimport {\n CHROME_TRANSITION_END,\n CHROME_TRANSITION_START,\n ChromeTransitionDepth,\n createRafCoalescer,\n readChromeTransitionPhase,\n readChromeTransitionSource,\n} from '../../shell/chrome-transition';\nimport {\n isPanelNavCollapsed,\n panelWidthPxFromTokens,\n readPanelNavWidthTokens,\n type PanelNavWidthTokens,\n} from '../../shell/shell-chrome-metrics';\nimport {\n SHELL_GRADIENT_IMAGE_VAR,\n SHELL_GRADIENT_OPACITY_VAR,\n SHELL_GRADIENT_POSITION_BAR_VAR,\n SHELL_GRADIENT_POSITION_PANEL_VAR,\n SHELL_GRADIENT_SIZE_VAR,\n buildShellRadialGradient,\n readShellViewportDimensions,\n shellGradientPositionBar,\n shellGradientPositionPanel,\n shellGradientPresetOpacity,\n shellGradientSize,\n} from '../../shell/shell-gradient';\nimport {\n isShellInboxTool,\n resolveAvailableInboxTool,\n resolveManagedShellPageCapacity,\n resolveShellResponsiveMode,\n SHELL_DESKTOP_BREAKPOINT,\n shellMobileDestinationForTool,\n type MobileDestination,\n type ShellInboxToolId,\n type ShellResponsiveMode,\n} from '../../shell/shell-responsive';\nimport { deriveActiveIdFromUrl } from '../PanelNav/panel-nav-utils';\nimport type { PanelNavItem } from '../PanelNav/panel-nav-types';\nimport type { PanelNavUserActionDetail } from '../PanelNav/panel-nav-types';\nimport type { MobileBarNavDestinationDetail } from '../MobileBarNav/mobile-bar-nav-types';\nimport type {\n ShellAppComposition,\n ShellNavigationConfig,\n ShellPageChromeConfig,\n ShellToolsConfig,\n} from './shell-app-types';\n\n@Component({\n tag: 'ds-shell-app',\n styleUrl: 'ShellApp.css',\n scoped: true,\n})\nexport class ShellApp {\n private static readonly FOREGROUND_REFRESH_MS = 50;\n\n /** Managed renders the complete responsive chrome; slotted exposes the advanced composition. */\n @Prop({ reflect: true }) composition: ShellAppComposition = 'managed';\n\n /** Router-owned navigation data used by managed composition. */\n @Prop() navigation: ShellNavigationConfig = {};\n\n /** Route-owned page title and section data used by managed composition. */\n @Prop({ attribute: 'page-chrome' }) pageChrome: ShellPageChromeConfig = {};\n\n /** Product-owned global tool definitions used by managed composition. */\n @Prop() tools: ShellToolsConfig = {};\n\n /** Chrome style propagated to slotted `ds-panel-nav` and `ds-bar-nav`. */\n @Prop({ attribute: 'nav-style', reflect: true }) navStyle: NavChromeStyle = 'dashboard';\n\n /**\n * Shell chrome wash preset. `none` renders solid chrome; the remaining\n * presets use token-based washes that adapt to the active color theme.\n */\n @Prop({ attribute: 'gradient-preset', reflect: true }) gradientPreset: ShellGradientPreset =\n DEFAULT_SHELL_GRADIENT_PRESET;\n\n /** When `true` (default), registers global shell keyboard shortcuts. `[` toggles panel nav; `]` closes tools; K, A, S, M, N, and / toggle tool drawers. Modifiers are ignored so browser chords like ⌘N stay native. */\n @Prop({ attribute: 'shortcuts-enabled' }) shortcutsEnabled: boolean = true;\n\n /** Controlled mobile surface shown above the persistent bottom bar. */\n @Prop({ attribute: 'mobile-destination' })\n mobileDestination: MobileDestination = 'area';\n\n /** Controlled full-stage Mobile Sheet Nav state. */\n @Prop({ attribute: 'mobile-sheet-nav-open' })\n mobileSheetNavOpen: boolean = false;\n\n /** Emitted after crossing the fixed 768px or 1200px shell boundaries. */\n @Event() dsResponsiveModeChange!: EventEmitter<{ mode: ShellResponsiveMode }>;\n\n /** Managed primary-navigation intent; the application router performs navigation. */\n @Event() dsNavSelect!: EventEmitter<string>;\n\n /** Managed desktop BarNav or mobile section-selection intent. */\n @Event() dsTabChange!: EventEmitter<string>;\n\n /** Managed page-subsection intent from BarTitle or MobileHeader. */\n @Event() dsSubsectionChange!: EventEmitter<string>;\n\n /** Managed page-level Back intent. */\n @Event() dsPageBack!: EventEmitter<MouseEvent>;\n\n /** Managed breadcrumb intent from BarTitle. */\n @Event({ cancelable: true })\n dsBreadcrumbSelect!: EventEmitter<BreadcrumbSelectDetail>;\n\n /** Managed page action intent from BarTitle. */\n @Event() dsPageAction!: EventEmitter<string>;\n\n /** Managed tools selection state. */\n @Event() dsToolChange!: EventEmitter<{ id: PanelToolsToolId; selected: boolean }>;\n\n /** Managed tool-header Back intent. */\n @Event() dsHeaderBack!: EventEmitter<{ tool: PanelToolsToolId }>;\n\n /** Managed tool-header action intent. */\n @Event() dsHeaderAction!: EventEmitter<{ tool: PanelToolsToolId; id: string }>;\n\n /** Managed drawer/fullscreen presentation state. */\n @Event() dsPresentationChange!: EventEmitter<{ presentation: 'drawer' | 'fullscreen' }>;\n\n /** Managed mobile Dashboard/Settings browsing intent. */\n @Event() dsBrowseContextChange!: EventEmitter<NavChromeStyle>;\n\n /** Managed account-footer action intent. */\n @Event() dsNavFooterAction!: EventEmitter<void>;\n\n /** Managed user/account trigger intent. */\n @Event() dsNavUserAction!: EventEmitter<PanelNavUserActionDetail>;\n\n @Element() el!: HTMLElement;\n @State() private toolsFullscreen = false;\n @State() private resolvedMode: ShellResponsiveMode = 'desktop';\n @State() private managedToolsOpen = false;\n /** Keep page capacity aligned with the drawer until its closing clip reaches zero. */\n @State() private managedToolsClosing = false;\n @State() private managedActiveTool: PanelToolsToolId | '' = '';\n @State() private managedToolPresentation: 'drawer' | 'fullscreen' = 'drawer';\n @State() private managedMobileDestination: MobileDestination = 'area';\n @State() private managedMobileSheetNavOpen = false;\n @State() private managedInboxTool: ShellInboxToolId | '' = '';\n @State() private managedBrowseContext: NavChromeStyle = 'dashboard';\n\n private resizeObserver: ResizeObserver | null = null;\n private hasLoaded = false;\n private foregroundRefreshTimer: number | null = null;\n private readonly panelNavTransition = new ChromeTransitionDepth();\n private readonly chromeSyncCoalescer = createRafCoalescer(() => this.syncChrome());\n private panelWidthTokens: PanelNavWidthTokens = { expandedPx: 0, collapsedPx: 0 };\n private cachedViewportWidth = 0;\n private cachedViewportHeight = 0;\n private onWindowResize = () => {\n this.updateResponsiveMode();\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n };\n private onVisualViewportChange = () => {\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n };\n\n private get managed(): boolean {\n return this.composition === 'managed';\n }\n\n private get effectiveMobileDestination(): MobileDestination {\n return this.managed ? this.managedMobileDestination : this.mobileDestination;\n }\n\n private get effectiveMobileSheetNavOpen(): boolean {\n return this.managed ? this.managedMobileSheetNavOpen : this.mobileSheetNavOpen;\n }\n\n private get resolvedNavigationGroups() {\n if (this.navigation.groups?.length) return this.navigation.groups;\n return this.managedBrowseContext === 'settings'\n ? (this.navigation.settingsGroups ?? [])\n : (this.navigation.dashboardGroups ?? []);\n }\n\n private get resolvedToolItems() {\n return this.tools.items ?? PANEL_TOOLS_DEFAULT_ITEMS;\n }\n\n private get availableInboxTools(): ShellInboxToolId[] {\n return this.resolvedToolItems\n .filter(\n item =>\n !item.isInactive &&\n (item.mobileDestination === 'inbox' || isShellInboxTool(item.id))\n )\n .map(item => item.id as ShellInboxToolId);\n }\n\n componentWillLoad() {\n if (typeof window !== 'undefined') {\n this.resolvedMode = resolveShellResponsiveMode(window.innerWidth);\n }\n this.managedBrowseContext = this.navigation.browseContext ?? this.navStyle;\n this.managedMobileDestination = this.mobileDestination;\n this.managedMobileSheetNavOpen = this.mobileSheetNavOpen;\n this.managedInboxTool = resolveAvailableInboxTool('', this.availableInboxTools);\n }\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.syncSlottedNavStyle();\n this.syncSlottedMobileState();\n this.connectMetricsObserver();\n this.connectViewportListeners();\n this.connectPageLifecycleListeners();\n this.el.addEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);\n this.el.addEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);\n requestAnimationFrame(() => {\n this.cachePanelWidthTokens();\n this.scheduleChromeSync();\n });\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools');\n this.toolsFullscreen = tools?.getAttribute('presentation') === 'fullscreen';\n }\n\n @Listen('dsPresentationChange')\n handleToolsPresentation(event: CustomEvent<{ presentation?: string }>) {\n this.toolsFullscreen = event.detail?.presentation === 'fullscreen';\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.disconnectViewportListeners();\n this.disconnectPageLifecycleListeners();\n this.cancelForegroundRefresh();\n this.chromeSyncCoalescer.cancel();\n this.el.removeEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);\n this.el.removeEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);\n }\n\n @Watch('navStyle')\n @Watch('gradientPreset')\n onShellPropsChange() {\n this.syncSlottedNavStyle();\n this.scheduleChromeSync();\n }\n\n @Watch('navigation')\n handleNavigationChange() {\n this.managedBrowseContext = this.navigation.browseContext ?? this.navStyle;\n }\n\n @Watch('tools')\n handleToolsChange() {\n if (\n this.managedActiveTool &&\n !this.resolvedToolItems.some(item => item.id === this.managedActiveTool)\n ) {\n this.managedToolsOpen = false;\n this.managedActiveTool = '';\n this.managedMobileDestination = 'area';\n }\n this.managedInboxTool = resolveAvailableInboxTool(\n this.managedInboxTool,\n this.availableInboxTools\n );\n }\n\n @Watch('mobileDestination')\n @Watch('mobileSheetNavOpen')\n onMobileStateChange(_next: unknown, previous: unknown) {\n if (this.managed) {\n this.managedMobileDestination = this.mobileDestination;\n this.managedMobileSheetNavOpen = this.mobileSheetNavOpen;\n }\n this.syncSlottedMobileState();\n if (\n previous === true &&\n !this.effectiveMobileSheetNavOpen &&\n this.resolvedMode === 'mobile'\n ) {\n requestAnimationFrame(() => {\n const bar = this.el.querySelector('ds-mobile-bar-nav') as\n | (HTMLElement & {\n focusDestination?: (\n destination: MobileDestination | 'sheet-nav'\n ) => Promise<void>;\n })\n | null;\n const activeElement = document.activeElement;\n if (activeElement instanceof HTMLElement && bar?.contains(activeElement)) return;\n void bar?.focusDestination?.('sheet-nav');\n });\n }\n }\n\n private updateResponsiveMode() {\n if (typeof window === 'undefined') return;\n const next = resolveShellResponsiveMode(window.innerWidth);\n if (next === this.resolvedMode) return;\n this.resolvedMode = next;\n this.syncSlottedMobileState();\n this.scheduleChromeSync();\n if (this.hasLoaded) this.dsResponsiveModeChange.emit({ mode: next });\n }\n\n private onChromeTransitionStart = (event: Event) => {\n const source = readChromeTransitionSource(event);\n if (source === 'panel-tools') {\n if (readChromeTransitionPhase(event) === 'closing') {\n this.managedToolsClosing = true;\n }\n return;\n }\n if (source !== 'panel-nav') return;\n\n this.panelNavTransition.enter();\n const viewport = readShellViewportDimensions();\n this.cachedViewportWidth = viewport.width;\n this.cachedViewportHeight = viewport.height;\n this.syncChrome();\n };\n\n private onChromeTransitionEnd = (event: Event) => {\n const source = readChromeTransitionSource(event);\n if (source === 'panel-tools') {\n this.managedToolsClosing = false;\n return;\n }\n if (source !== 'panel-nav') return;\n\n this.panelNavTransition.exit();\n if (!this.panelNavTransition.isActive) {\n this.scheduleChromeSync();\n }\n };\n\n /** Coalesce ResizeObserver bursts to one layout read per frame. */\n private scheduleChromeSync() {\n this.chromeSyncCoalescer.schedule();\n }\n\n private syncSlottedNavStyle() {\n const panel = this.el.querySelector('ds-panel-nav') as (HTMLElement & { navStyle: NavChromeStyle }) | null;\n const bar = this.el.querySelector('ds-bar-nav') as (HTMLElement & { navStyle: NavChromeStyle }) | null;\n if (panel) {\n panel.setAttribute('nav-style', this.navStyle);\n panel.navStyle = this.navStyle;\n }\n if (bar) {\n bar.setAttribute('nav-style', this.navStyle);\n bar.navStyle = this.navStyle;\n }\n }\n\n private syncSlottedMobileState() {\n const tools = this.el.querySelector('ds-shell-tools') as\n | (HTMLElement & { responsiveMode: ShellResponsiveMode })\n | null;\n const bar = this.el.querySelector('ds-mobile-bar-nav') as\n | (HTMLElement & {\n activeDestination: MobileDestination;\n sheetNavExpanded: boolean;\n })\n | null;\n const sheetNav = this.el.querySelector('ds-mobile-sheet-nav') as\n | (HTMLElement & { open: boolean })\n | null;\n\n if (tools) {\n tools.setAttribute('responsive-mode', this.resolvedMode);\n tools.responsiveMode = this.resolvedMode;\n }\n if (bar) {\n bar.activeDestination = this.effectiveMobileDestination;\n bar.sheetNavExpanded = this.effectiveMobileSheetNavOpen;\n }\n if (sheetNav) {\n sheetNav.open = this.effectiveMobileSheetNavOpen;\n }\n }\n\n private connectMetricsObserver() {\n this.resizeObserver = new ResizeObserver(() => {\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n });\n this.resizeObserver.observe(this.el);\n const panelWrap = this.el.querySelector('.shell-app__panel');\n if (panelWrap) this.resizeObserver.observe(panelWrap);\n }\n\n private connectViewportListeners() {\n if (typeof window === 'undefined') return;\n\n window.addEventListener('resize', this.onWindowResize, { passive: true });\n\n const visual = window.visualViewport;\n if (visual) {\n visual.addEventListener('resize', this.onVisualViewportChange, { passive: true });\n visual.addEventListener('scroll', this.onVisualViewportChange, { passive: true });\n }\n }\n\n private disconnectViewportListeners() {\n if (typeof window === 'undefined') return;\n\n window.removeEventListener('resize', this.onWindowResize);\n\n const visual = window.visualViewport;\n if (visual) {\n visual.removeEventListener('resize', this.onVisualViewportChange);\n visual.removeEventListener('scroll', this.onVisualViewportChange);\n }\n }\n\n private connectPageLifecycleListeners() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', this.onDocumentVisibilityChange);\n window.addEventListener('pageshow', this.onPageShow);\n }\n\n private disconnectPageLifecycleListeners() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.onDocumentVisibilityChange);\n window.removeEventListener('pageshow', this.onPageShow);\n }\n\n private onDocumentVisibilityChange = () => {\n if (!document.hidden) this.refreshAfterForegroundRestore();\n };\n\n private onPageShow = (event: PageTransitionEvent) => {\n if (event.persisted) this.refreshAfterForegroundRestore();\n };\n\n private cancelForegroundRefresh() {\n if (this.foregroundRefreshTimer !== null) {\n window.clearTimeout(this.foregroundRefreshTimer);\n this.foregroundRefreshTimer = null;\n }\n this.el.classList.remove('shell-app--foreground-refresh');\n }\n\n private refreshAfterForegroundRestore() {\n this.updateResponsiveMode();\n this.syncSlottedMobileState();\n this.scheduleChromeSync();\n\n if (this.resolvedMode !== 'mobile') return;\n\n /*\n * Mobile WebKit can restore a live, correctly sized DOM without repainting\n * its suspended shell layer. Re-promote the complete mobile stage for one\n * painted frame; routed and tool owners remain mounted and keep their state.\n */\n this.cancelForegroundRefresh();\n this.el.classList.add('shell-app--foreground-refresh');\n void this.el.offsetHeight;\n // A short timer spans a real compositor commit; resumed WebKit may coalesce\n // nested animation frames before presenting either one.\n this.foregroundRefreshTimer = window.setTimeout(() => {\n this.foregroundRefreshTimer = null;\n this.el.classList.remove('shell-app--foreground-refresh');\n // WebKit otherwise may keep presenting the retired composite layer.\n void this.el.querySelector<HTMLElement>('.shell-app__main')?.offsetHeight;\n }, ShellApp.FOREGROUND_REFRESH_MS);\n }\n\n private cachePanelWidthTokens() {\n const navRoot = this.el.querySelector('ds-panel-nav .panel-nav') as HTMLElement | null;\n if (!navRoot) return;\n this.panelWidthTokens = readPanelNavWidthTokens(navRoot);\n }\n\n private applyGradientVars(target: HTMLElement, vars: Record<string, string | null>) {\n const style = target.style;\n for (const [name, value] of Object.entries(vars)) {\n if (value === null) style.removeProperty(name);\n else style.setProperty(name, value);\n }\n }\n\n private clearGradientPaintVars(targets: HTMLElement[]) {\n const keys = [\n SHELL_GRADIENT_IMAGE_VAR,\n SHELL_GRADIENT_SIZE_VAR,\n SHELL_GRADIENT_OPACITY_VAR,\n ];\n for (const target of targets) {\n for (const key of keys) target.style.removeProperty(key);\n }\n }\n\n /** Panel/bar wash offsets for scroll fades and badge rings. */\n private syncChromeLayoutVars(\n panel: HTMLElement | null,\n bar: HTMLElement | null,\n panelPosition: string,\n barPosition: string,\n ) {\n if (panel) {\n panel.style.setProperty(SHELL_GRADIENT_POSITION_PANEL_VAR, panelPosition);\n }\n if (bar) {\n bar.style.setProperty(SHELL_GRADIENT_POSITION_BAR_VAR, barPosition);\n }\n }\n\n private resolvePanelWidthPx(panelNav: HTMLElement | null): number {\n const navRoot = panelNav?.querySelector('.panel-nav') as HTMLElement | null;\n\n if (this.panelNavTransition.isActive && this.panelWidthTokens.expandedPx > 0) {\n const collapsed = isPanelNavCollapsed(panelNav, navRoot);\n return panelWidthPxFromTokens(this.panelWidthTokens, collapsed);\n }\n\n const panelWrap = this.el.querySelector('.shell-app__panel') as HTMLElement | null;\n const measured = panelWrap?.getBoundingClientRect().width ?? 0;\n if (measured > 0) return measured;\n\n if (this.panelWidthTokens.expandedPx > 0) {\n const collapsed = isPanelNavCollapsed(panelNav, navRoot);\n return panelWidthPxFromTokens(this.panelWidthTokens, collapsed);\n }\n\n return 0;\n }\n\n /** Fixed-attachment wash/grid size — always the viewport, never the shell element box. */\n private resolveViewportDimensions(): { width: number; height: number } {\n if (this.panelNavTransition.isActive && this.cachedViewportWidth > 0) {\n return {\n width: this.cachedViewportWidth,\n height: this.cachedViewportHeight,\n };\n }\n\n return readShellViewportDimensions();\n }\n\n private chromeLayerActive(): boolean {\n return (\n this.resolvedMode !== 'mobile' &&\n normalizeShellGradientPreset(this.gradientPreset) !== 'none'\n );\n }\n\n @Listen('keydown', { target: 'window', capture: true })\n handleWindowKeyDown(e: KeyboardEvent) {\n if (!this.shortcutsEnabled) return;\n if (isEditableShortcutTarget(e.target)) return;\n\n const action = resolveShellShortcut(e);\n if (!action) return;\n\n e.preventDefault();\n\n const panel = this.el.querySelector('ds-panel-nav') as HTMLDsPanelNavElement | null;\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools') as\n | (HTMLElement & {\n closeDrawer?: () => Promise<void>;\n activateTool?: (id: PanelToolsToolId) => Promise<void>;\n })\n | null;\n\n if (action === 'toggle-panel-nav') {\n void panel?.toggleCollapsed();\n return;\n }\n\n if (action === 'close-panel-tools') {\n void tools?.closeDrawer?.();\n return;\n }\n\n if (action.startsWith('open-tool:') && tools) {\n const toolId = action.slice('open-tool:'.length) as PanelToolsToolId;\n void tools.activateTool?.(toolId);\n }\n }\n\n /** Open or toggle a managed global tool from application-owned UI. */\n @Method()\n async activateTool(id: PanelToolsToolId) {\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools') as\n | (HTMLElement & { activateTool?: (tool: PanelToolsToolId) => Promise<void> })\n | null;\n await tools?.activateTool?.(id);\n }\n\n /** Close whichever managed global surface is currently visible. */\n @Method()\n async closeGlobalSurface() {\n if (this.managedMobileSheetNavOpen) {\n this.managedMobileSheetNavOpen = false;\n return;\n }\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools') as\n | (HTMLElement & { closeDrawer?: () => Promise<void> })\n | null;\n await tools?.closeDrawer?.();\n }\n\n /** Request drawer or fullscreen presentation for the active managed tool. */\n @Method()\n async setToolPresentation(presentation: 'drawer' | 'fullscreen') {\n this.managedToolPresentation = presentation;\n this.toolsFullscreen = presentation === 'fullscreen';\n }\n\n private handleManagedNavSelect = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsNavSelect.emit(event.detail);\n };\n\n private handleManagedTabChange = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsTabChange.emit(event.detail);\n };\n\n private handleManagedPageBack = (event: CustomEvent<MouseEvent>) => {\n event.stopPropagation();\n this.dsPageBack.emit(event.detail);\n };\n\n private handleManagedBreadcrumbSelect = (\n event: CustomEvent<BreadcrumbSelectDetail>\n ) => {\n event.stopPropagation();\n const forwarded = this.dsBreadcrumbSelect.emit(event.detail);\n if (forwarded.defaultPrevented) event.preventDefault();\n };\n\n private handleManagedSubsectionChange = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsSubsectionChange.emit(event.detail);\n };\n\n private handleManagedPageAction = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsPageAction.emit(event.detail);\n };\n\n private handleManagedToolChange = (\n event: CustomEvent<{ id: PanelToolsToolId; selected: boolean }>\n ) => {\n event.stopPropagation();\n const { id, selected } = event.detail;\n this.managedActiveTool = id;\n this.managedToolsOpen = selected;\n const item = this.resolvedToolItems.find(candidate => candidate.id === id);\n if (item?.mobileDestination === 'inbox' || isShellInboxTool(id)) {\n this.managedInboxTool = id;\n }\n this.managedMobileDestination = selected\n ? (item?.mobileDestination ?? shellMobileDestinationForTool(true, id))\n : 'area';\n this.managedMobileSheetNavOpen = false;\n this.dsToolChange.emit(event.detail);\n };\n\n private handleManagedPresentationChange = (\n event: CustomEvent<{ presentation: 'drawer' | 'fullscreen' }>\n ) => {\n event.stopPropagation();\n this.managedToolPresentation = event.detail.presentation;\n this.toolsFullscreen = event.detail.presentation === 'fullscreen';\n this.dsPresentationChange.emit(event.detail);\n };\n\n private handleManagedHeaderBack = (event: CustomEvent<{ tool: PanelToolsToolId }>) => {\n event.stopPropagation();\n this.dsHeaderBack.emit(event.detail);\n };\n\n private handleManagedHeaderAction = (\n event: CustomEvent<{ tool: PanelToolsToolId; id: string }>\n ) => {\n event.stopPropagation();\n this.dsHeaderAction.emit(event.detail);\n };\n\n private handleManagedSheetToggle = (event: CustomEvent<boolean>) => {\n event.stopPropagation();\n this.managedMobileSheetNavOpen = event.detail;\n };\n\n private handleManagedMobileDestination = (\n event: CustomEvent<MobileBarNavDestinationDetail>\n ) => {\n event.stopPropagation();\n const destination = event.detail.destination;\n this.managedMobileSheetNavOpen = false;\n this.managedMobileDestination = destination;\n\n if (destination === 'area') {\n this.managedToolsOpen = false;\n return;\n }\n\n const canonicalId =\n destination === 'inbox'\n ? resolveAvailableInboxTool(this.managedInboxTool, this.availableInboxTools)\n : destination;\n if (!canonicalId) return;\n\n const item = this.resolvedToolItems.find(\n candidate =>\n candidate.id === canonicalId ||\n (destination !== 'inbox' && candidate.mobileDestination === destination)\n );\n if (!item || item.isInactive) return;\n const id = item.id;\n this.managedActiveTool = id;\n this.managedToolsOpen = true;\n if (isShellInboxTool(id)) this.managedInboxTool = id;\n this.dsToolChange.emit({ id: id as PanelToolsToolId, selected: true });\n };\n\n private handleManagedAreaSelect = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.managedMobileSheetNavOpen = false;\n this.managedMobileDestination = 'area';\n this.managedToolsOpen = false;\n this.dsNavSelect.emit(event.detail);\n };\n\n private handleManagedBrowseContext = (event: CustomEvent<NavChromeStyle>) => {\n event.stopPropagation();\n this.managedBrowseContext = event.detail;\n this.dsBrowseContextChange.emit(event.detail);\n };\n\n private handleManagedSheetClose = (event: CustomEvent<void>) => {\n event.stopPropagation();\n this.managedMobileSheetNavOpen = false;\n };\n\n private handleManagedNavFooterAction = (event: CustomEvent<void>) => {\n event.stopPropagation();\n this.dsNavFooterAction.emit();\n };\n\n private handleManagedNavUserAction = (\n event: CustomEvent<PanelNavUserActionDetail>\n ) => {\n event.stopPropagation();\n this.dsNavUserAction.emit(event.detail);\n };\n\n private get currentArea(): PanelNavItem {\n const groups = [\n ...(this.navigation.dashboardGroups ?? []),\n ...(this.navigation.settingsGroups ?? []),\n ...this.resolvedNavigationGroups,\n ];\n const items = groups.flatMap(group => group.items);\n const activeId =\n this.navigation.activeId ||\n deriveActiveIdFromUrl(\n this.navigation.currentUrl ?? this.pageChrome.currentUrl ?? '',\n items\n );\n return (\n items.find(item => item.id === activeId) ??\n items[0] ?? {\n id: 'area',\n icon: 'MapPage',\n label: this.pageChrome.heading || 'Area',\n }\n );\n }\n\n private toolDot(id: PanelToolsToolId): boolean {\n return this.resolvedToolItems.find(item => item.id === id)?.dot ?? false;\n }\n\n private syncChrome() {\n const panelNav = this.el.querySelector('ds-panel-nav') as HTMLElement | null;\n const bar = this.el.querySelector('ds-bar-nav') as HTMLElement | null;\n const targets = [this.el, panelNav, bar].filter((el): el is HTMLElement => el !== null);\n\n const clearLayoutVars = () => {\n if (panelNav) panelNav.style.removeProperty(SHELL_GRADIENT_POSITION_PANEL_VAR);\n if (bar) bar.style.removeProperty(SHELL_GRADIENT_POSITION_BAR_VAR);\n };\n\n const preset = normalizeShellGradientPreset(this.gradientPreset);\n if (preset === 'none' || this.resolvedMode === 'mobile') {\n this.clearGradientPaintVars(targets);\n clearLayoutVars();\n return;\n }\n\n const viewport = this.resolveViewportDimensions();\n const panelWidth = this.resolvePanelWidthPx(panelNav);\n\n const panelPosition = shellGradientPositionPanel();\n const barPosition = shellGradientPositionBar(panelWidth);\n\n this.syncChromeLayoutVars(panelNav, bar, panelPosition, barPosition);\n\n const image = buildShellRadialGradient(preset);\n\n const size = shellGradientSize({\n width: viewport.width,\n height: viewport.height,\n });\n const opacity = shellGradientPresetOpacity(preset);\n\n for (const target of targets) {\n if (target === this.el) {\n this.applyGradientVars(target, {\n [SHELL_GRADIENT_IMAGE_VAR]: image,\n [SHELL_GRADIENT_SIZE_VAR]: size,\n [SHELL_GRADIENT_POSITION_PANEL_VAR]: panelPosition,\n [SHELL_GRADIENT_POSITION_BAR_VAR]: barPosition,\n [SHELL_GRADIENT_OPACITY_VAR]: opacity,\n });\n continue;\n }\n\n const isBar = target.tagName.toLowerCase() === 'ds-bar-nav';\n this.applyGradientVars(target, {\n [SHELL_GRADIENT_IMAGE_VAR]: image,\n [SHELL_GRADIENT_SIZE_VAR]: size,\n [SHELL_GRADIENT_OPACITY_VAR]: opacity,\n [SHELL_GRADIENT_POSITION_PANEL_VAR]: isBar ? null : panelPosition,\n [SHELL_GRADIENT_POSITION_BAR_VAR]: isBar ? barPosition : null,\n });\n }\n }\n\n private renderManagedPanelNav() {\n const navigation = this.navigation;\n return (\n <ds-panel-nav\n navStyle={this.navStyle}\n groups={this.resolvedNavigationGroups}\n breakpoint={SHELL_DESKTOP_BREAKPOINT}\n routerMode={navigation.routerMode ?? 'event'}\n activeId={navigation.activeId ?? ''}\n currentUrl={navigation.currentUrl ?? this.pageChrome.currentUrl ?? ''}\n storageKey={navigation.storageKey ?? ''}\n userName={navigation.userName ?? ''}\n userInitial={navigation.userInitial ?? ''}\n accountMenuExpanded={navigation.accountMenuExpanded ?? false}\n dashboardLabel={navigation.dashboardLabel ?? 'Dashboard'}\n settingsLabel={navigation.settingsLabel ?? 'Settings'}\n accountLabel={navigation.accountLabel ?? 'Account'}\n dashboardNavigationLabel={\n navigation.dashboardNavigationLabel ?? 'Dashboard navigation'\n }\n settingsNavigationLabel={\n navigation.settingsNavigationLabel ?? 'Settings navigation'\n }\n navigationItemsLabel={navigation.navigationLabel ?? 'Navigation items'}\n onDsNavSelect={this.handleManagedNavSelect}\n onDsNavFooterAction={this.handleManagedNavFooterAction}\n onDsNavUserAction={this.handleManagedNavUserAction}\n />\n );\n }\n\n private renderManagedBarNav() {\n return (\n <ds-bar-nav\n navStyle={this.navStyle}\n tabs={this.pageChrome.tabs ?? []}\n value={this.pageChrome.value ?? ''}\n heading={this.pageChrome.routeHeading ?? this.pageChrome.heading}\n basePath={this.pageChrome.basePath ?? ''}\n currentUrl={this.pageChrome.currentUrl ?? this.navigation.currentUrl ?? ''}\n onDsTabChange={this.handleManagedTabChange}\n />\n );\n }\n\n private renderManagedToolSlots() {\n const ids = [...new Set(this.resolvedToolItems.map(item => item.id))].sort();\n return ids.flatMap(id => [\n <slot key={`tool:${id}`} name={id} slot={id} />,\n <slot key={`tool-view:${id}`} name={`${id}-view`} slot={`${id}-view`} />,\n ]);\n }\n\n private renderManagedTools() {\n const tools = this.tools;\n return (\n <ds-shell-tools\n responsiveMode={this.resolvedMode}\n open={this.managedToolsOpen}\n activeTool={this.managedActiveTool}\n presentation={this.managedToolPresentation}\n fullscreenHeaderMode={tools.fullscreenHeaderMode ?? 'shared'}\n items={this.resolvedToolItems}\n headers={tools.headers ?? {}}\n storageKey={tools.storageKey ?? ''}\n toolsLabel={tools.toolsLabel ?? 'Tools'}\n toolShortcutsLabel={tools.toolShortcutsLabel ?? 'Tool shortcuts'}\n inboxLabel={tools.inboxLabel ?? 'Inbox'}\n inboxNavigationLabel={tools.inboxNavigationLabel ?? 'Inbox sections'}\n onDsToolChange={this.handleManagedToolChange}\n onDsPresentationChange={this.handleManagedPresentationChange}\n onDsHeaderBack={this.handleManagedHeaderBack}\n onDsHeaderAction={this.handleManagedHeaderAction}\n >\n {this.renderManagedToolSlots()}\n </ds-shell-tools>\n );\n }\n\n private renderManagedMobileSheetNav() {\n const navigation = this.navigation;\n return (\n <ds-mobile-sheet-nav\n open={this.managedMobileSheetNavOpen}\n browseContext={this.managedBrowseContext}\n dashboardGroups={navigation.dashboardGroups ?? navigation.groups ?? []}\n settingsGroups={navigation.settingsGroups ?? []}\n currentUrl={navigation.currentUrl ?? this.pageChrome.currentUrl ?? ''}\n navigationLabel={navigation.navigationLabel ?? 'Application navigation'}\n dashboardLabel={navigation.dashboardLabel ?? 'Dashboard'}\n settingsLabel={navigation.settingsLabel ?? 'Settings'}\n accountLabel={navigation.accountLabel ?? 'Account'}\n onDsAreaSelect={this.handleManagedAreaSelect}\n onDsBrowseContextChange={this.handleManagedBrowseContext}\n onDsClose={this.handleManagedSheetClose}\n />\n );\n }\n\n private renderManagedMobileBarNav() {\n return (\n <ds-mobile-bar-nav\n hidden={this.tools.mobileBarHidden ?? false}\n activeDestination={this.managedMobileDestination}\n currentArea={this.currentArea}\n sheetNavExpanded={this.managedMobileSheetNavOpen}\n searchLabel={this.tools.items?.find(item => item.id === 'search')?.ariaLabel ?? 'Search'}\n inboxLabel={this.tools.inboxLabel ?? 'Inbox'}\n messagesLabel={this.tools.items?.find(item => item.id === 'messages')?.ariaLabel ?? 'Messages'}\n agentsLabel={this.tools.items?.find(item => item.id === 'agents')?.ariaLabel ?? 'Agents'}\n helpLabel={this.tools.items?.find(item => item.id === 'help')?.ariaLabel ?? 'Help & Support'}\n searchDot={this.toolDot('search')}\n inboxDot={\n this.toolDot('stacks') || this.toolDot('activity')\n }\n messagesDot={this.toolDot('messages')}\n agentsDot={this.toolDot('agents')}\n onDsSheetNavToggle={this.handleManagedSheetToggle}\n onDsDestinationChange={this.handleManagedMobileDestination}\n />\n );\n }\n\n private renderManagedMobileLeading() {\n if (!this.pageChrome.showBack) {\n return <slot name=\"page-header-leading\" slot=\"leading\" />;\n }\n return [\n <ds-tooltip\n slot=\"leading\"\n label={this.pageChrome.backAriaLabel ?? 'Back'}\n side=\"bottom\"\n size=\"sm\"\n >\n <ds-button-unfilled\n variant=\"icon\"\n icon={this.pageChrome.backIcon ?? 'ChevronLeft'}\n size=\"md\"\n aria-label={this.pageChrome.backAriaLabel ?? 'Back'}\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.dsPageBack.emit(event.detail)\n }\n />\n </ds-tooltip>,\n <slot name=\"page-header-leading\" slot=\"leading\" />,\n ];\n }\n\n private renderManagedMobileActions() {\n const actions = this.pageChrome.mobileActions ?? [];\n return [\n ...actions.map((action: PanelToolsHeaderAction) => (\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 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={() => this.dsPageAction.emit(action.id)}\n />\n </ds-tooltip>\n )),\n <slot name=\"page-header-trailing\" slot=\"trailing\" />,\n ];\n }\n\n private renderManagedPage() {\n const page = this.pageChrome;\n const mobileSections = page.showBack ? [] : (page.tabs ?? []);\n const barTitleSections: BarTitleSectionItem[] = (page.subsections ?? []).map(item =>\n 'type' in item\n ? { type: 'divider' }\n : {\n id: item.id,\n label: item.label,\n isInactive: item.isInactive,\n }\n );\n return (\n <ds-shell-page\n responsiveMode={this.resolvedMode}\n headerCapacity={resolveManagedShellPageCapacity(\n this.resolvedMode,\n this.managedToolsOpen || this.managedToolsClosing\n )}\n contentInset={page.contentInset ?? 'default'}\n contentInsetBlockStart={page.contentInsetBlockStart ?? 'default'}\n contentInsetBlockStartSize={page.contentInsetBlockStartSize}\n compactContentInsetBlockStartSize={page.compactContentInsetBlockStartSize}\n scrollCompaction={page.scrollCompaction ?? true}\n contentSurface={page.contentSurface ?? 'primary'}\n >\n <ds-bar-title\n slot=\"header\"\n heading={page.heading ?? ''}\n description={page.description ?? ''}\n showBack={page.showBack ?? false}\n backAriaLabel={page.backAriaLabel ?? 'Back'}\n backLabel={page.backLabel ?? 'Back'}\n breadcrumbs={page.breadcrumbs ?? []}\n breadcrumbAriaLabel={page.breadcrumbAriaLabel ?? 'Breadcrumb'}\n sections={barTitleSections}\n value={page.subvalue ?? ''}\n sectionsAriaLabel={page.subsectionsAriaLabel ?? 'Change page subsection'}\n primaryAction={page.primaryAction ?? null}\n actions={page.actions ?? []}\n actionsAriaLabel={page.actionsAriaLabel ?? 'More page actions'}\n showDivider={page.showHeaderDivider ?? true}\n showCompactDivider={page.showCompactHeaderDivider}\n onDsBack={this.handleManagedPageBack}\n onDsBreadcrumbSelect={this.handleManagedBreadcrumbSelect}\n onDsSectionChange={this.handleManagedSubsectionChange}\n onDsAction={this.handleManagedPageAction}\n />\n <ds-mobile-header\n slot=\"mobile-header\"\n heading={page.heading ?? ''}\n headingLevel={page.headingLevel ?? 'h1'}\n sections={mobileSections}\n value={page.showBack ? '' : (page.value ?? '')}\n sectionsAriaLabel={page.sectionsAriaLabel ?? 'Change page section'}\n subsections={page.subsections ?? []}\n subvalue={page.subvalue ?? ''}\n subsectionsAriaLabel={\n page.subsectionsAriaLabel ?? 'Change page subsection'\n }\n tone={page.tone ?? 'default'}\n onDsSectionChange={this.handleManagedTabChange}\n onDsSubsectionChange={this.handleManagedSubsectionChange}\n >\n {this.renderManagedMobileLeading()}\n {this.renderManagedMobileActions()}\n </ds-mobile-header>\n <slot />\n </ds-shell-page>\n );\n }\n\n private renderSlottedShell(\n shellCls: Record<string, boolean>,\n mobile: boolean,\n mobileToolActive: boolean,\n mobileStageBlocked: boolean,\n fullscreen: boolean\n ) {\n return (\n <Host class={shellCls} responsive-mode={this.resolvedMode}>\n <div class=\"shell-app__banner\">\n <slot name=\"banner\" />\n </div>\n <div class=\"shell-app__row\">\n <div class=\"shell-app__chrome\" aria-hidden=\"true\" />\n <div\n class=\"shell-app__panel\"\n aria-hidden={fullscreen ? 'true' : undefined}\n inert={fullscreen ? true : undefined}\n >\n <slot name=\"panel\" />\n </div>\n <div class=\"shell-app__main\">\n <div\n class=\"shell-app__bar\"\n aria-hidden={fullscreen ? 'true' : undefined}\n inert={fullscreen ? true : undefined}\n >\n <slot name=\"bar\" />\n </div>\n <div\n class=\"shell-app__tools\"\n aria-hidden={\n mobile && (!mobileToolActive || this.mobileSheetNavOpen)\n ? 'true'\n : undefined\n }\n inert={\n mobile && (!mobileToolActive || this.mobileSheetNavOpen)\n ? true\n : undefined\n }\n hidden={mobile && !mobileToolActive}\n >\n <slot name=\"tools\" />\n </div>\n <div\n class=\"shell-app__content ds-focus-ring\"\n aria-hidden={fullscreen || mobileStageBlocked ? 'true' : undefined}\n inert={fullscreen || mobileStageBlocked ? true : undefined}\n tabIndex={0}\n >\n <slot />\n </div>\n <div\n class=\"shell-app__mobile-sheet-nav\"\n hidden={!mobile || !this.mobileSheetNavOpen}\n aria-hidden={\n mobile && this.mobileSheetNavOpen ? undefined : 'true'\n }\n inert={mobile && this.mobileSheetNavOpen ? undefined : true}\n >\n <slot name=\"mobile-sheet-nav\" />\n </div>\n <div class=\"shell-app__mobile-bar-nav\" hidden={!mobile}>\n <slot name=\"mobile-bar-nav\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n\n render() {\n const chromeActive = this.chromeLayerActive();\n const mobile = this.resolvedMode === 'mobile';\n const mobileToolActive = mobile && this.effectiveMobileDestination !== 'area';\n const mobileStageBlocked =\n mobile && (mobileToolActive || this.effectiveMobileSheetNavOpen);\n const fullscreen = !mobile && this.toolsFullscreen;\n const shellCls: Record<string, boolean> = {\n 'shell-app': true,\n 'shell-app--gradient': chromeActive,\n [`shell-app--${this.navStyle}`]: true,\n [`shell-app--${this.resolvedMode}`]: true,\n 'shell-app--tools-fullscreen': fullscreen,\n 'shell-app--mobile-tool-active': mobileToolActive,\n 'shell-app--mobile-sheet-nav-open':\n mobile && this.effectiveMobileSheetNavOpen,\n 'shell-app--managed': this.managed,\n 'shell-app--slotted': !this.managed,\n };\n\n if (!this.managed) {\n return this.renderSlottedShell(\n shellCls,\n mobile,\n mobileToolActive,\n mobileStageBlocked,\n fullscreen\n );\n }\n\n return (\n <Host class={shellCls} responsive-mode={this.resolvedMode}>\n <div class=\"shell-app__banner\">\n <slot name=\"banner\" />\n </div>\n <div class=\"shell-app__row\">\n <div class=\"shell-app__chrome\" aria-hidden=\"true\" />\n <div class=\"shell-app__panel\" aria-hidden={fullscreen ? 'true' : undefined} inert={fullscreen ? true : undefined}>\n {this.renderManagedPanelNav()}\n </div>\n <div class=\"shell-app__main\">\n <div class=\"shell-app__bar\" aria-hidden={fullscreen ? 'true' : undefined} inert={fullscreen ? true : undefined}>\n {this.renderManagedBarNav()}\n </div>\n <div\n class=\"shell-app__tools\"\n aria-hidden={\n mobile && (!mobileToolActive || this.effectiveMobileSheetNavOpen)\n ? 'true'\n : undefined\n }\n inert={\n mobile && (!mobileToolActive || this.effectiveMobileSheetNavOpen)\n ? true\n : undefined\n }\n hidden={mobile && !mobileToolActive}\n >\n {this.renderManagedTools()}\n </div>\n <div\n class=\"shell-app__content ds-focus-ring\"\n aria-hidden={fullscreen || mobileStageBlocked ? 'true' : undefined}\n inert={fullscreen || mobileStageBlocked ? true : undefined}\n tabIndex={0}\n >\n {this.renderManagedPage()}\n </div>\n <div\n class=\"shell-app__mobile-sheet-nav\"\n hidden={!mobile || !this.effectiveMobileSheetNavOpen}\n aria-hidden={\n mobile && this.effectiveMobileSheetNavOpen ? undefined : 'true'\n }\n inert={mobile && this.effectiveMobileSheetNavOpen ? undefined : true}\n >\n {this.renderManagedMobileSheetNav()}\n </div>\n <div class=\"shell-app__mobile-bar-nav\" hidden={!mobile}>\n {this.renderManagedMobileBarNav()}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["SHELL_GRADIENT_PRESETS","DEFAULT_SHELL_GRADIENT_PRESET","SHELL_GRADIENT_RECIPES","cool","opacity","stops","color","position","neutral","warm","fresh","GRADIENT_GEOMETRY","shellGradientPresetRecipe","preset","normalized","normalizeShellGradientPreset","shellGradientPresetOpacity","String","isShellGradientPreset","value","includes","buildShellRadialGradientForPreset","buildShellRadialGradientFromStops","serialized","map","stop","join","SHELL_GRADIENT_IMAGE_VAR","SHELL_GRADIENT_SIZE_VAR","SHELL_GRADIENT_POSITION_PANEL_VAR","SHELL_GRADIENT_POSITION_BAR_VAR","SHELL_GRADIENT_OPACITY_VAR","buildShellRadialGradient","readShellViewportDimensions","win","w","globalThis","window","undefined","width","height","visual","visualViewport","Math","round","innerWidth","innerHeight","shellGradientSize","layout","shellGradientPositionPanel","shellGradientPositionBar","panelWidth","TOOL_SHORTCUT_KEYS","k","a","s","m","n","isBareShellShortcutKey","e","metaKey","ctrlKey","altKey","shiftKey","isEditableShortcutTarget","target","closest","el","editable","role","getAttribute","Boolean","isContentEditable","normalizedShortcutKey","key","code","length","toLowerCase","resolveShellShortcut","toolId","readCssVarWidthPx","context","cssVarName","document","probe","createElement","style","cssText","appendChild","getBoundingClientRect","removeChild","readPanelNavWidthTokens","navRoot","expandedPx","collapsedPx","isPanelNavCollapsed","panelNavHost","classList","contains","collapsedProp","collapsed","panelWidthPxFromTokens","tokens","shellAppCss","ShellApp","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","composition","navigation","pageChrome","tools","navStyle","gradientPreset","shortcutsEnabled","mobileDestination","mobileSheetNavOpen","toolsFullscreen","resolvedMode","managedToolsOpen","managedToolsClosing","managedActiveTool","managedToolPresentation","managedMobileDestination","managedMobileSheetNavOpen","managedInboxTool","managedBrowseContext","resizeObserver","hasLoaded","foregroundRefreshTimer","panelNavTransition","ChromeTransitionDepth","chromeSyncCoalescer","createRafCoalescer","syncChrome","panelWidthTokens","cachedViewportWidth","cachedViewportHeight","onWindowResize","updateResponsiveMode","isActive","scheduleChromeSync","onVisualViewportChange","onChromeTransitionStart","event","source","readChromeTransitionSource","readChromeTransitionPhase","enter","viewport","onChromeTransitionEnd","exit","onDocumentVisibilityChange","hidden","refreshAfterForegroundRestore","onPageShow","persisted","handleManagedNavSelect","stopPropagation","dsNavSelect","emit","detail","handleManagedTabChange","dsTabChange","handleManagedPageBack","dsPageBack","handleManagedBreadcrumbSelect","forwarded","dsBreadcrumbSelect","defaultPrevented","preventDefault","handleManagedSubsectionChange","dsSubsectionChange","handleManagedPageAction","dsPageAction","handleManagedToolChange","id","selected","item","resolvedToolItems","find","candidate","isShellInboxTool","shellMobileDestinationForTool","dsToolChange","handleManagedPresentationChange","presentation","dsPresentationChange","handleManagedHeaderBack","dsHeaderBack","handleManagedHeaderAction","dsHeaderAction","handleManagedSheetToggle","handleManagedMobileDestination","destination","activateManagedMobileTool","handleManagedAreaSelect","handleManagedBrowseContext","dsBrowseContextChange","handleManagedSheetClose","handleManagedNavFooterAction","dsNavFooterAction","handleManagedNavUserAction","dsNavUserAction","managed","effectiveMobileDestination","effectiveMobileSheetNavOpen","resolvedNavigationGroups","groups","settingsGroups","dashboardGroups","items","PANEL_TOOLS_DEFAULT_ITEMS","availableInboxTools","filter","isInactive","componentWillLoad","resolveShellResponsiveMode","browseContext","resolveAvailableInboxTool","componentDidLoad","syncSlottedNavStyle","syncSlottedMobileState","connectMetricsObserver","connectViewportListeners","connectPageLifecycleListeners","addEventListener","CHROME_TRANSITION_START","CHROME_TRANSITION_END","requestAnimationFrame","cachePanelWidthTokens","querySelector","handleToolsPresentation","disconnectedCallback","disconnect","disconnectViewportListeners","disconnectPageLifecycleListeners","cancelForegroundRefresh","cancel","removeEventListener","onShellPropsChange","handleNavigationChange","handleToolsChange","some","onMobileStateChange","_next","previous","bar","activeElement","focusDestination","next","dsResponsiveModeChange","mode","schedule","panel","setAttribute","sheetNav","responsiveMode","activeDestination","sheetNavExpanded","open","ResizeObserver","observe","panelWrap","passive","clearTimeout","remove","add","setTimeout","offsetHeight","FOREGROUND_REFRESH_MS","applyGradientVars","vars","name","Object","entries","removeProperty","setProperty","clearGradientPaintVars","targets","keys","syncChromeLayoutVars","panelPosition","barPosition","resolvePanelWidthPx","panelNav","measured","resolveViewportDimensions","chromeLayerActive","handleWindowKeyDown","action","toggleCollapsed","closeDrawer","startsWith","slice","activateTool","closeGlobalSurface","setToolPresentation","canonicalId","currentArea","flatMap","group","activeId","deriveActiveIdFromUrl","currentUrl","icon","label","heading","toolDot","dot","clearLayoutVars","image","size","isBar","tagName","renderManagedPanelNav","h","breakpoint","SHELL_DESKTOP_BREAKPOINT","routerMode","storageKey","userName","userInitial","accountMenuExpanded","dashboardLabel","settingsLabel","accountLabel","dashboardNavigationLabel","settingsNavigationLabel","navigationItemsLabel","navigationLabel","onDsNavSelect","onDsNavFooterAction","onDsNavUserAction","renderManagedBarNav","tabs","routeHeading","basePath","onDsTabChange","renderManagedToolSlots","ids","Set","sort","slot","renderManagedTools","activeTool","fullscreenHeaderMode","headers","toolsLabel","toolShortcutsLabel","inboxLabel","inboxNavigationLabel","onDsToolChange","onDsPresentationChange","onDsHeaderBack","onDsHeaderAction","renderManagedMobileSheetNav","routeSelectionActive","showAccount","showMobileAccount","onDsAreaSelect","onDsBrowseContextChange","onDsClose","renderManagedMobileBarNav","mobileBarHidden","searchLabel","ariaLabel","messagesLabel","agentsLabel","helpLabel","searchDot","inboxDot","messagesDot","agentsDot","onDsSheetNavToggle","onDsDestinationChange","renderManagedMobileLeading","showBack","backAriaLabel","side","variant","backIcon","activeFill","hasBorder","onDsClick","renderManagedMobileActions","actions","mobileActions","triggerId","haspopup","controls","expanded","pressed","renderManagedPage","page","mobileSections","barTitleSections","subsections","type","headerCapacity","resolveManagedShellPageCapacity","contentInset","contentInsetBlockStart","contentInsetBlockStartSize","compactContentInsetBlockStartSize","scrollCompaction","contentSurface","description","backLabel","breadcrumbs","breadcrumbAriaLabel","sections","subvalue","sectionsAriaLabel","subsectionsAriaLabel","primaryAction","actionsAriaLabel","showDivider","showHeaderDivider","showCompactDivider","showCompactHeaderDivider","onDsBack","onDsBreadcrumbSelect","onDsSectionChange","onDsAction","headingLevel","tone","onDsSubsectionChange","renderSlottedShell","shellCls","mobile","mobileToolActive","mobileStageBlocked","fullscreen","Host","class","inert","tabIndex","render","chromeActive"],"sources":["src/wc/shell/shell-gradient-presets.ts","src/wc/shell/shell-gradient.ts","src/wc/shell/shell-shortcuts.ts","src/wc/shell/shell-chrome-metrics.ts","src/wc/components/ShellApp/ShellApp.css?tag=ds-shell-app&encapsulation=scoped","src/wc/components/ShellApp/ShellApp.tsx"],"sourcesContent":["/** Built-in shell chrome wash presets. */\nexport type ShellGradientPreset = 'none' | 'cool' | 'neutral' | 'warm' | 'fresh';\n\nexport const SHELL_GRADIENT_PRESETS: ShellGradientPreset[] = [\n 'none',\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Wash presets shown after the `none` option in pickers. */\nexport const SHELL_GRADIENT_WASH_PRESETS: Exclude<ShellGradientPreset, 'none'>[] = [\n 'cool',\n 'neutral',\n 'warm',\n 'fresh',\n];\n\n/** Default wash when `gradient-preset` is omitted. */\nexport const DEFAULT_SHELL_GRADIENT_PRESET: ShellGradientPreset = 'neutral';\n\nexport const SHELL_GRADIENT_PRESET_LABELS: Record<ShellGradientPreset, string> = {\n none: 'None',\n cool: 'Cool',\n neutral: 'Neutral',\n warm: 'Warm',\n fresh: 'Fresh',\n};\n\nexport interface ShellGradientStop {\n color: string;\n position: number;\n}\n\nexport interface ShellGradientRecipe {\n opacity: number;\n stops: readonly ShellGradientStop[];\n}\n\nexport interface ShellGradientPickerPreview {\n backgroundColor: string;\n backgroundImage?: string;\n opacity?: number;\n}\n\nexport interface ShellGradientPickerOption {\n value: ShellGradientPreset;\n label: string;\n preview: ShellGradientPickerPreview;\n}\n\nexport interface ShellGradientPickerSection {\n options: ShellGradientPickerOption[];\n}\n\nconst SHELL_GRADIENT_RECIPES: Record<Exclude<ShellGradientPreset, 'none'>, ShellGradientRecipe> = {\n cool: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-blue-strong-background)', position: 100 },\n ],\n },\n neutral: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-grey-strong-background)', position: 100 },\n ],\n },\n warm: {\n opacity: 0.1,\n stops: [\n { color: 'var(--color-background-transparent)', position: 0 },\n { color: 'var(--color-color-intent-yellow-strong-background)', position: 100 },\n ],\n },\n fresh: {\n opacity: 0.4,\n stops: [\n { color: 'var(--color-color-intent-cyan-faint-background)', position: 0 },\n { color: 'var(--color-background-transparent)', position: 47 },\n { color: 'var(--color-background-transparent)', position: 58 },\n { color: 'var(--color-color-intent-red-faint-background)', position: 83 },\n { color: 'var(--color-color-intent-pink-faint-background)', position: 100 },\n ],\n },\n};\n\nconst GRADIENT_GEOMETRY = '100% 100% at 0% 0%';\n\nexport function shellGradientPresetStopToken(preset: ShellGradientPreset): string | null {\n if (preset === 'none') return null;\n const stops = SHELL_GRADIENT_RECIPES[preset].stops;\n return stops[stops.length - 1]?.color ?? null;\n}\n\nexport function shellGradientPresetRecipe(preset: ShellGradientPreset): ShellGradientRecipe | null {\n const normalized = normalizeShellGradientPreset(preset);\n return normalized === 'none' ? null : SHELL_GRADIENT_RECIPES[normalized];\n}\n\nexport function shellGradientPresetOpacity(preset: ShellGradientPreset): string {\n return String(shellGradientPresetRecipe(preset)?.opacity ?? 0);\n}\n\nexport function isShellGradientPreset(value: string): value is ShellGradientPreset {\n return (SHELL_GRADIENT_PRESETS as string[]).includes(value);\n}\n\n/**\n * Coerce unknown/absent presets to the default. Runtime values escape the\n * type: removing the reflected `gradient-preset` attribute (e.g. an Angular\n * `[attr.gradient-preset]=\"null\"` binding) drives the prop to null past its\n * field default — without normalization the stop lookup interpolates the\n * literal string \"undefined\" into CSS and the wash silently disappears.\n */\nexport function normalizeShellGradientPreset(\n value: string | null | undefined,\n): ShellGradientPreset {\n return value != null && isShellGradientPreset(value) ? value : DEFAULT_SHELL_GRADIENT_PRESET;\n}\n\n/** Radial wash for a preset — transparent at top-left into the intent stop. `none` returns no image. */\nexport function buildShellRadialGradientForPreset(preset: ShellGradientPreset): string {\n const normalized = normalizeShellGradientPreset(preset);\n if (normalized === 'none') return 'none';\n\n return buildShellRadialGradientFromStops(SHELL_GRADIENT_RECIPES[normalized].stops);\n}\n\n/** Build the production shell geometry from an ordered set of design-time stops. */\nexport function buildShellRadialGradientFromStops(stops: readonly ShellGradientStop[]): string {\n const serialized = stops.map(stop => `${stop.color} ${stop.position}%`).join(', ');\n return `radial-gradient(${GRADIENT_GEOMETRY}, ${serialized})`;\n}\n\n/** Generic SwatchPicker sections for the fixed shell appearance presets. */\nexport function shellGradientPickerSections(): ShellGradientPickerSection[] {\n return [\n {\n options: [{\n value: 'none',\n label: SHELL_GRADIENT_PRESET_LABELS.none,\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n },\n }],\n },\n {\n options: SHELL_GRADIENT_WASH_PRESETS.map(preset => ({\n value: preset,\n label: SHELL_GRADIENT_PRESET_LABELS[preset],\n preview: {\n backgroundColor: 'var(--color-background-secondary)',\n backgroundImage: buildShellRadialGradientForPreset(preset),\n opacity: Number(shellGradientPresetOpacity(preset)),\n },\n })),\n },\n ];\n}\n","/** CSS var names consumed by `ds-panel-nav` / `ds-bar-nav` inside `ds-shell-app`. */\nimport type { ShellGradientPreset } from './shell-gradient-presets';\nimport {\n DEFAULT_SHELL_GRADIENT_PRESET,\n buildShellRadialGradientForPreset,\n normalizeShellGradientPreset,\n} from './shell-gradient-presets';\n\nexport type { ShellGradientPreset } from './shell-gradient-presets';\nexport {\n DEFAULT_SHELL_GRADIENT_PRESET,\n SHELL_GRADIENT_PRESETS,\n SHELL_GRADIENT_PRESET_LABELS,\n buildShellRadialGradientForPreset,\n buildShellRadialGradientFromStops,\n isShellGradientPreset,\n shellGradientPresetOpacity,\n shellGradientPresetRecipe,\n shellGradientPresetStopToken,\n} from './shell-gradient-presets';\n\nexport const SHELL_GRADIENT_IMAGE_VAR = '--ds-shell-gradient-image';\nexport const SHELL_GRADIENT_SIZE_VAR = '--ds-shell-gradient-size';\nexport const SHELL_GRADIENT_POSITION_PANEL_VAR = '--ds-shell-gradient-position-panel';\nexport const SHELL_GRADIENT_POSITION_BAR_VAR = '--ds-shell-gradient-position-bar';\nexport const SHELL_GRADIENT_OPACITY_VAR = '--ds-shell-gradient-opacity';\n/** Per chrome-surface background-position — offsets wash + grid to shell row origin. */\nexport const SHELL_CHROME_SURFACE_POSITION_VAR = '--ds-shell-chrome-surface-position';\n\n/** Whether the shared chrome layer (secondary bg + optional wash) should mount. */\nexport function shellChromeLayerActive(preset: ShellGradientPreset): boolean {\n return normalizeShellGradientPreset(preset) !== 'none';\n}\n\n/**\n * Shell radial wash — same for panel and bar nav.\n * Tokens follow `data-theme` (light/dark intent stops).\n */\nexport function buildShellRadialGradient(\n preset: ShellGradientPreset = DEFAULT_SHELL_GRADIENT_PRESET,\n): string {\n return buildShellRadialGradientForPreset(preset);\n}\n\n/** Built-in radial image for the selected shell preset. */\nexport function shellGradientImage(\n preset: ShellGradientPreset = DEFAULT_SHELL_GRADIENT_PRESET,\n): string {\n return buildShellRadialGradient(preset);\n}\n\nexport interface ShellViewportDimensions {\n width: number;\n height: number;\n}\n\n/**\n * Viewport size for shell chrome with `background-attachment: fixed`.\n * Must not use the `ds-shell-app` element box — the shell can be shorter or\n * taller than the viewport when host height chains break or content overflows.\n */\nexport function readShellViewportDimensions(win?: Window): ShellViewportDimensions {\n const w = win ?? (typeof globalThis.window !== 'undefined' ? globalThis.window : undefined);\n if (!w) return { width: 0, height: 0 };\n\n const visual = w.visualViewport;\n return {\n width: Math.round(visual?.width ?? w.innerWidth),\n height: Math.round(visual?.height ?? w.innerHeight),\n };\n}\n\nexport interface ShellGradientLayout {\n width: number;\n height: number;\n panelWidth: number;\n}\n\n/** Pixel `background-size` for the fixed-attachment radial wash. */\nexport function shellGradientSize(layout: Pick<ShellGradientLayout, 'width' | 'height'>): string {\n return `${Math.round(layout.width)}px ${Math.round(layout.height)}px`;\n}\n\nexport function shellGradientPositionPanel(): string {\n return '0 0';\n}\n\nexport function shellGradientPositionBar(panelWidth: number): string {\n return `${-Math.round(panelWidth)}px 0`;\n}\n\n/** Phase-lock a chrome rect to the shell row coordinate system (wash + grid). */\nexport function shellChromeSurfacePosition(leftPx: number, topPx: number): string {\n return `${-Math.round(leftPx)}px ${-Math.round(topPx)}px`;\n}\n","import type { PanelToolsToolId } from '../components/PanelTools/panel-tools-types';\n\nexport type ShellShortcutAction =\n | 'toggle-panel-nav'\n | 'close-panel-tools'\n | `open-tool:${PanelToolsToolId}`;\n\nconst TOOL_SHORTCUT_KEYS: Record<string, PanelToolsToolId> = {\n k: 'search',\n a: 'agents',\n s: 'stacks',\n m: 'messages',\n n: 'activity',\n '/': 'help',\n};\n\n/** Tool shortcut keys (K, A, S, M, N, /) toggle open/closed via `ds-panel-tools.activateTool`. */\n\n/** True when no modifier keys are held — avoids browser/app chords like ⌘N. */\nexport function isBareShellShortcutKey(\n e: Pick<KeyboardEvent, 'metaKey' | 'ctrlKey' | 'altKey' | 'shiftKey'>,\n): boolean {\n return !e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey;\n}\n\n/** Skip shell shortcuts while typing in an editable control. */\nexport function isEditableShortcutTarget(target: EventTarget | null): boolean {\n if (!target || typeof target !== 'object') return false;\n if (!('closest' in target) || typeof target.closest !== 'function') return false;\n\n const el = target as Element & { isContentEditable?: boolean };\n\n const editable = el.closest(\n 'input, textarea, select, [contenteditable=\"\"], [contenteditable=\"true\"], [contenteditable=\"plaintext-only\"]',\n );\n if (editable) return true;\n\n const role = el.getAttribute('role');\n if (role === 'textbox' || role === 'combobox' || role === 'searchbox') return true;\n\n return Boolean(el.isContentEditable);\n}\n\nfunction normalizedShortcutKey(e: Pick<KeyboardEvent, 'key' | 'code'>): string {\n if (e.key === '[' || e.code === 'BracketLeft') return '[';\n if (e.key === ']' || e.code === 'BracketRight') return ']';\n return e.key.length === 1 ? e.key.toLowerCase() : e.key.toLowerCase();\n}\n\n/** Resolve a shell chrome shortcut, or `null` when the key is not handled. */\nexport function resolveShellShortcut(\n e: Pick<KeyboardEvent, 'key' | 'code' | 'metaKey' | 'ctrlKey' | 'altKey' | 'shiftKey'>,\n): ShellShortcutAction | null {\n if (!isBareShellShortcutKey(e)) return null;\n\n const key = normalizedShortcutKey(e);\n if (key === '[') return 'toggle-panel-nav';\n if (key === ']') return 'close-panel-tools';\n\n const toolId = TOOL_SHORTCUT_KEYS[key];\n if (toolId) return `open-tool:${toolId}`;\n\n return null;\n}\n","import { shellGradientPositionBar } from './shell-gradient';\n\n/** Read a `var(--token)` width in px using a hidden probe (works with calc() tokens). */\nexport function readCssVarWidthPx(context: HTMLElement, cssVarName: string): number {\n if (typeof document === 'undefined') return 0;\n\n const probe = document.createElement('div');\n probe.style.cssText =\n 'position:absolute;visibility:hidden;pointer-events:none;height:0;width:var(' +\n cssVarName +\n ');';\n context.appendChild(probe);\n const width = probe.getBoundingClientRect().width;\n context.removeChild(probe);\n return width;\n}\n\nexport interface PanelNavWidthTokens {\n expandedPx: number;\n collapsedPx: number;\n}\n\n/** Resolve panel-nav expanded/collapsed widths from scoped CSS vars on `.panel-nav`. */\nexport function readPanelNavWidthTokens(navRoot: HTMLElement): PanelNavWidthTokens {\n return {\n expandedPx: readCssVarWidthPx(navRoot, '--_nav-width'),\n collapsedPx: readCssVarWidthPx(navRoot, '--_nav-width-collapsed'),\n };\n}\n\nexport function isPanelNavCollapsed(\n panelNavHost: HTMLElement | null,\n navRoot: HTMLElement | null,\n): boolean {\n if (navRoot?.classList.contains('panel-nav--collapsed')) return true;\n const collapsedProp = (panelNavHost as (HTMLElement & { collapsed?: boolean }) | null)?.collapsed;\n return collapsedProp === true;\n}\n\nexport function panelWidthPxFromTokens(\n tokens: PanelNavWidthTokens,\n collapsed: boolean,\n): number {\n return collapsed ? tokens.collapsedPx : tokens.expandedPx;\n}\n\nexport function barGradientPositionFromPanelWidth(panelWidthPx: number): string {\n return shellGradientPositionBar(panelWidthPx);\n}\n","@import '../../utils/focus-ring.css';\n\n:host {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n overflow: hidden;\n overscroll-behavior: none;\n font-family: var(--typography-font-family-ui, system-ui);\n --ds-shell-panel-tools-width: var(--dimension-panel-width-xs);\n}\n\n:host {\n --_shell-chrome-bg: var(--color-background-secondary);\n}\n\n.shell-app__row {\n display: flex;\n flex: 1 1 0;\n min-height: 0;\n position: relative;\n}\n\n.shell-app__banner {\n flex: 0 0 auto;\n min-width: 0;\n position: relative;\n z-index: 5;\n}\n\n.shell-app__banner ::slotted(ds-banner) {\n display: grid;\n width: 100%;\n}\n\n/*\n * One chrome layer behind the shell row. Wash uses background-attachment: fixed\n * so the pattern is locked to the viewport — panel/tools collapse only changes the\n * transparent window, not the pattern phase. JS sets wash background-size from\n * readShellViewportDimensions(), not the shell element box.\n */\n.shell-app__chrome {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n background-color: var(--_shell-chrome-bg);\n}\n\n:host(.shell-app--gradient) .shell-app__chrome::before {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n background-position: 0 0;\n background-attachment: fixed;\n z-index: 1;\n opacity: var(--ds-shell-gradient-opacity, 1);\n background-image: var(--ds-shell-gradient-image, none);\n background-size: var(--ds-shell-gradient-size, auto);\n background-repeat: no-repeat;\n}\n\n.shell-app__panel {\n flex: 0 0 auto;\n min-height: 0;\n height: 100%;\n position: relative;\n /* Above main so resize handle line can paint over the workspace edge */\n z-index: 2;\n}\n\n.shell-app__panel ::slotted(ds-panel-nav) {\n display: block;\n height: 100%;\n}\n\n.shell-app__panel > ds-panel-nav {\n display: block;\n height: 100%;\n}\n\n.shell-app__main {\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n grid-template-rows: auto minmax(0, 1fr);\n grid-template-areas:\n 'bar tools'\n 'content tools';\n position: relative;\n z-index: 1;\n}\n\n.shell-app__mobile-sheet-nav,\n.shell-app__mobile-bar-nav {\n display: none;\n}\n\n.shell-app__bar {\n grid-area: bar;\n flex: 0 0 auto;\n min-width: 0;\n}\n\n.shell-app__bar ::slotted(ds-bar-nav) {\n display: block;\n}\n\n.shell-app__bar > ds-bar-nav {\n display: block;\n}\n\n.shell-app__content {\n grid-area: content;\n flex: 1 1 auto;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n overscroll-behavior: none;\n /* Limit reflow to the page column — not on __main (breaks tools flex shrink). */\n contain: layout;\n}\n\n/* Opaque page surface — masks the fixed chrome layer in the content column. */\n.shell-app__content {\n position: relative;\n z-index: 1;\n background-color: var(--color-background-primary);\n}\n\n.shell-app__tools {\n grid-area: tools;\n flex: 0 0 auto;\n min-width: 0;\n min-height: 0;\n height: 100%;\n display: flex;\n position: relative;\n z-index: 0;\n overflow: hidden;\n}\n\n.shell-app__tools ::slotted(ds-panel-tools) {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.shell-app__tools ::slotted(ds-shell-tools) {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.shell-app__tools > ds-shell-tools {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.shell-app__content > ds-shell-page {\n display: block;\n min-height: 100%;\n}\n\n:host(.shell-app--tools-fullscreen) .shell-app__panel,\n:host(.shell-app--tools-fullscreen) .shell-app__bar,\n:host(.shell-app--tools-fullscreen) .shell-app__content {\n visibility: hidden;\n}\n\n:host(.shell-app--mobile) {\n --_shell-chrome-bg: var(--color-background-primary);\n padding-block-start: env(safe-area-inset-top);\n}\n\n/* Refresh the Mobile WebKit stage layer without remounting app content. */\n:host(.shell-app--mobile.shell-app--foreground-refresh) .shell-app__main {\n transform: translateZ(0);\n}\n\n:host(.shell-app--mobile) .shell-app__chrome,\n:host(.shell-app--mobile) .shell-app__panel,\n:host(.shell-app--mobile) .shell-app__bar {\n display: none;\n}\n\n:host(.shell-app--mobile) .shell-app__main {\n width: 100%;\n box-sizing: border-box;\n grid-template-columns: minmax(0, 1fr);\n grid-template-rows: minmax(0, 1fr) auto;\n grid-template-areas:\n 'stage'\n 'mobile-bar-nav';\n background: var(--color-background-primary);\n}\n\n:host(.shell-app--mobile) .shell-app__content,\n:host(.shell-app--mobile) .shell-app__tools,\n:host(.shell-app--mobile) .shell-app__mobile-sheet-nav {\n grid-area: stage;\n min-width: 0;\n min-height: 0;\n height: 100%;\n position: relative;\n}\n\n:host(.shell-app--mobile) .shell-app__content {\n z-index: 1;\n overflow: auto;\n}\n\n:host(.shell-app--mobile) .shell-app__tools {\n z-index: 2;\n width: 100%;\n overflow: hidden;\n background: var(--color-background-primary);\n}\n\n:host(.shell-app--mobile) .shell-app__mobile-sheet-nav {\n display: block;\n z-index: 3;\n overflow: hidden;\n background: var(--color-background-primary);\n}\n\n:host(.shell-app--mobile) .shell-app__mobile-bar-nav {\n grid-area: mobile-bar-nav;\n display: block;\n min-width: 0;\n position: relative;\n z-index: 4;\n}\n\n:host(.shell-app--mobile) .shell-app__tools[hidden],\n:host(.shell-app--mobile) .shell-app__mobile-sheet-nav[hidden],\n:host(.shell-app--mobile) .shell-app__mobile-bar-nav[hidden] {\n display: none;\n}\n\n:host(.shell-app--mobile-tool-active) .shell-app__content,\n:host(.shell-app--mobile-sheet-nav-open) .shell-app__content,\n:host(.shell-app--mobile-sheet-nav-open) .shell-app__tools {\n visibility: hidden;\n}\n","import {\n Component,\n Prop,\n Element,\n Event,\n EventEmitter,\n State,\n Watch,\n Listen,\n Method,\n h,\n Host,\n} from '@stencil/core';\nimport type { NavChromeStyle } from '../../shell/nav-chrome';\nimport {\n isEditableShortcutTarget,\n resolveShellShortcut,\n} from '../../shell/shell-shortcuts';\nimport type {\n PanelToolsToolId,\n PanelToolsHeaderAction,\n} from '../PanelTools/panel-tools-types';\nimport { PANEL_TOOLS_DEFAULT_ITEMS } from '../PanelTools/panel-tools-types';\nimport type { BarTitleSectionItem } from '../BarTitle/bar-title-types';\nimport type { BreadcrumbSelectDetail } from '../Breadcrumb/breadcrumb-types';\nimport {\n DEFAULT_SHELL_GRADIENT_PRESET,\n normalizeShellGradientPreset,\n type ShellGradientPreset,\n} from '../../shell/shell-gradient-presets';\nimport {\n CHROME_TRANSITION_END,\n CHROME_TRANSITION_START,\n ChromeTransitionDepth,\n createRafCoalescer,\n readChromeTransitionPhase,\n readChromeTransitionSource,\n} from '../../shell/chrome-transition';\nimport {\n isPanelNavCollapsed,\n panelWidthPxFromTokens,\n readPanelNavWidthTokens,\n type PanelNavWidthTokens,\n} from '../../shell/shell-chrome-metrics';\nimport {\n SHELL_GRADIENT_IMAGE_VAR,\n SHELL_GRADIENT_OPACITY_VAR,\n SHELL_GRADIENT_POSITION_BAR_VAR,\n SHELL_GRADIENT_POSITION_PANEL_VAR,\n SHELL_GRADIENT_SIZE_VAR,\n buildShellRadialGradient,\n readShellViewportDimensions,\n shellGradientPositionBar,\n shellGradientPositionPanel,\n shellGradientPresetOpacity,\n shellGradientSize,\n} from '../../shell/shell-gradient';\nimport {\n isShellInboxTool,\n resolveAvailableInboxTool,\n resolveManagedShellPageCapacity,\n resolveShellResponsiveMode,\n SHELL_DESKTOP_BREAKPOINT,\n shellMobileDestinationForTool,\n type MobileDestination,\n type ShellInboxToolId,\n type ShellResponsiveMode,\n} from '../../shell/shell-responsive';\nimport { deriveActiveIdFromUrl } from '../PanelNav/panel-nav-utils';\nimport type { PanelNavItem } from '../PanelNav/panel-nav-types';\nimport type { PanelNavUserActionDetail } from '../PanelNav/panel-nav-types';\nimport type { MobileBarNavDestinationDetail } from '../MobileBarNav/mobile-bar-nav-types';\nimport type {\n ShellAppComposition,\n ShellNavigationConfig,\n ShellPageChromeConfig,\n ShellToolsConfig,\n} from './shell-app-types';\n\n@Component({\n tag: 'ds-shell-app',\n styleUrl: 'ShellApp.css',\n scoped: true,\n})\nexport class ShellApp {\n private static readonly FOREGROUND_REFRESH_MS = 50;\n\n /** Managed renders the complete responsive chrome; slotted exposes the advanced composition. */\n @Prop({ reflect: true }) composition: ShellAppComposition = 'managed';\n\n /** Router-owned navigation data used by managed composition. */\n @Prop() navigation: ShellNavigationConfig = {};\n\n /** Route-owned page title and section data used by managed composition. */\n @Prop({ attribute: 'page-chrome' }) pageChrome: ShellPageChromeConfig = {};\n\n /** Product-owned global tool definitions used by managed composition. */\n @Prop() tools: ShellToolsConfig = {};\n\n /** Chrome style propagated to slotted `ds-panel-nav` and `ds-bar-nav`. */\n @Prop({ attribute: 'nav-style', reflect: true }) navStyle: NavChromeStyle = 'dashboard';\n\n /**\n * Shell chrome wash preset. `none` renders solid chrome; the remaining\n * presets use token-based washes that adapt to the active color theme.\n */\n @Prop({ attribute: 'gradient-preset', reflect: true }) gradientPreset: ShellGradientPreset =\n DEFAULT_SHELL_GRADIENT_PRESET;\n\n /** When `true` (default), registers global shell keyboard shortcuts. `[` toggles panel nav; `]` closes tools; K, A, S, M, N, and / toggle tool drawers. Modifiers are ignored so browser chords like ⌘N stay native. */\n @Prop({ attribute: 'shortcuts-enabled' }) shortcutsEnabled: boolean = true;\n\n /** Controlled mobile surface shown above the persistent bottom bar. */\n @Prop({ attribute: 'mobile-destination' })\n mobileDestination: MobileDestination = 'area';\n\n /** Controlled full-stage Mobile Sheet Nav state. */\n @Prop({ attribute: 'mobile-sheet-nav-open' })\n mobileSheetNavOpen: boolean = false;\n\n /** Emitted after crossing the fixed 768px or 1200px shell boundaries. */\n @Event() dsResponsiveModeChange!: EventEmitter<{ mode: ShellResponsiveMode }>;\n\n /** Managed primary-navigation intent; the application router performs navigation. */\n @Event() dsNavSelect!: EventEmitter<string>;\n\n /** Managed desktop BarNav or mobile section-selection intent. */\n @Event() dsTabChange!: EventEmitter<string>;\n\n /** Managed page-subsection intent from BarTitle or MobileHeader. */\n @Event() dsSubsectionChange!: EventEmitter<string>;\n\n /** Managed page-level Back intent. */\n @Event() dsPageBack!: EventEmitter<MouseEvent>;\n\n /** Managed breadcrumb intent from BarTitle. */\n @Event({ cancelable: true })\n dsBreadcrumbSelect!: EventEmitter<BreadcrumbSelectDetail>;\n\n /** Managed page action intent from BarTitle. */\n @Event() dsPageAction!: EventEmitter<string>;\n\n /** Managed tools selection state. */\n @Event() dsToolChange!: EventEmitter<{ id: PanelToolsToolId; selected: boolean }>;\n\n /** Managed tool-header Back intent. */\n @Event() dsHeaderBack!: EventEmitter<{ tool: PanelToolsToolId }>;\n\n /** Managed tool-header action intent. */\n @Event() dsHeaderAction!: EventEmitter<{ tool: PanelToolsToolId; id: string }>;\n\n /** Managed drawer/fullscreen presentation state. */\n @Event() dsPresentationChange!: EventEmitter<{ presentation: 'drawer' | 'fullscreen' }>;\n\n /** Managed mobile Dashboard/Settings browsing intent. */\n @Event() dsBrowseContextChange!: EventEmitter<NavChromeStyle>;\n\n /** Managed account-footer action intent. */\n @Event() dsNavFooterAction!: EventEmitter<void>;\n\n /** Managed user/account trigger intent. */\n @Event() dsNavUserAction!: EventEmitter<PanelNavUserActionDetail>;\n\n @Element() el!: HTMLElement;\n @State() private toolsFullscreen = false;\n @State() private resolvedMode: ShellResponsiveMode = 'desktop';\n @State() private managedToolsOpen = false;\n /** Keep page capacity aligned with the drawer until its closing clip reaches zero. */\n @State() private managedToolsClosing = false;\n @State() private managedActiveTool: PanelToolsToolId | '' = '';\n @State() private managedToolPresentation: 'drawer' | 'fullscreen' = 'drawer';\n @State() private managedMobileDestination: MobileDestination = 'area';\n @State() private managedMobileSheetNavOpen = false;\n @State() private managedInboxTool: ShellInboxToolId | '' = '';\n @State() private managedBrowseContext: NavChromeStyle = 'dashboard';\n\n private resizeObserver: ResizeObserver | null = null;\n private hasLoaded = false;\n private foregroundRefreshTimer: number | null = null;\n private readonly panelNavTransition = new ChromeTransitionDepth();\n private readonly chromeSyncCoalescer = createRafCoalescer(() => this.syncChrome());\n private panelWidthTokens: PanelNavWidthTokens = { expandedPx: 0, collapsedPx: 0 };\n private cachedViewportWidth = 0;\n private cachedViewportHeight = 0;\n private onWindowResize = () => {\n this.updateResponsiveMode();\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n };\n private onVisualViewportChange = () => {\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n };\n\n private get managed(): boolean {\n return this.composition === 'managed';\n }\n\n private get effectiveMobileDestination(): MobileDestination {\n return this.managed ? this.managedMobileDestination : this.mobileDestination;\n }\n\n private get effectiveMobileSheetNavOpen(): boolean {\n return this.managed ? this.managedMobileSheetNavOpen : this.mobileSheetNavOpen;\n }\n\n private get resolvedNavigationGroups() {\n if (this.navigation.groups?.length) return this.navigation.groups;\n return this.managedBrowseContext === 'settings'\n ? (this.navigation.settingsGroups ?? [])\n : (this.navigation.dashboardGroups ?? []);\n }\n\n private get resolvedToolItems() {\n return this.tools.items ?? PANEL_TOOLS_DEFAULT_ITEMS;\n }\n\n private get availableInboxTools(): ShellInboxToolId[] {\n return this.resolvedToolItems\n .filter(\n item =>\n !item.isInactive &&\n (item.mobileDestination === 'inbox' || isShellInboxTool(item.id))\n )\n .map(item => item.id as ShellInboxToolId);\n }\n\n componentWillLoad() {\n if (typeof window !== 'undefined') {\n this.resolvedMode = resolveShellResponsiveMode(window.innerWidth);\n }\n this.managedBrowseContext = this.navigation.browseContext ?? this.navStyle;\n this.managedMobileDestination = this.mobileDestination;\n this.managedMobileSheetNavOpen = this.mobileSheetNavOpen;\n this.managedInboxTool = resolveAvailableInboxTool('', this.availableInboxTools);\n }\n\n componentDidLoad() {\n this.hasLoaded = true;\n this.syncSlottedNavStyle();\n this.syncSlottedMobileState();\n this.connectMetricsObserver();\n this.connectViewportListeners();\n this.connectPageLifecycleListeners();\n this.el.addEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);\n this.el.addEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);\n requestAnimationFrame(() => {\n this.cachePanelWidthTokens();\n this.scheduleChromeSync();\n });\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools');\n this.toolsFullscreen = tools?.getAttribute('presentation') === 'fullscreen';\n }\n\n @Listen('dsPresentationChange')\n handleToolsPresentation(event: CustomEvent<{ presentation?: string }>) {\n this.toolsFullscreen = event.detail?.presentation === 'fullscreen';\n }\n\n disconnectedCallback() {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.disconnectViewportListeners();\n this.disconnectPageLifecycleListeners();\n this.cancelForegroundRefresh();\n this.chromeSyncCoalescer.cancel();\n this.el.removeEventListener(CHROME_TRANSITION_START, this.onChromeTransitionStart);\n this.el.removeEventListener(CHROME_TRANSITION_END, this.onChromeTransitionEnd);\n }\n\n @Watch('navStyle')\n @Watch('gradientPreset')\n onShellPropsChange() {\n this.syncSlottedNavStyle();\n this.scheduleChromeSync();\n }\n\n @Watch('navigation')\n handleNavigationChange() {\n this.managedBrowseContext = this.navigation.browseContext ?? this.navStyle;\n }\n\n @Watch('tools')\n handleToolsChange() {\n if (\n this.managedActiveTool &&\n !this.resolvedToolItems.some(item => item.id === this.managedActiveTool)\n ) {\n this.managedToolsOpen = false;\n this.managedActiveTool = '';\n this.managedMobileDestination = 'area';\n }\n this.managedInboxTool = resolveAvailableInboxTool(\n this.managedInboxTool,\n this.availableInboxTools\n );\n }\n\n @Watch('mobileDestination')\n @Watch('mobileSheetNavOpen')\n onMobileStateChange(_next: unknown, previous: unknown) {\n if (this.managed) {\n this.managedMobileDestination = this.mobileDestination;\n this.managedMobileSheetNavOpen = this.mobileSheetNavOpen;\n }\n this.syncSlottedMobileState();\n if (\n previous === true &&\n !this.effectiveMobileSheetNavOpen &&\n this.resolvedMode === 'mobile'\n ) {\n requestAnimationFrame(() => {\n const bar = this.el.querySelector('ds-mobile-bar-nav') as\n | (HTMLElement & {\n focusDestination?: (\n destination: MobileDestination | 'sheet-nav'\n ) => Promise<void>;\n })\n | null;\n const activeElement = document.activeElement;\n if (activeElement instanceof HTMLElement && bar?.contains(activeElement)) return;\n void bar?.focusDestination?.('sheet-nav');\n });\n }\n }\n\n private updateResponsiveMode() {\n if (typeof window === 'undefined') return;\n const next = resolveShellResponsiveMode(window.innerWidth);\n if (next === this.resolvedMode) return;\n this.resolvedMode = next;\n this.syncSlottedMobileState();\n this.scheduleChromeSync();\n if (this.hasLoaded) this.dsResponsiveModeChange.emit({ mode: next });\n }\n\n private onChromeTransitionStart = (event: Event) => {\n const source = readChromeTransitionSource(event);\n if (source === 'panel-tools') {\n if (readChromeTransitionPhase(event) === 'closing') {\n this.managedToolsClosing = true;\n }\n return;\n }\n if (source !== 'panel-nav') return;\n\n this.panelNavTransition.enter();\n const viewport = readShellViewportDimensions();\n this.cachedViewportWidth = viewport.width;\n this.cachedViewportHeight = viewport.height;\n this.syncChrome();\n };\n\n private onChromeTransitionEnd = (event: Event) => {\n const source = readChromeTransitionSource(event);\n if (source === 'panel-tools') {\n this.managedToolsClosing = false;\n return;\n }\n if (source !== 'panel-nav') return;\n\n this.panelNavTransition.exit();\n if (!this.panelNavTransition.isActive) {\n this.scheduleChromeSync();\n }\n };\n\n /** Coalesce ResizeObserver bursts to one layout read per frame. */\n private scheduleChromeSync() {\n this.chromeSyncCoalescer.schedule();\n }\n\n private syncSlottedNavStyle() {\n const panel = this.el.querySelector('ds-panel-nav') as (HTMLElement & { navStyle: NavChromeStyle }) | null;\n const bar = this.el.querySelector('ds-bar-nav') as (HTMLElement & { navStyle: NavChromeStyle }) | null;\n if (panel) {\n panel.setAttribute('nav-style', this.navStyle);\n panel.navStyle = this.navStyle;\n }\n if (bar) {\n bar.setAttribute('nav-style', this.navStyle);\n bar.navStyle = this.navStyle;\n }\n }\n\n private syncSlottedMobileState() {\n const tools = this.el.querySelector('ds-shell-tools') as\n | (HTMLElement & { responsiveMode: ShellResponsiveMode })\n | null;\n const bar = this.el.querySelector('ds-mobile-bar-nav') as\n | (HTMLElement & {\n activeDestination: MobileDestination;\n sheetNavExpanded: boolean;\n })\n | null;\n const sheetNav = this.el.querySelector('ds-mobile-sheet-nav') as\n | (HTMLElement & { open: boolean })\n | null;\n\n if (tools) {\n tools.setAttribute('responsive-mode', this.resolvedMode);\n tools.responsiveMode = this.resolvedMode;\n }\n if (bar) {\n bar.activeDestination = this.effectiveMobileDestination;\n bar.sheetNavExpanded = this.effectiveMobileSheetNavOpen;\n }\n if (sheetNav) {\n sheetNav.open = this.effectiveMobileSheetNavOpen;\n }\n }\n\n private connectMetricsObserver() {\n this.resizeObserver = new ResizeObserver(() => {\n if (this.panelNavTransition.isActive) return;\n this.scheduleChromeSync();\n });\n this.resizeObserver.observe(this.el);\n const panelWrap = this.el.querySelector('.shell-app__panel');\n if (panelWrap) this.resizeObserver.observe(panelWrap);\n }\n\n private connectViewportListeners() {\n if (typeof window === 'undefined') return;\n\n window.addEventListener('resize', this.onWindowResize, { passive: true });\n\n const visual = window.visualViewport;\n if (visual) {\n visual.addEventListener('resize', this.onVisualViewportChange, { passive: true });\n visual.addEventListener('scroll', this.onVisualViewportChange, { passive: true });\n }\n }\n\n private disconnectViewportListeners() {\n if (typeof window === 'undefined') return;\n\n window.removeEventListener('resize', this.onWindowResize);\n\n const visual = window.visualViewport;\n if (visual) {\n visual.removeEventListener('resize', this.onVisualViewportChange);\n visual.removeEventListener('scroll', this.onVisualViewportChange);\n }\n }\n\n private connectPageLifecycleListeners() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n document.addEventListener('visibilitychange', this.onDocumentVisibilityChange);\n window.addEventListener('pageshow', this.onPageShow);\n }\n\n private disconnectPageLifecycleListeners() {\n if (typeof window === 'undefined' || typeof document === 'undefined') return;\n document.removeEventListener('visibilitychange', this.onDocumentVisibilityChange);\n window.removeEventListener('pageshow', this.onPageShow);\n }\n\n private onDocumentVisibilityChange = () => {\n if (!document.hidden) this.refreshAfterForegroundRestore();\n };\n\n private onPageShow = (event: PageTransitionEvent) => {\n if (event.persisted) this.refreshAfterForegroundRestore();\n };\n\n private cancelForegroundRefresh() {\n if (this.foregroundRefreshTimer !== null) {\n window.clearTimeout(this.foregroundRefreshTimer);\n this.foregroundRefreshTimer = null;\n }\n this.el.classList.remove('shell-app--foreground-refresh');\n }\n\n private refreshAfterForegroundRestore() {\n this.updateResponsiveMode();\n this.syncSlottedMobileState();\n this.scheduleChromeSync();\n\n if (this.resolvedMode !== 'mobile') return;\n\n /*\n * Mobile WebKit can restore a live, correctly sized DOM without repainting\n * its suspended shell layer. Re-promote the complete mobile stage for one\n * painted frame; routed and tool owners remain mounted and keep their state.\n */\n this.cancelForegroundRefresh();\n this.el.classList.add('shell-app--foreground-refresh');\n void this.el.offsetHeight;\n // A short timer spans a real compositor commit; resumed WebKit may coalesce\n // nested animation frames before presenting either one.\n this.foregroundRefreshTimer = window.setTimeout(() => {\n this.foregroundRefreshTimer = null;\n this.el.classList.remove('shell-app--foreground-refresh');\n // WebKit otherwise may keep presenting the retired composite layer.\n void this.el.querySelector<HTMLElement>('.shell-app__main')?.offsetHeight;\n }, ShellApp.FOREGROUND_REFRESH_MS);\n }\n\n private cachePanelWidthTokens() {\n const navRoot = this.el.querySelector('ds-panel-nav .panel-nav') as HTMLElement | null;\n if (!navRoot) return;\n this.panelWidthTokens = readPanelNavWidthTokens(navRoot);\n }\n\n private applyGradientVars(target: HTMLElement, vars: Record<string, string | null>) {\n const style = target.style;\n for (const [name, value] of Object.entries(vars)) {\n if (value === null) style.removeProperty(name);\n else style.setProperty(name, value);\n }\n }\n\n private clearGradientPaintVars(targets: HTMLElement[]) {\n const keys = [\n SHELL_GRADIENT_IMAGE_VAR,\n SHELL_GRADIENT_SIZE_VAR,\n SHELL_GRADIENT_OPACITY_VAR,\n ];\n for (const target of targets) {\n for (const key of keys) target.style.removeProperty(key);\n }\n }\n\n /** Panel/bar wash offsets for scroll fades and badge rings. */\n private syncChromeLayoutVars(\n panel: HTMLElement | null,\n bar: HTMLElement | null,\n panelPosition: string,\n barPosition: string,\n ) {\n if (panel) {\n panel.style.setProperty(SHELL_GRADIENT_POSITION_PANEL_VAR, panelPosition);\n }\n if (bar) {\n bar.style.setProperty(SHELL_GRADIENT_POSITION_BAR_VAR, barPosition);\n }\n }\n\n private resolvePanelWidthPx(panelNav: HTMLElement | null): number {\n const navRoot = panelNav?.querySelector('.panel-nav') as HTMLElement | null;\n\n if (this.panelNavTransition.isActive && this.panelWidthTokens.expandedPx > 0) {\n const collapsed = isPanelNavCollapsed(panelNav, navRoot);\n return panelWidthPxFromTokens(this.panelWidthTokens, collapsed);\n }\n\n const panelWrap = this.el.querySelector('.shell-app__panel') as HTMLElement | null;\n const measured = panelWrap?.getBoundingClientRect().width ?? 0;\n if (measured > 0) return measured;\n\n if (this.panelWidthTokens.expandedPx > 0) {\n const collapsed = isPanelNavCollapsed(panelNav, navRoot);\n return panelWidthPxFromTokens(this.panelWidthTokens, collapsed);\n }\n\n return 0;\n }\n\n /** Fixed-attachment wash/grid size — always the viewport, never the shell element box. */\n private resolveViewportDimensions(): { width: number; height: number } {\n if (this.panelNavTransition.isActive && this.cachedViewportWidth > 0) {\n return {\n width: this.cachedViewportWidth,\n height: this.cachedViewportHeight,\n };\n }\n\n return readShellViewportDimensions();\n }\n\n private chromeLayerActive(): boolean {\n return (\n this.resolvedMode !== 'mobile' &&\n normalizeShellGradientPreset(this.gradientPreset) !== 'none'\n );\n }\n\n @Listen('keydown', { target: 'window', capture: true })\n handleWindowKeyDown(e: KeyboardEvent) {\n if (!this.shortcutsEnabled) return;\n if (isEditableShortcutTarget(e.target)) return;\n\n const action = resolveShellShortcut(e);\n if (!action) return;\n\n e.preventDefault();\n\n const panel = this.el.querySelector('ds-panel-nav') as HTMLDsPanelNavElement | null;\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools') as\n | (HTMLElement & {\n closeDrawer?: () => Promise<void>;\n activateTool?: (id: PanelToolsToolId) => Promise<void>;\n })\n | null;\n\n if (action === 'toggle-panel-nav') {\n void panel?.toggleCollapsed();\n return;\n }\n\n if (action === 'close-panel-tools') {\n void tools?.closeDrawer?.();\n return;\n }\n\n if (action.startsWith('open-tool:') && tools) {\n const toolId = action.slice('open-tool:'.length) as PanelToolsToolId;\n void tools.activateTool?.(toolId);\n }\n }\n\n /** Open or toggle a managed global tool from application-owned UI. */\n @Method()\n async activateTool(id: PanelToolsToolId) {\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools') as\n | (HTMLElement & { activateTool?: (tool: PanelToolsToolId) => Promise<void> })\n | null;\n await tools?.activateTool?.(id);\n }\n\n /** Close whichever managed global surface is currently visible. */\n @Method()\n async closeGlobalSurface() {\n if (this.managedMobileSheetNavOpen) {\n this.managedMobileSheetNavOpen = false;\n return;\n }\n const tools = this.el.querySelector('ds-shell-tools, ds-panel-tools') as\n | (HTMLElement & { closeDrawer?: () => Promise<void> })\n | null;\n await tools?.closeDrawer?.();\n }\n\n /** Request drawer or fullscreen presentation for the active managed tool. */\n @Method()\n async setToolPresentation(presentation: 'drawer' | 'fullscreen') {\n this.managedToolPresentation = presentation;\n this.toolsFullscreen = presentation === 'fullscreen';\n }\n\n private handleManagedNavSelect = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsNavSelect.emit(event.detail);\n };\n\n private handleManagedTabChange = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsTabChange.emit(event.detail);\n };\n\n private handleManagedPageBack = (event: CustomEvent<MouseEvent>) => {\n event.stopPropagation();\n this.dsPageBack.emit(event.detail);\n };\n\n private handleManagedBreadcrumbSelect = (\n event: CustomEvent<BreadcrumbSelectDetail>\n ) => {\n event.stopPropagation();\n const forwarded = this.dsBreadcrumbSelect.emit(event.detail);\n if (forwarded.defaultPrevented) event.preventDefault();\n };\n\n private handleManagedSubsectionChange = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsSubsectionChange.emit(event.detail);\n };\n\n private handleManagedPageAction = (event: CustomEvent<string>) => {\n event.stopPropagation();\n this.dsPageAction.emit(event.detail);\n };\n\n private handleManagedToolChange = (\n event: CustomEvent<{ id: PanelToolsToolId; selected: boolean }>\n ) => {\n event.stopPropagation();\n const { id, selected } = event.detail;\n this.managedActiveTool = id;\n this.managedToolsOpen = selected;\n const item = this.resolvedToolItems.find(candidate => candidate.id === id);\n if (item?.mobileDestination === 'inbox' || isShellInboxTool(id)) {\n this.managedInboxTool = id;\n }\n this.managedMobileDestination = selected\n ? (item?.mobileDestination ?? shellMobileDestinationForTool(true, id))\n : 'area';\n this.managedMobileSheetNavOpen = false;\n this.dsToolChange.emit(event.detail);\n };\n\n private handleManagedPresentationChange = (\n event: CustomEvent<{ presentation: 'drawer' | 'fullscreen' }>\n ) => {\n event.stopPropagation();\n this.managedToolPresentation = event.detail.presentation;\n this.toolsFullscreen = event.detail.presentation === 'fullscreen';\n this.dsPresentationChange.emit(event.detail);\n };\n\n private handleManagedHeaderBack = (event: CustomEvent<{ tool: PanelToolsToolId }>) => {\n event.stopPropagation();\n this.dsHeaderBack.emit(event.detail);\n };\n\n private handleManagedHeaderAction = (\n event: CustomEvent<{ tool: PanelToolsToolId; id: string }>\n ) => {\n event.stopPropagation();\n this.dsHeaderAction.emit(event.detail);\n };\n\n private handleManagedSheetToggle = (event: CustomEvent<boolean>) => {\n event.stopPropagation();\n this.managedMobileSheetNavOpen = event.detail;\n };\n\n private activateManagedMobileTool(destination: Exclude<MobileDestination, 'area'>): boolean {\n const canonicalId =\n destination === 'inbox'\n ? resolveAvailableInboxTool(this.managedInboxTool, this.availableInboxTools)\n : destination;\n if (!canonicalId) return false;\n\n const item = this.resolvedToolItems.find(\n candidate =>\n candidate.id === canonicalId ||\n (destination !== 'inbox' && candidate.mobileDestination === destination)\n );\n if (!item || item.isInactive) return false;\n\n const id = item.id;\n this.managedActiveTool = id;\n this.managedToolsOpen = true;\n if (isShellInboxTool(id)) this.managedInboxTool = id;\n this.dsToolChange.emit({ id: id as PanelToolsToolId, selected: true });\n return true;\n }\n\n private handleManagedMobileDestination = (\n event: CustomEvent<MobileBarNavDestinationDetail>\n ) => {\n event.stopPropagation();\n const destination = event.detail.destination;\n this.managedMobileSheetNavOpen = false;\n this.managedMobileDestination = destination;\n\n if (destination === 'area') {\n this.managedToolsOpen = false;\n return;\n }\n\n this.activateManagedMobileTool(destination);\n };\n\n private handleManagedAreaSelect = (event: CustomEvent<string>) => {\n event.stopPropagation();\n if (event.detail === 'help') {\n this.managedMobileSheetNavOpen = false;\n this.managedMobileDestination = 'help';\n if (this.activateManagedMobileTool('help')) return;\n }\n\n this.managedMobileSheetNavOpen = false;\n this.managedMobileDestination = 'area';\n this.managedToolsOpen = false;\n this.dsNavSelect.emit(event.detail);\n };\n\n private handleManagedBrowseContext = (event: CustomEvent<NavChromeStyle>) => {\n event.stopPropagation();\n this.managedBrowseContext = event.detail;\n this.dsBrowseContextChange.emit(event.detail);\n };\n\n private handleManagedSheetClose = (event: CustomEvent<void>) => {\n event.stopPropagation();\n this.managedMobileSheetNavOpen = false;\n };\n\n private handleManagedNavFooterAction = (event: CustomEvent<void>) => {\n event.stopPropagation();\n this.dsNavFooterAction.emit();\n };\n\n private handleManagedNavUserAction = (\n event: CustomEvent<PanelNavUserActionDetail>\n ) => {\n event.stopPropagation();\n this.dsNavUserAction.emit(event.detail);\n };\n\n private get currentArea(): PanelNavItem {\n const groups = [\n ...(this.navigation.dashboardGroups ?? []),\n ...(this.navigation.settingsGroups ?? []),\n ...this.resolvedNavigationGroups,\n ];\n const items = groups.flatMap(group => group.items);\n const activeId =\n this.navigation.activeId ||\n deriveActiveIdFromUrl(\n this.navigation.currentUrl ?? this.pageChrome.currentUrl ?? '',\n items\n );\n return (\n items.find(item => item.id === activeId) ??\n items[0] ?? {\n id: 'area',\n icon: 'MapPage',\n label: this.pageChrome.heading || 'Area',\n }\n );\n }\n\n private toolDot(id: PanelToolsToolId): boolean {\n return this.resolvedToolItems.find(item => item.id === id)?.dot ?? false;\n }\n\n private syncChrome() {\n const panelNav = this.el.querySelector('ds-panel-nav') as HTMLElement | null;\n const bar = this.el.querySelector('ds-bar-nav') as HTMLElement | null;\n const targets = [this.el, panelNav, bar].filter((el): el is HTMLElement => el !== null);\n\n const clearLayoutVars = () => {\n if (panelNav) panelNav.style.removeProperty(SHELL_GRADIENT_POSITION_PANEL_VAR);\n if (bar) bar.style.removeProperty(SHELL_GRADIENT_POSITION_BAR_VAR);\n };\n\n const preset = normalizeShellGradientPreset(this.gradientPreset);\n if (preset === 'none' || this.resolvedMode === 'mobile') {\n this.clearGradientPaintVars(targets);\n clearLayoutVars();\n return;\n }\n\n const viewport = this.resolveViewportDimensions();\n const panelWidth = this.resolvePanelWidthPx(panelNav);\n\n const panelPosition = shellGradientPositionPanel();\n const barPosition = shellGradientPositionBar(panelWidth);\n\n this.syncChromeLayoutVars(panelNav, bar, panelPosition, barPosition);\n\n const image = buildShellRadialGradient(preset);\n\n const size = shellGradientSize({\n width: viewport.width,\n height: viewport.height,\n });\n const opacity = shellGradientPresetOpacity(preset);\n\n for (const target of targets) {\n if (target === this.el) {\n this.applyGradientVars(target, {\n [SHELL_GRADIENT_IMAGE_VAR]: image,\n [SHELL_GRADIENT_SIZE_VAR]: size,\n [SHELL_GRADIENT_POSITION_PANEL_VAR]: panelPosition,\n [SHELL_GRADIENT_POSITION_BAR_VAR]: barPosition,\n [SHELL_GRADIENT_OPACITY_VAR]: opacity,\n });\n continue;\n }\n\n const isBar = target.tagName.toLowerCase() === 'ds-bar-nav';\n this.applyGradientVars(target, {\n [SHELL_GRADIENT_IMAGE_VAR]: image,\n [SHELL_GRADIENT_SIZE_VAR]: size,\n [SHELL_GRADIENT_OPACITY_VAR]: opacity,\n [SHELL_GRADIENT_POSITION_PANEL_VAR]: isBar ? null : panelPosition,\n [SHELL_GRADIENT_POSITION_BAR_VAR]: isBar ? barPosition : null,\n });\n }\n }\n\n private renderManagedPanelNav() {\n const navigation = this.navigation;\n return (\n <ds-panel-nav\n navStyle={this.navStyle}\n groups={this.resolvedNavigationGroups}\n breakpoint={SHELL_DESKTOP_BREAKPOINT}\n routerMode={navigation.routerMode ?? 'event'}\n activeId={navigation.activeId ?? ''}\n currentUrl={navigation.currentUrl ?? this.pageChrome.currentUrl ?? ''}\n storageKey={navigation.storageKey ?? ''}\n userName={navigation.userName ?? ''}\n userInitial={navigation.userInitial ?? ''}\n accountMenuExpanded={navigation.accountMenuExpanded ?? false}\n dashboardLabel={navigation.dashboardLabel ?? 'Dashboard'}\n settingsLabel={navigation.settingsLabel ?? 'Settings'}\n accountLabel={navigation.accountLabel ?? 'Account'}\n dashboardNavigationLabel={\n navigation.dashboardNavigationLabel ?? 'Dashboard navigation'\n }\n settingsNavigationLabel={\n navigation.settingsNavigationLabel ?? 'Settings navigation'\n }\n navigationItemsLabel={navigation.navigationLabel ?? 'Navigation items'}\n onDsNavSelect={this.handleManagedNavSelect}\n onDsNavFooterAction={this.handleManagedNavFooterAction}\n onDsNavUserAction={this.handleManagedNavUserAction}\n />\n );\n }\n\n private renderManagedBarNav() {\n return (\n <ds-bar-nav\n navStyle={this.navStyle}\n tabs={this.pageChrome.tabs ?? []}\n value={this.pageChrome.value ?? ''}\n heading={this.pageChrome.routeHeading ?? this.pageChrome.heading}\n basePath={this.pageChrome.basePath ?? ''}\n currentUrl={this.pageChrome.currentUrl ?? this.navigation.currentUrl ?? ''}\n onDsTabChange={this.handleManagedTabChange}\n />\n );\n }\n\n private renderManagedToolSlots() {\n const ids = [...new Set(this.resolvedToolItems.map(item => item.id))].sort();\n return ids.flatMap(id => [\n <slot key={`tool:${id}`} name={id} slot={id} />,\n <slot key={`tool-view:${id}`} name={`${id}-view`} slot={`${id}-view`} />,\n ]);\n }\n\n private renderManagedTools() {\n const tools = this.tools;\n return (\n <ds-shell-tools\n responsiveMode={this.resolvedMode}\n open={this.managedToolsOpen}\n activeTool={this.managedActiveTool}\n presentation={this.managedToolPresentation}\n fullscreenHeaderMode={tools.fullscreenHeaderMode ?? 'shared'}\n items={this.resolvedToolItems}\n headers={tools.headers ?? {}}\n storageKey={tools.storageKey ?? ''}\n toolsLabel={tools.toolsLabel ?? 'Tools'}\n toolShortcutsLabel={tools.toolShortcutsLabel ?? 'Tool shortcuts'}\n inboxLabel={tools.inboxLabel ?? 'Inbox'}\n inboxNavigationLabel={tools.inboxNavigationLabel ?? 'Inbox sections'}\n onDsToolChange={this.handleManagedToolChange}\n onDsPresentationChange={this.handleManagedPresentationChange}\n onDsHeaderBack={this.handleManagedHeaderBack}\n onDsHeaderAction={this.handleManagedHeaderAction}\n >\n {this.renderManagedToolSlots()}\n </ds-shell-tools>\n );\n }\n\n private renderManagedMobileSheetNav() {\n const navigation = this.navigation;\n return (\n <ds-mobile-sheet-nav\n open={this.managedMobileSheetNavOpen}\n browseContext={this.managedBrowseContext}\n dashboardGroups={navigation.dashboardGroups ?? navigation.groups ?? []}\n settingsGroups={navigation.settingsGroups ?? []}\n currentUrl={navigation.currentUrl ?? this.pageChrome.currentUrl ?? ''}\n routeSelectionActive={this.managedMobileDestination === 'area'}\n navigationLabel={navigation.navigationLabel ?? 'Application navigation'}\n dashboardLabel={navigation.dashboardLabel ?? 'Dashboard'}\n settingsLabel={navigation.settingsLabel ?? 'Settings'}\n accountLabel={navigation.accountLabel ?? 'Account'}\n showAccount={navigation.showMobileAccount ?? true}\n onDsAreaSelect={this.handleManagedAreaSelect}\n onDsBrowseContextChange={this.handleManagedBrowseContext}\n onDsClose={this.handleManagedSheetClose}\n />\n );\n }\n\n private renderManagedMobileBarNav() {\n return (\n <ds-mobile-bar-nav\n hidden={this.tools.mobileBarHidden ?? false}\n activeDestination={this.managedMobileDestination}\n currentArea={this.currentArea}\n sheetNavExpanded={this.managedMobileSheetNavOpen}\n searchLabel={this.tools.items?.find(item => item.id === 'search')?.ariaLabel ?? 'Search'}\n inboxLabel={this.tools.inboxLabel ?? 'Inbox'}\n messagesLabel={this.tools.items?.find(item => item.id === 'messages')?.ariaLabel ?? 'Messages'}\n agentsLabel={this.tools.items?.find(item => item.id === 'agents')?.ariaLabel ?? 'Agents'}\n helpLabel={this.tools.items?.find(item => item.id === 'help')?.ariaLabel ?? 'Help & Support'}\n searchDot={this.toolDot('search')}\n inboxDot={\n this.toolDot('stacks') || this.toolDot('activity')\n }\n messagesDot={this.toolDot('messages')}\n agentsDot={this.toolDot('agents')}\n onDsSheetNavToggle={this.handleManagedSheetToggle}\n onDsDestinationChange={this.handleManagedMobileDestination}\n />\n );\n }\n\n private renderManagedMobileLeading() {\n if (!this.pageChrome.showBack) {\n return <slot name=\"page-header-leading\" slot=\"leading\" />;\n }\n return [\n <ds-tooltip\n slot=\"leading\"\n label={this.pageChrome.backAriaLabel ?? 'Back'}\n side=\"bottom\"\n size=\"sm\"\n >\n <ds-button-unfilled\n variant=\"icon\"\n icon={this.pageChrome.backIcon ?? 'ChevronLeft'}\n size=\"md\"\n aria-label={this.pageChrome.backAriaLabel ?? 'Back'}\n activeFill={false}\n hasBorder={false}\n onDsClick={(event: CustomEvent<MouseEvent>) =>\n this.dsPageBack.emit(event.detail)\n }\n />\n </ds-tooltip>,\n <slot name=\"page-header-leading\" slot=\"leading\" />,\n ];\n }\n\n private renderManagedMobileActions() {\n const actions = this.pageChrome.mobileActions ?? [];\n return [\n ...actions.map((action: PanelToolsHeaderAction) => (\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 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={() => this.dsPageAction.emit(action.id)}\n />\n </ds-tooltip>\n )),\n <slot name=\"page-header-trailing\" slot=\"trailing\" />,\n ];\n }\n\n private renderManagedPage() {\n const page = this.pageChrome;\n const mobileSections = page.showBack ? [] : (page.tabs ?? []);\n const barTitleSections: BarTitleSectionItem[] = (page.subsections ?? []).map(item =>\n 'type' in item\n ? { type: 'divider' }\n : {\n id: item.id,\n label: item.label,\n isInactive: item.isInactive,\n }\n );\n return (\n <ds-shell-page\n responsiveMode={this.resolvedMode}\n headerCapacity={resolveManagedShellPageCapacity(\n this.resolvedMode,\n this.managedToolsOpen || this.managedToolsClosing\n )}\n contentInset={page.contentInset ?? 'default'}\n contentInsetBlockStart={page.contentInsetBlockStart ?? 'default'}\n contentInsetBlockStartSize={page.contentInsetBlockStartSize}\n compactContentInsetBlockStartSize={page.compactContentInsetBlockStartSize}\n scrollCompaction={page.scrollCompaction ?? true}\n contentSurface={page.contentSurface ?? 'primary'}\n >\n <ds-bar-title\n slot=\"header\"\n heading={page.heading ?? ''}\n description={page.description ?? ''}\n showBack={page.showBack ?? false}\n backAriaLabel={page.backAriaLabel ?? 'Back'}\n backLabel={page.backLabel ?? 'Back'}\n breadcrumbs={page.breadcrumbs ?? []}\n breadcrumbAriaLabel={page.breadcrumbAriaLabel ?? 'Breadcrumb'}\n sections={barTitleSections}\n value={page.subvalue ?? ''}\n sectionsAriaLabel={page.subsectionsAriaLabel ?? 'Change page subsection'}\n primaryAction={page.primaryAction ?? null}\n actions={page.actions ?? []}\n actionsAriaLabel={page.actionsAriaLabel ?? 'More page actions'}\n showDivider={page.showHeaderDivider ?? true}\n showCompactDivider={page.showCompactHeaderDivider}\n onDsBack={this.handleManagedPageBack}\n onDsBreadcrumbSelect={this.handleManagedBreadcrumbSelect}\n onDsSectionChange={this.handleManagedSubsectionChange}\n onDsAction={this.handleManagedPageAction}\n />\n <ds-mobile-header\n slot=\"mobile-header\"\n heading={page.heading ?? ''}\n headingLevel={page.headingLevel ?? 'h1'}\n sections={mobileSections}\n value={page.showBack ? '' : (page.value ?? '')}\n sectionsAriaLabel={page.sectionsAriaLabel ?? 'Change page section'}\n subsections={page.subsections ?? []}\n subvalue={page.subvalue ?? ''}\n subsectionsAriaLabel={\n page.subsectionsAriaLabel ?? 'Change page subsection'\n }\n tone={page.tone ?? 'default'}\n onDsSectionChange={this.handleManagedTabChange}\n onDsSubsectionChange={this.handleManagedSubsectionChange}\n >\n {this.renderManagedMobileLeading()}\n {this.renderManagedMobileActions()}\n </ds-mobile-header>\n <slot />\n </ds-shell-page>\n );\n }\n\n private renderSlottedShell(\n shellCls: Record<string, boolean>,\n mobile: boolean,\n mobileToolActive: boolean,\n mobileStageBlocked: boolean,\n fullscreen: boolean\n ) {\n return (\n <Host class={shellCls} responsive-mode={this.resolvedMode}>\n <div class=\"shell-app__banner\">\n <slot name=\"banner\" />\n </div>\n <div class=\"shell-app__row\">\n <div class=\"shell-app__chrome\" aria-hidden=\"true\" />\n <div\n class=\"shell-app__panel\"\n aria-hidden={fullscreen ? 'true' : undefined}\n inert={fullscreen ? true : undefined}\n >\n <slot name=\"panel\" />\n </div>\n <div class=\"shell-app__main\">\n <div\n class=\"shell-app__bar\"\n aria-hidden={fullscreen ? 'true' : undefined}\n inert={fullscreen ? true : undefined}\n >\n <slot name=\"bar\" />\n </div>\n <div\n class=\"shell-app__tools\"\n aria-hidden={\n mobile && (!mobileToolActive || this.mobileSheetNavOpen)\n ? 'true'\n : undefined\n }\n inert={\n mobile && (!mobileToolActive || this.mobileSheetNavOpen)\n ? true\n : undefined\n }\n hidden={mobile && !mobileToolActive}\n >\n <slot name=\"tools\" />\n </div>\n <div\n class=\"shell-app__content ds-focus-ring\"\n aria-hidden={fullscreen || mobileStageBlocked ? 'true' : undefined}\n inert={fullscreen || mobileStageBlocked ? true : undefined}\n tabIndex={0}\n >\n <slot />\n </div>\n <div\n class=\"shell-app__mobile-sheet-nav\"\n hidden={!mobile || !this.mobileSheetNavOpen}\n aria-hidden={\n mobile && this.mobileSheetNavOpen ? undefined : 'true'\n }\n inert={mobile && this.mobileSheetNavOpen ? undefined : true}\n >\n <slot name=\"mobile-sheet-nav\" />\n </div>\n <div class=\"shell-app__mobile-bar-nav\" hidden={!mobile}>\n <slot name=\"mobile-bar-nav\" />\n </div>\n </div>\n </div>\n </Host>\n );\n }\n\n render() {\n const chromeActive = this.chromeLayerActive();\n const mobile = this.resolvedMode === 'mobile';\n const mobileToolActive = mobile && this.effectiveMobileDestination !== 'area';\n const mobileStageBlocked =\n mobile && (mobileToolActive || this.effectiveMobileSheetNavOpen);\n const fullscreen = !mobile && this.toolsFullscreen;\n const shellCls: Record<string, boolean> = {\n 'shell-app': true,\n 'shell-app--gradient': chromeActive,\n [`shell-app--${this.navStyle}`]: true,\n [`shell-app--${this.resolvedMode}`]: true,\n 'shell-app--tools-fullscreen': fullscreen,\n 'shell-app--mobile-tool-active': mobileToolActive,\n 'shell-app--mobile-sheet-nav-open':\n mobile && this.effectiveMobileSheetNavOpen,\n 'shell-app--managed': this.managed,\n 'shell-app--slotted': !this.managed,\n };\n\n if (!this.managed) {\n return this.renderSlottedShell(\n shellCls,\n mobile,\n mobileToolActive,\n mobileStageBlocked,\n fullscreen\n );\n }\n\n return (\n <Host class={shellCls} responsive-mode={this.resolvedMode}>\n <div class=\"shell-app__banner\">\n <slot name=\"banner\" />\n </div>\n <div class=\"shell-app__row\">\n <div class=\"shell-app__chrome\" aria-hidden=\"true\" />\n <div class=\"shell-app__panel\" aria-hidden={fullscreen ? 'true' : undefined} inert={fullscreen ? true : undefined}>\n {this.renderManagedPanelNav()}\n </div>\n <div class=\"shell-app__main\">\n <div class=\"shell-app__bar\" aria-hidden={fullscreen ? 'true' : undefined} inert={fullscreen ? true : undefined}>\n {this.renderManagedBarNav()}\n </div>\n <div\n class=\"shell-app__tools\"\n aria-hidden={\n mobile && (!mobileToolActive || this.effectiveMobileSheetNavOpen)\n ? 'true'\n : undefined\n }\n inert={\n mobile && (!mobileToolActive || this.effectiveMobileSheetNavOpen)\n ? true\n : undefined\n }\n hidden={mobile && !mobileToolActive}\n >\n {this.renderManagedTools()}\n </div>\n <div\n class=\"shell-app__content ds-focus-ring\"\n aria-hidden={fullscreen || mobileStageBlocked ? 'true' : undefined}\n inert={fullscreen || mobileStageBlocked ? true : undefined}\n tabIndex={0}\n >\n {this.renderManagedPage()}\n </div>\n <div\n class=\"shell-app__mobile-sheet-nav\"\n hidden={!mobile || !this.effectiveMobileSheetNavOpen}\n aria-hidden={\n mobile && this.effectiveMobileSheetNavOpen ? undefined : 'true'\n }\n inert={mobile && this.effectiveMobileSheetNavOpen ? undefined : true}\n >\n {this.renderManagedMobileSheetNav()}\n </div>\n <div class=\"shell-app__mobile-bar-nav\" hidden={!mobile}>\n {this.renderManagedMobileBarNav()}\n </div>\n </div>\n </div>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{S as o,d as s}from"./p-
|
|
1
|
+
import{S as o,d as s}from"./p-DmZupC1-.js";const p=o;const t=s;export{p as DsShellPage,t as defineCustomElement};
|
|
2
2
|
//# sourceMappingURL=ds-shell-page.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{S as s,d as o}from"./p-
|
|
1
|
+
import{S as s,d as o}from"./p-CTVMXN9s.js";const t=s;const p=o;export{t as DsShellTools,p as defineCustomElement};
|
|
2
2
|
//# sourceMappingURL=ds-shell-tools.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{T as o,d as s}from"./p-
|
|
1
|
+
import{T as o,d as s}from"./p-CbfmzgdW.js";const t=o;const m=s;export{t as DsTabGroup,m as defineCustomElement};
|
|
2
2
|
//# sourceMappingURL=ds-tab-group.js.map
|