@loomweaver/shell 0.7.2
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/README.md +49 -0
- package/fesm2022/loomweaver-shell.mjs +17016 -0
- package/fesm2022/loomweaver-shell.mjs.map +1 -0
- package/i18n/de.json +293 -0
- package/i18n/en.json +293 -0
- package/package.json +68 -0
- package/styles/shell.css +9 -0
- package/styles/theme.css +709 -0
- package/types/loomweaver-shell.d.ts +2280 -0
- package/types/loomweaver-shell.d.ts.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loomweaver-shell.mjs","sources":["../../../../../libs/core/shell/src/lib/layout/layout.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-address.ts","../../../../../libs/core/shell/src/lib/popout/popout-path.ts","../../../../../libs/core/shell/src/lib/foundation/identified.ts","../../../../../libs/core/shell/src/lib/plugin/route-omit.ts","../../../../../libs/core/shell/src/lib/plugin/surface-normalize.ts","../../../../../libs/core/shell/src/lib/plugin/contribution-registry.ts","../../../../../libs/core/shell/src/lib/regions/content/content-path.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/container-children.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-surface.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retention-policy.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/content-reuse-strategy.ts","../../../../../libs/core/shell/src/lib/persistence/key-value-store.ts","../../../../../libs/core/shell/src/lib/persistence/state-sync-channel.ts","../../../../../libs/core/shell/src/lib/persistence/cross-tab-sync-store.ts","../../../../../libs/core/shell/src/lib/persistence/port-store-provider.ts","../../../../../libs/core/shell/src/lib/persistence/working-state-store.ts","../../../../../libs/core/shell/src/lib/workspace/provide-workspaces.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-area-tree.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-claims.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-node.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-queries.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-ratio.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-restore.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-definition.ts","../../../../../libs/core/shell/src/lib/workspace/active-workspace.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/atomic-move.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retained-view-stash.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retention-candidates.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retention-unload-guard.ts","../../../../../libs/core/shell/src/lib/auth/identity-change.ts","../../../../../libs/core/shell/src/lib/auth/auth-context.ts","../../../../../libs/core/shell/src/lib/foundation/shell-features.ts","../../../../../libs/core/shell/src/lib/commands/keybinding.ts","../../../../../libs/core/shell/src/lib/commands/format-chord.ts","../../../../../libs/core/shell/src/lib/commands/command.service.ts","../../../../../libs/core/shell/src/lib/elements/custom-element-property.ts","../../../../../libs/core/shell/src/lib/elements/menu/lw-menu.element.ts","../../../../../libs/core/shell/src/lib/menu/menu.service.ts","../../../../../libs/core/shell/src/lib/menu/context-menu.directive.ts","../../../../../libs/core/shell/src/lib/regions/bar/bar-context.ts","../../../../../libs/core/shell/src/lib/regions/bar/shell-bar-item.ts","../../../../../libs/core/shell/src/lib/regions/bar/shell-bar-item.html","../../../../../libs/core/shell/src/lib/regions/bar/shell-bar.ts","../../../../../libs/core/shell/src/lib/regions/bar/shell-bar.html","../../../../../libs/core/shell/src/lib/menu/menu-context.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-context-menu.ts","../../../../../libs/core/shell/src/lib/persistence/settings-store.ts","../../../../../libs/core/shell/src/lib/persistence/hydrate.ts","../../../../../libs/core/shell/src/lib/persistence/state-sync.service.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-items.service.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-move.service.ts","../../../../../libs/core/shell/src/lib/regions/reorder/reorderable.directive.ts","../../../../../libs/core/shell/src/lib/regions/reorder/user-order.service.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-close-hooks.ts","../../../../../libs/core/shell/src/lib/regions/pane/drag/pane-label.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/content-tab-projection.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-address.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-tree-storage.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-structure.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-tabs.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-tree.service.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/open-tabs.service.ts","../../../../../libs/core/shell/src/lib/dialog/dialog.service.ts","../../../../../libs/core/shell/src/lib/notifications/notification.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/close/close-veto-dialog.ts","../../../../../libs/core/shell/src/lib/regions/pane/close/unsaved-changes-dialog.ts","../../../../../libs/core/shell/src/lib/regions/pane/close/surface-close-guard.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-closing.service.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/content-tabs.service.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/boot-address.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-views.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/hidden-views.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-group.service.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-warnings.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-changes.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-initials.ts","../../../../../libs/core/shell/src/lib/workspace/workspace.service.ts","../../../../../libs/core/shell/src/lib/regions/rail/shell-rail.ts","../../../../../libs/core/shell/src/lib/regions/rail/shell-rail.html","../../../../../libs/core/shell/src/lib/views/view-state.service.ts","../../../../../libs/core/shell/src/lib/views/view-instance.service.ts","../../../../../libs/core/shell/src/lib/views/view-mount.service.ts","../../../../../libs/core/shell/src/lib/views/component-loader.service.ts","../../../../../libs/core/shell/src/lib/views/view-instance-switcher.ts","../../../../../libs/core/shell/src/lib/views/view-instance-switcher.html","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-chrome.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/container-context.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/container-layout.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/pane-containers.service.ts","../../../../../libs/core/shell/src/lib/regions/content/pane-targets.ts","../../../../../libs/core/shell/src/lib/regions/pane/drag/pane-drag.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/drag/settle-moved-tree.ts","../../../../../libs/core/shell/src/lib/regions/pane/drag/pane-move.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-tab-strip.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-tab-strip.html","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-toolbar.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-toolbar.html","../../../../../libs/core/shell/src/lib/regions/content/access/auth-required-view.ts","../../../../../libs/core/shell/src/lib/regions/content/access/auth-required-view.html","../../../../../libs/core/shell/src/lib/regions/content/access/route-unavailable-view.ts","../../../../../libs/core/shell/src/lib/regions/content/access/route-unavailable-view.html","../../../../../libs/core/shell/src/lib/i18n/locale.service.ts","../../../../../libs/core/shell/src/lib/plugin/plugin-state.service.ts","../../../../../libs/core/shell/src/lib/theme/theme.service.ts","../../../../../libs/core/shell/src/lib/theme/theme-registry-global.ts","../../../../../libs/core/shell/src/lib/theme/theme-registry.ts","../../../../../libs/core/shell/src/lib/text-size/font-scale.service.ts","../../../../../libs/core/shell/src/lib/elements/icon/loom-icons.ts","../../../../../libs/core/shell/src/lib/elements/icon/icon-registry-global.ts","../../../../../libs/core/shell/src/lib/permissions/capability-grants.ts","../../../../../libs/core/shell/src/lib/persistence/persisted-id-set.ts","../../../../../libs/core/shell/src/lib/permissions/capability-grant.service.ts","../../../../../libs/core/shell/src/lib/foundation/plugin-isolation-level.ts","../../../../../libs/core/shell/src/lib/regions/content/iframe-surface.ts","../../../../../libs/core/shell/src/lib/regions/content/iframe-surface.html","../../../../../libs/core/shell/src/lib/regions/content/routing/synthetic-route.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/surface-injector.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retained-component.ts","../../../../../libs/core/shell/src/lib/regions/content/content-secondary-pane.ts","../../../../../libs/core/shell/src/lib/regions/content/content-secondary-pane.html","../../../../../libs/core/shell/src/lib/regions/content/pane-target-picker.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/view-context-menu.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-view-options.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-view.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-view.html","../../../../../libs/core/shell/src/lib/regions/pane/drag/pane-drop-zones.ts","../../../../../libs/core/shell/src/lib/regions/pane/drag/pane-drop-zones.html","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-minimized-strip.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-minimized-strip.html","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-split-handle.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retained-template.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-tree-view.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-tree-view.html","../../../../../libs/core/shell/src/lib/layout/viewport.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-state.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-size.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-splitter.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-splitter.html","../../../../../libs/core/shell/src/lib/regions/panel/shell-panel.ts","../../../../../libs/core/shell/src/lib/regions/panel/shell-panel.html","../../../../../libs/core/shell/src/lib/regions/panel/shell-sidebar-header.ts","../../../../../libs/core/shell/src/lib/regions/panel/shell-sidebar-header.html","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-context-menu.ts","../../../../../libs/core/shell/src/lib/regions/content/content-area.ts","../../../../../libs/core/shell/src/lib/regions/content/content-area.html","../../../../../libs/core/shell/src/lib/regions/content/content-grid.ts","../../../../../libs/core/shell/src/lib/regions/content/content-grid.html","../../../../../libs/core/shell/src/lib/elements/button/lw-button-classes.ts","../../../../../libs/core/shell/src/lib/elements/button/lw-button.ts","../../../../../libs/core/shell/src/lib/notifications/toast-outlet.ts","../../../../../libs/core/shell/src/lib/notifications/toast-outlet.html","../../../../../libs/core/shell/src/lib/elements/spinner/lw-spinner.ts","../../../../../libs/core/shell/src/lib/elements/spinner/lw-spinner.html","../../../../../libs/core/shell/src/lib/dialog/dialog-outlet.ts","../../../../../libs/core/shell/src/lib/dialog/dialog-outlet.html","../../../../../libs/core/shell/src/lib/popout/popout.service.ts","../../../../../libs/core/shell/src/lib/shell.ts","../../../../../libs/core/shell/src/lib/shell.html","../../../../../libs/core/shell/src/lib/settings/settings-registry.ts","../../../../../libs/core/shell/src/lib/settings/lw-setting-row.ts","../../../../../libs/core/shell/src/lib/settings/lw-setting-row.html","../../../../../libs/core/shell/src/lib/settings/settings-dialog.ts","../../../../../libs/core/shell/src/lib/settings/settings-dialog.html","../../../../../libs/core/shell/src/lib/settings/settings.service.ts","../../../../../libs/core/shell/src/lib/settings/setting-omit.ts","../../../../../libs/core/shell/src/lib/i18n/missing-translation-handler.ts","../../../../../libs/core/shell/src/lib/i18n/transloco-loader.ts","../../../../../libs/core/shell/src/lib/elements/icon/lw-icon.element.ts","../../../../../libs/core/shell/src/lib/foundation/bar-item.ts","../../../../../libs/core/shell/src/lib/regions/bar/shell-brand.ts","../../../../../libs/core/shell/src/lib/regions/bar/shell-brand.html","../../../../../libs/core/shell/src/lib/i18n/language-switcher.ts","../../../../../libs/core/shell/src/lib/i18n/language-switcher.html","../../../../../libs/core/shell/src/lib/theme/theme-toggle.ts","../../../../../libs/core/shell/src/lib/theme/theme-toggle.html","../../../../../libs/core/shell/src/lib/version/app-version.ts","../../../../../libs/core/shell/src/lib/version/version.service.ts","../../../../../libs/core/shell/src/lib/version/lw-version.ts","../../../../../libs/core/shell/src/lib/version/lw-version.html","../../../../../libs/core/shell/src/lib/update/update.service.ts","../../../../../libs/core/shell/src/lib/update/update-badge.ts","../../../../../libs/core/shell/src/lib/update/update-badge.html","../../../../../libs/core/shell/src/lib/regions/bar/default-bar-items.ts","../../../../../libs/core/shell/src/lib/foundation/rail-item.ts","../../../../../libs/core/shell/src/lib/layout/view.ts","../../../../../libs/core/shell/src/lib/permissions/capability-refusal.ts","../../../../../libs/core/shell/src/lib/foundation/command-invoker.ts","../../../../../libs/core/shell/src/lib/foundation/workspace-claims.ts","../../../../../libs/core/shell/src/lib/foundation/command-arguments.ts","../../../../../libs/core/shell/src/lib/commands/command-invocation.service.ts","../../../../../libs/core/shell/src/lib/commands/keybinding.service.ts","../../../../../libs/core/shell/src/lib/elements/tooltip/lw-tooltip.element.ts","../../../../../libs/core/shell/src/lib/elements/select/lw-select.element.ts","../../../../../libs/core/shell/src/lib/elements/markdown/lw-markdown.element.ts","../../../../../libs/core/shell/src/lib/elements/button/lw-button.element.ts","../../../../../libs/core/shell/src/lib/elements/progress/lw-progress-ring.element.ts","../../../../../libs/core/shell/src/lib/regions/panel/view-move.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/view-visibility.service.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-workspace-entries.ts","../../../../../libs/core/shell/src/lib/layout/app-reset.service.ts","../../../../../libs/core/shell/src/lib/diagnostics/composition-report.ts","../../../../../libs/core/shell/src/lib/text-size/text-size-toggle.ts","../../../../../libs/core/shell/src/lib/text-size/text-size-toggle.html","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-enablement.service.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-disable-guard.ts","../../../../../libs/core/shell/src/lib/plugin-store/installed-plugin.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-deployment.service.ts","../../../../../libs/core/shell/src/lib/permissions/permissions-settings.ts","../../../../../libs/core/shell/src/lib/permissions/permissions-settings.html","../../../../../libs/core/shell/src/lib/default-settings.ts","../../../../../libs/core/shell/src/lib/commands/palette-fuzzy.ts","../../../../../libs/core/shell/src/lib/commands/relative-time.ts","../../../../../libs/core/shell/src/lib/commands/palette-mru.service.ts","../../../../../libs/core/shell/src/lib/commands/command-palette.ts","../../../../../libs/core/shell/src/lib/commands/command-palette.html","../../../../../libs/core/shell/src/lib/workspace/workspace-dialog.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-dialog.html","../../../../../libs/core/shell/src/lib/regions/curation/curation-dialog.ts","../../../../../libs/core/shell/src/lib/regions/curation/curation-dialog.html","../../../../../libs/core/shell/src/lib/shell-seeds.ts","../../../../../libs/core/shell/src/lib/provide-shell.ts","../../../../../libs/core/shell/src/lib/persistence/boot-latched-scope.ts","../../../../../libs/core/shell/src/lib/persistence/identity-scoped-stores.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/container-pane-host.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/container-pane-host.html","../../../../../libs/core/shell/src/lib/regions/content/routing/content-sub-stub.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/surface-route-stub.ts","../../../../../libs/core/shell/src/lib/regions/content/access/content-access.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/settle-workspace.guard.ts","../../../../../libs/core/shell/src/lib/popout/popout-view.ts","../../../../../libs/core/shell/src/lib/popout/popout-view.html","../../../../../libs/core/shell/src/lib/regions/content/routing/content-router.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/container-dock-gc.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retention-gc.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/provide-content-router.ts","../../../../../libs/core/shell/src/lib/commands/command-palette-entry.ts","../../../../../libs/core/shell/src/lib/commands/command-palette-entry.html","../../../../../libs/core/shell/src/lib/commands/provide-command-palette-entry.ts","../../../../../libs/core/shell/src/lib/views/surface-reveal.service.ts","../../../../../libs/core/shell/src/lib/plugin/host-context-warnings.ts","../../../../../libs/core/shell/src/lib/plugin/host-plugin-context.ts","../../../../../libs/core/shell/src/lib/elements/icon/icon-registry.ts","../../../../../libs/core/shell/src/lib/plugin/host-context-factory.ts","../../../../../libs/core/shell/src/lib/plugin/plugin-runtime.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-install.service.ts","../../../../../libs/core/shell/src/lib/plugin/sandbox/sandbox-settings.ts","../../../../../libs/core/shell/src/lib/plugin/sandbox/sandbox-rpc-sanitize.ts","../../../../../libs/core/shell/src/lib/plugin/sandbox/sandbox-rpc-contract.ts","../../../../../libs/core/shell/src/lib/plugin/sandbox/sandbox-plugin-runtime.ts","../../../../../libs/core/shell/src/lib/plugin-store/catalog/plugin-catalog.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-title.ts","../../../../../libs/core/shell/src/lib/plugin-store/catalog/catalog-entries.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/uninstall-confirm.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/consent-deps.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-update.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/update-consent.ts","../../../../../libs/core/shell/src/lib/plugin-store/installed-plugin-list.ts","../../../../../libs/core/shell/src/lib/plugin-store/installed-plugin-list.html","../../../../../libs/core/shell/src/lib/plugin-store/format.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-card.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-card.html","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-detail.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-detail.html","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/install-consent.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-dialog.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-dialog.html","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store.service.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-settings.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-store-settings.html","../../../../../libs/core/shell/src/lib/plugin-store/catalog/provide-plugin-catalog.ts","../../../../../libs/core/shell/src/lib/elements/icon/provide-icons.ts","../../../../../libs/core/shell/src/loomweaver-shell.ts"],"sourcesContent":["import { InjectionToken, Provider } from '@angular/core';\n\n/** Where a region docks in the border topology. */\nexport type DockPosition = 'top' | 'bottom' | 'left' | 'right' | 'center';\n\n/** Region anatomy types. */\nexport type RegionType = 'bar' | 'rail' | 'panel' | 'content';\n\n/** One region the distribution places into the border frame. */\nexport interface LayoutRegion {\n /** Stable id (slot targeting, collapse state, ordering). */\n readonly id: string;\n readonly type: RegionType;\n readonly dock: DockPosition;\n}\n\n/** A distribution's declared base layout — the Core renders it (declarative, Stufe A). */\nexport interface ShellLayout {\n readonly regions: readonly LayoutRegion[];\n}\n\n/**\n * Bare default: a top Bar (header) over the Content-Area, with a status Bar under it.\n *\n * The status bar is not decoration — the shell's own default contributions include one that docks\n * there, and a default aimed at a region the default layout omits renders nothing and reports\n * nothing. Every region a shell default targets belongs here; `tools/check-region-ids.mjs` fails\n * the build when one does not.\n */\nexport const DEFAULT_LAYOUT: ShellLayout = {\n regions: [\n { id: 'top-bar', type: 'bar', dock: 'top' },\n { id: 'main', type: 'content', dock: 'center' },\n { id: 'status-bar', type: 'bar', dock: 'bottom' },\n ],\n};\n\n/** Active layout. Defaults to {@link DEFAULT_LAYOUT}; a distribution overrides it. */\nexport const SHELL_LAYOUT = new InjectionToken<ShellLayout>('SHELL_LAYOUT', {\n providedIn: 'root',\n factory: () => DEFAULT_LAYOUT,\n});\n\n/** A distribution declares its base layout with this provider. */\nexport function provideLayout(layout: ShellLayout): Provider {\n return { provide: SHELL_LAYOUT, useValue: layout };\n}\n","export const PRIMARY_PANE = 'main';\n\nexport const VIEW_PANE_PREFIX = 'view:';\n\nexport const CONTENT_DOCK = 'content';\n\nexport function viewIdOfPanePath(path: string): string | null {\n return path.startsWith(VIEW_PANE_PREFIX)\n ? path.slice(VIEW_PANE_PREFIX.length)\n : null;\n}\n\nexport function viewForPanePath<T extends { readonly id: string }>(\n views: readonly T[],\n path: string,\n): T | undefined {\n const id = viewIdOfPanePath(path);\n return id === null ? undefined : views.find((view) => view.id === id);\n}\n\nexport function promotedContentPath(promoted: string): string {\n return promoted.startsWith(VIEW_PANE_PREFIX) ? '' : promoted;\n}\n","import { VIEW_PANE_PREFIX } from '../regions/pane/tree/pane-address';\n\nexport const POPOUT_PREFIX = 'popout';\n\nconst VIEW_SEGMENT = 'view/';\n\nfunction withoutQuery(url: string): string {\n const end = url.search(/[?#]/);\n return end === -1 ? url : url.slice(0, end);\n}\n\nfunction bare(url: string): string {\n return withoutQuery(url).replace(/^\\/+/, '').replace(/\\/+$/, '');\n}\n\nexport function isPopoutUrl(url: string): boolean {\n const path = bare(url);\n return path === POPOUT_PREFIX || path.startsWith(`${POPOUT_PREFIX}/`);\n}\n\nexport function popoutTargetFromUrl(url: string): string | null {\n if (!isPopoutUrl(url)) {\n return null;\n }\n const rest = bare(url).slice(POPOUT_PREFIX.length).replace(/^\\/+/, '');\n if (rest.startsWith(VIEW_SEGMENT)) {\n return VIEW_PANE_PREFIX + rest.slice(VIEW_SEGMENT.length);\n }\n return rest;\n}\n\nexport function popoutUrlFor(paneTarget: string): string {\n if (paneTarget.startsWith(VIEW_PANE_PREFIX)) {\n const id = paneTarget.slice(VIEW_PANE_PREFIX.length);\n return `/${POPOUT_PREFIX}/${VIEW_SEGMENT}${id}`;\n }\n const path = paneTarget.replace(/^\\/+/, '');\n return path === ''\n ? `/${POPOUT_PREFIX}`\n : `/${POPOUT_PREFIX}/${path}`;\n}\n","export interface Identified {\n readonly id: string;\n}\n\nexport function upsertBy<T>(\n items: readonly T[],\n item: T,\n matches: (existing: T) => boolean,\n): readonly T[] {\n const index = items.findIndex(matches);\n if (index === -1) {\n return [...items, item];\n }\n const next = [...items];\n next[index] = item;\n return next;\n}\n\nexport function upsertById<T extends Identified>(\n items: readonly T[],\n item: T,\n): readonly T[] {\n return upsertBy(items, item, (existing) => existing.id === item.id);\n}\n","import { ContentRoute } from '@loomweaver/plugin-sdk';\n\nexport const ROUTE_OMIT_PREFIX = 'route:';\n\nexport function isRouteOmitted(\n route: ContentRoute,\n omitted: ReadonlySet<string>,\n): boolean {\n return route.id !== undefined && omitted.has(ROUTE_OMIT_PREFIX + route.id);\n}\n","import {\n AccessRequirement,\n ContentRoute,\n Surface,\n SurfacePresentation,\n SurfaceRoutable,\n View,\n ViewAction,\n} from '@loomweaver/plugin-sdk';\n\nexport const CONTAINER_CHILD_REGION = '__container-child';\n\n/**\n * A {@link ContentRoute} as the registry holds it: the plugin's own declaration plus the **host-stamped**\n * id of the plugin that registered it. The id is not part of the authoring contract — a plugin must not be\n * able to claim someone else's identity — so it lives here rather than in `@loomweaver/plugin-sdk`.\n */\nexport type RegisteredContentRoute = ContentRoute & {\n readonly pluginId?: string;\n};\n\n/**\n * A {@link View} as the registry holds it: the plugin's own declaration plus the **host-stamped** id\n * of the plugin that registered it, mirroring {@link RegisteredContentRoute}. The stamp is what lets\n * the retention guards find a plugin's dirty instances before the plugin is disabled or uninstalled.\n */\nexport type RegisteredView = View & {\n readonly pluginId?: string;\n};\n\nexport type RegisteredSurface = SurfacePresentation & {\n readonly id?: string;\n readonly title?: string;\n readonly icon?: string;\n readonly order?: number;\n readonly actions?: readonly ViewAction[];\n readonly access?: AccessRequirement;\n readonly instanceable?: boolean;\n readonly retain?: 'always' | 'never';\n readonly saveOn?: 'hide';\n readonly closable?: boolean;\n readonly padded?: boolean;\n readonly routable?: SurfaceRoutable;\n readonly docks?: readonly string[];\n readonly pluginId?: string;\n};\n\nexport function isRoutableSurface(surface: Surface): boolean {\n return surface.routable !== undefined;\n}\n\nexport function surfaceToEntry(\n surface: Surface,\n pluginId?: string,\n): RegisteredSurface {\n if (!surface.routable) {\n assertDockable(surface);\n }\n return {\n id: surface.id,\n title: surface.title,\n icon: surface.icon,\n order: surface.order,\n actions: surface.actions,\n access: surface.access,\n instanceable: surface.instanceable,\n retain: surface.retain,\n saveOn: surface.saveOn,\n closable: surface.closable,\n padded: surface.padded,\n routable: surface.routable,\n docks: surface.docks,\n pluginId,\n ...presentationOf(surface),\n } as RegisteredSurface;\n}\n\nexport function viewToEntry(view: View, pluginId?: string): RegisteredSurface {\n return {\n id: view.id,\n title: view.title,\n icon: view.icon,\n order: view.order,\n actions: view.actions,\n access: view.access,\n instanceable: view.instanceable,\n retain: view.retain,\n saveOn: view.saveOn,\n closable: view.closable,\n padded: view.padded,\n docks: [view.region],\n pluginId,\n ...presentationOf(view),\n } as RegisteredSurface;\n}\n\nexport function contentRouteToEntry(\n route: ContentRoute,\n pluginId?: string,\n): RegisteredSurface {\n return {\n id: route.id,\n access: route.access,\n retain: route.retain,\n saveOn: route.saveOn,\n closable: route.closable,\n padded: route.padded,\n order: route.order,\n routable: {\n path: route.path,\n chromeless: route.chromeless,\n title: route.title,\n icon: route.icon,\n titleIsLiteral: route.titleIsLiteral,\n subRoutes: route.subRoutes,\n rest: route.rest,\n follows: route.follows,\n },\n pluginId,\n ...presentationOf(route),\n } as RegisteredSurface;\n}\n\nexport function entryToContentRoute(\n entry: RegisteredSurface,\n): RegisteredContentRoute {\n return cached(routeCache, entry, () => {\n const routable = entry.routable;\n if (!routable) {\n throw new Error(\n `Surface \"${entry.id}\" is not routable; it has no content route.`,\n );\n }\n return {\n id: entry.id,\n path: routable.path,\n chromeless: routable.chromeless,\n title: routable.title ?? entry.title,\n icon: routable.icon ?? entry.icon,\n titleIsLiteral: routable.titleIsLiteral,\n order: entry.order,\n subRoutes: routable.subRoutes,\n rest: routable.rest,\n follows: routable.follows,\n access: entry.access,\n retain: entry.retain,\n saveOn: entry.saveOn,\n closable: entry.closable,\n padded: entry.padded,\n pluginId: entry.pluginId,\n ...presentationOf(entry),\n } as RegisteredContentRoute;\n });\n}\n\nexport function entryToView(entry: RegisteredSurface): RegisteredView {\n return cached(viewCache, entry, () => ({\n id: entry.id ?? '',\n region: entry.docks?.[0] ?? CONTAINER_CHILD_REGION,\n title: entry.title ?? '',\n order: entry.order,\n icon: entry.icon,\n actions: entry.actions,\n access: entry.access,\n instanceable: entry.instanceable,\n retain: entry.retain,\n saveOn: entry.saveOn,\n closable: entry.closable,\n padded: entry.padded,\n pluginId: entry.pluginId,\n component: entry.component,\n loadComponent: entry.loadComponent,\n iframe: entry.iframe,\n }));\n}\n\nconst routeCache = new WeakMap<RegisteredSurface, RegisteredContentRoute>();\nconst viewCache = new WeakMap<RegisteredSurface, RegisteredView>();\n\nfunction cached<T extends object>(\n cache: WeakMap<RegisteredSurface, T>,\n entry: RegisteredSurface,\n build: () => T,\n): T {\n const hit = cache.get(entry);\n if (hit) {\n return hit;\n }\n const built = build();\n cache.set(entry, built);\n return built;\n}\n\nfunction assertDockable(surface: Surface): void {\n if (surface.container !== undefined) {\n throw new Error(\n `Surface \"${surface.id}\" is a container but not routable — a container tab holds its own ':id' ` +\n `. Add a routable: { path } declaration.`,\n );\n }\n if (surface.docks === undefined) {\n throw new Error(\n `Surface \"${surface.id}\" is non-routable but declares no docks — it has no home region to dock into. ` +\n `Add docks: ['<regionId>'] (e.g. a panel region), or docks: [] for a container-only child, or make it routable.`,\n );\n }\n}\n\nfunction presentationOf(source: {\n readonly component?: unknown;\n readonly loadComponent?: unknown;\n readonly iframe?: unknown;\n readonly container?: unknown;\n}) {\n if (source.container !== undefined) {\n return { container: source.container };\n }\n if (source.iframe !== undefined) {\n return { iframe: source.iframe };\n }\n return source.loadComponent\n ? { loadComponent: source.loadComponent }\n : { component: source.component };\n}\n","import { computed, Service, signal, Signal, WritableSignal } from '@angular/core';\nimport { Command, ContentRoute, Disposable, MenuItem } from '@loomweaver/plugin-sdk';\nimport { BarItem } from '../foundation/bar-item';\nimport { RailItem } from '../foundation/rail-item';\nimport { View } from '../layout/view';\nimport { Identified, upsertBy, upsertById } from '../foundation/identified';\nimport { isRouteOmitted } from './route-omit';\nimport {\n RegisteredContentRoute,\n RegisteredSurface,\n RegisteredView,\n contentRouteToEntry,\n entryToContentRoute,\n entryToView,\n viewToEntry,\n} from './surface-normalize';\n\nexport type { Disposable } from '@loomweaver/plugin-sdk';\nexport type {\n RegisteredContentRoute,\n RegisteredView,\n} from './surface-normalize';\n\n/**\n * A command as the registry holds it: the declaration a plugin handed in, plus the owner the host\n * stamped on it. The owner is what lets a command be attributed — to let its own plugin reach it\n * without a grant, and to tell a plugin's commands from the shell's own.\n */\nexport interface RegisteredCommand {\n readonly command: Command;\n readonly ownerId?: string;\n}\n\nconst NO_ROUTES: readonly RegisteredContentRoute[] = [];\n\n/**\n * Holds the live UI contributions the regions render. Seeded at startup from the\n * static `provide*` API and (P1.2 loader) added to at runtime by plugins. Signal-\n * based so the regions react to runtime registration/removal.\n *\n * Contributions are keyed by `id`: registering an existing id **overrides** the\n * previous entry in place (last contribution wins — a distribution/plugin can\n * replace a host default by reusing its id), and `remove*ById` drops one (a\n * distribution hides a default it does not want, e.g. via `provideShell({ omit })`).\n *\n * Override is **destructive**, not stacked: the superseded entry is replaced, so disposing\n * the *winning* handle removes the id entirely (it does not restore the entry it replaced),\n * and disposing a *superseded* handle is a no-op. That is fine for today's usage (defaults are\n * overridden at composition time and never disposed); a per-id stack that reveals the previous\n * entry on dispose is the follow-up if a plugin ever overrides a default and is then unloaded.\n */\n@Service()\nexport class ContributionRegistry {\n private readonly commandsSignal = signal<readonly RegisteredCommand[]>([]);\n\n private readonly surfacesSignal = signal<readonly RegisteredSurface[]>([]);\n\n private readonly barItemsSignal = signal<readonly BarItem[]>([]);\n\n private readonly railItemsSignal = signal<readonly RailItem[]>([]);\n\n private readonly menuItemsSignal = signal<readonly MenuItem[]>([]);\n\n private readonly dockedSurfaces = computed(() =>\n this.surfacesSignal().filter((entry) => entry.routable === undefined),\n );\n\n private readonly routableSurfaces = computed(() =>\n this.surfacesSignal().filter((entry) => entry.routable !== undefined),\n );\n\n private readonly omittedSignal = signal<ReadonlySet<string>>(new Set());\n\n /** Registered commands with their owner — the source for anything that has to attribute one. */\n readonly registeredCommands: Signal<readonly RegisteredCommand[]> = computed(\n () => {\n const omitted = this.omittedSignal();\n const entries = this.commandsSignal();\n return omitted.size === 0\n ? entries\n : entries.filter((entry) => !omitted.has(entry.command.id));\n },\n );\n\n /** Registered commands — the invocable actions triggers (items/keybindings/palette) point at. */\n readonly commands: Signal<readonly Command[]> = computed(() =>\n this.registeredCommands().map((entry) => entry.command),\n );\n\n readonly views: Signal<readonly RegisteredView[]> = computed(() => {\n const omitted = this.omittedSignal();\n const docked = this.dockedSurfaces();\n const visible =\n omitted.size === 0\n ? docked\n : docked.filter(\n (entry) => entry.id === undefined || !omitted.has(entry.id),\n );\n return visible.map(entryToView);\n });\n\n readonly barItems: Signal<readonly BarItem[]> = this.visible(\n this.barItemsSignal,\n );\n\n readonly railItems: Signal<readonly RailItem[]> = this.visible(\n this.railItemsSignal,\n );\n\n /**\n * URL-addressed content-area routes; the ContentRouter mirrors these into the Router.\n * Omitted routes are filtered out, so every consumer — tab strip, auto-open, pane target\n * picker, `matchRoute` — drops them without knowing about omission.\n */\n readonly contentRoutes: Signal<readonly RegisteredContentRoute[]> = computed(\n () => {\n const routes = this.routableSurfaces().map(entryToContentRoute);\n const omitted = this.omittedSignal();\n if (omitted.size === 0) {\n return routes;\n }\n return routes.filter((route) => !isRouteOmitted(route, omitted));\n },\n );\n\n /**\n * The routes {@link omit} dropped. The ContentRouter still maps these to a neutral\n * \"not available here\" placeholder at their path, so a shared deep-link explains itself instead of\n * silently falling back to home.\n */\n readonly omittedContentRoutes: Signal<readonly RegisteredContentRoute[]> =\n computed(() => {\n const omitted = this.omittedSignal();\n if (omitted.size === 0) {\n return NO_ROUTES;\n }\n return this.routableSurfaces()\n .map(entryToContentRoute)\n .filter((route) => isRouteOmitted(route, omitted));\n });\n\n /** Menu-slot contributions; the MenuService filters these by slot + `when` when a menu opens. */\n readonly menuItems: Signal<readonly MenuItem[]> = this.visible(\n this.menuItemsSignal,\n );\n\n /** The ids {@link omit} hides, exactly as the distribution wrote them, prefixes and all. */\n readonly omitted: Signal<ReadonlySet<string>> =\n this.omittedSignal.asReadonly();\n\n /**\n * Every id registered so far, of whatever kind, **including** those {@link omit} hides. An\n * omitted contribution is by construction absent from every other signal here, so this is the\n * only way to tell an `omit` that hid something from one that hit nothing at all.\n */\n readonly registeredIds: Signal<ReadonlySet<string>> = computed(() => {\n const ids = new Set<string>();\n for (const entry of this.commandsSignal()) {\n ids.add(entry.command.id);\n }\n for (const surface of this.surfacesSignal()) {\n if (surface.id !== undefined) {\n ids.add(surface.id);\n }\n }\n const optionallyIdentified: readonly (readonly {\n readonly id?: string;\n }[])[] = [\n this.barItemsSignal(),\n this.railItemsSignal(),\n this.menuItemsSignal(),\n ];\n for (const list of optionallyIdentified) {\n for (const item of list) {\n if (item.id !== undefined) {\n ids.add(item.id);\n }\n }\n }\n return ids;\n });\n\n /**\n * Hides contributions by id for good — a distribution drops a default it does not want\n * (`provideShell({ omit })`). Unlike {@link removeCommandById} and friends, which delete what is\n * registered *now*, this is a lasting filter: an id a plugin registers later stays hidden too.\n */\n omit(ids: readonly string[]): void {\n if (ids.length === 0) {\n return;\n }\n this.omittedSignal.update((current) => new Set([...current, ...ids]));\n }\n\n /**\n * Adds a command. Like {@link addContentRoute}, `pluginId` is stamped by the host and never\n * claimed by the plugin: it is what decides whether a caller is reaching its own command or\n * another's. The shell's own seeded commands carry none.\n */\n addCommand(command: Command, pluginId?: string): Disposable {\n const entry: RegisteredCommand = { command, ownerId: pluginId };\n this.commandsSignal.update((entries) =>\n upsertBy(entries, entry, (existing) => existing.command.id === command.id),\n );\n return {\n dispose: () =>\n this.commandsSignal.update((entries) =>\n entries.filter((existing) => existing !== entry),\n ),\n };\n }\n\n /**\n * Adds a panel view. Like {@link addContentRoute}, `pluginId` is stamped by the host, never by\n * the plugin, and overwrites anything the view carried.\n */\n addView(view: View, pluginId?: string): Disposable {\n return this.addSurface(viewToEntry(view, pluginId));\n }\n\n addBarItem(item: BarItem): Disposable {\n return this.add(this.barItemsSignal, item);\n }\n\n addRailItem(item: RailItem): Disposable {\n return this.add(this.railItemsSignal, item);\n }\n\n removeCommandById(id: string): void {\n this.commandsSignal.update((entries) =>\n entries.filter((entry) => entry.command.id !== id),\n );\n }\n\n removeViewById(id: string): void {\n this.surfacesSignal.update((entries) =>\n entries.filter((e) => e.routable !== undefined || e.id !== id),\n );\n }\n\n removeBarItemById(id: string): void {\n this.removeById(this.barItemsSignal, id);\n }\n\n removeRailItemById(id: string): void {\n this.removeById(this.railItemsSignal, id);\n }\n\n /**\n * Adds a content route (keyed by `path`; a re-registered path overrides in place). `pluginId` is\n * stamped by the host, never by the plugin: it is what lets a route's surface be checked against its\n * owner's capability grants, so it is applied last and overwrites anything the route carried.\n */\n addContentRoute(route: ContentRoute, pluginId?: string): Disposable {\n return this.addSurface(contentRouteToEntry(route, pluginId));\n }\n\n /** Adds a menu-slot item. With an `id` a re-registration replaces in place (last-in wins); without one the item is additive and dispose removes this exact contribution. */\n addMenuItem(item: MenuItem): Disposable {\n this.menuItemsSignal.update((items) =>\n upsertBy(items, item, (i) => item.id !== undefined && i.id === item.id),\n );\n return {\n dispose: () =>\n this.menuItemsSignal.update((items) => items.filter((i) => i !== item)),\n };\n }\n\n removeMenuItemById(id: string): void {\n this.menuItemsSignal.update((items) => items.filter((i) => i.id !== id));\n }\n\n private addSurface(entry: RegisteredSurface): Disposable {\n this.surfacesSignal.update((entries) =>\n upsertBy(entries, entry, sameSlotAs(entry)),\n );\n return {\n dispose: () =>\n this.surfacesSignal.update((entries) =>\n entries.filter((e) => e !== entry),\n ),\n };\n }\n\n private visible<T extends { readonly id?: string }>(\n source: Signal<readonly T[]>,\n ): Signal<readonly T[]> {\n return computed(() => {\n const omitted = this.omittedSignal();\n if (omitted.size === 0) {\n return source();\n }\n return source().filter(\n (item) => item.id === undefined || !omitted.has(item.id),\n );\n });\n }\n\n private add<T extends Identified>(\n target: WritableSignal<readonly T[]>,\n item: T,\n ): Disposable {\n target.update((items) => upsertById(items, item));\n\n return {\n dispose: () => target.update((items) => items.filter((i) => i !== item)),\n };\n }\n\n private removeById<T extends Identified>(\n target: WritableSignal<readonly T[]>,\n id: string,\n ): void {\n target.update((items) => items.filter((i) => i.id !== id));\n }\n}\n\nfunction sameSlotAs(\n entry: RegisteredSurface,\n): (existing: RegisteredSurface) => boolean {\n const path = entry.routable?.path;\n if (path !== undefined) {\n return (existing) => existing.routable?.path === path;\n }\n return (existing) =>\n existing.routable === undefined &&\n existing.id !== undefined &&\n existing.id === entry.id;\n}\n","import { ContentRoute } from '@loomweaver/plugin-sdk';\n\nexport interface Addressable {\n readonly path: string;\n}\n\nexport function normalizePath(url: string): string {\n return url.split(/[?#]/)[0].replace(/^\\/+/, '');\n}\n\nexport function segmentsOf(path: string): string[] {\n return normalizePath(path).split('/').filter(Boolean);\n}\n\nexport function isHomePath(path: string): boolean {\n return normalizePath(path) === '';\n}\n\nexport function suffixOf(url: string): string {\n const index = url.search(/[?#]/);\n return index === -1 ? '' : url.slice(index);\n}\n\nexport function restBelow(tabRoot: string, url: string): string {\n const path = normalizePath(url);\n const suffix = suffixOf(url);\n if (tabRoot === '') {\n return path + suffix;\n }\n if (!path.startsWith(tabRoot + '/')) {\n return suffix;\n }\n return path.slice(tabRoot.length + 1) + suffix;\n}\n\nfunction patternMatches(pattern: string[], segments: string[]): boolean {\n return (\n pattern.length <= segments.length &&\n pattern.every(\n (part, index) => part.startsWith(':') || part === segments[index],\n )\n );\n}\n\nexport function matchRoute<T extends Addressable>(\n routes: readonly T[],\n path: string,\n): T | undefined {\n const segments = segmentsOf(path);\n let best: T | undefined;\n let bestLength = -1;\n for (const route of routes) {\n const pattern = segmentsOf(route.path);\n if (pattern.length <= bestLength || !patternMatches(pattern, segments)) {\n continue;\n }\n best = route;\n bestLength = pattern.length;\n }\n return best;\n}\n\nexport function tabRootOf(\n routes: readonly Addressable[],\n path: string,\n): string {\n const route = matchRoute(routes, path);\n const segments = segmentsOf(path);\n if (!route) {\n return segments.join('/');\n }\n return segments.slice(0, segmentsOf(route.path).length).join('/');\n}\n\nexport function paramsOfPattern(\n pattern: string,\n path: string,\n): Record<string, string> {\n const parts = segmentsOf(pattern);\n const segments = segmentsOf(path);\n const params: Record<string, string> = {};\n parts.forEach((part, index) => {\n if (part.startsWith(':') && segments[index] !== undefined) {\n params[part.slice(1)] = segments[index];\n }\n });\n return params;\n}\n\nexport function routeParams(\n route: ContentRoute,\n path: string,\n): Record<string, string> {\n return paramsOfPattern(route.path, path);\n}\n","import { ContainerChild, ContainerSpec } from '@loomweaver/plugin-sdk';\nimport { View } from '../../../layout/view';\nimport { matchRoute, segmentsOf } from '../../content/content-path';\n\nexport interface ContainerChildDeclaration {\n readonly surface: string;\n readonly segment?: string;\n}\n\nexport function containerChildren(\n spec: ContainerSpec | undefined,\n): readonly ContainerChildDeclaration[] {\n return (spec?.children ?? []).map((child: ContainerChild) =>\n typeof child === 'string' ? { surface: child } : child,\n );\n}\n\nexport function containerChildIds(\n spec: ContainerSpec | undefined,\n): readonly string[] {\n return containerChildren(spec).map((child) => child.surface);\n}\n\nexport function containerChildOf(\n spec: ContainerSpec | undefined,\n surfaceId: string,\n): ContainerChildDeclaration | undefined {\n return containerChildren(spec).find((child) => child.surface === surfaceId);\n}\n\nexport function isAddressable(segment: string | undefined): boolean {\n return segment !== undefined && !segment.includes(':');\n}\n\nexport function childForSegmentPath<V extends View>(\n spec: ContainerSpec | undefined,\n views: readonly V[],\n rest: string,\n): { child: V; declaration: ContainerChildDeclaration } | undefined {\n const candidates = containerChildren(spec)\n .filter((child) => child.segment !== undefined)\n .map((child) => ({\n child,\n view: views.find((view) => view.id === child.surface),\n }))\n .filter(\n (entry): entry is { child: ContainerChildDeclaration; view: V } =>\n entry.view !== undefined,\n );\n const matched = matchRoute(\n candidates.map((entry) => ({ ...entry, path: entry.child.segment ?? '' })),\n rest,\n );\n return matched\n ? { child: matched.view, declaration: matched.child }\n : undefined;\n}\n\nexport const CONTAINER_DOCK_PREFIX = 'container@';\n\nexport function containerDockFor(path: string): string {\n return CONTAINER_DOCK_PREFIX + path;\n}\n\nexport function isContainerDock(dock: string): boolean {\n return dock.startsWith(CONTAINER_DOCK_PREFIX);\n}\n\nexport function containerPathOfDock(dock: string): string {\n return dock.slice(CONTAINER_DOCK_PREFIX.length);\n}\n\nexport function containerChildPath(\n containerPath: string,\n segmentPath: string,\n): string {\n return segmentsOf(`${containerPath}/${segmentPath}`).join('/');\n}\n","import { ContentRoute } from '@loomweaver/plugin-sdk';\nimport { View } from '../../layout/view';\nimport {\n ContainerChildDeclaration,\n childForSegmentPath,\n} from './container/container-children';\nimport {\n isHomePath,\n matchRoute,\n restBelow,\n tabRootOf,\n} from '../content/content-path';\nimport { VIEW_PANE_PREFIX, viewForPanePath } from './tree/pane-address';\n\nexport interface ContainerChildMatch<V> {\n readonly child: V;\n readonly declaration: ContainerChildDeclaration;\n readonly containerPath: string;\n readonly segmentPath: string;\n}\n\nexport function containerChildForPath<V extends View, R extends ContentRoute>(\n routes: readonly R[],\n views: readonly V[],\n path: string,\n): ContainerChildMatch<V> | undefined {\n const route = matchRoute(routes, path);\n if (!route?.container) {\n return undefined;\n }\n const containerPath = tabRootOf(routes, path);\n const segmentPath = restBelow(containerPath, path);\n if (segmentPath === '') {\n return undefined;\n }\n const matched = childForSegmentPath(route.container, views, segmentPath);\n return matched ? { ...matched, containerPath, segmentPath } : undefined;\n}\n\nexport function surfaceForPanePath<V extends View, R extends ContentRoute>(\n routes: readonly R[],\n views: readonly V[],\n path: string,\n): V | R | undefined {\n if (path.startsWith(VIEW_PANE_PREFIX)) {\n return viewForPanePath(views, path);\n }\n const route = matchRoute(routes, path);\n if (!route) {\n return undefined;\n }\n if (isHomePath(route.path) && !isHomePath(path)) {\n return undefined;\n }\n if (route.container) {\n return restBelow(tabRootOf(routes, path), path) === ''\n ? route\n : containerChildForPath(routes, views, path)?.child;\n }\n return route;\n}\n","import { InjectionToken } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { ContentRoute, DirtySurface, View } from '@loomweaver/plugin-sdk';\nimport { matchRoute } from '../../content/content-path';\nimport { VIEW_PANE_PREFIX } from '../tree/pane-address';\nimport { surfaceForPanePath } from '../pane-surface';\nimport { containerDockFor } from '../container/container-children';\n\nexport type RetentionDefault = 'destroy' | 'retain';\n\nexport const SURFACE_RETENTION = new InjectionToken<RetentionDefault>(\n 'lw.surface-retention',\n {\n providedIn: 'root',\n factory: () => 'destroy',\n },\n);\n\nexport const PRIMARY_RETENTION_PREFIX = 'primary:';\n\nexport function isContentRoute(route: ActivatedRouteSnapshot): boolean {\n return route.routeConfig?.data?.['content'] === true;\n}\n\nexport function reusableRoute(route: ActivatedRouteSnapshot): boolean {\n if (!isContentRoute(route)) {\n return false;\n }\n\n if (route.routeConfig?.data?.['authPlaceholder'] === true) {\n return false;\n }\n\n if (route.routeConfig?.data?.['sub'] === true) {\n return false;\n }\n\n if (route.routeConfig?.data?.['iframe'] !== undefined) {\n return false;\n }\n\n if (route.routeConfig?.data?.['retain'] === true) {\n return false;\n }\n return route.routeConfig?.data?.['chromeless'] !== true;\n}\n\nexport function effectiveRetain(\n declared: 'always' | 'never' | undefined,\n fallback: RetentionDefault,\n): boolean {\n return declared !== undefined ? declared === 'always' : fallback === 'retain';\n}\n\nexport function routeRetains(\n route: ContentRoute,\n fallback: RetentionDefault,\n): boolean {\n if (route.container !== undefined) {\n return false;\n }\n return effectiveRetain(route.retain, fallback);\n}\n\nexport function retainSurfacePath(\n routes: readonly ContentRoute[],\n views: readonly View[],\n path: string,\n fallback: RetentionDefault,\n): boolean {\n const surface = surfaceForPanePath(routes, views, path);\n if (surface === undefined) {\n return false;\n }\n return 'path' in surface\n ? routeRetains(surface, fallback)\n : effectiveRetain(surface.retain, fallback);\n}\n\nexport type SurfaceRetentionMode = 'move' | 'in-place' | 'rebuild';\n\nexport function surfaceRetentionMode(\n routes: readonly ContentRoute[],\n path: string,\n): SurfaceRetentionMode {\n if (path.startsWith(VIEW_PANE_PREFIX)) {\n return 'move';\n }\n const route = matchRoute(routes, path);\n if (!route || route.container !== undefined) {\n return 'rebuild';\n }\n return route.iframe !== undefined ? 'in-place' : 'move';\n}\n\nexport function containerChildInstances(\n entries: readonly { key: string; instance: unknown }[],\n tabPath: string,\n): unknown[] {\n const scoped = containerDockFor(tabPath) + ':';\n return entries\n .filter((entry) => entry.key.startsWith(scoped))\n .map((entry) => entry.instance);\n}\n\nexport function paneRetentionScope(dock: string, paneId: string): string {\n return `${dock}:${paneId}`;\n}\n\nexport function surfaceRetentionKey(scope: string, path: string): string {\n return `${scope}|${path}`;\n}\n\nexport function viewRetentionKey(\n scope: string,\n path: string,\n instance: string | undefined,\n): string {\n return `${scope}|${path}|${instance ?? ''}`;\n}\n\nexport function resolvableSurfacePath(\n routes: readonly ContentRoute[],\n views: readonly View[],\n path: string,\n): boolean {\n return surfaceForPanePath(routes, views, path) !== undefined;\n}\n\nexport function saveOnHidePath(\n routes: readonly ContentRoute[],\n views: readonly View[],\n path: string,\n): boolean {\n return surfaceForPanePath(routes, views, path)?.saveOn === 'hide';\n}\n\nexport function dirtySurfaceOf(instance: unknown): DirtySurface | null {\n if (!instance || typeof instance !== 'object') {\n return null;\n }\n const candidate = instance as Partial<DirtySurface>;\n return typeof candidate.surfaceDirty === 'function'\n ? (candidate as DirtySurface)\n : null;\n}\n\nexport function beforeCloseOf(\n instance: unknown,\n): (() => boolean | Promise<boolean>) | null {\n if (!instance || typeof instance !== 'object') {\n return null;\n }\n const candidate = instance as Partial<DirtySurface>;\n return typeof candidate.surfaceBeforeClose === 'function'\n ? candidate.surfaceBeforeClose.bind(candidate)\n : null;\n}\n\nexport function instanceDirty(instance: unknown): boolean {\n const aware = dirtySurfaceOf(instance);\n if (!aware) {\n return false;\n }\n try {\n return aware.surfaceDirty() === true;\n } catch (error) {\n console.error(\n 'surfaceDirty() threw — treating the instance as dirty',\n error,\n );\n return true;\n }\n}\n","import { ComponentRef, Service, signal, Signal } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n DetachedRouteHandle,\n RouteReuseStrategy,\n} from '@angular/router';\nimport { normalizePath } from '../content-path';\nimport {\n instanceDirty,\n isContentRoute,\n reusableRoute,\n} from '../../pane/retention/retention-policy';\n\ninterface HandleWithRef {\n componentRef?: ComponentRef<unknown>;\n}\n\nexport interface ParkedHandle {\n readonly key: string;\n readonly instance?: unknown;\n}\n\n@Service()\nexport class ContentReuseStrategy implements RouteReuseStrategy {\n private readonly handles = new Map<string, DetachedRouteHandle>();\n private readonly changes = signal(0);\n\n readonly version: Signal<number> = this.changes.asReadonly();\n\n shouldReuseRoute(\n future: ActivatedRouteSnapshot,\n curr: ActivatedRouteSnapshot,\n ): boolean {\n if (!isContentRoute(future) || !isContentRoute(curr)) {\n return future.routeConfig === curr.routeConfig;\n }\n\n return future.routeConfig === curr.routeConfig && sameParams(future, curr);\n }\n\n shouldDetach(route: ActivatedRouteSnapshot): boolean {\n return reusableRoute(route);\n }\n\n store(\n route: ActivatedRouteSnapshot,\n handle: DetachedRouteHandle | null,\n ): void {\n const key = keyOf(route);\n if (!key) {\n return;\n }\n if (!handle) {\n this.handles.delete(key);\n this.changes.update((value) => value + 1);\n return;\n }\n if (!instanceDirty(instanceOf(handle))) {\n (handle as HandleWithRef).componentRef?.destroy();\n return;\n }\n this.handles.set(key, handle);\n this.changes.update((value) => value + 1);\n }\n\n parkedHandles(): ParkedHandle[] {\n return [...this.handles.entries()].map(([key, handle]) => ({\n key,\n instance: instanceOf(handle),\n }));\n }\n\n shouldAttach(route: ActivatedRouteSnapshot): boolean {\n return reusableRoute(route) && this.handles.has(keyOf(route));\n }\n\n retrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {\n return this.handles.get(keyOf(route)) ?? null;\n }\n\n evict(path: string): void {\n const key = normalizePath(path);\n const handle = this.handles.get(key);\n if (!handle) {\n return;\n }\n (handle as HandleWithRef).componentRef?.destroy();\n this.handles.delete(key);\n this.changes.update((value) => value + 1);\n }\n\n pruneExcept(isLive: (key: string) => boolean): void {\n for (const [key, handle] of this.handles) {\n if (!isLive(key)) {\n (handle as HandleWithRef).componentRef?.destroy();\n this.handles.delete(key);\n this.changes.update((value) => value + 1);\n }\n }\n }\n}\n\nfunction keyOf(route: ActivatedRouteSnapshot): string {\n return route.url.map((segment) => segment.path).join('/');\n}\n\nfunction instanceOf(handle: DetachedRouteHandle): unknown {\n return (handle as HandleWithRef).componentRef?.instance;\n}\n\nfunction sameParams(\n a: ActivatedRouteSnapshot,\n b: ActivatedRouteSnapshot,\n): boolean {\n const ap = a.params;\n const bp = b.params;\n const keys = Object.keys(ap);\n return (\n keys.length === Object.keys(bp).length && keys.every((k) => ap[k] === bp[k])\n );\n}\n","/**\n * The shared shape of the shell's two persistence ports: `SETTINGS_STORE` for genuine\n * settings and `WORKING_STATE_STORE` for working state. A store implemented once fits either port —\n * only what the shell routes through it differs.\n *\n * It is a plain **string** key-value store: callers serialise/validate their own payloads (they already\n * do so defensively), which keeps the wire format identical to what the shell wrote before — no data\n * migration. `get`/`set`/`delete` are async so a network-backed store fits; the optional {@link peek} is\n * a synchronous fast-path for bootstrap-critical reads (theme, panel sizes) that must apply before the\n * first paint. A store that cannot answer synchronously (network-backed) omits `peek`; callers then start\n * from a default and reconcile via `get`.\n */\nexport interface KeyValueStore {\n /**\n * Reads the stored string for `key`, or `undefined` if absent. Untrusted — callers validate its shape.\n * Best-effort like {@link set}: prefer resolving with `undefined` over rejecting when the read fails\n * (a network store that is offline or unauthorized). The shell treats a rejection as \"no value\" rather\n * than failing startup, but a store that rejects makes the user's data silently unavailable.\n */\n get(key: string): Promise<string | undefined>;\n /** Writes `value` for `key`. Best-effort: implementations resolve even when persistence fails. */\n set(key: string, value: string): Promise<void>;\n /** Removes the value for `key`. */\n delete(key: string): Promise<void>;\n /**\n * Optional synchronous snapshot of `key` for bootstrap-critical reads that must apply before first\n * paint. Omitted by stores that can only answer asynchronously — callers fall back to {@link get}.\n */\n peek?(key: string): string | undefined;\n}\n\n/**\n * Default {@link KeyValueStore}: user-local `localStorage`. Reads and writes are synchronous\n * under the hood — `peek` exposes that for zero-flash bootstrap — and wrapped in the same best-effort\n * try/catch the shell used before (private browsing, quota, corrupt payloads). Both persistence ports\n * default to an instance of this store.\n */\nexport class LocalStorageStore implements KeyValueStore {\n peek(key: string): string | undefined {\n try {\n return localStorage.getItem(key) ?? undefined;\n } catch {\n return undefined;\n }\n }\n\n get(key: string): Promise<string | undefined> {\n return Promise.resolve(this.peek(key));\n }\n\n set(key: string, value: string): Promise<void> {\n try {\n localStorage.setItem(key, value);\n } catch {\n return Promise.resolve();\n }\n return Promise.resolve();\n }\n\n delete(key: string): Promise<void> {\n try {\n localStorage.removeItem(key);\n } catch {\n return Promise.resolve();\n }\n return Promise.resolve();\n }\n}\n","import { Service } from '@angular/core';\n\ninterface KeyChangeMessage {\n readonly sender: string;\n readonly key: string;\n}\n\nconst CHANNEL_NAME = 'lw.state-sync';\n\n@Service()\nexport class StateSyncChannel {\n private readonly sender = crypto.randomUUID();\n private readonly listeners = new Set<(key: string) => void>();\n private channel: BroadcastChannel | null | undefined;\n private applying = false;\n\n post(key: string): void {\n if (this.applying) {\n return;\n }\n this.open()?.postMessage({ sender: this.sender, key });\n }\n\n listen(listener: (key: string) => void): void {\n this.open();\n this.listeners.add(listener);\n }\n\n whileApplying(apply: () => void): void {\n this.applying = true;\n try {\n apply();\n } finally {\n this.applying = false;\n }\n }\n\n private open(): BroadcastChannel | null {\n if (this.channel !== undefined) {\n return this.channel;\n }\n this.channel = this.create();\n return this.channel;\n }\n\n private create(): BroadcastChannel | null {\n if (typeof BroadcastChannel === 'undefined') {\n return null;\n }\n try {\n const opened = new BroadcastChannel(CHANNEL_NAME);\n opened.onmessage = (event: MessageEvent) => this.receive(event.data);\n return opened;\n } catch {\n return null;\n }\n }\n\n private receive(data: unknown): void {\n const message = data as Partial<KeyChangeMessage> | null;\n if (\n !message ||\n typeof message.key !== 'string' ||\n message.sender === this.sender\n ) {\n return;\n }\n for (const listener of this.listeners) {\n listener(message.key);\n }\n }\n}\n","import { inject } from '@angular/core';\nimport { KeyValueStore } from './key-value-store';\nimport { StateSyncChannel } from './state-sync-channel';\n\nexport class CrossTabSyncStore implements KeyValueStore {\n peek?: (key: string) => string | undefined;\n\n private readonly inner: KeyValueStore;\n private readonly channel: StateSyncChannel;\n\n constructor(inner: KeyValueStore, channel: StateSyncChannel) {\n this.inner = inner;\n this.channel = channel;\n const innerPeek = inner.peek?.bind(inner);\n if (innerPeek) {\n this.peek = innerPeek;\n }\n }\n\n get(key: string): Promise<string | undefined> {\n return this.inner.get(key);\n }\n\n async set(key: string, value: string): Promise<void> {\n try {\n await this.inner.set(key, value);\n } catch {\n return;\n }\n this.channel.post(key);\n }\n\n async delete(key: string): Promise<void> {\n try {\n await this.inner.delete(key);\n } catch {\n return;\n }\n this.channel.post(key);\n }\n}\n\nexport function withCrossTabSync(inner: KeyValueStore): KeyValueStore {\n return new CrossTabSyncStore(inner, inject(StateSyncChannel));\n}\n","import { InjectionToken, Provider, Type, inject } from '@angular/core';\nimport { KeyValueStore } from './key-value-store';\nimport { withCrossTabSync } from './cross-tab-sync-store';\n\nexport function providePortStore(\n token: InjectionToken<KeyValueStore>,\n store: KeyValueStore | Type<KeyValueStore>,\n): Provider {\n if (typeof store === 'function') {\n return [\n store,\n {\n provide: token,\n useFactory: () => withCrossTabSync(inject(store)),\n },\n ];\n }\n return {\n provide: token,\n useFactory: () => withCrossTabSync(store),\n };\n}\n","import { InjectionToken, Provider, Type } from '@angular/core';\nimport { KeyValueStore, LocalStorageStore } from './key-value-store';\nimport { withCrossTabSync } from './cross-tab-sync-store';\nimport { providePortStore } from './port-store-provider';\n\n/**\n * The **working-state** persistence port: state that accrues from using the app rather\n * than from deciding something — view state and view instances, the palette's recently-used list,\n * and the window-local layout keys (pane trees, panel sizes, collapse state, item order, view\n * placement). Writes are frequent and debounced, which is why this port defaults to the device\n * ({@link LocalStorageStore}) instead of a product backend.\n *\n * A distribution that wants working state to travel across devices provides a backend-backed store\n * with {@link provideWorkingStateStore}: a fresh tab then hydrates the last persisted state at boot\n * with no further wiring. For *live* cross-device updates, pair the store with a push transport\n * (SSE, WebSocket) that calls `StateSyncService.notifyRemoteChange` when the backend reports a\n * changed key.\n */\nexport const WORKING_STATE_STORE = new InjectionToken<KeyValueStore>(\n 'lw.working-state-store',\n {\n providedIn: 'root',\n factory: () => withCrossTabSync(new LocalStorageStore()),\n },\n);\n\n/**\n * Provides a custom working-state {@link KeyValueStore}, replacing the default `localStorage` one —\n * place after `provideShell()` (last provider wins). Pass a class (DI-constructed) or a ready\n * instance. The cross-tab sync wrapper is applied on top either way.\n */\nexport function provideWorkingStateStore(\n store: KeyValueStore | Type<KeyValueStore>,\n): Provider {\n return providePortStore(WORKING_STATE_STORE, store);\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { WorkspaceDefinition } from './workspace-definition';\n\n/**\n * The developer-defined workspaces of the composition — each {@link provideWorkspaces} call\n * contributes one batch. Read by the workspace service; a distribution never injects this itself.\n */\nexport const WORKSPACE_DEFINITIONS = new InjectionToken<\n readonly (readonly WorkspaceDefinition[])[]\n>('lw.workspaceDefinitions');\n\n/**\n * Ships developer-defined workspaces with the distribution (composition root). They are switchable,\n * self-remembering (each keeps its live working state per workspace) and resettable to the\n * declaration — but their baseline lives in code, so the user cannot overwrite, rename or delete\n * them. The workspace dialog therefore lists them separately from the user's own, opening on\n * whichever list holds the active workspace. Invalid declarations are reported to\n * the console in dev mode, naming what is ignored; nothing fails silently at runtime.\n */\nexport function provideWorkspaces(\n ...definitions: WorkspaceDefinition[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: WORKSPACE_DEFINITIONS, useValue: definitions, multi: true },\n ]);\n}\n","import { PaneArea, PaneAreaBase, PaneTabArea } from '@loomweaver/plugin-sdk';\nimport { PRIMARY_PANE } from './pane-address';\nimport { PaneNode, PaneTab } from './pane-node';\n\nexport interface PaneAreaOptions<T> {\n readonly bake: (entry: T, problems: string[]) => BakedTab | null;\n readonly idPrefix: string;\n readonly context: string;\n readonly allowEmpty?: boolean;\n}\n\nexport interface BakedTab {\n readonly tab: PaneTab;\n readonly active: boolean;\n}\n\nexport interface PaneAreaTree {\n readonly node: PaneNode | null;\n readonly tabs: readonly PaneTab[];\n}\n\nconst MAX_DEPTH = 8;\n\nexport function paneAreaTree<T>(\n area: PaneArea<T>,\n options: PaneAreaOptions<T>,\n problems: string[],\n): PaneAreaTree {\n const clean = cleanArea(area, options, problems, 1);\n if (clean === null) {\n return { node: null, tabs: [] };\n }\n return {\n node: buildNode(clean, options.idPrefix, { primaryUsed: false }, '0'),\n tabs: collectTabs(clean),\n };\n}\n\ninterface CleanTabs {\n readonly kind: 'tabs';\n readonly size?: number;\n readonly tabs: readonly PaneTab[];\n readonly active: string;\n readonly empty?: boolean;\n}\n\ninterface CleanSplit {\n readonly kind: 'rows' | 'columns';\n readonly size?: number;\n readonly children: readonly CleanArea[];\n}\n\ntype CleanArea = CleanTabs | CleanSplit;\n\nfunction cleanArea<T>(\n area: PaneArea<T>,\n options: PaneAreaOptions<T>,\n problems: string[],\n depth: number,\n): CleanArea | null {\n if (depth > MAX_DEPTH) {\n problems.push(\n `${options.context}: the arrangement nests deeper than ${MAX_DEPTH} levels — the deeper areas are dropped.`,\n );\n return null;\n }\n const kinds = ['tabs', 'rows', 'columns'].filter((key) => key in area);\n if (kinds.length !== 1) {\n problems.push(\n `${options.context}: a pane area must be exactly one of tabs, rows or columns.`,\n );\n return null;\n }\n const size = cleanSize(area, options, problems);\n if ('tabs' in area) {\n return cleanTabsArea(area, size, options, problems);\n }\n const declared = 'rows' in area ? area.rows : area.columns;\n const children = (Array.isArray(declared) ? declared : [])\n .map((child) => cleanArea(child, options, problems, depth + 1))\n .filter((child): child is CleanArea => child !== null);\n if (children.length === 0) {\n problems.push(\n `${options.context}: a rows/columns area has no usable child area.`,\n );\n return null;\n }\n if (children.length === 1) {\n return children[0];\n }\n return { kind: 'rows' in area ? 'rows' : 'columns', size, children };\n}\n\nfunction cleanSize<T>(\n area: PaneAreaBase,\n options: PaneAreaOptions<T>,\n problems: string[],\n): number | undefined {\n if (area.size === undefined) {\n return undefined;\n }\n if (!Number.isFinite(area.size) || area.size <= 0) {\n problems.push(\n `${options.context}: a size must be a positive percentage — the size is ignored and siblings share the remainder.`,\n );\n return undefined;\n }\n return area.size;\n}\n\nfunction cleanTabsArea<T>(\n area: PaneTabArea<T>,\n size: number | undefined,\n options: PaneAreaOptions<T>,\n problems: string[],\n): CleanTabs | null {\n const tabs: PaneTab[] = [];\n let active: string | undefined;\n for (const entry of Array.isArray(area.tabs) ? area.tabs : []) {\n const baked = options.bake(entry, problems);\n if (baked === null) {\n continue;\n }\n if (tabs.some((existing) => existing.path === baked.tab.path)) {\n problems.push(\n `${options.context}: tab \"${baked.tab.path}\" is declared twice in one area — the duplicate is dropped.`,\n );\n continue;\n }\n tabs.push(baked.tab);\n if (!baked.active) {\n continue;\n }\n if (active === undefined) {\n active = baked.tab.path;\n } else {\n problems.push(\n `${options.context}: more than one tab of an area is marked active — the first wins.`,\n );\n }\n }\n if (tabs.length === 0) {\n if (\n options.allowEmpty &&\n Array.isArray(area.tabs) &&\n area.tabs.length === 0\n ) {\n return { kind: 'tabs', size, tabs, active: '', empty: true };\n }\n problems.push(`${options.context}: a tabs area has no tabs.`);\n return null;\n }\n return { kind: 'tabs', size, tabs, active: active ?? tabs[0].path };\n}\n\nfunction collectTabs(area: CleanArea): PaneTab[] {\n return area.kind === 'tabs'\n ? [...area.tabs]\n : area.children.flatMap(collectTabs);\n}\n\nfunction buildNode(\n area: CleanArea,\n idPrefix: string,\n ctx: { primaryUsed: boolean },\n indexPath: string,\n): PaneNode {\n if (area.kind === 'tabs') {\n const primary = !ctx.primaryUsed;\n ctx.primaryUsed = true;\n const id = primary ? PRIMARY_PANE : `${idPrefix}:${indexPath}`;\n return area.empty\n ? { kind: 'leaf', id, tabs: [], declared: true }\n : { kind: 'leaf', id, tabs: area.tabs, active: area.active };\n }\n const orientation = area.kind === 'columns' ? 'row' : 'column';\n const fractions = fractionsOf(area.children);\n const chain = (offset: number, remaining: number): PaneNode => {\n const first = buildNode(\n area.children[offset],\n idPrefix,\n ctx,\n `${indexPath}.${offset}`,\n );\n if (offset === area.children.length - 1) {\n return first;\n }\n return {\n kind: 'split',\n id: `${idPrefix}:${indexPath}.s${offset}`,\n orientation,\n ratio: fractions[offset] / remaining,\n first,\n second: chain(offset + 1, remaining - fractions[offset]),\n };\n };\n return chain(0, 1);\n}\n\nfunction fractionsOf(children: readonly CleanArea[]): number[] {\n const declared = children\n .map((child) => child.size)\n .filter((size): size is number => size !== undefined);\n const declaredSum = declared.reduce((sum, size) => sum + size, 0);\n const unspecified = children.length - declared.length;\n const remainder = Math.max(0, 100 - declaredSum);\n const evenShare =\n unspecified > 0\n ? remainder > 0\n ? remainder / unspecified\n : declaredSum / children.length\n : 0;\n const weights = children.map((child) => child.size ?? evenShare);\n const total = weights.reduce((sum, weight) => sum + weight, 0);\n return weights.map((weight) => weight / total);\n}\n","import { segmentsOf } from '../regions/content/content-path';\n\nexport interface WorkspaceClaim {\n readonly workspaceId: string;\n readonly pattern: string;\n}\n\nexport function claimShape(pattern: string): string {\n return segmentsOf(pattern)\n .map((segment) => (segment.startsWith(':') ? ':' : segment))\n .join('/');\n}\n\nexport function claimMatches(pattern: string, path: string): boolean {\n const parts = segmentsOf(pattern);\n const segments = segmentsOf(path);\n if (parts.length === 0) {\n return segments.length === 0;\n }\n return (\n parts.length <= segments.length &&\n parts.every(\n (part, index) => part.startsWith(':') || part === segments[index],\n )\n );\n}\n\nfunction narrowness(pattern: string): readonly [number, number] {\n const parts = segmentsOf(pattern);\n const literals = parts.filter((part) => !part.startsWith(':')).length;\n return [parts.length, literals];\n}\n\nfunction narrower(a: string, b: string): number {\n const [aLength, aLiterals] = narrowness(a);\n const [bLength, bLiterals] = narrowness(b);\n return aLength === bLength ? aLiterals - bLiterals : aLength - bLength;\n}\n\nexport function claimFor(\n claims: readonly WorkspaceClaim[],\n path: string,\n): WorkspaceClaim | null {\n const matching = claims.filter((claim) => claimMatches(claim.pattern, path));\n if (matching.length === 0) {\n return null;\n }\n const best = matching.reduce((winner, claim) =>\n narrower(claim.pattern, winner.pattern) > 0 ? claim : winner,\n );\n const tied = matching.filter(\n (claim) =>\n claim.workspaceId !== best.workspaceId &&\n narrower(claim.pattern, best.pattern) === 0,\n );\n return tied.length === 0 ? best : null;\n}\n\nfunction contestedShapes(\n claims: readonly WorkspaceClaim[],\n): Map<string, readonly string[]> {\n const byShape = new Map<string, string[]>();\n for (const claim of claims) {\n const shape = claimShape(claim.pattern);\n const owners = byShape.get(shape) ?? [];\n if (!owners.includes(claim.workspaceId)) {\n owners.push(claim.workspaceId);\n }\n byShape.set(shape, owners);\n }\n return new Map(\n [...byShape].filter(([, owners]) => owners.length > 1),\n );\n}\n\nexport function conflictingClaims(\n claims: readonly WorkspaceClaim[],\n): readonly string[] {\n return [...contestedShapes(claims)].map(\n ([shape, owners]) =>\n `Workspaces ${owners.map((id) => `\"${id}\"`).join(' and ')} both claim \"${shape}\" — ` +\n `neither is narrower than the other, so the claim is dropped and that address ` +\n `behaves as though nothing claimed it. Give the address one home.`,\n );\n}\n\nexport function withoutConflicts(\n claims: readonly WorkspaceClaim[],\n): readonly WorkspaceClaim[] {\n const contested = contestedShapes(claims);\n return claims.filter((claim) => !contested.has(claimShape(claim.pattern)));\n}\n\nexport function settlementFor(\n claims: readonly WorkspaceClaim[],\n here: readonly WorkspaceClaim[],\n activeId: string,\n path: string,\n): string | null {\n if (here.some((claim) => claimMatches(claim.pattern, path))) {\n return null;\n }\n const destination = claimFor(claims, path)?.workspaceId ?? null;\n return destination === activeId ? null : destination;\n}\n","import { PRIMARY_PANE, VIEW_PANE_PREFIX } from './pane-address';\n\nexport interface PaneTab {\n readonly path: string;\n readonly pinned?: boolean;\n readonly preview?: boolean;\n readonly closable?: boolean;\n readonly title?: string;\n readonly literalTitle?: boolean;\n readonly icon?: string;\n readonly instance?: string;\n}\n\nexport interface PaneLeaf {\n readonly kind: 'leaf';\n readonly id: string;\n readonly tabs: readonly PaneTab[];\n readonly active?: string;\n readonly declared?: boolean;\n}\n\nexport interface PaneSplit {\n readonly kind: 'split';\n readonly id: string;\n readonly orientation: 'row' | 'column';\n readonly ratio: number;\n readonly first: PaneNode;\n readonly second: PaneNode;\n}\n\nexport type PaneNode = PaneLeaf | PaneSplit;\n\nexport const PRIMARY_LEAF: PaneLeaf = {\n kind: 'leaf',\n id: PRIMARY_PANE,\n tabs: [],\n};\n\nexport function newPaneId(): string {\n return crypto.randomUUID();\n}\n\nexport function leafOf(id: string, path: string): PaneLeaf {\n const tab: PaneTab = path.startsWith(VIEW_PANE_PREFIX)\n ? { path, instance: id }\n : { path };\n return { kind: 'leaf', id, tabs: [tab], active: path };\n}\n\nexport function activeTab(leaf: PaneLeaf): PaneTab | undefined {\n return leaf.tabs.find((tab) => tab.path === leaf.active) ?? leaf.tabs[0];\n}\n\nexport function leafPath(leaf: PaneLeaf): string | undefined {\n return activeTab(leaf)?.path;\n}\n\nexport function leafWith(\n id: string,\n tabs: readonly PaneTab[],\n candidateActive: string | undefined,\n declared?: boolean,\n): PaneLeaf {\n const active = tabs.some((tab) => tab.path === candidateActive)\n ? candidateActive\n : tabs[0]?.path;\n return {\n kind: 'leaf',\n id,\n tabs,\n ...(active === undefined ? {} : { active }),\n ...(declared ? { declared: true } : {}),\n };\n}\n","import { PaneLeaf, PaneNode, PaneTab, leafPath } from './pane-node';\n\nexport function findLeaf(node: PaneNode, paneId: string): PaneLeaf | null {\n if (node.kind === 'leaf') {\n return node.id === paneId ? node : null;\n }\n return findLeaf(node.first, paneId) ?? findLeaf(node.second, paneId);\n}\n\nexport function collectLeafIds(node: PaneNode): string[] {\n if (node.kind === 'leaf') {\n return [node.id];\n }\n return [...collectLeafIds(node.first), ...collectLeafIds(node.second)];\n}\n\nexport function findLeafWhere(\n node: PaneNode,\n predicate: (leaf: PaneLeaf) => boolean,\n): PaneLeaf | null {\n if (node.kind === 'leaf') {\n return predicate(node) ? node : null;\n }\n return (\n findLeafWhere(node.first, predicate) ??\n findLeafWhere(node.second, predicate)\n );\n}\n\nexport function findLeafWithTab(\n node: PaneNode,\n tabPath: string,\n): PaneLeaf | null {\n return findLeafWhere(node, (leaf) =>\n leaf.tabs.some((tab) => tab.path === tabPath),\n );\n}\n\nexport function collectTabPaths(node: PaneNode): string[] {\n if (node.kind === 'leaf') {\n return node.tabs.map((tab) => tab.path);\n }\n return [...collectTabPaths(node.first), ...collectTabPaths(node.second)];\n}\n\nexport function collectTabs(node: PaneNode): PaneTab[] {\n if (node.kind === 'leaf') {\n return [...node.tabs];\n }\n return [...collectTabs(node.first), ...collectTabs(node.second)];\n}\n\nexport function tabHolderOf(node: PaneNode, tabPath: string): string | null {\n if (node.kind === 'leaf') {\n return node.tabs.some((tab) => tab.path === tabPath) ? node.id : null;\n }\n return tabHolderOf(node.first, tabPath) ?? tabHolderOf(node.second, tabPath);\n}\n\nexport interface PaneSegment {\n readonly id: string;\n readonly path?: string;\n readonly fraction: number;\n}\n\nexport function paneSegments(node: PaneNode): PaneSegment[] {\n const out: PaneSegment[] = [];\n const collect = (leaf: PaneNode, factor: number): void => {\n if (leaf.kind === 'leaf') {\n out.push({ id: leaf.id, path: leafPath(leaf), fraction: factor });\n return;\n }\n collect(leaf.first, factor * leaf.ratio);\n collect(leaf.second, factor * (1 - leaf.ratio));\n };\n collect(node, 1);\n return out;\n}\n","import { PaneNode } from './pane-node';\n\nexport const DEFAULT_RATIO = 0.5;\n\nexport const MIN_RATIO = 0.15;\n\nexport const MAX_RATIO = 0.85;\n\nconst SANITY_MIN = 0.02;\n\nconst SANITY_MAX = 0.98;\n\nexport function clampRatio(ratio: number): number {\n return Math.min(MAX_RATIO, Math.max(MIN_RATIO, ratio));\n}\n\nexport function sanitizeRatio(ratio: number): number {\n return Math.min(SANITY_MAX, Math.max(SANITY_MIN, ratio));\n}\n\nexport function withRatio(\n node: PaneNode,\n splitId: string,\n ratio: number,\n): PaneNode {\n if (node.kind === 'leaf') {\n return node;\n }\n if (node.id === splitId) {\n return { ...node, ratio };\n }\n return {\n ...node,\n first: withRatio(node.first, splitId, ratio),\n second: withRatio(node.second, splitId, ratio),\n };\n}\n","import { PRIMARY_PANE } from './pane-address';\nimport { PaneNode, PaneTab, leafOf, leafWith } from './pane-node';\nimport { collectLeafIds, findLeaf } from './pane-queries';\nimport { DEFAULT_RATIO, sanitizeRatio } from './pane-ratio';\n\nfunction normalizeTab(value: unknown): PaneTab | null {\n if (!value || typeof value !== 'object') {\n return null;\n }\n const tab = value as Record<string, unknown>;\n if (typeof tab['path'] !== 'string') {\n return null;\n }\n return {\n path: tab['path'],\n ...(tab['pinned'] === true ? { pinned: true } : {}),\n ...(tab['preview'] === true ? { preview: true } : {}),\n ...(tab['closable'] === false ? { closable: false } : {}),\n ...(typeof tab['title'] === 'string' ? { title: tab['title'] } : {}),\n ...(tab['literalTitle'] === true ? { literalTitle: true } : {}),\n ...(typeof tab['icon'] === 'string' ? { icon: tab['icon'] } : {}),\n ...(typeof tab['instance'] === 'string'\n ? { instance: tab['instance'] }\n : {}),\n };\n}\n\nfunction normalizeLeafNode(\n id: string,\n node: Record<string, unknown>,\n): PaneNode {\n const legacyPath = node['path'];\n if (typeof legacyPath === 'string') {\n return leafOf(id, legacyPath);\n }\n const rawTabs = node['tabs'];\n const tabs = Array.isArray(rawTabs)\n ? rawTabs.map(normalizeTab).filter((tab): tab is PaneTab => tab !== null)\n : [];\n const rawActive = node['active'];\n return leafWith(\n id,\n tabs,\n typeof rawActive === 'string' ? rawActive : undefined,\n node['declared'] === true,\n );\n}\n\nfunction normalizeSplitNode(\n id: string,\n orientation: 'row' | 'column',\n node: Record<string, unknown>,\n): PaneNode | null {\n const first = normalizeNode(node['first']);\n const second = normalizeNode(node['second']);\n if (!first || !second) {\n return null;\n }\n const rawRatio = node['ratio'];\n const ratio =\n typeof rawRatio === 'number' && Number.isFinite(rawRatio)\n ? sanitizeRatio(rawRatio)\n : DEFAULT_RATIO;\n return { kind: 'split', id, orientation, ratio, first, second };\n}\n\nexport function normalizeNode(value: unknown): PaneNode | null {\n if (!value || typeof value !== 'object') {\n return null;\n }\n const node = value as Record<string, unknown>;\n const id = node['id'];\n if (typeof id !== 'string') {\n return null;\n }\n if (node['kind'] === 'leaf') {\n return normalizeLeafNode(id, node);\n }\n const orientation = node['orientation'];\n if (\n node['kind'] === 'split' &&\n (orientation === 'row' || orientation === 'column')\n ) {\n return normalizeSplitNode(id, orientation, node);\n }\n return null;\n}\n\nexport interface DockEntry {\n readonly node: PaneNode;\n readonly primary: string;\n}\n\nexport function normalizeDockEntry(value: unknown): DockEntry | null {\n if (!value || typeof value !== 'object') {\n return null;\n }\n const record = value as Record<string, unknown>;\n const wrapped = 'tree' in record && !('kind' in record);\n const node = normalizeNode(wrapped ? record['tree'] : value);\n if (node === null) {\n return null;\n }\n const declared =\n wrapped && typeof record['primary'] === 'string'\n ? record['primary']\n : PRIMARY_PANE;\n return { node, primary: healedPrimary(node, declared) };\n}\n\nexport function healedPrimary(\n node: PaneNode,\n candidate: string | undefined,\n): string {\n return candidate !== undefined && findLeaf(node, candidate) !== null\n ? candidate\n : collectLeafIds(node)[0];\n}\n","export const DEFAULT_WORKSPACE_ID = 'default';\n\nimport {\n PaneArea,\n PaneAreaBase,\n PaneColumnArea,\n PaneRowArea,\n PaneTabArea,\n} from '@loomweaver/plugin-sdk';\nimport {\n BakedTab,\n PaneAreaTree,\n paneAreaTree,\n} from '../regions/pane/tree/pane-area-tree';\nimport { conflictingClaims, type WorkspaceClaim } from './workspace-claims';\nimport { CONTENT_DOCK, VIEW_PANE_PREFIX } from '../regions/pane/tree/pane-address';\nimport { normalizeNode } from '../regions/pane/tree/pane-restore';\n\n/**\n * A developer-defined workspace a distribution ships with {@link provideWorkspaces}: the same thing a\n * user can build and save, only its baseline lives in code — it is never written to storage, the user\n * cannot overwrite, rename or delete it, and it moves with product updates. Switching, the automatic\n * per-workspace working state and **Reset** (back to this declaration) work exactly as for a\n * user-saved workspace.\n */\nexport interface WorkspaceDefinition {\n /**\n * Stable identity — keys the workspace's working state. `default` is reserved for the built-in\n * empty workspace; a duplicate id keeps the first declaration.\n */\n readonly id: string;\n /** Display name — a translation key; a literal string falls back to itself. */\n readonly title: string;\n /** Optional icon (registry name) shown next to the name in the workspace management UI. */\n readonly icon?: string;\n /**\n * Makes this the workspace a fresh install opens in, instead of the empty `default` one. It applies\n * **once**, on a first boot with nothing stored yet: from then on the user's own last choice wins,\n * so switching away is not undone by the next reload. A deep link still wins over the declaration —\n * the baseline is laid out, but an incoming address is navigated to, so a shared link opens what it\n * names. If two declarations set this, the first one wins, as with a duplicate id.\n */\n readonly initial?: boolean;\n /**\n * Which views each sidebar shows, keyed by the **panel region id** of your layout. A listed region\n * shows exactly the named views; everything else declared for it is hidden and can be brought back\n * through the strip's context menu. List a region with an **empty array** to show none of its views\n * — the sidebar itself stays, empty. A region you leave out, or omitting the whole field, keeps\n * whatever the user has there. **Whether a sidebar exists, is open and how wide it is belongs to the\n * window, not to the workspace**: your layout decides which sidebars the app has, the user decides\n * whether they are open, and switching workspaces never collapses, resizes or removes one.\n */\n readonly sidebars?: Readonly<Record<string, readonly string[]>>;\n /**\n * The content addresses that belong to this workspace, as route paths in the same vocabulary as\n * {@link content} — `quotes/:id` claims every quote document and everything below one. Reaching a\n * claimed address activates this workspace and shows the content inside it, **however the address\n * was reached**: a link followed into the application, a restart, a command, a programmatic\n * navigation or a tab a plugin opened. Without a claim an address is shown wherever the user\n * already is, which is the behaviour of every workspace that declares none.\n *\n * Where two workspaces claim addresses of the same shape, neither is narrower and the claim is\n * dropped from both with a message naming them; a narrower claim (more segments, or fewer\n * parameters at the same length) simply wins. A workspace the **user** saved is never a\n * destination, however it came by its claim — it exists on one machine only, and an address that\n * led somewhere different for every user would not be an address.\n */\n readonly claims?: readonly string[];\n /**\n * The content area as a recursive arrangement: an area either holds `tabs`, splits into `rows`\n * (top to bottom) or splits into `columns` (left to right). The **first** tabs area in reading\n * order becomes the URL pane; switching to the workspace navigates to its active tab. Omit to\n * start on the empty layout.\n */\n readonly content?: WorkspaceArea;\n}\n\n/**\n * One node of a {@link WorkspaceDefinition} content declaration — the shared {@link PaneArea} grammar\n * over route paths. A container declares its own arrangement in the same grammar over\n * child surface ids.\n */\nexport type WorkspaceArea = PaneArea<WorkspaceTabEntry>;\n\nexport type WorkspaceAreaBase = PaneAreaBase;\n\n/** An area that holds tabs. */\nexport type WorkspaceTabArea = PaneTabArea<WorkspaceTabEntry>;\n\n/** An area that splits into rows, top to bottom. */\nexport type WorkspaceRowArea = PaneRowArea<WorkspaceTabEntry>;\n\n/** An area that splits into columns, left to right. */\nexport type WorkspaceColumnArea = PaneColumnArea<WorkspaceTabEntry>;\n\n/** A tab in a workspace declaration — a route path, or the object form for the extra flags. */\nexport type WorkspaceTabEntry = string | WorkspaceTab;\n\nexport interface WorkspaceTab {\n /** The surface route path the tab opens (sidebar views belong under `sidebars`, not here). */\n readonly path: string;\n /**\n * `false` fixes the tab in this workspace: it shows no close affordance, \"close others\" and\n * \"close all\" spare it, and it cannot be dragged away. Reset restores it either way.\n */\n readonly closable?: boolean;\n /** Marks the area's initially active tab; without it the first tab is active. */\n readonly active?: boolean;\n}\n\nexport interface WorkspaceBaselineState {\n readonly trees?: string;\n readonly hiddenViews?: string;\n}\n\nexport interface WorkspaceBaselineDeps {\n readonly panelRegions: readonly string[];\n readonly declaredPaths: (regionId: string) => readonly string[];\n}\n\nexport function auditWorkspaceDefinitions(\n definitions: readonly WorkspaceDefinition[],\n panelRegions: readonly string[],\n): string[] {\n const problems: string[] = [];\n const seen = new Set<string>();\n let initial: string | null = null;\n for (const definition of definitions) {\n if (definition.id === DEFAULT_WORKSPACE_ID) {\n problems.push(\n `Workspace definition id \"default\" collides with the built-in default workspace — the definition is ignored.`,\n );\n continue;\n }\n if (seen.has(definition.id)) {\n problems.push(\n `Workspace \"${definition.id}\" is declared twice — the later declaration is ignored.`,\n );\n continue;\n }\n seen.add(definition.id);\n if (definition.initial) {\n if (initial !== null) {\n problems.push(\n `Workspace \"${definition.id}\" also declares initial: true — \"${initial}\" already does, so this one is ignored.`,\n );\n } else {\n initial = definition.id;\n }\n }\n auditDefinition(definition, panelRegions, problems);\n }\n problems.push(...conflictingClaims(claimsOf(definitions)));\n return problems;\n}\n\nexport function claimsOf(\n definitions: readonly WorkspaceDefinition[],\n): readonly WorkspaceClaim[] {\n return dedupedDefinitions(definitions).flatMap((definition) =>\n (definition.claims ?? []).map((pattern) => ({\n workspaceId: definition.id,\n pattern,\n })),\n );\n}\n\nfunction auditDefinition(\n definition: WorkspaceDefinition,\n panelRegions: readonly string[],\n problems: string[],\n): void {\n if (definition.content !== undefined) {\n const { node } = contentTree(definition, problems);\n if (node === null) {\n problems.push(\n `Workspace \"${definition.id}\": the content declaration is invalid — it is ignored and the workspace starts on the empty layout.`,\n );\n }\n }\n for (const region of Object.keys(definition.sidebars ?? {})) {\n if (!panelRegions.includes(region)) {\n problems.push(\n `Workspace \"${definition.id}\": sidebars names \"${region}\", which is no panel region of this layout — the entry is ignored.`,\n );\n }\n }\n}\n\nexport function dedupedDefinitions(\n definitions: readonly WorkspaceDefinition[],\n): WorkspaceDefinition[] {\n const seen = new Set<string>([DEFAULT_WORKSPACE_ID]);\n return definitions.filter((definition) => {\n if (seen.has(definition.id)) {\n return false;\n }\n seen.add(definition.id);\n return true;\n });\n}\n\nexport function workspaceBaseline(\n definition: WorkspaceDefinition,\n deps: WorkspaceBaselineDeps,\n): WorkspaceBaselineState {\n return {\n ...baselineTrees(definition),\n ...baselineSidebars(definition, deps),\n };\n}\n\nfunction baselineTrees(\n definition: WorkspaceDefinition,\n): Pick<WorkspaceBaselineState, 'trees'> {\n if (definition.content === undefined) {\n return {};\n }\n const { node } = contentTree(definition, []);\n const tree = node === null ? null : normalizeNode(node);\n return tree === null\n ? {}\n : { trees: JSON.stringify({ [CONTENT_DOCK]: tree }) };\n}\n\nfunction baselineSidebars(\n definition: WorkspaceDefinition,\n deps: WorkspaceBaselineDeps,\n): Pick<WorkspaceBaselineState, 'hiddenViews'> {\n const sidebars = definition.sidebars;\n if (sidebars === undefined) {\n return {};\n }\n const listed = deps.panelRegions.filter((region) => region in sidebars);\n const hidden = listed\n .flatMap((region) =>\n deps\n .declaredPaths(region)\n .map((path) => path.slice(VIEW_PANE_PREFIX.length))\n .filter((id) => !sidebars[region].includes(id)),\n )\n .sort();\n return hidden.length === 0 ? {} : { hiddenViews: JSON.stringify(hidden) };\n}\n\nexport function declaredTabPaths(definition: WorkspaceDefinition): string[] {\n if (definition.content === undefined) {\n return [];\n }\n return contentTree(definition, []).tabs.map((tab) => tab.path);\n}\n\nfunction contentTree(\n definition: WorkspaceDefinition,\n problems: string[],\n): PaneAreaTree {\n return definition.content === undefined\n ? { node: null, tabs: [] }\n : paneAreaTree(\n definition.content,\n {\n context: `Workspace \"${definition.id}\"`,\n idPrefix: `ws:${definition.id}`,\n bake: (entry, found) => bakeTab(definition.id, entry, found),\n },\n problems,\n );\n}\n\nfunction bakeTab(\n definitionId: string,\n entry: WorkspaceTabEntry,\n problems: string[],\n): BakedTab | null {\n const tab = typeof entry === 'string' ? { path: entry } : entry;\n if (tab.path.startsWith(VIEW_PANE_PREFIX)) {\n problems.push(\n `Workspace \"${definitionId}\": content tabs cannot hold sidebar views (\"${tab.path}\") — ` +\n `declare the view under sidebars instead; the tab is dropped.`,\n );\n return null;\n }\n return {\n tab: {\n path: tab.path,\n ...(tab.closable === false ? { closable: false } : {}),\n },\n active: tab.active === true,\n };\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { WORKSPACE_DEFINITIONS } from './provide-workspaces';\nimport { DEFAULT_WORKSPACE_ID } from './workspace-definition';\n\nconst ACTIVE_KEY = 'lw.shell.active-workspace';\n\nexport { DEFAULT_WORKSPACE_ID } from './workspace-definition';\n\nexport function workspaceScopedKey(base: string, workspaceId: string): string {\n return `${base}:${workspaceId}`;\n}\n\nfunction storedId(raw: string | undefined): string | null {\n return raw?.trim() ? raw : null;\n}\n\n@Service()\nexport class ActiveWorkspaceService {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly declaredInitial =\n (inject(WORKSPACE_DEFINITIONS, { optional: true }) ?? [])\n .flat()\n .find((definition) => definition.initial)?.id ?? null;\n private readonly active = signal(\n storedId(this.store.peek?.(ACTIVE_KEY)) ??\n (this.store.peek ? this.declaredInitial : null) ??\n DEFAULT_WORKSPACE_ID,\n );\n readonly id = this.active.asReadonly();\n\n private adopted = false;\n readonly ready: Promise<string> = this.resolveInitial();\n\n set(id: string): void {\n this.adopted = false;\n this.active.set(id);\n void this.store.set(ACTIVE_KEY, id);\n }\n\n takeAdoption(): string | null {\n if (!this.adopted) {\n return null;\n }\n this.adopted = false;\n return this.active();\n }\n\n scopedKey(base: string): string {\n return workspaceScopedKey(base, this.active());\n }\n\n private resolveInitial(): Promise<string> {\n if (this.store.peek) {\n this.adoptIfUnseen(storedId(this.store.peek(ACTIVE_KEY)));\n return Promise.resolve(this.active());\n }\n return this.store\n .get(ACTIVE_KEY)\n .then((raw) => {\n const id = storedId(raw);\n if (id) {\n this.active.set(id);\n } else {\n this.adoptIfUnseen(null);\n }\n return this.active();\n })\n .catch(() => this.active());\n }\n\n private adoptIfUnseen(stored: string | null): void {\n if (stored !== null || this.declaredInitial === null) {\n return;\n }\n this.adopted = true;\n this.active.set(this.declaredInitial);\n void this.store.set(ACTIVE_KEY, this.declaredInitial);\n }\n}\n","interface MovableParent extends Node {\n moveBefore(node: Node, child: Node | null): void;\n}\n\nfunction movable(parent: Node | null | undefined): parent is MovableParent {\n return (\n typeof (parent as Partial<MovableParent> | null | undefined)?.moveBefore ===\n 'function'\n );\n}\n\nexport function supportsAtomicMove(document: Document): boolean {\n return movable(document.body ?? document.documentElement);\n}\n\nexport function moveNode(\n parent: Node,\n node: Node,\n before: Node | null,\n): boolean {\n if (!movable(parent) || !node.isConnected) {\n parent.insertBefore(node, before);\n return false;\n }\n try {\n parent.moveBefore(node, before);\n return true;\n } catch {\n parent.insertBefore(node, before);\n return false;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n EmbeddedViewRef,\n inject,\n OnDestroy,\n Service,\n signal,\n Signal,\n} from '@angular/core';\nimport { ActiveWorkspaceService } from '../../../workspace/active-workspace.service';\nimport { moveNode, supportsAtomicMove } from './atomic-move';\nimport { SurfaceRetentionMode, instanceDirty } from './retention-policy';\nimport {\n ParkedEntry,\n RetainedSlot,\n RetainedViewHandle,\n RetainedViewSource,\n} from './retained-view-model';\n\ninterface HiddenNode {\n readonly element: HTMLElement;\n readonly display: string;\n}\n\ninterface StashEntry {\n readonly key: string;\n readonly source: RetainedViewSource;\n readonly view: EmbeddedViewRef<unknown>;\n readonly instance?: unknown;\n readonly tracked: boolean;\n workspace: string;\n owner: object | null;\n inUse: boolean;\n retained: boolean;\n inPlace: boolean;\n mode: SurfaceRetentionMode;\n keep: boolean;\n hidden: readonly HiddenNode[];\n}\n\nfunction liveRootNodes(entry: StashEntry): readonly Node[] {\n return entry.view.destroyed ? [] : entry.view.rootNodes;\n}\n\nfunction elementsOf(entry: StashEntry): HTMLElement[] {\n return liveRootNodes(entry).filter(\n (node): node is HTMLElement => node.nodeType === 1,\n );\n}\n\nfunction parkedInPlaceAt(entry: StashEntry, parent: Node | null): boolean {\n const nodes = liveRootNodes(entry);\n return (\n nodes.length > 0 &&\n nodes.every((node) => node.isConnected && node.parentNode === parent)\n );\n}\n\nfunction orphaned(entry: StashEntry): boolean {\n return (\n entry.inPlace && liveRootNodes(entry).some((node) => !node.isConnected)\n );\n}\n\n@Service()\nexport class RetainedViewStash implements OnDestroy {\n private readonly appRef = inject(ApplicationRef);\n private readonly document = inject(DOCUMENT);\n private readonly workspace = inject(ActiveWorkspaceService);\n private readonly atomicMove = supportsAtomicMove(this.document);\n private readonly entries = new Map<string, StashEntry>();\n private readonly changes = signal(0);\n private sweepQueued = false;\n private holdingArea: HTMLElement | null = null;\n\n readonly version: Signal<number> = this.changes.asReadonly();\n\n acquire(\n key: string,\n source: RetainedViewSource,\n create: () => RetainedViewHandle,\n parent: Node | null = null,\n ): RetainedSlot {\n const entry =\n this.claimableEntry(key, source, parent) ??\n this.createEntry(key, source, create);\n const attached = entry.inPlace && parkedInPlaceAt(entry, parent);\n this.reveal(entry);\n const token = {};\n entry.owner = token;\n entry.workspace = this.workspace.id();\n entry.inUse = true;\n entry.retained = false;\n entry.inPlace = false;\n this.bump();\n const owns = () => entry.owner === token;\n return {\n attached,\n get rootNodes(): readonly Node[] {\n return liveRootNodes(entry);\n },\n stale: () =>\n entry.tracked && (!owns() || this.entries.get(key) !== entry),\n describe: (mode: SurfaceRetentionMode, retain: boolean) => {\n if (owns()) {\n entry.mode = mode;\n entry.keep = retain;\n }\n },\n release: (retained: boolean) => {\n if (owns()) {\n this.release(entry, retained);\n }\n },\n hide: (retained: boolean) => {\n if (owns()) {\n this.park(entry, retained);\n }\n },\n discard: () => {\n if (owns()) {\n this.discard(entry);\n }\n },\n };\n }\n\n parked(): ParkedEntry[] {\n return [...this.entries.values()]\n .filter((entry) => !entry.inUse)\n .map((entry) => ({\n key: entry.key,\n retained: entry.retained,\n workspace: entry.workspace,\n instance: entry.instance,\n }));\n }\n\n instances(): unknown[] {\n return [...this.entries.values()]\n .map((entry) => entry.instance)\n .filter((instance) => instance !== undefined);\n }\n\n keyedInstances(): { key: string; instance: unknown }[] {\n return [...this.entries.values()]\n .filter((entry) => entry.instance !== undefined)\n .map((entry) => ({ key: entry.key, instance: entry.instance }));\n }\n\n instancesFor(scope: string, path: string): unknown[] {\n const exact = `${scope}|${path}`;\n const prefix = `${exact}|`;\n return [...this.entries.values()]\n .filter((entry) => entry.key === exact || entry.key.startsWith(prefix))\n .map((entry) => entry.instance)\n .filter((instance) => instance !== undefined);\n }\n\n evacuate(scopePrefix: string): void {\n if (!this.atomicMove) {\n return;\n }\n for (const entry of this.entries.values()) {\n if (\n entry.inUse &&\n entry.keep &&\n entry.mode === 'in-place' &&\n entry.key.startsWith(scopePrefix)\n ) {\n this.moveToHoldingArea(entry);\n }\n }\n }\n\n evictParked(key: string): void {\n const entry = this.entries.get(key);\n if (entry && !entry.inUse) {\n this.destroyEntry(entry);\n }\n }\n\n evictWorkspace(workspaceId: string): void {\n for (const entry of [...this.entries.values()]) {\n if (!entry.inUse && entry.workspace === workspaceId) {\n this.destroyEntry(entry);\n }\n }\n }\n\n ngOnDestroy(): void {\n for (const entry of [...this.entries.values()]) {\n this.destroyEntry(entry);\n }\n this.holdingArea?.remove();\n this.holdingArea = null;\n }\n\n private claimableEntry(\n key: string,\n source: RetainedViewSource,\n parent: Node | null,\n ): StashEntry | null {\n const entry = this.entries.get(key);\n if (!entry) {\n return null;\n }\n if (entry.inUse) {\n return entry.source === source && !entry.view.destroyed ? entry : null;\n }\n const reclaimable =\n entry.source === source &&\n !entry.view.destroyed &&\n (!entry.inPlace ||\n parkedInPlaceAt(entry, parent) ||\n this.relocatable(entry));\n if (!reclaimable) {\n this.destroyEntry(entry);\n return null;\n }\n return entry;\n }\n\n private createEntry(\n key: string,\n source: RetainedViewSource,\n create: () => RetainedViewHandle,\n ): StashEntry {\n const occupied = this.entries.get(key)?.inUse === true;\n const { view, instance } = create();\n this.appRef.attachView(view);\n const entry: StashEntry = {\n key,\n source,\n view,\n instance,\n tracked: !occupied,\n workspace: this.workspace.id(),\n owner: null,\n inUse: false,\n retained: false,\n inPlace: false,\n mode: 'move',\n keep: false,\n hidden: [],\n };\n if (entry.tracked) {\n this.entries.set(key, entry);\n }\n return entry;\n }\n\n private release(entry: StashEntry, retained: boolean): void {\n if (!entry.inUse) {\n return;\n }\n this.pullNodes(entry);\n this.detain(entry, retained);\n }\n\n private park(entry: StashEntry, retained: boolean): void {\n if (!entry.inUse) {\n return;\n }\n if (retained && this.atomicMove) {\n this.moveToHoldingArea(entry);\n }\n entry.hidden = elementsOf(entry).map((element) => {\n const display = element.style.display;\n element.style.display = 'none';\n return { element, display };\n });\n entry.inPlace = true;\n this.detain(entry, retained);\n }\n\n private detain(entry: StashEntry, retained: boolean): void {\n entry.inUse = false;\n entry.owner = null;\n if (!entry.tracked) {\n this.destroyEntry(entry);\n return;\n }\n entry.retained = retained;\n this.bump();\n this.queueSweep();\n }\n\n private reveal(entry: StashEntry): void {\n for (const { element, display } of entry.hidden) {\n element.style.display = display;\n }\n entry.hidden = [];\n }\n\n private relocatable(entry: StashEntry): boolean {\n return (\n this.atomicMove && liveRootNodes(entry).every((node) => node.isConnected)\n );\n }\n\n private moveToHoldingArea(entry: StashEntry): void {\n const area = this.holdingAreaElement();\n for (const node of liveRootNodes(entry)) {\n if (node.parentNode !== area) {\n moveNode(area, node, null);\n }\n }\n }\n\n private holdingAreaElement(): HTMLElement {\n if (this.holdingArea?.isConnected) {\n return this.holdingArea;\n }\n const area = this.document.createElement('div');\n area.dataset['lwRetentionHold'] = '';\n area.style.display = 'none';\n this.document.body.appendChild(area);\n this.holdingArea = area;\n return area;\n }\n\n private discard(entry: StashEntry): void {\n entry.inUse = false;\n entry.owner = null;\n this.destroyEntry(entry);\n }\n\n private pullNodes(entry: StashEntry): void {\n for (const node of liveRootNodes(entry)) {\n node.parentNode?.removeChild(node);\n }\n }\n\n private destroyEntry(entry: StashEntry): void {\n this.pullNodes(entry);\n if (this.entries.get(entry.key) === entry) {\n this.entries.delete(entry.key);\n }\n if (!entry.view.destroyed) {\n this.appRef.detachView(entry.view);\n entry.view.destroy();\n }\n this.bump();\n }\n\n private bump(): void {\n this.changes.update((value) => value + 1);\n }\n\n private queueSweep(): void {\n if (this.sweepQueued) {\n return;\n }\n this.sweepQueued = true;\n queueMicrotask(() => {\n this.sweepQueued = false;\n for (const entry of [...this.entries.values()]) {\n if (entry.inUse) {\n continue;\n }\n if (\n orphaned(entry) ||\n (!entry.retained && !instanceDirty(entry.instance))\n ) {\n this.destroyEntry(entry);\n }\n }\n });\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { ChildrenOutletContexts, Router } from '@angular/router';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { ContentReuseStrategy } from '../../content/routing/content-reuse-strategy';\nimport { matchRoute, normalizePath } from '../../content/content-path';\nimport { VIEW_PANE_PREFIX } from '../tree/pane-address';\nimport { RetainedViewStash } from './retained-view-stash';\n\n@Service()\nexport class RetentionCandidates {\n private readonly stash = inject(RetainedViewStash);\n private readonly reuse = inject(ContentReuseStrategy);\n private readonly outletContexts = inject(ChildrenOutletContexts);\n private readonly router = inject(Router);\n private readonly registry = inject(ContributionRegistry);\n\n all(): unknown[] {\n return [\n ...this.stash.instances(),\n ...this.parkedInstances(() => true),\n ...this.activeOutletInstance(() => true),\n ];\n }\n\n ofPlugin(pluginId: string): unknown[] {\n const owns = this.pathOwnership(pluginId);\n return [\n ...this.stash\n .keyedInstances()\n .filter((entry) => owns(pathOfStashKey(entry.key)))\n .map((entry) => entry.instance),\n ...this.parkedInstances(owns),\n ...this.activeOutletInstance(owns),\n ];\n }\n\n private parkedInstances(owns: (path: string) => boolean): unknown[] {\n return this.reuse\n .parkedHandles()\n .filter((handle) => handle.instance !== undefined && owns(handle.key))\n .map((handle) => handle.instance);\n }\n\n private activeOutletInstance(owns: (path: string) => boolean): unknown[] {\n const outlet = this.outletContexts.getContext('primary')?.outlet;\n if (outlet?.isActivated !== true) {\n return [];\n }\n return owns(normalizePath(this.router.url)) ? [outlet.component] : [];\n }\n\n private pathOwnership(pluginId: string): (path: string) => boolean {\n const routes = this.registry\n .contentRoutes()\n .filter((route) => route.pluginId === pluginId);\n const viewIds = new Set(\n this.registry\n .views()\n .filter((view) => view.pluginId === pluginId)\n .map((view) => view.id),\n );\n return (path) => {\n if (path === '') {\n return false;\n }\n if (path.startsWith(VIEW_PANE_PREFIX)) {\n return viewIds.has(path.slice(VIEW_PANE_PREFIX.length));\n }\n return matchRoute(routes, path) !== undefined;\n };\n }\n}\n\nfunction pathOfStashKey(key: string): string {\n return key.split('|')[1] ?? '';\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, OnDestroy, Service } from '@angular/core';\nimport { isPopoutUrl } from '../../../popout/popout-path';\nimport { RetentionCandidates } from './retention-candidates';\nimport { instanceDirty } from './retention-policy';\n\n@Service()\nexport class RetentionUnloadGuard implements OnDestroy {\n private readonly candidates = inject(RetentionCandidates);\n private readonly document = inject(DOCUMENT);\n private readonly popout = isPopoutUrl(\n inject(DOCUMENT).location?.pathname ?? '',\n );\n private started = false;\n private suppressed = false;\n\n start(): void {\n if (this.started || this.popout) {\n return;\n }\n this.started = true;\n this.document.defaultView?.addEventListener(\n 'beforeunload',\n this.onBeforeUnload,\n );\n }\n\n suppress(): void {\n this.suppressed = true;\n }\n\n ngOnDestroy(): void {\n this.document.defaultView?.removeEventListener(\n 'beforeunload',\n this.onBeforeUnload,\n );\n }\n\n private readonly onBeforeUnload = (event: BeforeUnloadEvent): void => {\n if (this.suppressed) {\n return;\n }\n const dirty = this.candidates\n .all()\n .some((instance) => instanceDirty(instance));\n if (!dirty) {\n return;\n }\n event.preventDefault();\n event.returnValue = '';\n };\n}\n","import { effect, inject, Injector, Service, Signal, untracked } from '@angular/core';\nimport { AuthSnapshot } from '@loomweaver/plugin-sdk';\nimport { RetentionUnloadGuard } from '../regions/pane/retention/retention-unload-guard';\n\n@Service()\nexport class IdentityChangeReload {\n private readonly injector = inject(Injector);\n private readonly unloadGuard = inject(RetentionUnloadGuard);\n private lastSubject: string | null = null;\n private started = false;\n\n start(source: Signal<AuthSnapshot>): void {\n if (this.started) {\n return;\n }\n this.started = true;\n effect(\n () => {\n const subject = source().subject ?? null;\n if (subject === null) {\n return;\n }\n if (this.lastSubject !== null && this.lastSubject !== subject) {\n untracked(() => {\n this.unloadGuard.suppress();\n this.reload();\n });\n return;\n }\n this.lastSubject = subject;\n },\n { injector: this.injector },\n );\n }\n\n protected reload(): void {\n location.reload();\n }\n}\n","import { computed, EnvironmentProviders, inject, InjectionToken, makeEnvironmentProviders, provideEnvironmentInitializer, Provider, Service, signal, Signal } from '@angular/core';\nimport {\n AccessRequirement,\n ANONYMOUS,\n AuthSnapshot,\n isAccessDisabled,\n isAccessVisible,\n meetsAccess,\n} from '@loomweaver/plugin-sdk';\nimport { IdentityChangeReload } from './identity-change';\n\nconst ANONYMOUS_SOURCE: Signal<AuthSnapshot> = signal(ANONYMOUS).asReadonly();\n\n/**\n * The distribution-supplied session snapshot signal. Defaults to **anonymous** so the\n * bare platform runs with nobody signed in; a distribution maps its product's auth (OIDC/custom/…)\n * into an {@link AuthSnapshot} signal via {@link provideAuthSource}. LoomWeaver never owns auth — it\n * only reads this signal.\n */\nexport const AUTH_SOURCE = new InjectionToken<Signal<AuthSnapshot>>(\n 'AUTH_SOURCE',\n {\n providedIn: 'root',\n factory: () => ANONYMOUS_SOURCE,\n },\n);\n\n/**\n * What the shell does when one established identity is replaced by another.\n * The comparison anchor is {@link AuthSnapshot.subject}.\n */\nexport interface AuthSourceOptions {\n /**\n * `'reload'`: when a snapshot carries a **different** non-empty `subject` than the one already\n * established this app lifetime, the shell performs a full `location.reload()` — the\n * guaranteed-clean user switch (no pane trees, tab titles or plugin in-memory state of the\n * previous user survive; paired with an identity-scoped settings store, the new session\n * re-hydrates entirely from its own namespace). First sign-in (anonymous → subject) and\n * sign-out (subject → anonymous) never fire, so an async session restore at boot causes no\n * reload flicker. Snapshots without a `subject` never fire either. Default: `'ignore'`.\n */\n onIdentityChange?: 'reload' | 'ignore';\n}\n\n/**\n * A distribution declares its auth source. The factory runs in the injection context, so it can\n * `inject()` the product's own session/BFF service and return a signal derived from it. Pass\n * `options` to opt into the identity-change policy: with\n * `{ onIdentityChange: 'reload' }` a user switch on a shared browser reloads the app instead of\n * leaving the previous user's in-memory state alive.\n */\nexport function provideAuthSource(\n factory: () => Signal<AuthSnapshot>,\n options?: AuthSourceOptions,\n): EnvironmentProviders {\n const providers: (Provider | EnvironmentProviders)[] = [\n { provide: AUTH_SOURCE, useFactory: factory },\n ];\n if (options?.onIdentityChange === 'reload') {\n providers.push(\n provideEnvironmentInitializer(() =>\n inject(IdentityChangeReload).start(inject(AUTH_SOURCE)),\n ),\n );\n }\n return makeEnvironmentProviders(providers);\n}\n\n/**\n * Reactive read-only view of the current session, plus the gating predicates the host chrome uses to\n * hide/disable contributions. Roles/claims are opaque — this service matches, never\n * interprets. Client-side gating is presentation, not a security boundary.\n */\n@Service()\nexport class AuthContext {\n private readonly source = inject(AUTH_SOURCE);\n\n /** The current session snapshot (reactive). */\n readonly state = computed(() => this.source());\n /** Whether someone is signed in. */\n readonly authenticated = computed(() => this.state().authenticated);\n /** The current principal's roles. */\n readonly roles = computed(() => this.state().roles);\n\n /** True if the current principal holds `role`. */\n hasRole(role: string): boolean {\n return this.state().roles.includes(role);\n }\n\n /** True if the current session satisfies `access` (undefined = always). */\n meets(access: AccessRequirement | undefined): boolean {\n return meetsAccess(access, this.state());\n }\n\n /** Whether a chrome item with this requirement should render (unmet + hide → false). */\n visible(access: AccessRequirement | undefined): boolean {\n return isAccessVisible(access, this.state());\n }\n\n /** Whether a rendered chrome item with this requirement should be disabled (unmet + disable). */\n disabled(access: AccessRequirement | undefined): boolean {\n return isAccessDisabled(access, this.state());\n }\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n makeEnvironmentProviders,\n} from '@angular/core';\n\n/**\n * Gestures the content area offers on tabs and panes. Each field takes the **affordance and the\n * gesture**: switching one off removes the button, the drag target and the keyboard shortcut alike,\n * so a capability can never come back through a second door.\n */\nexport interface ContentFeatures {\n /** Closing a tab: the × affordance, the `Delete` key and the close entries of the tab menu. */\n readonly close: boolean;\n /** Pinning a tab: the menu entry, the pin affordance and the pin step of the double-click cycle. */\n readonly pin: boolean;\n /**\n * The double-click cycle on a tab (preview → keep → pin → unpin). The first step is the one users\n * arrive expecting, and a preview tab says so itself — its tooltip reads \"double-click to keep\n * open\", which is why the hint is drawn only while this is on. Switch it off and the tooltip drops\n * the promise; every step of the cycle stays reachable from the tab's context menu either way.\n */\n readonly escalate: boolean;\n /** Dragging a tab into another pane, and onto an empty pane. */\n readonly moveTabs: boolean;\n /** The single reused italic **preview** slot (VS-Code \"Preview Editors\"). With it off, `openContentTab({ preview: true })` opens a permanent tab. */\n readonly preview: boolean;\n /** The \"+\" button that opens the new-tab picker. */\n readonly newTab: boolean;\n /** Splitting a pane horizontally: the toolbar button, the left/right drop edges and `mod+\\`. */\n readonly splitRight: boolean;\n /** Splitting a pane vertically: the toolbar button and the top/bottom drop edges. */\n readonly splitDown: boolean;\n /** Blowing a pane up to the whole content area. */\n readonly maximize: boolean;\n /** Collapsing a pane into the minimised strip. */\n readonly minimize: boolean;\n /** Reordering tabs within their band, by drag or `Alt+Arrow`. */\n readonly reorderTabs: boolean;\n}\n\n/** Gestures the side panels offer on their docked views. */\nexport interface SidebarFeatures {\n /** Collapsing and expanding a panel. The close button of the compact drawer is not affected. */\n readonly collapse: boolean;\n /** Dragging a panel wider or narrower. */\n readonly resize: boolean;\n /** Reordering view tabs **within** one panel, by drag or `Alt+Arrow`. */\n readonly reorderViews: boolean;\n /** Moving a view to the other sidebar: the menu entry, the drag and `Alt+Shift+Arrow`. */\n readonly moveViews: boolean;\n /** Hiding a view from this workspace (menu entry). */\n readonly hideViews: boolean;\n /** The checklist on the icon strip that says which views live here. */\n readonly curate: boolean;\n /** Stacking a second view below the first: the menu entry and the drop edges of a panel. */\n readonly stackViews: boolean;\n /** Parking a foreign tab in a sidebar, by dragging it onto the strip or a drop edge. */\n readonly acceptTabs: boolean;\n /** Opening a docked view in the content area (menu entry). */\n readonly openViewInContent: boolean;\n /** Resetting the stored state of a view (menu entry). */\n readonly resetViewState: boolean;\n /** The named-instance switcher in the panel header, where a surface declares `instanceable`. */\n readonly instances: boolean;\n}\n\n/** Gestures the rail offers on its items. */\nexport interface RailFeatures {\n /** Reordering rail items **within** their band, by drag or `Alt+Arrow`. */\n readonly reorder: boolean;\n /** Moving an item to the other rail: the menu entry, the drag and `Alt+Shift+Arrow`. */\n readonly moveItems: boolean;\n /** Hiding a rail item (menu entry). */\n readonly hideItems: boolean;\n /** The checklist on empty rail space that says which items live here. */\n readonly curate: boolean;\n}\n\n/** Whether named workspaces exist for this product at all. */\nexport interface WorkspaceFeatures {\n /**\n * The workspace machinery the shell offers on its own: the manage and reset commands and the\n * workspace entries in the rail. Switching it off leaves the storage scoping untouched — the\n * active workspace still names the layout keys, the user just never meets the concept.\n */\n readonly enabled: boolean;\n /**\n * Whether the user may put a workspace **they saved** in the rail. A saved workspace is never\n * there by itself — the user places it from *Customize activity bar* — and switching this off\n * withdraws that offer, so the rail holds what your product put there and nothing else. Their\n * placements are kept rather than erased, so switching it back on restores what each user had.\n *\n * Everything else about a saved workspace is untouched: saving, renaming, resetting and switching\n * all work, with the workspace dialog as the way to them. This says nothing about **whether** a\n * user may save workspaces, which is a different question and has no switch.\n */\n readonly savedInRail: boolean;\n}\n\n/** Whether a tab or a view may be torn off into a browser window of its own. */\nexport interface WindowFeatures {\n /** \"Open in new window\" on a tab and on a docked view. */\n readonly popout: boolean;\n}\n\n/** How commands reach the user beyond the buttons that name them. */\nexport interface CommandFeatures {\n /**\n * Keyboard shortcuts at all: the global listener that turns a chord into a command, and the\n * chord hints the shell prints beside menu entries, palette rows and bar buttons. With it off a\n * command is still reachable by its button and by the palette, and no hint promises a key that\n * does nothing.\n */\n readonly shortcuts: boolean;\n /** The \"recently used\" section at the top of the command palette (and the list behind it). */\n readonly recentlyUsed: boolean;\n}\n\n/**\n * Which shell capabilities a distribution offers its users. The platform ships the full workbench —\n * every capability here is on by default — and a product that would overwhelm its users switches\n * parts off.\n *\n * This is the home for **gestures**. A *contribution* (a command, a bar or rail item, a settings row,\n * a menu entry) is not a gesture and is removed with `provideShell({ omit })` instead. Where a\n * capability has both — a menu entry *and* a drag — the feature switch wins and takes the entry with\n * it, while `omit` stays the finer tool for \"entry gone, gesture stays\".\n */\nexport interface ShellFeatures {\n readonly content: ContentFeatures;\n readonly sidebar: SidebarFeatures;\n readonly rail: RailFeatures;\n readonly workspaces: WorkspaceFeatures;\n readonly windows: WindowFeatures;\n readonly commands: CommandFeatures;\n}\n\n/** The default workbench: every capability on. */\nexport const DEFAULT_SHELL_FEATURES: ShellFeatures = {\n content: {\n close: true,\n pin: true,\n escalate: true,\n moveTabs: true,\n preview: true,\n newTab: true,\n splitRight: true,\n splitDown: true,\n maximize: true,\n minimize: true,\n reorderTabs: true,\n },\n sidebar: {\n collapse: true,\n resize: true,\n reorderViews: true,\n moveViews: true,\n hideViews: true,\n curate: true,\n stackViews: true,\n acceptTabs: true,\n openViewInContent: true,\n resetViewState: true,\n instances: true,\n },\n rail: {\n reorder: true,\n moveItems: true,\n hideItems: true,\n curate: true,\n },\n workspaces: { enabled: true, savedInRail: true },\n windows: { popout: true },\n commands: { shortcuts: true, recentlyUsed: true },\n};\n\nexport const SHELL_FEATURES = new InjectionToken<ShellFeatures>(\n 'lw.shell-features',\n {\n providedIn: 'root',\n factory: () => DEFAULT_SHELL_FEATURES,\n },\n);\n\n/** A partial override: name only what you switch off, group by group. */\nexport type ShellFeaturesInput = {\n readonly [Group in keyof ShellFeatures]?: Partial<ShellFeatures[Group]>;\n};\n\n/**\n * Switches shell capabilities off for this distribution, e.g.\n * `provideShellFeatures({ content: { splitDown: false, maximize: false } })`. Omit for the full\n * workbench; fields merge group by group, so a partial override leaves the rest of that group alone.\n */\nexport function provideShellFeatures(\n features: ShellFeaturesInput,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: SHELL_FEATURES,\n useValue: {\n content: { ...DEFAULT_SHELL_FEATURES.content, ...features.content },\n sidebar: { ...DEFAULT_SHELL_FEATURES.sidebar, ...features.sidebar },\n rail: { ...DEFAULT_SHELL_FEATURES.rail, ...features.rail },\n workspaces: {\n ...DEFAULT_SHELL_FEATURES.workspaces,\n ...features.workspaces,\n },\n windows: { ...DEFAULT_SHELL_FEATURES.windows, ...features.windows },\n commands: { ...DEFAULT_SHELL_FEATURES.commands, ...features.commands },\n },\n },\n ]);\n}\n","interface ChordParts {\n ctrl: boolean;\n meta: boolean;\n alt: boolean;\n shift: boolean;\n key: string;\n}\n\nexport function isMacPlatform(): boolean {\n if (typeof navigator === 'undefined') {\n return false;\n }\n const platform = navigator.platform || navigator.userAgent || '';\n return /mac|iphone|ipad|ipod/i.test(platform);\n}\n\nfunction normaliseKey(key: string): string {\n const lower = key.toLowerCase();\n switch (lower) {\n case 'esc':\n return 'escape';\n case 'return':\n return 'enter';\n case 'space':\n case 'spacebar':\n case ' ':\n return 'space';\n default:\n return lower;\n }\n}\n\nfunction toSignature(parts: ChordParts): string {\n return [\n parts.ctrl ? 'ctrl' : '',\n parts.meta ? 'meta' : '',\n parts.alt ? 'alt' : '',\n parts.shift ? 'shift' : '',\n parts.key,\n ]\n .filter(Boolean)\n .join('+');\n}\n\nexport function chordSignature(chord: string, isMac: boolean): string | null {\n const parts: ChordParts = {\n ctrl: false,\n meta: false,\n alt: false,\n shift: false,\n key: '',\n };\n for (const raw of chord.split('+')) {\n const token = raw.trim().toLowerCase();\n if (!token) {\n continue;\n }\n switch (token) {\n case 'mod':\n if (isMac) parts.meta = true;\n else parts.ctrl = true;\n break;\n case 'ctrl':\n case 'control':\n parts.ctrl = true;\n break;\n case 'meta':\n case 'cmd':\n case 'command':\n case 'win':\n parts.meta = true;\n break;\n case 'alt':\n case 'option':\n parts.alt = true;\n break;\n case 'shift':\n parts.shift = true;\n break;\n default:\n parts.key = normaliseKey(token);\n }\n }\n return parts.key ? toSignature(parts) : null;\n}\n\nexport function formatShortcut(chord: string, isMac: boolean): string {\n const tokens = chord.split('+').map((raw) => {\n const token = raw.trim().toLowerCase();\n switch (token) {\n case 'mod':\n return isMac ? '⌘' : 'Ctrl';\n case 'ctrl':\n case 'control':\n return isMac ? '⌃' : 'Ctrl';\n case 'meta':\n case 'cmd':\n case 'command':\n case 'win':\n return isMac ? '⌘' : 'Meta';\n case 'alt':\n case 'option':\n return isMac ? '⌥' : 'Alt';\n case 'shift':\n return isMac ? '⇧' : 'Shift';\n case 'enter':\n case 'return':\n return isMac ? '↵' : 'Enter';\n case 'escape':\n case 'esc':\n return 'Esc';\n case 'space':\n case 'spacebar':\n case ' ':\n return 'Space';\n default:\n return token.length === 1\n ? token.toUpperCase()\n : token.charAt(0).toUpperCase() + token.slice(1);\n }\n });\n\n return tokens.join(isMac ? '' : '+');\n}\n\nfunction baseKeyFromCode(code: string): string | null {\n const letter = /^Key([A-Z])$/.exec(code);\n if (letter) {\n return letter[1].toLowerCase();\n }\n const digit = /^Digit(\\d)$/.exec(code);\n return digit ? digit[1] : null;\n}\n\nexport function eventSignature(event: KeyboardEvent): string {\n const key = baseKeyFromCode(event.code) ?? normaliseKey(event.key);\n return toSignature({\n ctrl: event.ctrlKey,\n meta: event.metaKey,\n alt: event.altKey,\n shift: event.shiftKey,\n key,\n });\n}\n\nexport function isEditableTarget(target: EventTarget | null): boolean {\n const element = target as HTMLElement | null;\n if (!element?.tagName) {\n return false;\n }\n const tag = element.tagName;\n return (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n element.isContentEditable === true\n );\n}\n","import { formatShortcut, isMacPlatform } from './keybinding';\n\n/**\n * Formats a keyboard chord for display, OS-correct: `formatChord('mod+k')` → `'⌘K'` on macOS,\n * `'Ctrl+K'` elsewhere. `mod` maps to ⌘/Ctrl, `alt` to ⌥/Alt, `shift` to ⇧/Shift, and so on — the\n * same token vocabulary a {@link Command.shortcut} uses. Lets a distribution or weaver show a\n * shortcut anywhere without duplicating the platform detection the shell already does internally.\n */\nexport function formatChord(chord: string): string {\n return formatShortcut(chord, isMacPlatform());\n}\n","import { ErrorHandler, inject, isDevMode, Service, Signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { Command, CommandArguments, MenuContext } from '@loomweaver/plugin-sdk';\nimport { isPopoutUrl } from '../popout/popout-path';\nimport { ContributionRegistry } from '../plugin/contribution-registry';\nimport { AuthContext } from '../auth/auth-context';\nimport { SHELL_FEATURES } from '../foundation/shell-features';\nimport { formatChord } from './format-chord';\n\ninterface Triggerable {\n readonly command?: string;\n run?(): void | Promise<void>;\n}\n\n/**\n * Executes commands by id — the single seam every trigger flows through:\n * rail/bar/view-action items, and (next) keybindings and the command palette. Keeping execution\n * here (not on the registry, which only stores) means one place resolves an id, one place fires the\n * behaviour, and one place reports a failure.\n */\n@Service()\nexport class CommandService {\n private readonly registry = inject(ContributionRegistry);\n private readonly auth = inject(AuthContext);\n private readonly errors = inject(ErrorHandler);\n private readonly shortcuts = inject(SHELL_FEATURES).commands.shortcuts;\n private readonly inPopout = isPopoutUrl(inject(DOCUMENT).location.pathname);\n\n /** The registered commands — the source list for a command palette. */\n readonly commands: Signal<readonly Command[]> = this.registry.commands;\n\n /**\n * Whether this command can run **here and now**: the session meets its `access`, and\n * this window is one it belongs in — a pop-out offers only commands that declare `popout`, since it\n * has no content area, rail or sidebar for the rest to reach. A palette uses this to filter.\n */\n available(command: Command): boolean {\n if (this.inPopout && command.popout !== true) {\n return false;\n }\n return this.auth.meets(command.access);\n }\n\n /**\n * The command's keyboard chord, formatted for display and OS-correct (`'⌘K'` / `'Ctrl+K'`), or\n * `undefined` where it has none — **or where this distribution has switched shortcuts off**, so a\n * hint never promises a key that does nothing. Every place the shell prints a chord (menu entry,\n * palette row, bar button) asks here.\n */\n shortcutOf(command: Command | undefined): string | undefined {\n if (!command?.shortcut || !this.shortcuts) {\n return undefined;\n }\n return formatChord(command.shortcut);\n }\n\n /**\n * Runs the command with this id; a no-op (with a warning) if none is registered. Blocks — the one\n * choke point every trigger flows through (keybinding, palette, item) — when the session does not\n * meet the command's `access`. An optional {@link MenuContext} is forwarded to\n * `command.run(context)` — how a menu tells `shell.tab.closeOthers` which tab.\n */\n execute(id: string, context?: MenuContext): void {\n const command = this.commands().find((c) => c.id === id);\n if (!command) {\n console.warn(`Command \"${id}\" is not registered.`);\n return;\n }\n if (!this.available(command)) {\n if (isDevMode()) {\n console.warn(\n this.inPopout && command.popout !== true\n ? `Command \"${id}\" blocked: this is a pop-out window, which offers only commands that ` +\n `declare popout: true.`\n : `Command \"${id}\" blocked: the session does not meet its access requirement.`,\n );\n }\n return;\n }\n void this.run(command, context).catch(() => undefined);\n }\n\n /**\n * Fires a resolved command's behaviour — the one place that happens, whatever triggered it — and\n * reports a failure the way every trigger already does. Answers what the command returned, and\n * rejects with what it threw, so a caller that has to tell a failure from an answer can.\n */\n async run(\n command: Command,\n context?: MenuContext,\n args?: CommandArguments,\n ): Promise<unknown> {\n try {\n return await command.run(context, args);\n } catch (error) {\n this.onError(error);\n throw error;\n }\n }\n\n /**\n * Whether this item's trigger leads anywhere: an inline callback, or a command that is actually\n * registered. A rail or bar item naming a command nobody registered would render as a dead button\n * — the same orphan a menu entry can be, and the host drops both rather than draw them.\n */\n triggerable(item: Triggerable): boolean {\n return item.command\n ? this.commands().some((command) => command.id === item.command)\n : item.run !== undefined;\n }\n\n /** Fires a UI item's trigger: its bound command if it names one, else its inline callback. */\n trigger(item: Triggerable): void {\n if (item.command) {\n this.execute(item.command);\n return;\n }\n const run = item.run;\n if (run) {\n this.invoke(run);\n }\n }\n\n private invoke(run: () => unknown): void {\n try {\n const result: unknown = run();\n if (result instanceof Promise) {\n result.catch((error: unknown) => this.onError(error));\n }\n } catch (error) {\n this.onError(error);\n }\n }\n\n private onError(error: unknown): void {\n this.errors.handleError(error);\n }\n}\n","export function upgradeElementProperty(el: HTMLElement, name: string): void {\n const self = el as unknown as Record<string, unknown>;\n if (Object.prototype.hasOwnProperty.call(el, name)) {\n const value = self[name];\n delete self[name];\n self[name] = value;\n }\n}\n\nexport function reflectAttribute(\n el: HTMLElement,\n name: string,\n value: string | null | undefined,\n): void {\n if (value === null || value === undefined) {\n el.removeAttribute(name);\n } else {\n el.setAttribute(name, value);\n }\n}\n","import {\n reflectAttribute,\n upgradeElementProperty,\n} from '../custom-element-property';\n\nexport const LW_MENU_TAG = 'lw-menu';\nexport const LW_MENU_ITEM_TAG = 'lw-menu-item';\n\nconst VIEWPORT_MARGIN = 4;\n\nexport const LW_MENU_SELECT = 'lw-menu-select';\n\nexport const LW_MENU_DISMISS = 'lw-menu-dismiss';\n\nexport class LwMenuItemElement extends HTMLElement {\n static readonly observedAttributes = [\n 'label',\n 'command',\n 'disabled',\n 'icon',\n 'shortcut',\n 'checkbox',\n 'checked',\n ];\n\n get label(): string | null {\n return this.getAttribute('label');\n }\n set label(value: string | null) {\n reflectAttribute(this, 'label', value);\n }\n get command(): string | null {\n return this.getAttribute('command');\n }\n set command(value: string | null) {\n reflectAttribute(this, 'command', value);\n }\n\n connectedCallback(): void {\n upgradeElementProperty(this, 'label');\n upgradeElementProperty(this, 'command');\n this.tabIndex = -1;\n this.render();\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.render();\n }\n }\n\n private render(): void {\n const checkbox = this.hasAttribute('checkbox');\n const checked = this.hasAttribute('checked');\n this.setAttribute('role', checkbox ? 'menuitemcheckbox' : 'menuitem');\n if (checkbox) {\n this.setAttribute('aria-checked', String(checked));\n } else {\n this.removeAttribute('aria-checked');\n }\n this.setAttribute('aria-disabled', String(this.hasAttribute('disabled')));\n\n const lead = document.createElement('span');\n lead.className = 'lw-menu-item-lead';\n lead.setAttribute('aria-hidden', 'true');\n let iconName: string | null;\n if (checkbox) {\n iconName = checked ? 'check' : null;\n } else {\n iconName = this.getAttribute('icon');\n }\n if (iconName) {\n const icon = document.createElement('lw-icon');\n icon.setAttribute('name', iconName);\n icon.setAttribute('size', '0.9rem');\n lead.append(icon);\n }\n\n const label = document.createElement('span');\n label.className = 'lw-menu-item-label';\n label.textContent = this.getAttribute('label') ?? '';\n this.replaceChildren(lead, label);\n\n const shortcut = this.getAttribute('shortcut');\n if (shortcut) {\n const hint = document.createElement('span');\n hint.className = 'lw-menu-item-shortcut';\n hint.setAttribute('aria-hidden', 'true');\n hint.textContent = shortcut;\n this.append(hint);\n }\n }\n}\n\nexport class LwMenuElement extends HTMLElement {\n private active = -1;\n\n connectedCallback(): void {\n this.setAttribute('role', 'menu');\n this.tabIndex = -1;\n this.addEventListener('keydown', this.onKeydown);\n this.addEventListener('click', this.onClick);\n\n queueMicrotask(() => {\n if (this.isConnected) {\n this.focus();\n }\n });\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('keydown', this.onKeydown);\n this.removeEventListener('click', this.onClick);\n }\n\n openAt(x: number, y: number): void {\n const { width, height } = this.getBoundingClientRect();\n const maxLeft = window.innerWidth - width - VIEWPORT_MARGIN;\n const maxTop = window.innerHeight - height - VIEWPORT_MARGIN;\n this.style.left = `${Math.max(VIEWPORT_MARGIN, Math.min(x, maxLeft))}px`;\n this.style.top = `${Math.max(VIEWPORT_MARGIN, Math.min(y, maxTop))}px`;\n }\n\n private readonly onKeydown = (event: KeyboardEvent) =>\n this.handleKeydown(event);\n\n private readonly onClick = (event: MouseEvent) => {\n const item = (event.target as HTMLElement | null)?.closest<HTMLElement>(\n `[role^=\"menuitem\"]`,\n );\n if (item && !this.isDisabled(item)) {\n this.select(item);\n }\n };\n\n private items(): HTMLElement[] {\n return [...this.querySelectorAll<HTMLElement>('[role^=\"menuitem\"]')].filter(\n (item) => !this.isDisabled(item),\n );\n }\n\n private isDisabled(item: HTMLElement): boolean {\n return (\n item.getAttribute('aria-disabled') === 'true' ||\n item.hasAttribute('disabled')\n );\n }\n\n private setActive(index: number): void {\n const items = this.items();\n if (items.length === 0) {\n return;\n }\n this.active = (index + items.length) % items.length;\n items.forEach((item, i) => (item.tabIndex = i === this.active ? 0 : -1));\n const item = items[this.active];\n item.focus();\n item.scrollIntoView?.({ block: 'nearest' });\n }\n\n private select(item: HTMLElement): void {\n this.dispatchEvent(\n new CustomEvent(LW_MENU_SELECT, {\n detail: { command: item.getAttribute('command') },\n bubbles: true,\n }),\n );\n }\n\n private handleKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n this.setActive(this.active < 0 ? 0 : this.active + 1);\n break;\n case 'ArrowUp':\n this.setActive(\n this.active < 0 ? this.items().length - 1 : this.active - 1,\n );\n break;\n case 'Home':\n this.setActive(0);\n break;\n case 'End':\n this.setActive(this.items().length - 1);\n break;\n case 'Enter':\n case ' ': {\n const item = this.active >= 0 ? this.items()[this.active] : undefined;\n if (item) {\n this.select(item);\n }\n break;\n }\n case 'Escape':\n case 'Tab':\n this.dispatchEvent(new CustomEvent(LW_MENU_DISMISS, { bubbles: true }));\n return;\n default:\n return;\n }\n event.preventDefault();\n }\n}\n\nexport function defineLwMenu(): void {\n if (typeof customElements === 'undefined') {\n return;\n }\n if (!customElements.get(LW_MENU_ITEM_TAG)) {\n customElements.define(LW_MENU_ITEM_TAG, LwMenuItemElement);\n }\n if (!customElements.get(LW_MENU_TAG)) {\n customElements.define(LW_MENU_TAG, LwMenuElement);\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { MenuContext, MenuItem } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../plugin/contribution-registry';\nimport { CommandService } from '../commands/command.service';\nimport {\n LW_MENU_DISMISS,\n LW_MENU_ITEM_TAG,\n LW_MENU_SELECT,\n LW_MENU_TAG,\n LwMenuElement,\n} from '../elements/menu/lw-menu.element';\n\ninterface ResolvedItem {\n readonly key: string;\n readonly label: string;\n readonly group: string;\n readonly order: number;\n readonly icon?: string;\n readonly shortcut?: string;\n readonly checkbox: boolean;\n readonly checked: boolean;\n readonly item: MenuItem;\n}\n\ninterface OpenMenu {\n readonly menu: HTMLElement;\n readonly onOutside: (event: PointerEvent) => void;\n readonly restore: HTMLElement | null;\n readonly listenTimer: ReturnType<typeof setTimeout>;\n}\n\nexport interface MenuListEntry {\n readonly key: string;\n readonly label: string;\n readonly icon?: string;\n readonly active?: boolean;\n readonly checked?: boolean;\n}\n\nexport const MENU_ANCHOR_GAP = 4;\n\n@Service()\nexport class MenuService {\n private readonly registry = inject(ContributionRegistry);\n\n private readonly commands = inject(CommandService);\n\n private readonly transloco = inject(TranslocoService);\n\n private current?: OpenMenu;\n\n open(\n menuId: string | readonly string[],\n context: MenuContext,\n at: { x: number; y: number },\n ): void {\n this.close();\n const resolved = this.resolve(\n typeof menuId === 'string' ? [menuId] : menuId,\n context,\n );\n if (resolved.length === 0) {\n return;\n }\n const menu = this.createMenu(resolved);\n const byKey = new Map(resolved.map((entry) => [entry.key, entry.item]));\n this.present(menu, at, (key) => {\n const item = key === null ? undefined : byKey.get(key);\n if (item) {\n this.run(item, context);\n }\n });\n }\n\n openList(\n entries: readonly MenuListEntry[],\n at: { x: number; y: number },\n onPick: (key: string) => void,\n ): void {\n this.close();\n if (entries.length === 0) {\n return;\n }\n const menu = this.createListMenu(entries);\n this.present(menu, at, (key) => {\n if (key !== null) {\n onPick(key);\n }\n });\n }\n\n close(): void {\n const open = this.current;\n if (!open) {\n return;\n }\n this.current = undefined;\n clearTimeout(open.listenTimer);\n document.removeEventListener('pointerdown', open.onOutside, true);\n document.body.classList.remove('lw-menu-open');\n open.menu.remove();\n open.restore?.focus?.();\n }\n\n private present(\n menu: LwMenuElement,\n at: { x: number; y: number },\n onSelect: (key: string | null) => void,\n ): void {\n const restore = document.activeElement as HTMLElement | null;\n menu.addEventListener(LW_MENU_SELECT, (event) => {\n const key = (event as CustomEvent<{ command: string | null }>).detail\n .command;\n this.close();\n onSelect(key);\n });\n menu.addEventListener(LW_MENU_DISMISS, () => this.close());\n const onOutside = (event: PointerEvent) => {\n if (!menu.contains(event.target as Node)) {\n this.close();\n }\n };\n document.body.append(menu);\n document.body.classList.add('lw-menu-open');\n menu.openAt(at.x, at.y);\n const listenTimer = setTimeout(() =>\n document.addEventListener('pointerdown', onOutside, true),\n );\n this.current = { menu, onOutside, restore, listenTimer };\n }\n\n private resolve(\n menuIds: readonly string[],\n context: MenuContext,\n ): ResolvedItem[] {\n const commands = this.registry.commands();\n return this.registry\n .menuItems()\n .filter(\n (item) =>\n menuIds.includes(item.menu) && whenMatches(item.when, context),\n )\n .map((item, index): ResolvedItem | null => {\n const command = item.command\n ? commands.find((c) => c.id === item.command)\n : undefined;\n if (item.command && !command) {\n return null;\n }\n const titleKey = item.title ?? command?.title;\n if (titleKey === undefined) {\n return null;\n }\n const checkbox = item.checkedWhen !== undefined;\n return {\n key: item.command ?? `__inline-${index}`,\n label: this.transloco.translate(titleKey),\n group: item.group ?? '',\n order: item.order ?? 0,\n icon: command?.icon,\n shortcut: this.commands.shortcutOf(command),\n checkbox,\n checked: checkbox && whenMatches(item.checkedWhen, context),\n item,\n };\n })\n .filter((entry): entry is ResolvedItem => entry !== null)\n .sort((a, b) => a.group.localeCompare(b.group) || a.order - b.order);\n }\n\n private createMenu(resolved: readonly ResolvedItem[]): LwMenuElement {\n const menu = document.createElement(LW_MENU_TAG) as LwMenuElement;\n if (resolved.some((entry) => entry.icon || entry.checkbox)) {\n menu.classList.add('lw-menu--leading');\n }\n let lastGroup: string | undefined;\n for (const entry of resolved) {\n if (lastGroup !== undefined && entry.group !== lastGroup) {\n const separator = document.createElement('div');\n separator.setAttribute('role', 'separator');\n separator.className = 'lw-menu-separator';\n menu.append(separator);\n }\n lastGroup = entry.group;\n const item = document.createElement(LW_MENU_ITEM_TAG);\n item.setAttribute('command', entry.key);\n item.setAttribute('label', entry.label);\n if (entry.icon) {\n item.setAttribute('icon', entry.icon);\n }\n if (entry.shortcut) {\n item.setAttribute('shortcut', entry.shortcut);\n }\n if (entry.checkbox) {\n item.setAttribute('checkbox', '');\n if (entry.checked) {\n item.setAttribute('checked', '');\n }\n }\n menu.append(item);\n }\n return menu;\n }\n\n private createListMenu(entries: readonly MenuListEntry[]): LwMenuElement {\n const menu = document.createElement(LW_MENU_TAG) as LwMenuElement;\n if (\n entries.some(\n (entry) => entry.icon || entry.active || entry.checked !== undefined,\n )\n ) {\n menu.classList.add('lw-menu--leading');\n }\n for (const entry of entries) {\n const item = document.createElement(LW_MENU_ITEM_TAG);\n item.setAttribute('command', entry.key);\n item.setAttribute('label', entry.label);\n if (entry.checked !== undefined) {\n item.setAttribute('checkbox', '');\n if (entry.checked) {\n item.setAttribute('checked', '');\n }\n } else if (entry.active) {\n item.setAttribute('checkbox', '');\n item.setAttribute('checked', '');\n } else if (entry.icon) {\n item.setAttribute('icon', entry.icon);\n }\n menu.append(item);\n }\n return menu;\n }\n\n private run(item: MenuItem, context: MenuContext): void {\n if (item.command) {\n this.commands.execute(item.command, context);\n return;\n }\n try {\n item.run?.(context);\n } catch (error) {\n console.error('Menu item handler failed', error);\n }\n }\n}\n\nexport function whenMatches(\n when: MenuContext | undefined,\n context: MenuContext,\n): boolean {\n if (!when) {\n return true;\n }\n return Object.entries(when).every(([key, value]) => context[key] === value);\n}\n","import { Directive, inject, input } from '@angular/core';\nimport { MenuContext } from '@loomweaver/plugin-sdk';\nimport { MenuService } from './menu.service';\n\n@Directive({\n selector: '[lwContextMenu]',\n host: { '(contextmenu)': 'onContextMenu($event)' },\n})\nexport class ContextMenuDirective {\n private readonly menus = inject(MenuService);\n\n readonly menu = input<string | readonly string[] | undefined>(undefined, {\n alias: 'lwContextMenu',\n });\n\n readonly context = input<MenuContext>({}, { alias: 'lwContextMenuContext' });\n\n protected onContextMenu(event: MouseEvent): void {\n const slot = this.menu();\n if (!slot || slot.length === 0) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n this.menus.open(slot, this.context(), {\n x: event.clientX,\n y: event.clientY,\n });\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { DockPosition } from '../../layout/layout';\nimport { BarSlot } from '../../foundation/bar-item';\n\nexport interface BarContext {\n readonly bar: string;\n readonly dock: DockPosition;\n readonly slot: BarSlot;\n}\n\nexport const BAR_CONTEXT = new InjectionToken<BarContext>('BAR_CONTEXT');\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, Injector, computed, inject, input } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { DockPosition } from '../../layout/layout';\nimport { TooltipPosition } from '../../elements/tooltip/lw-tooltip.element';\nimport { CommandService } from '../../commands/command.service';\nimport { AuthContext } from '../../auth/auth-context';\nimport { ContextMenuDirective } from '../../menu/context-menu.directive';\nimport { BarButtonItem, BarComponentItem, BarItem } from '../../foundation/bar-item';\nimport { BAR_CONTEXT } from './bar-context';\n\n@Component({\n selector: 'lw-shell-bar-item',\n imports: [NgComponentOutlet, TranslocoPipe, ContextMenuDirective],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './shell-bar-item.html',\n})\nexport class ShellBarItem {\n readonly item = input.required<BarItem>();\n\n readonly dock = input.required<DockPosition>();\n\n private readonly commands = inject(CommandService);\n private readonly auth = inject(AuthContext);\n private readonly injector = inject(Injector);\n\n protected readonly asComponent = computed<BarComponentItem | null>(() => {\n const item = this.item();\n return 'component' in item ? item : null;\n });\n protected readonly asButton = computed<BarButtonItem | null>(() => {\n const item = this.item();\n return 'component' in item ? null : item;\n });\n protected readonly tooltipPosition = computed<TooltipPosition>(() =>\n this.dock() === 'bottom' ? 'top' : 'bottom',\n );\n\n protected readonly componentInjector = computed<Injector>(() => {\n const item = this.item();\n return Injector.create({\n parent: this.injector,\n providers: [\n {\n provide: BAR_CONTEXT,\n useValue: { bar: item.bar, dock: this.dock(), slot: item.slot },\n },\n ],\n });\n });\n\n protected readonly disabled = computed(() =>\n this.auth.disabled(this.asButton()?.access),\n );\n protected readonly shortcut = computed<string | undefined>(() => {\n const button = this.asButton();\n if (!button?.showShortcut || !button.command) {\n return undefined;\n }\n return this.commands.shortcutOf(\n this.commands.commands().find((entry) => entry.id === button.command),\n );\n });\n\n protected run(button: BarButtonItem): void {\n if (this.disabled()) return;\n this.commands.trigger(button);\n }\n}\n","@if (asButton(); as btn) {\n <button\n type=\"button\"\n (click)=\"run(btn)\"\n [disabled]=\"disabled()\"\n [lwContextMenu]=\"btn.menu\"\n [lwContextMenuContext]=\"{ targetKind: 'bar-item', id: btn.id, bar: btn.bar }\"\n class=\"relative flex items-center gap-1 rounded px-1.5 py-0.5 text-content-faint transition-colors hover:bg-surface-overlay hover:text-content disabled:pointer-events-none disabled:opacity-40\"\n [attr.aria-label]=\"(btn.tooltip ?? btn.label ?? '') | transloco\"\n >\n @if (btn.icon; as icon) {\n <lw-icon [name]=\"icon\" size=\"1rem\" />\n }\n @if (btn.label; as label) {\n <span>{{ label | transloco }}</span>\n }\n @if (shortcut(); as chord) {\n <kbd\n class=\"rounded border border-border bg-surface-overlay px-1 text-[0.6875rem] leading-tight text-content-muted\"\n >{{ chord }}</kbd\n >\n }\n @if (btn.tooltip ?? btn.label; as tip) {\n <lw-tooltip [text]=\"tip | transloco\" [position]=\"tooltipPosition()\" />\n }\n </button>\n} @else if (asComponent(); as comp) {\n <ng-container\n *ngComponentOutlet=\"comp.component; injector: componentInjector()\"\n ></ng-container>\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { LayoutRegion } from '../../layout/layout';\nimport { BarItem, BarSlot } from '../../foundation/bar-item';\nimport { ShellBarItem } from './shell-bar-item';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { CommandService } from '../../commands/command.service';\n\n@Component({\n selector: 'lw-shell-bar',\n imports: [ShellBarItem],\n templateUrl: './shell-bar.html',\n})\nexport class ShellBar {\n readonly region = input.required<LayoutRegion>();\n\n private readonly registry = inject(ContributionRegistry);\n private readonly auth = inject(AuthContext);\n private readonly commands = inject(CommandService);\n\n protected readonly startItems = computed(() => this.bySlot('start'));\n protected readonly centerItems = computed(() => this.bySlot('center'));\n protected readonly endItems = computed(() => this.bySlot('end'));\n protected readonly dock = computed(() => this.region().dock);\n\n protected readonly footer = computed(\n () => this.dock() === 'left' || this.dock() === 'right',\n );\n\n private bySlot(slot: BarSlot): BarItem[] {\n return this.registry\n .barItems()\n .filter((item) => item.bar === this.region().id && item.slot === slot)\n .filter((item) => this.auth.visible(item.access))\n .filter((item) => 'component' in item || this.commands.triggerable(item))\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n }\n}\n","<header\n class=\"flex items-center gap-2 overflow-hidden border-border bg-surface px-2 md:px-4\"\n [class.border-b]=\"dock() === 'top'\"\n [class.h-12]=\"dock() === 'top'\"\n [class.border-t]=\"dock() === 'bottom' || footer()\"\n [class.py-1]=\"dock() === 'bottom' || footer()\"\n [class.text-xs]=\"dock() === 'bottom'\"\n [class.text-content-muted]=\"dock() === 'bottom'\"\n>\n <div class=\"flex min-w-0 items-center gap-2\">\n @for (item of startItems(); track item.id) {\n <lw-shell-bar-item [item]=\"item\" [dock]=\"dock()\" />\n }\n </div>\n\n @if (centerItems().length) {\n <div class=\"mx-auto flex shrink-0 items-center gap-2\">\n @for (item of centerItems(); track item.id) {\n <lw-shell-bar-item [item]=\"item\" [dock]=\"dock()\" />\n }\n </div>\n }\n\n <div class=\"ml-auto flex shrink-0 items-center gap-2\">\n @for (item of endItems(); track item.id) {\n <lw-shell-bar-item [item]=\"item\" [dock]=\"dock()\" />\n }\n </div>\n</header>\n","import { MenuContext } from '@loomweaver/plugin-sdk';\n\nexport function menuContextString(\n context: MenuContext | undefined,\n key: string,\n): string {\n return String(context?.[key] ?? '');\n}\n","import { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { menuContextString } from '../../menu/menu-context';\nimport { RailItemsService } from './rail-items.service';\nimport { RailMoveService } from './rail-move.service';\n\nexport const RAIL_ITEM_CONTEXT_MENU = 'rail/item/context';\n\nexport const RAIL_CONTEXT_MENU = 'rail/context';\n\nexport function registerRailCustomizeMenu(\n registry: ContributionRegistry,\n): void {\n registry.addMenuItem({\n id: 'menu:shell.rail.customize',\n menu: RAIL_CONTEXT_MENU,\n command: 'shell.rail.customize',\n group: '9_customize',\n order: 0,\n });\n}\n\nexport function registerRailContextMenu(\n registry: ContributionRegistry,\n railItems: RailItemsService,\n): void {\n registry.addCommand({\n id: 'shell.rail.hideItem',\n paletteHidden: true,\n title: 'rail.menu.hide',\n run: (context) => {\n const id = menuContextString(context, 'id');\n if (id) {\n railItems.hide(id);\n }\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.rail.hideItem',\n menu: RAIL_ITEM_CONTEXT_MENU,\n command: 'shell.rail.hideItem',\n group: '5_visibility',\n order: 0,\n });\n}\n\nexport function registerRailMoveMenu(\n registry: ContributionRegistry,\n moves: RailMoveService,\n): void {\n registry.addCommand({\n id: 'shell.rail.moveToOtherRail',\n paletteHidden: true,\n title: 'rail.menu.moveToOther',\n run: (context) => {\n const id = menuContextString(context, 'id');\n const target = moves.otherRail(menuContextString(context, 'region'));\n if (id && target) {\n moves.move(id, target);\n }\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.rail.moveToOtherRail',\n menu: RAIL_ITEM_CONTEXT_MENU,\n command: 'shell.rail.moveToOtherRail',\n group: '1_move',\n order: 0,\n });\n}\n","import { InjectionToken, Provider, Type } from '@angular/core';\nimport { KeyValueStore, LocalStorageStore } from './key-value-store';\nimport { withCrossTabSync } from './cross-tab-sync-store';\nimport { providePortStore } from './port-store-provider';\n\n/**\n * The **settings** persistence port: deliberate user decisions only — theme,\n * language, text size, plugin settings, installed/disabled plugins, capability revocations and the\n * saved-workspaces list. Working state (view state, layout, usage traces) never flows through this\n * port; it lives behind `WORKING_STATE_STORE`. That guarantee is structural, which is what makes\n * this port the right seam for a product backend: writes are rare, small and roaming-worthy, so a\n * REST-backed implementation (the `ISettingsRepository` pattern) receives exactly\n * what it expects. Swap the backing store with {@link provideSettingsStore}; the built-in default\n * is {@link LocalStorageStore}.\n */\nexport const SETTINGS_STORE = new InjectionToken<KeyValueStore>(\n 'lw.settings-store',\n {\n providedIn: 'root',\n factory: () => withCrossTabSync(new LocalStorageStore()),\n },\n);\n\n/**\n * Provides a custom settings {@link KeyValueStore}, replacing the default `localStorage` one —\n * place after `provideShell()` (last provider wins). Pass a class (DI-constructed) or a ready\n * instance. The cross-tab sync wrapper is applied on top either way.\n */\nexport function provideSettingsStore(\n store: KeyValueStore | Type<KeyValueStore>,\n): Provider {\n return providePortStore(SETTINGS_STORE, store);\n}\n","import { KeyValueStore } from './key-value-store';\n\nexport function hydrateAsync(\n store: KeyValueStore,\n key: string,\n apply: (raw: string | undefined) => void,\n onSettled?: (loaded: boolean) => void,\n): void {\n if (store.peek) {\n onSettled?.(true);\n return;\n }\n void store\n .get(key)\n .then((raw) => {\n apply(raw);\n onSettled?.(true);\n })\n .catch(() => onSettled?.(false));\n}\n\nexport async function readStoredValue(\n store: KeyValueStore,\n key: string,\n): Promise<string | undefined> {\n if (store.peek) {\n return store.peek(key);\n }\n return store.get(key).catch(() => undefined);\n}\n","import { inject, Service } from '@angular/core';\nimport { SETTINGS_STORE } from './settings-store';\nimport { WORKING_STATE_STORE } from './working-state-store';\nimport { StateSyncChannel } from './state-sync-channel';\nimport { readStoredValue } from './hydrate';\n\n/**\n * Where a synced key's fresh value is read back from after another window announced a change\n *: the `SETTINGS_STORE`, the `WORKING_STATE_STORE`, or — for state persisted outside\n * both ports, such as a product session store — `'external'`, in which case no read-back happens\n * and the applier receives `undefined` (it re-reads its own storage).\n */\nexport type SyncSource = 'settings' | 'working-state' | 'external';\n\n/**\n * Re-applies a key that another browser window just wrote. `raw` is the value read back from the\n * registered {@link SyncSource}'s store (`undefined` for `'external'` registrations) — the store\n * stays the single source of truth, the message only names the key. An applier must **set its\n * state without persisting again**, or two windows would write back and forth forever.\n */\nexport type ApplySyncedState = (raw: string | undefined, key: string) => void;\n\ninterface Registration {\n readonly source: SyncSource;\n readonly apply: ApplySyncedState;\n}\n\n/**\n * Cross-tab live sync at the persistence seams. Every write through either port\n * broadcasts its **key** to the other windows of the same origin over a `BroadcastChannel`; a\n * window that has registered a reaction for that key reads the fresh value back through the\n * registered source's store and applies it — so it works with any store behind the ports,\n * including a product's HTTP-backed one.\n *\n * The shell registers its own keys (settings such as theme, language and text size on the\n * `'settings'` source; view state, view instances and the palette's recently-used list on\n * `'working-state'`), so plugins inherit the sync for free: their state lives in host-managed\n * stores. **Layout keys are deliberately not registered** — two windows are meant to be able to\n * show different layouts.\n *\n * A distribution registers its own keys the same way, most usefully its product session key\n * (source `'external'`): when it changes, the other window's `AuthSnapshot` flips and the existing\n * `onIdentityChange` policy takes over. Use {@link announce} when that state is\n * persisted outside the ports, and {@link notifyRemoteChange} when a backend push transport\n * reports a change made on another device.\n */\n@Service()\nexport class StateSyncService {\n private readonly settings = inject(SETTINGS_STORE);\n private readonly workingState = inject(WORKING_STATE_STORE);\n private readonly channel = inject(StateSyncChannel);\n private readonly exact = new Map<string, Registration>();\n private readonly prefixes = new Map<string, Registration>();\n\n constructor() {\n this.channel.listen((key) => this.applyRemote(key));\n }\n\n /**\n * Reacts to remote writes of exactly `key`; `source` names the store the fresh value is read\n * back from. One applier per key — registering again replaces it. Returns a disposer that\n * unregisters this applier (a later re-registration always wins over a stale disposer).\n */\n register(\n source: SyncSource,\n key: string,\n apply: ApplySyncedState,\n ): () => void {\n const registration: Registration = { source, apply };\n this.exact.set(key, registration);\n return () => {\n if (this.exact.get(key) === registration) {\n this.exact.delete(key);\n }\n };\n }\n\n /**\n * Reacts to remote writes of every key starting with `prefix` — for key families such as\n * `lw.shell.view-state:`. Exact registrations win over prefixes. Returns a disposer that\n * unregisters this applier (a later re-registration always wins over a stale disposer).\n */\n registerPrefix(\n source: SyncSource,\n prefix: string,\n apply: ApplySyncedState,\n ): () => void {\n const registration: Registration = { source, apply };\n this.prefixes.set(prefix, registration);\n return () => {\n if (this.prefixes.get(prefix) === registration) {\n this.prefixes.delete(prefix);\n }\n };\n }\n\n /**\n * Announces a change this window made to state that is persisted **outside** the persistence\n * ports — a product session store, for example. Writes through the ports broadcast on their own;\n * this is the escape hatch for state the ports never see. Notifies only the **other** windows.\n */\n announce(key: string): void {\n this.channel.post(key);\n }\n\n /**\n * Runs the registered applier for `key` in **this** window, reading the fresh value back from\n * the registered source's store. The entry point for cross-device live sync: a\n * backend-backed store paired with a push transport (SSE, WebSocket) calls this when the backend\n * reports a key changed on another device. No-op for keys without a registration.\n */\n notifyRemoteChange(key: string): void {\n this.applyRemote(key);\n }\n\n private applyRemote(key: string): void {\n const registration = this.registrationFor(key);\n if (!registration) {\n return;\n }\n void this.readBack(registration.source, key)\n .then((raw) =>\n this.channel.whileApplying(() => registration.apply(raw, key)),\n )\n .catch(() => undefined);\n }\n\n private readBack(\n source: SyncSource,\n key: string,\n ): Promise<string | undefined> {\n if (source === 'external') {\n return Promise.resolve(undefined);\n }\n const store = source === 'settings' ? this.settings : this.workingState;\n return readStoredValue(store, key);\n }\n\n private registrationFor(key: string): Registration | undefined {\n const exact = this.exact.get(key);\n if (exact) {\n return exact;\n }\n for (const [prefix, registration] of this.prefixes) {\n if (key.startsWith(prefix)) {\n return registration;\n }\n }\n return undefined;\n }\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { SETTINGS_STORE } from '../../persistence/settings-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\nimport { StateSyncService } from '../../persistence/state-sync.service';\n\nconst STORAGE_KEY = 'lw.shell.rail-items';\n\nconst WORKSPACE_RAIL_PREFIX = 'shell.workspace:';\n\ninterface RailItemsState {\n readonly hidden: readonly string[];\n readonly placed: Readonly<Record<string, string>>;\n}\n\nconst EMPTY: RailItemsState = { hidden: [], placed: {} };\n\nexport function workspaceRailItemId(workspaceId: string): string {\n return `${WORKSPACE_RAIL_PREFIX}${workspaceId}`;\n}\n\nexport function isWorkspaceRailItem(itemId: string): boolean {\n return itemId.startsWith(WORKSPACE_RAIL_PREFIX);\n}\n\nfunction parse(raw: string | undefined): RailItemsState {\n if (!raw) {\n return EMPTY;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return EMPTY;\n }\n const state = parsed as Record<string, unknown>;\n const hidden = Array.isArray(state['hidden'])\n ? state['hidden'].filter((id): id is string => typeof id === 'string')\n : [];\n const placed: Record<string, string> = {};\n const rawPlaced = state['placed'];\n if (\n rawPlaced &&\n typeof rawPlaced === 'object' &&\n !Array.isArray(rawPlaced)\n ) {\n for (const [id, region] of Object.entries(rawPlaced)) {\n if (typeof region === 'string') {\n placed[id] = region;\n }\n }\n }\n return { hidden, placed };\n } catch {\n return EMPTY;\n }\n}\n\n@Service()\nexport class RailItemsService {\n private readonly store = inject(SETTINGS_STORE);\n private readonly sync = inject(StateSyncService);\n private readonly state = signal<RailItemsState>(\n parse(this.store.peek?.(STORAGE_KEY)),\n );\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) => this.state.set(parse(raw)));\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.state.set(parse(raw)),\n );\n }\n\n regionOf(itemId: string, declaredRail: string): string {\n return this.state().placed[itemId] ?? declaredRail;\n }\n\n isVisible(itemId: string): boolean {\n if (isWorkspaceRailItem(itemId)) {\n return itemId in this.state().placed;\n }\n return !this.state().hidden.includes(itemId);\n }\n\n show(itemId: string, regionId: string): void {\n const state = this.state();\n this.commit({\n hidden: state.hidden.filter((id) => id !== itemId),\n placed: { ...state.placed, [itemId]: regionId },\n });\n }\n\n hide(itemId: string): void {\n if (!this.isVisible(itemId)) {\n return;\n }\n const state = this.state();\n const placed = { ...state.placed };\n delete placed[itemId];\n this.commit({\n hidden: isWorkspaceRailItem(itemId)\n ? state.hidden\n : [...state.hidden, itemId],\n placed,\n });\n }\n\n toggle(itemId: string, regionId: string): void {\n if (this.isVisible(itemId)) {\n this.hide(itemId);\n } else {\n this.show(itemId, regionId);\n }\n }\n\n reset(): void {\n this.state.set(parse(undefined));\n void this.store.delete(STORAGE_KEY);\n }\n\n private commit(next: RailItemsState): void {\n this.state.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify(next));\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { RailItemsService } from './rail-items.service';\n\n@Service()\nexport class RailMoveService {\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly items = inject(RailItemsService);\n private readonly registry = inject(ContributionRegistry);\n private readonly announcer = inject(LiveAnnouncer);\n private readonly transloco = inject(TranslocoService);\n\n move(itemId: string, targetRegion: string): void {\n this.items.show(itemId, targetRegion);\n const title = this.registry\n .railItems()\n .find((item) => item.id === itemId)?.title;\n void this.announcer.announce(\n this.transloco.translate('rail.move.announce', {\n item: title ? this.transloco.translate(title) : itemId,\n target: this.targetLabel(targetRegion),\n }),\n );\n }\n\n otherRail(fromRegion: string): string | undefined {\n const from = this.layout.regions.find((region) => region.id === fromRegion);\n if (!from) {\n return undefined;\n }\n return this.layout.regions.find(\n (region) =>\n region.type === 'rail' &&\n region.id !== fromRegion &&\n region.dock !== from.dock,\n )?.id;\n }\n\n railOn(dock: 'left' | 'right', fromRegion: string): string | undefined {\n return this.layout.regions.find(\n (region) =>\n region.type === 'rail' &&\n region.dock === dock &&\n region.id !== fromRegion,\n )?.id;\n }\n\n private targetLabel(regionId: string): string {\n const dock = this.layout.regions.find((r) => r.id === regionId)?.dock;\n if (dock === 'left') {\n return this.transloco.translate('rail.move.targetLeft');\n }\n if (dock === 'right') {\n return this.transloco.translate('rail.move.targetRight');\n }\n return regionId;\n }\n}\n","import { Directive, ElementRef, inject, input, output } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { TranslocoService } from '@jsverse/transloco';\n\n@Directive({\n selector: '[lwReorderable]',\n host: { '(keydown)': 'onKeydown($event)' },\n})\nexport class Reorderable {\n readonly containerId = input.required<string>({ alias: 'lwReorderable' });\n readonly enabled = input(true, { alias: 'lwReorderableEnabled' });\n\n readonly reorder = output<string[]>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n private readonly announcer = inject(LiveAnnouncer);\n private readonly transloco = inject(TranslocoService);\n\n protected onKeydown(event: KeyboardEvent): void {\n if (!this.enabled() || !event.altKey || event.shiftKey) {\n return;\n }\n let direction = 0;\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\n direction = 1;\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\n direction = -1;\n }\n if (direction === 0) {\n return;\n }\n const active = this.document.activeElement as HTMLElement | null;\n const item = active?.closest<HTMLElement>('[data-reorder-id]');\n if (!item || !this.host.nativeElement.contains(item)) {\n return;\n }\n if (this.moveByKeyboard(item, direction)) {\n event.preventDefault();\n const id = item.dataset['reorderId'] ?? '';\n setTimeout(() => this.focusItem(id), 0);\n }\n }\n\n private items(): HTMLElement[] {\n return [\n ...this.host.nativeElement.querySelectorAll<HTMLElement>(\n '[data-reorder-id]',\n ),\n ];\n }\n\n private moveByKeyboard(item: HTMLElement, direction: number): boolean {\n const id = item.dataset['reorderId'] ?? '';\n const band = item.dataset['reorderBand'] ?? '';\n const inBand = this.items().filter(\n (el) => (el.dataset['reorderBand'] ?? '') === band,\n );\n const bandIds = inBand.map((el) => el.dataset['reorderId'] ?? '');\n const target = bandIds.indexOf(id) + direction;\n if (target < 0 || target >= bandIds.length) {\n return false;\n }\n const neighbourId = bandIds[target];\n const without = this.items()\n .map((el) => el.dataset['reorderId'] ?? '')\n .filter((x) => x !== id);\n const insertAt = without.indexOf(neighbourId) + (direction > 0 ? 1 : 0);\n without.splice(insertAt, 0, id);\n this.reorder.emit(without);\n const label =\n item.getAttribute('aria-label') ?? item.textContent?.trim() ?? id;\n void this.announcer.announce(\n this.transloco.translate('reorder.announce', {\n label,\n position: target + 1,\n total: bandIds.length,\n }),\n );\n return true;\n }\n\n private focusItem(id: string): void {\n this.items()\n .find((el) => (el.dataset['reorderId'] ?? '') === id)\n ?.focus();\n }\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\n\nconst STORAGE_KEY = 'lw.shell.item-order';\n\nfunction parseOrders(\n raw: string | undefined,\n): Record<string, readonly string[]> {\n if (!raw) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n const result: Record<string, readonly string[]> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (Array.isArray(value) && value.every((id) => typeof id === 'string')) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n}\n\n@Service()\nexport class UserOrderService {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly orders = signal<Record<string, readonly string[]>>(\n parseOrders(this.store.peek?.(STORAGE_KEY)),\n );\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.orders.set(parseOrders(raw)),\n );\n }\n\n applyOrder<T>(\n containerId: string,\n items: readonly T[],\n key: (item: T) => string,\n ): T[] {\n const sequence = this.orders()[containerId];\n if (!sequence || sequence.length === 0) {\n return [...items];\n }\n const rank = new Map(sequence.map((id, index) => [id, index]));\n const ranked = (item: T) => rank.has(key(item));\n\n const knownInUserOrder = items\n .filter(ranked)\n .sort((a, b) => (rank.get(key(a)) ?? 0) - (rank.get(key(b)) ?? 0));\n let next = 0;\n return items.map((item) =>\n ranked(item) ? knownInUserOrder[next++] : item,\n );\n }\n\n setOrder(containerId: string, ids: readonly string[]): void {\n this.orders.update((state) => ({ ...state, [containerId]: [...ids] }));\n void this.store.set(STORAGE_KEY, JSON.stringify(this.orders()));\n }\n\n reset(): void {\n this.orders.set({});\n void this.store.delete(STORAGE_KEY);\n }\n}\n","import { Service } from '@angular/core';\n\n@Service()\nexport class TabCloseHooks {\n private readonly hooks = new Map<string, () => void>();\n\n get(root: string): (() => void) | undefined {\n return this.hooks.get(root);\n }\n\n set(root: string, hook: (() => void) | undefined): void {\n if (hook) {\n this.hooks.set(root, hook);\n } else {\n this.hooks.delete(root);\n }\n }\n\n delete(root: string): void {\n this.hooks.delete(root);\n }\n\n take(root: string): (() => void) | undefined {\n const hook = this.hooks.get(root);\n this.hooks.delete(root);\n return hook;\n }\n\n runSafely(hook: (() => void) | undefined): void {\n if (!hook) {\n return;\n }\n try {\n hook();\n } catch (error) {\n console.error('Content tab onClose handler failed', error);\n }\n }\n}\n","import { viewIdOfPanePath } from '../tree/pane-address';\nimport { PaneTab } from '../tree/pane-node';\nimport { surfaceForPanePath } from '../pane-surface';\nimport type { StripTab } from '../chrome/strip-tab';\nimport { isHomePath } from '../../content/content-path';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\n\nexport interface PaneLabel {\n readonly title: string;\n readonly literalTitle: boolean;\n readonly icon?: string;\n}\n\nexport function resolveTitle(\n label: Pick<PaneLabel, 'title' | 'literalTitle'>,\n translate: (key: string) => string,\n): string {\n return label.literalTitle ? label.title : translate(label.title);\n}\n\nexport function overlayTabTitle(tab: PaneTab, fallback: PaneLabel): PaneLabel {\n return {\n title: tab.title ?? fallback.title,\n literalTitle:\n tab.title === undefined\n ? fallback.literalTitle\n : (tab.literalTitle ?? false),\n icon: tab.icon ?? fallback.icon,\n };\n}\n\nexport function paneLabelOf(\n registry: ContributionRegistry,\n path: string,\n): PaneLabel {\n if (isHomePath(path)) {\n return { title: 'content.split.home', literalTitle: false };\n }\n const surface = surfaceForPanePath(\n registry.contentRoutes(),\n registry.views(),\n path,\n );\n if (surface === undefined) {\n return viewIdOfPanePath(path) === null\n ? { title: path, literalTitle: true }\n : { title: 'content.split.pick', literalTitle: false };\n }\n if (!('path' in surface)) {\n return { title: surface.title, literalTitle: false, icon: surface.icon };\n }\n return surface.title\n ? {\n title: surface.title,\n literalTitle: surface.titleIsLiteral ?? false,\n icon: surface.icon,\n }\n : { title: path, literalTitle: true, icon: surface.icon };\n}\n\nexport function surfaceClosable(\n registry: ContributionRegistry,\n path: string,\n): boolean {\n return (\n surfaceForPanePath(registry.contentRoutes(), registry.views(), path)\n ?.closable !== false\n );\n}\n\nexport function toStripTab(\n registry: ContributionRegistry,\n tab: PaneTab,\n): StripTab {\n const effective = overlayTabTitle(tab, paneLabelOf(registry, tab.path));\n return {\n path: tab.path,\n title: effective.title,\n literalTitle: effective.literalTitle,\n icon: effective.icon,\n closable: tab.closable !== false && surfaceClosable(registry, tab.path),\n preview: tab.preview ?? false,\n pinned: tab.pinned ?? false,\n instance: tab.instance,\n };\n}\n","import { AccessRequirement, ContentRoute, ViewAction } from '@loomweaver/plugin-sdk';\nimport { View } from '../../../layout/view';\nimport { PaneTab } from '../../pane/tree/pane-node';\nimport { overlayTabTitle } from '../../pane/drag/pane-label';\nimport { matchRoute, tabRootOf } from '../content-path';\n\nconst DYNAMIC_TAB_ORDER_BASE = 1000;\nconst VIEW_TAB_ORDER_BASE = 2000;\n\nexport interface OpenTab {\n readonly path: string;\n readonly title: string;\n readonly icon?: string;\n readonly literalTitle: boolean;\n readonly onClose?: () => void;\n readonly preview: boolean;\n readonly pinned: boolean;\n readonly closable: boolean;\n}\n\n/** One rendered tab in the content strip (static or dynamic), as the content-area template consumes it. */\nexport interface ContentTabView {\n /** The tab **root** — stable identity (tracking, active compare, close). */\n readonly path: string;\n /** The full path to navigate to when the tab is selected (root + remembered sub-route). */\n readonly navPath: string;\n readonly title: string;\n /** When true the host shows `title` verbatim; otherwise it is a Transloco key (finding #8). */\n readonly literalTitle: boolean;\n readonly icon?: string;\n readonly order: number;\n /** Dynamic tabs show a close affordance; static (registered) tabs do not. */\n readonly closable: boolean;\n /** A preview tab renders its title in italics until promoted. */\n readonly preview: boolean;\n /** A pinned tab is sorted to the group's front and shows an unpin control instead of close. */\n readonly pinned: boolean;\n readonly actions?: readonly ViewAction[];\n}\n\nexport function defaultTabTitle(\n route: ContentRoute | undefined,\n root: string,\n): { readonly title: string; readonly literalTitle: boolean } {\n return {\n title: route?.title ?? root.split('/').pop() ?? root,\n literalTitle:\n route?.title === undefined ? true : (route.titleIsLiteral ?? false),\n };\n}\n\nexport function withRefreshedPath(\n tabs: readonly OpenTab[],\n index: number,\n path: string,\n): readonly OpenTab[] {\n return tabs[index].path === path\n ? tabs\n : tabs.map((tab, i) => (i === index ? { ...tab, path } : tab));\n}\n\nexport function autoOpenedTab(\n route: ContentRoute | undefined,\n root: string,\n path: string,\n): OpenTab | null {\n if (\n !route ||\n route.chromeless === true ||\n route.follows === true ||\n root === ''\n ) {\n return null;\n }\n return {\n path,\n ...defaultTabTitle(route, root),\n icon: route.icon,\n preview: false,\n pinned: false,\n closable: route.closable !== false,\n };\n}\n\nexport function toOpenTab(\n routes: readonly ContentRoute[],\n tab: PaneTab,\n onClose: (() => void) | undefined,\n): OpenTab {\n const root = tabRootOf(routes, tab.path);\n const route = matchRoute(routes, tab.path);\n const effective = overlayTabTitle(tab, {\n ...defaultTabTitle(route, root),\n icon: route?.icon,\n });\n return {\n path: tab.path,\n title: effective.title,\n literalTitle: effective.literalTitle,\n icon: effective.icon,\n onClose,\n preview: tab.preview ?? false,\n pinned: tab.pinned ?? false,\n closable: tab.closable !== false && route?.closable !== false,\n };\n}\n\nexport function toPaneTab(tab: OpenTab): PaneTab {\n return {\n path: tab.path,\n title: tab.title,\n ...(tab.literalTitle ? { literalTitle: true } : {}),\n ...(tab.icon === undefined ? {} : { icon: tab.icon }),\n ...(tab.pinned ? { pinned: true } : {}),\n ...(tab.preview ? { preview: true } : {}),\n ...(tab.closable ? {} : { closable: false }),\n };\n}\n\nexport function facetTabViews(\n routes: readonly ContentRoute[],\n addressOf: (route: ContentRoute) => string | null = (route) => route.path,\n): ContentTabView[] {\n return routes\n .filter((route) => route.follows === true)\n .map((route) => ({ route, address: addressOf(route) }))\n .filter(\n (entry): entry is typeof entry & { address: string } =>\n entry.address !== null,\n )\n .sort(\n (a, b) =>\n (a.route.order ?? 0) - (b.route.order ?? 0) ||\n a.route.path.localeCompare(b.route.path),\n )\n .map(({ route, address }, index) => ({\n path: route.path,\n navPath: address,\n title: route.title ?? route.path,\n literalTitle:\n route.title === undefined ? true : (route.titleIsLiteral ?? false),\n icon: route.icon,\n order: index,\n closable: false,\n preview: false,\n pinned: false,\n }));\n}\n\nexport function dynamicTabViews(\n routes: readonly ContentRoute[],\n ordered: readonly OpenTab[],\n): ContentTabView[] {\n return ordered.map((tab, index) => ({\n path: tabRootOf(routes, tab.path),\n navPath: tab.path,\n title: tab.title,\n literalTitle: tab.literalTitle,\n icon: tab.icon,\n order: DYNAMIC_TAB_ORDER_BASE + index,\n closable: tab.closable,\n preview: tab.preview,\n pinned: tab.pinned,\n }));\n}\n\nexport function viewTabViews(\n paneTabs: readonly { readonly path: string }[],\n viewOf: (id: string) => View | undefined,\n meets: (access: AccessRequirement | undefined) => boolean,\n viewPanePrefix: string,\n): ContentTabView[] {\n return paneTabs\n .filter((tab) => tab.path.startsWith(viewPanePrefix))\n .flatMap((tab, index) => {\n const view = viewOf(tab.path.slice(viewPanePrefix.length));\n if (!view || !meets(view.access)) {\n return [];\n }\n return [\n {\n path: tab.path,\n navPath: tab.path,\n title: view.title,\n literalTitle: false,\n icon: view.icon,\n order: VIEW_TAB_ORDER_BASE + index,\n closable: view.closable !== false,\n preview: false,\n pinned: false,\n },\n ];\n });\n}\n","import {\n EnvironmentProviders,\n InjectionToken,\n makeEnvironmentProviders,\n} from '@angular/core';\nimport { segmentsOf } from '../content-path';\n\n/** What the host knows when it works out where a following tab should point. */\nexport interface TabAddressInput {\n /** The following surface's id, when it declared one. */\n readonly surfaceId?: string;\n /** That surface's route pattern, e.g. `cedents/:cedentId/programs/:programId/treaties`. */\n readonly pattern: string;\n /** Parameter values of the address the user is on, by name. */\n readonly params: Readonly<Record<string, string>>;\n /** The full active content path, for a resolver that needs more than the names. */\n readonly activePath: string;\n}\n\n/**\n * A distribution's own answer to \"where should this following tab point?\" — part of the mapping is\n * domain knowledge the platform cannot have (a query parameter on one tab deciding a path segment on\n * another). Return `null` to fall back to the host's substitution.\n */\nexport type TabAddressResolver = (input: TabAddressInput) => string | null;\n\nexport const TAB_ADDRESS_RESOLVER = new InjectionToken<TabAddressResolver>(\n 'TAB_ADDRESS_RESOLVER',\n);\n\n/**\n * Overrides or extends how the host computes the address of a **following** tab\n * (`routable: { follows: true }`). The platform supplies the default — the parameter values of the\n * current address substituted by name into the tab's own pattern — and the distribution supplies the\n * domain knowledge on top; returning `null` keeps the default for that tab.\n */\nexport function provideTabAddressResolver(\n resolve: TabAddressResolver,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: TAB_ADDRESS_RESOLVER, useValue: resolve },\n ]);\n}\n\nexport function computedTabAddress(\n pattern: string,\n params: Readonly<Record<string, string>>,\n): string {\n const resolved: string[] = [];\n for (const segment of segmentsOf(pattern)) {\n if (!segment.startsWith(':')) {\n resolved.push(segment);\n continue;\n }\n const value = params[segment.slice(1)];\n if (value === undefined) {\n break;\n }\n resolved.push(value);\n }\n return resolved.join('/');\n}\n\nexport function collidingParam(\n pattern: string,\n other: string,\n): string | undefined {\n const prefixes = paramPrefixes(other);\n for (const [name, prefix] of paramPrefixes(pattern)) {\n const rival = prefixes.get(name);\n if (rival !== undefined && rival !== prefix) {\n return name;\n }\n }\n return undefined;\n}\n\nfunction paramPrefixes(pattern: string): Map<string, string> {\n const prefixes = new Map<string, string>();\n const segments = segmentsOf(pattern);\n segments.forEach((segment, index) => {\n if (segment.startsWith(':')) {\n prefixes.set(segment.slice(1), segments.slice(0, index).join('/'));\n }\n });\n return prefixes;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Service } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../../persistence/working-state-store';\nimport { hydrateAsync } from '../../../persistence/hydrate';\nimport { isPopoutUrl } from '../../../popout/popout-path';\nimport { ActiveWorkspaceService } from '../../../workspace/active-workspace.service';\nimport { DockEntry, normalizeDockEntry } from './pane-restore';\nimport { PaneNode } from './pane-node';\n\nconst STORAGE_KEY = 'lw.shell.pane-trees';\n\nconst HYDRATION_RETRY_MS = 500;\n\nexport function isDefault(entry: DockEntry): boolean {\n return entry.node.kind === 'leaf' && entry.node.tabs.length === 0;\n}\n\nfunction parse(raw: string | undefined): Record<string, DockEntry> {\n if (!raw) {\n return {};\n }\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const out: Record<string, DockEntry> = {};\n for (const [dock, value] of Object.entries(parsed ?? {})) {\n const entry = normalizeDockEntry(value);\n if (entry && !isDefault(entry)) {\n out[dock] = entry;\n }\n }\n return out;\n } catch {\n return {};\n }\n}\n\nfunction serializeDocks(docks: Record<string, DockEntry>): string {\n const out: Record<string, { tree: PaneNode; primary: string }> = {};\n for (const [dock, entry] of Object.entries(docks)) {\n out[dock] = { tree: entry.node, primary: entry.primary };\n }\n return JSON.stringify(out);\n}\n\n@Service()\nexport class PaneTreeStorage {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly workspace = inject(ActiveWorkspaceService);\n\n private readonly popout = isPopoutUrl(\n inject(DOCUMENT).location?.pathname ?? '',\n );\n\n peek(): Record<string, DockEntry> {\n return parse(this.store.peek?.(this.key()));\n }\n\n hydrate(\n apply: (raw: string | undefined) => void,\n settled: () => void,\n ): void {\n if (this.store.peek) {\n settled();\n return;\n }\n void this.workspace.ready.then(() =>\n hydrateAsync(this.store, this.key(), apply, (loaded) => {\n if (loaded) {\n settled();\n return;\n }\n this.retryOnce(apply, settled);\n }),\n );\n }\n\n save(docks: Record<string, DockEntry>): void {\n if (this.popout) {\n return;\n }\n void this.store.set(this.key(), serializeDocks(docks));\n }\n\n serialize(docks: Record<string, DockEntry>): string {\n return serializeDocks(docks);\n }\n\n parsed(raw: string | undefined): Record<string, DockEntry> {\n return parse(raw);\n }\n\n private key(): string {\n return this.workspace.scopedKey(STORAGE_KEY);\n }\n\n private retryOnce(\n apply: (raw: string | undefined) => void,\n settled: () => void,\n ): void {\n setTimeout(() => {\n void this.store\n .get(this.key())\n .then((raw) => {\n apply(raw);\n settled();\n })\n .catch(() => undefined);\n }, HYDRATION_RETRY_MS);\n }\n}\n","import {\n PaneLeaf,\n PaneNode,\n PaneTab,\n leafOf,\n leafWith,\n newPaneId,\n} from './pane-node';\nimport { findLeaf } from './pane-queries';\nimport { DEFAULT_RATIO } from './pane-ratio';\n\nexport function transformLeaf(\n node: PaneNode,\n paneId: string,\n fn: (leaf: PaneLeaf) => PaneLeaf,\n): PaneNode {\n if (node.kind === 'leaf') {\n return node.id === paneId ? fn(node) : node;\n }\n const first = transformLeaf(node.first, paneId, fn);\n const second = transformLeaf(node.second, paneId, fn);\n return first === node.first && second === node.second\n ? node\n : { ...node, first, second };\n}\n\nexport function collapseLeaf(\n node: PaneNode,\n paneId: string,\n fn: (leaf: PaneLeaf) => PaneNode | null,\n): PaneNode | null {\n if (node.kind === 'leaf') {\n return node.id === paneId ? fn(node) : node;\n }\n const first = collapseLeaf(node.first, paneId, fn);\n const second = collapseLeaf(node.second, paneId, fn);\n if (first === null) {\n return second;\n }\n if (second === null) {\n return first;\n }\n return first === node.first && second === node.second\n ? node\n : { ...node, first, second };\n}\n\nfunction rootedAt(tabPath: string, root: string): boolean {\n return tabPath === root || tabPath.startsWith(`${root}/`);\n}\n\nfunction duplicatedTab(\n node: PaneNode,\n paneId: string,\n path: string,\n): PaneTab | undefined {\n const tabs = findLeaf(node, paneId)?.tabs ?? [];\n return (\n tabs.find((tab) => tab.path === path) ??\n tabs.find((tab) => rootedAt(tab.path, path))\n );\n}\n\nfunction labelledLike(leaf: PaneLeaf, source: PaneTab): PaneLeaf {\n if (source.title === undefined && source.icon === undefined) {\n return leaf;\n }\n return {\n ...leaf,\n tabs: leaf.tabs.map((tab) => ({\n ...tab,\n title: source.title,\n literalTitle: source.literalTitle,\n icon: source.icon,\n })),\n };\n}\n\nexport function splitLeaf(\n node: PaneNode,\n paneId: string,\n orientation: 'row' | 'column',\n path: string,\n position: 'before' | 'after' = 'after',\n): PaneNode {\n const added = leafOf(newPaneId(), path);\n const source = duplicatedTab(node, paneId, path);\n return splitLeafWith(\n node,\n paneId,\n orientation,\n source ? labelledLike(added, source) : added,\n position,\n );\n}\n\nexport function splitLeafWith(\n node: PaneNode,\n paneId: string,\n orientation: 'row' | 'column',\n added: PaneLeaf,\n position: 'before' | 'after',\n): PaneNode {\n if (node.kind === 'leaf') {\n if (node.id !== paneId) {\n return node;\n }\n return {\n kind: 'split',\n id: newPaneId(),\n orientation,\n ratio: DEFAULT_RATIO,\n first: position === 'before' ? added : node,\n second: position === 'before' ? node : added,\n };\n }\n return {\n ...node,\n first: splitLeafWith(node.first, paneId, orientation, added, position),\n second: splitLeafWith(node.second, paneId, orientation, added, position),\n };\n}\n\nexport function removeLeaf(node: PaneNode, paneId: string): PaneNode | null {\n return collapseLeaf(node, paneId, () => null);\n}\n\ninterface DethronedContent {\n readonly shown: string | null;\n readonly carried: string | null;\n}\n\nexport function dethroneLeaf(\n node: PaneNode,\n primaryId: string,\n previousContent: string | null,\n): PaneNode {\n const shown =\n previousContent === null || previousContent === '' ? null : previousContent;\n const carried =\n shown === null || heldOutside(node, primaryId, shown) ? null : shown;\n return transformLeaf(node, primaryId, (leaf) =>\n settledDethroned(leaf, { shown, carried }),\n );\n}\n\nfunction heldOutside(node: PaneNode, primaryId: string, path: string): boolean {\n if (node.kind === 'leaf') {\n return (\n node.id !== primaryId &&\n node.tabs.some(\n (tab) => tab.path === path || tab.path.startsWith(path + '/'),\n )\n );\n }\n return (\n heldOutside(node.first, primaryId, path) ||\n heldOutside(node.second, primaryId, path)\n );\n}\n\nfunction settledDethroned(\n leaf: PaneLeaf,\n { shown, carried }: DethronedContent,\n): PaneLeaf {\n const match =\n shown === null\n ? undefined\n : leaf.tabs.find(\n (tab) => tab.path === shown || tab.path.startsWith(shown + '/'),\n );\n if (match) {\n return { ...leaf, active: match.path };\n }\n if (carried !== null) {\n return {\n ...leaf,\n tabs: [...leaf.tabs, { path: carried }],\n active: carried,\n };\n }\n return leafWith(leaf.id, leaf.tabs, leaf.active, leaf.declared);\n}\n\nexport function pruneEmptyLeaves(\n node: PaneNode,\n primaryId: string,\n spare?: string,\n): PaneNode | null {\n if (node.kind === 'leaf') {\n return node.tabs.length === 0 &&\n node.id !== primaryId &&\n node.id !== spare &&\n !node.declared\n ? null\n : node;\n }\n const first = pruneEmptyLeaves(node.first, primaryId, spare);\n const second = pruneEmptyLeaves(node.second, primaryId, spare);\n if (first === null) {\n return second;\n }\n if (second === null) {\n return first;\n }\n return first === node.first && second === node.second\n ? node\n : { ...node, first, second };\n}\n","import { PaneLeaf, PaneNode, PaneTab, leafWith } from './pane-node';\nimport { collapseLeaf, transformLeaf } from './pane-structure';\n\nexport function insertTab(\n node: PaneNode,\n paneId: string,\n tab: PaneTab,\n index?: number,\n): PaneNode {\n return transformLeaf(node, paneId, (leaf) => {\n const existingIndex = leaf.tabs.findIndex(\n (existing) => existing.path === tab.path,\n );\n if (existingIndex >= 0) {\n const tabs = leaf.tabs.map((existing, i) =>\n i === existingIndex ? tab : existing,\n );\n return { ...leaf, tabs, active: tab.path };\n }\n const at =\n index === undefined\n ? leaf.tabs.length\n : Math.max(0, Math.min(index, leaf.tabs.length));\n const tabs = [...leaf.tabs.slice(0, at), tab, ...leaf.tabs.slice(at)];\n return { ...leaf, tabs, active: tab.path };\n });\n}\n\nexport interface TabTitlePatch {\n readonly title?: string;\n readonly literalTitle: boolean;\n readonly icon?: string;\n}\n\nexport function refineTabTitles(\n node: PaneNode,\n skipLeaf: (leaf: PaneLeaf) => boolean,\n matches: (tabPath: string) => boolean,\n patch: TabTitlePatch,\n): { node: PaneNode; found: boolean } {\n if (node.kind === 'leaf') {\n return refineLeafTitles(node, skipLeaf, matches, patch);\n }\n const first = refineTabTitles(node.first, skipLeaf, matches, patch);\n const second = refineTabTitles(node.second, skipLeaf, matches, patch);\n if (!first.found && !second.found) {\n return { node, found: false };\n }\n return {\n node: { ...node, first: first.node, second: second.node },\n found: true,\n };\n}\n\nfunction refineLeafTitles(\n leaf: PaneLeaf,\n skipLeaf: (leaf: PaneLeaf) => boolean,\n matches: (tabPath: string) => boolean,\n patch: TabTitlePatch,\n): { node: PaneNode; found: boolean } {\n if (skipLeaf(leaf)) {\n return { node: leaf, found: false };\n }\n let found = false;\n const tabs = leaf.tabs.map((tab) => {\n if (!matches(tab.path)) {\n return tab;\n }\n found = true;\n return {\n ...tab,\n title: patch.title,\n literalTitle: patch.literalTitle,\n ...(patch.icon === undefined ? {} : { icon: patch.icon }),\n };\n });\n return found\n ? { node: { ...leaf, tabs }, found }\n : { node: leaf, found: false };\n}\n\nexport function setActiveTab(\n node: PaneNode,\n paneId: string,\n tabPath: string,\n): PaneNode {\n return transformLeaf(node, paneId, (leaf) =>\n leaf.tabs.some((tab) => tab.path === tabPath)\n ? { ...leaf, active: tabPath }\n : leaf,\n );\n}\n\nexport function setTabs(\n node: PaneNode,\n paneId: string,\n tabs: readonly PaneTab[],\n): PaneNode {\n return transformLeaf(node, paneId, (leaf) =>\n leafWith(leaf.id, tabs, leaf.active, leaf.declared),\n );\n}\n\nexport function clearTabInstance(\n node: PaneNode,\n paneId: string,\n tabPath: string,\n): PaneNode {\n return transformLeaf(node, paneId, (leaf) => ({\n ...leaf,\n tabs: leaf.tabs.map((tab) =>\n tab.path === tabPath && tab.instance !== undefined\n ? tabWithout(tab, 'instance')\n : tab,\n ),\n }));\n}\n\nexport function keepTab(\n node: PaneNode,\n paneId: string,\n tabPath: string,\n): PaneNode {\n return transformLeaf(node, paneId, (leaf) => ({\n ...leaf,\n tabs: leaf.tabs.map((tab) =>\n tab.path === tabPath && tab.preview ? tabWithout(tab, 'preview') : tab,\n ),\n }));\n}\n\nexport function reseatPinned<T extends { readonly pinned?: boolean }>(\n tabs: readonly T[],\n index: number,\n updated: T,\n): T[] {\n const rest = [...tabs.slice(0, index), ...tabs.slice(index + 1)];\n const boundary = rest.findIndex((tab) => tab.pinned !== true);\n const at = boundary === -1 ? rest.length : boundary;\n return [...rest.slice(0, at), updated, ...rest.slice(at)];\n}\n\nexport function pinTab(\n node: PaneNode,\n paneId: string,\n tabPath: string,\n): PaneNode {\n return transformLeaf(node, paneId, (leaf) => {\n const index = leaf.tabs.findIndex((tab) => tab.path === tabPath);\n if (index < 0 || leaf.tabs[index].pinned === true) {\n return leaf;\n }\n const pinned: PaneTab = {\n ...tabWithout(leaf.tabs[index], 'preview'),\n pinned: true,\n };\n return { ...leaf, tabs: reseatPinned(leaf.tabs, index, pinned) };\n });\n}\n\nexport function unpinTab(\n node: PaneNode,\n paneId: string,\n tabPath: string,\n): PaneNode {\n return transformLeaf(node, paneId, (leaf) => {\n const index = leaf.tabs.findIndex(\n (tab) => tab.path === tabPath && tab.pinned,\n );\n if (index < 0) {\n return leaf;\n }\n const unpinned = tabWithout(leaf.tabs[index], 'pinned');\n return { ...leaf, tabs: reseatPinned(leaf.tabs, index, unpinned) };\n });\n}\n\nexport function tabWithout(tab: PaneTab, key: keyof PaneTab): PaneTab {\n const copy: { -readonly [K in keyof PaneTab]?: PaneTab[K] } = { ...tab };\n delete copy[key];\n return copy as PaneTab;\n}\n\nexport function removeTab(\n node: PaneNode,\n paneId: string,\n tabPath: string,\n primaryId: string,\n): PaneNode | null {\n return collapseLeaf(node, paneId, (leaf) => {\n const tabs = leaf.tabs.filter((tab) => tab.path !== tabPath);\n if (tabs.length === 0 && leaf.id !== primaryId && !leaf.declared) {\n return null;\n }\n return leafWith(\n leaf.id,\n tabs,\n leaf.active === tabPath ? undefined : leaf.active,\n leaf.declared,\n );\n });\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { RetainedViewStash } from '../retention/retained-view-stash';\nimport { paneRetentionScope } from '../retention/retention-policy';\nimport { PRIMARY_PANE, VIEW_PANE_PREFIX } from './pane-address';\nimport { PRIMARY_LEAF, PaneNode, PaneTab, activeTab } from './pane-node';\nimport {\n collectLeafIds,\n findLeaf,\n findLeafWhere,\n paneSegments,\n tabHolderOf,\n} from './pane-queries';\nimport { clampRatio, withRatio } from './pane-ratio';\nimport { DockEntry, healedPrimary } from './pane-restore';\nimport { PaneTreeStorage, isDefault } from './pane-tree-storage';\nimport {\n dethroneLeaf,\n pruneEmptyLeaves,\n removeLeaf,\n splitLeaf,\n} from './pane-structure';\nimport {\n clearTabInstance,\n insertTab,\n keepTab,\n pinTab,\n removeTab,\n setActiveTab,\n setTabs,\n unpinTab,\n} from './pane-tabs';\nimport { isContainerDock } from '../container/container-children';\n\n@Service()\nexport class PaneTreeService {\n private readonly storage = inject(PaneTreeStorage);\n private readonly stash = inject(RetainedViewStash);\n\n private readonly docks = signal<Record<string, DockEntry>>(\n this.storage.peek(),\n );\n private readonly hydratedTree = signal(false);\n readonly hydrated = this.hydratedTree.asReadonly();\n\n constructor() {\n this.storage.hydrate(\n (raw) => this.applyHydratedTrees(raw),\n () => this.hydratedTree.set(true),\n );\n }\n\n tree(dock: string): PaneNode {\n return this.docks()[dock]?.node ?? PRIMARY_LEAF;\n }\n\n primaryId(dock: string): string {\n return this.docks()[dock]?.primary ?? PRIMARY_PANE;\n }\n\n dockTrees(): Record<string, PaneNode> {\n const out: Record<string, PaneNode> = {};\n for (const [dock, entry] of Object.entries(this.docks())) {\n out[dock] = entry.node;\n }\n return out;\n }\n\n isSplit(dock: string): boolean {\n return this.tree(dock).kind === 'split';\n }\n\n unsplit(dock: string): void {\n this.commit(\n dock,\n findLeaf(this.tree(dock), this.primaryId(dock)) ?? PRIMARY_LEAF,\n );\n }\n\n splitPane(\n dock: string,\n paneId: string,\n orientation: 'row' | 'column',\n path: string,\n position: 'before' | 'after' = 'after',\n ): void {\n this.commit(\n dock,\n splitLeaf(this.tree(dock), paneId, orientation, path, position),\n );\n }\n\n stackView(dock: string, viewId: string): void {\n const segments = paneSegments(this.tree(dock));\n const last = segments[segments.length - 1];\n if (last) {\n this.splitPane(dock, last.id, 'column', VIEW_PANE_PREFIX + viewId);\n }\n }\n\n closePane(dock: string, paneId: string): void {\n if (paneId === this.primaryId(dock)) {\n return;\n }\n this.commit(dock, removeLeaf(this.tree(dock), paneId) ?? PRIMARY_LEAF);\n }\n\n insertTab(dock: string, paneId: string, path: string): void {\n this.commit(dock, insertTab(this.tree(dock), paneId, { path }));\n }\n\n pointAt(dock: string, paneId: string): void {\n const tree = this.tree(dock);\n if (this.primaryId(dock) === paneId || !findLeaf(tree, paneId)) {\n return;\n }\n this.commit(dock, tree, paneId);\n }\n\n primaryTabs(dock: string): readonly PaneTab[] {\n return findLeaf(this.tree(dock), this.primaryId(dock))?.tabs ?? [];\n }\n\n setPrimaryTabs(dock: string, tabs: readonly PaneTab[]): void {\n this.commit(dock, setTabs(this.tree(dock), this.primaryId(dock), tabs));\n }\n\n reorderPaneTabs(\n dock: string,\n paneId: string,\n order: readonly string[],\n ): void {\n const leaf = findLeaf(this.tree(dock), paneId);\n if (!leaf) {\n return;\n }\n const rank = new Map(order.map((path, index) => [path, index]));\n const tabs = [...leaf.tabs].sort(\n (a, b) =>\n (rank.get(a.path) ?? leaf.tabs.indexOf(a)) -\n (rank.get(b.path) ?? leaf.tabs.indexOf(b)),\n );\n this.commit(dock, setTabs(this.tree(dock), paneId, tabs));\n }\n\n commitTree(dock: string, node: PaneNode): void {\n this.commit(dock, node);\n }\n commit(dock: string, next: PaneNode, primary?: string): void {\n this.update(dock, next, primary);\n this.persist();\n }\n\n setActiveTab(dock: string, paneId: string, tabPath: string): void {\n if (findLeaf(this.tree(dock), paneId)?.active === tabPath) {\n return;\n }\n this.commit(dock, setActiveTab(this.tree(dock), paneId, tabPath));\n }\n\n clearTabInstance(dock: string, paneId: string, tabPath: string): void {\n this.commit(dock, clearTabInstance(this.tree(dock), paneId, tabPath));\n }\n\n hasTab(path: string): boolean {\n return this.sourceOf(path) !== null;\n }\n\n sourceOf(path: string): { dock: string; paneId: string } | null {\n for (const [dock, entry] of Object.entries(this.docks())) {\n const paneId = tabHolderOf(entry.node, path);\n if (paneId !== null) {\n return { dock, paneId };\n }\n }\n return null;\n }\n\n seedPrimaryTabs(\n dock: string,\n paths: readonly string[],\n order: readonly string[] = paths,\n ): void {\n if (paths.length === 0) {\n return;\n }\n const tree = this.tree(dock);\n const primary = this.primaryId(dock);\n const existing = findLeaf(tree, primary)?.tabs ?? [];\n const rank = new Map(order.map((path, index) => [path, index]));\n const tabs = [...existing];\n for (const path of paths) {\n const target = rank.get(path) ?? Number.MAX_SAFE_INTEGER;\n const before = tabs.findIndex(\n (tab) => (rank.get(tab.path) ?? -1) > target,\n );\n tabs.splice(before === -1 ? tabs.length : before, 0, { path });\n }\n this.commit(dock, setTabs(tree, primary, tabs));\n }\n\n removeTab(dock: string, paneId: string, tabPath: string): void {\n const tree = this.tree(dock);\n const primary = this.primaryId(dock);\n const leaf = paneId === primary ? findLeaf(tree, primary) : undefined;\n if (leaf && !leaf.tabs.some((tab) => tab.path === tabPath)) {\n return;\n }\n if (leaf && !leaf.declared && leaf.tabs.length <= 1) {\n if (tree.kind === 'split') {\n this.commit(dock, removeLeaf(tree, primary) ?? PRIMARY_LEAF);\n }\n return;\n }\n this.commit(\n dock,\n removeTab(tree, paneId, tabPath, primary) ?? PRIMARY_LEAF,\n );\n }\n\n unpinTab(dock: string, paneId: string, tabPath: string): void {\n this.commit(dock, unpinTab(this.tree(dock), paneId, tabPath));\n }\n\n keepTab(dock: string, paneId: string, tabPath: string): void {\n this.commit(dock, keepTab(this.tree(dock), paneId, tabPath));\n }\n\n pinTab(dock: string, paneId: string, tabPath: string): void {\n this.commit(dock, pinTab(this.tree(dock), paneId, tabPath));\n }\n\n collapsePrimary(dock: string): string | null {\n const collapsed = removeLeaf(this.tree(dock), this.primaryId(dock));\n if (collapsed === null) {\n return null;\n }\n this.commit(dock, collapsed);\n const promoted = findLeaf(collapsed, this.primaryId(dock));\n return promoted ? (activeTab(promoted)?.path ?? '') : '';\n }\n\n focusPane(\n dock: string,\n paneId: string,\n previousContent: string | null,\n ): string | null {\n const leaf = paneSegments(this.tree(dock)).find(\n (segment) => segment.id === paneId,\n );\n const path = leaf?.path;\n const primary = this.primaryId(dock);\n if (\n paneId === primary ||\n path === undefined ||\n path === '' ||\n path.startsWith(VIEW_PANE_PREFIX)\n ) {\n return null;\n }\n const dethroned = dethroneLeaf(this.tree(dock), primary, previousContent);\n const spare = previousContent === null ? undefined : primary;\n const next = pruneEmptyLeaves(dethroned, paneId, spare) ?? PRIMARY_LEAF;\n this.commit(dock, next, paneId);\n return path;\n }\n\n resizeStream(dock: string, splitId: string, ratio: number): void {\n this.update(dock, withRatio(this.tree(dock), splitId, clampRatio(ratio)));\n }\n\n resizeCommit(): void {\n this.persist();\n }\n\n hasDock(dock: string): boolean {\n return this.docks()[dock] !== undefined;\n }\n\n dropDock(dock: string): void {\n if (!this.docks()[dock]) {\n return;\n }\n this.docks.update((docks) => {\n const next = { ...docks };\n delete next[dock];\n return next;\n });\n this.persist();\n }\n\n hydrate(raw: string | undefined): void {\n const next = this.storage.parsed(raw);\n for (const dock of Object.keys(this.docks())) {\n this.stash.evacuate(`${dock}:`);\n this.evacuateRemovedPanes(dock, next[dock]?.node ?? PRIMARY_LEAF);\n }\n this.docks.set(next);\n this.persist();\n }\n\n serialize(): string {\n return this.storage.serialize(this.docks());\n }\n\n landingPane(dock: string): string {\n return (\n findLeafWhere(this.tree(dock), (leaf) => leaf.declared === true)?.id ??\n this.primaryId(dock)\n );\n }\n\n private applyHydratedTrees(raw: string | undefined): void {\n const persisted = this.storage.parsed(raw);\n this.docks.update((current) => {\n const merged = { ...persisted };\n for (const [dock, entry] of Object.entries(current)) {\n if (isContainerDock(dock) && !(dock in persisted)) {\n merged[dock] = entry;\n }\n }\n return merged;\n });\n }\n\n private update(dock: string, next: PaneNode, primary?: string): void {\n this.evacuateRemovedPanes(dock, next);\n this.docks.update((docks) => {\n const updated = { ...docks };\n const entry: DockEntry = {\n node: next,\n primary: healedPrimary(next, primary ?? docks[dock]?.primary),\n };\n if (isDefault(entry)) {\n delete updated[dock];\n } else {\n updated[dock] = entry;\n }\n return updated;\n });\n }\n\n private evacuateRemovedPanes(dock: string, next: PaneNode): void {\n const current = this.docks()[dock]?.node;\n if (!current) {\n return;\n }\n const surviving = new Set(collectLeafIds(next));\n for (const id of collectLeafIds(current)) {\n if (!surviving.has(id)) {\n this.stash.evacuate(`${paneRetentionScope(dock, id)}|`);\n }\n }\n }\n\n private persist(): void {\n if (!this.hydratedTree()) {\n return;\n }\n this.storage.save(this.docks());\n }\n}\n","import {\n computed,\n effect,\n inject,\n isDevMode,\n Service,\n signal,\n Signal,\n untracked,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport { ActiveContent, ContentRoute } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { AuthContext } from '../../../auth/auth-context';\nimport {\n isHomePath,\n matchRoute,\n normalizePath,\n routeParams,\n segmentsOf,\n suffixOf,\n tabRootOf,\n} from '../content-path';\nimport {\n ContentTabView,\n OpenTab,\n autoOpenedTab,\n dynamicTabViews,\n facetTabViews,\n toOpenTab,\n toPaneTab,\n viewTabViews,\n withRefreshedPath,\n} from './content-tab-projection';\nimport { TabCloseHooks } from './tab-close-hooks';\nimport { QuickOpenTarget } from './quick-open-target';\nimport { TAB_ADDRESS_RESOLVER, computedTabAddress } from './tab-address';\nimport { VIEW_PANE_PREFIX } from '../../pane/tree/pane-address';\nimport { collectTabs, findLeaf, findLeafWhere } from '../../pane/tree/pane-queries';\nimport { CONTENT_DOCK } from '../../pane/tree/pane-address';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { isPopoutUrl } from '../../../popout/popout-path';\n\ninterface RootedPath {\n readonly routes: readonly ContentRoute[];\n readonly root: string;\n}\n\n@Service()\nexport class OpenTabsService {\n private readonly router = inject(Router);\n\n private readonly registry = inject(ContributionRegistry);\n\n private readonly auth = inject(AuthContext);\n\n private readonly paneTree = inject(PaneTreeService);\n\n private readonly tabAddress = inject(TAB_ADDRESS_RESOLVER, {\n optional: true,\n });\n\n private readonly closeHooks = inject(TabCloseHooks);\n\n private readonly inPopout = isPopoutUrl(inject(DOCUMENT).location.pathname);\n\n private readonly lastActive = signal<ReadonlyMap<string, number>>(new Map());\n\n readonly openTabs = computed<readonly OpenTab[]>(() => {\n const routes = this.registry.contentRoutes();\n return this.paneTree\n .primaryTabs(CONTENT_DOCK)\n .filter((tab) => !tab.path.startsWith(VIEW_PANE_PREFIX))\n .map((tab) =>\n toOpenTab(\n routes,\n tab,\n this.closeHooks.get(tabRootOf(routes, tab.path)),\n ),\n );\n });\n\n readonly quickOpenTargets: Signal<readonly QuickOpenTarget[]> = computed(\n () => {\n const routes = this.registry.contentRoutes();\n const times = this.lastActive();\n const openRoots = new Set<string>();\n const open: QuickOpenTarget[] = [];\n for (const paneTab of collectTabs(this.paneTree.tree(CONTENT_DOCK))) {\n if (paneTab.path.startsWith(VIEW_PANE_PREFIX)) {\n continue;\n }\n const projected = toOpenTab(routes, paneTab, undefined);\n const root = tabRootOf(routes, projected.path);\n if (openRoots.has(root)) {\n continue;\n }\n openRoots.add(root);\n open.push({\n path: root,\n navPath: projected.path,\n title: projected.title,\n literalTitle: projected.literalTitle,\n icon: projected.icon,\n pinned: projected.pinned,\n closable: projected.closable,\n lastActive: times.get(root),\n });\n }\n const statics = routes.flatMap<QuickOpenTarget>((route) => {\n const path = normalizePath(route.path);\n if (\n path === '' ||\n path.includes(':') ||\n route.chromeless === true ||\n !this.auth.meets(route.access) ||\n openRoots.has(path)\n ) {\n return [];\n }\n return [\n {\n path,\n navPath: route.path,\n title: route.title ?? path,\n literalTitle:\n route.title === undefined\n ? true\n : (route.titleIsLiteral ?? false),\n icon: route.icon,\n pinned: false,\n closable: false,\n lastActive: times.get(path),\n },\n ];\n });\n return [...open, ...statics];\n },\n );\n\n private readonly viewTabSelection = signal<string | null>(null);\n\n readonly activeViewPath: Signal<string | null> = computed(() => {\n const path = this.viewTabSelection();\n return path !== null &&\n this.paneTree.primaryTabs(CONTENT_DOCK).some((tab) => tab.path === path)\n ? path\n : null;\n });\n\n readonly activeViewInstance: Signal<string | undefined> = computed(() => {\n const path = this.activeViewPath();\n if (path === null) {\n return undefined;\n }\n return this.paneTree\n .primaryTabs(CONTENT_DOCK)\n .find((tab) => tab.path === path)?.instance;\n });\n\n private readonly currentUrl = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(() => this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n readonly activePath: Signal<string> = computed(() =>\n normalizePath(this.currentUrl()),\n );\n\n private readonly activeRoute = computed(() =>\n matchRoute(this.registry.contentRoutes(), this.activePath()),\n );\n\n readonly activeTabRoot: Signal<string> = computed(() =>\n tabRootOf(this.registry.contentRoutes(), this.activePath()),\n );\n\n readonly activeContent: Signal<ActiveContent | null> = computed(() => {\n const route = this.activeRoute();\n if (!route) {\n return null;\n }\n const path = this.activePath();\n return {\n surfaceId: route.id ?? null,\n path,\n params: routeParams(route, path),\n };\n });\n\n private readonly activeChromeless = computed(\n () => this.activeRoute()?.chromeless === true,\n );\n\n readonly showStrip: Signal<boolean> = computed(\n () => !this.activeChromeless() && this.tabs().length > 0,\n );\n\n readonly tabs: Signal<readonly ContentTabView[]> = computed(() => {\n const routes = this.registry.contentRoutes();\n const facets = facetTabViews(routes, (route) => this.addressOf(route));\n const open = this.openTabs().filter((tab) => this.strippable(routes, tab));\n const dynamics = dynamicTabViews(routes, open);\n return [...facets, ...dynamics, ...this.viewTabs()].sort(\n (a, b) => a.order - b.order,\n );\n });\n\n private readonly viewTabs = computed<readonly ContentTabView[]>(() =>\n viewTabViews(\n this.paneTree.primaryTabs(CONTENT_DOCK),\n (id) => this.registry.views().find((view) => view.id === id),\n (access) => this.auth.meets(access),\n VIEW_PANE_PREFIX,\n ),\n );\n\n private lastUrl = this.router.url;\n\n private ownNavigation: string | null = null;\n\n constructor() {\n effect(() => {\n const url = this.currentUrl();\n const path = this.activePath();\n const root = this.activeTabRoot();\n const route = this.activeRoute();\n this.paneTree.hydrated();\n untracked(() => {\n if (url !== this.lastUrl) {\n this.lastUrl = url;\n if (this.ownNavigation !== normalizePath(url)) {\n this.viewTabSelection.set(null);\n }\n this.ownNavigation = null;\n }\n this.syncActiveTab(route, root, path);\n if (root) {\n this.stampActive(root);\n }\n });\n });\n }\n\n activateViewTab(path: string): void {\n if (\n this.paneTree.primaryTabs(CONTENT_DOCK).some((tab) => tab.path === path)\n ) {\n this.viewTabSelection.set(path);\n }\n }\n\n navigate(path: string): Promise<boolean> {\n if (this.inPopout) {\n if (isDevMode()) {\n console.warn(\n `Content navigation to \"${path}\" was ignored: this is a pop-out window, which shows one ` +\n `surface and has no content area to navigate. A command reaches a pop-out's palette only ` +\n `if it declares popout: true, so leave that off anything that navigates.`,\n );\n }\n return Promise.resolve(false);\n }\n const target = normalizePath(path);\n this.focusHolderOf(target);\n this.ownNavigation = target;\n this.viewTabSelection.set(null);\n return this.router.navigateByUrl('/' + target + suffixOf(path));\n }\n\n navigateTo(path: string): void {\n this.navigate(path).catch((error: unknown) =>\n console.error('Content navigation failed', error),\n );\n }\n\n updateOpen(\n fn: (tabs: readonly OpenTab[]) => readonly OpenTab[],\n ): void {\n const current = this.openTabs();\n const next = fn(current);\n if (next === current) {\n return;\n }\n const viewTabs = this.paneTree\n .primaryTabs(CONTENT_DOCK)\n .filter((tab) => tab.path.startsWith(VIEW_PANE_PREFIX));\n this.paneTree.setPrimaryTabs(CONTENT_DOCK, [\n ...next.map((tab) => toPaneTab(tab)),\n ...viewTabs,\n ]);\n }\n\n rootFor(path: string): RootedPath {\n const routes = this.registry.contentRoutes();\n return { routes, root: tabRootOf(routes, normalizePath(path)) };\n }\n\n openTabRootedAt(\n routes: readonly ContentRoute[],\n root: string,\n ): OpenTab | undefined {\n return this.openTabs().find((tab) => tabRootOf(routes, tab.path) === root);\n }\n\n private addressOf(route: ContentRoute): string | null {\n if (route.follows !== true) {\n return route.path;\n }\n const active = this.activeRoute();\n const params = active ? routeParams(active, this.activePath()) : {};\n const override = this.tabAddress?.({\n surfaceId: route.id,\n pattern: route.path,\n params,\n activePath: this.activePath(),\n });\n if (override) {\n return override;\n }\n const computed = computedTabAddress(route.path, params);\n return this.somewhereToGo(computed) ? computed : null;\n }\n\n private somewhereToGo(address: string): boolean {\n const routes = this.registry.contentRoutes();\n const owner = matchRoute(routes, address);\n if (!owner) {\n return false;\n }\n return (\n owner.rest === true ||\n segmentsOf(owner.path).length === segmentsOf(address).length\n );\n }\n\n private focusHolderOf(target: string): void {\n const routes = this.registry.contentRoutes();\n const root = tabRootOf(routes, target);\n if (root === '') {\n return;\n }\n const rooted = (path: string) =>\n !path.startsWith(VIEW_PANE_PREFIX) && tabRootOf(routes, path) === root;\n const tree = this.paneTree.tree(CONTENT_DOCK);\n const primary = this.paneTree.primaryId(CONTENT_DOCK);\n if (findLeaf(tree, primary)?.tabs.some((tab) => rooted(tab.path))) {\n return;\n }\n const holder = findLeafWhere(\n tree,\n (leaf) =>\n leaf.id !== primary && leaf.tabs.some((tab) => rooted(tab.path)),\n );\n const held = holder?.tabs.find((tab) => rooted(tab.path));\n if (!holder || !held) {\n return;\n }\n this.paneTree.setActiveTab(CONTENT_DOCK, holder.id, held.path);\n this.paneTree.focusPane(CONTENT_DOCK, holder.id, this.activeTabRoot());\n }\n\n private stampActive(root: string): void {\n const next = new Map(this.lastActive());\n next.set(root, Date.now());\n this.lastActive.set(next);\n }\n\n private syncActiveTab(\n route: ContentRoute | undefined,\n root: string,\n path: string,\n ): void {\n const routes = this.registry.contentRoutes();\n this.updateOpen((tabs) => {\n const index = tabs.findIndex(\n (tab) => tabRootOf(routes, tab.path) === root,\n );\n if (index >= 0) {\n return withRefreshedPath(tabs, index, path);\n }\n const opened = autoOpenedTab(route, root, path);\n return opened ? [...tabs, opened] : tabs;\n });\n }\n\n private strippable(routes: readonly ContentRoute[], tab: OpenTab): boolean {\n if (isHomePath(tab.path)) {\n return false;\n }\n const route = matchRoute(routes, tab.path);\n return (\n route !== undefined &&\n route.chromeless !== true &&\n route.follows !== true &&\n !(normalizePath(route.path) === '' && normalizePath(tab.path) !== '')\n );\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injector, Service, signal, Type, WritableSignal } from '@angular/core';\nimport { LwButtonVariant } from '../elements/button/lw-button';\nimport { LoomIconName } from '../elements/icon/loom-icons';\nimport { DialogRef } from './dialog-ref';\nimport {\n AlertOptions,\n ConfirmOptions,\n DialogSize,\n DialogTone,\n OpenOptions,\n ProgressHandle,\n ProgressOptions,\n PromptOptions,\n} from '@loomweaver/plugin-sdk';\n\nexport type {\n DialogTone,\n DialogSize,\n RequireConfirmation,\n ConfirmOptions,\n AlertOptions,\n PromptOptions,\n DialogButton,\n ProgressOptions,\n ProgressHandle,\n OpenOptions,\n} from '@loomweaver/plugin-sdk';\n\nconst TONE_BUTTON: Record<DialogTone, LwButtonVariant> = {\n default: 'primary',\n info: 'info',\n success: 'success',\n warning: 'warning',\n danger: 'danger',\n};\n\nconst TONE_ICON: Record<DialogTone, LoomIconName | undefined> = {\n default: undefined,\n info: 'info',\n success: 'success',\n warning: 'warning',\n danger: 'warning',\n};\n\ntype DialogKind = 'confirm' | 'alert' | 'prompt' | 'custom' | 'progress';\ntype ButtonRole = 'confirm' | 'cancel' | 'custom';\n\n/** A footer button as the dialog outlet renders it. */\nexport interface DialogButtonView {\n readonly label: string;\n readonly variant: LwButtonVariant;\n readonly role: ButtonRole;\n readonly value?: unknown;\n readonly autofocus: boolean;\n}\n\n/** One open dialog, held by the service and rendered by the dialog outlet. */\nexport interface DialogInstance {\n readonly id: string;\n readonly ref: DialogRef;\n readonly kind: DialogKind;\n readonly tone: DialogTone;\n /** Host icon name (from options or the tone default); rendered by `<lw-icon>`. */\n readonly icon?: string;\n readonly title?: string;\n readonly message?: string;\n readonly component?: Type<unknown>;\n readonly injector?: Injector;\n readonly placeholder?: string;\n readonly promptValue?: WritableSignal<string>;\n /** Live status text for a `progress` dialog. */\n readonly progressMessage?: WritableSignal<string>;\n /** Type-to-confirm label (Markdown) shown above the input, if any. */\n readonly requireLabel?: string;\n /** Validates the guard input; `null` = valid (enables confirm), else an inline error. */\n readonly requireValidate?: (value: string) => string | null;\n readonly buttons: readonly DialogButtonView[];\n readonly dismissable: boolean;\n readonly size?: DialogSize;\n /** Render only the component (no host chrome) — the component owns the frame contents. */\n readonly bare?: boolean;\n /** The frame shows a maximize/restore control (framed dialogs; bare ones draw their own). */\n readonly maximizable?: boolean;\n /** Vertical anchor: `'top'` pins the panel's top edge on every width. Defaults to `'center'`. */\n readonly align?: 'center' | 'top';\n}\n\n/**\n * Neutral host service for modal dialogs:\n * convenience dialogs (`confirm`/`alert`/`prompt`, the host paints everything) and rich\n * `open(Component)` dialogs where a plugin owns the body and the host paints the frame +\n * declarative footer buttons. The shell renders them once via `<lw-dialog-outlet>`. Uses\n * only `<lw-*>` chrome + semantic tokens, so plugin-authored bodies stay harmonious.\n */\n@Service()\nexport class DialogService {\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly items = signal<readonly DialogInstance[]>([]);\n private counter = 0;\n\n /** The currently open dialogs, oldest first (the last one is topmost). */\n readonly dialogs = this.items.asReadonly();\n\n /** Asks a yes/no question; resolves `true` only if confirmed. */\n confirm(options: ConfirmOptions): Promise<boolean> {\n const tone = options.tone ?? 'default';\n const guard = options.requireConfirmation;\n const ref = this.push({\n kind: 'confirm',\n tone,\n icon: options.icon ?? TONE_ICON[tone],\n title: options.title,\n message: options.message,\n promptValue: guard ? signal('') : undefined,\n requireLabel: guard?.label,\n requireValidate: guard?.validate,\n placeholder: guard?.placeholder,\n dismissable: true,\n buttons: [\n {\n label: options.cancelLabel ?? 'dialog.cancel',\n variant: 'default',\n role: 'cancel',\n autofocus: false,\n },\n {\n label: options.confirmLabel ?? 'dialog.ok',\n variant: TONE_BUTTON[tone],\n role: 'confirm',\n autofocus: !guard,\n },\n ],\n });\n return ref.closed.then((result) => result === true);\n }\n\n /** Shows a message with a single acknowledge button. */\n alert(options: AlertOptions): Promise<void> {\n const tone = options.tone ?? 'default';\n const ref = this.push({\n kind: 'alert',\n tone,\n icon: options.icon ?? TONE_ICON[tone],\n title: options.title,\n message: options.message,\n dismissable: true,\n buttons: [\n {\n label: options.okLabel ?? 'dialog.ok',\n variant: TONE_BUTTON[tone],\n role: 'confirm',\n autofocus: true,\n },\n ],\n });\n return ref.closed.then(() => undefined);\n }\n\n /** Asks for a line of text; resolves the value, or `null` if cancelled/dismissed. */\n prompt(options: PromptOptions): Promise<string | null> {\n const tone = options.tone ?? 'default';\n const value = signal(options.initial ?? '');\n const ref = this.push({\n kind: 'prompt',\n tone,\n icon: options.icon ?? TONE_ICON[tone],\n title: options.title,\n message: options.message,\n placeholder: options.placeholder,\n promptValue: value,\n dismissable: true,\n buttons: [\n {\n label: options.cancelLabel ?? 'dialog.cancel',\n variant: 'default',\n role: 'cancel',\n autofocus: false,\n },\n {\n label: options.confirmLabel ?? 'dialog.ok',\n variant: TONE_BUTTON[tone],\n role: 'confirm',\n autofocus: false,\n },\n ],\n });\n return ref.closed.then((result) =>\n result === undefined ? null : (result as string),\n );\n }\n\n /**\n * Opens a custom body component. The host paints the frame + any declarative footer\n * buttons; the component owns the body and injects {@link DialogRef} to close itself.\n */\n open<R = unknown>(\n component: Type<unknown>,\n options: OpenOptions = {},\n ): DialogRef<R> {\n const ref = new DialogRef(options.data);\n const injector = Injector.create({\n providers: [{ provide: DialogRef, useValue: ref }],\n parent: this.injector,\n });\n const specs = options.buttons ?? [];\n const buttons: DialogButtonView[] = specs.map((button, index) => ({\n label: button.label,\n variant: button.variant ?? 'default',\n role: 'custom',\n value: button.value,\n autofocus: index === specs.length - 1,\n }));\n const tone = options.tone ?? 'default';\n this.mount(\n {\n kind: 'custom',\n tone,\n icon: options.icon ?? TONE_ICON[tone],\n title: options.title,\n component,\n injector,\n buttons,\n dismissable: options.dismissable ?? true,\n size: options.size,\n bare: options.bare,\n maximizable: options.maximizable,\n align: options.align,\n },\n ref,\n );\n return ref as unknown as DialogRef<R>;\n }\n\n /**\n * Shows a non-dismissable busy indicator (spinner + status) so a running operation is not\n * interrupted. The caller closes it when done — or use {@link withProgress} to auto-close.\n */\n progress(options: ProgressOptions): ProgressHandle {\n const message = signal(options.message);\n const ref = this.push({\n kind: 'progress',\n tone: 'default',\n title: options.title,\n progressMessage: message,\n dismissable: false,\n buttons: [],\n });\n return {\n update: (next) => message.set(next),\n close: () => ref.close(),\n };\n }\n\n /** Runs `work` behind a progress dialog that closes automatically when it settles. */\n async withProgress<T>(\n options: ProgressOptions,\n work: Promise<T>,\n ): Promise<T> {\n const handle = this.progress(options);\n try {\n return await work;\n } finally {\n handle.close();\n }\n }\n\n private push(spec: Omit<DialogInstance, 'id' | 'ref'>): DialogRef {\n const ref = new DialogRef();\n this.mount(spec, ref);\n return ref;\n }\n\n private mount(\n spec: Omit<DialogInstance, 'id' | 'ref'>,\n ref: DialogRef,\n ): void {\n const id = `lw.dialog.${this.counter++}`;\n const trigger = this.document.activeElement as HTMLElement | null;\n this.items.update((list) => [...list, { ...spec, id, ref }]);\n\n void ref.closed.then(() => {\n this.items.update((list) => list.filter((dialog) => dialog.id !== id));\n trigger?.focus?.();\n });\n }\n}\n","import { upsertById } from '../foundation/identified';\nimport { Service, signal } from '@angular/core';\nimport {\n NotificationAction,\n NotificationInput,\n NotificationKind,\n} from '@loomweaver/plugin-sdk';\n\nexport type {\n NotificationInput,\n NotificationKind,\n NotificationAction,\n} from '@loomweaver/plugin-sdk';\n\n/** A live notification held by the service and rendered by the toast outlet. */\nexport interface Notification {\n readonly id: string;\n readonly kind: NotificationKind;\n readonly message: string;\n readonly action?: NotificationAction;\n}\n\n/**\n * Neutral host service for transient notifications (\"toasts\"). The shell\n * renders them once via the toast outlet; distributions and plugins raise them through\n * `ctx`. Sticky toasts (no `timeoutMs`) stay until dismissed — the update notice uses\n * this so dismissing it never loses the \"update available\" state.\n */\n@Service()\nexport class NotificationService {\n private readonly items = signal<readonly Notification[]>([]);\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n private nextId = 0;\n\n /** The currently visible notifications, oldest first. */\n readonly notifications = this.items.asReadonly();\n\n /** Shows a notification (replacing any with the same id) and returns its id. */\n show(input: NotificationInput): string {\n const id = input.id ?? `lw.toast.${this.nextId++}`;\n const toast: Notification = {\n id,\n kind: input.kind ?? 'info',\n message: input.message,\n action: input.action,\n };\n this.clearTimer(id);\n this.items.update((list) => upsertById(list, toast));\n if (input.timeoutMs && input.timeoutMs > 0) {\n this.timers.set(\n id,\n setTimeout(() => this.dismiss(id), input.timeoutMs),\n );\n }\n return id;\n }\n\n /** Removes the notification with the given id (no-op if already gone). */\n dismiss(id: string): void {\n this.clearTimer(id);\n this.items.update((list) => list.filter((t) => t.id !== id));\n }\n\n private clearTimer(id: string): void {\n const timer = this.timers.get(id);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(id);\n }\n }\n}\n","import { Component } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\n@Component({\n selector: 'lw-close-veto-dialog',\n imports: [TranslocoPipe],\n template: `<p class=\"text-sm text-content\">\n {{ 'retention.vetoPendingMessage' | transloco }}\n </p>`,\n})\nexport class CloseVetoDialog {}\n","import { Component } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\n@Component({\n selector: 'lw-unsaved-changes-dialog',\n imports: [TranslocoPipe],\n template: `<p class=\"text-sm text-content\">\n {{ 'retention.unsavedMessage' | transloco }}\n </p>`,\n})\nexport class UnsavedChangesDialog {}\n","import { inject, Service } from '@angular/core';\nimport { DialogButton, DirtySurface } from '@loomweaver/plugin-sdk';\nimport { DialogService } from '../../../dialog/dialog.service';\nimport { NotificationService } from '../../../notifications/notification.service';\nimport { CloseVetoDialog } from './close-veto-dialog';\nimport { UnsavedChangesDialog } from './unsaved-changes-dialog';\nimport {\n beforeCloseOf,\n dirtySurfaceOf,\n instanceDirty,\n} from '../retention/retention-policy';\n\ntype CloseChoice = 'save' | 'discard' | 'cancel';\n\ntype VetoHook = () => boolean | Promise<boolean>;\n\nexport const BEFORE_CLOSE_TIMEOUT_MS = 5000;\n\n@Service()\nexport class SurfaceCloseGuard {\n private readonly dialogs = inject(DialogService);\n private readonly notifications = inject(NotificationService);\n\n anyDirty(candidates: readonly unknown[]): boolean {\n return candidates.some((candidate) => instanceDirty(candidate));\n }\n\n guarded(candidates: readonly unknown[], proceed: () => void): void {\n if (\n !this.anyDirty(candidates) &&\n this.vetoHooksOf(candidates).length === 0\n ) {\n proceed();\n return;\n }\n void this.confirmClose(candidates).then((ok) => {\n if (ok) {\n proceed();\n }\n });\n }\n\n async confirmClose(candidates: readonly unknown[]): Promise<boolean> {\n for (const hook of this.vetoHooksOf(candidates)) {\n if (!(await this.veto(hook))) {\n return false;\n }\n }\n return this.confirmDiscard(candidates);\n }\n\n async confirmDiscard(candidates: readonly unknown[]): Promise<boolean> {\n const dirty = this.dirtyOf(candidates);\n if (dirty.length === 0) {\n return true;\n }\n const savable = dirty.every(\n (surface) => typeof surface.surfaceSave === 'function',\n );\n const choice = await this.ask(savable);\n if (choice === 'discard') {\n return true;\n }\n if (choice !== 'save') {\n return false;\n }\n return this.saveAll(dirty);\n }\n\n private vetoHooksOf(candidates: readonly unknown[]): VetoHook[] {\n const hooks: VetoHook[] = [];\n for (const candidate of new Set(candidates)) {\n const hook = beforeCloseOf(candidate);\n if (hook) {\n hooks.push(hook);\n }\n }\n return hooks;\n }\n\n private async veto(hook: VetoHook): Promise<boolean> {\n let result: boolean | Promise<boolean>;\n try {\n result = hook();\n } catch (error) {\n console.error('surfaceBeforeClose() threw — closing anyway', error);\n return true;\n }\n if (typeof result === 'boolean') {\n return result;\n }\n const settled = result.then(\n (value) => value !== false,\n (error: unknown) => {\n console.error('surfaceBeforeClose() rejected — closing anyway', error);\n return true;\n },\n );\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<'timeout'>((resolve) => {\n timer = setTimeout(() => resolve('timeout'), BEFORE_CLOSE_TIMEOUT_MS);\n });\n try {\n const outcome = await Promise.race([settled, timeout]);\n if (outcome !== 'timeout') {\n return outcome;\n }\n return await this.closeAnyway(settled);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private closeAnyway(settled: Promise<boolean>): Promise<boolean> {\n const ref = this.dialogs.open<'force' | 'keep'>(CloseVetoDialog, {\n title: 'retention.vetoPendingTitle',\n tone: 'warning',\n buttons: [\n { label: 'dialog.cancel', value: 'keep' },\n { label: 'retention.closeAnyway', variant: 'danger', value: 'force' },\n ],\n });\n void settled.then((approved) => ref.close(approved ? 'force' : 'keep'));\n return ref.closed.then((choice) => choice === 'force');\n }\n\n private dirtyOf(candidates: readonly unknown[]): DirtySurface[] {\n const dirty = new Set<DirtySurface>();\n for (const candidate of candidates) {\n const surface = dirtySurfaceOf(candidate);\n if (surface && instanceDirty(candidate)) {\n dirty.add(surface);\n }\n }\n return [...dirty];\n }\n\n private ask(savable: boolean): Promise<CloseChoice> {\n const buttons: DialogButton[] = [\n { label: 'dialog.cancel', value: 'cancel' },\n { label: 'retention.discard', variant: 'danger', value: 'discard' },\n ];\n if (savable) {\n buttons.push({\n label: 'retention.save',\n variant: 'primary',\n value: 'save',\n });\n }\n const ref = this.dialogs.open<CloseChoice>(UnsavedChangesDialog, {\n title: 'retention.unsavedTitle',\n tone: 'warning',\n buttons,\n });\n return ref.closed.then((choice) => choice ?? 'cancel');\n }\n\n private async saveAll(dirty: readonly DirtySurface[]): Promise<boolean> {\n try {\n await Promise.all(dirty.map((surface) => surface.surfaceSave?.()));\n } catch (error) {\n console.error('Save before closing failed', error);\n this.notifications.show({\n message: 'retention.saveFailed',\n kind: 'warning',\n });\n return false;\n }\n if (this.anyDirty([...dirty])) {\n console.error('surfaceSave resolved but the surface still reports dirty');\n this.notifications.show({\n message: 'retention.stillDirty',\n kind: 'warning',\n });\n return false;\n }\n return true;\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { ChildrenOutletContexts } from '@angular/router';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { ContentReuseStrategy } from '../routing/content-reuse-strategy';\nimport { normalizePath, tabRootOf } from '../content-path';\nimport { TabCloseHooks } from './tab-close-hooks';\nimport { OpenTabsService } from './open-tabs.service';\nimport { VIEW_PANE_PREFIX, promotedContentPath } from '../../pane/tree/pane-address';\nimport { CONTENT_DOCK } from '../../pane/tree/pane-address';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { RetainedViewStash } from '../../pane/retention/retained-view-stash';\nimport {\n containerChildInstances,\n paneRetentionScope,\n} from '../../pane/retention/retention-policy';\nimport { SurfaceCloseGuard } from '../../pane/close/surface-close-guard';\n\n@Service()\nexport class TabClosingService {\n private readonly state = inject(OpenTabsService);\n\n private readonly registry = inject(ContributionRegistry);\n\n private readonly reuse = inject(ContentReuseStrategy);\n\n private readonly paneTree = inject(PaneTreeService);\n\n private readonly stash = inject(RetainedViewStash);\n\n private readonly closeGuard = inject(SurfaceCloseGuard);\n\n private readonly outletContexts = inject(ChildrenOutletContexts);\n\n private readonly closeHooks = inject(TabCloseHooks);\n\n closeOthers(path: string): void {\n const { routes, root: keep } = this.state.rootFor(path);\n const target = this.state.openTabRootedAt(routes, keep);\n const roots = new Set(\n this.state.openTabs()\n .filter(\n (tab) =>\n !tab.pinned && tab.closable && tabRootOf(routes, tab.path) !== keep,\n )\n .map((tab) => tabRootOf(routes, tab.path)),\n );\n this.closeGuard.guarded(this.closeSetCandidates(roots), () =>\n this.closeSet(roots, target?.path ?? keep),\n );\n }\n\n closeAll(): void {\n const routes = this.registry.contentRoutes();\n const roots = new Set(\n this.state.openTabs()\n .filter((tab) => !tab.pinned && tab.closable)\n .map((tab) => tabRootOf(routes, tab.path)),\n );\n const survivor = this.state.openTabs().find((tab) => tab.pinned || !tab.closable);\n this.closeGuard.guarded(this.closeSetCandidates(roots), () =>\n this.closeSet(roots, survivor?.path ?? ''),\n );\n }\n\n closeToRight(path: string): void {\n const { routes, root: keep } = this.state.rootFor(path);\n const rendered = this.state.tabs();\n const index = rendered.findIndex((tab) => tab.path === keep);\n const roots = new Set(\n rendered\n .slice(index + 1)\n .filter((tab) => tab.closable && !tab.pinned)\n .map((tab) => tab.path),\n );\n const target = this.state.openTabRootedAt(routes, keep);\n this.closeGuard.guarded(this.closeSetCandidates(roots), () =>\n this.closeSet(roots, target?.path ?? keep),\n );\n }\n\n closePrimaryPane(): void {\n const routes = this.registry.contentRoutes();\n const candidates = this.paneTree\n .primaryTabs(CONTENT_DOCK)\n .flatMap((tab) =>\n tab.path.startsWith(VIEW_PANE_PREFIX)\n ? this.urlPaneViewCandidates(tab.path)\n : this.urlPaneCandidates(tabRootOf(routes, tab.path)),\n );\n this.closeGuard.guarded(candidates, () => {\n const promoted = this.paneTree.collapsePrimary(CONTENT_DOCK);\n if (promoted !== null) {\n void this.navigateAfterClose(promoted);\n }\n });\n }\n\n close(path: string): void {\n const normalized = normalizePath(path);\n if (normalized.startsWith(VIEW_PANE_PREFIX)) {\n this.closeGuard.guarded(this.urlPaneViewCandidates(normalized), () =>\n this.closeViewTab(normalized),\n );\n return;\n }\n const { root } = this.state.rootFor(normalized);\n this.closeGuard.guarded(this.urlPaneCandidates(root), () =>\n this.closeNow(normalized),\n );\n }\n\n runCloseHook(path: string): void {\n const { routes, root } = this.state.rootFor(path);\n if (this.state.openTabs().some((tab) => tabRootOf(routes, tab.path) === root)) {\n return;\n }\n this.closeHooks.runSafely(this.closeHooks.take(root));\n }\n\n neighbourOf(path: string): string {\n const { root } = this.state.rootFor(path);\n return this.neighbourPath(root);\n }\n\n private closeNow(normalized: string): void {\n const { routes, root } = this.state.rootFor(normalized);\n const closing = this.state.openTabRootedAt(routes, root);\n const wasActive = this.state.activeTabRoot() === root;\n this.state.updateOpen((tabs) =>\n tabs.filter((tab) => tabRootOf(routes, tab.path) !== root),\n );\n this.closeHooks.runSafely(closing?.onClose);\n this.closeHooks.delete(root);\n if (wasActive) {\n void this.navigateAfterClose(this.collapseOrNeighbour(root)).finally(() =>\n this.reuse.evict(root),\n );\n } else {\n this.reuse.evict(root);\n }\n }\n\n private closeViewTab(path: string): void {\n this.paneTree.setPrimaryTabs(\n CONTENT_DOCK,\n this.paneTree\n .primaryTabs(CONTENT_DOCK)\n .filter((tab) => tab.path !== path),\n );\n }\n\n private urlPaneViewCandidates(path: string): unknown[] {\n return this.stash.instancesFor(\n paneRetentionScope(CONTENT_DOCK, this.paneTree.primaryId(CONTENT_DOCK)),\n path,\n );\n }\n\n private urlPaneCandidates(root: string): unknown[] {\n const candidates: unknown[] = [...this.urlPaneViewCandidates(root)];\n if (this.state.activeTabRoot() === root) {\n const outlet = this.outletContexts.getContext('primary')?.outlet;\n if (outlet?.isActivated) {\n candidates.push(outlet.component);\n }\n }\n const parked = this.reuse\n .parkedHandles()\n .find((handle) => handle.key === root);\n if (parked?.instance !== undefined) {\n candidates.push(parked.instance);\n }\n candidates.push(\n ...containerChildInstances(this.stash.keyedInstances(), root),\n );\n return candidates;\n }\n\n private closeSetCandidates(roots: ReadonlySet<string>): unknown[] {\n return [...roots].flatMap((root) => this.urlPaneCandidates(root));\n }\n\n private closeSet(roots: ReadonlySet<string>, fallbackPath: string): void {\n if (roots.size === 0) {\n return;\n }\n const routes = this.registry.contentRoutes();\n const closing = this.state.openTabs().filter((tab) =>\n roots.has(tabRootOf(routes, tab.path)),\n );\n const activeWentAway = roots.has(this.state.activeTabRoot());\n this.state.updateOpen((tabs) =>\n tabs.filter((tab) => !roots.has(tabRootOf(routes, tab.path))),\n );\n closing.forEach((tab) => this.closeHooks.runSafely(tab.onClose));\n roots.forEach((root) => this.closeHooks.delete(root));\n const evictAll = () => roots.forEach((root) => this.reuse.evict(root));\n if (activeWentAway) {\n void this.state.navigate(fallbackPath)\n .catch((error: unknown) =>\n console.error('Content navigation failed', error),\n )\n .finally(evictAll);\n } else {\n evictAll();\n }\n }\n\n private navigateAfterClose(target: string): Promise<void> {\n return this.state.navigate(promotedContentPath(target))\n .then(() => {\n if (target.startsWith(VIEW_PANE_PREFIX)) {\n this.state.activateViewTab(target);\n }\n })\n .catch((error: unknown) =>\n console.error('Content navigation failed', error),\n );\n }\n\n private collapseOrNeighbour(root: string): string {\n if (\n this.paneTree.primaryTabs(CONTENT_DOCK).length === 0 &&\n this.paneTree.isSplit(CONTENT_DOCK)\n ) {\n const promoted = this.paneTree.collapsePrimary(CONTENT_DOCK);\n if (promoted !== null) {\n return promoted;\n }\n }\n return this.neighbourPath(root);\n }\n\n private neighbourPath(root: string): string {\n const routes = this.registry.contentRoutes();\n const siblings = this.state.openTabs().filter(\n (tab) => tabRootOf(routes, tab.path) !== root,\n );\n return siblings.length > 0 ? siblings[siblings.length - 1].path : '';\n }\n}\n","import { inject, Service, Signal } from '@angular/core';\nimport { ActiveContent, OpenTabInput } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { ContentReuseStrategy } from '../routing/content-reuse-strategy';\nimport { SHELL_FEATURES } from '../../../foundation/shell-features';\nimport { normalizePath, tabRootOf } from '../content-path';\nimport { ContentTabView, OpenTab } from './content-tab-projection';\nimport { TabCloseHooks } from './tab-close-hooks';\nimport { QuickOpenTarget } from './quick-open-target';\nimport { OpenTabsService } from './open-tabs.service';\nimport { TabClosingService } from './tab-closing.service';\nimport { refineTabTitles, reseatPinned } from '../../pane/tree/pane-tabs';\nimport { CONTENT_DOCK } from '../../pane/tree/pane-address';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\n\n/**\n * The **URL pane's** tab state: the tabs to show (facet tabs of `follows`\n * surfaces + opened ones), and the active tab — all derived from the URL plus the open set. The open\n * set lives in the **pane tree's primary leaf**: the URL pane's tab group works like any\n * pane's, so its tabs persist and reload with the tree (R10); only the non-serialisable `onClose`\n * hooks stay session-local. A tab is identified by its **tab root**; sub-routes (`subRoutes`) live\n * under it, so switching sub-routes stays in one tab and is reflected in the URL. A **chromeless**\n * surface shows no strip.\n */\n@Service()\nexport class ContentTabsService {\n private readonly state = inject(OpenTabsService);\n\n private readonly closing = inject(TabClosingService);\n\n private readonly registry = inject(ContributionRegistry);\n\n private readonly reuse = inject(ContentReuseStrategy);\n\n private readonly features = inject(SHELL_FEATURES).content;\n\n private readonly paneTree = inject(PaneTreeService);\n\n private readonly closeHooks = inject(TabCloseHooks);\n\n /**\n * The Quick-Open source for the command palette: every currently **open** tab across\n * **all content panes** (a split's secondary panes contribute theirs too), plus every registered\n * route the user could open — one that takes no route parameter and is not `chromeless`. A route\n * the user has visited carries its session `lastActive`; an open tab wins any path collision (it\n * keeps its pinned identity). View tabs are excluded — those are reached through their rail item.\n *\n * **Access:** an unopened route is offered only when the session meets its `access` requirement. An\n * already-open tab is listed as it is — matching the tab strip, which does not re-gate content tabs\n * either, which is a deliberate open point. Client-side gating is\n * presentation, not enforcement: opening the target still passes the router's `canMatch` twin, and an\n * off-router mount re-checks the session, so a target the session no longer qualifies for renders the\n * neutral placeholder rather than its content.\n */\n readonly quickOpenTargets: Signal<readonly QuickOpenTarget[]> = this.state.quickOpenTargets;\n\n /** The active `view:` tab of the URL group, or `null` when the router drives the area (R9). */\n readonly activeViewPath: Signal<string | null> = this.state.activeViewPath;\n\n readonly activeViewInstance: Signal<string | undefined> = this.state.activeViewInstance;\n\n /** Active content path (no leading slash, no query), including the sub-route, e.g. `doc/abc/preview`. */\n readonly activePath: Signal<string> = this.state.activePath;\n\n /** The active tab root — the leading segments the active route matched (e.g. `doc/abc`). */\n readonly activeTabRoot: Signal<string> = this.state.activeTabRoot;\n\n /** The active content read a plugin reaches through `ctx.activeContent` (finding #19). */\n readonly activeContent: Signal<ActiveContent | null> = this.state.activeContent;\n\n /**\n * Whether the tab strip renders: whenever the pane holds tabs — and never while a **chromeless**\n * surface (login, onboarding) is active. That is the whole rule since groups retired:\n * a pane shows a strip when it holds tabs; a chromeless surface shows none.\n */\n readonly showStrip: Signal<boolean> = this.state.showStrip;\n\n /**\n * Everything the strip holds: the permanent facet tabs (`follows` surfaces with a computed\n * address), then the open tabs, then the view tabs. Groups retired — every open tab\n * renders, in every workspace.\n */\n readonly tabs: Signal<readonly ContentTabView[]> = this.state.tabs;\n\n /**\n * Activates a `view:` tab of the URL group (O5/E7 — a view living as a tab beside the content tabs):\n * the content area host-mounts the view; the URL stays at its last route. No-op unless the group\n * actually holds that tab.\n */\n activateViewTab(path: string): void {\n this.state.activateViewTab(path);\n }\n\n /**\n * Applies a user drag/keyboard reorder of the strip's dynamic tabs. `ids` is the new full\n * order of dynamic tab roots (pinned then unpinned — the directive keeps moves within their band).\n *\n * The order is written to the pane that holds the tabs, exactly as a reorder in any other pane is.\n * It used to be kept beside the tree under one key for the whole content dock, which meant the URL\n * pane sorted its strip by that key while every other pane rendered the tabs in the order the tree\n * held them — so the same tabs changed order as the URL role moved between panes (TreeWeaver #41).\n */\n reorder(ids: string[]): void {\n const routes = this.registry.contentRoutes();\n const rank = new Map(ids.map((id, index) => [id, index]));\n const seat = (tab: OpenTab, fallback: number) =>\n rank.get(tabRootOf(routes, tab.path)) ?? fallback;\n this.state.updateOpen((tabs) =>\n tabs\n .map((tab, index) => ({ tab, index }))\n .sort((a, b) => seat(a.tab, a.index) - seat(b.tab, b.index))\n .map((entry) => entry.tab),\n );\n }\n\n /**\n * Moves the tab rooted at `path` to the front of the strip's unpinned band (MRU). The strip does not\n * scroll: tabs that no longer fit are clipped away, reachable via the overflow\n * dropdown or the Library. Reopening such a tab front-inserts it here so it becomes visible while the\n * least-recent tabs drop off the end. No-op for a pinned (anchored) or unknown tab. It moves the tab\n * in the pane's own tab list, exactly as a drag-reorder does, so every pane shows the one\n * order; the host calls it only when the active tab is actually clipped, so tabs that already fit\n * keep their order.\n */\n bringToFront(path: string): void {\n const { routes, root } = this.state.rootFor(path);\n this.state.updateOpen((tabs) => {\n const index = tabs.findIndex(\n (tab) => tabRootOf(routes, tab.path) === root,\n );\n return index < 0 || tabs[index].pinned\n ? tabs\n : reseatPinned(tabs, index, tabs[index]);\n });\n }\n\n /**\n * Navigates the content area to a path (a full-area screen, another tab, a specific sub-route).\n *\n * If another pane already holds that tab, **that pane becomes the URL pane** and the tab is activated\n * there instead of a second copy opening beside the current one: exactly one pane carries the\n * address, and the address follows the focused pane. Without this, a workspace that parks a surface\n * in its own pane would gain a duplicate of it the moment a rail item or command navigated there, because\n * every visit opens a tab.\n *\n * Ends any view-tab selection here and marks the navigation as ours, so the URL effect — which exists\n * to end the selection on **external** moves like back/forward or a deep link — leaves alone whatever\n * the caller selects once this settles.\n *\n * **A no-op in a pop-out window**, with a dev-mode warning. A pop-out shows exactly one surface and\n * has no tab strip; navigating it would take its address out of `/popout/…`, and the window would\n * quietly stop being a pop-out — chrome-less until the next reload, and the full app after it. Same\n * reasoning as a docked surface, whose `navigate` is a no-op for want of a content area.\n */\n navigate(path: string): Promise<boolean> {\n return this.state.navigate(path);\n }\n\n /**\n * Fire-and-forget navigation: like {@link navigate}, but owns the \"navigation may fail\"\n * semantics — a rejected router navigation is logged instead of surfacing as an unhandled\n * rejection. Call sites that do not await the outcome use this.\n */\n navigateTo(path: string): void {\n this.state.navigateTo(path);\n }\n\n /**\n * Reveals a content tab **where it already lives** (Quick-Open): a tab held by another pane is\n * activated there and that pane takes the address; anything else simply navigates. Either way the tab is\n * never duplicated into the URL pane. Since {@link navigate} carries that rule, this is the name the\n * Quick-Open call site reads by — the behaviour is the same for every way of reaching a tab.\n */\n revealContentTab(navPath: string): void {\n this.navigateTo(navPath);\n }\n\n /**\n * Opens a titled dynamic tab (idempotent per tab root; re-opening restores its sub-route) and activates\n * it. With `preview` (and preview enabled) a **new** tab uses the strip's **single reused preview slot**\n *: a preview open for a *different* path replaces that slot in place (the old instance is\n * evicted + its `onClose` runs). Re-opening an **existing** tab preserves its current preview state (a\n * mere title/sub-route refinement never promotes); promotion is explicit via {@link keep}.\n */\n open(input: OpenTabInput): void {\n const routes = this.registry.contentRoutes();\n const path = normalizePath(input.path);\n const root = tabRootOf(routes, path);\n const previewSlot = (input.preview ?? false) && this.features.preview;\n const existing = this.state.openTabRootedAt(routes, root);\n this.closeHooks.set(root, input.onClose);\n if (!existing && this.refineElsewhere(root, input)) {\n return;\n }\n const stored: OpenTab = {\n path: existing?.path ?? path,\n title: input.title,\n literalTitle: input.titleIsLiteral ?? false,\n icon: input.icon,\n onClose: input.onClose,\n preview: existing ? existing.preview : previewSlot,\n pinned: existing ? existing.pinned : false,\n closable: existing ? existing.closable : true,\n };\n if (previewSlot && !existing) {\n this.replacePreviewSlot(root, stored);\n } else {\n this.state.updateOpen((tabs) =>\n existing\n ? tabs.map((tab) =>\n tabRootOf(routes, tab.path) === root ? stored : tab,\n )\n : [...tabs, stored],\n );\n }\n this.navigateTo(stored.path);\n }\n\n /**\n * Promotes the preview tab rooted at `path` to a permanent tab — the programmatic\n * \"Keep Open\" (`ctx.keepContentTab`, a double-click, or an edit). No-op if it is already permanent.\n */\n keep(path: string): void {\n const { routes, root } = this.state.rootFor(path);\n this.state.updateOpen((tabs) =>\n tabs.map((tab) =>\n tabRootOf(routes, tab.path) === root && tab.preview\n ? { ...tab, preview: false }\n : tab,\n ),\n );\n }\n\n /**\n * Pins the tab rooted at `path`: it moves to the front of the strip — after the tabs\n * already pinned — and its close control becomes an unpin control (guarding against accidental\n * close). Pinning also promotes a preview tab (a pinned tab is never transient). No-op if the tab is\n * not open.\n */\n pin(path: string): void {\n this.repin(path, true);\n }\n\n /**\n * Unpins the tab rooted at `path` — it returns to a normal, closable tab and takes the\n * first seat after the tabs still pinned. No-op otherwise.\n */\n unpin(path: string): void {\n this.repin(path, false);\n }\n\n /** Closes every dynamic tab in the strip except the target — pinned and unclosable tabs are kept. */\n closeOthers(path: string): void {\n this.closing.closeOthers(path);\n }\n\n /** Closes every dynamic tab in the strip — pinned and unclosable tabs are kept. */\n closeAll(): void {\n this.closing.closeAll();\n }\n\n /** Closes the dynamic tabs that render after the target in the strip — pinned tabs are kept. */\n closeToRight(path: string): void {\n this.closing.closeToRight(path);\n }\n\n /**\n * Closes the **primary (URL) pane** of a split — the pane-toolbar \"Close pane\" on the URL pane: the\n * primary leaf collapses, a neighbour is promoted to URL pane and navigated to. Guarded like every\n * other user-initiated close: unsaved changes in any of the primary group's tabs run\n * the host's Save · Discard · Cancel dialog first.\n */\n closePrimaryPane(): void {\n this.closing.closePrimaryPane();\n }\n\n /**\n * Closes a dynamic tab (by any path under its root). If it was active, we navigate to a neighbour\n * **first**, then evict the stored instance (keyed by the tab root — see {@link ContentReuseStrategy});\n * a background tab is evicted immediately.\n */\n close(path: string): void {\n this.closing.close(path);\n }\n\n /**\n * Runs (and clears) the close hook of the tab rooted at `path` — for a close that happens **outside**\n * the URL group (a moved tab closed in another pane). No-op while the tab is still open\n * in the URL group (its own {@link close} will run the hook).\n */\n runCloseHook(path: string): void {\n this.closing.runCloseHook(path);\n }\n\n /**\n * The URL pane's neighbour of the tab rooted at `path` — where the URL goes when that tab **leaves**\n * the pane (moved away) or closes: the last remaining sibling, else home (`''` — the\n * \"no file is open\" default).\n */\n neighbourOf(path: string): string {\n return this.closing.neighbourOf(path);\n }\n\n private repin(path: string, pinned: boolean): void {\n const { routes, root } = this.state.rootFor(path);\n this.state.updateOpen((tabs) => {\n const index = tabs.findIndex(\n (tab) => tabRootOf(routes, tab.path) === root,\n );\n if (index < 0 || tabs[index].pinned === pinned) {\n return tabs;\n }\n const updated = pinned\n ? { ...tabs[index], pinned: true, preview: false }\n : { ...tabs[index], pinned: false };\n return reseatPinned(tabs, index, updated);\n });\n }\n\n private replacePreviewSlot(root: string, slot: OpenTab): void {\n const routes = this.registry.contentRoutes();\n const previous = this.state.openTabs().find((tab) => tab.preview);\n const previousRoot = previous\n ? tabRootOf(routes, previous.path)\n : undefined;\n this.state.updateOpen((tabs) =>\n previous\n ? tabs.map((tab) =>\n tabRootOf(routes, tab.path) === previousRoot ? slot : tab,\n )\n : [...tabs, slot],\n );\n if (previousRoot !== undefined && previousRoot !== root) {\n this.reuse.evict(previousRoot);\n this.closeHooks.runSafely(previous?.onClose);\n this.closeHooks.delete(previousRoot);\n }\n }\n\n private refineElsewhere(root: string, input: OpenTabInput): boolean {\n const routes = this.registry.contentRoutes();\n const urlPane = this.paneTree.primaryId(CONTENT_DOCK);\n let foundAnywhere = false;\n for (const [dock, tree] of Object.entries(this.paneTree.dockTrees())) {\n const { node, found } = refineTabTitles(\n tree,\n (leaf) => dock === CONTENT_DOCK && leaf.id === urlPane,\n (tabPath) => tabRootOf(routes, tabPath) === root,\n {\n title: input.title,\n literalTitle: input.titleIsLiteral ?? false,\n icon: input.icon,\n },\n );\n if (found) {\n this.paneTree.commitTree(dock, node);\n foundAnywhere = true;\n }\n }\n return foundAnywhere;\n }\n}\n","import { Location } from '@angular/common';\nimport { inject, Service } from '@angular/core';\n\n@Service()\nexport class BootAddress {\n readonly path = inject(Location).path();\n}\n","import { inject, Service } from '@angular/core';\nimport { View } from '../../layout/view';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { UserOrderService } from '../reorder/user-order.service';\n\nfunction panelViewsContainerId(regionId: string): string {\n return `panel-views:${regionId}`;\n}\n\nexport interface ViewCandidate {\n readonly view: View;\n readonly here: boolean;\n}\n\n@Service()\nexport class PanelViewsService {\n private readonly registry = inject(ContributionRegistry);\n private readonly order = inject(UserOrderService);\n private readonly auth = inject(AuthContext);\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly paneTree = inject(PaneTreeService);\n\n viewsInRegion(regionId: string): View[] {\n const declared = this.registry\n .views()\n .filter((view) => view.region === regionId)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n return this.order.applyOrder(\n panelViewsContainerId(regionId),\n declared,\n (view) => view.id,\n );\n }\n\n candidatesFor(regionId: string): ViewCandidate[] {\n const panelRegions = new Set(\n this.layout.regions\n .filter((region) => region.type === 'panel')\n .map((region) => region.id),\n );\n return this.registry\n .views()\n .filter((view) => this.auth.meets(view.access))\n .map((view) => ({ view, holder: this.holderOf(view.id) }))\n .filter(\n ({ view, holder }) =>\n holder === regionId ||\n (panelRegions.has(view.region) &&\n (holder === null || !panelRegions.has(holder))),\n )\n .map(({ view, holder }) => ({ view, here: holder === regionId }))\n .sort(\n (a, b) =>\n Number(b.here) - Number(a.here) ||\n (a.view.order ?? 0) - (b.view.order ?? 0),\n );\n }\n\n private holderOf(viewId: string): string | null {\n return this.paneTree.sourceOf(VIEW_PANE_PREFIX + viewId)?.dock ?? null;\n }\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\nimport { ActiveWorkspaceService } from '../../workspace/active-workspace.service';\n\nconst STORAGE_KEY = 'lw.shell.hidden-views';\n\nexport function parseHiddenViews(raw: string | undefined): ReadonlySet<string> {\n if (!raw) {\n return new Set();\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return new Set();\n }\n return new Set(parsed.filter((id): id is string => typeof id === 'string'));\n } catch {\n return new Set();\n }\n}\n\n@Service()\nexport class HiddenViewsService {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly workspace = inject(ActiveWorkspaceService);\n private readonly ids = signal<ReadonlySet<string>>(\n parseHiddenViews(this.store.peek?.(this.workspace.scopedKey(STORAGE_KEY))),\n );\n readonly hidden = this.ids.asReadonly();\n\n constructor() {\n void this.workspace.ready.then(() =>\n hydrateAsync(this.store, this.storageKey(), (raw) =>\n this.ids.set(parseHiddenViews(raw)),\n ),\n );\n }\n\n isHidden(viewId: string): boolean {\n return this.ids().has(viewId);\n }\n\n hide(viewId: string): void {\n if (this.ids().has(viewId)) {\n return;\n }\n this.commit(new Set([...this.ids(), viewId]));\n }\n\n show(viewId: string): void {\n if (!this.ids().has(viewId)) {\n return;\n }\n const next = new Set(this.ids());\n next.delete(viewId);\n this.commit(next);\n }\n\n hydrate(raw: string | undefined): void {\n this.ids.set(parseHiddenViews(raw));\n void this.store.set(this.storageKey(), this.serialize());\n }\n\n serialize(): string {\n return JSON.stringify([...this.ids()].sort());\n }\n\n private commit(next: ReadonlySet<string>): void {\n this.ids.set(next);\n void this.store.set(this.storageKey(), this.serialize());\n }\n\n private storageKey(): string {\n return this.workspace.scopedKey(STORAGE_KEY);\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { VIEW_PANE_PREFIX, viewForPanePath } from '../pane/tree/pane-address';\nimport { PaneTab } from '../pane/tree/pane-node';\nimport { findLeaf } from '../pane/tree/pane-queries';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { PanelViewsService } from './panel-views.service';\nimport { HiddenViewsService } from './hidden-views.service';\n\n@Service()\nexport class PanelGroupService {\n private readonly paneTree = inject(PaneTreeService);\n private readonly registry = inject(ContributionRegistry);\n private readonly auth = inject(AuthContext);\n private readonly panelViews = inject(PanelViewsService);\n private readonly hiddenViews = inject(HiddenViewsService);\n\n tabs(regionId: string): readonly PaneTab[] {\n return this.paneTree\n .primaryTabs(regionId)\n .filter((tab) => this.displayable(tab));\n }\n\n activePath(regionId: string): string | undefined {\n const tabs = this.tabs(regionId);\n const active = findLeaf(\n this.paneTree.tree(regionId),\n this.paneTree.primaryId(regionId),\n )?.active;\n return tabs.some((tab) => tab.path === active) ? active : tabs[0]?.path;\n }\n\n activeInstance(regionId: string): string | undefined {\n const path = this.activePath(regionId);\n return this.tabs(regionId).find((tab) => tab.path === path)?.instance;\n }\n\n clearActiveInstance(regionId: string): void {\n const path = this.activePath(regionId);\n if (path !== undefined) {\n this.paneTree.clearTabInstance(\n regionId,\n this.paneTree.primaryId(regionId),\n path,\n );\n }\n }\n\n select(regionId: string, path: string): void {\n this.paneTree.setActiveTab(\n regionId,\n this.paneTree.primaryId(regionId),\n path,\n );\n }\n\n seed(regionId: string): void {\n this.pruneHidden(regionId);\n const seeded = this.seededPaths(regionId);\n const missing = seeded.filter((path) => !this.paneTree.hasTab(path));\n this.paneTree.seedPrimaryTabs(regionId, missing, seeded);\n }\n\n seededPaths(regionId: string): string[] {\n return this.declaredPaths(regionId).filter(\n (path) => !this.hiddenViews.isHidden(path.slice(VIEW_PANE_PREFIX.length)),\n );\n }\n\n declaredPaths(regionId: string): string[] {\n return this.panelViews\n .viewsInRegion(regionId)\n .map((view) => VIEW_PANE_PREFIX + view.id);\n }\n\n private pruneHidden(regionId: string): void {\n const tabs = this.paneTree.primaryTabs(regionId);\n const kept = tabs.filter((tab) => !this.hiddenViewTab(tab));\n if (kept.length !== tabs.length) {\n this.paneTree.setPrimaryTabs(regionId, kept);\n }\n }\n\n private hiddenViewTab(tab: PaneTab): boolean {\n return (\n tab.path.startsWith(VIEW_PANE_PREFIX) &&\n this.hiddenViews.isHidden(tab.path.slice(VIEW_PANE_PREFIX.length))\n );\n }\n\n private displayable(tab: PaneTab): boolean {\n if (!tab.path.startsWith(VIEW_PANE_PREFIX)) {\n return true;\n }\n const view = viewForPanePath(this.registry.views(), tab.path);\n return !!view && this.auth.meets(view.access);\n }\n}\n","import { ContentRoute } from '@loomweaver/plugin-sdk';\nimport { matchRoute, normalizePath } from '../regions/content/content-path';\nimport { VIEW_PANE_PREFIX } from '../regions/pane/tree/pane-address';\nimport { declaredTabPaths, WorkspaceDefinition } from './workspace-definition';\n\nexport interface DeclarationSurroundings {\n readonly routes: readonly ContentRoute[];\n readonly declaredPaths: (regionId: string) => readonly string[];\n}\n\nexport function declarationGaps(\n definition: WorkspaceDefinition,\n around: DeclarationSurroundings,\n): readonly string[] {\n const id = definition.id;\n return [\n ...claimGaps(definition, around.routes, id),\n ...tabGaps(definition, around.routes, id),\n ...sidebarGaps(definition, around.declaredPaths, id),\n ];\n}\n\nfunction claimGaps(\n definition: WorkspaceDefinition,\n routes: readonly ContentRoute[],\n id: string,\n): readonly string[] {\n return (definition.claims ?? [])\n .filter((pattern) => matchRoute(routes, pattern) === undefined)\n .map(\n (pattern) =>\n `Workspace \"${id}\": the claim \"${pattern}\" matches no registered surface route — no address will ever lead here through it.`,\n );\n}\n\nfunction tabGaps(\n definition: WorkspaceDefinition,\n routes: readonly ContentRoute[],\n id: string,\n): readonly string[] {\n return declaredTabPaths(definition).flatMap((path) => {\n const route = matchRoute(routes, path);\n if (\n !route ||\n (normalizePath(route.path) === '' && normalizePath(path) !== '')\n ) {\n return [\n `Workspace \"${id}\": tab path \"${path}\" matches no registered surface route — the tab renders a placeholder.`,\n ];\n }\n return route.chromeless === true\n ? [\n `Workspace \"${id}\": tab path \"${path}\" points to a chromeless surface — it never renders as a tab.`,\n ]\n : [];\n });\n}\n\nfunction sidebarGaps(\n definition: WorkspaceDefinition,\n declaredPaths: (regionId: string) => readonly string[],\n id: string,\n): readonly string[] {\n return Object.entries(definition.sidebars ?? {}).flatMap(\n ([region, visible]) => {\n const declared = declaredPaths(region).map((path) =>\n path.slice(VIEW_PANE_PREFIX.length),\n );\n return visible\n .filter((viewId) => !declared.includes(viewId))\n .map(\n (viewId) =>\n `Workspace \"${id}\": sidebar view \"${viewId}\" is not declared for region \"${region}\" — the entry has no effect.`,\n );\n },\n );\n}\n","import { PaneNode, PaneTab } from '../regions/pane/tree/pane-node';\nimport { tabWithout } from '../regions/pane/tree/pane-tabs';\nimport { normalizeDockEntry } from '../regions/pane/tree/pane-restore';\nimport {\n PRIMARY_PANE,\n VIEW_PANE_PREFIX,\n} from '../regions/pane/tree/pane-address';\nimport { parseHiddenViews } from '../regions/panel/hidden-views.service';\n\nexport type ReadState = (key: string) => string | undefined;\n\nexport interface ChangeShape {\n readonly keys: readonly string[];\n readonly hiddenViewsKey: string;\n readonly paneTreesKey: string;\n readonly declaredPaths: (dock: string) => readonly string[];\n}\n\nexport function stateDiffers(\n stored: ReadState,\n baseline: ReadState,\n shape: ChangeShape,\n): boolean {\n if (shape.keys.every((key) => stored(key) == null)) {\n return false;\n }\n return canonicalState(stored, shape) !== canonicalState(baseline, shape);\n}\n\nfunction canonicalState(read: ReadState, shape: ChangeShape): string {\n const hidden = parseHiddenViews(read(shape.hiddenViewsKey));\n return JSON.stringify(\n shape.keys.map((key) => canonicalValue(key, read(key), hidden, shape)),\n );\n}\n\nfunction canonicalValue(\n key: string,\n raw: string | undefined,\n hidden: ReadonlySet<string>,\n shape: ChangeShape,\n): string {\n if (key === shape.hiddenViewsKey) {\n return JSON.stringify([...hidden].sort());\n }\n if (key === shape.paneTreesKey) {\n return canonicalTrees(raw, hidden, shape);\n }\n return raw ?? '{}';\n}\n\nfunction canonicalTrees(\n raw: string | undefined,\n hidden: ReadonlySet<string>,\n shape: ChangeShape,\n): string {\n if (!raw) {\n return '{}';\n }\n try {\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const dock of Object.keys(parsed ?? {}).sort()) {\n const entry = normalizeDockEntry(parsed[dock]);\n if (entry === null) {\n continue;\n }\n const comparable = comparableNode(entry.node);\n if (!isSeededLeaf(comparable, seededShape(dock, hidden, shape))) {\n out[dock] = { tree: comparable, primary: entry.primary };\n }\n }\n return JSON.stringify(out);\n } catch {\n return '{}';\n }\n}\n\nfunction seededShape(\n dock: string,\n hidden: ReadonlySet<string>,\n shape: ChangeShape,\n): string[] {\n return shape\n .declaredPaths(dock)\n .filter((path) => !hidden.has(path.slice(VIEW_PANE_PREFIX.length)));\n}\n\nfunction isSeededLeaf(node: unknown, seededPaths: readonly string[]): boolean {\n if (seededPaths.length === 0) {\n return false;\n }\n const leaf = node as {\n kind?: unknown;\n id?: unknown;\n tabs?: unknown;\n active?: unknown;\n };\n if (\n leaf?.kind !== 'leaf' ||\n leaf.id !== PRIMARY_PANE ||\n !Array.isArray(leaf.tabs) ||\n leaf.tabs.length !== seededPaths.length ||\n leaf.active !== seededPaths[0]\n ) {\n return false;\n }\n return leaf.tabs.every((tab, index) => {\n const entry = tab as Record<string, unknown>;\n return (\n entry?.['path'] === seededPaths[index] && Object.keys(entry).length === 1\n );\n });\n}\n\nfunction comparableTab(tab: PaneTab): PaneTab {\n let comparable = tab;\n for (const key of ['title', 'literalTitle', 'icon'] as const) {\n if (comparable[key] !== undefined) {\n comparable = tabWithout(comparable, key);\n }\n }\n return comparable;\n}\n\nfunction comparableNode(node: PaneNode): PaneNode {\n if (node.kind === 'leaf') {\n return { ...node, tabs: node.tabs.map(comparableTab) };\n }\n return {\n ...node,\n first: comparableNode(node.first),\n second: comparableNode(node.second),\n };\n}\n","const WORD_SPLIT = /[\\s\\-_/]+/;\n\nconst LAST_RESORT_DIGITS = 9;\n\nfunction wordsOf(name: string): readonly string[] {\n return name.trim().split(WORD_SPLIT).filter(Boolean);\n}\n\nexport function baseInitials(name: string): string {\n const words = wordsOf(name);\n if (words.length > 1) {\n return ([...words[0]][0] + [...words[1]][0]).toUpperCase();\n }\n const letters = [...(words[0] ?? '')];\n if (letters.length === 0) {\n return '';\n }\n if (letters.length === 1) {\n return letters[0].toUpperCase();\n }\n return (letters[0] + letters[letters.length - 1]).toUpperCase();\n}\n\nfunction* candidatesFor(name: string): Generator<string> {\n const base = baseInitials(name);\n if (base === '') {\n return;\n }\n yield base;\n const letters = [...(wordsOf(name)[0] ?? '')];\n for (let i = 1; i < letters.length; i++) {\n yield (letters[0] + letters[i]).toUpperCase();\n }\n for (let digit = 2; digit <= LAST_RESORT_DIGITS; digit++) {\n yield letters[0].toUpperCase() + digit;\n }\n}\n\nexport function assignWorkspaceInitials(\n workspaces: readonly { readonly id: string; readonly name: string }[],\n): ReadonlyMap<string, string> {\n const taken = new Set<string>();\n const assigned = new Map<string, string>();\n for (const workspace of workspaces) {\n for (const candidate of candidatesFor(workspace.name)) {\n if (taken.has(candidate)) {\n continue;\n }\n taken.add(candidate);\n assigned.set(workspace.id, candidate);\n break;\n }\n }\n return assigned;\n}\n","import { computed, inject, isDevMode, Service, signal } from '@angular/core';\nimport { SETTINGS_STORE } from '../persistence/settings-store';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { ContentTabsService } from '../regions/content/tabs/content-tabs.service';\nimport { CONTENT_DOCK } from '../regions/pane/tree/pane-address';\nimport { PaneTreeService } from '../regions/pane/tree/pane-tree.service';\nimport { VIEW_PANE_PREFIX } from '../regions/pane/tree/pane-address';\nimport { activeTab } from '../regions/pane/tree/pane-node';\nimport { findLeaf } from '../regions/pane/tree/pane-queries';\nimport { SHELL_LAYOUT } from '../layout/layout';\nimport { ContributionRegistry } from '../plugin/contribution-registry';\nimport { BootAddress } from '../regions/content/routing/boot-address';\nimport { isHomePath } from '../regions/content/content-path';\nimport { PanelGroupService } from '../regions/panel/panel-group.service';\nimport { RetainedViewStash } from '../regions/pane/retention/retained-view-stash';\nimport { HiddenViewsService } from '../regions/panel/hidden-views.service';\nimport { hydrateAsync, readStoredValue } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\nimport {\n ActiveWorkspaceService,\n DEFAULT_WORKSPACE_ID,\n workspaceScopedKey,\n} from './active-workspace.service';\nimport {\n WorkspaceDefinition,\n auditWorkspaceDefinitions,\n claimsOf,\n dedupedDefinitions,\n workspaceBaseline,\n} from './workspace-definition';\nimport {\n claimFor,\n settlementFor,\n withoutConflicts,\n type WorkspaceClaim,\n} from './workspace-claims';\nimport { declarationGaps } from './workspace-warnings';\nimport { stateDiffers, type ChangeShape } from './workspace-changes';\nimport { WORKSPACE_DEFINITIONS } from './provide-workspaces';\nimport { assignWorkspaceInitials } from './workspace-initials';\n\nconst STORAGE_KEY = 'lw.shell.workspaces';\n\nconst HIDDEN_VIEWS_KEY = 'lw.shell.hidden-views';\n\nconst PANE_TREES_KEY = 'lw.shell.pane-trees';\n\nconst WORKSPACE_KEYS = [HIDDEN_VIEWS_KEY, PANE_TREES_KEY] as const;\n\nexport interface Workspace {\n readonly id: string;\n readonly name: string;\n readonly baseline: Readonly<Record<string, string>>;\n readonly origin?: string;\n}\n\nfunction parse(raw: string | undefined): Workspace[] {\n if (!raw) {\n return [];\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return [];\n }\n return parsed.filter(\n (w): w is Workspace =>\n !!w &&\n typeof (w as Workspace).id === 'string' &&\n typeof (w as Workspace).name === 'string' &&\n typeof (w as Workspace).baseline === 'object',\n );\n } catch {\n return [];\n }\n}\n\n@Service()\nexport class WorkspaceService {\n private readonly store = inject(SETTINGS_STORE);\n private readonly workingState = inject(WORKING_STATE_STORE);\n private readonly active = inject(ActiveWorkspaceService);\n private readonly paneTree = inject(PaneTreeService);\n private readonly panelGroups = inject(PanelGroupService);\n private readonly stash = inject(RetainedViewStash);\n private readonly hiddenViews = inject(HiddenViewsService);\n private readonly tabs = inject(ContentTabsService);\n private readonly bootAddress = inject(BootAddress);\n private readonly sync = inject(StateSyncService);\n private readonly registry = inject(ContributionRegistry);\n private readonly panelRegions = inject(SHELL_LAYOUT)\n .regions.filter((region) => region.type === 'panel')\n .map((region) => region.id);\n private readonly definitionBatches =\n inject(WORKSPACE_DEFINITIONS, { optional: true }) ?? [];\n\n readonly definitions: readonly WorkspaceDefinition[] = dedupedDefinitions(\n this.definitionBatches.flat(),\n );\n\n private readonly list = signal<Workspace[]>(\n parse(this.store.peek?.(STORAGE_KEY)),\n );\n readonly workspaces = this.list.asReadonly();\n readonly activeId = this.active.id;\n\n readonly initials = computed(() => assignWorkspaceInitials(this.list()));\n\n private readonly keyed: Record<\n string,\n {\n hydrate: (raw: string | undefined) => void;\n serialize: () => string;\n }\n > = {\n [HIDDEN_VIEWS_KEY]: {\n hydrate: (raw) => this.hiddenViews.hydrate(raw),\n serialize: () => this.hiddenViews.serialize(),\n },\n [PANE_TREES_KEY]: {\n hydrate: (raw) => this.paneTree.hydrate(raw),\n serialize: () => this.paneTree.serialize(),\n },\n };\n\n readonly hasChanges = computed(() => {\n const baseline = this.baselineOf(this.active.id());\n return stateDiffers(\n (key) => this.keyed[key].serialize(),\n (key) => baseline[key],\n this.changeShape(),\n );\n });\n\n readonly changedIds = computed(() => {\n const ids = new Set<string>();\n const activeId = this.active.id();\n if (this.hasChanges()) {\n ids.add(activeId);\n }\n if (!this.workingState.peek) {\n return ids;\n }\n for (const workspace of [\n { id: DEFAULT_WORKSPACE_ID, baseline: {} as Record<string, string> },\n ...this.definitions.map((definition) => ({\n id: definition.id,\n baseline: this.definitionBaselineOf(definition),\n })),\n ...this.list(),\n ]) {\n if (workspace.id !== activeId && this.storedDiffers(workspace)) {\n ids.add(workspace.id);\n }\n }\n return ids;\n });\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) => this.list.set(parse(raw)));\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.list.set(parse(raw)),\n );\n if (isDevMode()) {\n for (const problem of auditWorkspaceDefinitions(\n this.definitionBatches.flat(),\n this.panelRegions,\n )) {\n console.warn(problem);\n }\n }\n void this.active.ready.then(() => this.layOutAdoptedWorkspace());\n }\n\n async saveCurrent(name: string): Promise<void> {\n const baseline = await this.currentState();\n const id = crypto.randomUUID();\n const origin = this.originOf(this.active.id());\n this.commit([\n ...this.list(),\n { id, name, baseline, ...(origin === null ? {} : { origin }) },\n ]);\n this.active.set(id);\n this.applyState(baseline);\n }\n\n async saveBaseline(): Promise<void> {\n const id = this.active.id();\n if (id === DEFAULT_WORKSPACE_ID || this.definitionOf(id) !== undefined) {\n return;\n }\n const baseline = await this.currentState();\n this.commit(this.list().map((w) => (w.id === id ? { ...w, baseline } : w)));\n }\n\n async settle(path: string): Promise<void> {\n const here = this.active.id();\n const destination = settlementFor(\n this.claims(),\n this.claimsOfWorkspace(here),\n here,\n path,\n );\n if (destination !== null) {\n await this.switchTo(destination, { keepAddress: true });\n }\n }\n\n async switchTo(\n id: string,\n options: { keepAddress?: boolean } = {},\n ): Promise<void> {\n if (id === this.active.id()) {\n return;\n }\n if (!this.exists(id)) {\n if (isDevMode()) {\n console.warn(\n `Workspace \"${id}\": no such workspace is declared or saved — the switch does nothing.`,\n );\n }\n return;\n }\n const baseline = this.baselineOf(id);\n this.active.set(id);\n const stored: Record<string, string | undefined> = {};\n for (const key of WORKSPACE_KEYS) {\n stored[key] = await readStoredValue(\n this.workingState,\n this.active.scopedKey(key),\n );\n }\n for (const key of WORKSPACE_KEYS) {\n this.keyed[key].hydrate(stored[key] ?? baseline[key]);\n }\n this.warnDeclarationGaps(id);\n if (options.keepAddress !== true) {\n this.tabs.navigateTo(this.activeContentPath());\n }\n }\n\n reset(): void {\n const id = this.active.id();\n this.applyState(this.baselineOf(id));\n this.warnDeclarationGaps(id);\n this.tabs.navigateTo(this.activeContentPath());\n }\n\n rename(id: string, name: string): void {\n if (this.definitionOf(id) !== undefined) {\n return;\n }\n this.commit(this.list().map((w) => (w.id === id ? { ...w, name } : w)));\n }\n\n remove(id: string): void {\n if (id === DEFAULT_WORKSPACE_ID || this.definitionOf(id) !== undefined) {\n return;\n }\n this.commit(this.list().filter((w) => w.id !== id));\n this.stash.evictWorkspace(id);\n for (const key of WORKSPACE_KEYS) {\n void this.workingState.delete(workspaceScopedKey(key, id));\n }\n if (id === this.active.id()) {\n void this.switchTo(DEFAULT_WORKSPACE_ID);\n }\n }\n\n originOf(id: string): string | null {\n if (this.definitionOf(id) !== undefined) {\n return id;\n }\n const origin = this.list().find((workspace) => workspace.id === id)?.origin;\n return origin !== undefined && this.definitionOf(origin) !== undefined\n ? origin\n : null;\n }\n\n claimsOfWorkspace(id: string): readonly WorkspaceClaim[] {\n const origin = this.originOf(id);\n return origin === null\n ? []\n : this.claims().filter((claim) => claim.workspaceId === origin);\n }\n\n destinationFor(path: string): string | null {\n return claimFor(this.claims(), path)?.workspaceId ?? null;\n }\n\n private claims(): readonly WorkspaceClaim[] {\n return withoutConflicts(claimsOf(this.definitions));\n }\n\n private exists(id: string): boolean {\n return (\n id === DEFAULT_WORKSPACE_ID ||\n this.definitionOf(id) !== undefined ||\n this.list().some((w) => w.id === id)\n );\n }\n\n private definitionOf(id: string): WorkspaceDefinition | undefined {\n return this.definitions.find((definition) => definition.id === id);\n }\n\n private baselineOf(id: string): Readonly<Record<string, string>> {\n const stored = this.list().find((w) => w.id === id)?.baseline;\n if (stored) {\n return stored;\n }\n const definition = this.definitionOf(id);\n return definition ? this.definitionBaselineOf(definition) : {};\n }\n\n private definitionBaselineOf(\n definition: WorkspaceDefinition,\n ): Record<string, string> {\n const state = workspaceBaseline(definition, {\n panelRegions: this.panelRegions,\n declaredPaths: (region) => this.panelGroups.declaredPaths(region),\n });\n return {\n ...(state.hiddenViews === undefined\n ? {}\n : { [HIDDEN_VIEWS_KEY]: state.hiddenViews }),\n ...(state.trees === undefined ? {} : { [PANE_TREES_KEY]: state.trees }),\n };\n }\n\n private warnDeclarationGaps(id: string): void {\n const definition = this.definitionOf(id);\n if (!isDevMode() || definition === undefined) {\n return;\n }\n for (const gap of declarationGaps(definition, {\n routes: this.registry.contentRoutes(),\n declaredPaths: (region) => this.panelGroups.declaredPaths(region),\n })) {\n console.warn(gap);\n }\n }\n\n private storedDiffers(workspace: {\n id: string;\n baseline: Readonly<Record<string, string>>;\n }): boolean {\n return stateDiffers(\n (key) => this.workingState.peek?.(workspaceScopedKey(key, workspace.id)),\n (key) => workspace.baseline[key],\n this.changeShape(),\n );\n }\n\n private changeShape(): ChangeShape {\n return {\n keys: WORKSPACE_KEYS,\n hiddenViewsKey: HIDDEN_VIEWS_KEY,\n paneTreesKey: PANE_TREES_KEY,\n declaredPaths: (dock) => this.panelGroups.declaredPaths(dock),\n };\n }\n\n private async currentState(): Promise<Record<string, string>> {\n const state: Record<string, string> = {};\n for (const key of WORKSPACE_KEYS) {\n const raw = await readStoredValue(\n this.workingState,\n this.active.scopedKey(key),\n );\n if (raw != null) {\n state[key] = raw;\n }\n }\n return state;\n }\n\n private layOutAdoptedWorkspace(): void {\n const id = this.active.takeAdoption();\n if (id === null) {\n return;\n }\n this.applyState(this.baselineOf(id));\n this.warnDeclarationGaps(id);\n if (isHomePath(this.bootAddress.path)) {\n this.tabs.navigateTo(this.activeContentPath());\n }\n }\n\n private applyState(state: Readonly<Record<string, string>>): void {\n for (const key of WORKSPACE_KEYS) {\n this.keyed[key].hydrate(state[key]);\n }\n }\n\n private activeContentPath(): string {\n const primary = findLeaf(\n this.paneTree.tree(CONTENT_DOCK),\n this.paneTree.primaryId(CONTENT_DOCK),\n );\n const path = primary ? activeTab(primary)?.path : undefined;\n if (!path || path.startsWith(VIEW_PANE_PREFIX)) {\n return '';\n }\n return path;\n }\n\n private commit(next: Workspace[]): void {\n this.list.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify(next));\n }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDropList,\n moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { LayoutRegion, SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { CommandService } from '../../commands/command.service';\nimport { AuthContext } from '../../auth/auth-context';\nimport { RailItem } from '../../foundation/rail-item';\nimport { ContextMenuDirective } from '../../menu/context-menu.directive';\nimport { RAIL_CONTEXT_MENU, RAIL_ITEM_CONTEXT_MENU } from './rail-context-menu';\nimport { RailItemsService } from './rail-items.service';\nimport { RailMoveService } from './rail-move.service';\nimport { Reorderable } from '../reorder/reorderable.directive';\nimport { UserOrderService } from '../reorder/user-order.service';\nimport { SHELL_FEATURES } from '../../foundation/shell-features';\nimport { ActiveWorkspaceService } from '../../workspace/active-workspace.service';\nimport { WorkspaceService } from '../../workspace/workspace.service';\n\n@Component({\n selector: 'lw-shell-rail',\n imports: [\n TranslocoPipe,\n Reorderable,\n CdkDropList,\n CdkDrag,\n ContextMenuDirective,\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './shell-rail.html',\n})\nexport class ShellRail {\n readonly region = input.required<LayoutRegion>();\n\n private readonly registry = inject(ContributionRegistry);\n private readonly commands = inject(CommandService);\n private readonly auth = inject(AuthContext);\n private readonly userOrder = inject(UserOrderService);\n private readonly features = inject(SHELL_FEATURES).rail;\n private readonly activeWorkspace = inject(ActiveWorkspaceService);\n private readonly railItems = inject(RailItemsService);\n private readonly railMove = inject(RailMoveService);\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly workspaces = inject(WorkspaceService);\n\n protected readonly railMenu = this.features.curate ? [RAIL_CONTEXT_MENU] : [];\n\n protected readonly containerId = computed(() => `rail:${this.region().id}`);\n protected readonly dropListId = computed(\n () => `rail-items-${this.region().id}`,\n );\n protected readonly connectedRails = computed(() =>\n this.layout.regions\n .filter(\n (region) => region.type === 'rail' && region.id !== this.region().id,\n )\n .map((region) => `rail-items-${region.id}`),\n );\n protected readonly labelKey = computed(() =>\n this.region().dock === 'right' ? 'rail.labelRight' : 'rail.label',\n );\n protected readonly reorderable = this.features.reorder;\n\n protected readonly draggable =\n this.features.reorder || this.features.moveItems;\n\n private readonly registered = computed(() =>\n this.registry\n .railItems()\n .filter(\n (item) =>\n this.railItems.regionOf(item.id, item.rail) === this.region().id,\n )\n .filter((item) => this.auth.visible(item.access))\n .filter(\n (item) =>\n item.workspace !== undefined || this.commands.triggerable(item),\n )\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\n );\n\n protected readonly items = computed(() => {\n const inRail = this.registered().filter((item) =>\n this.railItems.isVisible(item.id),\n );\n const isBottom = (item: RailItem) => item.anchor === 'bottom';\n const id = this.containerId();\n const key = (item: RailItem) => item.id;\n const top = this.userOrder.applyOrder(\n id,\n inRail.filter((item) => !isBottom(item)),\n key,\n );\n const bottom = this.userOrder.applyOrder(id, inRail.filter(isBottom), key);\n return [...top, ...bottom];\n });\n\n protected readonly firstBottomId = computed(\n () => this.items().find((item) => item.anchor === 'bottom')?.id,\n );\n\n protected readonly enterPredicate = (\n _drag: CdkDrag<string>,\n list: CdkDropList,\n ): boolean =>\n list.id === this.dropListId() ? this.reorderable : this.features.moveItems;\n\n protected disabled(item: RailItem): boolean {\n return this.auth.disabled(item.access);\n }\n\n protected menusFor(item: RailItem): readonly string[] {\n return item.menu\n ? [RAIL_ITEM_CONTEXT_MENU, item.menu]\n : [RAIL_ITEM_CONTEXT_MENU];\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const dock = this.dockForChord(event);\n if (dock === null) {\n return;\n }\n const itemId = (event.target as HTMLElement | null)?.closest<HTMLElement>(\n '[data-rail-item]',\n )?.dataset['railItem'];\n const target = this.railMove.railOn(dock, this.region().id);\n if (!itemId || !target) {\n return;\n }\n event.preventDefault();\n this.railMove.move(itemId, target);\n }\n\n protected current(item: RailItem): boolean {\n return (\n item.workspace !== undefined &&\n item.workspace === this.activeWorkspace.id()\n );\n }\n\n protected run(item: RailItem): void {\n if (this.disabled(item)) return;\n const workspace = item.workspace;\n if (workspace !== undefined) {\n void this.workspaces.switchTo(workspace);\n return;\n }\n this.commands.trigger(item);\n }\n\n protected onReorder(ids: string[]): void {\n this.userOrder.setOrder(this.containerId(), ids);\n }\n\n protected onDrop(event: CdkDragDrop<unknown>): void {\n if (event.previousContainer !== event.container) {\n this.railMove.move(String(event.item.data), this.region().id);\n return;\n }\n const items = [...this.items()];\n moveItemInArray(items, event.previousIndex, event.currentIndex);\n this.onReorder(items.map((item) => item.id));\n }\n\n protected readonly sortPredicate = (\n index: number,\n drag: CdkDrag<string>,\n ): boolean => {\n const items = this.items();\n const dragged = items.find((item) => item.id === drag.data);\n const target = items[index];\n return (\n !!dragged &&\n !!target &&\n (dragged.anchor ?? 'top') === (target.anchor ?? 'top')\n );\n };\n\n private dockForChord(event: KeyboardEvent): 'left' | 'right' | null {\n if (!this.features.moveItems || !event.altKey || !event.shiftKey) {\n return null;\n }\n if (event.key === 'ArrowRight') {\n return 'right';\n }\n return event.key === 'ArrowLeft' ? 'left' : null;\n }\n}\n","<nav\n class=\"flex h-full w-10 shrink-0 flex-col items-center gap-1 bg-surface py-2\"\n [attr.aria-label]=\"labelKey() | transloco\"\n cdkDropList\n cdkDropListOrientation=\"vertical\"\n [id]=\"dropListId()\"\n [cdkDropListConnectedTo]=\"connectedRails()\"\n [cdkDropListDisabled]=\"!draggable\"\n [cdkDropListSortingDisabled]=\"!reorderable\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [cdkDropListSortPredicate]=\"sortPredicate\"\n (cdkDropListDropped)=\"onDrop($event)\"\n [lwReorderable]=\"containerId()\"\n [lwReorderableEnabled]=\"reorderable\"\n (reorder)=\"onReorder($event)\"\n [lwContextMenu]=\"railMenu\"\n>\n @for (item of items(); track item.id) {\n <button\n type=\"button\"\n cdkDrag\n [cdkDragData]=\"item.id\"\n [cdkDragDisabled]=\"!draggable\"\n [disabled]=\"disabled(item)\"\n (click)=\"run(item)\"\n (keydown)=\"onKeydown($event)\"\n [lwContextMenu]=\"menusFor(item)\"\n [lwContextMenuContext]=\"{ targetKind: 'rail-item', id: item.id, region: region().id }\"\n [attr.aria-label]=\"item.title | transloco\"\n [attr.aria-current]=\"current(item) ? 'true' : null\"\n [attr.data-rail-item]=\"item.id\"\n [attr.data-reorder-id]=\"reorderable ? item.id : null\"\n [attr.data-reorder-band]=\"item.anchor ?? 'top'\"\n [class.mt-auto]=\"item.id === firstBottomId()\"\n [class.text-content]=\"current(item)\"\n [class.bg-surface-overlay]=\"current(item)\"\n class=\"relative flex h-9 w-9 items-center justify-center rounded-lg text-content-faint transition-colors hover:bg-surface-overlay hover:text-content disabled:pointer-events-none disabled:opacity-40\"\n >\n @if (current(item)) {\n <span\n aria-hidden=\"true\"\n class=\"absolute inset-y-1 w-0.5 rounded-full bg-brand\"\n [class.left-0]=\"region().dock !== 'right'\"\n [class.right-0]=\"region().dock === 'right'\"\n ></span>\n }\n @if (item.initials) {\n <span\n aria-hidden=\"true\"\n data-testid=\"rail-initials\"\n class=\"lw-rail-initials\"\n >{{ item.initials }}</span\n >\n } @else {\n <lw-icon [name]=\"item.icon\" size=\"1rem\" />\n }\n <lw-tooltip [text]=\"item.title | transloco\" [position]=\"region().dock === 'right' ? 'left' : 'right'\" />\n </button>\n }\n</nav>\n","import { inject, Service, signal, WritableSignal } from '@angular/core';\nimport { ViewState } from '@loomweaver/plugin-sdk';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { hydrateAsync } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\n\nconst STORAGE_PREFIX = 'lw.shell.view-state:';\nconst SAVE_DEBOUNCE_MS = 400;\n\nfunction parseBlob(raw: string | undefined): unknown {\n if (!raw) {\n return undefined;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\ninterface Entry {\n readonly value: WritableSignal<unknown>;\n save(): void;\n cancelPendingSave(): void;\n}\n\n@Service()\nexport class ViewStateService {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly sync = inject(StateSyncService);\n private readonly entries = new Map<string, Entry>();\n\n constructor() {\n this.sync.registerPrefix('working-state', STORAGE_PREFIX, (raw, key) => {\n const entry = this.entries.get(key.slice(STORAGE_PREFIX.length));\n if (!entry) {\n return;\n }\n entry.cancelPendingSave();\n entry.value.set(parseBlob(raw));\n });\n }\n\n clear(instanceId: string): void {\n this.entries.get(instanceId)?.cancelPendingSave();\n this.entries.delete(instanceId);\n void this.store.delete(STORAGE_PREFIX + instanceId);\n }\n\n reset(instanceId: string): void {\n const entry = this.entries.get(instanceId);\n entry?.cancelPendingSave();\n entry?.value.set(undefined);\n void this.store.delete(STORAGE_PREFIX + instanceId);\n }\n\n handle(instanceId: string): ViewState {\n const entry = this.entryFor(instanceId);\n return {\n instanceId,\n value: () => entry.value(),\n set: (next) => {\n entry.value.set(next);\n entry.save();\n },\n };\n }\n\n private entryFor(instanceId: string): Entry {\n const existing = this.entries.get(instanceId);\n if (existing) {\n return existing;\n }\n const key = STORAGE_PREFIX + instanceId;\n const value = signal<unknown>(parseBlob(this.store.peek?.(key)));\n hydrateAsync(this.store, key, (raw) => value.set(parseBlob(raw)));\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cancelPendingSave = () => {\n if (timer !== undefined) {\n clearTimeout(timer);\n timer = undefined;\n }\n };\n const save = () => {\n cancelPendingSave();\n timer = setTimeout(() => {\n timer = undefined;\n const current = value();\n if (current !== undefined) {\n void this.store.set(key, JSON.stringify(current));\n }\n }, SAVE_DEBOUNCE_MS);\n };\n const entry: Entry = { value, save, cancelPendingSave };\n this.entries.set(instanceId, entry);\n return entry;\n }\n}\n","import { computed, inject, Service, signal, Signal, WritableSignal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { ViewStateService } from './view-state.service';\nimport { hydrateAsync } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\n\nconst STORAGE_PREFIX = 'lw.shell.view-instances:';\n\nexport interface ViewInstance {\n readonly id: string;\n readonly name: string;\n}\n\ninterface InstanceRecord {\n readonly instances: readonly ViewInstance[];\n readonly activeId: string;\n}\n\nfunction defaultRecord(viewId: string): InstanceRecord {\n return { instances: [{ id: viewId, name: '' }], activeId: viewId };\n}\n\nfunction parseRecord(viewId: string, raw: string | undefined): InstanceRecord {\n if (!raw) {\n return defaultRecord(viewId);\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object') {\n return defaultRecord(viewId);\n }\n const record = parsed as Partial<InstanceRecord>;\n const instances = Array.isArray(record.instances)\n ? record.instances.filter(\n (i): i is ViewInstance =>\n !!i && typeof i.id === 'string' && typeof i.name === 'string',\n )\n : [];\n const withoutDefault = instances.filter((i) => i.id !== viewId);\n const merged = [{ id: viewId, name: '' }, ...withoutDefault];\n const activeId =\n typeof record.activeId === 'string' &&\n merged.some((i) => i.id === record.activeId)\n ? record.activeId\n : viewId;\n return { instances: merged, activeId };\n } catch {\n return defaultRecord(viewId);\n }\n}\n\n@Service()\nexport class ViewInstanceService {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly viewStates = inject(ViewStateService);\n private readonly sync = inject(StateSyncService);\n private readonly records = new Map<string, WritableSignal<InstanceRecord>>();\n private readonly instancesSignals = new Map<\n string,\n Signal<readonly ViewInstance[]>\n >();\n private readonly activeIdSignals = new Map<string, Signal<string>>();\n\n constructor() {\n this.sync.registerPrefix('working-state', STORAGE_PREFIX, (raw, key) => {\n const viewId = key.slice(STORAGE_PREFIX.length);\n this.records.get(viewId)?.set(parseRecord(viewId, raw));\n });\n }\n\n instances(viewId: string): Signal<readonly ViewInstance[]> {\n return this.derived(\n this.instancesSignals,\n viewId,\n (record) => record.instances,\n );\n }\n\n activeId(viewId: string): Signal<string> {\n return this.derived(\n this.activeIdSignals,\n viewId,\n (record) => record.activeId,\n );\n }\n\n isDefault(viewId: string, instanceId: string): boolean {\n return instanceId === viewId;\n }\n\n setActive(viewId: string, instanceId: string): void {\n const record = this.recordFor(viewId);\n if (record().instances.some((i) => i.id === instanceId)) {\n this.commit(viewId, { ...record(), activeId: instanceId });\n }\n }\n\n create(viewId: string, name: string): void {\n const id = crypto.randomUUID();\n const record = this.recordFor(viewId);\n this.commit(viewId, {\n instances: [...record().instances, { id, name }],\n activeId: id,\n });\n }\n\n rename(viewId: string, instanceId: string, name: string): void {\n if (this.isDefault(viewId, instanceId)) {\n return;\n }\n const record = this.recordFor(viewId);\n this.commit(viewId, {\n ...record(),\n instances: record().instances.map((i) =>\n i.id === instanceId ? { ...i, name } : i,\n ),\n });\n }\n\n remove(viewId: string, instanceId: string): void {\n if (this.isDefault(viewId, instanceId)) {\n return;\n }\n const record = this.recordFor(viewId);\n const instances = record().instances.filter((i) => i.id !== instanceId);\n const activeId =\n record().activeId === instanceId ? viewId : record().activeId;\n this.commit(viewId, { instances, activeId });\n this.viewStates.clear(instanceId);\n }\n\n reset(viewId: string): void {\n for (const instance of this.recordFor(viewId)().instances) {\n if (this.isDefault(viewId, instance.id)) {\n this.viewStates.reset(instance.id);\n } else {\n this.viewStates.clear(instance.id);\n }\n }\n this.recordFor(viewId).set(defaultRecord(viewId));\n void this.store.delete(STORAGE_PREFIX + viewId);\n }\n\n private derived<T>(\n cache: Map<string, Signal<T>>,\n viewId: string,\n select: (record: InstanceRecord) => T,\n ): Signal<T> {\n const existing = cache.get(viewId);\n if (existing) {\n return existing;\n }\n const record = this.recordFor(viewId);\n const derived = computed(() => select(record()));\n cache.set(viewId, derived);\n return derived;\n }\n\n private recordFor(viewId: string): WritableSignal<InstanceRecord> {\n const existing = this.records.get(viewId);\n if (existing) {\n return existing;\n }\n const key = STORAGE_PREFIX + viewId;\n const record = signal<InstanceRecord>(\n parseRecord(viewId, this.store.peek?.(key)),\n );\n hydrateAsync(this.store, key, (raw) =>\n record.set(parseRecord(viewId, raw)),\n );\n this.records.set(viewId, record);\n return record;\n }\n\n private commit(viewId: string, next: InstanceRecord): void {\n this.recordFor(viewId).set(next);\n void this.store.set(STORAGE_PREFIX + viewId, JSON.stringify(next));\n }\n}\n","import { EnvironmentInjector, inject, Injector, Service } from '@angular/core';\nimport { VIEW_STATE } from '@loomweaver/plugin-sdk';\nimport { View } from '../layout/view';\nimport { ViewStateService } from './view-state.service';\nimport { ViewInstanceService } from './view-instance.service';\n\n@Service()\nexport class ViewMountService {\n private readonly env = inject(EnvironmentInjector);\n private readonly viewStates = inject(ViewStateService);\n private readonly viewInstances = inject(ViewInstanceService);\n private readonly injectors = new Map<string, Injector>();\n\n injectorFor(view: View): Injector {\n return this.injectorForInstance(this.instanceIdFor(view));\n }\n\n instanceIdFor(view: View): string {\n return view.instanceable ? this.viewInstances.activeId(view.id)() : view.id;\n }\n\n injectorForInstance(instanceId: string): Injector {\n let injector = this.injectors.get(instanceId);\n if (!injector) {\n injector = Injector.create({\n parent: this.env,\n providers: [\n { provide: VIEW_STATE, useValue: this.viewStates.handle(instanceId) },\n ],\n });\n this.injectors.set(instanceId, injector);\n }\n return injector;\n }\n}\n","import { Service, signal, Type, WritableSignal } from '@angular/core';\n\nexport interface LazyComponentSource {\n readonly component?: Type<unknown>;\n readonly loadComponent?: () => Promise<Type<unknown>>;\n}\n\n@Service()\nexport class ComponentLoader {\n private readonly pending = new Map<\n () => Promise<Type<unknown>>,\n WritableSignal<Type<unknown> | null>\n >();\n\n resolve(source: LazyComponentSource): Type<unknown> | null {\n if (source.component) {\n return source.component;\n }\n const loader = source.loadComponent;\n if (!loader) {\n return null;\n }\n const known = this.pending.get(loader);\n if (known) {\n return known();\n }\n const resolved = signal<Type<unknown> | null>(null);\n this.pending.set(loader, resolved);\n void loader().then(\n (component) => resolved.set(component),\n (error: unknown) => console.error('[loom] surface failed to load', error),\n );\n return resolved();\n }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input, output } from '@angular/core';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { View } from '../layout/view';\nimport { DialogService } from '../dialog/dialog.service';\nimport {\n MENU_ANCHOR_GAP,\n MenuListEntry,\n MenuService,\n} from '../menu/menu.service';\nimport { ViewInstance, ViewInstanceService } from './view-instance.service';\n\n@Component({\n selector: 'lw-view-instance-switcher',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n host: { class: 'flex min-w-0 flex-1' },\n templateUrl: './view-instance-switcher.html',\n})\nexport class ViewInstanceSwitcher {\n readonly view = input.required<View>();\n\n readonly beforeSwitch = output<void>();\n\n private readonly viewInstances = inject(ViewInstanceService);\n\n private readonly menu = inject(MenuService);\n\n private readonly dialogs = inject(DialogService);\n\n private readonly transloco = inject(TranslocoService);\n\n protected readonly activeName = computed(() => {\n const viewId = this.view().id;\n const activeId = this.viewInstances.activeId(viewId)();\n if (this.viewInstances.isDefault(viewId, activeId)) {\n return '';\n }\n return (\n this.viewInstances\n .instances(viewId)()\n .find((instance) => instance.id === activeId)?.name ?? ''\n );\n });\n\n protected openSwitcher(event: MouseEvent): void {\n const viewId = this.view().id;\n const activeId = this.viewInstances.activeId(viewId)();\n const t = (key: string) => this.transloco.translate(key);\n const entries: MenuListEntry[] = this.viewInstances\n .instances(viewId)()\n .map((instance) => ({\n key: `switch:${instance.id}`,\n label: this.viewInstances.isDefault(viewId, instance.id)\n ? t('viewInstance.default')\n : instance.name,\n active: instance.id === activeId,\n }));\n entries.push({ key: 'new', label: t('viewInstance.new'), icon: 'add' });\n if (!this.viewInstances.isDefault(viewId, activeId)) {\n entries.push(\n { key: 'rename', label: t('viewInstance.rename') },\n { key: 'delete', label: t('viewInstance.delete') },\n );\n }\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n this.menu.openList(\n entries,\n { x: rect.left, y: rect.bottom + MENU_ANCHOR_GAP },\n (key) => this.onPick(key),\n );\n }\n\n private onPick(key: string): void {\n const viewId = this.view().id;\n if (key.startsWith('switch:')) {\n this.switchTo(viewId, key.slice('switch:'.length));\n return;\n }\n if (key === 'new') {\n this.createInstance(viewId);\n return;\n }\n if (key === 'rename') {\n this.renameActiveInstance(viewId);\n return;\n }\n if (key === 'delete') {\n this.deleteActiveInstance(viewId);\n }\n }\n\n private switchTo(viewId: string, instanceId: string): void {\n this.beforeSwitch.emit();\n this.viewInstances.setActive(viewId, instanceId);\n }\n\n private createInstance(viewId: string): void {\n void this.dialogs\n .prompt({\n title: this.transloco.translate('viewInstance.newTitle'),\n message: '',\n placeholder: this.transloco.translate('viewInstance.namePlaceholder'),\n })\n .then((name) => {\n if (!name?.trim()) {\n return;\n }\n this.beforeSwitch.emit();\n this.viewInstances.create(viewId, name.trim());\n });\n }\n\n private renameActiveInstance(viewId: string): void {\n const { activeId, active } = this.activeInstance(viewId);\n void this.dialogs\n .prompt({\n title: this.transloco.translate('viewInstance.renameTitle'),\n message: '',\n initial: active?.name ?? '',\n placeholder: this.transloco.translate('viewInstance.namePlaceholder'),\n })\n .then(\n (name) =>\n name?.trim() &&\n this.viewInstances.rename(viewId, activeId, name.trim()),\n );\n }\n\n private deleteActiveInstance(viewId: string): void {\n const { activeId, active } = this.activeInstance(viewId);\n void this.dialogs\n .confirm({\n title: this.transloco.translate('viewInstance.delete'),\n message: this.transloco.translate('viewInstance.deleteConfirm', {\n name: active?.name ?? '',\n }),\n tone: 'danger',\n })\n .then((ok) => ok && this.viewInstances.remove(viewId, activeId));\n }\n\n private activeInstance(viewId: string): {\n activeId: string;\n active: ViewInstance | undefined;\n } {\n const activeId = this.viewInstances.activeId(viewId)();\n return {\n activeId,\n active: this.viewInstances\n .instances(viewId)()\n .find((instance) => instance.id === activeId),\n };\n }\n}\n","<button\n type=\"button\"\n class=\"flex min-w-0 flex-1 items-center gap-1 truncate rounded px-1 py-0.5 text-left text-xs font-semibold tracking-wide text-content-faint uppercase transition-colors hover:bg-surface-overlay hover:text-content\"\n (click)=\"openSwitcher($event)\"\n [attr.aria-label]=\"'viewInstance.switcher' | transloco\"\n data-testid=\"view-switcher\"\n>\n <span class=\"truncate\">{{ activeName() || ('viewInstance.default' | transloco) }}</span>\n <lw-icon name=\"chevronDown\" size=\"0.85rem\" class=\"shrink-0\" />\n</button>\n","import { Service, signal } from '@angular/core';\n\n@Service()\nexport class PaneChromeService {\n private readonly max = signal<{ dock: string; paneId: string } | null>(null);\n private readonly min = signal<ReadonlySet<string>>(new Set());\n\n isMaximized(dock: string, paneId: string): boolean {\n const current = this.max();\n return (\n current !== null && current.dock === dock && current.paneId === paneId\n );\n }\n\n maximizedPaneIn(dock: string): string | null {\n const current = this.max();\n return current?.dock === dock ? current.paneId : null;\n }\n\n toggleMaximize(dock: string, paneId: string): void {\n this.max.update((current) =>\n this.isMaximized(dock, paneId) && current ? null : { dock, paneId },\n );\n }\n\n restore(): void {\n this.max.set(null);\n }\n\n isMinimized(dock: string, paneId: string): boolean {\n return this.min().has(key(dock, paneId));\n }\n\n toggleMinimize(dock: string, paneId: string): void {\n this.min.update((current) => {\n const next = new Set(current);\n const id = key(dock, paneId);\n if (!next.delete(id)) {\n next.add(id);\n }\n return next;\n });\n }\n\n clearMinimized(dock: string): void {\n const prefix = `${dock}:`;\n const current = this.min();\n if (![...current].some((id) => id.startsWith(prefix))) {\n return;\n }\n this.min.set(new Set([...current].filter((id) => !id.startsWith(prefix))));\n }\n}\n\nfunction key(dock: string, paneId: string): string {\n return `${dock}:${paneId}`;\n}\n","import { InjectionToken, Type } from '@angular/core';\nimport { ContainerSpec, ContainerTabLabel } from '@loomweaver/plugin-sdk';\n\nexport interface ContainerContext {\n readonly params: Record<string, string>;\n readonly spec: ContainerSpec | undefined;\n readonly open: (segmentPath: string, label?: ContainerTabLabel) => void;\n}\n\nexport const CONTAINER_CONTEXT = new InjectionToken<ContainerContext | null>(\n 'lw.container-context',\n { factory: () => null },\n);\n\nexport const CONTAINER_PANE_HOST = new InjectionToken<Type<unknown>>(\n 'lw.container-pane-host',\n);\n","import { ContainerSpec, ContainerTabEntry } from '@loomweaver/plugin-sdk';\nimport {\n containerChildOf,\n containerChildPath,\n containerPathOfDock,\n isAddressable,\n} from './container-children';\nimport { BakedTab, PaneAreaTree, paneAreaTree } from '../tree/pane-area-tree';\nimport { VIEW_PANE_PREFIX } from '../tree/pane-address';\nimport { PaneTab } from '../tree/pane-node';\n\nexport function containerLayout(\n dock: string,\n spec: ContainerSpec | undefined,\n problems: string[],\n context: string,\n): PaneAreaTree {\n const initial = spec?.initial;\n if (initial === undefined) {\n return { node: null, tabs: [] };\n }\n const area = Array.isArray(initial)\n ? { tabs: initial as readonly ContainerTabEntry[] }\n : (initial as Exclude<\n ContainerSpec['initial'],\n readonly string[] | undefined\n >);\n return paneAreaTree(\n area,\n {\n context,\n idPrefix: 'container',\n allowEmpty: true,\n bake: (entry, found) => bakeChild(dock, spec, entry, found, context),\n },\n problems,\n );\n}\n\nexport function containerChildTab(\n dock: string,\n spec: ContainerSpec | undefined,\n childId: string,\n segmentPath?: string,\n): PaneTab {\n const declared = containerChildOf(spec, childId);\n const address =\n segmentPath ??\n (isAddressable(declared?.segment) ? declared?.segment : undefined);\n if (address === undefined) {\n return {\n path: VIEW_PANE_PREFIX + childId,\n instance: `${dock}::${childId}`,\n };\n }\n const path = containerChildPath(containerPathOfDock(dock), address);\n return { path, instance: `${dock}::${path}` };\n}\n\nfunction bakeChild(\n dock: string,\n spec: ContainerSpec | undefined,\n entry: ContainerTabEntry,\n problems: string[],\n context: string,\n): BakedTab | null {\n const declared = typeof entry === 'string' ? { surface: entry } : entry;\n if (typeof declared?.surface !== 'string' || declared.surface.length === 0) {\n problems.push(\n `${context}: an initial entry must be a child surface id or { surface } — the entry is dropped.`,\n );\n return null;\n }\n const child = containerChildOf(spec, declared.surface);\n if (child === undefined) {\n problems.push(\n `${context}: initial names \"${declared.surface}\", which is not listed in children — ` +\n `the tab is dropped. A container mounts only what it offers.`,\n );\n return null;\n }\n if (child.segment !== undefined && !isAddressable(child.segment)) {\n problems.push(\n `${context}: initial names \"${declared.surface}\", whose segment \"${child.segment}\" carries a ` +\n `value — the tab is dropped, because nothing here knows which one. A sibling opens it; ` +\n `declare tabs: [] for the pane it should land in.`,\n );\n return null;\n }\n return {\n tab: {\n ...containerChildTab(dock, spec, declared.surface),\n ...(declared.closable === false ? { closable: false } : {}),\n },\n active: declared.active === true,\n };\n}\n","import { inject, Service } from '@angular/core';\nimport { ContainerSpec, ContainerTabLabel } from '@loomweaver/plugin-sdk';\nimport { PaneTab } from '../tree/pane-node';\nimport { findLeafWhere, tabHolderOf } from '../tree/pane-queries';\nimport { insertTab, setActiveTab } from '../tree/pane-tabs';\nimport { containerChildPath, containerPathOfDock } from './container-children';\nimport { containerChildTab, containerLayout } from './container-layout';\nimport { PaneTreeService } from '../tree/pane-tree.service';\n\n@Service()\nexport class PaneContainersService {\n private readonly paneTree = inject(PaneTreeService);\n\n ensureContainer(dock: string, spec: ContainerSpec | undefined): void {\n if (this.paneTree.hasDock(dock)) {\n return;\n }\n const { node } = containerLayout(dock, spec, [], '');\n if (node !== null) {\n const landing = findLeafWhere(node, (leaf) => leaf.declared === true);\n this.paneTree.commit(dock, node, landing?.id);\n }\n }\n\n dropContainer(dock: string): void {\n this.paneTree.dropDock(dock);\n }\n\n insertContainerChild(\n dock: string,\n spec: ContainerSpec | undefined,\n paneId: string,\n childId: string,\n ): void {\n this.paneTree.commit(\n dock,\n insertTab(\n this.paneTree.tree(dock),\n paneId,\n containerChildTab(dock, spec, childId),\n ),\n );\n }\n\n openContainerChild(\n dock: string,\n spec: ContainerSpec | undefined,\n segmentPath: string,\n label?: ContainerTabLabel,\n ): void {\n const path = containerChildPath(containerPathOfDock(dock), segmentPath);\n const tree = this.paneTree.tree(dock);\n const holder = tabHolderOf(tree, path);\n if (holder !== null) {\n this.paneTree.setActiveTab(dock, holder, path);\n return;\n }\n const target = this.paneTree.landingPane(dock);\n this.paneTree.pointAt(dock, target);\n const tab: PaneTab = {\n path,\n instance: `${dock}::${path}`,\n ...(label?.title === undefined\n ? {}\n : {\n title: label.title,\n literalTitle: label.titleIsLiteral ?? false,\n }),\n ...(label?.icon === undefined ? {} : { icon: label.icon }),\n };\n this.paneTree.commit(dock, setActiveTab(insertTab(tree, target, tab), target, path));\n }\n}\n","import { ContainerSpec, ContentRoute, View } from '@loomweaver/plugin-sdk';\nimport { containerChildren, isAddressable } from '../pane/container/container-children';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { MenuListEntry } from '../../menu/menu.service';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { resolveTitle } from '../pane/drag/pane-label';\nimport { matchRoute } from './content-path';\n\nexport interface PaneTarget {\n readonly path: string;\n readonly title?: string;\n readonly titleIsLiteral?: boolean;\n readonly icon?: string;\n}\n\nfunction viewTarget(view: View): PaneTarget {\n return {\n path: VIEW_PANE_PREFIX + view.id,\n title: view.title,\n icon: view.icon,\n };\n}\n\nexport function offRouterMountable(\n registry: ContributionRegistry,\n auth: AuthContext,\n path: string,\n): boolean {\n const route = barePathHostableRoute(registry, path);\n return route !== null && auth.meets(route.access);\n}\n\nexport function offRouterPaneTargets(\n registry: ContributionRegistry,\n auth: AuthContext,\n): PaneTarget[] {\n const routes = registry\n .contentRoutes()\n .filter((route) => offRouterMountable(registry, auth, route.path))\n .map(routeTarget);\n\n const views = registry\n .views()\n .filter((view) => auth.meets(view.access))\n .map(viewTarget);\n return [...routes, ...views];\n}\n\nexport function containerChildTargets(\n registry: ContributionRegistry,\n auth: AuthContext,\n spec: ContainerSpec | undefined,\n): PaneTarget[] {\n const views = registry.views();\n return containerChildren(spec)\n .filter(\n (child) => child.segment === undefined || isAddressable(child.segment),\n )\n .map((child) => views.find((view) => view.id === child.surface))\n .filter(\n (view): view is View => view !== undefined && auth.meets(view.access),\n )\n .map(viewTarget);\n}\n\nexport function routerPaneTargets(\n registry: ContributionRegistry,\n auth: AuthContext,\n): PaneTarget[] {\n return registry\n .contentRoutes()\n .filter(\n (route) =>\n barePathHostableRoute(registry, route.path) !== null &&\n auth.meets(route.access),\n )\n .map(routeTarget);\n}\n\nexport function paneTargetEntries(\n targets: readonly PaneTarget[],\n translate: (key: string) => string,\n): MenuListEntry[] {\n return targets.map((target) => ({\n key: target.path,\n label: paneTargetLabel(target, translate),\n icon: target.icon,\n }));\n}\n\nfunction barePathHostableRoute(\n registry: ContributionRegistry,\n path: string,\n): ContentRoute | null {\n const route = matchRoute(registry.contentRoutes(), path);\n if (\n !route ||\n route.chromeless === true ||\n path.includes('/') ||\n route.path.includes(':') ||\n route.subRoutes?.length\n ) {\n return null;\n }\n return route.component || route.loadComponent ? route : null;\n}\n\nfunction routeTarget(route: ContentRoute): PaneTarget {\n return {\n path: route.path,\n title: route.title,\n titleIsLiteral: route.titleIsLiteral,\n icon: route.icon,\n };\n}\n\nfunction paneTargetLabel(\n target: PaneTarget,\n translate: (key: string) => string,\n): string {\n if (!target.title) {\n return target.path || translate('content.split.home');\n }\n return resolveTitle(\n { title: target.title, literalTitle: target.titleIsLiteral ?? false },\n translate,\n );\n}\n","import { computed, inject, Service, signal, Signal } from '@angular/core';\nimport { VIEW_PANE_PREFIX } from '../tree/pane-address';\nimport { surfaceForPanePath } from '../pane-surface';\nimport { offRouterMountable } from '../../content/pane-targets';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { AuthContext } from '../../../auth/auth-context';\n\nexport interface TabDragSource {\n readonly dock: string;\n readonly paneId: string;\n}\n\n@Service()\nexport class PaneDragService {\n private readonly registry = inject(ContributionRegistry);\n private readonly auth = inject(AuthContext);\n\n private readonly draggedPath = signal<string | null>(null);\n private readonly zones = signal<readonly string[]>([]);\n private readonly strips = signal<readonly string[]>([]);\n\n readonly dragging: Signal<string | null> = this.draggedPath.asReadonly();\n\n readonly dropTargetIds = computed<readonly string[]>(() => [\n ...this.zones(),\n ...this.strips(),\n ]);\n\n start(path: string): void {\n this.draggedPath.set(path);\n }\n\n stop(): void {\n this.draggedPath.set(null);\n }\n\n registerZone(id: string): () => void {\n this.zones.update((ids) => [...ids, id]);\n return () =>\n this.zones.update((ids) => ids.filter((existing) => existing !== id));\n }\n\n registerStrip(id: string): () => void {\n this.strips.update((ids) => [...ids, id]);\n return () =>\n this.strips.update((ids) => ids.filter((existing) => existing !== id));\n }\n\n canHost(path: string): boolean {\n if (path.startsWith(VIEW_PANE_PREFIX)) {\n const surface = surfaceForPanePath(\n this.registry.contentRoutes(),\n this.registry.views(),\n path,\n );\n return surface !== undefined && this.auth.meets(surface.access);\n }\n return offRouterMountable(this.registry, this.auth, path);\n }\n\n routerBound(path: string): boolean {\n return !path.startsWith(VIEW_PANE_PREFIX) && !this.canHost(path);\n }\n}\n","import { PRIMARY_LEAF, PaneNode } from '../tree/pane-node';\nimport { findLeaf } from '../tree/pane-queries';\nimport { removeLeaf } from '../tree/pane-structure';\nimport { isContainerDock } from '../container/container-children';\n\nexport function settleMovedTree(\n dock: string,\n node: PaneNode,\n primaryId: string,\n): PaneNode {\n if (!isContainerDock(dock) || node.kind !== 'split') {\n return node;\n }\n const primary = findLeaf(node, primaryId);\n if (!primary || primary.tabs.length > 0 || primary.declared) {\n return node;\n }\n return removeLeaf(node, primaryId) ?? PRIMARY_LEAF;\n}\n","import { inject, Service } from '@angular/core';\nimport { VIEW_PANE_PREFIX } from '../tree/pane-address';\nimport {\n PRIMARY_LEAF,\n PaneLeaf,\n PaneNode,\n PaneTab,\n newPaneId,\n} from '../tree/pane-node';\nimport { findLeaf } from '../tree/pane-queries';\nimport { splitLeafWith } from '../tree/pane-structure';\nimport { insertTab, removeTab, tabWithout } from '../tree/pane-tabs';\nimport { CONTENT_DOCK } from '../tree/pane-address';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { settleMovedTree } from './settle-moved-tree';\nimport { PaneDragService, TabDragSource } from './pane-drag.service';\nimport { ContentTabsService } from '../../content/tabs/content-tabs.service';\nimport { matchRoute, tabRootOf } from '../../content/content-path';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\n\nexport type PaneDropEdge = 'top' | 'bottom' | 'left' | 'right';\n\nexport function stripSourceOf(listId: string): TabDragSource | null {\n const parts = listId.split(':');\n if (parts[0] !== 'pane-strip' || parts.length < 3) {\n return null;\n }\n return { dock: parts[1], paneId: parts.slice(2).join(':') };\n}\n\nexport function stripIdOf(source: TabDragSource): string {\n return `pane-strip:${source.dock}:${source.paneId}`;\n}\n\n@Service()\nexport class PaneMoveService {\n private readonly paneTree = inject(PaneTreeService);\n private readonly drag = inject(PaneDragService);\n private readonly tabs = inject(ContentTabsService);\n private readonly registry = inject(ContributionRegistry);\n\n moveToStrip(\n source: TabDragSource,\n rawPath: string,\n target: TabDragSource,\n index?: number,\n ): void {\n const tab = this.resolveTab(source, rawPath);\n if (\n !tab ||\n (source.dock === target.dock && source.paneId === target.paneId)\n ) {\n return;\n }\n const at = this.isUrlGroup(target) ? undefined : index;\n const follow = this.urlFollowup(source, tab);\n const moved = this.departedTab(source, this.isUrlGroup(target), tab);\n this.relocateTab(source, tab, target.dock, (tree) =>\n insertTab(tree, target.paneId, moved, at),\n );\n this.afterArrival(target, moved, follow);\n }\n\n moveToEdge(\n source: TabDragSource,\n rawPath: string,\n target: TabDragSource,\n edge: PaneDropEdge,\n ): void {\n const tab = this.resolveTab(source, rawPath);\n if (!tab) {\n return;\n }\n const samePane =\n source.dock === target.dock && source.paneId === target.paneId;\n if (samePane && !this.sourceRetainsContent(source, tab)) {\n return;\n }\n const follow = this.urlFollowup(source, tab);\n const moved = this.departedTab(source, false, tab);\n const orientation = edge === 'left' || edge === 'right' ? 'row' : 'column';\n const position = edge === 'left' || edge === 'top' ? 'before' : 'after';\n const added: PaneLeaf = {\n kind: 'leaf',\n id: newPaneId(),\n tabs: [moved],\n active: moved.path,\n };\n this.relocateTab(source, tab, target.dock, (tree) =>\n splitLeafWith(tree, target.paneId, orientation, added, position),\n );\n this.afterArrival({ dock: target.dock, paneId: added.id }, moved, follow);\n }\n\n splitFromUrlGroup(rootPath: string, orientation: 'row' | 'column'): void {\n const source: TabDragSource = {\n dock: CONTENT_DOCK,\n paneId: this.paneTree.primaryId(CONTENT_DOCK),\n };\n this.moveToEdge(\n source,\n rootPath,\n source,\n orientation === 'row' ? 'right' : 'bottom',\n );\n }\n\n private relocateTab(\n source: TabDragSource,\n tab: PaneTab,\n targetDock: string,\n applyToTarget: (tree: PaneNode) => PaneNode,\n ): void {\n if (source.dock === targetDock) {\n this.commitSource(\n source.dock,\n applyToTarget(\n this.removeSourceTab(this.paneTree.tree(source.dock), source, tab),\n ),\n );\n return;\n }\n this.commitSource(\n source.dock,\n this.removeSourceTab(this.paneTree.tree(source.dock), source, tab),\n );\n this.paneTree.commitTree(\n targetDock,\n applyToTarget(this.paneTree.tree(targetDock)),\n );\n }\n\n private resolveTab(\n source: TabDragSource,\n rawPath: string,\n ): PaneTab | undefined {\n const leaf = findLeaf(this.paneTree.tree(source.dock), source.paneId);\n if (!leaf) {\n return undefined;\n }\n const exact = leaf.tabs.find((tab) => tab.path === rawPath);\n if (exact || !this.isUrlGroup(source)) {\n return exact;\n }\n const routes = this.registry.contentRoutes();\n return leaf.tabs.find((tab) => tabRootOf(routes, tab.path) === rawPath);\n }\n\n private isUrlGroup(source: TabDragSource): boolean {\n return (\n source.dock === CONTENT_DOCK &&\n source.paneId === this.paneTree.primaryId(CONTENT_DOCK)\n );\n }\n\n private tabCount(source: TabDragSource): number {\n return (\n findLeaf(this.paneTree.tree(source.dock), source.paneId)?.tabs.length ?? 0\n );\n }\n\n private sourceRetainsContent(source: TabDragSource, tab: PaneTab): boolean {\n if (this.tabCount(source) > 1) {\n return true;\n }\n return this.isUrlGroup(source) && this.tabs.neighbourOf(tab.path) !== '';\n }\n\n private departedTab(\n source: TabDragSource,\n targetIsUrlGroup: boolean,\n tab: PaneTab,\n ): PaneTab {\n const leavesUrlGroup = this.isUrlGroup(source) && !targetIsUrlGroup;\n return leavesUrlGroup && tab.preview ? tabWithout(tab, 'preview') : tab;\n }\n\n private removeSourceTab(\n tree: PaneNode,\n source: TabDragSource,\n tab: PaneTab,\n ): PaneNode {\n return (\n removeTab(\n tree,\n source.paneId,\n tab.path,\n this.paneTree.primaryId(source.dock),\n ) ?? PRIMARY_LEAF\n );\n }\n\n private commitSource(dock: string, node: PaneNode): void {\n this.paneTree.commitTree(\n dock,\n settleMovedTree(dock, node, this.paneTree.primaryId(dock)),\n );\n }\n\n private urlFollowup(source: TabDragSource, tab: PaneTab): string | null {\n if (!this.isUrlGroup(source)) {\n return null;\n }\n const routes = this.registry.contentRoutes();\n return tabRootOf(routes, tab.path) === this.tabs.activeTabRoot()\n ? this.tabs.neighbourOf(tab.path)\n : null;\n }\n\n private afterArrival(\n target: TabDragSource,\n tab: PaneTab,\n urlFollowup: string | null,\n ): void {\n if (this.isUrlGroup(target)) {\n if (tab.path.startsWith(VIEW_PANE_PREFIX)) {\n this.tabs.activateViewTab(tab.path);\n } else {\n this.tabs.navigateTo(tab.path);\n }\n return;\n }\n if (target.dock === CONTENT_DOCK && this.drag.routerBound(tab.path)) {\n const previous =\n urlFollowup === '' ? null : (urlFollowup ?? this.currentUrlContent());\n const path = this.paneTree.focusPane(\n target.dock,\n target.paneId,\n previous,\n );\n if (path !== null) {\n this.tabs.navigateTo(path);\n }\n return;\n }\n if (urlFollowup !== null) {\n this.tabs.navigateTo(urlFollowup);\n }\n }\n\n private currentUrlContent(): string {\n const routes = this.registry.contentRoutes();\n const root = this.tabs.activeTabRoot();\n return matchRoute(routes, root) ? root : '';\n }\n}\n","import { afterNextRender, afterRenderEffect, Component, CUSTOM_ELEMENTS_SCHEMA, DestroyRef, ElementRef, TemplateRef, computed, effect, inject, input, output, signal, viewChild } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport {\n CdkDrag,\n CdkDragDrop,\n CdkDragHandle,\n CdkDropList,\n moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { MenuContext, ViewAction } from '@loomweaver/plugin-sdk';\nimport { MENU_ANCHOR_GAP, MenuService } from '../../../menu/menu.service';\nimport { ContextMenuDirective } from '../../../menu/context-menu.directive';\nimport { Reorderable } from '../../reorder/reorderable.directive';\nimport { VIEW_PANE_PREFIX } from '../tree/pane-address';\nimport { resolveTitle } from '../drag/pane-label';\nimport { SHELL_FEATURES } from '../../../foundation/shell-features';\nimport { PaneDragService, TabDragSource } from '../drag/pane-drag.service';\nimport { PaneMoveService, stripIdOf, stripSourceOf } from '../drag/pane-move.service';\nimport { StripTab, TabAcceptance } from './strip-tab';\n\nconst EDGE_TOLERANCE_PX = 1;\n\n@Component({\n selector: 'lw-pane-tab-strip',\n imports: [\n NgTemplateOutlet,\n TranslocoPipe,\n ContextMenuDirective,\n Reorderable,\n CdkDropList,\n CdkDrag,\n CdkDragHandle,\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './pane-tab-strip.html',\n})\nexport class PaneTabStrip {\n readonly tabs = input.required<readonly StripTab[]>();\n\n readonly activeId = input.required<string>();\n\n readonly reorderable = input(false);\n\n readonly draggable = input(false);\n\n readonly acceptsTabs = input<TabAcceptance>(false);\n\n readonly source = input.required<TabDragSource>();\n\n readonly variant = input<'titles' | 'icons'>('titles');\n\n readonly urlDriven = input(false);\n\n readonly contextMenuSlot = input('');\n\n readonly viewContextMenuSlot = input('');\n\n readonly contextGroup = input('');\n\n readonly overflow = input(false);\n\n readonly canAddTab = input(false);\n\n readonly paneActions = input<TemplateRef<unknown> | null>(null);\n\n readonly selectTab = output<StripTab>();\n\n readonly escalate = output<StripTab>();\n\n readonly closeTab = output<StripTab>();\n\n readonly unpinTab = output<StripTab>();\n\n readonly reorderTabs = output<string[]>();\n\n readonly runAction = output<ViewAction>();\n\n readonly addTab = output<Event>();\n\n readonly revealRequest = output<string>();\n\n private readonly menu = inject(MenuService);\n\n private readonly transloco = inject(TranslocoService);\n\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly paneDrag = inject(PaneDragService);\n\n private readonly paneMove = inject(PaneMoveService);\n\n private readonly strip = viewChild<ElementRef<HTMLElement>>('tabStrip');\n\n protected readonly escalatable = inject(SHELL_FEATURES).content.escalate;\n\n private pickedHere: string | null = null;\n\n protected readonly overflowing = signal(false);\n\n protected readonly stripId = computed(() => stripIdOf(this.source()));\n\n protected readonly dragZoneIds = computed(() =>\n this.paneDrag.dropTargetIds().filter((id) => id !== this.stripId()),\n );\n\n protected readonly activeActions = computed(\n () =>\n this.tabs().find((tab) => tab.path === this.activeId())?.actions ?? [],\n );\n\n protected readonly icons = computed(() => this.variant() === 'icons');\n\n protected readonly bandClass = computed(() =>\n this.icons()\n ? 'relative z-30 flex h-full items-center border-b border-border bg-surface px-1'\n : 'relative z-30 flex h-full items-stretch border-b border-border bg-surface',\n );\n\n constructor() {\n afterRenderEffect(() => {\n this.tabs();\n if (this.overflow()) {\n this.measureOverflow();\n }\n });\n afterNextRender(() => this.observeResize());\n afterRenderEffect(() => {\n const active = this.activeId();\n const picked = this.pickedHere;\n this.pickedHere = null;\n if (picked !== active && this.overflow()) {\n this.revealActiveTab();\n }\n });\n effect((onCleanup) => {\n const id = this.stripId();\n if (!id) {\n return;\n }\n onCleanup(this.paneDrag.registerStrip(id));\n });\n }\n\n protected readonly sortPredicate = (\n index: number,\n drag: CdkDrag<string>,\n ): boolean => {\n const tabs = this.tabs();\n const dragged = tabs.find((tab) => tab.path === drag.data);\n if (!dragged) {\n return true;\n }\n const target = tabs[index];\n return !!target && this.bandOf(dragged) === this.bandOf(target);\n };\n\n protected onDragStarted(tab: StripTab): void {\n this.paneDrag.start(tab.path);\n }\n\n protected onDragEnded(): void {\n this.paneDrag.stop();\n }\n\n protected openOverflow(event: Event): void {\n const anchor = (event.currentTarget as HTMLElement).getBoundingClientRect();\n const entries = this.tabs().map((tab) => ({\n key: tab.path,\n label: this.label(tab),\n icon: tab.icon,\n active: this.isActive(tab),\n }));\n this.menu.openList(\n entries,\n { x: anchor.right, y: anchor.bottom + MENU_ANCHOR_GAP },\n (path) => {\n const tab = this.tabs().find((candidate) => candidate.path === path);\n if (tab) {\n this.selectTab.emit(tab);\n }\n },\n );\n }\n\n protected onSelectTab(tab: StripTab): void {\n if (tab.path !== this.activeId()) {\n this.pickedHere = tab.path;\n }\n this.selectTab.emit(tab);\n }\n\n protected isActive(tab: StripTab): boolean {\n return this.activeId() === tab.path;\n }\n\n protected menuSlotFor(tab: StripTab): string {\n return tab.path.startsWith(VIEW_PANE_PREFIX)\n ? this.viewContextMenuSlot()\n : this.contextMenuSlot();\n }\n\n protected tabContext(tab: StripTab): MenuContext {\n if (tab.path.startsWith(VIEW_PANE_PREFIX)) {\n return {\n targetKind: 'view-tab',\n viewId: tab.path.slice(VIEW_PANE_PREFIX.length),\n region: this.contextGroup(),\n ...(tab.instance ? { instance: tab.instance } : {}),\n };\n }\n return {\n targetKind: 'content-tab',\n tabId: tab.path,\n group: this.contextGroup(),\n pinned: tab.pinned,\n closable: tab.closable,\n };\n }\n\n protected onTabKeydown(event: KeyboardEvent, tab: StripTab): void {\n if (event.key !== 'Delete' || !tab.closable || tab.pinned) {\n return;\n }\n event.preventDefault();\n this.closeTab.emit(tab);\n }\n\n protected onClose(event: Event, tab: StripTab): void {\n event.stopPropagation();\n this.closeTab.emit(tab);\n }\n\n protected onUnpin(event: Event, tab: StripTab): void {\n event.stopPropagation();\n this.unpinTab.emit(tab);\n }\n\n protected canReorder(tab: StripTab): boolean {\n return this.reorderable() && (tab.closable || tab.pinned);\n }\n\n protected canDrag(tab: StripTab): boolean {\n return this.draggable() && (tab.closable || tab.pinned);\n }\n\n protected readonly enterPredicate = (drag: CdkDrag<string>): boolean => {\n if (drag.dropContainer.id === this.stripId()) {\n return this.reorderable();\n }\n const accepts = this.acceptsTabs();\n return typeof accepts === 'function'\n ? accepts(String(drag.data ?? ''))\n : accepts;\n };\n\n protected onDrop(event: CdkDragDrop<unknown>): void {\n if (event.previousContainer !== event.container) {\n const source = stripSourceOf(event.previousContainer.id);\n if (source) {\n this.paneMove.moveToStrip(\n source,\n String(event.item.data ?? ''),\n this.source(),\n event.currentIndex,\n );\n }\n return;\n }\n const tabs = [...this.tabs()];\n moveItemInArray(tabs, event.previousIndex, event.currentIndex);\n this.reorderTabs.emit(\n tabs.filter((tab) => this.canReorder(tab)).map((tab) => tab.path),\n );\n }\n\n private observeResize(): void {\n const el = this.strip()?.nativeElement;\n if (!el || typeof ResizeObserver === 'undefined') {\n return;\n }\n const observer = new ResizeObserver(\n () => this.overflow() && this.measureOverflow(),\n );\n observer.observe(el);\n this.destroyRef.onDestroy(() => observer.disconnect());\n }\n\n private measureOverflow(): void {\n const el = this.strip()?.nativeElement;\n this.overflowing.set(\n !!el && el.scrollWidth - el.clientWidth > EDGE_TOLERANCE_PX,\n );\n }\n\n private revealActiveTab(): void {\n const strip = this.strip()?.nativeElement;\n const active = this.activeId();\n const wrapper = strip?.querySelector<HTMLElement>(\n `[data-tab-path=\"${active}\"]`,\n )?.parentElement;\n if (!strip || !wrapper) {\n return;\n }\n const band = strip.getBoundingClientRect();\n const tab = wrapper.getBoundingClientRect();\n const fullyVisible =\n tab.left >= band.left - EDGE_TOLERANCE_PX &&\n tab.right <= band.right + EDGE_TOLERANCE_PX;\n if (!fullyVisible) {\n this.revealRequest.emit(active);\n }\n }\n\n private bandOf(tab: StripTab): string {\n if (tab.pinned) {\n return 'pinned';\n }\n return tab.closable ? 'dynamic' : 'static';\n }\n\n private label(tab: StripTab): string {\n return resolveTitle(tab, (key) => this.transloco.translate(key));\n }\n}\n","<div [class]=\"bandClass()\">\n <div\n #tabStrip\n class=\"flex min-w-0 flex-1 items-center gap-0.5 overflow-hidden\"\n [class.px-2]=\"!icons()\"\n [class.px-1]=\"icons()\"\n role=\"tablist\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [id]=\"stripId()\"\n [cdkDropListSortingDisabled]=\"!reorderable()\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [cdkDropListConnectedTo]=\"dragZoneIds()\"\n [cdkDropListSortPredicate]=\"sortPredicate\"\n (cdkDropListDropped)=\"onDrop($event)\"\n [lwReorderable]=\"stripId()\"\n [lwReorderableEnabled]=\"reorderable()\"\n (reorder)=\"reorderTabs.emit($event)\"\n >\n @for (tab of tabs(); track tab.path) {\n @let title = tab.literalTitle ? tab.title : (tab.title | transloco);\n @if (icons()) {\n <button\n type=\"button\"\n role=\"tab\"\n cdkDrag\n [cdkDragData]=\"tab.path\"\n [cdkDragDisabled]=\"!canDrag(tab)\"\n (cdkDragStarted)=\"onDragStarted(tab)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [lwContextMenu]=\"menuSlotFor(tab)\"\n [lwContextMenuContext]=\"tabContext(tab)\"\n [attr.aria-selected]=\"isActive(tab)\"\n [attr.aria-label]=\"title\"\n [attr.data-reorder-id]=\"canReorder(tab) ? tab.path : null\"\n [attr.data-reorder-band]=\"tab.pinned ? 'pinned' : 'dynamic'\"\n [attr.data-tab-path]=\"tab.path\"\n (click)=\"onSelectTab(tab)\"\n (dblclick)=\"escalate.emit(tab)\"\n class=\"lw-icon-btn h-10 w-10 rounded-md md:h-7 md:w-7\"\n [class.bg-surface-overlay]=\"isActive(tab)\"\n [class.text-content]=\"isActive(tab)\"\n >\n <lw-icon [name]=\"tab.icon ?? 'document'\" size=\"1rem\" />\n <lw-tooltip [text]=\"title\" position=\"bottom\" />\n </button>\n } @else {\n <div\n class=\"flex max-w-52 min-w-28 items-center border-b-2 transition-colors\"\n cdkDrag\n [cdkDragData]=\"tab.path\"\n [cdkDragDisabled]=\"!canDrag(tab)\"\n (cdkDragStarted)=\"onDragStarted(tab)\"\n (cdkDragEnded)=\"onDragEnded()\"\n [class.border-brand]=\"isActive(tab) && urlDriven()\"\n [class.border-content-faint]=\"isActive(tab) && !urlDriven()\"\n [class.border-transparent]=\"!isActive(tab)\"\n [lwContextMenu]=\"menuSlotFor(tab)\"\n [lwContextMenuContext]=\"tabContext(tab)\"\n >\n <button\n type=\"button\"\n role=\"tab\"\n cdkDragHandle\n [attr.aria-selected]=\"isActive(tab)\"\n [attr.aria-label]=\"title\"\n [attr.data-reorder-id]=\"canReorder(tab) ? tab.path : null\"\n [attr.data-reorder-band]=\"tab.pinned ? 'pinned' : 'dynamic'\"\n [attr.data-tab-path]=\"tab.path\"\n [attr.aria-keyshortcuts]=\"tab.closable && !tab.pinned ? 'Delete' : null\"\n (click)=\"onSelectTab(tab)\"\n (dblclick)=\"escalate.emit(tab)\"\n (keydown)=\"onTabKeydown($event, tab)\"\n class=\"relative flex min-w-0 items-center gap-1.5 py-2 pr-1 pl-3 text-sm transition-colors\"\n [class.text-content]=\"isActive(tab)\"\n [class.text-content-faint]=\"!isActive(tab)\"\n [class.italic]=\"tab.preview\"\n >\n @if (tab.preview) {\n <lw-icon name=\"preview\" size=\"1rem\" />\n } @else if (tab.icon) {\n <lw-icon [name]=\"tab.icon\" size=\"1rem\" />\n }\n <span class=\"min-w-0 truncate\">{{ title }}</span>\n\n <lw-tooltip\n [text]=\"\n tab.preview && escalatable\n ? title + ' — ' + ('content.previewHint' | transloco)\n : title\n \"\n position=\"bottom\"\n />\n </button>\n\n @if (tab.pinned) {\n <span\n aria-hidden=\"true\"\n data-testid=\"tab-unpin\"\n (click)=\"onUnpin($event, tab)\"\n class=\"relative mr-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded text-brand opacity-90 transition-colors hover:bg-surface-overlay hover:opacity-100\"\n >\n <lw-icon name=\"pin\" size=\"0.85rem\" />\n <lw-tooltip [text]=\"'content.pinnedHint' | transloco\" position=\"bottom\" />\n </span>\n } @else if (tab.closable) {\n <span\n aria-hidden=\"true\"\n data-testid=\"tab-close\"\n (click)=\"onClose($event, tab)\"\n class=\"lw-icon-btn mr-1 h-6 w-6 cursor-pointer opacity-70 hover:opacity-100\"\n >\n <lw-icon name=\"close\" size=\"0.85rem\" />\n <lw-tooltip [text]=\"'content.closeTab' | transloco\" position=\"bottom\" />\n </span>\n }\n </div>\n }\n }\n </div>\n\n @if (canAddTab()) {\n <button\n type=\"button\"\n (click)=\"addTab.emit($event)\"\n class=\"lw-icon-btn w-8\"\n [class.self-stretch]=\"icons()\"\n [attr.aria-label]=\"'content.split.newTab' | transloco\"\n data-testid=\"pane-add-tab\"\n >\n <lw-icon name=\"add\" size=\"1rem\" />\n <lw-tooltip [text]=\"'content.split.newTab' | transloco\" position=\"bottom\" />\n </button>\n }\n\n @if (overflow() && overflowing()) {\n <button\n type=\"button\"\n (click)=\"openOverflow($event)\"\n class=\"lw-icon-btn w-8\"\n [class.self-stretch]=\"icons()\"\n [attr.aria-label]=\"'content.moreTabs' | transloco\"\n >\n <lw-icon name=\"chevronDown\" size=\"1rem\" />\n <lw-tooltip [text]=\"'content.moreTabs' | transloco\" position=\"bottom\" />\n </button>\n }\n\n @if (paneActions(); as actions) {\n <ng-container [ngTemplateOutlet]=\"actions\" />\n }\n @if (activeActions().length) {\n <div class=\"flex shrink-0 items-center gap-0.5 border-l border-border px-2\">\n @for (action of activeActions(); track action.id) {\n <button\n type=\"button\"\n (click)=\"runAction.emit(action)\"\n class=\"lw-icon-btn h-8 w-8 rounded-md\"\n [attr.aria-label]=\"action.title | transloco\"\n >\n <lw-icon [name]=\"action.icon\" size=\"1rem\" />\n <lw-tooltip [text]=\"action.title | transloco\" position=\"bottom\" />\n </button>\n }\n </div>\n }\n</div>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, input, output } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\n@Component({\n selector: 'lw-pane-toolbar',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n host: { class: 'flex items-center gap-0.5' },\n templateUrl: './pane-toolbar.html',\n})\nexport class PaneToolbar {\n readonly canNewTab = input(false);\n readonly canSplitRight = input(false);\n readonly canSplitDown = input(false);\n readonly canMinimize = input(false);\n readonly canMaximize = input(false);\n readonly maximized = input(false);\n readonly canClose = input(false);\n readonly closeLabel = input('content.split.closePane');\n readonly newTabTestId = input('');\n readonly splitRightTestId = input('');\n readonly splitDownTestId = input('');\n\n readonly newTab = output<Event>();\n readonly splitRight = output<void>();\n readonly splitDown = output<void>();\n readonly minimize = output<void>();\n readonly toggleMaximize = output<void>();\n readonly closePane = output<void>();\n}\n","@if (canNewTab()) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-6 w-6 self-center\"\n (click)=\"newTab.emit($event)\"\n [attr.aria-label]=\"'content.split.newTab' | transloco\"\n [attr.data-testid]=\"newTabTestId() || null\"\n >\n <lw-icon name=\"add\" size=\"0.875rem\" />\n <lw-tooltip\n [text]=\"'content.split.newTab' | transloco\"\n position=\"bottom\"\n />\n </button>\n}\n@if (canSplitRight()) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-6 w-6 self-center\"\n (click)=\"splitRight.emit()\"\n [attr.aria-label]=\"'content.split.splitRight' | transloco\"\n [attr.data-testid]=\"splitRightTestId() || null\"\n >\n <lw-icon name=\"splitPanes\" size=\"0.875rem\" />\n <lw-tooltip\n [text]=\"'content.split.splitRight' | transloco\"\n position=\"bottom\"\n />\n </button>\n}\n@if (canSplitDown()) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-6 w-6 self-center\"\n (click)=\"splitDown.emit()\"\n [attr.aria-label]=\"'content.split.splitDown' | transloco\"\n [attr.data-testid]=\"splitDownTestId() || null\"\n >\n <lw-icon name=\"splitPanesDown\" size=\"0.875rem\" />\n <lw-tooltip\n [text]=\"'content.split.splitDown' | transloco\"\n position=\"bottom\"\n />\n </button>\n}\n@if (canMinimize()) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-6 w-6 self-center\"\n (click)=\"minimize.emit()\"\n [attr.aria-label]=\"'content.split.minimize' | transloco\"\n data-testid=\"pane-minimize\"\n >\n <lw-icon name=\"minimize\" size=\"0.875rem\" />\n <lw-tooltip\n [text]=\"'content.split.minimize' | transloco\"\n position=\"bottom\"\n />\n </button>\n}\n@if (canMaximize()) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-6 w-6 self-center\"\n (click)=\"toggleMaximize.emit()\"\n [attr.aria-label]=\"(maximized() ? 'content.split.restore' : 'content.split.maximize') | transloco\"\n data-testid=\"pane-maximize\"\n >\n <lw-icon [name]=\"maximized() ? 'restore' : 'maximize'\" size=\"0.875rem\" />\n <lw-tooltip\n [text]=\"(maximized() ? 'content.split.restore' : 'content.split.maximize') | transloco\"\n position=\"bottom\"\n />\n </button>\n}\n@if (canClose()) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-6 w-6 self-center\"\n (click)=\"closePane.emit()\"\n [attr.aria-label]=\"closeLabel() | transloco\"\n >\n <lw-icon name=\"close\" size=\"0.875rem\" />\n <lw-tooltip [text]=\"closeLabel() | transloco\" position=\"bottom\" />\n </button>\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { AuthContext } from '../../../auth/auth-context';\n\n@Component({\n selector: 'lw-auth-required',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './auth-required-view.html',\n})\nexport class AuthRequiredView {\n private readonly auth = inject(AuthContext);\n\n protected readonly titleKey = computed(() =>\n this.auth.authenticated() ? 'auth.deniedTitle' : 'auth.requiredTitle',\n );\n\n protected readonly messageKey = computed(() =>\n this.auth.authenticated() ? 'auth.deniedMessage' : 'auth.requiredMessage',\n );\n}\n","<div\n class=\"flex h-full flex-col items-center justify-center gap-3 p-8 text-center\"\n role=\"status\"\n data-testid=\"access-placeholder\"\n>\n <lw-icon name=\"lock\" size=\"2rem\" class=\"text-content-muted\" />\n <h2 class=\"text-lg font-semibold text-content\">\n {{ titleKey() | transloco }}\n </h2>\n <p class=\"max-w-sm text-sm text-content-muted\">\n {{ messageKey() | transloco }}\n </p>\n</div>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\n@Component({\n selector: 'lw-route-unavailable',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './route-unavailable-view.html',\n})\nexport class RouteUnavailableView {}\n","<div\n class=\"flex h-full flex-col items-center justify-center gap-3 p-8 text-center\"\n role=\"status\"\n>\n <lw-icon name=\"info\" size=\"2rem\" class=\"text-content-muted\" />\n <h2 class=\"text-lg font-semibold text-content\">\n {{ 'route.unavailableTitle' | transloco }}\n </h2>\n <p class=\"max-w-sm text-sm text-content-muted\">\n {{ 'route.unavailableMessage' | transloco }}\n </p>\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Service, signal } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SETTINGS_STORE } from '../persistence/settings-store';\nimport { hydrateAsync } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\n\nexport const SUPPORTED_LANGS = ['en', 'de'] as const;\nexport type SupportedLang = (typeof SUPPORTED_LANGS)[number];\n\nconst STORAGE_KEY = 'lw.shell.lang';\n\nfunction isSupported(value: string | null | undefined): value is SupportedLang {\n return (\n value != null && (SUPPORTED_LANGS as readonly string[]).includes(value)\n );\n}\n\nfunction storedLang(): string | null {\n try {\n return localStorage.getItem(STORAGE_KEY);\n } catch {\n return null;\n }\n}\n\nexport function detectInitialLang(): SupportedLang {\n const stored = storedLang();\n if (isSupported(stored)) {\n return stored;\n }\n for (const candidate of navigator.languages ?? [navigator.language]) {\n const base = candidate?.slice(0, 2).toLowerCase();\n if (isSupported(base)) {\n return base;\n }\n }\n return 'en';\n}\n\n@Service()\nexport class LocaleService {\n private readonly transloco = inject(TranslocoService);\n private readonly document = inject(DOCUMENT);\n private readonly store = inject(SETTINGS_STORE);\n private readonly sync = inject(StateSyncService);\n\n private readonly langState = signal<SupportedLang>(detectInitialLang());\n\n readonly lang = this.langState.asReadonly();\n readonly supported = SUPPORTED_LANGS;\n\n constructor() {\n this.document.documentElement.lang = this.lang();\n hydrateAsync(this.store, STORAGE_KEY, (raw) => {\n if (isSupported(raw)) {\n this.applyLang(raw);\n }\n });\n this.sync.register('settings', STORAGE_KEY, (raw) => {\n if (isSupported(raw)) {\n this.applyLang(raw);\n }\n });\n }\n\n setLang(lang: SupportedLang): void {\n this.applyLang(lang);\n void this.store.set(STORAGE_KEY, lang);\n }\n\n private applyLang(lang: SupportedLang): void {\n this.langState.set(lang);\n this.transloco.setActiveLang(lang);\n this.document.documentElement.lang = lang;\n }\n}\n","import { inject, isDevMode, Service, signal, WritableSignal } from '@angular/core';\nimport { PluginState, StateHandle } from '@loomweaver/plugin-sdk';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { hydrateAsync, readStoredValue } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\n\nconst STORAGE_PREFIX = 'lw.plugin-state:';\nconst INDEX_PREFIX = 'lw.plugin-state-keys:';\nconst SAVE_DEBOUNCE_MS = 400;\nconst MAX_VALUE_BYTES = 64 * 1024;\nconst MAX_KEYS = 64;\n\nfunction parseBlob(raw: string | undefined): unknown {\n if (!raw) {\n return undefined;\n }\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\nfunction parseKeys(raw: string | undefined): string[] {\n const parsed = parseBlob(raw);\n return Array.isArray(parsed)\n ? parsed.filter((key): key is string => typeof key === 'string')\n : [];\n}\n\ninterface Entry {\n readonly storageKey: string;\n readonly pluginId: string;\n readonly value: WritableSignal<unknown>;\n readonly loaded: WritableSignal<boolean>;\n watchers: number;\n pending: string | undefined;\n timer: ReturnType<typeof setTimeout> | undefined;\n}\n\n@Service()\nexport class PluginStateService {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly sync = inject(StateSyncService);\n private readonly entries = new Map<string, Entry>();\n private readonly keysByPlugin = new Map<string, Set<string>>();\n\n constructor() {\n this.sync.registerPrefix('working-state', STORAGE_PREFIX, (raw, key) => {\n const entry = this.entries.get(key);\n if (!entry) {\n return;\n }\n this.cancelPending(entry);\n entry.value.set(parseBlob(raw));\n entry.loaded.set(true);\n });\n }\n\n facade(pluginId: string): PluginState {\n return {\n watch: <T>(key: string) => this.watch<T>(pluginId, key),\n };\n }\n\n removePlugin(pluginId: string): void {\n for (const [storageKey, entry] of [...this.entries]) {\n if (entry.pluginId === pluginId) {\n this.cancelPending(entry);\n entry.value.set(undefined);\n this.entries.delete(storageKey);\n }\n }\n this.keysByPlugin.delete(pluginId);\n void readStoredValue(this.store, INDEX_PREFIX + pluginId).then((raw) => {\n for (const key of parseKeys(raw)) {\n void this.store.delete(this.storageKeyOf(pluginId, key));\n }\n void this.store.delete(INDEX_PREFIX + pluginId);\n });\n }\n\n private watch<T>(pluginId: string, key: string): StateHandle<T> {\n if (typeof key !== 'string' || key.length === 0) {\n throw new Error(\n `Plugin \"${pluginId}\": ctx.state.watch needs a non-empty key.`,\n );\n }\n const entry = this.entryFor(pluginId, key);\n entry.watchers += 1;\n let live = true;\n const release = () => {\n if (!live) {\n return;\n }\n live = false;\n entry.watchers -= 1;\n if (entry.watchers === 0) {\n this.flush(entry);\n this.entries.delete(entry.storageKey);\n }\n };\n return {\n value: () => entry.value() as T | undefined,\n loaded: () => entry.loaded(),\n set: (next: T) => this.write(entry, key, next),\n clear: () => this.remove(entry, key),\n dispose: release,\n };\n }\n\n private entryFor(pluginId: string, key: string): Entry {\n const storageKey = this.storageKeyOf(pluginId, key);\n const existing = this.entries.get(storageKey);\n if (existing) {\n return existing;\n }\n const value = signal<unknown>(parseBlob(this.store.peek?.(storageKey)));\n const loaded = signal(this.store.peek !== undefined);\n hydrateAsync(\n this.store,\n storageKey,\n (raw) => value.set(parseBlob(raw)),\n () => loaded.set(true),\n );\n const entry: Entry = {\n storageKey,\n pluginId,\n value,\n loaded,\n watchers: 0,\n pending: undefined,\n timer: undefined,\n };\n this.entries.set(storageKey, entry);\n return entry;\n }\n\n private write(entry: Entry, key: string, next: unknown): void {\n const serialised = JSON.stringify(next);\n if (!this.withinLimits(entry.pluginId, key, serialised)) {\n return;\n }\n entry.value.set(next);\n entry.pending = serialised;\n this.cancelTimer(entry);\n entry.timer = setTimeout(() => this.flush(entry), SAVE_DEBOUNCE_MS);\n }\n\n private remove(entry: Entry, key: string): void {\n this.cancelPending(entry);\n entry.value.set(undefined);\n void this.store.delete(entry.storageKey);\n const keys = this.keysByPlugin.get(entry.pluginId);\n keys?.delete(key);\n this.persistIndex(entry.pluginId);\n }\n\n private flush(entry: Entry): void {\n this.cancelTimer(entry);\n const pending = entry.pending;\n entry.pending = undefined;\n if (pending !== undefined) {\n void this.store.set(entry.storageKey, pending);\n }\n }\n\n private cancelPending(entry: Entry): void {\n this.cancelTimer(entry);\n entry.pending = undefined;\n }\n\n private cancelTimer(entry: Entry): void {\n if (entry.timer !== undefined) {\n clearTimeout(entry.timer);\n entry.timer = undefined;\n }\n }\n\n private withinLimits(\n pluginId: string,\n key: string,\n serialised: string,\n ): boolean {\n const bytes = serialised.length;\n if (bytes > MAX_VALUE_BYTES) {\n console.error(\n `Plugin \"${pluginId}\": state key \"${key}\" is ${bytes} bytes, over the ${MAX_VALUE_BYTES}-byte ` +\n `limit for one value. The write was refused — keep large payloads out of the store and put a ` +\n `pointer to them in it instead.`,\n );\n return false;\n }\n const keys = this.knownKeys(pluginId);\n if (!keys.has(key) && keys.size >= MAX_KEYS) {\n console.error(\n `Plugin \"${pluginId}\": ${MAX_KEYS} state keys is the limit and \"${key}\" would be one more. ` +\n `The write was refused — clear the keys you no longer need.`,\n );\n return false;\n }\n if (isDevMode() && bytes > MAX_VALUE_BYTES / 2) {\n console.warn(\n `Plugin \"${pluginId}\": state key \"${key}\" is ${bytes} bytes, past half the per-value limit.`,\n );\n }\n if (isDevMode() && !keys.has(key) && keys.size + 1 > MAX_KEYS / 2) {\n console.warn(\n `Plugin \"${pluginId}\": ${keys.size + 1} state keys, past half the limit of ${MAX_KEYS}.`,\n );\n }\n if (!keys.has(key)) {\n keys.add(key);\n this.persistIndex(pluginId);\n }\n return true;\n }\n\n private knownKeys(pluginId: string): Set<string> {\n const existing = this.keysByPlugin.get(pluginId);\n if (existing) {\n return existing;\n }\n const keys = new Set(\n parseKeys(this.store.peek?.(INDEX_PREFIX + pluginId)),\n );\n this.keysByPlugin.set(pluginId, keys);\n void readStoredValue(this.store, INDEX_PREFIX + pluginId).then((raw) => {\n for (const key of parseKeys(raw)) {\n keys.add(key);\n }\n });\n return keys;\n }\n\n private persistIndex(pluginId: string): void {\n const keys = [...(this.keysByPlugin.get(pluginId) ?? [])];\n void this.store.set(INDEX_PREFIX + pluginId, JSON.stringify(keys));\n }\n\n private storageKeyOf(pluginId: string, key: string): string {\n return `${STORAGE_PREFIX}${pluginId}:${key}`;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { computed, effect, inject, Service, signal, Signal } from '@angular/core';\nimport { SETTINGS_STORE } from '../persistence/settings-store';\nimport { hydrateAsync } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\n\n/** What the user picked. `system` follows the OS `prefers-color-scheme`. */\nexport type ThemeMode = 'light' | 'dark' | 'system';\n\n/** What is actually being rendered, once `system` has been resolved against the OS. */\nexport type ResolvedTheme = 'light' | 'dark';\n\nconst STORAGE_KEY = 'lw.shell.theme';\nconst MODES: ReadonlySet<ThemeMode> = new Set(['light', 'dark', 'system']);\n\nfunction sanitizeMode(raw: string | undefined): ThemeMode {\n return MODES.has(raw as ThemeMode) ? (raw as ThemeMode) : 'system';\n}\n\n/**\n * Owns light/dark for the whole application: it persists the user's choice through the\n * the settings store, mirrors it across tabs, and toggles the `dark` class on `<html>` — which is what\n * flips the `--lw-*` token ladder every surface reads.\n *\n * Inject it when your own UI has to follow the same mode, most commonly to mirror it onto another\n * framework's switch (Bootstrap's `data-bs-theme`, for example) so the two never disagree:\n *\n * ```ts\n * const theme = inject(ThemeService);\n * effect(() => {\n * document.documentElement.setAttribute('data-bs-theme', theme.resolvedTheme());\n * });\n * ```\n */\n@Service()\nexport class ThemeService {\n private readonly document = inject(DOCUMENT);\n private readonly store = inject(SETTINGS_STORE);\n private readonly sync = inject(StateSyncService);\n private readonly systemDark = this.watchSystemPreference();\n\n private readonly modeState = signal<ThemeMode>(\n sanitizeMode(this.store.peek?.(STORAGE_KEY)),\n );\n\n /** The user's choice, including `system`. Use {@link resolvedTheme} to know what is rendered. */\n readonly mode = this.modeState.asReadonly();\n\n /** The mode in effect, with `system` already resolved against the OS preference. */\n readonly resolvedTheme: Signal<ResolvedTheme> = computed(() => {\n const mode = this.mode();\n return mode === 'dark' || (mode === 'system' && this.systemDark())\n ? 'dark'\n : 'light';\n });\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.modeState.set(sanitizeMode(raw)),\n );\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.modeState.set(sanitizeMode(raw)),\n );\n effect(() => {\n this.document.documentElement.classList.toggle(\n 'dark',\n this.resolvedTheme() === 'dark',\n );\n });\n }\n\n /** Switch the mode and persist it. Other tabs follow through the settings sync. */\n setMode(mode: ThemeMode): void {\n this.modeState.set(mode);\n void this.store.set(STORAGE_KEY, mode);\n }\n\n private watchSystemPreference() {\n const query = this.document.defaultView?.matchMedia?.(\n '(prefers-color-scheme: dark)',\n );\n const dark = signal(query?.matches ?? false);\n query?.addEventListener('change', (event) => dark.set(event.matches));\n return dark;\n }\n}\n","export const LW_TOKENS = [\n '--lw-brand',\n '--lw-brand-strong',\n '--lw-brand-text',\n '--lw-brand-fill',\n '--lw-on-brand',\n '--lw-accent',\n '--lw-accent-strong',\n '--lw-surface',\n '--lw-surface-raised',\n '--lw-surface-overlay',\n '--lw-field',\n '--lw-border',\n '--lw-content',\n '--lw-content-muted',\n '--lw-content-faint',\n '--lw-tooltip',\n '--lw-tooltip-content',\n '--lw-positive',\n '--lw-on-positive',\n '--lw-negative',\n '--lw-negative-fill',\n '--lw-on-negative',\n '--lw-caution',\n '--lw-on-caution',\n '--lw-info',\n '--lw-on-info',\n '--lw-scrim',\n '--lw-font-sans',\n '--lw-font-mono',\n] as const;\n\nexport type LwToken = (typeof LW_TOKENS)[number];\n\nconst known = new Set<string>(LW_TOKENS);\n\nexport function isKnownToken(name: string): boolean {\n return known.has(name);\n}\n\nexport interface ThemeRegistration {\n readonly pluginId: string;\n readonly tokens: Readonly<Record<string, string>>;\n readonly dark?: Readonly<Record<string, string>>;\n}\n\nfunction ownerByToken(\n registrations: readonly ThemeRegistration[],\n): Map<string, ThemeRegistration> {\n const owners = new Map<string, ThemeRegistration>();\n for (const registration of registrations) {\n const names = [\n ...Object.keys(registration.tokens),\n ...Object.keys(registration.dark ?? {}),\n ];\n for (const name of names) {\n if (!known.has(name) || owners.has(name)) {\n continue;\n }\n owners.set(name, registration);\n }\n }\n return owners;\n}\n\nfunction composeScheme(\n registrations: readonly ThemeRegistration[],\n pick: (\n registration: ThemeRegistration,\n ) => Readonly<Record<string, string>> | undefined,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [name, owner] of ownerByToken(registrations)) {\n const value = pick(owner)?.[name];\n if (value === undefined) {\n continue;\n }\n out[name] = value;\n }\n return out;\n}\n\nexport function composeTokens(\n registrations: readonly ThemeRegistration[],\n): Record<string, string> {\n return composeScheme(registrations, (registration) => registration.tokens);\n}\n\nexport function composeDarkTokens(\n registrations: readonly ThemeRegistration[],\n): Record<string, string> {\n return composeScheme(registrations, (registration) => registration.dark);\n}\n\ninterface LayerRules {\n readonly light: CSSStyleRule;\n readonly dark: CSSStyleRule;\n}\n\nconst registrations: ThemeRegistration[] = [];\nlet appliedLight: string[] = [];\nlet appliedDark: string[] = [];\nlet cachedRules: LayerRules | null | undefined;\n\nfunction pluginLayerRules(): LayerRules | null {\n if (cachedRules !== undefined) {\n return cachedRules;\n }\n cachedRules = createPluginLayerRules();\n return cachedRules;\n}\n\nfunction createPluginLayerRules(): LayerRules | null {\n if (typeof document === 'undefined') {\n return null;\n }\n const element = document.createElement('style');\n element.dataset['lwPluginTheme'] = '';\n document.head.appendChild(element);\n const sheet = element.sheet;\n if (!sheet) {\n return null;\n }\n try {\n const index = sheet.insertRule(\n '@layer lw-plugin-theme { :root {} :root.dark {} }',\n sheet.cssRules.length,\n );\n const layer = sheet.cssRules[index] as CSSLayerBlockRule;\n const light = layer.cssRules[0] as CSSStyleRule | undefined;\n const dark = layer.cssRules[1] as CSSStyleRule | undefined;\n if (!light || !dark) {\n return null;\n }\n return { light, dark };\n } catch {\n return null;\n }\n}\n\nfunction writeScheme(\n rule: CSSStyleRule,\n previous: readonly string[],\n composed: Record<string, string>,\n): string[] {\n const style = rule.style;\n for (const name of previous) {\n style.removeProperty(name);\n }\n for (const [name, value] of Object.entries(composed)) {\n style.setProperty(name, value);\n }\n return Object.keys(composed);\n}\n\nfunction apply(): void {\n const rules = pluginLayerRules();\n if (!rules) {\n return;\n }\n appliedLight = writeScheme(\n rules.light,\n appliedLight,\n composeTokens(registrations),\n );\n appliedDark = writeScheme(\n rules.dark,\n appliedDark,\n composeDarkTokens(registrations),\n );\n}\n\nexport function addThemeRegistration(registration: ThemeRegistration): void {\n registrations.push(registration);\n apply();\n}\n\nexport function removeThemeRegistration(registration: ThemeRegistration): void {\n const index = registrations.indexOf(registration);\n if (index === -1) {\n return;\n }\n registrations.splice(index, 1);\n apply();\n}\n","import { isDevMode, Service, signal } from '@angular/core';\nimport { Disposable } from '@loomweaver/plugin-sdk';\nimport {\n ThemeRegistration,\n addThemeRegistration,\n isKnownToken,\n removeThemeRegistration,\n} from './theme-registry-global';\n\n@Service()\nexport class ThemeRegistry {\n readonly version = signal(0);\n\n register(\n pluginId: string,\n tokens: Readonly<Record<string, string>>,\n dark?: Readonly<Record<string, string>>,\n ): Disposable {\n const registration: ThemeRegistration = {\n pluginId,\n tokens: this.keepKnownTokens(pluginId, tokens),\n dark: dark ? this.keepKnownTokens(pluginId, dark) : undefined,\n };\n addThemeRegistration(registration);\n this.bump();\n return {\n dispose: () => {\n removeThemeRegistration(registration);\n this.bump();\n },\n };\n }\n\n private keepKnownTokens(\n pluginId: string,\n tokens: Readonly<Record<string, string>>,\n ): Record<string, string> {\n const applied: Record<string, string> = {};\n for (const [name, value] of Object.entries(tokens)) {\n if (!isKnownToken(name)) {\n this.warn(\n `Plugin \"${pluginId}\" tried to contribute unknown theme token \"${name}\" — ignored. ` +\n `Only --lw-* tokens apply.`,\n );\n continue;\n }\n applied[name] = value;\n }\n return applied;\n }\n\n private bump(): void {\n this.version.update((value) => value + 1);\n }\n\n private warn(message: string): void {\n if (isDevMode()) {\n console.warn(message);\n }\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { effect, inject, Service, signal } from '@angular/core';\nimport { SETTINGS_STORE } from '../persistence/settings-store';\nimport { hydrateAsync } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\n\nexport type FontScale = 'sm' | 'md' | 'lg' | 'xl';\n\nconst STORAGE_KEY = 'lw.shell.font-scale';\nconst SCALES: ReadonlySet<FontScale> = new Set(['sm', 'md', 'lg', 'xl']);\nconst ROOT_SIZE: Record<Exclude<FontScale, 'md'>, string> = {\n sm: '90%',\n lg: '112.5%',\n xl: '125%',\n};\n\nfunction sanitizeScale(raw: string | undefined): FontScale {\n return SCALES.has(raw as FontScale) ? (raw as FontScale) : 'md';\n}\n\n@Service()\nexport class FontScaleService {\n private readonly document = inject(DOCUMENT);\n private readonly store = inject(SETTINGS_STORE);\n private readonly sync = inject(StateSyncService);\n\n private readonly scaleState = signal<FontScale>(\n sanitizeScale(this.store.peek?.(STORAGE_KEY)),\n );\n\n readonly scale = this.scaleState.asReadonly();\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.scaleState.set(sanitizeScale(raw)),\n );\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.scaleState.set(sanitizeScale(raw)),\n );\n effect(() => {\n const scale = this.scale();\n const root = this.document.documentElement.style;\n if (scale === 'md') {\n root.removeProperty('font-size');\n return;\n }\n root.fontSize = ROOT_SIZE[scale];\n });\n }\n\n setScale(scale: FontScale): void {\n this.scaleState.set(scale);\n void this.store.set(STORAGE_KEY, scale);\n }\n}\n","import {\n heroArrowPath,\n heroArrowDownTray,\n heroArrowUturnLeft,\n heroArrowsPointingIn,\n heroArrowsPointingOut,\n heroArrowsUpDown,\n heroArrowTopRightOnSquare,\n heroBars3,\n heroCheck,\n heroChevronDoubleLeft,\n heroChevronDoubleRight,\n heroChevronDown,\n heroCog6Tooth,\n heroComputerDesktop,\n heroDocument,\n heroEye,\n heroExclamationTriangle,\n heroInformationCircle,\n heroListBullet,\n heroLockClosed,\n heroMagnifyingGlass,\n heroMinus,\n heroMoon,\n heroPencilSquare,\n heroPlus,\n heroPuzzlePiece,\n heroQuestionMarkCircle,\n heroRectangleGroup,\n heroSun,\n heroTrash,\n heroXCircle,\n heroXMark,\n} from '@ng-icons/heroicons/outline';\n\nexport const LOOM_ICONS = {\n themeLight: heroSun,\n themeDark: heroMoon,\n themeSystem: heroComputerDesktop,\n chevronsLeft: heroChevronDoubleLeft,\n chevronsRight: heroChevronDoubleRight,\n chevronDown: heroChevronDown,\n check: heroCheck,\n close: heroXMark,\n\n pin: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8 4h8M10.5 4v7M13.5 4v7M7 11h10M12 11v9\"/></svg>',\n\n save: '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M17 3.75H5.25a1.5 1.5 0 0 0-1.5 1.5v13.5a1.5 1.5 0 0 0 1.5 1.5h13.5a1.5 1.5 0 0 0 1.5-1.5V7l-3.25-3.25Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 3.75v4.5h6.5v-4.5M7.75 20.25v-7h8.5v7\"/></svg>',\n\n splitPanes:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4 5.25h16a.75.75 0 0 1 .75.75v12a.75.75 0 0 1-.75.75H4a.75.75 0 0 1-.75-.75V6a.75.75 0 0 1 .75-.75ZM12 5.25v13.5\"/></svg>',\n\n splitPanesDown:\n '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4 5.25h16a.75.75 0 0 1 .75.75v12a.75.75 0 0 1-.75.75H4a.75.75 0 0 1-.75-.75V6a.75.75 0 0 1 .75-.75ZM3.25 12h17.5\"/></svg>',\n\n workspaces: heroRectangleGroup,\n\n menu: heroBars3,\n document: heroDocument,\n navigator: heroBars3,\n outline: heroListBullet,\n add: heroPlus,\n edit: heroPencilSquare,\n trash: heroTrash,\n preview: heroEye,\n sort: heroArrowsUpDown,\n reset: heroArrowPath,\n undo: heroArrowUturnLeft,\n info: heroInformationCircle,\n lock: heroLockClosed,\n success: heroCheck,\n warning: heroExclamationTriangle,\n error: heroXCircle,\n settings: heroCog6Tooth,\n help: heroQuestionMarkCircle,\n search: heroMagnifyingGlass,\n plugin: heroPuzzlePiece,\n download: heroArrowDownTray,\n maximize: heroArrowsPointingOut,\n popout: heroArrowTopRightOnSquare,\n restore: heroArrowsPointingIn,\n minimize: heroMinus,\n} as const;\n\n/** The names the shell ships. Naming one in `provideIcons` replaces that glyph app-wide. */\nexport type LoomIconName = keyof typeof LOOM_ICONS;\n","import DOMPurify from 'dompurify';\nimport { LOOM_ICONS } from './loom-icons';\n\nconst icons = new Map<string, string>(Object.entries(LOOM_ICONS));\nconst distribution = new Map<string, string>();\n\nexport function resolveIcon(name: string): string | undefined {\n return icons.get(name);\n}\n\nexport function hasIcon(name: string): boolean {\n return icons.has(name);\n}\n\nexport function sanitizeIconSvg(svg: string): string {\n return DOMPurify.sanitize(svg, {\n USE_PROFILES: { svg: true, svgFilters: true },\n });\n}\n\nexport function setIcon(name: string, svg: string): void {\n icons.set(name, svg);\n}\n\nexport function setDistributionIcon(name: string, svg: string): void {\n distribution.set(name, svg);\n icons.set(name, svg);\n}\n\nexport function distributionIcons(): Readonly<Record<string, string>> {\n return Object.fromEntries(distribution);\n}\n\nexport function removeIcon(name: string): void {\n icons.delete(name);\n}\n","import { InjectionToken, Provider, isDevMode } from '@angular/core';\nimport { Capability } from '@loomweaver/plugin-sdk';\n\n/** Capabilities granted per plugin id. A missing id means \"no grant\" → default-deny. */\nexport type CapabilityGrants = Readonly<Record<string, readonly Capability[]>>;\n\n/**\n * The active capability grants. Defaults to **empty** (default-deny — no plugin can do anything\n * until granted). A distribution overrides it via {@link provideCapabilityGrants}; a product can\n * later feed per-tenant grants from its own backend behind the same seam.\n */\nexport const CAPABILITY_GRANTS = new InjectionToken<CapabilityGrants>(\n 'CAPABILITY_GRANTS',\n {\n providedIn: 'root',\n factory: () => ({}),\n },\n);\n\n/**\n * A distribution declares which plugin gets which capabilities. The composition root is the\n * authoritative grant source — the honest default-deny model, dogfooded by the first-party plugin\n * like a third-party one would be. A product backend can replace it behind the same seam.\n */\nexport function provideCapabilityGrants(grants: CapabilityGrants): Provider {\n return { provide: CAPABILITY_GRANTS, useValue: grants };\n}\n\n/**\n * The effective capability set for one plugin: what the distribution granted, **intersected** with\n * what the plugin declares (\"plugin declares, distribution grants\"). A grant for an\n * undeclared capability is inert, so least privilege holds in both directions; dev mode flags the\n * mismatch so the composition stays honest. A plugin without a declaration keeps its grants as-is\n * (declaring is optional today; the manifest schema hardens this later).\n */\nexport function effectiveCapabilities(\n pluginId: string,\n granted: readonly Capability[] | undefined,\n declared: readonly Capability[] | undefined,\n): ReadonlySet<Capability> {\n const grants = granted ?? [];\n if (declared === undefined) {\n return new Set(grants);\n }\n const declaredSet = new Set(declared);\n const undeclared = grants.filter(\n (capability) => !declaredSet.has(capability),\n );\n if (undeclared.length > 0 && isDevMode()) {\n console.warn(\n `Plugin \"${pluginId}\" was granted capabilities it does not declare: ` +\n `${undeclared.join(', ')} — ignored (effective = grant ∩ declaration).`,\n );\n }\n return new Set(grants.filter((capability) => declaredSet.has(capability)));\n}\n","export function toggledIdSet(\n set: ReadonlySet<string>,\n id: string,\n include: boolean,\n): Set<string> {\n const next = new Set(set);\n if (include) {\n next.add(id);\n } else {\n next.delete(id);\n }\n return next;\n}\n\nexport function parseIdSet(raw: string | undefined): ReadonlySet<string> {\n if (!raw) {\n return new Set();\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed)\n ? new Set(\n parsed.filter((entry): entry is string => typeof entry === 'string'),\n )\n : new Set();\n } catch {\n return new Set();\n }\n}\n","import { computed, inject, Service, signal } from '@angular/core';\nimport { CAPABILITIES, Capability } from '@loomweaver/plugin-sdk';\nimport { SETTINGS_STORE } from '../persistence/settings-store';\nimport { hydrateAsync } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\nimport { CAPABILITY_GRANTS, effectiveCapabilities } from './capability-grants';\nimport { parseIdSet, toggledIdSet } from '../persistence/persisted-id-set';\n\nconst STORAGE_KEY = 'lw.shell.capability-revocations';\n\nconst REVOCABLE: readonly Capability[] = CAPABILITIES.filter(\n (capability) => capability !== 'contributions',\n);\n\n/** One capability as shown in the permissions surface: whether the user currently keeps it on. */\nexport interface PluginCapabilityState {\n readonly capability: Capability;\n readonly effective: boolean;\n}\n\n/** A plugin and the base-granted capabilities the user can manage for it. */\nexport interface PluginPermissions {\n readonly pluginId: string;\n readonly capabilities: readonly PluginCapabilityState[];\n}\n\nfunction revocationKey(pluginId: string, capability: Capability): string {\n return `${pluginId}:${capability}`;\n}\n\nfunction parseRevocations(raw: string | undefined): ReadonlySet<string> {\n return new Set(\n [...parseIdSet(raw)].filter((key) =>\n REVOCABLE.some((capability) => key.endsWith(`:${capability}`)),\n ),\n );\n}\n\n/**\n * The live capability broker. The distribution's static grants (the platform ships no server, so\n * the composition root — later a per-tenant backend behind the same seam —\n * is the grant source) form each plugin's **base** set (grant ∩ declaration). On top of that the user can\n * **revoke** a granted capability at runtime; the decision is user-local and persisted through the\n * {@link SETTINGS_STORE}, exactly like the rest of the chrome state. Enforcement in\n * {@link HostPluginContext} consults {@link isGranted} on every `ctx` call, so a revocation takes effect\n * on the plugin's next call without a reload — the honest default-deny model made transparent and\n * user-controllable (a \"Permissions\" settings surface), never wider than the distribution allowed.\n */\n@Service()\nexport class CapabilityGrantService {\n private readonly store = inject(SETTINGS_STORE);\n\n private readonly sync = inject(StateSyncService);\n\n private readonly grants = inject(CAPABILITY_GRANTS);\n\n private readonly revoked = signal<ReadonlySet<string>>(\n parseRevocations(this.store.peek?.(STORAGE_KEY)),\n );\n\n private readonly bases = signal<ReadonlyMap<string, ReadonlySet<Capability>>>(\n new Map(),\n );\n\n /** The plugins and their base-granted capabilities, for the permissions settings surface. */\n readonly permissions = computed<readonly PluginPermissions[]>(() => {\n const bases = this.bases();\n const revoked = this.revoked();\n return [...bases.entries()]\n .map(([pluginId, base]) => ({\n pluginId,\n capabilities: REVOCABLE.filter((capability) =>\n base.has(capability),\n ).map((capability) => ({\n capability,\n effective: !revoked.has(revocationKey(pluginId, capability)),\n })),\n }))\n .filter((entry) => entry.capabilities.length > 0)\n .sort((a, b) => a.pluginId.localeCompare(b.pluginId));\n });\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.revoked.set(parseRevocations(raw)),\n );\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.revoked.set(parseRevocations(raw)),\n );\n }\n\n /**\n * Records a plugin's base grant (grant ∩ declaration) so enforcement and the permissions surface know\n * about it. A runtime calls this once when it activates a plugin. `granted` overrides the\n * distribution's static grant source — used for user-installed plugins, whose grant is the user's\n * install consent instead of the composition root.\n */\n register(\n pluginId: string,\n declared: readonly Capability[] | undefined,\n granted?: readonly Capability[],\n ): void {\n const base = effectiveCapabilities(\n pluginId,\n granted ?? this.grants[pluginId],\n declared,\n );\n this.bases.update((map) => new Map(map).set(pluginId, base));\n }\n\n /** Drops a plugin from the permissions surface (its runtime deactivated it). Idempotent. */\n unregister(pluginId: string): void {\n this.bases.update((map) => {\n if (!map.has(pluginId)) {\n return map;\n }\n const next = new Map(map);\n next.delete(pluginId);\n return next;\n });\n }\n\n /** Whether `pluginId` may use `capability` right now: base-granted and not user-revoked. */\n isGranted(pluginId: string, capability: Capability): boolean {\n return (\n this.isBaseGranted(pluginId, capability) &&\n !this.revoked().has(revocationKey(pluginId, capability))\n );\n }\n\n /**\n * Whether the distribution granted `capability` to `pluginId` (grant ∩ declaration), **ignoring** any\n * user revocation. Used only while a plugin activates — a revocation must not stop it from loading and\n * registering its contributions; it applies to the plugin's runtime `ctx` calls afterwards.\n */\n isBaseGranted(pluginId: string, capability: Capability): boolean {\n return Boolean(this.bases().get(pluginId)?.has(capability));\n }\n\n /** Turns a base-granted capability on or off for a plugin (user revoke / restore). Persisted. */\n setGranted(pluginId: string, capability: Capability, granted: boolean): void {\n const next = toggledIdSet(\n this.revoked(),\n revocationKey(pluginId, capability),\n !granted,\n );\n this.revoked.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify([...next]));\n }\n}\n","import { InjectionToken, Service, signal } from '@angular/core';\n\n/**\n * How much the browser holds a frame plugin back. **Isolated** strips the frame of an origin, which\n * is what denies it the hosting document, any storage and any session the browser would carry for\n * it. **Embedded** lets it keep an origin, and with it whatever the browser grants that origin — a\n * separation of deployments rather than of privileges.\n *\n * Isolated is the default: a plugin whose level was never stated runs isolated.\n */\nexport type PluginIsolationLevel = 'isolated' | 'embedded';\n\nexport const DEFAULT_ISOLATION_LEVEL: PluginIsolationLevel = 'isolated';\n\nexport type PluginRung = 'trusted' | PluginIsolationLevel;\n\nexport const CATALOG_MAX_ISOLATION_LEVEL = new InjectionToken<PluginIsolationLevel>(\n 'lw.catalog-max-isolation-level',\n { providedIn: 'root', factory: () => DEFAULT_ISOLATION_LEVEL },\n);\n\nexport function exceedsLevel(\n asked: PluginIsolationLevel,\n cap: PluginIsolationLevel,\n): boolean {\n return asked === 'embedded' && cap === 'isolated';\n}\n\n@Service()\nexport class PluginIsolationLevelService {\n private readonly levels = signal<ReadonlyMap<string, PluginIsolationLevel>>(\n new Map(),\n );\n\n register(pluginId: string, level: PluginIsolationLevel): void {\n const next = new Map(this.levels());\n next.set(pluginId, level);\n this.levels.set(next);\n }\n\n unregister(pluginId: string): void {\n if (!this.levels().has(pluginId)) {\n return;\n }\n const next = new Map(this.levels());\n next.delete(pluginId);\n this.levels.set(next);\n }\n\n levelOf(pluginId: string | undefined): PluginIsolationLevel {\n if (pluginId === undefined) {\n return DEFAULT_ISOLATION_LEVEL;\n }\n return this.levels().get(pluginId) ?? DEFAULT_ISOLATION_LEVEL;\n }\n\n rungOf(pluginId: string): PluginRung {\n return this.levels().get(pluginId) ?? 'trusted';\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Component, DestroyRef, ElementRef, afterNextRender, isDevMode, computed, effect, inject, Injector, signal, viewChild } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { DirtySurface } from '@loomweaver/plugin-sdk';\nimport { Connection, Methods, WindowMessenger, connect } from 'penpal';\nimport { StateHandle } from '@loomweaver/plugin-sdk';\nimport { LocaleService } from '../../i18n/locale.service';\nimport { PluginStateService } from '../../plugin/plugin-state.service';\nimport { ThemeService } from '../../theme/theme.service';\nimport { ThemeRegistry } from '../../theme/theme-registry';\nimport { FontScaleService } from '../../text-size/font-scale.service';\nimport { LW_TOKENS } from '../../theme/theme-registry-global';\nimport { distributionIcons } from '../../elements/icon/icon-registry-global';\nimport { AuthContext } from '../../auth/auth-context';\nimport { CapabilityGrantService } from '../../permissions/capability-grant.service';\nimport { PluginIsolationLevelService } from '../../foundation/plugin-isolation-level';\nimport { ContentTabsService } from './tabs/content-tabs.service';\nimport { normalizePath, restBelow, suffixOf } from './content-path';\n\ninterface SurfaceState {\n readonly locale: string;\n readonly tab: string;\n readonly theme: 'light' | 'dark';\n readonly preview: boolean;\n readonly shown: boolean;\n readonly tokens: Record<string, string>;\n readonly rootFontSize: string;\n readonly icons?: Record<string, string>;\n readonly instanceId?: string;\n readonly params?: Record<string, string>;\n readonly rest?: string;\n readonly session?: {\n readonly authenticated: boolean;\n readonly roles: readonly string[];\n };\n}\n\ntype SurfaceRemote = Methods & {\n render(state: SurfaceState): Promise<void>;\n beforeClose(): Promise<boolean> | boolean;\n stateChanged(key: string, value: unknown, loaded: boolean): void;\n};\n\ninterface WatchedKey {\n readonly handle: StateHandle;\n readonly stop: () => void;\n}\n\n@Component({\n selector: 'lw-iframe-surface',\n imports: [TranslocoPipe],\n templateUrl: './iframe-surface.html',\n})\nexport class IframeSurface implements DirtySurface {\n private readonly route = inject(ActivatedRoute);\n\n private readonly router = inject(Router);\n\n private readonly locale = inject(LocaleService);\n\n private readonly theme = inject(ThemeService);\n\n private readonly auth = inject(AuthContext);\n\n private readonly grants = inject(CapabilityGrantService);\n\n private readonly isolation = inject(PluginIsolationLevelService);\n\n private readonly tabs = inject(ContentTabsService);\n\n private readonly themes = inject(ThemeRegistry);\n\n private readonly fontScale = inject(FontScaleService);\n\n private readonly document = inject(DOCUMENT);\n\n private readonly pluginState = inject(PluginStateService);\n\n private readonly injector = inject(Injector);\n\n private readonly watched = new Map<string, WatchedKey>();\n\n private readonly frame =\n viewChild.required<ElementRef<HTMLIFrameElement>>('frame');\n\n private readonly host: Element = inject(ElementRef).nativeElement;\n\n protected readonly src: SafeResourceUrl = inject(\n DomSanitizer,\n ).bypassSecurityTrustResourceUrl(\n this.route.snapshot.data['iframe'] as string,\n );\n\n private readonly pluginId = this.route.snapshot.data['pluginId'] as\n string | undefined;\n\n protected readonly isolated =\n this.isolation.levelOf(this.pluginId) === 'isolated';\n\n private readonly sessionGranted = computed(() => {\n const owner = this.pluginId;\n return owner !== undefined && this.grants.isGranted(owner, 'session');\n });\n\n private readonly hostMounted = this.route.snapshot.data['urlDriven'] !== true;\n\n private readonly docked = this.route.snapshot.data['docked'] === true;\n\n private readonly instanceId = this.route.snapshot.data['instanceId'] as\n string | undefined;\n\n private readonly routeParams = this.route.snapshot.params as Record<\n string,\n string\n >;\n\n private readonly ownsRest = this.route.snapshot.data['rest'] === true;\n\n private readonly hostSub = signal<string>(\n String(this.route.snapshot.data['sub'] ?? ''),\n );\n\n private readonly tabRoot = this.route.snapshot.pathFromRoot\n .flatMap((route) => route.url.map((segment) => segment.path))\n .join('/');\n\n private readonly currentUrl = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(() => this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n private readonly activeTab = computed(() => {\n if (this.hostMounted) {\n return normalizePath(this.hostSub());\n }\n return restBelow(this.tabRoot, normalizePath(this.currentUrl()));\n });\n\n private readonly restPath = computed(() => {\n if (!this.ownsRest) {\n return undefined;\n }\n return this.hostMounted\n ? this.hostSub()\n : restBelow(this.tabRoot, this.currentUrl());\n });\n\n private connection?: Connection<SurfaceRemote>;\n\n private remote?: SurfaceRemote;\n\n private readonly dirty = signal(false);\n\n private readonly isPreview = computed(() =>\n this.hostMounted\n ? false\n : (this.tabs.tabs().find((tab) => tab.path === this.tabRoot)?.preview ??\n false),\n );\n\n private readonly shown = signal(true);\n\n private visibility?: IntersectionObserver;\n\n constructor() {\n afterNextRender(() => {\n this.connect();\n this.watchVisibility();\n });\n\n effect(() => {\n const snapshot = this.reactiveState();\n this.themes.version();\n this.fontScale.scale();\n queueMicrotask(() => this.push({ ...snapshot, ...this.readResolved() }));\n });\n inject(DestroyRef).onDestroy(() => {\n this.watched.forEach((entry) => entry.stop());\n this.watched.clear();\n this.visibility?.disconnect();\n this.connection?.destroy();\n });\n }\n\n surfaceDirty(): boolean {\n return this.dirty();\n }\n\n surfaceBeforeClose(): boolean | Promise<boolean> {\n const hook = this.remote?.beforeClose;\n if (typeof hook !== 'function') {\n return true;\n }\n return Promise.resolve()\n .then(() => hook())\n .then(\n (approved) => approved !== false,\n () => true,\n );\n }\n\n private connect(): void {\n const remoteWindow = this.frame().nativeElement.contentWindow;\n if (!remoteWindow) {\n return;\n }\n\n const messenger = new WindowMessenger({\n remoteWindow,\n allowedOrigins: ['*'],\n });\n this.connection = connect<SurfaceRemote>({\n messenger,\n methods: {\n navigate: (path: string) => this.navigateWithinTabRoot(path),\n keep: () => {\n if (!this.hostMounted) {\n this.tabs.keep(this.tabRoot);\n }\n },\n setDirty: (dirty: boolean) => this.dirty.set(dirty === true),\n stateWatch: (key: string) => this.watchState(String(key)),\n stateSet: (key: string, value: unknown) =>\n this.watched.get(String(key))?.handle.set(value),\n stateClear: (key: string) =>\n this.watched.get(String(key))?.handle.clear(),\n stateUnwatch: (key: string) => {\n const name = String(key);\n this.watched.get(name)?.stop();\n this.watched.delete(name);\n },\n },\n });\n this.connection.promise\n .then((remote) => {\n this.remote = remote;\n this.push({ ...this.reactiveState(), ...this.readResolved() });\n this.watched.forEach((entry, key) =>\n this.pushState(key, entry.handle.value(), entry.handle.loaded()),\n );\n })\n .catch(() => undefined);\n }\n\n private watchState(key: string): void {\n const owner = this.pluginId;\n if (owner === undefined || this.watched.has(key)) {\n return;\n }\n const handle = this.pluginState.facade(owner).watch(key);\n const ref = effect(\n () => {\n const value = handle.value();\n const loaded = handle.loaded();\n queueMicrotask(() => this.pushState(key, value, loaded));\n },\n { injector: this.injector },\n );\n this.watched.set(key, {\n handle,\n stop: () => {\n ref.destroy();\n handle.dispose();\n },\n });\n }\n\n private pushState(key: string, value: unknown, loaded: boolean): void {\n try {\n this.remote?.stateChanged(key, value, loaded);\n } catch {\n this.remote = undefined;\n }\n }\n\n private watchVisibility(): void {\n if (typeof IntersectionObserver === 'undefined') {\n return;\n }\n this.visibility = new IntersectionObserver((entries) => {\n const last = entries[entries.length - 1];\n if (last) {\n this.shown.set(last.isIntersecting);\n }\n });\n this.visibility.observe(this.host);\n }\n\n private push(state: SurfaceState): void {\n try {\n this.remote?.render(state).catch(() => undefined);\n } catch {\n this.remote = undefined;\n }\n }\n\n private reactiveState(): Omit<SurfaceState, 'tokens' | 'rootFontSize'> {\n const rest = this.restPath();\n return {\n locale: this.locale.lang(),\n tab: this.activeTab(),\n theme: this.theme.resolvedTheme(),\n preview: this.isPreview(),\n shown: this.shown(),\n ...(this.instanceId ? { instanceId: this.instanceId } : {}),\n ...(Object.keys(this.routeParams).length > 0\n ? { params: this.routeParams }\n : {}),\n ...(rest === undefined ? {} : { rest }),\n ...(this.sessionGranted()\n ? {\n session: {\n authenticated: this.auth.authenticated(),\n roles: this.auth.roles(),\n },\n }\n : {}),\n };\n }\n\n private readResolved(): Pick<\n SurfaceState,\n 'tokens' | 'rootFontSize' | 'icons'\n > {\n const styles = getComputedStyle(this.document.documentElement);\n const tokens: Record<string, string> = {};\n for (const name of LW_TOKENS) {\n tokens[name] = styles.getPropertyValue(name).trim();\n }\n const icons = distributionIcons();\n return {\n tokens,\n rootFontSize: styles.fontSize,\n ...(Object.keys(icons).length > 0 ? { icons } : {}),\n };\n }\n\n private navigateWithinTabRoot(path: string): void {\n if (this.docked) {\n if (isDevMode()) {\n console.warn(\n `[loom] a docked surface asked to navigate to \"${String(path)}\" — ignored. ` +\n `A docked surface has no address of its own; the channel's navigate is confined to a tab ` +\n `root and there is none. Use ctx.navigateContent (the 'navigation' grant) instead.`,\n );\n }\n return;\n }\n const raw = String(path);\n const suffix = suffixOf(raw);\n const target = normalizePath(raw);\n if (target !== this.tabRoot && !target.startsWith(this.tabRoot + '/')) {\n throw new Error(\n `Surface navigation is confined to its own tab root \"${this.tabRoot}\" — got \"${target}\". ` +\n `Use the plugin (logic) channel's ctx.navigateContent for anything else ('navigation' grant).`,\n );\n }\n if (this.hostMounted) {\n this.hostSub.set(restBelow(this.tabRoot, raw));\n return;\n }\n this.tabs.navigateTo(target + suffix);\n }\n}\n","@if (isolated) {\n <iframe\n #frame\n class=\"h-full w-full border-0\"\n [src]=\"src\"\n sandbox=\"allow-scripts\"\n [title]=\"'content.pluginSurface' | transloco\"\n ></iframe>\n} @else {\n <iframe\n #frame\n class=\"h-full w-full border-0\"\n [src]=\"src\"\n [title]=\"'content.pluginSurface' | transloco\"\n ></iframe>\n}\n","import { ActivatedRoute, UrlSegment, convertToParamMap } from '@angular/router';\nimport { of } from 'rxjs';\nimport { paramsOfPattern, segmentsOf } from '../content-path';\nimport {\n RegisteredContentRoute,\n RegisteredView,\n} from '../../../plugin/contribution-registry';\n\ninterface SyntheticRouteInput {\n readonly url: UrlSegment[];\n readonly params: Record<string, string>;\n readonly data: Record<string, unknown>;\n}\n\nfunction buildSyntheticRoute({\n url,\n params,\n data,\n}: SyntheticRouteInput): ActivatedRoute {\n const paramMap = convertToParamMap(params);\n const emptyMap = convertToParamMap({});\n const snapshot: Record<string, unknown> = {\n url,\n params,\n paramMap,\n queryParams: {},\n queryParamMap: emptyMap,\n fragment: null,\n data,\n outlet: 'primary',\n component: null,\n routeConfig: null,\n title: undefined,\n parent: null,\n firstChild: null,\n children: [],\n };\n snapshot['pathFromRoot'] = [snapshot];\n snapshot['root'] = snapshot;\n return {\n snapshot,\n url: of(url),\n params: of(params),\n paramMap: of(paramMap),\n queryParams: of({}),\n queryParamMap: of(emptyMap),\n fragment: of(null),\n data: of(data),\n title: of(undefined),\n outlet: 'primary',\n component: null,\n routeConfig: null,\n parent: null,\n firstChild: null,\n children: [],\n pathFromRoot: [],\n } as unknown as ActivatedRoute;\n}\n\nexport function syntheticParamRoute(\n params: Record<string, string>,\n): ActivatedRoute {\n return buildSyntheticRoute({ url: [], params, data: {} });\n}\n\nexport interface SyntheticRouteOptions {\n readonly urlDriven?: boolean;\n readonly instanceId?: string;\n}\n\nexport function syntheticDockedRoute(\n view: RegisteredView,\n instanceId: string,\n params: Record<string, string> = {},\n): ActivatedRoute {\n return buildSyntheticRoute({\n url: [],\n params,\n data: {\n ...(view.iframe !== undefined ? { iframe: view.iframe } : {}),\n ...(view.pluginId ? { pluginId: view.pluginId } : {}),\n docked: true,\n instanceId,\n },\n });\n}\n\nexport function syntheticRouteFor(\n route: RegisteredContentRoute,\n path: string,\n options: SyntheticRouteOptions = {},\n): ActivatedRoute {\n const pattern = segmentsOf(route.path);\n const allSegments = segmentsOf(path);\n const segments = allSegments.slice(0, pattern.length);\n const sub = allSegments.slice(pattern.length).join('/');\n const params = paramsOfPattern(route.path, path);\n return buildSyntheticRoute({\n url: segments.map((segment) => new UrlSegment(segment, {})),\n params,\n data: {\n ...('iframe' in route ? { iframe: route.iframe } : {}),\n ...('container' in route ? { container: route.container } : {}),\n ...(route.pluginId ? { pluginId: route.pluginId } : {}),\n ...(route.rest === true ? { rest: true } : {}),\n ...(sub ? { sub } : {}),\n ...(options.urlDriven ? { urlDriven: true } : {}),\n ...(options.instanceId ? { instanceId: options.instanceId } : {}),\n },\n });\n}\n","import { EnvironmentInjector, Injector } from '@angular/core';\nimport { ActivatedRoute, ChildrenOutletContexts } from '@angular/router';\nimport {\n RegisteredContentRoute,\n RegisteredView,\n} from '../../../plugin/contribution-registry';\nimport {\n SyntheticRouteOptions,\n syntheticDockedRoute,\n syntheticRouteFor,\n} from './synthetic-route';\n\nexport type SurfaceInjectorFactory = (\n route: RegisteredContentRoute,\n path: string,\n instanceId?: string,\n) => Injector;\n\nexport function surfaceInjectorFactory(\n parent: Injector,\n environmentInjector: EnvironmentInjector,\n options?: SyntheticRouteOptions,\n): SurfaceInjectorFactory {\n const cache = new Map<RegisteredContentRoute, Map<string, Injector>>();\n return (route, path, instanceId) => {\n let byPath = cache.get(route);\n if (!byPath) {\n byPath = new Map();\n cache.set(route, byPath);\n }\n const key = `${path}|${instanceId ?? ''}`;\n const cached = byPath.get(key);\n if (cached) {\n return cached;\n }\n const injector = Injector.create({\n parent,\n providers: [\n {\n provide: ActivatedRoute,\n useValue: syntheticRouteFor(route, path, { ...options, instanceId }),\n },\n {\n provide: ChildrenOutletContexts,\n useValue: new ChildrenOutletContexts(environmentInjector),\n },\n ],\n });\n byPath.set(key, injector);\n return injector;\n };\n}\n\nexport type DockedSurfaceInjectorFactory = (\n view: RegisteredView,\n instanceId: string,\n params?: Record<string, string>,\n) => Injector;\n\nexport function dockedSurfaceInjectorFactory(\n parent: Injector,\n environmentInjector: EnvironmentInjector,\n): DockedSurfaceInjectorFactory {\n const cache = new Map<string, Injector>();\n return (view, instanceId, params) => {\n const key = `${view.id}|${instanceId}`;\n const cached = cache.get(key);\n if (cached) {\n return cached;\n }\n const injector = Injector.create({\n parent,\n providers: [\n {\n provide: ActivatedRoute,\n useValue: syntheticDockedRoute(view, instanceId, params),\n },\n {\n provide: ChildrenOutletContexts,\n useValue: new ChildrenOutletContexts(environmentInjector),\n },\n ],\n });\n cache.set(key, injector);\n return injector;\n };\n}\n","import {\n Directive,\n ElementRef,\n EmbeddedViewRef,\n EnvironmentInjector,\n Injector,\n OnChanges,\n OnDestroy,\n Type,\n createComponent,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport { moveNode } from './atomic-move';\nimport { RetainedSlot } from './retained-view-model';\nimport { RetainedViewStash } from './retained-view-stash';\nimport { SurfaceRetentionMode } from './retention-policy';\n\ninterface MountedComponent {\n readonly key: string;\n readonly component: Type<unknown>;\n readonly injector: Injector;\n readonly slot: RetainedSlot;\n mode: SurfaceRetentionMode;\n retain: boolean;\n}\n\n@Directive({ selector: '[lwRetainedComponent]' })\nexport class RetainedComponent implements OnChanges, OnDestroy {\n readonly lwRetainedComponent = input.required<Type<unknown> | null>();\n readonly componentInjector = input.required<Injector | null>();\n readonly retentionKey = input.required<string>();\n readonly mode = input<SurfaceRetentionMode>('move');\n readonly retain = input<boolean>(false);\n\n private readonly stash = inject(RetainedViewStash);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly anchor: Node = inject(ElementRef).nativeElement;\n\n private mounted: MountedComponent | null = null;\n\n constructor() {\n effect(() => {\n this.stash.version();\n if (this.mounted?.slot.stale() !== true) {\n return;\n }\n untracked(() => {\n this.park();\n this.sync();\n });\n });\n }\n\n ngOnChanges(): void {\n this.sync();\n }\n\n ngOnDestroy(): void {\n this.park();\n }\n\n private sync(): void {\n const key = this.retentionKey();\n const component = this.lwRetainedComponent();\n const injector = this.componentInjector();\n const mounted = this.mounted;\n if (mounted && component !== null && mounted.key === key) {\n if (mounted.component === component && mounted.injector === injector) {\n mounted.mode = this.mode();\n mounted.retain = this.retain();\n mounted.slot.describe(mounted.mode, mounted.retain);\n return;\n }\n this.mounted = null;\n mounted.slot.discard();\n } else {\n this.park();\n }\n if (component === null || injector === null) {\n return;\n }\n const slot = this.stash.acquire(\n key,\n component,\n () => {\n const componentRef = createComponent(component, {\n environmentInjector: this.environmentInjector,\n elementInjector: injector,\n });\n return {\n view: componentRef.hostView as EmbeddedViewRef<unknown>,\n instance: componentRef.instance,\n };\n },\n this.anchor.parentNode,\n );\n if (!slot.attached) {\n this.place(slot.rootNodes);\n }\n this.mounted = {\n key,\n component,\n injector,\n slot,\n mode: this.mode(),\n retain: this.retain(),\n };\n slot.describe(this.mounted.mode, this.mounted.retain);\n }\n\n private park(): void {\n const mounted = this.mounted;\n this.mounted = null;\n if (!mounted) {\n return;\n }\n if (mounted.mode === 'move') {\n mounted.slot.release(mounted.retain);\n return;\n }\n if (mounted.mode === 'in-place') {\n mounted.slot.hide(mounted.retain);\n return;\n }\n mounted.slot.discard();\n }\n\n private place(nodes: readonly Node[]): void {\n const parent = this.anchor.parentNode;\n if (!parent) {\n return;\n }\n for (const node of nodes) {\n moveNode(parent, node, this.anchor);\n }\n }\n}\n","import { Component, EnvironmentInjector, Injector, Type, computed, inject, input, output } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { CONTAINER_HANDLE, ContentRoute } from '@loomweaver/plugin-sdk';\nimport { View } from '../../layout/view';\nimport {\n ContributionRegistry,\n RegisteredView,\n} from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { DOCUMENT } from '@angular/common';\nimport { ViewMountService } from '../../views/view-mount.service';\nimport { ViewInstanceSwitcher } from '../../views/view-instance-switcher';\nimport { ComponentLoader } from '../../views/component-loader.service';\nimport { isPopoutUrl } from '../../popout/popout-path';\nimport { AuthRequiredView } from './access/auth-required-view';\nimport { RouteUnavailableView } from './access/route-unavailable-view';\nimport { IframeSurface } from './iframe-surface';\nimport {\n CONTAINER_CONTEXT,\n CONTAINER_PANE_HOST,\n} from '../pane/container/container-context';\nimport { syntheticParamRoute } from './routing/synthetic-route';\nimport {\n dockedSurfaceInjectorFactory,\n surfaceInjectorFactory,\n} from './routing/surface-injector';\nimport {\n containerChildForPath,\n surfaceForPanePath,\n} from '../pane/pane-surface';\nimport { paramsOfPattern } from './content-path';\nimport { RetainedComponent } from '../pane/retention/retained-component';\nimport {\n retainSurfacePath,\n SURFACE_RETENTION,\n surfaceRetentionKey,\n surfaceRetentionMode,\n viewRetentionKey,\n} from '../pane/retention/retention-policy';\n\n@Component({\n selector: 'lw-content-secondary-pane',\n imports: [\n AuthRequiredView,\n NgTemplateOutlet,\n RetainedComponent,\n RouteUnavailableView,\n TranslocoPipe,\n ViewInstanceSwitcher,\n ],\n templateUrl: './content-secondary-pane.html',\n host: { '[class]': 'hostClass()' },\n})\nexport class ContentSecondaryPane {\n readonly path = input.required<string>();\n\n readonly variant = input<'content' | 'panel'>('content');\n\n readonly instanceId = input<string | undefined>(undefined);\n\n readonly retentionScope = input<string>('');\n\n readonly instanceReleased = output<void>();\n\n private readonly registry = inject(ContributionRegistry);\n private readonly viewMount = inject(ViewMountService);\n private readonly componentLoader = inject(ComponentLoader);\n private readonly auth = inject(AuthContext);\n private readonly injector = inject(Injector);\n private readonly environmentInjector = inject(EnvironmentInjector);\n\n private readonly paramInjectors = new Map<string, Injector>();\n private readonly injectorFor = surfaceInjectorFactory(\n this.injector,\n this.environmentInjector,\n );\n private readonly dockedInjectorFor = dockedSurfaceInjectorFactory(\n this.injector,\n this.environmentInjector,\n );\n\n protected readonly iframeComponent = IframeSurface;\n private readonly containerCtx = inject(CONTAINER_CONTEXT);\n private readonly containerHost = inject(CONTAINER_PANE_HOST, {\n optional: true,\n });\n\n private readonly declared = computed(\n () =>\n surfaceForPanePath(\n this.registry.contentRoutes(),\n this.registry.views(),\n this.path(),\n ) ?? null,\n );\n\n private readonly declaredView = computed(() => {\n const declared = this.declared();\n return declared !== null && !('path' in declared) ? declared : null;\n });\n\n private readonly declaredRoute = computed(() => {\n const declared = this.declared();\n return declared !== null && 'path' in declared ? declared : null;\n });\n\n protected readonly isContainerSurface = computed(\n () => this.declaredRoute()?.container !== undefined,\n );\n\n private readonly padded = computed(() => this.declared()?.padded !== false);\n\n protected readonly hostClass = computed(() => {\n if (this.isContainerSurface()) {\n return 'flex h-full min-h-0 min-w-0';\n }\n if (this.variant() === 'panel') {\n return this.padded()\n ? 'block h-full min-h-0 overflow-auto p-3 text-content'\n : 'block h-full min-h-0 overflow-auto text-content';\n }\n return this.padded()\n ? 'block h-full overflow-auto bg-surface-raised p-6 text-content'\n : 'block h-full overflow-auto bg-surface-raised text-content';\n });\n\n protected readonly unavailableKey = isPopoutUrl(\n inject(DOCUMENT).location?.pathname ?? '',\n )\n ? 'popout.unavailable'\n : 'content.split.unavailable';\n\n protected readonly blocked = computed(() => {\n const declared = this.declared();\n return declared !== null && !this.auth.meets(declared.access);\n });\n\n private readonly mountParams = computed(() => {\n const ctx = this.containerCtx;\n if (!ctx) {\n return undefined;\n }\n const match = containerChildForPath(\n this.registry.contentRoutes(),\n this.registry.views(),\n this.path(),\n );\n return {\n ...ctx.params,\n ...(match\n ? paramsOfPattern(match.declaration.segment ?? '', match.segmentPath)\n : {}),\n };\n });\n\n protected readonly unknown = computed(() => this.declared() === null);\n\n protected readonly view = computed(() => {\n const view = this.declaredView();\n return view && this.auth.meets(view.access) ? view : null;\n });\n\n protected readonly showSwitcher = computed(\n () => this.view()?.instanceable === true,\n );\n\n private readonly retention = inject(SURFACE_RETENTION);\n\n protected readonly surfaceKey = computed(() =>\n surfaceRetentionKey(this.retentionScope(), this.path()),\n );\n\n protected readonly surfaceMode = computed(() =>\n surfaceRetentionMode(this.registry.contentRoutes(), this.path()),\n );\n\n protected readonly surfaceRetain = computed(() =>\n retainSurfacePath(\n this.registry.contentRoutes(),\n this.registry.views(),\n this.path(),\n this.retention,\n ),\n );\n\n protected readonly viewKey = computed(() =>\n viewRetentionKey(this.retentionScope(), this.path(), this.instanceId()),\n );\n\n private readonly activeRoute = computed(() => {\n if (this.view() !== null) {\n return null;\n }\n const route = this.declaredRoute();\n return route && this.auth.meets(route.access) ? route : null;\n });\n\n protected readonly iframeSurface = computed<{\n component: Type<unknown>;\n injector: Injector;\n } | null>(() => {\n const route = this.activeRoute();\n return route?.iframe !== undefined\n ? {\n component: IframeSurface,\n injector: this.injectorFor(route, this.path(), this.surfaceKey()),\n }\n : null;\n });\n\n protected readonly surface = computed<{\n component: Type<unknown>;\n injector: Injector;\n } | null>(() => {\n const route = this.activeRoute();\n if (!route || route.iframe !== undefined) {\n return null;\n }\n const component = this.surfaceComponent(route);\n return component\n ? {\n component,\n injector: this.injectorFor(route, this.path(), this.surfaceKey()),\n }\n : null;\n });\n\n protected componentFor(view: View): Type<unknown> | null {\n return this.componentLoader.resolve(view);\n }\n\n protected dockedInjector(view: RegisteredView): Injector {\n return this.dockedInjectorFor(\n view,\n this.instanceId() ?? this.viewMount.instanceIdFor(view),\n this.mountParams(),\n );\n }\n\n protected viewInjector(view: View): Injector {\n const instanceId = this.instanceId();\n const base = instanceId\n ? this.viewMount.injectorForInstance(instanceId)\n : this.viewMount.injectorFor(view);\n return this.containerCtx\n ? this.paramInjectorFor(instanceId ?? view.id, base)\n : base;\n }\n\n private surfaceComponent(route: ContentRoute): Type<unknown> | null {\n if (route.container !== undefined) {\n return this.containerHost;\n }\n return this.componentLoader.resolve(route);\n }\n\n private paramInjectorFor(key: string, base: Injector): Injector {\n const cached = this.paramInjectors.get(key);\n if (cached) {\n return cached;\n }\n const handle = this.containerCtx;\n const injector = Injector.create({\n parent: base,\n providers: [\n {\n provide: ActivatedRoute,\n useValue: syntheticParamRoute(this.mountParams() ?? {}),\n },\n {\n provide: CONTAINER_HANDLE,\n useValue: handle ? { open: handle.open } : null,\n },\n ],\n });\n this.paramInjectors.set(key, injector);\n return injector;\n }\n}\n","<div class=\"h-full\" [class.hidden]=\"!iframeSurface()\">\n <ng-container\n [lwRetainedComponent]=\"iframeSurface()?.component ?? null\"\n [componentInjector]=\"iframeSurface()?.injector ?? null\"\n [retentionKey]=\"surfaceKey()\"\n mode=\"in-place\"\n [retain]=\"surfaceRetain()\"\n />\n</div>\n@if (view(); as v) {\n @if (showSwitcher()) {\n <div class=\"flex h-full min-h-0 flex-col\">\n <div class=\"mb-2 flex shrink-0 items-center border-b border-border pb-1.5\">\n <lw-view-instance-switcher [view]=\"v\" (beforeSwitch)=\"instanceReleased.emit()\" />\n </div>\n <div class=\"flex min-h-0 min-w-0 flex-1 flex-col\">\n <ng-container [ngTemplateOutlet]=\"viewBody\" [ngTemplateOutletContext]=\"{ $implicit: v }\" />\n </div>\n </div>\n } @else {\n <ng-container [ngTemplateOutlet]=\"viewBody\" [ngTemplateOutletContext]=\"{ $implicit: v }\" />\n }\n} @else if (surface(); as s) {\n <ng-container\n [lwRetainedComponent]=\"s.component\"\n [componentInjector]=\"s.injector\"\n [retentionKey]=\"surfaceKey()\"\n [mode]=\"surfaceMode()\"\n [retain]=\"surfaceRetain()\"\n />\n} @else if (!iframeSurface()) {\n @if (blocked()) {\n <lw-auth-required />\n } @else if (unknown()) {\n <lw-route-unavailable />\n } @else {\n <div\n class=\"flex h-full items-center justify-center p-6 text-center text-sm text-content-faint\"\n >\n {{ unavailableKey | transloco }}\n </div>\n }\n}\n\n<ng-template #viewBody let-v>\n @if (v.iframe) {\n <ng-container\n [lwRetainedComponent]=\"iframeComponent\"\n [componentInjector]=\"dockedInjector(v)\"\n [retentionKey]=\"viewKey()\"\n mode=\"in-place\"\n [retain]=\"surfaceRetain()\"\n />\n } @else if (componentFor(v); as component) {\n <ng-container\n [lwRetainedComponent]=\"component\"\n [componentInjector]=\"viewInjector(v)\"\n [retentionKey]=\"viewKey()\"\n mode=\"move\"\n [retain]=\"surfaceRetain()\"\n />\n }\n</ng-template>\n","import { inject, Service } from '@angular/core';\nimport { ContainerSpec } from '@loomweaver/plugin-sdk';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { MENU_ANCHOR_GAP, MenuService } from '../../menu/menu.service';\nimport {\n PaneTarget,\n containerChildTargets,\n offRouterPaneTargets,\n paneTargetEntries,\n routerPaneTargets,\n} from './pane-targets';\n\n@Service()\nexport class PaneTargetPicker {\n private readonly registry = inject(ContributionRegistry);\n private readonly auth = inject(AuthContext);\n private readonly menu = inject(MenuService);\n private readonly transloco = inject(TranslocoService);\n\n openForNavigation(anchor: HTMLElement, onPick: (path: string) => void): void {\n this.present(routerPaneTargets(this.registry, this.auth), anchor, onPick);\n }\n\n openForHosting(anchor: HTMLElement, onPick: (path: string) => void): void {\n this.present(\n offRouterPaneTargets(this.registry, this.auth),\n anchor,\n onPick,\n );\n }\n\n openForChildren(\n anchor: HTMLElement,\n spec: ContainerSpec | undefined,\n onPick: (path: string) => void,\n ): void {\n this.present(\n containerChildTargets(this.registry, this.auth, spec),\n anchor,\n onPick,\n );\n }\n\n private present(\n targets: readonly PaneTarget[],\n anchor: HTMLElement,\n onPick: (path: string) => void,\n ): void {\n const rect = anchor.getBoundingClientRect();\n const entries = paneTargetEntries(targets, (key) =>\n this.transloco.translate(key),\n );\n this.menu.openList(\n entries,\n { x: rect.left, y: rect.bottom + MENU_ANCHOR_GAP },\n onPick,\n );\n }\n}\n","import { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { ViewMoveService } from './view-move.service';\nimport { ViewVisibilityService } from './view-visibility.service';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { CONTENT_DOCK } from '../pane/tree/pane-address';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { menuContextString } from '../../menu/menu-context';\nimport { ViewStateService } from '../../views/view-state.service';\nimport { ViewInstanceService } from '../../views/view-instance.service';\nimport { PopoutService } from '../../popout/popout.service';\n\nexport const VIEW_CONTEXT_MENU = 'panel/view/context';\n\nexport const PANEL_STRIP_CONTEXT_MENU = 'panel/strip/context';\n\nexport function registerViewCustomizeMenu(\n registry: ContributionRegistry,\n): void {\n registry.addMenuItem({\n id: 'menu:shell.views.customize',\n menu: PANEL_STRIP_CONTEXT_MENU,\n command: 'shell.views.customize',\n group: '9_customize',\n order: 0,\n });\n}\n\nexport function registerViewContextMenu(\n registry: ContributionRegistry,\n moves: ViewMoveService,\n): void {\n registry.addCommand({\n id: 'shell.view.moveToOtherSidebar',\n paletteHidden: true,\n title: 'panel.viewMenu.moveToOtherSidebar',\n run: (context) => {\n const viewId = menuContextString(context, 'viewId');\n const target = moves.otherPanel(menuContextString(context, 'region'));\n if (viewId && target) {\n moves.move(viewId, target);\n }\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.view.moveToOtherSidebar',\n menu: VIEW_CONTEXT_MENU,\n command: 'shell.view.moveToOtherSidebar',\n group: '1_move',\n order: 0,\n });\n}\n\nexport function registerViewStackMenu(\n registry: ContributionRegistry,\n paneTree: PaneTreeService,\n): void {\n registry.addCommand({\n id: 'shell.view.stackBelow',\n paletteHidden: true,\n title: 'panel.viewMenu.stackBelow',\n run: (context) => {\n const viewId = menuContextString(context, 'viewId');\n const region = menuContextString(context, 'region');\n if (viewId && region) {\n paneTree.setActiveTab(\n region,\n paneTree.primaryId(region),\n VIEW_PANE_PREFIX + viewId,\n );\n paneTree.stackView(region, viewId);\n }\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.view.stackBelow',\n menu: VIEW_CONTEXT_MENU,\n command: 'shell.view.stackBelow',\n group: '2_stack',\n order: 0,\n });\n}\n\nexport function registerViewResetMenu(\n registry: ContributionRegistry,\n viewStates: ViewStateService,\n viewInstances: ViewInstanceService,\n): void {\n registry.addCommand({\n id: 'shell.view.resetState',\n paletteHidden: true,\n title: 'panel.viewMenu.resetState',\n icon: 'undo',\n run: (context) => {\n const viewId = menuContextString(context, 'viewId');\n if (!viewId) {\n return;\n }\n const instance =\n menuContextString(context, 'instance') ||\n viewInstances.activeId(viewId)();\n viewStates.reset(instance);\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.view.resetState',\n menu: VIEW_CONTEXT_MENU,\n command: 'shell.view.resetState',\n group: '3_state',\n order: 0,\n });\n}\n\nexport function registerViewOpenInContentMenu(\n registry: ContributionRegistry,\n paneTree: PaneTreeService,\n): void {\n registry.addCommand({\n id: 'shell.view.openInContent',\n paletteHidden: true,\n title: 'panel.viewMenu.openInContent',\n run: (context) => {\n const viewId = menuContextString(context, 'viewId');\n if (viewId) {\n paneTree.splitPane(\n CONTENT_DOCK,\n paneTree.primaryId(CONTENT_DOCK),\n 'row',\n VIEW_PANE_PREFIX + viewId,\n );\n }\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.view.openInContent',\n menu: VIEW_CONTEXT_MENU,\n command: 'shell.view.openInContent',\n group: '2_stack',\n order: 1,\n });\n}\n\nexport function registerViewHideMenu(\n registry: ContributionRegistry,\n visibility: ViewVisibilityService,\n): void {\n registry.addCommand({\n id: 'shell.view.hide',\n paletteHidden: true,\n title: 'panel.viewMenu.hide',\n run: (context) => {\n const viewId = menuContextString(context, 'viewId');\n if (viewId) {\n visibility.hide(viewId);\n }\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.view.hide',\n menu: VIEW_CONTEXT_MENU,\n command: 'shell.view.hide',\n group: '5_visibility',\n order: 0,\n });\n}\n\nexport function registerViewPopoutMenu(\n registry: ContributionRegistry,\n popout: PopoutService,\n): void {\n registry.addCommand({\n id: 'shell.view.openInWindow',\n paletteHidden: true,\n title: 'panel.viewMenu.openInNewWindow',\n icon: 'popout',\n run: (context) => {\n const viewId = menuContextString(context, 'viewId');\n if (viewId) {\n popout.open(VIEW_PANE_PREFIX + viewId);\n }\n },\n });\n registry.addMenuItem({\n id: 'menu:shell.view.openInWindow',\n menu: VIEW_CONTEXT_MENU,\n command: 'shell.view.openInWindow',\n group: '4_window',\n order: 0,\n });\n}\n","export interface PaneViewOptions {\n readonly variant: 'titles' | 'icons';\n\n readonly split: boolean;\n\n readonly focus: boolean;\n\n readonly pointer: boolean;\n\n readonly maximize: boolean;\n\n readonly closeLabel: string;\n\n readonly body: 'content' | 'panel';\n}\n\nexport const CONTENT_PANE_OPTIONS: PaneViewOptions = {\n variant: 'titles',\n split: true,\n focus: true,\n pointer: false,\n maximize: true,\n closeLabel: 'content.split.closePane',\n body: 'content',\n};\n\nexport const PANEL_PANE_OPTIONS: PaneViewOptions = {\n variant: 'icons',\n split: false,\n focus: false,\n pointer: false,\n maximize: false,\n closeLabel: 'panel.stack.unstack',\n body: 'panel',\n};\n\nexport const CONTAINER_PANE_OPTIONS: PaneViewOptions = {\n variant: 'titles',\n split: true,\n focus: false,\n pointer: true,\n maximize: false,\n closeLabel: 'content.split.closePane',\n body: 'content',\n};\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input } from '@angular/core';\nimport { VIEW_PANE_PREFIX } from './tree/pane-address';\nimport { PaneLeaf, activeTab, leafPath } from './tree/pane-node';\nimport { CONTAINER_CONTEXT } from './container/container-context';\nimport { isContainerDock } from './container/container-children';\nimport { CONTENT_DOCK } from './tree/pane-address';\nimport { PaneTreeService } from './tree/pane-tree.service';\nimport { PaneContainersService } from './container/pane-containers.service';\nimport { PaneChromeService } from './chrome/pane-chrome.service';\nimport { TabDragSource } from './drag/pane-drag.service';\nimport { PaneTabStrip } from './chrome/pane-tab-strip';\nimport { StripTab } from './chrome/strip-tab';\nimport { PaneToolbar } from './chrome/pane-toolbar';\nimport { toStripTab } from './drag/pane-label';\nimport { RetainedViewStash } from './retention/retained-view-stash';\nimport {\n containerChildInstances,\n paneRetentionScope,\n} from './retention/retention-policy';\nimport { SurfaceCloseGuard } from './close/surface-close-guard';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { ContentSecondaryPane } from '../content/content-secondary-pane';\nimport { isHomePath } from '../content/content-path';\nimport { PaneTargetPicker } from '../content/pane-target-picker.service';\nimport { ContentTabsService } from '../content/tabs/content-tabs.service';\nimport { SHELL_FEATURES } from '../../foundation/shell-features';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { VIEW_CONTEXT_MENU } from '../panel/view-context-menu';\nimport { CONTENT_PANE_OPTIONS, PaneViewOptions } from './pane-view-options';\n\n@Component({\n selector: 'lw-pane-view',\n imports: [ContentSecondaryPane, PaneTabStrip, PaneToolbar, TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n host: { class: 'flex min-h-0 min-w-0 flex-1 flex-col' },\n templateUrl: './pane-view.html',\n})\nexport class PaneView {\n readonly dock = input.required<string>();\n readonly leaf = input.required<PaneLeaf>();\n readonly options = input<PaneViewOptions>(CONTENT_PANE_OPTIONS);\n\n private readonly features = inject(SHELL_FEATURES).content;\n private readonly paneTree = inject(PaneTreeService);\n private readonly containers = inject(PaneContainersService);\n private readonly registry = inject(ContributionRegistry);\n private readonly picker = inject(PaneTargetPicker);\n private readonly tabs = inject(ContentTabsService);\n private readonly chrome = inject(PaneChromeService);\n private readonly containerCtx = inject(CONTAINER_CONTEXT);\n private readonly stash = inject(RetainedViewStash);\n private readonly closeGuard = inject(SurfaceCloseGuard);\n\n protected readonly canAddTab = computed(() =>\n this.options().body === 'panel' ? true : this.features.newTab,\n );\n\n protected readonly canSplitRight = computed(\n () => this.options().split && this.features.splitRight,\n );\n\n protected readonly canSplitDown = computed(\n () => this.options().split && this.features.splitDown,\n );\n\n protected readonly canMaximize = computed(\n () => this.options().maximize && this.features.maximize,\n );\n\n protected readonly maximized = computed(() =>\n this.chrome.isMaximized(this.dock(), this.leaf().id),\n );\n\n protected readonly canMinimize = computed(\n () =>\n this.options().split &&\n this.features.minimize &&\n !this.maximized() &&\n this.paneTree.isSplit(this.dock()),\n );\n\n protected readonly viewContextMenu = computed(() =>\n this.containerCtx ? '' : VIEW_CONTEXT_MENU,\n );\n\n protected readonly source = computed<TabDragSource>(() => ({\n dock: this.dock(),\n paneId: this.leaf().id,\n }));\n\n protected readonly path = computed(() => leafPath(this.leaf()) ?? '');\n\n protected readonly awaitingContent = computed(\n () => this.leaf().declared === true && this.leaf().tabs.length === 0,\n );\n\n protected readonly retentionScope = computed(() =>\n paneRetentionScope(this.dock(), this.leaf().id),\n );\n\n protected readonly instanceId = computed(\n () => activeTab(this.leaf())?.instance,\n );\n\n protected readonly activeTabId = computed(\n () => activeTab(this.leaf())?.path ?? '',\n );\n\n private readonly isPrimary = computed(\n () => this.leaf().id === this.paneTree.primaryId(this.dock()),\n );\n\n protected readonly canClose = computed(\n () => !this.isPrimary() || this.paneTree.isSplit(this.dock()),\n );\n\n private readonly tabsClosable = computed(\n () =>\n (!this.isPrimary() || this.canCloseLastPrimaryTab()) &&\n (!this.contentSide() || this.features.close),\n );\n\n private readonly contentSide = computed(\n () => this.dock() === CONTENT_DOCK || isContainerDock(this.dock()),\n );\n\n protected readonly tabsReorderable = computed(\n () => !this.contentSide() || this.features.reorderTabs,\n );\n\n protected readonly acceptsTabs = computed(\n () => !this.contentSide() || this.features.moveTabs,\n );\n\n protected readonly tabsDraggable = computed(\n () =>\n !this.contentSide() ||\n this.features.reorderTabs ||\n this.features.moveTabs ||\n this.features.splitRight ||\n this.features.splitDown,\n );\n\n protected readonly stripTabs = computed<StripTab[]>(() => {\n const closable = this.tabsClosable();\n return this.leaf()\n .tabs.filter((tab) => !isHomePath(tab.path))\n .map((tab) => ({\n ...toStripTab(this.registry, tab),\n closable: closable && tab.closable !== false,\n }));\n });\n\n protected readonly focusable = computed(() => this.options().focus);\n\n protected readonly pointed = computed(\n () =>\n this.options().pointer &&\n this.leaf().id === this.paneTree.primaryId(this.dock()),\n );\n\n protected onBodyPointerDown(): void {\n this.point();\n if (this.focusable()) {\n this.focusPane();\n }\n }\n\n protected onSelectTab(tab: StripTab): void {\n this.paneTree.setActiveTab(this.dock(), this.leaf().id, tab.path);\n this.point();\n if (this.focusable()) {\n this.focusPane();\n }\n }\n\n protected onEscalate(tab: StripTab): void {\n if (\n !this.contentSide() ||\n !this.features.escalate ||\n tab.path.startsWith(VIEW_PANE_PREFIX)\n ) {\n return;\n }\n const dock = this.dock();\n const paneId = this.leaf().id;\n if (tab.preview) {\n this.paneTree.keepTab(dock, paneId, tab.path);\n } else if (!this.features.pin) {\n return;\n } else if (tab.pinned) {\n this.paneTree.unpinTab(dock, paneId, tab.path);\n } else if (tab.closable) {\n this.paneTree.pinTab(dock, paneId, tab.path);\n }\n }\n\n protected onCloseTab(tab: StripTab): void {\n this.closeGuard.guarded(this.closeCandidates(tab.path), () => {\n this.paneTree.removeTab(this.dock(), this.leaf().id, tab.path);\n if (!tab.path.startsWith(VIEW_PANE_PREFIX)) {\n this.tabs.runCloseHook(tab.path);\n }\n });\n }\n\n protected onUnpinTab(tab: StripTab): void {\n this.paneTree.unpinTab(this.dock(), this.leaf().id, tab.path);\n }\n\n protected releaseTabInstance(): void {\n this.paneTree.clearTabInstance(this.dock(), this.leaf().id, this.path());\n }\n\n protected onReorderTabs(order: string[]): void {\n this.paneTree.reorderPaneTabs(this.dock(), this.leaf().id, order);\n }\n\n protected splitPane(orientation: 'row' | 'column'): void {\n this.paneTree.splitPane(\n this.dock(),\n this.leaf().id,\n orientation,\n this.path(),\n );\n }\n\n protected closePane(): void {\n const candidates = this.leaf().tabs.flatMap((tab) =>\n this.closeCandidates(tab.path),\n );\n this.closeGuard.guarded(candidates, () => {\n if (this.isPrimary()) {\n this.paneTree.collapsePrimary(this.dock());\n return;\n }\n this.paneTree.closePane(this.dock(), this.leaf().id);\n });\n }\n\n protected toggleMaximize(): void {\n this.chrome.toggleMaximize(this.dock(), this.leaf().id);\n }\n\n protected minimize(): void {\n this.chrome.toggleMinimize(this.dock(), this.leaf().id);\n }\n\n protected focusPane(): void {\n const path = this.paneTree.focusPane(\n this.dock(),\n this.leaf().id,\n this.tabs.activeTabRoot(),\n );\n if (path !== null) {\n this.tabs.navigateTo(path);\n }\n }\n\n protected openPicker(event: Event): void {\n const anchor = event.currentTarget as HTMLElement;\n const ctx = this.containerCtx;\n if (ctx) {\n this.picker.openForChildren(anchor, ctx.spec, (path) =>\n this.containers.insertContainerChild(\n this.dock(),\n ctx.spec,\n this.leaf().id,\n path.slice(VIEW_PANE_PREFIX.length),\n ),\n );\n return;\n }\n this.picker.openForHosting(anchor, (path) =>\n this.paneTree.insertTab(this.dock(), this.leaf().id, path),\n );\n }\n\n private point(): void {\n if (this.options().pointer) {\n this.paneTree.pointAt(this.dock(), this.leaf().id);\n }\n }\n\n private canCloseLastPrimaryTab(): boolean {\n return this.leaf().tabs.length > 1 || this.paneTree.isSplit(this.dock());\n }\n\n private closeCandidates(path: string): unknown[] {\n return [\n ...this.stash.instancesFor(this.retentionScope(), path),\n ...containerChildInstances(this.stash.keyedInstances(), path),\n ];\n }\n}\n","<lw-pane-tab-strip\n class=\"shrink-0\"\n [variant]=\"options().variant\"\n [tabs]=\"stripTabs()\"\n [activeId]=\"activeTabId()\"\n [urlDriven]=\"pointed()\"\n [source]=\"source()\"\n [reorderable]=\"tabsReorderable()\"\n [draggable]=\"tabsDraggable()\"\n [acceptsTabs]=\"acceptsTabs()\"\n [canAddTab]=\"canAddTab()\"\n [viewContextMenuSlot]=\"viewContextMenu()\"\n [contextGroup]=\"dock()\"\n [paneActions]=\"paneActions\"\n (selectTab)=\"onSelectTab($event)\"\n (escalate)=\"onEscalate($event)\"\n (closeTab)=\"onCloseTab($event)\"\n (unpinTab)=\"onUnpinTab($event)\"\n (addTab)=\"openPicker($event)\"\n (reorderTabs)=\"onReorderTabs($event)\"\n/>\n<ng-template #paneActions>\n <lw-pane-toolbar\n [canSplitRight]=\"canSplitRight()\"\n [canSplitDown]=\"canSplitDown()\"\n [canMinimize]=\"canMinimize()\"\n [canMaximize]=\"canMaximize()\"\n [maximized]=\"maximized()\"\n [canClose]=\"canClose()\"\n [closeLabel]=\"options().closeLabel\"\n (splitRight)=\"splitPane('row')\"\n (splitDown)=\"splitPane('column')\"\n (minimize)=\"minimize()\"\n (toggleMaximize)=\"toggleMaximize()\"\n (closePane)=\"closePane()\"\n />\n</ng-template>\n\n<div class=\"flex min-h-0 min-w-0 flex-1 flex-col\" (pointerdown)=\"onBodyPointerDown()\">\n @if (awaitingContent()) {\n <div\n class=\"flex h-full items-center justify-center p-6 text-center text-sm text-content-faint\"\n data-testid=\"pane-awaiting-content\"\n role=\"status\"\n >\n {{ 'content.split.awaiting' | transloco }}\n </div>\n } @else {\n <lw-content-secondary-pane\n class=\"min-h-0 min-w-0 flex-1\"\n [path]=\"path()\"\n [instanceId]=\"instanceId()\"\n [variant]=\"options().body\"\n [retentionScope]=\"retentionScope()\"\n (instanceReleased)=\"releaseTabInstance()\"\n />\n }\n</div>\n","import { Component, computed, effect, inject, input } from '@angular/core';\nimport { CdkDrag, CdkDragDrop, CdkDropList } from '@angular/cdk/drag-drop';\nimport { SHELL_FEATURES } from '../../../foundation/shell-features';\nimport { PaneDragService } from './pane-drag.service';\nimport { isContainerDock } from '../container/container-children';\nimport { CONTENT_DOCK } from '../tree/pane-address';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { VIEW_PANE_PREFIX } from '../tree/pane-address';\nimport { findLeaf } from '../tree/pane-queries';\nimport {\n PaneDropEdge,\n PaneMoveService,\n stripSourceOf,\n} from './pane-move.service';\n\n@Component({\n selector: 'lw-pane-drop-zones',\n imports: [CdkDropList],\n host: {\n class: 'absolute inset-0 z-20 grid transition-opacity',\n '[class.opacity-0]': '!active()',\n '[class.pointer-events-none]': '!active()',\n '[style.grid-template-columns]': '\"1fr 2fr 1fr\"',\n '[style.grid-template-rows]': '\"1fr 2fr 1fr\"',\n '[attr.aria-hidden]': 'true',\n },\n templateUrl: './pane-drop-zones.html',\n})\nexport class PaneDropZones {\n readonly dock = input.required<string>();\n readonly paneId = input.required<string>();\n\n private readonly drag = inject(PaneDragService);\n private readonly features = inject(SHELL_FEATURES).content;\n private readonly sidebar = inject(SHELL_FEATURES).sidebar;\n\n private readonly contentSide = computed(\n () => this.dock() === CONTENT_DOCK || isContainerDock(this.dock()),\n );\n private readonly paneMove = inject(PaneMoveService);\n private readonly paneTree = inject(PaneTreeService);\n\n protected readonly active = computed(() => this.drag.dragging() !== null);\n\n protected readonly fills = computed(\n () =>\n findLeaf(this.paneTree.tree(this.dock()), this.paneId())?.tabs.length ===\n 0,\n );\n\n protected readonly edges = computed<readonly PaneDropEdge[]>(() => {\n if (!this.contentSide()) {\n return this.sidebar.stackViews || this.sidebar.acceptTabs\n ? ['top', 'bottom', 'left', 'right']\n : [];\n }\n return [\n ...(this.features.splitDown ? (['top', 'bottom'] as const) : []),\n ...(this.features.splitRight ? (['left', 'right'] as const) : []),\n ];\n });\n\n protected readonly accepts = computed(() =>\n this.contentSide()\n ? this.features.moveTabs\n : this.sidebar.moveViews || this.sidebar.acceptTabs,\n );\n\n constructor() {\n effect((onCleanup) => {\n const ids = this.fills()\n ? this.accepts()\n ? [this.fillZoneId()]\n : []\n : this.edges().map((edge) => this.zoneId(edge));\n const disposers = ids.map((id) => this.drag.registerZone(id));\n onCleanup(() => disposers.forEach((dispose) => dispose()));\n });\n }\n\n protected has(edge: PaneDropEdge): boolean {\n return this.edges().includes(edge);\n }\n\n protected readonly enterPredicate = (drag: CdkDrag<string>): boolean => {\n if (this.contentSide()) {\n return true;\n }\n if (!String(drag.data ?? '').startsWith(VIEW_PANE_PREFIX)) {\n return this.sidebar.acceptTabs;\n }\n return this.fills() ? this.sidebar.moveViews : this.sidebar.stackViews;\n };\n\n protected zoneId(edge: PaneDropEdge): string {\n return `pane-zone:${this.dock()}:${this.paneId()}:${edge}`;\n }\n\n protected fillZoneId(): string {\n return `pane-zone:${this.dock()}:${this.paneId()}:fill`;\n }\n\n protected onFill(event: CdkDragDrop<unknown>): void {\n const source = stripSourceOf(event.previousContainer.id);\n if (source) {\n this.paneMove.moveToStrip(source, String(event.item.data ?? ''), {\n dock: this.dock(),\n paneId: this.paneId(),\n });\n }\n }\n\n protected onDrop(edge: PaneDropEdge, event: CdkDragDrop<unknown>): void {\n const source = stripSourceOf(event.previousContainer.id);\n if (source) {\n this.paneMove.moveToEdge(\n source,\n String(event.item.data ?? ''),\n { dock: this.dock(), paneId: this.paneId() },\n edge,\n );\n }\n }\n}\n","@if (fills()) {\n @if (accepts()) {\n <div\n class=\"lw-pane-drop-zone col-span-3 row-span-3 col-start-1 row-start-1\"\n cdkDropList\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [id]=\"fillZoneId()\"\n (cdkDropListDropped)=\"onFill($event)\"\n >\n <div class=\"lw-pane-drop-preview lw-pane-drop-preview--fill\"></div>\n </div>\n }\n} @else {\n @if (has('left')) {\n <div\n class=\"lw-pane-drop-zone col-start-1 row-span-3 row-start-1\"\n cdkDropList\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [id]=\"zoneId('left')\"\n (cdkDropListDropped)=\"onDrop('left', $event)\"\n >\n <div class=\"lw-pane-drop-preview lw-pane-drop-preview--left\"></div>\n </div>\n }\n @if (has('right')) {\n <div\n class=\"lw-pane-drop-zone col-start-3 row-span-3 row-start-1\"\n cdkDropList\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [id]=\"zoneId('right')\"\n (cdkDropListDropped)=\"onDrop('right', $event)\"\n >\n <div class=\"lw-pane-drop-preview lw-pane-drop-preview--right\"></div>\n </div>\n }\n @if (has('top')) {\n <div\n class=\"lw-pane-drop-zone col-start-2 row-start-1\"\n cdkDropList\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [id]=\"zoneId('top')\"\n (cdkDropListDropped)=\"onDrop('top', $event)\"\n >\n <div class=\"lw-pane-drop-preview lw-pane-drop-preview--top\"></div>\n </div>\n }\n @if (has('bottom')) {\n <div\n class=\"lw-pane-drop-zone col-start-2 row-start-3\"\n cdkDropList\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n [id]=\"zoneId('bottom')\"\n (cdkDropListDropped)=\"onDrop('bottom', $event)\"\n >\n <div class=\"lw-pane-drop-preview lw-pane-drop-preview--bottom\"></div>\n </div>\n }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PaneLeaf, activeTab } from '../tree/pane-node';\nimport { PaneChromeService } from './pane-chrome.service';\nimport { PaneLabel, paneLabelOf } from '../drag/pane-label';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\n\n@Component({\n selector: 'lw-pane-minimized-strip',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [TranslocoPipe],\n host: { class: 'flex shrink-0' },\n templateUrl: './pane-minimized-strip.html',\n})\nexport class PaneMinimizedStrip {\n readonly dock = input.required<string>();\n readonly leaf = input.required<PaneLeaf>();\n readonly orientation = input<'row' | 'column' | null>(null);\n\n private readonly registry = inject(ContributionRegistry);\n private readonly chrome = inject(PaneChromeService);\n\n protected readonly vertical = computed(() => this.orientation() === 'row');\n\n protected readonly label = computed<\n Pick<PaneLabel, 'title' | 'literalTitle'>\n >(() => {\n const tab = activeTab(this.leaf());\n if (tab?.title !== undefined) {\n return { title: tab.title, literalTitle: tab.literalTitle ?? false };\n }\n const base = paneLabelOf(this.registry, tab?.path ?? '');\n return { title: base.title, literalTitle: base.literalTitle };\n });\n\n protected readonly icon = computed(() => {\n const tab = activeTab(this.leaf());\n return tab?.icon ?? paneLabelOf(this.registry, tab?.path ?? '').icon;\n });\n\n protected readonly tabCount = computed(() => this.leaf().tabs.length);\n protected readonly extraTabs = computed(() => this.tabCount() - 1);\n\n protected readonly restoreKey = computed(() =>\n this.tabCount() > 1\n ? 'content.split.restoreMinimizedCount'\n : 'content.split.restoreMinimized',\n );\n\n protected restore(): void {\n this.chrome.toggleMinimize(this.dock(), this.leaf().id);\n }\n}\n","<button\n type=\"button\"\n class=\"relative flex min-h-0 min-w-0 flex-1 items-center gap-2 border border-border bg-surface-overlay text-content-faint hover:text-content\"\n [class.flex-col]=\"vertical()\"\n [class.px-2]=\"!vertical()\"\n [class.py-2]=\"vertical()\"\n (click)=\"restore()\"\n [attr.aria-label]=\"restoreKey() | transloco: { count: tabCount() }\"\n data-testid=\"pane-minimized-strip\"\n>\n <lw-icon [name]=\"icon() ?? 'document'\" size=\"0.875rem\" />\n @if (vertical()) {\n <span class=\"min-h-0 truncate text-xs\" style=\"writing-mode: vertical-rl\">{{ label().literalTitle ? label().title : (label().title | transloco) }}</span>\n } @else {\n <span class=\"min-w-0 truncate text-xs\">{{ label().literalTitle ? label().title : (label().title | transloco) }}</span>\n }\n @if (tabCount() > 1) {\n <span class=\"lw-badge lw-badge--brand shrink-0 px-1.5 py-0 text-xs\" aria-hidden=\"true\">+{{ extraTabs() }}</span>\n }\n <lw-tooltip [text]=\"restoreKey() | transloco: { count: tabCount() }\" [position]=\"vertical() ? 'right' : 'bottom'\" />\n</button>\n","import { Component, ElementRef, computed, inject, input, output } from '@angular/core';\nimport { MAX_RATIO, MIN_RATIO } from '../tree/pane-ratio';\n\nconst STEP = 0.02;\nconst STEP_COARSE = 0.1;\n\n@Component({\n selector: 'lw-pane-split-handle',\n template: '',\n host: {\n class:\n 'relative shrink-0 touch-none bg-border transition-colors hover:bg-brand focus-visible:bg-brand focus-visible:outline-none',\n '[class]': 'axisClass()',\n role: 'separator',\n '[attr.aria-orientation]': \"isRow() ? 'vertical' : 'horizontal'\",\n tabindex: '0',\n '[attr.aria-label]': 'label()',\n '[attr.aria-valuenow]': 'valueNow()',\n '[attr.aria-valuemin]': 'valueMin',\n '[attr.aria-valuemax]': 'valueMax',\n '(pointerdown)': 'onPointerDown($event)',\n '(keydown)': 'onKeydown($event)',\n },\n})\nexport class PaneSplitHandle {\n readonly ratio = input.required<number>();\n\n readonly orientation = input<'row' | 'column'>('row');\n\n readonly label = input('');\n\n readonly ratioStream = output<number>();\n\n readonly ratioCommit = output<void>();\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n protected readonly isRow = computed(() => this.orientation() === 'row');\n\n protected readonly valueNow = computed(() => Math.round(this.ratio() * 100));\n\n protected readonly valueMin = Math.round(MIN_RATIO * 100);\n\n protected readonly valueMax = Math.round(MAX_RATIO * 100);\n\n protected readonly axisClass = computed(() =>\n this.isRow() ? 'w-1.5 cursor-col-resize' : 'h-1.5 w-full cursor-row-resize',\n );\n\n protected onPointerDown(event: PointerEvent): void {\n const parent = this.host.nativeElement.parentElement;\n if (!parent) {\n return;\n }\n const rect = parent.getBoundingClientRect();\n const el = this.host.nativeElement;\n el.setPointerCapture(event.pointerId);\n event.preventDefault();\n const move = (e: PointerEvent) =>\n this.ratioStream.emit(this.fraction(e, rect));\n const up = (e: PointerEvent) => {\n el.releasePointerCapture(e.pointerId);\n el.removeEventListener('pointermove', move);\n el.removeEventListener('pointerup', up);\n this.ratioCommit.emit();\n };\n el.addEventListener('pointermove', move);\n el.addEventListener('pointerup', up);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const step = event.shiftKey ? STEP_COARSE : STEP;\n const decrease = this.isRow() ? 'ArrowLeft' : 'ArrowUp';\n const increase = this.isRow() ? 'ArrowRight' : 'ArrowDown';\n if (event.key === decrease) {\n this.ratioStream.emit(this.ratio() - step);\n this.ratioCommit.emit();\n event.preventDefault();\n } else if (event.key === increase) {\n this.ratioStream.emit(this.ratio() + step);\n this.ratioCommit.emit();\n event.preventDefault();\n }\n }\n\n private fraction(event: PointerEvent, rect: DOMRect): number {\n return this.isRow()\n ? (event.clientX - rect.left) / rect.width\n : (event.clientY - rect.top) / rect.height;\n }\n}\n","import {\n Directive,\n ElementRef,\n OnChanges,\n OnDestroy,\n TemplateRef,\n inject,\n input,\n} from '@angular/core';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { RetainedSlot } from './retained-view-model';\nimport { RetainedViewStash } from './retained-view-stash';\nimport { moveNode } from './atomic-move';\nimport { surfaceRetentionMode } from './retention-policy';\n\ninterface MountedTemplate {\n readonly key: string;\n readonly template: TemplateRef<unknown>;\n readonly slot: RetainedSlot;\n path: string;\n}\n\n@Directive({ selector: '[lwRetainedTemplate]' })\nexport class RetainedTemplate implements OnChanges, OnDestroy {\n readonly lwRetainedTemplate = input.required<TemplateRef<unknown>>();\n readonly retentionKey = input.required<string>();\n readonly retentionPath = input<string>('');\n\n private readonly stash = inject(RetainedViewStash);\n private readonly registry = inject(ContributionRegistry);\n private readonly anchor: Node = inject(ElementRef).nativeElement;\n\n private mounted: MountedTemplate | null = null;\n\n ngOnChanges(): void {\n const key = this.retentionKey();\n const template = this.lwRetainedTemplate();\n const mounted = this.mounted;\n if (mounted?.key === key && mounted.template === template) {\n mounted.path = this.retentionPath();\n return;\n }\n this.unmount(key);\n const slot = this.stash.acquire(key, template, () => ({\n view: template.createEmbeddedView(undefined),\n }));\n this.place(slot.rootNodes);\n this.mounted = { key, template, slot, path: this.retentionPath() };\n }\n\n ngOnDestroy(): void {\n this.unmount(null);\n }\n\n private unmount(nextKey: string | null): void {\n const mounted = this.mounted;\n this.mounted = null;\n if (!mounted) {\n return;\n }\n const survivable =\n mounted.key !== nextKey &&\n surfaceRetentionMode(this.registry.contentRoutes(), mounted.path) ===\n 'move';\n if (survivable) {\n mounted.slot.release(false);\n return;\n }\n mounted.slot.discard();\n }\n\n private place(nodes: readonly Node[]): void {\n const parent = this.anchor.parentNode;\n if (!parent) {\n return;\n }\n for (const node of nodes) {\n moveNode(parent, node, this.anchor);\n }\n }\n}\n","import { Component, TemplateRef, computed, forwardRef, inject, input, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PaneNode, PaneSplit, leafPath } from './tree/pane-node';\nimport { PaneTreeService } from './tree/pane-tree.service';\nimport { PaneChromeService } from './chrome/pane-chrome.service';\nimport { PaneView } from './pane-view';\nimport { CONTENT_PANE_OPTIONS, PaneViewOptions } from './pane-view-options';\nimport { PaneDropZones } from './drag/pane-drop-zones';\nimport { PaneMinimizedStrip } from './chrome/pane-minimized-strip';\nimport { PaneSplitHandle } from './chrome/pane-split-handle';\nimport { RetainedTemplate } from './retention/retained-template';\nimport { PRIMARY_RETENTION_PREFIX } from './retention/retention-policy';\n\n@Component({\n selector: 'lw-pane-tree-view',\n imports: [\n PaneView,\n PaneDropZones,\n PaneMinimizedStrip,\n PaneSplitHandle,\n RetainedTemplate,\n TranslocoPipe,\n forwardRef(() => PaneTreeView),\n ],\n host: { class: 'flex min-h-0 min-w-0' },\n templateUrl: './pane-tree-view.html',\n})\nexport class PaneTreeView {\n readonly dock = input.required<string>();\n readonly node = input.required<PaneNode>();\n readonly primary = input<TemplateRef<unknown> | null>(null);\n readonly paneOptions = input<PaneViewOptions>(CONTENT_PANE_OPTIONS);\n readonly parentOrientation = input<'row' | 'column' | null>(null);\n\n private readonly paneTree = inject(PaneTreeService);\n private readonly chrome = inject(PaneChromeService);\n\n protected readonly primaryPaneId = computed(() =>\n this.paneTree.primaryId(this.dock()),\n );\n\n protected readonly resizing = signal(false);\n\n protected readonly split = computed<PaneSplit | null>(() => {\n const node = this.node();\n return node.kind === 'split' ? node : null;\n });\n\n protected readonly leaf = computed(() => {\n const node = this.node();\n return node.kind === 'leaf' ? node : null;\n });\n\n protected readonly primaryRetentionKey = computed(\n () => PRIMARY_RETENTION_PREFIX + this.dock(),\n );\n\n protected readonly primaryLeafPath = computed(() => {\n const l = this.leaf();\n return l ? (leafPath(l) ?? '') : '';\n });\n\n protected readonly minimized = computed(() => {\n const node = this.node();\n return this.isMinimizedLeaf(node);\n });\n\n protected readonly primaryMinimized = computed(\n () =>\n this.parentOrientation() !== null &&\n this.chrome.isMinimized(this.dock(), this.primaryPaneId()),\n );\n\n protected readonly firstMinimized = computed(() => {\n const s = this.split();\n return s !== null && this.isMinimizedLeaf(s.first);\n });\n\n protected readonly secondMinimized = computed(() => {\n const s = this.split();\n return s !== null && this.isMinimizedLeaf(s.second);\n });\n\n protected flexFor(\n minimized: boolean,\n siblingMinimized: boolean,\n ratio: number,\n orientation: 'row' | 'column',\n ): string {\n if (minimized) {\n return orientation === 'row' ? '0 0 2.25rem' : '0 0 2rem';\n }\n return siblingMinimized ? '1 1 0' : `${ratio} 1 0`;\n }\n\n protected onRatio(splitId: string, ratio: number): void {\n this.resizing.set(true);\n this.paneTree.resizeStream(this.dock(), splitId, ratio);\n }\n\n protected onRatioCommit(): void {\n this.resizing.set(false);\n this.paneTree.resizeCommit();\n }\n\n private isMinimizedLeaf(node: PaneNode): boolean {\n return (\n node.kind === 'leaf' && this.chrome.isMinimized(this.dock(), node.id)\n );\n }\n}\n","@if (split(); as s) {\n <div class=\"flex min-h-0 min-w-0 flex-1\" [class.flex-col]=\"s.orientation === 'column'\">\n <lw-pane-tree-view [dock]=\"dock()\" [node]=\"s.first\" [primary]=\"primary()\" [paneOptions]=\"paneOptions()\" [parentOrientation]=\"s.orientation\" [class.lw-pane-animate]=\"!resizing()\" [style.flex]=\"flexFor(firstMinimized(), secondMinimized(), s.ratio, s.orientation)\" />\n @if (!firstMinimized() && !secondMinimized()) {\n <lw-pane-split-handle\n [orientation]=\"s.orientation\"\n [ratio]=\"s.ratio\"\n [label]=\"'content.split.resize' | transloco\"\n (ratioStream)=\"onRatio(s.id, $event)\"\n (ratioCommit)=\"onRatioCommit()\"\n />\n }\n <lw-pane-tree-view [dock]=\"dock()\" [node]=\"s.second\" [primary]=\"primary()\" [paneOptions]=\"paneOptions()\" [parentOrientation]=\"s.orientation\" [class.lw-pane-animate]=\"!resizing()\" [style.flex]=\"flexFor(secondMinimized(), firstMinimized(), 1 - s.ratio, s.orientation)\" />\n </div>\n} @else if (leaf(); as l) {\n @if (l.id === primaryPaneId() && primary(); as primaryTpl) {\n @if (primaryMinimized()) {\n <lw-pane-minimized-strip class=\"flex min-h-0 min-w-0 flex-1\" [dock]=\"dock()\" [leaf]=\"l\" [orientation]=\"parentOrientation()\" />\n } @else {\n <div class=\"relative flex min-h-0 min-w-0 flex-1\">\n <ng-container\n [lwRetainedTemplate]=\"primaryTpl\"\n [retentionKey]=\"primaryRetentionKey()\"\n [retentionPath]=\"primaryLeafPath()\"\n />\n <lw-pane-drop-zones [dock]=\"dock()\" [paneId]=\"l.id\" />\n </div>\n }\n } @else if (minimized()) {\n <lw-pane-minimized-strip class=\"flex min-h-0 min-w-0 flex-1\" [dock]=\"dock()\" [leaf]=\"l\" [orientation]=\"parentOrientation()\" />\n } @else {\n <div class=\"relative flex min-h-0 min-w-0 flex-1\">\n <lw-pane-view class=\"min-h-0 min-w-0 flex-1\" [dock]=\"dock()\" [leaf]=\"l\" [options]=\"paneOptions()\" />\n <lw-pane-drop-zones [dock]=\"dock()\" [paneId]=\"l.id\" />\n </div>\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Service, signal, Signal } from '@angular/core';\n\nconst COMPACT_QUERY = '(max-width: 767.98px)';\n\n@Service()\nexport class ViewportService {\n private readonly document = inject(DOCUMENT);\n\n readonly compact: Signal<boolean> = this.watchCompact();\n\n private watchCompact(): Signal<boolean> {\n const query = this.document.defaultView?.matchMedia?.(COMPACT_QUERY);\n const compact = signal(query?.matches ?? false);\n query?.addEventListener('change', (event) => compact.set(event.matches));\n return compact.asReadonly();\n }\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\nimport { RetainedViewStash } from '../pane/retention/retained-view-stash';\n\nconst STORAGE_KEY = 'lw.shell.panels';\n\nfunction parseCollapsed(raw: string | undefined): Record<string, boolean> {\n if (!raw) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n const result: Record<string, boolean> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value === true) {\n result[key] = value;\n }\n }\n return result;\n } catch {\n return {};\n }\n}\n\n@Service()\nexport class PanelState {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly stash = inject(RetainedViewStash);\n private readonly collapsed = signal<Record<string, boolean>>(\n parseCollapsed(this.store.peek?.(STORAGE_KEY)),\n );\n\n private readonly overlay = signal<string | null>(null);\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.collapsed.set(parseCollapsed(raw)),\n );\n }\n\n isCollapsed(regionId: string): boolean {\n return this.collapsed()[regionId] ?? false;\n }\n\n isOverlayOpen(regionId: string): boolean {\n return this.overlay() === regionId;\n }\n\n anyOverlayOpen(): boolean {\n return this.overlay() !== null;\n }\n\n openOverlay(regionId: string): void {\n this.overlay.set(regionId);\n }\n\n closeOverlay(): void {\n this.overlay.set(null);\n }\n\n toggle(regionId: string): void {\n this.setCollapsed(regionId, !this.isCollapsed(regionId));\n }\n\n expand(regionId: string): void {\n this.setCollapsed(regionId, false);\n }\n\n reset(): void {\n this.overlay.set(null);\n this.collapsed.set({});\n void this.store.delete(STORAGE_KEY);\n }\n\n private setCollapsed(regionId: string, value: boolean): void {\n if (value) {\n this.stash.evacuate(`${regionId}:`);\n }\n const next = { ...this.collapsed() };\n if (value) {\n next[regionId] = true;\n } else {\n delete next[regionId];\n }\n this.collapsed.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify(next));\n }\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\n\nconst STORAGE_KEY = 'lw.shell.panel-sizes';\n\nexport const DEFAULT_PANEL_WIDTH = 256;\n\nexport const MIN_PANEL_WIDTH = 180;\nexport const MAX_PANEL_WIDTH = 480;\n\nfunction clampWidth(px: number): number {\n return Math.round(Math.min(MAX_PANEL_WIDTH, Math.max(MIN_PANEL_WIDTH, px)));\n}\n\nfunction parseWidths(raw: string | undefined): Record<string, number> {\n if (!raw) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return {};\n }\n const result: Record<string, number> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (typeof value === 'number' && Number.isFinite(value)) {\n const clamped = clampWidth(value);\n if (clamped !== DEFAULT_PANEL_WIDTH) {\n result[key] = clamped;\n }\n }\n }\n return result;\n } catch {\n return {};\n }\n}\n\n@Service()\nexport class PanelSizeService {\n private readonly store = inject(WORKING_STATE_STORE);\n\n readonly minWidth = MIN_PANEL_WIDTH;\n readonly maxWidth = MAX_PANEL_WIDTH;\n\n private readonly widths = signal<Record<string, number>>(\n parseWidths(this.store.peek?.(STORAGE_KEY)),\n );\n private readonly dragging = signal(false);\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.widths.set(parseWidths(raw)),\n );\n }\n\n width(regionId: string): number {\n return this.widths()[regionId] ?? DEFAULT_PANEL_WIDTH;\n }\n\n isResizing(): boolean {\n return this.dragging();\n }\n\n beginResize(): void {\n this.dragging.set(true);\n }\n\n endResize(): void {\n this.dragging.set(false);\n this.persist();\n }\n\n setWidth(regionId: string, px: number): void {\n const clamped = clampWidth(px);\n this.widths.update((state) => {\n const next = { ...state };\n if (clamped === DEFAULT_PANEL_WIDTH) {\n delete next[regionId];\n } else {\n next[regionId] = clamped;\n }\n return next;\n });\n }\n\n commit(): void {\n this.persist();\n }\n\n reset(): void {\n this.widths.set({});\n void this.store.delete(STORAGE_KEY);\n }\n\n private persist(): void {\n void this.store.set(STORAGE_KEY, JSON.stringify(this.widths()));\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PanelSizeService } from './panel-size.service';\n\nconst STEP = 16;\nconst STEP_COARSE = 48;\n\n@Component({\n selector: 'lw-panel-splitter',\n imports: [TranslocoPipe],\n templateUrl: './panel-splitter.html',\n})\nexport class PanelSplitter {\n readonly regionId = input.required<string>();\n readonly dock = input.required<'left' | 'right'>();\n\n protected readonly size = inject(PanelSizeService);\n protected readonly width = computed(() => this.size.width(this.regionId()));\n\n private dragging = false;\n private startX = 0;\n private startWidth = 0;\n\n protected onPointerDown(event: PointerEvent): void {\n event.preventDefault();\n this.dragging = true;\n this.startX = event.clientX;\n this.startWidth = this.size.width(this.regionId());\n this.size.beginResize();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n }\n\n protected onPointerMove(event: PointerEvent): void {\n if (!this.dragging) {\n return;\n }\n\n const delta = event.clientX - this.startX;\n this.size.setWidth(\n this.regionId(),\n this.startWidth + this.edgeSign() * delta,\n );\n }\n\n protected onPointerUp(event: PointerEvent): void {\n if (!this.dragging) {\n return;\n }\n this.dragging = false;\n (event.target as HTMLElement).releasePointerCapture(event.pointerId);\n this.size.endResize();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const step = (event.shiftKey ? STEP_COARSE : STEP) * this.edgeSign();\n let next: number;\n switch (event.key) {\n case 'ArrowRight':\n next = this.width() + step;\n break;\n case 'ArrowLeft':\n next = this.width() - step;\n break;\n case 'Home':\n next = this.size.minWidth;\n break;\n case 'End':\n next = this.size.maxWidth;\n break;\n default:\n return;\n }\n event.preventDefault();\n this.size.setWidth(this.regionId(), next);\n this.size.commit();\n }\n\n private edgeSign(): number {\n return this.dock() === 'left' ? 1 : -1;\n }\n}\n","<div\n role=\"separator\"\n tabindex=\"0\"\n aria-orientation=\"vertical\"\n [attr.aria-label]=\"'panel.resize' | transloco\"\n [attr.aria-valuenow]=\"width()\"\n [attr.aria-valuemin]=\"size.minWidth\"\n [attr.aria-valuemax]=\"size.maxWidth\"\n class=\"absolute inset-y-0 z-10 w-1.5 cursor-col-resize touch-none transition-colors select-none hover:bg-brand/40 focus-visible:bg-brand/60 focus-visible:outline-none\"\n [class.right-0]=\"dock() === 'left'\"\n [class.left-0]=\"dock() === 'right'\"\n (pointerdown)=\"onPointerDown($event)\"\n (pointermove)=\"onPointerMove($event)\"\n (pointerup)=\"onPointerUp($event)\"\n (pointercancel)=\"onPointerUp($event)\"\n (keydown)=\"onKeydown($event)\"\n></div>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, EnvironmentInjector, Injector, computed, effect, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Type } from '@angular/core';\nimport { View } from '@loomweaver/plugin-sdk';\nimport { LayoutRegion, SHELL_LAYOUT } from '../../layout/layout';\nimport { ViewAction } from '../../layout/view';\nimport { ViewMountService } from '../../views/view-mount.service';\nimport { ComponentLoader } from '../../views/component-loader.service';\nimport { ViewInstanceSwitcher } from '../../views/view-instance-switcher';\nimport { PanelGroupService } from './panel-group.service';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { PaneTreeView } from '../pane/pane-tree-view';\nimport { VIEW_PANE_PREFIX, viewForPanePath } from '../pane/tree/pane-address';\nimport { PANEL_PANE_OPTIONS } from '../pane/pane-view-options';\nimport { RetainedComponent } from '../pane/retention/retained-component';\nimport {\n paneRetentionScope,\n retainSurfacePath,\n SURFACE_RETENTION,\n viewRetentionKey,\n} from '../pane/retention/retention-policy';\nimport { ContentSecondaryPane } from '../content/content-secondary-pane';\nimport { IframeSurface } from '../content/iframe-surface';\nimport { dockedSurfaceInjectorFactory } from '../content/routing/surface-injector';\nimport {\n ContributionRegistry,\n RegisteredView,\n} from '../../plugin/contribution-registry';\nimport { CommandService } from '../../commands/command.service';\nimport { AuthContext } from '../../auth/auth-context';\nimport { ViewportService } from '../../layout/viewport.service';\nimport { ShellBar } from '../bar/shell-bar';\nimport { PanelState } from './panel-state';\nimport { PanelSizeService } from './panel-size.service';\nimport { PanelSplitter } from './panel-splitter';\nimport { SHELL_FEATURES } from '../../foundation/shell-features';\n\n@Component({\n selector: 'lw-shell-panel',\n imports: [\n TranslocoPipe,\n ShellBar,\n PanelSplitter,\n PaneTreeView,\n ContentSecondaryPane,\n RetainedComponent,\n ViewInstanceSwitcher,\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './shell-panel.html',\n})\nexport class ShellPanel {\n readonly region = input.required<LayoutRegion>();\n\n private readonly commands = inject(CommandService);\n\n private readonly auth = inject(AuthContext);\n\n private readonly panels = inject(PanelState);\n\n protected readonly viewport = inject(ViewportService);\n\n protected readonly size = inject(PanelSizeService);\n\n private readonly layout = inject(SHELL_LAYOUT);\n\n private readonly panelGroup = inject(PanelGroupService);\n\n private readonly registry = inject(ContributionRegistry);\n\n private readonly paneTree = inject(PaneTreeService);\n\n private readonly viewMount = inject(ViewMountService);\n\n private readonly componentLoader = inject(ComponentLoader);\n\n private readonly retention = inject(SURFACE_RETENTION);\n\n private readonly dockedInjectorFor = dockedSurfaceInjectorFactory(\n inject(Injector),\n inject(EnvironmentInjector),\n );\n\n protected readonly features = inject(SHELL_FEATURES).sidebar;\n\n protected readonly iframeComponent = IframeSurface;\n\n protected readonly collapsed = computed(\n () => !this.viewport.compact() && this.panels.isCollapsed(this.region().id),\n );\n\n protected readonly widthPx = computed(() => {\n if (this.viewport.compact()) {\n return null;\n }\n return this.collapsed() ? 0 : this.size.width(this.region().id);\n });\n\n protected readonly splitterDock = computed<'left' | 'right' | null>(() => {\n if (!this.features.resize || this.viewport.compact() || this.collapsed()) {\n return null;\n }\n const dock = this.region().dock;\n return dock === 'left' || dock === 'right' ? dock : null;\n });\n\n protected readonly activePath = computed(() =>\n this.panelGroup.activePath(this.region().id),\n );\n\n protected readonly activeView = computed(() => {\n const path = this.activePath();\n if (!path?.startsWith(VIEW_PANE_PREFIX)) {\n return undefined;\n }\n return viewForPanePath(this.registry.views(), path);\n });\n\n protected readonly activeContentPath = computed(() => {\n const path = this.activePath();\n return path !== undefined && !path.startsWith(VIEW_PANE_PREFIX)\n ? path\n : undefined;\n });\n\n protected readonly actions = computed(() =>\n [...(this.activeView()?.actions ?? [])]\n .filter((action) => this.auth.visible(action.access))\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0)),\n );\n\n protected readonly panelPaneOptions = PANEL_PANE_OPTIONS;\n\n protected readonly primaryScope = computed(() =>\n paneRetentionScope(\n this.region().id,\n this.paneTree.primaryId(this.region().id),\n ),\n );\n\n protected readonly tree = computed(() =>\n this.paneTree.tree(this.region().id),\n );\n\n protected readonly footers = computed(() =>\n this.layout.regions.filter(\n (r) => r.type === 'bar' && r.dock === this.region().dock,\n ),\n );\n\n constructor() {\n effect(() => this.panelGroup.seed(this.region().id));\n }\n\n protected viewInjector(view: View): Injector {\n const carried = this.panelGroup.activeInstance(this.region().id);\n return carried\n ? this.viewMount.injectorForInstance(carried)\n : this.viewMount.injectorFor(view);\n }\n\n protected componentFor(view: View): Type<unknown> | null {\n return this.componentLoader.resolve(view);\n }\n\n protected dockedInjector(view: RegisteredView): Injector {\n const carried = this.panelGroup.activeInstance(this.region().id);\n return this.dockedInjectorFor(\n view,\n carried ?? this.viewMount.instanceIdFor(view),\n );\n }\n\n protected viewKeyFor(view: View): string {\n const carried = this.panelGroup.activeInstance(this.region().id);\n return viewRetentionKey(\n this.primaryScope(),\n VIEW_PANE_PREFIX + view.id,\n carried ?? undefined,\n );\n }\n\n protected viewRetains(view: View): boolean {\n return retainSurfacePath(\n this.registry.contentRoutes(),\n this.registry.views(),\n VIEW_PANE_PREFIX + view.id,\n this.retention,\n );\n }\n\n protected releaseCarriedInstance(): void {\n this.panelGroup.clearActiveInstance(this.region().id);\n }\n\n protected disabled(action: ViewAction): boolean {\n return this.auth.disabled(action.access);\n }\n\n protected run(action: ViewAction): void {\n if (this.disabled(action)) return;\n this.commands.trigger(action);\n }\n}\n","<aside\n class=\"relative flex h-full shrink-0 flex-col overflow-hidden border-border bg-surface transition-[width] duration-300 ease-out\"\n [class.w-72]=\"viewport.compact()\"\n [style.width.px]=\"widthPx()\"\n [style.transition]=\"size.isResizing() ? 'none' : null\"\n [attr.inert]=\"collapsed() ? '' : null\"\n [attr.aria-hidden]=\"collapsed() ? true : null\"\n>\n @if (splitterDock(); as dock) {\n <lw-panel-splitter [regionId]=\"region().id\" [dock]=\"dock\" />\n }\n @if (!collapsed()) {\n @if (activeView(); as view) {\n\n <div class=\"flex items-center gap-1 border-b border-border px-3 py-1.5\">\n @if (view.instanceable && features.instances) {\n <lw-view-instance-switcher [view]=\"view\" (beforeSwitch)=\"releaseCarriedInstance()\" />\n } @else {\n <span class=\"flex-1 truncate text-xs font-semibold tracking-wide text-content-faint uppercase\">\n {{ view.title | transloco }}\n </span>\n }\n @for (action of actions(); track action.id) {\n <button\n type=\"button\"\n (click)=\"run(action)\"\n [disabled]=\"disabled(action)\"\n class=\"lw-icon-btn h-10 w-10 rounded-md disabled:pointer-events-none disabled:opacity-40 md:h-7 md:w-7\"\n [attr.aria-label]=\"action.title | transloco\"\n >\n <lw-icon [name]=\"action.icon\" size=\"1rem\" />\n <lw-tooltip [text]=\"action.title | transloco\" position=\"bottom\" />\n </button>\n }\n </div>\n }\n\n <div class=\"flex min-h-0 flex-1 flex-col\">\n <lw-pane-tree-view\n class=\"min-h-0 flex-1\"\n [dock]=\"region().id\"\n [node]=\"tree()\"\n [primary]=\"activeViewPane\"\n [paneOptions]=\"panelPaneOptions\"\n />\n </div>\n\n <ng-template #activeViewPane>\n @if (activeView(); as view) {\n <div class=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-auto p-3 text-content\">\n @if (view.iframe) {\n <ng-container\n [lwRetainedComponent]=\"iframeComponent\"\n [componentInjector]=\"dockedInjector(view)\"\n [retentionKey]=\"viewKeyFor(view)\"\n mode=\"in-place\"\n [retain]=\"viewRetains(view)\"\n />\n } @else if (componentFor(view); as component) {\n <ng-container\n [lwRetainedComponent]=\"component\"\n [componentInjector]=\"viewInjector(view)\"\n [retentionKey]=\"viewKeyFor(view)\"\n [retain]=\"viewRetains(view)\"\n />\n }\n </div>\n } @else if (activeContentPath(); as path) {\n <lw-content-secondary-pane\n class=\"min-h-0 min-w-0 flex-1\"\n [path]=\"path\"\n variant=\"panel\"\n [retentionScope]=\"primaryScope()\"\n />\n } @else {\n <div class=\"min-h-0 min-w-0 flex-1\"></div>\n }\n </ng-template>\n\n @for (footer of footers(); track footer.id) {\n <lw-shell-bar [region]=\"footer\" class=\"shrink-0\" />\n }\n }\n</aside>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LayoutRegion, SHELL_LAYOUT } from '../../layout/layout';\nimport { LoomIconName } from '../../elements/icon/loom-icons';\nimport { ViewportService } from '../../layout/viewport.service';\nimport { PanelState } from './panel-state';\nimport { PanelGroupService } from './panel-group.service';\nimport {\n PANEL_STRIP_CONTEXT_MENU,\n VIEW_CONTEXT_MENU,\n} from './view-context-menu';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { TabDragSource } from '../pane/drag/pane-drag.service';\nimport { PaneMoveService, stripIdOf } from '../pane/drag/pane-move.service';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { PaneTabStrip } from '../pane/chrome/pane-tab-strip';\nimport { StripTab } from '../pane/chrome/strip-tab';\nimport { ContextMenuDirective } from '../../menu/context-menu.directive';\nimport { toStripTab } from '../pane/drag/pane-label';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { SHELL_FEATURES } from '../../foundation/shell-features';\n\nexport type SidebarHeaderContext = 'edge' | 'drawer' | 'floating';\n\n@Component({\n selector: 'lw-shell-sidebar-header',\n imports: [TranslocoPipe, PaneTabStrip, ContextMenuDirective],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './shell-sidebar-header.html',\n})\nexport class ShellSidebarHeader {\n readonly region = input.required<LayoutRegion>();\n readonly context = input<SidebarHeaderContext>('edge');\n\n private readonly panels = inject(PanelState);\n protected readonly viewport = inject(ViewportService);\n private readonly panelGroup = inject(PanelGroupService);\n private readonly paneTree = inject(PaneTreeService);\n private readonly paneMove = inject(PaneMoveService);\n private readonly registry = inject(ContributionRegistry);\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly features = inject(SHELL_FEATURES).sidebar;\n\n protected readonly viewContextMenu = VIEW_CONTEXT_MENU;\n\n protected readonly stripMenu = this.features.curate\n ? [PANEL_STRIP_CONTEXT_MENU]\n : [];\n\n protected readonly viewsReorderable = this.features.reorderViews;\n\n protected readonly viewsDraggable =\n this.features.reorderViews || this.features.moveViews;\n\n protected readonly canCollapse = computed(\n () => this.viewport.compact() || this.features.collapse,\n );\n\n protected readonly source = computed<TabDragSource>(() => ({\n dock: this.region().id,\n paneId: this.paneTree.primaryId(this.region().id),\n }));\n\n protected readonly stripId = computed(() => stripIdOf(this.source()));\n\n protected readonly hostId = computed(() => `panel-views-${this.region().id}`);\n\n protected readonly stripTabs = computed<StripTab[]>(() =>\n this.panelGroup\n .tabs(this.region().id)\n .map((tab) => toStripTab(this.registry, tab)),\n );\n\n protected readonly activeTabPath = computed(\n () => this.panelGroup.activePath(this.region().id) ?? '',\n );\n\n protected readonly showHamburger = computed(\n () => this.viewport.compact() && this.context() === 'edge',\n );\n\n protected readonly collapsed = computed(\n () => !this.viewport.compact() && this.panels.isCollapsed(this.region().id),\n );\n\n protected readonly showExpand = computed(() => this.context() === 'floating');\n\n protected readonly collapseIcon = computed<LoomIconName>(() =>\n this.region().dock === 'right' ? 'chevronsRight' : 'chevronsLeft',\n );\n protected readonly expandIcon = computed<LoomIconName>(() =>\n this.region().dock === 'right' ? 'chevronsLeft' : 'chevronsRight',\n );\n\n protected readonly acceptsTab = (path: string): boolean =>\n path.startsWith(VIEW_PANE_PREFIX)\n ? this.features.moveViews\n : this.features.acceptTabs;\n\n protected select(tab: StripTab): void {\n this.panelGroup.select(this.region().id, tab.path);\n }\n\n protected open(): void {\n this.panels.openOverlay(this.region().id);\n }\n\n protected trailingAction(): void {\n if (this.viewport.compact()) {\n this.panels.closeOverlay();\n } else {\n this.panels.toggle(this.region().id);\n }\n }\n\n protected expand(): void {\n this.panels.expand(this.region().id);\n }\n\n protected onReorder(order: string[]): void {\n this.paneTree.reorderPaneTabs(\n this.region().id,\n this.paneTree.primaryId(this.region().id),\n order,\n );\n }\n\n protected onStripKeydown(event: KeyboardEvent): void {\n const dock = this.dockForChord(event);\n if (dock === null) {\n return;\n }\n const path = (event.target as HTMLElement | null)?.closest<HTMLElement>(\n '[data-tab-path]',\n )?.dataset['tabPath'];\n const target = this.targetPanelOn(dock);\n if (!path || !target) {\n return;\n }\n event.preventDefault();\n this.paneMove.moveToStrip(this.source(), path, {\n dock: target.id,\n paneId: this.paneTree.primaryId(target.id),\n });\n this.panels.expand(target.id);\n }\n\n private dockForChord(event: KeyboardEvent): 'left' | 'right' | null {\n if (!this.features.moveViews || !event.altKey || !event.shiftKey) {\n return null;\n }\n if (event.key === 'ArrowRight') {\n return 'right';\n }\n return event.key === 'ArrowLeft' ? 'left' : null;\n }\n\n private targetPanelOn(dock: 'left' | 'right'): LayoutRegion | undefined {\n return this.layout.regions.find(\n (r) => r.type === 'panel' && r.dock === dock && r.id !== this.region().id,\n );\n }\n}\n","@if (showHamburger()) {\n\n <div\n class=\"flex h-12 w-10 shrink-0 items-center justify-center border-b border-border bg-surface\"\n >\n <button\n type=\"button\"\n (click)=\"open()\"\n class=\"lw-icon-btn h-9 w-9 rounded-md\"\n [attr.aria-label]=\"'panel.open' | transloco\"\n >\n <lw-icon name=\"menu\" size=\"1rem\" />\n <lw-tooltip [text]=\"'panel.open' | transloco\" position=\"bottom\" />\n </button>\n </div>\n} @else if (showExpand()) {\n\n <div\n class=\"flex h-12 items-center overflow-hidden border-b border-border bg-surface px-1.5\"\n >\n <button\n type=\"button\"\n (click)=\"expand()\"\n class=\"lw-icon-btn h-7 w-7 rounded-md\"\n [attr.aria-label]=\"'panel.expand' | transloco\"\n >\n <lw-icon [name]=\"expandIcon()\" size=\"1rem\" />\n <lw-tooltip [text]=\"'panel.expand' | transloco\" position=\"bottom\" />\n </button>\n </div>\n} @else if (!collapsed()) {\n\n <lw-pane-tab-strip\n class=\"block h-12\"\n [id]=\"hostId()\"\n variant=\"icons\"\n [tabs]=\"stripTabs()\"\n [activeId]=\"activeTabPath()\"\n [source]=\"source()\"\n [reorderable]=\"viewsReorderable\"\n [draggable]=\"viewsDraggable\"\n [acceptsTabs]=\"acceptsTab\"\n [viewContextMenuSlot]=\"viewContextMenu\"\n [contextGroup]=\"region().id\"\n [overflow]=\"true\"\n [paneActions]=\"trailing\"\n (selectTab)=\"select($event)\"\n (reorderTabs)=\"onReorder($event)\"\n (keydown)=\"onStripKeydown($event)\"\n [lwContextMenu]=\"stripMenu\"\n />\n <ng-template #trailing>\n @if (canCollapse()) {\n <button\n type=\"button\"\n (click)=\"trailingAction()\"\n class=\"lw-icon-btn h-10 w-10 self-center rounded-md md:h-7 md:w-7\"\n [attr.aria-label]=\"(viewport.compact() ? 'panel.close' : 'panel.collapse') | transloco\"\n >\n <lw-icon [name]=\"viewport.compact() ? 'close' : collapseIcon()\" size=\"1rem\" />\n <lw-tooltip [text]=\"(viewport.compact() ? 'panel.close' : 'panel.collapse') | transloco\" position=\"bottom\" />\n </button>\n }\n </ng-template>\n}\n","import { Command, MenuContext, MenuItem } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { ContentTabsService } from './content-tabs.service';\nimport { PaneMoveService } from '../../pane/drag/pane-move.service';\nimport { PopoutService } from '../../../popout/popout.service';\nimport { menuContextString } from '../../../menu/menu-context';\nimport { ShellFeatures } from '../../../foundation/shell-features';\n\nexport const TAB_CONTEXT_MENU = 'content/tab/context';\n\nexport function registerTabContextMenu(\n registry: ContributionRegistry,\n tabs: ContentTabsService,\n paneMove: PaneMoveService,\n popout: PopoutService,\n shell: ShellFeatures,\n): void {\n const features = shell.content;\n const closing: readonly Command[] = [\n {\n id: 'shell.tab.close',\n title: 'content.tabMenu.close',\n run: (c) => tabs.close(menuContextString(c, 'tabId')),\n },\n {\n id: 'shell.tab.closeOthers',\n title: 'content.tabMenu.closeOthers',\n run: (c) => tabs.closeOthers(menuContextString(c, 'tabId')),\n },\n {\n id: 'shell.tab.closeRight',\n title: 'content.tabMenu.closeRight',\n run: (c) => tabs.closeToRight(menuContextString(c, 'tabId')),\n },\n {\n id: 'shell.tab.closeAll',\n title: 'content.tabMenu.closeAll',\n run: () => tabs.closeAll(),\n },\n ];\n const pinning: readonly Command[] = [\n {\n id: 'shell.tab.togglePin',\n title: 'content.tabMenu.pinned',\n run: (c) =>\n c?.['pinned']\n ? tabs.unpin(menuContextString(c, 'tabId'))\n : tabs.pin(menuContextString(c, 'tabId')),\n },\n ];\n const splitting: readonly Command[] = [\n {\n id: 'shell.tab.splitRight',\n title: 'content.split.splitRight',\n icon: 'splitPanes',\n run: (c) =>\n paneMove.splitFromUrlGroup(menuContextString(c, 'tabId'), 'row'),\n },\n {\n id: 'shell.tab.splitDown',\n title: 'content.split.splitDown',\n icon: 'splitPanesDown',\n run: (c) =>\n paneMove.splitFromUrlGroup(menuContextString(c, 'tabId'), 'column'),\n },\n ];\n const commands: readonly Command[] = [\n ...(features.close ? closing : []),\n ...(features.pin ? pinning : []),\n ...(shell.windows.popout\n ? [\n {\n id: 'shell.tab.openInWindow',\n title: 'content.tabMenu.openInNewWindow',\n icon: 'popout',\n run: (c: MenuContext | undefined) =>\n popout.open(menuContextString(c, 'tabId')),\n },\n ]\n : []),\n ...splitting.filter((command) =>\n command.id === 'shell.tab.splitRight'\n ? features.splitRight\n : features.splitDown,\n ),\n ];\n const items: readonly MenuItem[] = [\n {\n id: 'menu:shell.tab.splitRight',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.splitRight',\n group: '0_split',\n order: 0,\n when: { closable: true },\n },\n {\n id: 'menu:shell.tab.splitDown',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.splitDown',\n group: '0_split',\n order: 1,\n when: { closable: true },\n },\n {\n id: 'menu:shell.tab.close',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.close',\n group: '1_close',\n order: 0,\n when: { closable: true },\n },\n {\n id: 'menu:shell.tab.closeOthers',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.closeOthers',\n group: '1_close',\n order: 1,\n },\n {\n id: 'menu:shell.tab.closeRight',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.closeRight',\n group: '1_close',\n order: 2,\n },\n {\n id: 'menu:shell.tab.closeAll',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.closeAll',\n group: '1_close',\n order: 3,\n },\n {\n id: 'menu:shell.tab.openInWindow',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.openInWindow',\n group: '3_window',\n order: 0,\n },\n {\n id: 'menu:shell.tab.togglePin',\n menu: TAB_CONTEXT_MENU,\n command: 'shell.tab.togglePin',\n group: '2_pin',\n order: 0,\n when: { closable: true },\n checkedWhen: { pinned: true },\n },\n ];\n const registered = new Set(commands.map((command) => command.id));\n commands.forEach((command) =>\n registry.addCommand({ ...command, paletteHidden: true }),\n );\n items\n .filter(\n (item) => item.command !== undefined && registered.has(item.command),\n )\n .forEach((item) => registry.addMenuItem(item));\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, EnvironmentInjector, Injector, Type, computed, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { ViewAction } from '@loomweaver/plugin-sdk';\nimport { CommandService } from '../../commands/command.service';\nimport { ContentTabsService } from './tabs/content-tabs.service';\nimport { ContentSecondaryPane } from './content-secondary-pane';\nimport { PaneTargetPicker } from './pane-target-picker.service';\nimport { TAB_CONTEXT_MENU } from './tabs/tab-context-menu';\nimport { SHELL_FEATURES } from '../../foundation/shell-features';\nimport { CONTENT_DOCK } from '../pane/tree/pane-address';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { PaneChromeService } from '../pane/chrome/pane-chrome.service';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { matchRoute } from './content-path';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { TabDragSource } from '../pane/drag/pane-drag.service';\nimport { PaneTabStrip } from '../pane/chrome/pane-tab-strip';\nimport { StripTab } from '../pane/chrome/strip-tab';\nimport { PaneToolbar } from '../pane/chrome/pane-toolbar';\nimport { RetainedComponent } from '../pane/retention/retained-component';\nimport {\n paneRetentionScope,\n retainSurfacePath,\n routeRetains,\n SURFACE_RETENTION,\n surfaceRetentionKey,\n} from '../pane/retention/retention-policy';\nimport { ComponentLoader } from '../../views/component-loader.service';\nimport { IframeSurface } from './iframe-surface';\nimport { surfaceInjectorFactory } from './routing/surface-injector';\n\n@Component({\n selector: 'lw-content-area',\n imports: [\n RouterOutlet,\n PaneTabStrip,\n PaneToolbar,\n ContentSecondaryPane,\n RetainedComponent,\n ],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './content-area.html',\n})\nexport class ContentArea {\n private readonly commands = inject(CommandService);\n private readonly picker = inject(PaneTargetPicker);\n protected readonly tabs = inject(ContentTabsService);\n protected readonly tabContextMenu = TAB_CONTEXT_MENU;\n private readonly chrome = inject(PaneChromeService);\n private readonly layout = inject(PaneTreeService);\n private readonly registry = inject(ContributionRegistry);\n private readonly auth = inject(AuthContext);\n protected readonly features = inject(SHELL_FEATURES).content;\n private readonly retention = inject(SURFACE_RETENTION);\n\n private readonly componentLoader = inject(ComponentLoader);\n\n private readonly surfaceInjectorFor = surfaceInjectorFactory(\n inject(Injector),\n inject(EnvironmentInjector),\n { urlDriven: true },\n );\n\n private readonly urlPaneId = computed(() =>\n this.layout.primaryId(CONTENT_DOCK),\n );\n\n protected readonly urlGroup = computed<TabDragSource>(() => ({\n dock: CONTENT_DOCK,\n paneId: this.urlPaneId(),\n }));\n\n protected readonly urlGroupScope = computed(() =>\n paneRetentionScope(CONTENT_DOCK, this.urlPaneId()),\n );\n\n protected readonly iframeSurface = computed<{\n component: Type<unknown>;\n injector: Injector;\n } | null>(() => {\n if (this.tabs.activeViewPath() !== null) {\n return null;\n }\n const path = this.tabs.activeTabRoot();\n const route = matchRoute(this.registry.contentRoutes(), path);\n if (route?.iframe === undefined || !this.auth.meets(route.access)) {\n return null;\n }\n return {\n component: IframeSurface,\n injector: this.surfaceInjectorFor(route, path, this.surfaceKey()),\n };\n });\n\n protected readonly retainedSurface = computed<{\n component: Type<unknown>;\n injector: Injector;\n } | null>(() => {\n if (this.tabs.activeViewPath() !== null) {\n return null;\n }\n const path = this.tabs.activeTabRoot();\n const route = matchRoute(this.registry.contentRoutes(), path);\n if (\n route === undefined ||\n route.iframe !== undefined ||\n route.container !== undefined ||\n !routeRetains(route, this.retention) ||\n !this.auth.meets(route.access)\n ) {\n return null;\n }\n const component = this.componentLoader.resolve(route);\n if (component === null) {\n return null;\n }\n return {\n component,\n injector: this.surfaceInjectorFor(route, path, this.surfaceKey()),\n };\n });\n\n protected readonly surfaceKey = computed(() =>\n surfaceRetentionKey(this.urlGroupScope(), this.tabs.activeTabRoot()),\n );\n\n protected readonly iframeRetain = computed(() =>\n retainSurfacePath(\n this.registry.contentRoutes(),\n this.registry.views(),\n this.tabs.activeTabRoot(),\n this.retention,\n ),\n );\n\n protected readonly canAddTab = computed(() => this.features.newTab);\n protected readonly canMaximize = computed(() => this.features.maximize);\n protected readonly maximized = computed(() =>\n this.chrome.isMaximized(CONTENT_DOCK, this.urlPaneId()),\n );\n\n private readonly isSplit = computed(() => this.layout.isSplit(CONTENT_DOCK));\n private readonly activeSplitPath = computed(\n () => this.tabs.activeViewPath() ?? this.tabs.activeTabRoot(),\n );\n private readonly splittable = computed(() => {\n if (this.tabs.activeViewPath() !== null) {\n return true;\n }\n const route = matchRoute(\n this.registry.contentRoutes(),\n this.tabs.activeTabRoot(),\n );\n return route !== undefined && this.auth.meets(route.access);\n });\n\n protected readonly canSplitRight = computed(\n () => this.features.splitRight && this.splittable(),\n );\n protected readonly canSplitDown = computed(\n () => this.features.splitDown && this.splittable(),\n );\n\n protected readonly activeIsContainer = computed(() => {\n const route = matchRoute(\n this.registry.contentRoutes(),\n this.tabs.activeTabRoot(),\n );\n return route?.container !== undefined;\n });\n\n protected readonly activeIsPadded = computed(() => {\n if (this.activeIsContainer()) {\n return false;\n }\n const route = matchRoute(\n this.registry.contentRoutes(),\n this.tabs.activeTabRoot(),\n );\n return route?.padded !== false;\n });\n\n protected readonly canMinimize = computed(\n () => this.features.minimize && this.isSplit() && !this.maximized(),\n );\n protected readonly canClose = computed(\n () => this.isSplit() && !this.maximized(),\n );\n\n protected readonly canNewTabFloating = computed(\n () => this.features.newTab && !this.maximized(),\n );\n protected readonly canSplitRightFloating = computed(\n () => this.canSplitRight() && !this.maximized(),\n );\n protected readonly canSplitDownFloating = computed(\n () => this.canSplitDown() && !this.maximized(),\n );\n protected readonly showFloating = computed(\n () =>\n !this.tabs.showStrip() &&\n (this.canNewTabFloating() ||\n this.canSplitRightFloating() ||\n this.canSplitDownFloating() ||\n this.canMinimize() ||\n this.canMaximize() ||\n this.canClose()),\n );\n\n protected readonly tabsReorderable = this.features.reorderTabs;\n\n protected readonly tabsDraggable =\n this.features.reorderTabs ||\n this.features.moveTabs ||\n this.features.splitRight ||\n this.features.splitDown;\n\n protected readonly stripTabs = computed<StripTab[]>(() =>\n this.tabs.tabs().map((tab) => ({\n ...tab,\n closable: tab.closable && this.features.close,\n })),\n );\n\n protected readonly activeId = computed(\n () => this.tabs.activeViewPath() ?? this.tabs.activeTabRoot(),\n );\n\n protected select(tab: StripTab): void {\n if (tab.path.startsWith(VIEW_PANE_PREFIX)) {\n this.tabs.activateViewTab(tab.path);\n return;\n }\n this.tabs.navigateTo(tab.navPath ?? tab.path);\n }\n\n protected escalate(tab: StripTab): void {\n if (!this.features.escalate || tab.path.startsWith(VIEW_PANE_PREFIX)) {\n return;\n }\n if (tab.preview) {\n this.tabs.keep(tab.path);\n } else if (!this.features.pin) {\n return;\n } else if (tab.pinned) {\n this.tabs.unpin(tab.path);\n } else if (tab.closable) {\n this.tabs.pin(tab.path);\n }\n }\n\n protected runAction(action: ViewAction): void {\n this.commands.trigger(action);\n }\n\n protected onReorder(ids: string[]): void {\n this.tabs.reorder(ids);\n }\n\n protected toggleMaximize(): void {\n this.chrome.toggleMaximize(CONTENT_DOCK, this.urlPaneId());\n }\n\n protected minimize(): void {\n this.chrome.toggleMinimize(CONTENT_DOCK, this.urlPaneId());\n }\n\n protected closePrimary(): void {\n this.tabs.closePrimaryPane();\n }\n\n protected split(orientation: 'row' | 'column'): void {\n this.layout.splitPane(\n CONTENT_DOCK,\n this.urlPaneId(),\n orientation,\n this.activeSplitPath(),\n );\n }\n\n protected newTab(event: Event): void {\n this.picker.openForNavigation(event.currentTarget as HTMLElement, (path) =>\n this.tabs.navigateTo(path),\n );\n }\n}\n","<div class=\"relative flex h-full flex-col\">\n @if (tabs.showStrip()) {\n <lw-pane-tab-strip\n [tabs]=\"stripTabs()\"\n [activeId]=\"activeId()\"\n [source]=\"urlGroup()\"\n [urlDriven]=\"true\"\n [reorderable]=\"tabsReorderable\"\n [draggable]=\"tabsDraggable\"\n [acceptsTabs]=\"features.moveTabs\"\n [contextMenuSlot]=\"tabContextMenu\"\n [contextGroup]=\"''\"\n [overflow]=\"true\"\n [canAddTab]=\"canAddTab()\"\n [paneActions]=\"urlToolbar\"\n (selectTab)=\"select($event)\"\n (escalate)=\"escalate($event)\"\n (closeTab)=\"tabs.close($event.path)\"\n (unpinTab)=\"tabs.unpin($event.path)\"\n (reorderTabs)=\"onReorder($event)\"\n (runAction)=\"runAction($event)\"\n (revealRequest)=\"tabs.bringToFront($event)\"\n (addTab)=\"newTab($event)\"\n />\n }\n <ng-template #urlToolbar>\n <lw-pane-toolbar\n [canSplitRight]=\"canSplitRight()\"\n [canSplitDown]=\"canSplitDown()\"\n [canMinimize]=\"canMinimize()\"\n [canMaximize]=\"canMaximize()\"\n [maximized]=\"maximized()\"\n [canClose]=\"canClose()\"\n (splitRight)=\"split('row')\"\n (splitDown)=\"split('column')\"\n (minimize)=\"minimize()\"\n (toggleMaximize)=\"toggleMaximize()\"\n (closePane)=\"closePrimary()\"\n />\n </ng-template>\n <main\n id=\"lw-main-content\"\n tabindex=\"-1\"\n class=\"flex-1 text-content outline-none\"\n [class.overflow-auto]=\"!activeIsContainer()\"\n [class.bg-surface-raised]=\"!activeIsContainer()\"\n [class.p-6]=\"activeIsPadded()\"\n [class.flex]=\"activeIsContainer()\"\n [class.min-h-0]=\"activeIsContainer()\"\n [class.min-w-0]=\"activeIsContainer()\"\n [class.hidden]=\"tabs.activeViewPath()\"\n >\n <router-outlet />\n <div class=\"h-full\" [class.hidden]=\"!iframeSurface()\">\n <ng-container\n [lwRetainedComponent]=\"iframeSurface()?.component ?? null\"\n [componentInjector]=\"iframeSurface()?.injector ?? null\"\n [retentionKey]=\"surfaceKey()\"\n mode=\"in-place\"\n [retain]=\"iframeRetain()\"\n />\n </div>\n <div class=\"h-full\" [class.hidden]=\"!retainedSurface()\">\n <ng-container\n [lwRetainedComponent]=\"retainedSurface()?.component ?? null\"\n [componentInjector]=\"retainedSurface()?.injector ?? null\"\n [retentionKey]=\"surfaceKey()\"\n mode=\"move\"\n [retain]=\"true\"\n />\n </div>\n </main>\n @if (tabs.activeViewPath(); as viewPath) {\n <lw-content-secondary-pane class=\"min-h-0 flex-1\" [path]=\"viewPath\" [instanceId]=\"tabs.activeViewInstance()\" variant=\"content\" [retentionScope]=\"urlGroupScope()\" />\n }\n @if (showFloating()) {\n <lw-pane-toolbar\n class=\"absolute top-1.5 right-2 z-30 rounded-md bg-surface-raised/85 px-0.5 ring-1 ring-border\"\n [canNewTab]=\"canNewTabFloating()\"\n [canSplitRight]=\"canSplitRightFloating()\"\n [canSplitDown]=\"canSplitDownFloating()\"\n [canMinimize]=\"canMinimize()\"\n [canMaximize]=\"canMaximize()\"\n [maximized]=\"maximized()\"\n [canClose]=\"canClose()\"\n newTabTestId=\"content-new-tab\"\n splitRightTestId=\"content-split-toggle\"\n splitDownTestId=\"content-split-down\"\n (newTab)=\"newTab($event)\"\n (splitRight)=\"split('row')\"\n (splitDown)=\"split('column')\"\n (minimize)=\"minimize()\"\n (toggleMaximize)=\"toggleMaximize()\"\n (closePane)=\"closePrimary()\"\n />\n }\n</div>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, effect, inject, untracked } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { ContentArea } from './content-area';\nimport { findLeaf } from '../pane/tree/pane-queries';\nimport { PaneTreeView } from '../pane/pane-tree-view';\nimport { PaneChromeService } from '../pane/chrome/pane-chrome.service';\nimport { CONTENT_DOCK } from '../pane/tree/pane-address';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\n\n@Component({\n selector: 'lw-content-grid',\n imports: [ContentArea, PaneTreeView],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n host: {\n class: 'flex min-h-0 min-w-0 overflow-hidden',\n '[class.relative]': '!maximized()',\n '[class.fixed]': 'maximized()',\n '[class.inset-0]': 'maximized()',\n '[class.z-40]': 'maximized()',\n '[class.bg-surface]': 'maximized()',\n },\n templateUrl: './content-grid.html',\n})\nexport class ContentGrid {\n private readonly layout = inject(PaneTreeService);\n private readonly chrome = inject(PaneChromeService);\n\n protected readonly contentDock = CONTENT_DOCK;\n\n private readonly maximizedPaneId = computed(() =>\n this.chrome.maximizedPaneIn(CONTENT_DOCK),\n );\n protected readonly maximized = computed(\n () => this.maximizedPaneId() !== null,\n );\n\n protected readonly tree = computed(() => {\n const full = this.layout.tree(CONTENT_DOCK);\n const paneId = this.maximizedPaneId();\n return paneId === null ? full : (findLeaf(full, paneId) ?? full);\n });\n\n constructor() {\n const doc = inject(DOCUMENT);\n const onKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.chrome.restore();\n }\n };\n effect((onCleanup) => {\n if (!this.maximized()) {\n return;\n }\n doc.addEventListener('keydown', onKeydown);\n onCleanup(() => doc.removeEventListener('keydown', onKeydown));\n });\n effect(() => {\n if (!this.layout.isSplit(CONTENT_DOCK)) {\n untracked(() => this.chrome.clearMinimized(CONTENT_DOCK));\n }\n });\n }\n}\n","<lw-pane-tree-view class=\"min-h-0 min-w-0 flex-1\" [dock]=\"contentDock\" [node]=\"tree()\" [primary]=\"primaryPane\" />\n\n<ng-template #primaryPane>\n <lw-content-area class=\"min-h-0 min-w-0 flex-1\" />\n</ng-template>\n","import { LwButtonSize, LwButtonVariant } from '@loomweaver/plugin-sdk';\n\nexport function lwButtonClasses(\n variant: LwButtonVariant,\n size: LwButtonSize,\n iconOnly: boolean,\n): string[] {\n const classes = ['lw-btn', `lw-btn--${variant}`];\n if (size === 'sm') {\n classes.push('lw-btn--sm');\n }\n if (iconOnly) {\n classes.push('lw-btn--icon');\n }\n return classes;\n}\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\nimport { LwButtonVariant, LwButtonSize } from '@loomweaver/plugin-sdk';\nimport { lwButtonClasses } from './lw-button-classes';\n\nexport type { LwButtonVariant, LwButtonSize } from '@loomweaver/plugin-sdk';\n\n/**\n * The neutral host button primitive. A directive on a real `<button>`/`<a>`, so it\n * keeps native semantics (type, disabled, focus, aria) and its own content — consumers just add\n * `lwButton` and pick a variant.\n *\n * The button LOOK is a CSS-class contract (`.lw-btn` in theme.css): this directive is\n * only a thin wrapper that emits those class names from typed inputs. So the very same look is\n * reachable by SDK-only plugins that cannot import this directive across the Nx boundary — they\n * write `<button class=\"lw-btn lw-btn--primary\">`. One source of truth, all on semantic tokens,\n * so a theme / tenant override reaches host and plugin buttons alike.\n *\n * <button lwButton variant=\"primary\" (click)=\"save()\">Speichern</button>\n * <button lwButton variant=\"ghost\" size=\"sm\" iconOnly aria-label=\"…\"><lw-icon … /></button>\n */\n@Directive({\n selector: 'button[lwButton], a[lwButton]',\n host: { '[class]': 'classes()' },\n})\nexport class LwButton {\n /** Visual weight; defaults to `default`. */\n readonly variant = input<LwButtonVariant>('default');\n /** Size; defaults to `md`. */\n readonly size = input<LwButtonSize>('md');\n /** Square, equal-padding button for a single icon (needs its own `aria-label`). */\n readonly iconOnly = input(false, { transform: booleanAttribute });\n\n protected readonly classes = computed(() =>\n lwButtonClasses(this.variant(), this.size(), this.iconOnly()).join(' '),\n );\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LwButton } from '../elements/button/lw-button';\nimport { LoomIconName } from '../elements/icon/loom-icons';\nimport {\n Notification,\n NotificationKind,\n NotificationService,\n} from './notification.service';\n\n/**\n * Renders the active notifications as toasts in a fixed corner. Mounted once\n * by the shell root, so every distribution gets it for free. Each toast shows its kind\n * icon, message, an optional action button and a dismiss control. The kind selects the\n * icon; a feedback-colour token ladder can be added later if toasts grow richer.\n */\n@Component({\n selector: 'lw-toasts',\n imports: [TranslocoPipe, LwButton],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './toast-outlet.html',\n})\nexport class ToastOutlet {\n private readonly service = inject(NotificationService);\n protected readonly notifications = this.service.notifications;\n\n private readonly icons: Record<NotificationKind, LoomIconName> = {\n info: 'info',\n success: 'success',\n warning: 'warning',\n error: 'error',\n };\n\n private readonly iconColors: Record<NotificationKind, string> = {\n info: 'text-info',\n success: 'text-positive',\n warning: 'text-caution',\n error: 'text-negative',\n };\n\n protected iconFor(kind: NotificationKind): LoomIconName {\n return this.icons[kind];\n }\n\n protected iconColorFor(kind: NotificationKind): string {\n return this.iconColors[kind];\n }\n\n protected roleFor(kind: NotificationKind): 'alert' | 'status' {\n return kind === 'error' || kind === 'warning' ? 'alert' : 'status';\n }\n\n protected runAction(toast: Notification): void {\n toast.action?.run();\n this.service.dismiss(toast.id);\n }\n\n protected dismiss(id: string): void {\n this.service.dismiss(id);\n }\n}\n","@if (notifications().length) {\n <section\n class=\"pointer-events-none fixed inset-x-0 bottom-0 z-[60] flex flex-col items-center gap-2 p-4 sm:inset-x-auto sm:right-0\"\n [attr.aria-label]=\"'notification.region' | transloco\"\n >\n @for (toast of notifications(); track toast.id) {\n <div\n [attr.role]=\"roleFor(toast.kind)\"\n class=\"pointer-events-auto flex w-full max-w-sm items-start gap-3 rounded-lg border border-border bg-surface-raised p-3 shadow-lg\"\n >\n <lw-icon\n [name]=\"iconFor(toast.kind)\"\n size=\"1.25rem\"\n [class]=\"'mt-0.5 shrink-0 ' + iconColorFor(toast.kind)\"\n />\n <div class=\"flex min-w-0 flex-1 flex-col gap-2\">\n <p class=\"text-sm text-content\">{{ toast.message | transloco }}</p>\n @if (toast.action; as action) {\n <button\n lwButton\n variant=\"primary\"\n size=\"sm\"\n type=\"button\"\n class=\"self-start\"\n (click)=\"runAction(toast)\"\n >\n {{ action.label | transloco }}\n </button>\n }\n </div>\n <button\n lwButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n class=\"shrink-0\"\n [attr.aria-label]=\"'notification.dismiss' | transloco\"\n (click)=\"dismiss(toast.id)\"\n >\n <lw-icon name=\"close\" size=\"1rem\" />\n </button>\n </div>\n }\n </section>\n}\n","import { Component, ViewEncapsulation, input } from '@angular/core';\n\n/**\n * A small indeterminate spinner. Pure CSS ring on `currentColor`\n * (brand by default), sized via the `size` input. Used by the progress dialog and anywhere a\n * busy indicator is needed.\n *\n * <lw-spinner />\n * <lw-spinner size=\"1rem\" [label]=\"'…' | transloco\" />\n */\n@Component({\n selector: 'lw-spinner',\n encapsulation: ViewEncapsulation.None,\n templateUrl: './lw-spinner.html',\n})\nexport class LwSpinner {\n /** CSS size of the spinner (width = height). */\n readonly size = input('1.5rem');\n /** Accessible label announced to screen readers — pass a translated string; empty = none. */\n readonly label = input('');\n}\n","<span\n class=\"lw-spinner-ring inline-block shrink-0 animate-spin rounded-full border-2 border-current border-t-transparent text-brand\"\n [style.width]=\"size()\"\n [style.height]=\"size()\"\n role=\"status\"\n [attr.aria-label]=\"label() || null\"\n ></span>\n","import { DOCUMENT, NgComponentOutlet } from '@angular/common';\nimport { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, afterRenderEffect, effect, inject, viewChildren } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LwButton } from '../elements/button/lw-button';\nimport { LwSpinner } from '../elements/spinner/lw-spinner';\nimport {\n DialogButtonView,\n DialogInstance,\n DialogService,\n DialogSize,\n DialogTone,\n} from './dialog.service';\n\nconst PANEL_WIDTH: Record<DialogSize, string> = {\n md: 'max-w-md',\n lg: 'max-w-2xl',\n xl: 'max-w-6xl',\n};\n\nconst MAXIMIZED_PANEL = 'h-[94vh] w-[96vw] max-w-none';\n\nconst TONE_CIRCLE: Record<DialogTone, string> = {\n default: 'bg-brand/10 text-brand',\n info: 'bg-info/10 text-info',\n success: 'bg-positive/10 text-positive',\n warning: 'bg-caution/10 text-caution',\n danger: 'bg-negative/10 text-negative',\n};\n\n/**\n * Renders the open dialogs once, mounted by the shell root. Draws the frame\n * (backdrop, panel, title, close-X, footer buttons) and either the convenience body\n * (message + optional prompt input) or a plugin's custom body via NgComponentOutlet.\n * Owns the modal mechanics: scroll-lock, Escape + backdrop dismiss, focus into the newest\n * dialog + restore on close, and a lightweight focus trap.\n */\n@Component({\n selector: 'lw-dialog-outlet',\n imports: [NgComponentOutlet, TranslocoPipe, LwButton, LwSpinner],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './dialog-outlet.html',\n host: {\n '(document:keydown.escape)': 'onEscape()',\n '(document:focusin)': 'onFocusIn($event)',\n '(document:keydown.tab)': 'onTab($event, false)',\n '(document:keydown.shift.tab)': 'onTab($event, true)',\n },\n})\nexport class DialogOutlet {\n private readonly service = inject(DialogService);\n\n private readonly document = inject(DOCUMENT);\n\n protected readonly dialogs = this.service.dialogs;\n\n private readonly panels = viewChildren<ElementRef<HTMLElement>>('panel');\n\n constructor() {\n effect(() => {\n this.document.body.style.overflow = this.dialogs().length ? 'hidden' : '';\n });\n afterRenderEffect(() => {\n const panels = this.panels();\n if (!this.dialogs().length || !panels.length) {\n return;\n }\n const top = panels[panels.length - 1].nativeElement;\n if (top.contains(this.document.activeElement)) {\n return;\n }\n (top.querySelector<HTMLElement>('[data-lw-autofocus]') ?? top).focus();\n });\n }\n\n protected onEscape(): void {\n const top = this.top();\n if (top?.dismissable) {\n top.ref.close();\n }\n }\n\n protected onFocusIn(event: FocusEvent): void {\n const top = this.topPanel();\n const target = event.target as Node | null;\n if (top && target && !top.contains(target)) {\n (this.focusable(top)[0] ?? top).focus();\n }\n }\n\n protected onTab(event: Event, backward: boolean): void {\n const top = this.topPanel();\n if (!top) {\n return;\n }\n const focusables = this.focusable(top);\n if (!focusables.length) {\n return;\n }\n const first = focusables[0];\n const last = focusables[focusables.length - 1];\n const active = this.document.activeElement;\n if (backward && active === first) {\n last.focus();\n event.preventDefault();\n } else if (!backward && active === last) {\n first.focus();\n event.preventDefault();\n }\n }\n\n protected dismiss(dialog: DialogInstance): void {\n if (dialog.dismissable) {\n dialog.ref.close();\n }\n }\n\n protected onButton(dialog: DialogInstance, button: DialogButtonView): void {\n if (button.role === 'custom') {\n dialog.ref.close(button.value);\n } else if (button.role === 'cancel') {\n dialog.ref.close();\n } else if (dialog.kind === 'confirm') {\n dialog.ref.close(true);\n } else if (dialog.kind === 'prompt') {\n dialog.ref.close(dialog.promptValue?.());\n } else {\n dialog.ref.close();\n }\n }\n\n protected onPromptInput(dialog: DialogInstance, event: Event): void {\n dialog.promptValue?.set((event.target as HTMLInputElement).value);\n }\n\n protected onEnter(dialog: DialogInstance): void {\n if (!dialog.promptValue) {\n return;\n }\n if (\n dialog.requireValidate &&\n dialog.requireValidate(dialog.promptValue()) !== null\n ) {\n return;\n }\n dialog.ref.close(dialog.kind === 'prompt' ? dialog.promptValue() : true);\n }\n\n protected confirmBlocked(\n dialog: DialogInstance,\n button: DialogButtonView,\n ): boolean {\n return (\n button.role === 'confirm' &&\n !!dialog.requireValidate &&\n dialog.requireValidate(dialog.promptValue?.() ?? '') !== null\n );\n }\n\n protected guardError(dialog: DialogInstance): string | null {\n const value = dialog.promptValue?.() ?? '';\n if (!dialog.requireValidate || value.length === 0) {\n return null;\n }\n return dialog.requireValidate(value);\n }\n\n protected wrapperClasses(dialog: DialogInstance): string {\n const base = 'fixed inset-0 z-[70] flex justify-center';\n return dialog.align === 'top'\n ? `${base} items-start p-3 pt-[8vh] sm:p-4 sm:pt-[12vh]`\n : `${base} items-end sm:items-center sm:p-4`;\n }\n\n protected toneCircle(tone: DialogTone): string {\n return TONE_CIRCLE[tone];\n }\n\n protected panelWidth(dialog: DialogInstance): string {\n if (dialog.ref.maximized()) {\n return MAXIMIZED_PANEL;\n }\n return PANEL_WIDTH[dialog.size ?? 'md'];\n }\n\n private topPanel(): HTMLElement | undefined {\n const panels = this.panels();\n return panels.length ? panels[panels.length - 1].nativeElement : undefined;\n }\n\n private focusable(root: HTMLElement): HTMLElement[] {\n const selector =\n 'button:not(:disabled), a[href], input:not(:disabled), select:not(:disabled), textarea:not(:disabled), [tabindex]:not([tabindex=\"-1\"])';\n return [...root.querySelectorAll<HTMLElement>(selector)];\n }\n\n private top(): DialogInstance | undefined {\n const list = this.dialogs();\n return list[list.length - 1];\n }\n}\n","@for (d of dialogs(); track d.id) {\n <div [class]=\"wrapperClasses(d)\">\n <button\n type=\"button\"\n class=\"lw-scrim absolute inset-0 cursor-default\"\n [disabled]=\"!d.dismissable\"\n [attr.aria-label]=\"'dialog.close' | transloco\"\n (click)=\"dismiss(d)\"\n ></button>\n\n @if (d.bare) {\n <dialog\n #panel\n open\n class=\"relative z-10 m-0 flex max-h-full w-full flex-col overflow-hidden rounded-t-xl border border-border bg-surface-raised shadow-xl sm:rounded-xl\"\n [class.rounded-xl]=\"d.align === 'top'\"\n [class]=\"panelWidth(d)\"\n aria-modal=\"true\"\n [attr.aria-label]=\"d.title ? (d.title | transloco) : null\"\n tabindex=\"-1\"\n >\n <ng-container\n [ngComponentOutlet]=\"d.component ?? null\"\n [ngComponentOutletInjector]=\"d.injector\"\n />\n </dialog>\n } @else {\n <dialog\n #panel\n open\n class=\"relative z-10 m-0 flex max-h-full w-full flex-col gap-4 overflow-y-auto rounded-t-xl border border-border bg-surface-raised p-5 shadow-xl sm:rounded-xl\"\n [class.rounded-xl]=\"d.align === 'top'\"\n [class]=\"panelWidth(d)\"\n aria-modal=\"true\"\n [attr.aria-label]=\"d.title ? (d.title | transloco) : null\"\n tabindex=\"-1\"\n >\n <div class=\"flex gap-3.5\">\n @if (d.icon; as icon) {\n <span\n class=\"grid h-10 w-10 shrink-0 place-items-center rounded-full\"\n [class]=\"toneCircle(d.tone)\"\n aria-hidden=\"true\"\n >\n <lw-icon [name]=\"icon\" size=\"1.25rem\" />\n </span>\n }\n\n <div class=\"flex min-w-0 flex-1 flex-col gap-3\">\n @if (d.title || (d.kind === 'custom' && d.dismissable)) {\n <div class=\"flex items-start justify-between gap-4\">\n <h2 class=\"min-w-0 text-lg font-semibold text-content\">\n @if (d.title) {\n {{ d.title | transloco }}\n }\n </h2>\n <span class=\"flex shrink-0 items-center gap-1\">\n @if (d.maximizable) {\n <button\n lwButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n class=\"-mt-1\"\n [attr.aria-label]=\"\n (d.ref.maximized() ? 'dialog.restore' : 'dialog.maximize') | transloco\n \"\n (click)=\"d.ref.toggleMaximized()\"\n >\n <lw-icon [name]=\"d.ref.maximized() ? 'restore' : 'maximize'\" size=\"1rem\" />\n </button>\n }\n @if (d.kind === 'custom' && d.dismissable) {\n <button\n lwButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n class=\"-mt-1 -mr-1\"\n [attr.aria-label]=\"'dialog.close' | transloco\"\n (click)=\"dismiss(d)\"\n >\n <lw-icon name=\"close\" size=\"1rem\" />\n </button>\n }\n </span>\n </div>\n }\n\n @if (d.component) {\n <ng-container\n [ngComponentOutlet]=\"d.component\"\n [ngComponentOutletInjector]=\"d.injector\"\n />\n } @else if (d.kind === 'progress') {\n <div class=\"flex items-center gap-3 text-sm text-content\">\n <lw-spinner [label]=\"'progress.busy' | transloco\" />\n @if (d.progressMessage) {\n <span>{{ d.progressMessage() | transloco }}</span>\n }\n </div>\n } @else {\n @if (d.message) {\n <lw-markdown [source]=\"d.message | transloco\" />\n }\n @if (d.requireLabel) {\n <lw-markdown [source]=\"d.requireLabel | transloco\" />\n }\n @if (d.promptValue) {\n <input\n type=\"text\"\n class=\"lw-field\"\n [class.lw-field--invalid]=\"guardError(d)\"\n [value]=\"d.promptValue()\"\n [attr.placeholder]=\"d.placeholder ? (d.placeholder | transloco) : null\"\n (input)=\"onPromptInput(d, $event)\"\n (keydown.enter)=\"onEnter(d)\"\n data-lw-autofocus\n />\n @if (guardError(d); as error) {\n <p class=\"text-xs text-negative\">{{ error | transloco }}</p>\n }\n }\n }\n </div>\n </div>\n\n @if (d.buttons.length) {\n <div class=\"flex justify-end gap-2\">\n @for (b of d.buttons; track $index) {\n <button\n lwButton\n [variant]=\"b.variant\"\n type=\"button\"\n [disabled]=\"confirmBlocked(d, b)\"\n [attr.data-lw-autofocus]=\"b.autofocus ? '' : null\"\n (click)=\"onButton(d, b)\"\n >\n {{ b.label | transloco }}\n </button>\n }\n </div>\n }\n </dialog>\n }\n </div>\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { DialogService } from '../dialog/dialog.service';\nimport { isPopoutUrl, popoutUrlFor } from './popout-path';\n\n/**\n * Opening a surface in its own browser window, and knowing whether this window **is** one.\n *\n * A pop-out boots the same app from a `/popout/…` URL and renders exactly one surface — no rail, no\n * sidebars, no pane tree — so the main window stays the only writer of the layout keys. The mode is\n * read from the location once at startup: a pop-out never becomes a main window, and the shell needs\n * the answer before it renders anything.\n */\n@Service()\nexport class PopoutService {\n /** Whether this browser window is a pop-out. Fixed for the window's lifetime. */\n readonly active: boolean;\n\n private readonly document = inject(DOCUMENT);\n private readonly dialogs = inject(DialogService);\n private readonly transloco = inject(TranslocoService);\n\n constructor() {\n this.active = isPopoutUrl(this.document.location?.pathname ?? '');\n }\n\n /**\n * Opens `paneTarget` — a `view:<viewId>` descriptor or a content-route path — in a new browser\n * window. The tab it came from **stays** where it is: this duplicates, it does not move. If the\n * pop-up blocker swallows the window, the user gets a dialog whose button is a fresh gesture that\n * practically always gets through.\n */\n open(paneTarget: string): void {\n if (this.tryOpen(paneTarget)) {\n return;\n }\n void this.dialogs\n .confirm({\n title: this.transloco.translate('popout.blocked.title'),\n message: this.transloco.translate('popout.blocked.message'),\n confirmLabel: this.transloco.translate('popout.blocked.open'),\n })\n .then((retry) => retry && this.tryOpen(paneTarget));\n }\n\n private tryOpen(paneTarget: string): boolean {\n const opened = this.document.defaultView?.open(\n popoutUrlFor(paneTarget),\n '_blank',\n );\n return opened != null;\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport {\n SHELL_LAYOUT,\n DockPosition,\n LayoutRegion,\n RegionType,\n} from './layout/layout';\nimport { ShellBar } from './regions/bar/shell-bar';\nimport { ShellRail } from './regions/rail/shell-rail';\nimport { ShellPanel } from './regions/panel/shell-panel';\nimport { ShellSidebarHeader } from './regions/panel/shell-sidebar-header';\nimport { ContentGrid } from './regions/content/content-grid';\nimport { ToastOutlet } from './notifications/toast-outlet';\nimport { DialogOutlet } from './dialog/dialog-outlet';\nimport { ThemeService } from './theme/theme.service';\nimport { FontScaleService } from './text-size/font-scale.service';\nimport { ViewportService } from './layout/viewport.service';\nimport { PanelState } from './regions/panel/panel-state';\nimport { PopoutService } from './popout/popout.service';\n\n/** Layout host: renders the declared regions into the border topology. */\n@Component({\n selector: 'lw-shell',\n imports: [\n ShellBar,\n ShellRail,\n ShellPanel,\n ShellSidebarHeader,\n ContentGrid,\n ToastOutlet,\n DialogOutlet,\n TranslocoPipe,\n RouterOutlet,\n ],\n templateUrl: './shell.html',\n styleUrl: './shell.css',\n})\nexport class Shell {\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly panels = inject(PanelState);\n protected readonly viewport = inject(ViewportService);\n protected readonly popout = inject(PopoutService);\n\n protected readonly topBars = this.regionsAt('top', 'bar');\n protected readonly bottomBars = this.regionsAt('bottom', 'bar');\n protected readonly leftRails = this.regionsAt('left', 'rail');\n protected readonly leftPanels = this.regionsAt('left', 'panel');\n protected readonly rightPanels = this.regionsAt('right', 'panel');\n protected readonly rightRails = this.regionsAt('right', 'rail');\n protected readonly hasContent = this.layout.regions.some(\n (r) => r.dock === 'center',\n );\n\n protected readonly leftFloating = computed(() =>\n this.floating(this.leftPanels),\n );\n protected readonly rightFloating = computed(() =>\n this.floating(this.rightPanels),\n );\n protected readonly leftEdgeBorder = computed(() =>\n this.edgeHasBody(this.leftPanels, this.leftRails),\n );\n protected readonly rightEdgeBorder = computed(() =>\n this.edgeHasBody(this.rightPanels, this.rightRails),\n );\n protected readonly leftRailDivider = computed(() =>\n this.railDivider(this.leftPanels, this.leftRails),\n );\n protected readonly rightRailDivider = computed(() =>\n this.railDivider(this.rightPanels, this.rightRails),\n );\n\n private readonly theme = inject(ThemeService);\n private readonly fontScale = inject(FontScaleService);\n\n protected panelCollapsed(panel: LayoutRegion): boolean {\n return !this.viewport.compact() && this.panels.isCollapsed(panel.id);\n }\n\n protected isOverlayOpen(regionId: string): boolean {\n return this.panels.isOverlayOpen(regionId);\n }\n\n protected anyOverlayOpen(): boolean {\n return this.panels.anyOverlayOpen();\n }\n\n protected closeOverlay(): void {\n this.panels.closeOverlay();\n }\n\n private floating(panels: LayoutRegion[]): LayoutRegion[] {\n if (this.viewport.compact()) {\n return [];\n }\n return panels.filter((panel) => this.panels.isCollapsed(panel.id));\n }\n\n private railDivider(panels: LayoutRegion[], rails: LayoutRegion[]): boolean {\n return (\n rails.length > 0 &&\n panels.some((panel) => !this.panels.isCollapsed(panel.id))\n );\n }\n\n private edgeHasBody(panels: LayoutRegion[], rails: LayoutRegion[]): boolean {\n return (\n this.viewport.compact() ||\n rails.length > 0 ||\n panels.some((panel) => !this.panels.isCollapsed(panel.id))\n );\n }\n\n private regionsAt(dock: DockPosition, type: RegionType): LayoutRegion[] {\n return this.layout.regions.filter(\n (region) => region.dock === dock && region.type === type,\n );\n }\n}\n","@if (popout.active) {\n <div class=\"flex h-screen flex-col\">\n <main id=\"lw-main-content\" class=\"min-h-0 flex-1 overflow-hidden\">\n <router-outlet />\n </main>\n <lw-toasts />\n <lw-dialog-outlet />\n </div>\n} @else {\n<div class=\"flex h-screen flex-col\">\n @if (hasContent) {\n\n <a\n href=\"#lw-main-content\"\n class=\"sr-only focus:not-sr-only focus:absolute focus:top-3 focus:left-3 focus:z-[100] focus:rounded-md focus:bg-surface-raised focus:px-4 focus:py-2 focus:text-sm focus:font-medium focus:text-content focus:shadow-lg focus:outline focus:outline-2 focus:outline-brand\"\n >\n {{ 'skip.toContent' | transloco }}\n </a>\n }\n <div class=\"relative flex flex-1 overflow-hidden\">\n\n @if (leftRails.length || leftPanels.length) {\n <div class=\"flex flex-col overflow-hidden border-border\" [class.border-r]=\"leftEdgeBorder()\">\n @if (viewport.compact()) {\n @for (panel of leftPanels; track panel.id) {\n <lw-shell-sidebar-header [region]=\"panel\" />\n }\n }\n <div class=\"flex flex-1 overflow-hidden\">\n @for (region of leftRails; track region.id) {\n <lw-shell-rail [region]=\"region\" />\n }\n @if (!viewport.compact()) {\n <div\n class=\"flex flex-col overflow-hidden border-border\"\n [class.border-l]=\"leftRailDivider()\"\n >\n @for (panel of leftPanels; track panel.id) {\n <lw-shell-sidebar-header\n [region]=\"panel\"\n [class.w-0]=\"!panelCollapsed(panel)\"\n [class.min-w-full]=\"!panelCollapsed(panel)\"\n />\n }\n <div class=\"flex flex-1 overflow-hidden\">\n @for (region of leftPanels; track region.id) {\n <lw-shell-panel [region]=\"region\" />\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n\n <div class=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n <div class=\"flex\">\n @for (panel of leftFloating(); track panel.id) {\n <lw-shell-sidebar-header [region]=\"panel\" context=\"floating\" />\n }\n @for (region of topBars; track region.id) {\n <lw-shell-bar [region]=\"region\" class=\"flex-1\" />\n }\n @if (!topBars.length && (leftFloating().length || rightFloating().length)) {\n\n <div class=\"h-12 flex-1\"></div>\n }\n @for (panel of rightFloating(); track panel.id) {\n <lw-shell-sidebar-header [region]=\"panel\" context=\"floating\" />\n }\n </div>\n <div class=\"flex flex-1 overflow-hidden\">\n @if (hasContent) {\n\n <lw-content-grid class=\"min-w-0 flex-1\" />\n }\n </div>\n </div>\n\n @if (rightRails.length || rightPanels.length) {\n <div class=\"flex flex-col overflow-hidden border-border\" [class.border-l]=\"rightEdgeBorder()\">\n @if (viewport.compact()) {\n @for (panel of rightPanels; track panel.id) {\n <lw-shell-sidebar-header [region]=\"panel\" />\n }\n }\n <div class=\"flex flex-1 overflow-hidden\">\n @if (!viewport.compact()) {\n <div\n class=\"flex flex-col overflow-hidden border-border\"\n [class.border-r]=\"rightRailDivider()\"\n >\n @for (panel of rightPanels; track panel.id) {\n <lw-shell-sidebar-header\n [region]=\"panel\"\n [class.w-0]=\"!panelCollapsed(panel)\"\n [class.min-w-full]=\"!panelCollapsed(panel)\"\n />\n }\n <div class=\"flex flex-1 overflow-hidden\">\n @for (region of rightPanels; track region.id) {\n <lw-shell-panel [region]=\"region\" />\n }\n </div>\n </div>\n }\n @for (region of rightRails; track region.id) {\n <lw-shell-rail [region]=\"region\" />\n }\n </div>\n </div>\n }\n\n @if (viewport.compact()) {\n <button\n type=\"button\"\n class=\"lw-scrim absolute inset-0 z-40 cursor-default transition-opacity duration-300 ease-out\"\n [class.pointer-events-none]=\"!anyOverlayOpen()\"\n [class.opacity-0]=\"!anyOverlayOpen()\"\n [attr.aria-hidden]=\"!anyOverlayOpen()\"\n [attr.aria-label]=\"'panel.close' | transloco\"\n [attr.tabindex]=\"anyOverlayOpen() ? 0 : -1\"\n (click)=\"closeOverlay()\"\n ></button>\n\n @for (panel of leftPanels; track panel.id) {\n <div\n class=\"absolute inset-y-0 left-0 z-50 flex flex-col overflow-hidden shadow-xl transition duration-300 ease-out will-change-transform\"\n [class.-translate-x-full]=\"!isOverlayOpen(panel.id)\"\n [class.opacity-0]=\"!isOverlayOpen(panel.id)\"\n [attr.inert]=\"isOverlayOpen(panel.id) ? null : ''\"\n [attr.aria-hidden]=\"!isOverlayOpen(panel.id)\"\n >\n @if (isOverlayOpen(panel.id)) {\n <lw-shell-sidebar-header [region]=\"panel\" context=\"drawer\" />\n <div class=\"flex min-h-0 flex-1\">\n <lw-shell-panel [region]=\"panel\" />\n </div>\n }\n </div>\n }\n\n @for (panel of rightPanels; track panel.id) {\n <div\n class=\"absolute inset-y-0 right-0 z-50 flex flex-col overflow-hidden shadow-xl transition duration-300 ease-out will-change-transform\"\n [class.translate-x-full]=\"!isOverlayOpen(panel.id)\"\n [class.opacity-0]=\"!isOverlayOpen(panel.id)\"\n [attr.inert]=\"isOverlayOpen(panel.id) ? null : ''\"\n [attr.aria-hidden]=\"!isOverlayOpen(panel.id)\"\n >\n @if (isOverlayOpen(panel.id)) {\n <lw-shell-sidebar-header [region]=\"panel\" context=\"drawer\" />\n <div class=\"flex min-h-0 flex-1\">\n <lw-shell-panel [region]=\"panel\" />\n </div>\n }\n </div>\n }\n }\n </div>\n\n @for (region of bottomBars; track region.id) {\n <lw-shell-bar [region]=\"region\" />\n }\n\n <lw-toasts />\n <lw-dialog-outlet />\n</div>\n}\n","import { computed, Service, signal } from '@angular/core';\nimport { Disposable } from '../plugin/contribution-registry';\nimport { upsertById } from '../foundation/identified';\nimport { SettingsSection } from './settings-model';\n\n@Service()\nexport class SettingsRegistry {\n private readonly requested = signal<string | undefined>(undefined);\n private readonly sections = signal<readonly SettingsSection[]>([]);\n private readonly omitted = signal<ReadonlySet<string>>(new Set());\n\n readonly requestedSection = this.requested.asReadonly();\n\n readonly registered = this.sections.asReadonly();\n\n readonly all = computed(() => {\n const omitted = this.omitted();\n return this.sections()\n .map((section) => visibleSection(section, omitted))\n .filter((section): section is SettingsSection => section !== null)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n });\n\n register(section: SettingsSection): Disposable {\n this.sections.update((list) => upsertById(list, section));\n return {\n dispose: () =>\n this.sections.update((list) =>\n list.filter((entry) => entry !== section),\n ),\n };\n }\n\n omit(ids: readonly string[]): void {\n if (ids.length === 0) {\n return;\n }\n this.omitted.update((current) => new Set([...current, ...ids]));\n }\n\n request(sectionId: string): void {\n this.requested.set(sectionId);\n }\n\n consumeRequestedSection(): void {\n this.requested.set(undefined);\n }\n}\n\nfunction visibleSection(\n section: SettingsSection,\n omitted: ReadonlySet<string>,\n): SettingsSection | null {\n if (omitted.has(section.id)) {\n return null;\n }\n const rows = section.rows.filter((row) => !omitted.has(row.id));\n if (rows.length === section.rows.length) {\n return section;\n }\n if (rows.length === 0) {\n return null;\n }\n return { ...section, rows };\n}\n","import { Component, input } from '@angular/core';\n\n/**\n * One settings row: label (+ optional description) on the left, the control projected on\n * the right. A pure layout primitive — the host slots the matching control\n * (`<lw-select>`, later toggle/button) via content projection.\n */\n@Component({\n selector: 'lw-setting-row',\n templateUrl: './lw-setting-row.html',\n})\nexport class LwSettingRow {\n readonly label = input('');\n readonly description = input('');\n}\n","<div class=\"flex items-center justify-between gap-4 px-4 py-3\">\n <div class=\"flex min-w-0 flex-col gap-0.5\">\n <span class=\"text-sm font-medium text-content\">{{ label() }}</span>\n @if (description()) {\n <span class=\"text-xs text-content-muted\">{{ description() }}</span>\n }\n </div>\n <div class=\"shrink-0\">\n <ng-content />\n </div>\n</div>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, effect, inject, signal } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { SettingsRegistry } from './settings-registry';\nimport { SettingButton, SettingRow, SettingsSection } from './settings-model';\nimport { CommandService } from '../commands/command.service';\nimport { DialogRef } from '../dialog/dialog-ref';\nimport { LwButton } from '../elements/button/lw-button';\nimport { LwSettingRow } from './lw-setting-row';\n\ninterface SettingsGroup {\n readonly key: string;\n readonly label?: string;\n readonly sections: readonly SettingsSection[];\n}\n\n@Component({\n selector: 'lw-settings-dialog',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [NgComponentOutlet, TranslocoPipe, LwButton, LwSettingRow],\n templateUrl: './settings-dialog.html',\n})\nexport class SettingsDialog {\n private readonly settings = inject(SettingsRegistry);\n\n private readonly commands = inject(CommandService);\n\n protected readonly ref = inject(DialogRef);\n\n protected readonly sections = computed<readonly SettingsSection[]>(() =>\n this.settings\n .all()\n .map((section) => ({\n ...section,\n rows: section.rows.filter((row) => this.live(row)),\n }))\n .filter((section) => section.rows.length > 0),\n );\n\n protected readonly activeId = signal('');\n\n protected readonly active = computed<SettingsSection | undefined>(\n () =>\n this.sections().find((s) => s.id === this.activeId()) ??\n this.sections()[0],\n );\n\n protected readonly groups = computed<readonly SettingsGroup[]>(() => {\n const order: SettingsGroup[] = [];\n const byKey = new Map<\n string,\n SettingsGroup & { sections: SettingsSection[] }\n >();\n for (const section of this.sections()) {\n const key = section.group ?? '';\n let group = byKey.get(key);\n if (!group) {\n group = { key, label: section.group, sections: [] };\n byKey.set(key, group);\n order.push(group);\n }\n group.sections.push(section);\n }\n return order;\n });\n\n constructor() {\n effect(() => {\n const requested = this.settings.requestedSection();\n if (!requested) {\n return;\n }\n this.activeId.set(requested);\n this.settings.consumeRequestedSection();\n });\n }\n\n protected runButton(control: SettingButton): void {\n this.commands.trigger(control);\n }\n\n protected close(): void {\n this.ref.close();\n }\n\n private live(row: SettingRow): boolean {\n return (\n row.control.kind !== 'button' || this.commands.triggerable(row.control)\n );\n }\n}\n","<div\n class=\"flex w-full flex-col overflow-hidden\"\n [class]=\"ref.maximized() ? 'h-full' : 'h-[80vh] max-h-[85vh]'\"\n>\n <header\n class=\"flex items-center justify-between gap-4 border-b border-border px-5 py-3\"\n >\n <h2 class=\"text-lg font-semibold text-content\">\n {{ 'settings.title' | transloco }}\n </h2>\n <span class=\"flex items-center gap-1\">\n <button\n lwButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n data-testid=\"dialog-maximize\"\n [attr.aria-label]=\"\n (ref.maximized() ? 'dialog.restore' : 'dialog.maximize')\n | transloco\n \"\n (click)=\"ref.toggleMaximized()\"\n >\n <lw-icon\n [name]=\"ref.maximized() ? 'restore' : 'maximize'\"\n size=\"1rem\"\n />\n </button>\n <button\n lwButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n [attr.aria-label]=\"'dialog.close' | transloco\"\n (click)=\"close()\"\n >\n <lw-icon name=\"close\" size=\"1rem\" />\n </button>\n </span>\n </header>\n\n <div class=\"flex min-h-0 flex-1 flex-col sm:flex-row\">\n <nav\n class=\"flex shrink-0 gap-1 overflow-x-auto border-b border-border p-2 sm:w-52 sm:flex-col sm:overflow-x-visible sm:overflow-y-auto sm:border-r sm:border-b-0\"\n >\n @for (group of groups(); track group.key) {\n @if (group.label) {\n <p\n class=\"px-2 pt-2 pb-1 text-xs font-semibold tracking-wide text-content-muted uppercase max-sm:hidden\"\n >\n {{ group.label | transloco }}\n </p>\n }\n @for (section of group.sections; track section.id) {\n <button\n type=\"button\"\n class=\"shrink-0 rounded-md px-3 py-1.5 text-left text-sm transition-colors\"\n [class]=\"\n section.id === active()?.id\n ? 'bg-brand/10 font-medium text-brand-text'\n : 'text-content-muted hover:bg-surface-overlay hover:text-content'\n \"\n [attr.aria-current]=\"\n section.id === active()?.id ? 'true' : null\n \"\n (click)=\"activeId.set(section.id)\"\n >\n {{ section.title | transloco }}\n </button>\n }\n }\n </nav>\n\n <div class=\"min-h-0 flex-1 overflow-y-auto p-5\">\n @if (active(); as section) {\n <div\n class=\"divide-y divide-border overflow-hidden rounded-lg border border-border\"\n >\n @for (row of section.rows; track row.id) {\n @if (\n row.control.kind === 'component' && row.control.fullWidth\n ) {\n <div class=\"p-4\">\n <ng-container [ngComponentOutlet]=\"row.control.component\" />\n </div>\n } @else {\n <lw-setting-row\n [label]=\"row.label | transloco\"\n [description]=\"\n row.description ? (row.description | transloco) : ''\n \"\n >\n @switch (row.control.kind) {\n @case ('select') {\n <lw-select\n [attr.value]=\"row.control.value()\"\n [attr.label]=\"row.label | transloco\"\n (lw-select-change)=\"\n row.control.set($any($event).detail.value)\n \"\n >\n @for (\n option of row.control.options;\n track option.value\n ) {\n <lw-option [attr.value]=\"option.value\">{{\n option.label | transloco\n }}</lw-option>\n }\n </lw-select>\n }\n @case ('toggle') {\n <input\n type=\"checkbox\"\n role=\"switch\"\n class=\"lw-switch\"\n [checked]=\"row.control.value()\"\n [attr.aria-checked]=\"row.control.value()\"\n [attr.aria-label]=\"row.label | transloco\"\n (change)=\"\n row.control.set($any($event.target).checked)\n \"\n />\n }\n @case ('text') {\n <input\n class=\"lw-field w-56\"\n [attr.type]=\"row.control.inputType ?? 'text'\"\n [value]=\"row.control.value()\"\n [attr.placeholder]=\"\n row.control.placeholder\n ? (row.control.placeholder | transloco)\n : null\n \"\n [attr.aria-label]=\"row.label | transloco\"\n (input)=\"row.control.set($any($event.target).value)\"\n />\n }\n @case ('slider') {\n <div class=\"flex w-56 items-center gap-3\">\n <input\n type=\"range\"\n class=\"lw-range\"\n [min]=\"row.control.min ?? 0\"\n [max]=\"row.control.max ?? 100\"\n [step]=\"row.control.step ?? 1\"\n [value]=\"row.control.value()\"\n [attr.aria-label]=\"row.label | transloco\"\n (input)=\"\n row.control.set(+$any($event.target).value)\n \"\n />\n <span\n class=\"w-8 text-right text-sm text-content-muted tabular-nums\"\n >{{ row.control.value() }}</span\n >\n </div>\n }\n @case ('button') {\n <button\n lwButton\n [variant]=\"row.control.variant ?? 'default'\"\n type=\"button\"\n (click)=\"runButton(row.control)\"\n >\n {{ row.control.label | transloco }}\n </button>\n }\n @case ('component') {\n <ng-container\n [ngComponentOutlet]=\"row.control.component\"\n />\n }\n }\n </lw-setting-row>\n }\n }\n </div>\n } @else {\n <p class=\"text-sm text-content-muted\">\n {{ 'settings.empty' | transloco }}\n </p>\n }\n </div>\n </div>\n</div>\n","import { inject, Service } from '@angular/core';\nimport { Disposable } from '../plugin/contribution-registry';\nimport { SettingsDialog } from './settings-dialog';\nimport { SettingsRegistry } from './settings-registry';\nimport { DialogRef } from '../dialog/dialog-ref';\nimport { DialogService } from '../dialog/dialog.service';\nimport { SettingsSection } from './settings-model';\n\n/**\n * Host registry for settings sections (schema-driven). The shell and\n * plugins contribute sections; the host renders them all in one {@link SettingsDialog}.\n * Storage is deliberately NOT centralised — each section carries its own value accessors,\n * so the owner keeps responsibility for persistence (shell settings in the shell, plugin\n * settings in the plugin, optionally against its owner's backend). This keeps the host domain-pure and\n * fits the per-tenant tenancy model without the host needing to persist foreign data.\n */\n@Service()\nexport class SettingsService {\n private current: DialogRef | null = null;\n\n private readonly dialogs = inject(DialogService);\n private readonly registry = inject(SettingsRegistry);\n\n /** The section a caller asked to show; the settings dialog consumes it. */\n readonly requestedSection = this.registry.requestedSection;\n\n /**\n * Registered sections, ordered by `order` (default 0), then registration order — with any\n * omitted section or row dropped, and a section left with no rows hidden entirely.\n */\n readonly all = this.registry.all;\n\n /**\n * Every registered section, **including** those {@link omit} hides and with their omitted rows\n * still in place. {@link all} is what the dialog draws; this is what was contributed, which is\n * what a dev-mode report needs to tell an `omit` that hid a row from one that hit nothing.\n */\n readonly registered = this.registry.registered;\n\n /**\n * Contributes a section; dispose to remove it (plugin deactivation). Registering an existing\n * id **overrides** the previous section in place (last contribution wins), like every other\n * contribution.\n */\n register(section: SettingsSection): Disposable {\n return this.registry.register(section);\n }\n\n /**\n * Hides settings by id — a section id drops the whole section, a row id drops that row. A\n * lasting filter (like {@link ContributionRegistry.omit}), so a section a plugin registers\n * later is covered too.\n */\n omit(ids: readonly string[]): void {\n this.registry.omit(ids);\n }\n\n /**\n * Opens the settings dialog — a bare, wide two-column surface owning its own chrome. Pass a\n * `sectionId` to land on (or switch an already-open dialog to) that section — e.g. the plugin\n * store's gear action jumping to an installed plugin's own settings.\n */\n open(sectionId?: string): DialogRef {\n if (sectionId) {\n this.registry.request(sectionId);\n }\n if (this.current) {\n return this.current;\n }\n const ref = this.dialogs.open(SettingsDialog, {\n title: 'settings.title',\n bare: true,\n size: 'xl',\n dismissable: true,\n });\n this.current = ref;\n void ref.closed.then(() => {\n if (this.current === ref) {\n this.current = null;\n }\n });\n return ref;\n }\n\n consumeRequestedSection(): void {\n this.registry.consumeRequestedSection();\n }\n}\n","export const SETTING_OMIT_PREFIX = 'setting:';\n\nexport function settingOmitIds(omit: readonly string[]): string[] {\n return omit\n .filter((id) => id.startsWith(SETTING_OMIT_PREFIX))\n .map((id) => id.slice(SETTING_OMIT_PREFIX.length));\n}\n","import { Injectable, Injector, inject, isDevMode } from '@angular/core';\nimport {\n TranslocoConfig,\n TranslocoMissingHandler,\n TranslocoService,\n} from '@jsverse/transloco';\n\n@Injectable()\nexport class ShellMissingTranslationHandler implements TranslocoMissingHandler {\n private readonly injector = inject(Injector);\n\n handle(key: string, config: TranslocoConfig): string {\n if (isDevMode() && config.missingHandler.logMissingKey && this.loaded()) {\n console.warn(\n `%c Missing translation for '${key}'`,\n 'font-size: 12px; color: red',\n );\n }\n return key;\n }\n\n private loaded(): boolean {\n const transloco = this.injector.get(TranslocoService);\n const active = transloco.getActiveLang();\n return Object.keys(transloco.getTranslation(active) ?? {}).length > 0;\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, InjectionToken, isDevMode, Provider, Service } from '@angular/core';\nimport { Translation, TranslocoLoader } from '@jsverse/transloco';\nimport { catchError, forkJoin, map, of } from 'rxjs';\n\n/**\n * Extra translation namespaces a distribution composes on top of the host base. Each is served at `/i18n/<name>/<lang>.json` and nested under its key, so its strings\n * live at `name.*` and can never collide with a host key. Used for a weaver's own strings\n * (`demo`) and for distribution branding (`product`).\n */\nexport const TRANSLATION_NAMESPACES = new InjectionToken<readonly string[]>(\n 'TRANSLATION_NAMESPACES',\n);\n\n/**\n * A distribution declares which namespaced translation bundles to load — the weavers it bundles\n * (e.g. `'testbed'`) and its own branding (`'product'`). The bare platform registers none;\n * its host keys are the whole story.\n */\nexport function provideTranslationNamespaces(\n ...namespaces: string[]\n): Provider {\n return { provide: TRANSLATION_NAMESPACES, useValue: namespaces };\n}\n\n/** Directory the distribution serves its overlay bundles from, without a trailing slash. */\nexport const TRANSLATION_OVERRIDES = new InjectionToken<string>(\n 'TRANSLATION_OVERRIDES',\n);\n\nexport const DEFAULT_OVERRIDES_PATH = '/i18n/overrides';\n\n/**\n * Load `<basePath>/<lang>.json` and merge it over everything else **key by key**, so a product\n * can reword the shell in its own house language (\"Save as\" rather than \"Save as new\") without\n * forking our bundle: name only the keys you change and inherit the rest, including every key a\n * later release adds. It is applied last, so it also reaches a bundled weaver's strings.\n *\n * Namespaces (`provideTranslationNamespaces`) remain the way to *add* your own strings, and they can\n * still never collide with a host key. This is the opposite job — replacing one — which is why it is\n * a separate, deliberate opt-in rather than a namespace with a magic name.\n *\n * `basePath` lets one build carry several wordings and pick one while composing — a white-label\n * distribution that serves three brands from the same bundle, or a demo that switches product.\n * A product with a backend does not need it: the default path is same-origin, so its server can\n * already vary the bytes per tenant. Omit it and nothing changes.\n *\n * A language with no overlay file keeps the shipped strings (dev-warned). A key the overlay names but\n * nothing ships is dev-warned too, since a typo there would otherwise be a string that never appears.\n */\nexport function provideTranslationOverrides(\n basePath: string = DEFAULT_OVERRIDES_PATH,\n): Provider {\n const normalized = basePath.replace(/\\/+$/, '');\n if (normalized === '') {\n throw new Error(\n 'provideTranslationOverrides() needs a directory to load overlays from; ' +\n `pass one or omit the argument for \"${DEFAULT_OVERRIDES_PATH}\".`,\n );\n }\n return { provide: TRANSLATION_OVERRIDES, useValue: normalized };\n}\n\nconst MISSING_OVERLAY: Translation = {};\n\nfunction isGroup(value: unknown): value is Translation {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function mergeTranslation(\n base: Translation,\n overlay: Translation,\n): Translation {\n const merged: Translation = { ...base };\n for (const [key, value] of Object.entries(overlay)) {\n const existing = merged[key];\n merged[key] =\n isGroup(existing) && isGroup(value)\n ? mergeTranslation(existing, value)\n : value;\n }\n return merged;\n}\n\nexport function unknownOverrideKeys(\n base: Translation,\n overlay: Translation,\n prefix = '',\n): string[] {\n const unknown: string[] = [];\n for (const [key, value] of Object.entries(overlay)) {\n const path = prefix ? `${prefix}.${key}` : key;\n const existing = base[key];\n if (existing === undefined) {\n unknown.push(path);\n } else if (isGroup(existing) && isGroup(value)) {\n unknown.push(...unknownOverrideKeys(existing, value, path));\n }\n }\n return unknown;\n}\n\n@Service()\nexport class TranslocoHttpLoader implements TranslocoLoader {\n private readonly http = inject(HttpClient);\n private readonly namespaces =\n inject(TRANSLATION_NAMESPACES, { optional: true }) ?? [];\n private readonly overrides =\n inject(TRANSLATION_OVERRIDES, { optional: true }) ?? null;\n\n getTranslation(lang: string): ReturnType<TranslocoLoader['getTranslation']> {\n const host$ = this.http.get<Translation>(`/i18n/${lang}.json`);\n if (this.namespaces.length === 0 && !this.overrides) {\n return host$;\n }\n\n const namespaced$ = this.namespaces.map((name) =>\n this.http.get<Translation>(`/i18n/${name}/${lang}.json`).pipe(\n catchError((error: unknown) => {\n console.warn(\n `Translation namespace \"${name}\" failed to load for \"${lang}\".`,\n error,\n );\n return of<Translation>({});\n }),\n ),\n );\n return forkJoin([host$, ...namespaced$, this.overrides$(lang)]).pipe(\n map(([host, ...rest]) => {\n const overlay = rest.pop() as Translation;\n const merged: Translation = { ...host };\n this.namespaces.forEach((name, index) => (merged[name] = rest[index]));\n return this.applyOverrides(merged, overlay, lang);\n }),\n );\n }\n\n private overrides$(lang: string) {\n if (!this.overrides) {\n return of<Translation>({});\n }\n return this.http\n .get<Translation>(`${this.overrides}/${lang}.json`)\n .pipe(catchError(() => of<Translation>(MISSING_OVERLAY)));\n }\n\n private applyOverrides(\n merged: Translation,\n overlay: Translation,\n lang: string,\n ): Translation {\n if (overlay === MISSING_OVERLAY) {\n this.warn(\n `No translation overrides for \"${lang}\" — its shipped strings are used unchanged.`,\n );\n return merged;\n }\n const unknown = unknownOverrideKeys(merged, overlay);\n if (unknown.length > 0) {\n this.warn(\n `Translation overrides for \"${lang}\" name ${unknown.length} key(s) nothing ships, ` +\n `so they will never appear: ${unknown.join(', ')}.`,\n );\n }\n return mergeTranslation(merged, overlay);\n }\n\n private warn(message: string): void {\n if (isDevMode()) {\n console.warn(message);\n }\n }\n}\n","import {\n reflectAttribute,\n upgradeElementProperty,\n} from '../custom-element-property';\nimport { resolveIcon } from './icon-registry-global';\n\n/** The custom-element tag. */\nexport const LW_ICON_TAG = 'lw-icon';\n\nconst DEFAULT_SIZE = '1.25rem';\n\n/**\n * `<lw-icon name=\"add\" size=\"1rem\">` — the host icon primitive as a framework-agnostic custom element\n *: a plain `HTMLElement` that resolves a **name** to its SVG via the module-global icon\n * registry — no Angular DI, no `@ng-icons` runtime — so it works in a weaver body by tag, not\n * only in shell chrome. Light DOM: the SVG uses `currentColor`, so `text-*` tokens tint it for free.\n *\n * The SVG is already safe (first-party markup, or sanitized at registration), so it is set as raw\n * `innerHTML`. Decorative by default (`aria-hidden`); pass `aria-label` to expose it as an image.\n *\n * <lw-icon name=\"close\" size=\"0.85rem\"></lw-icon>\n * <lw-icon [name]=\"dynamicName()\" aria-label=\"…\"></lw-icon>\n */\nexport class LwIconElement extends HTMLElement {\n static readonly observedAttributes = ['name', 'size', 'aria-label'];\n\n get name(): string {\n return this.getAttribute('name') ?? '';\n }\n set name(value: string | null) {\n reflectAttribute(this, 'name', value);\n }\n get size(): string {\n return this.getAttribute('size') ?? DEFAULT_SIZE;\n }\n set size(value: string | null) {\n reflectAttribute(this, 'size', value);\n }\n\n connectedCallback(): void {\n upgradeElementProperty(this, 'name');\n upgradeElementProperty(this, 'size');\n this.render();\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.render();\n }\n }\n\n /**\n * Re-draws from the registry without changing the name. A sandboxed surface receives the product's\n * replacement icons over its channel, which can arrive after it has already painted.\n */\n refresh(): void {\n if (this.isConnected) {\n this.render();\n }\n }\n\n private render(): void {\n this.innerHTML = resolveIcon(this.name) ?? '';\n const svg = this.querySelector('svg');\n if (svg) {\n svg.setAttribute('width', this.size);\n svg.setAttribute('height', this.size);\n }\n const label = this.getAttribute('aria-label');\n if (label) {\n this.setAttribute('role', 'img');\n this.removeAttribute('aria-hidden');\n } else {\n this.setAttribute('aria-hidden', 'true');\n this.removeAttribute('role');\n }\n }\n}\n\n/** Registers `<lw-icon>` once (idempotent) — called from {@link provideShell} at bootstrap. */\nexport function defineLwIcon(): void {\n if (\n typeof customElements !== 'undefined' &&\n !customElements.get(LW_ICON_TAG)\n ) {\n customElements.define(LW_ICON_TAG, LwIconElement);\n }\n}\n","import { InjectionToken, Provider } from '@angular/core';\n\nimport { BarItem } from '@loomweaver/plugin-sdk';\n\nexport type {\n BarSlot,\n BarComponentItem,\n BarButtonItem,\n BarItem,\n} from '@loomweaver/plugin-sdk';\n\n/** Multi-provider token: each contribution adds one {@link BarItem}. */\nexport const BAR_ITEM = new InjectionToken<readonly BarItem[]>('BAR_ITEM');\n\n/** Hooks bar items into the shell — used by the host and by distributions. */\nexport function provideBarItems(...items: BarItem[]): Provider[] {\n return items.map((item) => ({\n provide: BAR_ITEM,\n useValue: item,\n multi: true,\n }));\n}\n","import { Component, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PRODUCT_IDENTITY } from '@loomweaver/plugin-sdk';\n\n@Component({\n selector: 'lw-shell-brand',\n imports: [TranslocoPipe],\n templateUrl: './shell-brand.html',\n})\nexport class ShellBrand {\n protected readonly product = inject(PRODUCT_IDENTITY);\n}\n","<div class=\"flex min-w-0 items-center gap-2\">\n <img class=\"block h-7 w-7 shrink-0\" [src]=\"product.logoUrl\" alt=\"\" width=\"28\" height=\"28\" />\n <span class=\"truncate text-[1.1rem] font-semibold tracking-tight text-brand-text\">{{ product.name }}</span>\n <span class=\"hidden truncate text-sm text-content-muted sm:inline\">{{ product.tagline | transloco }}</span>\n</div>\n","import { CUSTOM_ELEMENTS_SCHEMA, Component, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LocaleService, SupportedLang } from './locale.service';\n\ninterface LangDisplay {\n readonly label: string;\n readonly flag: string;\n}\n\nconst LANG_DISPLAY: Readonly<Record<SupportedLang, LangDisplay>> = {\n en: { label: 'English', flag: '🇬🇧' },\n de: { label: 'Deutsch', flag: '🇩🇪' },\n};\n\n@Component({\n selector: 'lw-language-switcher',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './language-switcher.html',\n})\nexport class LanguageSwitcher {\n private readonly locale = inject(LocaleService);\n protected readonly lang = this.locale.lang;\n\n protected readonly langs = this.locale.supported.map((value) => ({\n value,\n ...LANG_DISPLAY[value],\n }));\n\n protected onSelect(event: Event): void {\n const value = (event as CustomEvent<{ value: string }>).detail.value;\n this.locale.setLang(value as SupportedLang);\n }\n}\n","<lw-select\n [attr.label]=\"'language.label' | transloco\"\n [attr.value]=\"lang()\"\n (lw-select-change)=\"onSelect($event)\"\n>\n @for (l of langs; track l.value) {\n <lw-option [attr.value]=\"l.value\" [attr.icon]=\"l.flag\">{{ l.label }}</lw-option>\n }\n</lw-select>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { ThemeMode, ThemeService } from './theme.service';\nimport { LoomIconName } from '../elements/icon/loom-icons';\n\n@Component({\n selector: 'lw-theme-toggle',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './theme-toggle.html',\n})\nexport class ThemeToggle {\n private readonly theme = inject(ThemeService);\n protected readonly mode = this.theme.mode;\n protected readonly modes: readonly ThemeMode[] = ['light', 'dark', 'system'];\n\n private readonly icons: Record<ThemeMode, LoomIconName> = {\n light: 'themeLight',\n dark: 'themeDark',\n system: 'themeSystem',\n };\n\n protected iconFor(mode: ThemeMode): LoomIconName {\n return this.icons[mode];\n }\n\n protected select(mode: ThemeMode): void {\n this.theme.setMode(mode);\n }\n}\n","<fieldset class=\"lw-segmented\" [attr.aria-label]=\"'theme.label' | transloco\">\n @for (m of modes; track m) {\n <button\n type=\"button\"\n (click)=\"select(m)\"\n [attr.aria-pressed]=\"mode() === m\"\n [attr.aria-label]=\"'theme.' + m | transloco\"\n class=\"lw-segmented-item\"\n >\n <lw-icon [name]=\"iconFor(m)\" size=\"1rem\" />\n <lw-tooltip [text]=\"'theme.' + m | transloco\" position=\"bottom\" />\n </button>\n }\n</fieldset>\n","// GENERATED — do not edit by hand.\n// Written by tools/stamp-version.mjs from <Version> in Directory.Build.props.\n// Single source of truth: Directory.Build.props (bump via scripts/bump-version.sh).\nexport const APP_VERSION = '0.7.2';\n","import { Service, signal } from '@angular/core';\nimport { APP_VERSION } from './app-version';\n\n/**\n * The running build's version, sourced from `<Version>` in Directory.Build.props\n * at build time (see tools/stamp-version.mjs). Exposed as a signal so a\n * later source (e.g. a product backend) can update it live without touching consumers.\n *\n * Neutral core chrome: the version is host-offered data; distributions and plugins\n * render it via `<lw-version>` or `ctx`, never hardcoded.\n */\n@Service()\nexport class VersionService {\n /** SemVer of the running build, e.g. `0.1.0`. */\n readonly version = signal<string>(APP_VERSION);\n}\n","import { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { VersionService } from './version.service';\n\n/**\n * Displays the running build's version, e.g. `v0.1.0`. A neutral host-offered widget\n * any distribution or plugin can embed (status bar, about dialog, …); the number comes\n * from {@link VersionService}, never hardcoded.\n *\n * <lw-version /> → v0.1.0\n * <lw-version prefix=\"\" /> → 0.1.0\n */\n@Component({\n selector: 'lw-version',\n encapsulation: ViewEncapsulation.None,\n templateUrl: './lw-version.html',\n})\nexport class LwVersion {\n private readonly versions = inject(VersionService);\n\n /** Text shown before the number; set to `''` to hide. */\n readonly prefix = input('v');\n\n protected readonly label = computed(\n () => `${this.prefix()}${this.versions.version()}`,\n );\n}\n","<span class=\"text-xs text-content-muted tabular-nums\">{{\n label()\n }}</span>\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, inject, Service, signal } from '@angular/core';\nimport { SwUpdate, VersionEvent } from '@angular/service-worker';\nimport { NotificationService } from '../notifications/notification.service';\n\nconst UPDATE_TOAST_ID = 'shell.update';\nconst UP_TO_DATE_TOAST_ID = 'shell.update.none';\nconst CHECK_UNAVAILABLE_TOAST_ID = 'shell.update.unavailable';\nconst UPDATE_FAILED_TOAST_ID = 'shell.update.failed';\nconst BROKEN_CACHE_TOAST_ID = 'shell.update.broken';\n\nconst CONTROL_WAIT_MS = 2500;\n\nconst CHECK_TIMEOUT_MS = 3500;\n\nconst PERIODIC_CHECK_MS = 30 * 60 * 1000;\n\nconst SILENT_CHECK_GAP_MS = 60 * 1000;\n\nconst WORKER_SCRIPT = 'ngsw-worker.js';\n\nconst WORKER_CACHE_PREFIX = 'ngsw:';\n\nasync function bestEffort(work: () => Promise<unknown>): Promise<void> {\n try {\n await work();\n } catch {\n return;\n }\n}\n\nfunction isShellWorker(registration: ServiceWorkerRegistration): boolean {\n const worker =\n registration.active ?? registration.waiting ?? registration.installing;\n return worker?.scriptURL.includes(WORKER_SCRIPT) ?? false;\n}\n\n/**\n * Detects when a new app version has been fetched by the service worker and offers\n * to activate it. Neutral core chrome: it raises a sticky toast and drives\n * the persistent update badge off {@link updateAvailable}. Dismissing the toast never\n * clears that signal, so the badge stays until the user actually reloads.\n *\n * `SwUpdate` is injected optionally: with no registered service worker (dev, tests,\n * unsupported browsers) the service is simply inert — {@link enabled} is `false` and\n * no update is ever offered.\n */\n@Service()\nexport class UpdateService {\n private readonly swUpdate = inject(SwUpdate, { optional: true });\n\n private readonly notifications = inject(NotificationService);\n\n private readonly document = inject(DOCUMENT);\n\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly available = signal(false);\n\n private readonly failed = signal(false);\n\n private readonly broken = signal(false);\n\n private lastSilentCheck = 0;\n\n /** True once a new version is downloaded and ready to activate. */\n readonly updateAvailable = this.available.asReadonly();\n\n /**\n * True once an update could not be installed, whichever of the two ways it went wrong.\n * The client keeps running its current version until a reload; the badge and the failure\n * toast both offer that reload. Read {@link updateBroken} to tell the two apart.\n */\n readonly updateFailed = this.failed.asReadonly();\n\n /**\n * True once the service worker reports an unrecoverable state, which is the harsher half of\n * {@link updateFailed}: its cached asset table no longer matches what the server serves, so it\n * cannot repair itself and a plain reload lands in the same state again. {@link activateUpdate}\n * handles it by dropping the worker rather than reloading into the same wall; read this only if\n * you want to say something different about it in your own UI.\n */\n readonly updateBroken = this.broken.asReadonly();\n\n /** Whether update checks are possible (a service worker is registered and enabled). */\n readonly enabled = this.swUpdate?.isEnabled ?? false;\n\n constructor() {\n this.swUpdate?.versionUpdates.subscribe((event) =>\n this.onVersionEvent(event),\n );\n this.swUpdate?.unrecoverable.subscribe(() => this.onWorkerBroken());\n this.startBackgroundChecks();\n }\n\n /** Manually checks for a new version, noting when already up to date. */\n async checkForUpdate(): Promise<void> {\n if (!this.swUpdate?.isEnabled) {\n return;\n }\n if (this.available()) {\n this.showUpdateAvailable();\n return;\n }\n\n if (!(await this.ensureControlled())) {\n this.showReloadNeeded();\n return;\n }\n\n this.lastSilentCheck = Date.now();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timedOut = Symbol('timedOut');\n const guard = new Promise<typeof timedOut>((resolve) => {\n timer = setTimeout(() => resolve(timedOut), CHECK_TIMEOUT_MS);\n });\n const found = await Promise.race([\n this.swUpdate.checkForUpdate().catch(() => timedOut),\n guard,\n ]);\n clearTimeout(timer);\n\n if (found === timedOut) {\n this.showReloadNeeded();\n return;\n }\n if (found) {\n return;\n }\n if (this.failed()) {\n this.showUpdateFailed();\n return;\n }\n this.notifications.show({\n id: UP_TO_DATE_TOAST_ID,\n kind: 'success',\n message: 'update.upToDate',\n timeoutMs: 4000,\n });\n }\n\n /**\n * Gets the client onto a working version and reloads into it — it reloads even if that fails,\n * so the affordance is never a silent no-op.\n *\n * When the worker is {@link updateBroken} activating is pointless: the broken registration would\n * still control the next load and report the same failure, which is a loop the user cannot leave\n * from inside the app. There the shell unregisters its own worker and drops its caches first, so\n * the reload lands uncontrolled and registers afresh. Only the shell's own `ngsw-worker.js` and\n * the `ngsw:` caches are touched; anything else the product registered is left alone.\n */\n async activateUpdate(): Promise<void> {\n if (this.broken()) {\n await this.dropWorker();\n } else {\n await this.tryActivate();\n }\n this.document.defaultView?.location.reload();\n }\n\n private ensureControlled(): Promise<boolean> {\n const container = this.document.defaultView?.navigator?.serviceWorker;\n if (!container) {\n return Promise.resolve(true);\n }\n if (container.controller) {\n return Promise.resolve(true);\n }\n return new Promise<boolean>((resolve) => {\n const done = (controlled: boolean) => {\n clearTimeout(timer);\n container.removeEventListener('controllerchange', onChange);\n resolve(controlled);\n };\n const onChange = () => done(container.controller !== null);\n const timer = setTimeout(() => done(false), CONTROL_WAIT_MS);\n container.addEventListener('controllerchange', onChange);\n });\n }\n\n private showReloadNeeded(): void {\n this.notifications.show({\n id: CHECK_UNAVAILABLE_TOAST_ID,\n kind: 'info',\n message: 'update.checkUnavailable',\n timeoutMs: 6000,\n });\n }\n\n private async tryActivate(): Promise<void> {\n try {\n if (this.swUpdate?.isEnabled) {\n await this.swUpdate.activateUpdate();\n }\n } catch {\n return;\n }\n }\n\n private async dropWorker(): Promise<void> {\n const view = this.document.defaultView;\n const container = view?.navigator?.serviceWorker;\n await bestEffort(async () => {\n const registrations = (await container?.getRegistrations()) ?? [];\n await Promise.all(\n registrations\n .filter(isShellWorker)\n .map((registration) => registration.unregister()),\n );\n });\n await bestEffort(async () => {\n const storage = view?.caches;\n const keys = (await storage?.keys()) ?? [];\n await Promise.all(\n keys\n .filter((key) => key.startsWith(WORKER_CACHE_PREFIX))\n .map((key) => storage?.delete(key)),\n );\n });\n }\n\n private onVersionEvent(event: VersionEvent): void {\n if (event.type === 'VERSION_READY') {\n this.onUpdateReady();\n }\n if (event.type === 'VERSION_INSTALLATION_FAILED') {\n this.onUpdateFailed();\n }\n }\n\n private onUpdateReady(): void {\n this.available.set(true);\n this.failed.set(false);\n this.broken.set(false);\n this.showUpdateAvailable();\n }\n\n private showUpdateAvailable(): void {\n this.notifications.show({\n id: UPDATE_TOAST_ID,\n kind: 'info',\n message: 'update.available',\n action: { label: 'update.reload', run: () => void this.activateUpdate() },\n });\n }\n\n private onUpdateFailed(): void {\n this.failed.set(true);\n this.showUpdateFailed();\n }\n\n private onWorkerBroken(): void {\n this.failed.set(true);\n this.broken.set(true);\n this.showUpdateFailed();\n }\n\n private showUpdateFailed(): void {\n if (this.broken()) {\n this.notifications.show({\n id: BROKEN_CACHE_TOAST_ID,\n kind: 'warning',\n message: 'update.broken',\n action: {\n label: 'update.repair',\n run: () => void this.activateUpdate(),\n },\n });\n return;\n }\n this.notifications.show({\n id: UPDATE_FAILED_TOAST_ID,\n kind: 'warning',\n message: 'update.failed',\n action: { label: 'update.reload', run: () => void this.activateUpdate() },\n });\n }\n\n private startBackgroundChecks(): void {\n if (!this.swUpdate?.isEnabled) {\n return;\n }\n const timer = setInterval(() => void this.silentCheck(), PERIODIC_CHECK_MS);\n const onVisibility = () => {\n if (this.document.visibilityState === 'visible') {\n void this.silentCheck();\n }\n };\n this.document.addEventListener('visibilitychange', onVisibility);\n this.destroyRef.onDestroy(() => {\n clearInterval(timer);\n this.document.removeEventListener('visibilitychange', onVisibility);\n });\n }\n\n private async silentCheck(): Promise<void> {\n if (!this.swUpdate?.isEnabled || this.available()) {\n return;\n }\n const now = Date.now();\n if (now - this.lastSilentCheck < SILENT_CHECK_GAP_MS) {\n return;\n }\n this.lastSilentCheck = now;\n await this.swUpdate.checkForUpdate().catch(() => undefined);\n }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { UpdateService } from './update.service';\n\n/**\n * Persistent update affordance for a bar. While no update is pending it is a\n * quiet \"check for updates\" button; once the service worker has a new version ready it\n * gains a badge dot and becomes \"reload to update\". When installing an update failed it gains a\n * caution dot and offers a reload instead of pretending to be current; when the worker's cache is\n * broken outright it says so and offers the repair. Reads {@link UpdateService}, so the badge\n * survives dismissing the toast. Renders nothing when updates are unavailable\n * (no service worker — dev/unsupported).\n */\n@Component({\n selector: 'lw-update-badge',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './update-badge.html',\n})\nexport class UpdateBadge {\n private readonly updates = inject(UpdateService);\n\n protected readonly enabled = this.updates.enabled;\n protected readonly available = this.updates.updateAvailable;\n protected readonly failed = this.updates.updateFailed;\n protected readonly label = computed(() => {\n if (this.available()) {\n return 'update.available';\n }\n if (this.updates.updateBroken()) {\n return 'update.broken';\n }\n return this.failed() ? 'update.failed' : 'update.check';\n });\n\n protected onClick(): void {\n if (this.available() || this.failed()) {\n void this.updates.activateUpdate();\n } else {\n void this.updates.checkForUpdate();\n }\n }\n}\n","@if (enabled) {\n <button\n type=\"button\"\n class=\"relative flex items-center gap-1 rounded px-1.5 py-0.5 text-content-faint transition-colors hover:bg-surface-overlay hover:text-content\"\n [class.text-brand]=\"available()\"\n [attr.aria-label]=\"label() | transloco\"\n (click)=\"onClick()\"\n >\n <lw-icon name=\"reset\" size=\"1rem\" />\n @if (available() || failed()) {\n <span\n class=\"absolute top-0 right-0 h-2 w-2 rounded-full ring-2 ring-surface\"\n [class.bg-brand]=\"available()\"\n [class.bg-caution]=\"!available() && failed()\"\n aria-hidden=\"true\"\n ></span>\n }\n <lw-tooltip [text]=\"label() | transloco\" position=\"bottom\" />\n </button>\n}\n","import { BarItem } from '../../foundation/bar-item';\nimport { ShellBrand } from './shell-brand';\nimport { LanguageSwitcher } from '../../i18n/language-switcher';\nimport { ThemeToggle } from '../../theme/theme-toggle';\nimport { LwVersion } from '../../version/lw-version';\nimport { UpdateBadge } from '../../update/update-badge';\n\nexport const DEFAULT_BAR_ITEMS: readonly BarItem[] = [\n {\n id: 'shell.brand',\n bar: 'top-bar',\n slot: 'start',\n order: 0,\n component: ShellBrand,\n },\n {\n id: 'shell.update',\n bar: 'top-bar',\n slot: 'end',\n order: 7,\n component: UpdateBadge,\n },\n {\n id: 'shell.language',\n bar: 'top-bar',\n slot: 'end',\n order: 10,\n component: LanguageSwitcher,\n },\n {\n id: 'shell.theme',\n bar: 'top-bar',\n slot: 'end',\n order: 20,\n component: ThemeToggle,\n },\n {\n id: 'shell.version',\n bar: 'status-bar',\n slot: 'end',\n order: 100,\n component: LwVersion,\n },\n];\n","import { InjectionToken, Provider } from '@angular/core';\n\nimport { RailItem } from '@loomweaver/plugin-sdk';\n\nexport type { RailItem } from '@loomweaver/plugin-sdk';\n\n/** Multi-provider token: each contribution adds one {@link RailItem}. */\nexport const RAIL_ITEM = new InjectionToken<readonly RailItem[]>('RAIL_ITEM');\n\n/** Hooks rail commands into the shell — used by the host and by distributions. */\nexport function provideRailItems(...items: RailItem[]): Provider[] {\n return items.map((item) => ({\n provide: RAIL_ITEM,\n useValue: item,\n multi: true,\n }));\n}\n","import { InjectionToken, Provider } from '@angular/core';\n\nimport { View } from '@loomweaver/plugin-sdk';\n\nexport type { View, ViewAction } from '@loomweaver/plugin-sdk';\n\n/** Multi-provider token: each contribution adds one {@link View}. */\nexport const VIEW = new InjectionToken<readonly View[]>('VIEW');\n\n/** Hooks views into regions — used by the host and by distributions. */\nexport function provideViews(...views: View[]): Provider[] {\n return views.map((view) => ({ provide: VIEW, useValue: view, multi: true }));\n}\n","import { ErrorHandler, inject, Injectable, Injector, Service } from '@angular/core';\nimport { CapabilityError } from '@loomweaver/plugin-sdk';\nimport { CommandService } from '../commands/command.service';\nimport { NotificationService } from '../notifications/notification.service';\n\n@Service()\nexport class CapabilityRefusalReporter {\n private readonly notifications = inject(NotificationService);\n private readonly injector = inject(Injector);\n\n report(error: unknown): boolean {\n if (!(error instanceof CapabilityError)) {\n return false;\n }\n this.notifications.show({\n id: 'permission-blocked',\n kind: 'warning',\n message: 'permission.blocked',\n timeoutMs: 8000,\n action: {\n label: 'permission.openSettings',\n run: () =>\n this.injector.get(CommandService).execute('shell.openSettings'),\n },\n });\n return true;\n }\n}\n\n@Injectable()\nexport class ShellErrorHandler extends ErrorHandler {\n private readonly refusals = inject(CapabilityRefusalReporter);\n\n override handleError(error: unknown): void {\n if (this.refusals.report(error)) {\n return;\n }\n super.handleError(error);\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport {\n CommandArguments,\n CommandOutcome,\n InvocableCommand,\n} from '@loomweaver/plugin-sdk';\n\nexport interface CommandInvoker {\n invocable(callerId: string, granted: boolean): readonly InvocableCommand[];\n invoke(\n callerId: string,\n granted: boolean,\n id: string,\n args?: CommandArguments,\n ): Promise<CommandOutcome>;\n}\n\nconst NOT_COMPOSED: CommandInvoker = {\n invocable: () => [],\n invoke: () =>\n Promise.resolve({\n outcome: 'refused',\n reason: 'unavailable',\n message:\n 'Nothing has composed the command seam in this injector, so no command can be reached ' +\n 'through it. A distribution gets it from provideShell().',\n }),\n};\n\nexport const COMMAND_INVOKER = new InjectionToken<CommandInvoker>(\n 'lw.command-invoker',\n {\n providedIn: 'root',\n factory: () => NOT_COMPOSED,\n },\n);\n","import { InjectionToken } from '@angular/core';\n\nexport interface WorkspaceClaims {\n settle(path: string): Promise<void>;\n}\n\nconst NOT_COMPOSED: WorkspaceClaims = {\n settle: async () => undefined,\n};\n\nexport const WORKSPACE_CLAIMS = new InjectionToken<WorkspaceClaims>(\n 'lw.workspace-claims',\n { providedIn: 'root', factory: () => NOT_COMPOSED },\n);\n","import {\n CommandAnswer,\n CommandArgument,\n CommandArguments,\n CommandScalar,\n} from '@loomweaver/plugin-sdk';\n\nconst MAX_ANSWER_DEPTH = 8;\n\nexport function checkArguments(\n declared: readonly CommandArgument[] | undefined,\n args: unknown,\n): string | null {\n if (args !== undefined && !isPlainObject(args)) {\n return 'takes its arguments as an object keyed by argument name';\n }\n const argument = declared ?? [];\n const supplied: Record<string, unknown> = args ?? {};\n const known = new Set(argument.map((entry) => entry.name));\n for (const name of Object.keys(supplied)) {\n if (!known.has(name)) {\n return `does not declare an argument named \"${name}\"`;\n }\n }\n for (const entry of argument) {\n const value = supplied[entry.name];\n if (value === undefined) {\n if (entry.required === true) {\n return `requires the argument \"${entry.name}\"`;\n }\n continue;\n }\n const problem = checkValue(entry, value);\n if (problem !== null) {\n return problem;\n }\n }\n return null;\n}\n\nexport function asCommandArguments(value: unknown): CommandArguments | null {\n if (!isPlainObject(value)) {\n return null;\n }\n const carried: Record<string, CommandScalar | readonly CommandScalar[]> = {};\n for (const [name, entry] of Object.entries(value)) {\n if (isScalar(entry)) {\n carried[name] = entry;\n continue;\n }\n if (Array.isArray(entry) && entry.every(isScalar)) {\n carried[name] = entry;\n continue;\n }\n return null;\n }\n return carried;\n}\n\nexport function isCommandAnswer(\n value: unknown,\n depth = 0,\n): value is CommandAnswer {\n if (depth > MAX_ANSWER_DEPTH) {\n return false;\n }\n if (value === null || isScalar(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.every((entry) => isCommandAnswer(entry, depth + 1));\n }\n if (!isPlainObject(value)) {\n return false;\n }\n return Object.values(value).every((entry) =>\n isCommandAnswer(entry, depth + 1),\n );\n}\n\nfunction checkValue(entry: CommandArgument, value: unknown): string | null {\n if (entry.list === true) {\n if (!Array.isArray(value)) {\n return `expects a list for \"${entry.name}\"`;\n }\n for (const item of value) {\n const problem = checkScalar(entry, item);\n if (problem !== null) {\n return problem;\n }\n }\n return null;\n }\n if (Array.isArray(value)) {\n return `expects a single value for \"${entry.name}\", not a list`;\n }\n return checkScalar(entry, value);\n}\n\nfunction checkScalar(entry: CommandArgument, value: unknown): string | null {\n if (entry.kind === 'choice') {\n return typeof value === 'string' && entry.choices.includes(value)\n ? null\n : `expects \"${entry.name}\" to be one of ${entry.choices.join(', ')}`;\n }\n if (entry.kind === 'number') {\n return typeof value === 'number' && Number.isFinite(value)\n ? null\n : `expects \"${entry.name}\" to be a finite number`;\n }\n const expected = entry.kind === 'text' ? 'string' : 'boolean';\n return typeof value === expected\n ? null\n : `expects \"${entry.name}\" to be a ${entry.kind}`;\n}\n\nfunction isScalar(value: unknown): value is CommandScalar {\n return (\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== 'object' || value === null) {\n return false;\n }\n const prototype: unknown = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n","import { ErrorHandler, inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n CapabilityError,\n Command,\n CommandArguments,\n CommandOutcome,\n InvocableCommand,\n} from '@loomweaver/plugin-sdk';\nimport {\n ContributionRegistry,\n RegisteredCommand,\n} from '../plugin/contribution-registry';\nimport { CommandService } from './command.service';\nimport {\n checkArguments,\n isCommandAnswer,\n} from '../foundation/command-arguments';\nimport { CommandInvoker } from '../foundation/command-invoker';\n\nconst MAX_INVOCATION_DEPTH = 16;\n\nconst UNAVAILABLE: CommandOutcome = {\n outcome: 'refused',\n reason: 'unavailable',\n message:\n 'No command with that id is available to this caller here and now. It may not exist, it may ' +\n 'not be open to a caller other than its own plugin, the session may not meet its access ' +\n 'requirement, this window may not host it, or the caller may lack the automation capability.',\n};\n\n@Service()\nexport class CommandInvocationService implements CommandInvoker {\n private readonly commands = inject(CommandService);\n private readonly registry = inject(ContributionRegistry);\n private readonly errors = inject(ErrorHandler);\n private readonly transloco = inject(TranslocoService, { optional: true });\n\n private depth = 0;\n\n invocable(callerId: string, granted: boolean): readonly InvocableCommand[] {\n return this.registry\n .registeredCommands()\n .filter(\n (entry) =>\n entry.command.callable === true &&\n this.reachable(entry, callerId, granted),\n )\n .map((entry) => this.describe(entry.command))\n .sort((a, b) => a.id.localeCompare(b.id));\n }\n\n async invoke(\n callerId: string,\n granted: boolean,\n id: string,\n args?: CommandArguments,\n ): Promise<CommandOutcome> {\n const entry = this.registry\n .registeredCommands()\n .find((candidate) => candidate.command.id === id);\n if (entry === undefined || !this.reachable(entry, callerId, granted)) {\n this.reportRefusal(callerId, entry, granted);\n return UNAVAILABLE;\n }\n const command = entry.command;\n const problem = checkArguments(command.arguments, args);\n if (problem !== null) {\n return {\n outcome: 'refused',\n reason: 'invalid-arguments',\n message: `Command \"${id}\" ${problem}.`,\n };\n }\n if (this.depth >= MAX_INVOCATION_DEPTH) {\n return {\n outcome: 'refused',\n reason: 'too-deep',\n message:\n `Command \"${id}\" was refused: invocations are nested more than ` +\n `${MAX_INVOCATION_DEPTH} deep, which is a loop rather than a chain.`,\n };\n }\n return this.run(command, args);\n }\n\n private async run(\n command: Command,\n args: CommandArguments | undefined,\n ): Promise<CommandOutcome> {\n this.depth += 1;\n try {\n const returned = await this.commands.run(command, undefined, args);\n return this.answerOf(command, returned);\n } catch (error) {\n return { outcome: 'failed', message: messageOf(error) };\n } finally {\n this.depth -= 1;\n }\n }\n\n private answerOf(command: Command, returned: unknown): CommandOutcome {\n if (command.answers === undefined) {\n return { outcome: 'answered' };\n }\n if (!isCommandAnswer(returned)) {\n return {\n outcome: 'failed',\n message:\n `Command \"${command.id}\" declares an answer but returned something that cannot be ` +\n `carried as data, so nothing was handed back.`,\n };\n }\n return { outcome: 'answered', value: returned };\n }\n\n private reachable(\n entry: RegisteredCommand,\n callerId: string,\n granted: boolean,\n ): boolean {\n const own = entry.ownerId !== undefined && entry.ownerId === callerId;\n if (!own && !(granted && entry.command.callable === true)) {\n return false;\n }\n return this.commands.available(entry.command);\n }\n\n private reportRefusal(\n callerId: string,\n entry: RegisteredCommand | undefined,\n granted: boolean,\n ): void {\n const own = entry?.ownerId !== undefined && entry.ownerId === callerId;\n if (granted || own) {\n return;\n }\n this.errors.handleError(\n new CapabilityError(\n 'automation',\n callerId,\n 'Running an action another plugin contributed needs the automation capability.',\n ),\n );\n }\n\n private describe(command: Command): InvocableCommand {\n return {\n id: command.id,\n title: this.text(command.title),\n description:\n command.description === undefined\n ? undefined\n : this.text(command.description),\n arguments: command.arguments?.map((argument) => ({\n ...argument,\n description: this.text(argument.description),\n })),\n answers:\n command.answers === undefined ? undefined : this.text(command.answers),\n };\n }\n\n private text(value: string): string {\n return this.transloco?.translate(value) ?? value;\n }\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { computed, DestroyRef, effect, inject, Injector, Service, Signal } from '@angular/core';\nimport { Command } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../plugin/contribution-registry';\nimport { CommandService } from './command.service';\nimport {\n chordSignature,\n eventSignature,\n isEditableTarget,\n isMacPlatform,\n} from './keybinding';\nimport { SHELL_FEATURES } from '../foundation/shell-features';\n\ninterface BindingsBuild {\n readonly map: ReadonlyMap<string, string>;\n readonly warnings: readonly string[];\n}\n\nfunction buildBindings(\n commands: readonly Command[],\n isMac: boolean,\n): BindingsBuild {\n const map = new Map<string, string>();\n const warnings: string[] = [];\n for (const command of commands) {\n if (!command.shortcut) {\n continue;\n }\n const signature = chordSignature(command.shortcut, isMac);\n if (!signature) {\n warnings.push(\n `Command \"${command.id}\" has an unparsable shortcut \"${command.shortcut}\".`,\n );\n continue;\n }\n const clash = map.get(signature);\n if (clash) {\n warnings.push(\n `Shortcut \"${command.shortcut}\" is bound to both \"${clash}\" and \"${command.id}\".`,\n );\n }\n map.set(signature, command.id);\n }\n return { map, warnings };\n}\n\n/**\n * Binds command shortcuts to the keyboard. Bindings are *derived* from the registered\n * commands' `shortcut` (no separate registration path) and rebuild reactively as commands come and\n * go. One global `keydown` listener resolves the pressed chord to a command id and fires it through\n * the {@link CommandService} — the same seam a click uses. User rebinding is deferred.\n */\n@Service()\nexport class KeybindingService {\n private readonly registry = inject(ContributionRegistry);\n private readonly commands = inject(CommandService);\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n private readonly enabled = inject(SHELL_FEATURES).commands.shortcuts;\n private readonly isMac = isMacPlatform();\n private started = false;\n\n private readonly build = computed(() =>\n buildBindings(this.registry.commands(), this.isMac),\n );\n\n private readonly bindings: Signal<ReadonlyMap<string, string>> = computed(\n () => this.build().map,\n );\n\n /** Attaches the global listener once; auto-detached on destroy. No-op where shortcuts are off. */\n start(): void {\n if (this.started || !this.enabled) {\n return;\n }\n this.started = true;\n effect(\n () => {\n for (const warning of this.build().warnings) {\n console.warn(warning);\n }\n },\n { injector: this.injector },\n );\n const handler = (event: KeyboardEvent) => this.onKeydown(event);\n this.document.addEventListener('keydown', handler);\n this.destroyRef.onDestroy(() =>\n this.document.removeEventListener('keydown', handler),\n );\n }\n\n private onKeydown(event: KeyboardEvent): void {\n const hasCommandModifier = event.ctrlKey || event.metaKey || event.altKey;\n if (!hasCommandModifier && isEditableTarget(event.target)) {\n return;\n }\n const commandId = this.bindings().get(eventSignature(event));\n if (!commandId) {\n return;\n }\n event.preventDefault();\n this.commands.execute(commandId);\n }\n}\n","import {\n reflectAttribute,\n upgradeElementProperty,\n} from '../custom-element-property';\n\nconst DEFAULT_DELAY_MS = 600;\n\n/** Tooltip placement relative to the trigger — the element positions the bubble in JS accordingly. */\nexport type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';\n\nconst TOOLTIP_GAP = 6;\nconst VIEWPORT_MARGIN = 4;\n\nconst CURSOR_OFFSET_X = 0;\nconst CURSOR_BELOW_Y = 16;\nconst CURSOR_ABOVE_GAP = 6;\n\n/** The custom-element tag. Authored as the last child of a `position: relative` trigger. */\nexport const LW_TOOLTIP_TAG = 'lw-tooltip';\n\n/**\n * `<lw-tooltip>` — the host tooltip primitive as a **framework-agnostic custom element**.\n * It is a plain `HTMLElement` (no framework runtime), so it crosses the Nx boundary as a *tag* (an\n * SDK-only weaver uses `<lw-tooltip text=\"…\" position=\"bottom\">` without importing `@loomweaver/shell`) and,\n * later, an iframe/sandbox boundary once the element script is served alongside `theme.css`.\n *\n * The element renders the bubble and drives it entirely in JS — reveal, hide, and **positioning**. The\n * bubble is a **Popover** in the browser top layer, so it is never clipped by a `transform`/`overflow`\n * ancestor (a virtual-scroll row) nor lost under a region's z-order (#13). Its `left`/`top` are computed\n * in JS (no CSS anchor positioning — shipping Safari does not support it): a **pointer** reveal anchors to\n * the **cursor** (native-`title`-like, so a wide trigger's tooltip appears where the mouse is, not at the\n * element's far edge); a **focus** reveal anchors to the trigger element per `position`. Reveal is off the\n * trigger's hover/focus (mouse only — touch never reveals). Its **look** lives in `theme.css`\n * (`.lw-tooltip-bubble`, tokened) like `.lw-btn`. Place it as the last child of a positioned trigger:\n *\n * <button class=\"relative …\" [attr.aria-label]=\"'key' | transloco\">\n * <lw-icon name=\"…\" />\n * <lw-tooltip text=\"…\" position=\"bottom\"></lw-tooltip>\n * </button>\n */\nexport class LwTooltipElement extends HTMLElement {\n static readonly observedAttributes = [\n 'text',\n 'position',\n 'delay-ms',\n 'max-width',\n ];\n\n private bubble?: HTMLSpanElement;\n\n private trigger?: HTMLElement;\n\n private showTimer?: ReturnType<typeof setTimeout>;\n\n private pointer?: { x: number; y: number };\n\n get text(): string | null {\n return this.getAttribute('text');\n }\n\n set text(value: string | null) {\n reflectAttribute(this, 'text', value);\n }\n\n get position(): TooltipPosition {\n return (this.getAttribute('position') as TooltipPosition | null) ?? 'top';\n }\n\n set position(value: TooltipPosition | null) {\n reflectAttribute(this, 'position', value);\n }\n\n connectedCallback(): void {\n upgradeElementProperty(this, 'text');\n upgradeElementProperty(this, 'position');\n this.render();\n\n this.trigger = this.parentElement ?? undefined;\n this.trigger?.addEventListener('pointerenter', this.onEnter);\n this.trigger?.addEventListener('pointermove', this.onMove);\n this.trigger?.addEventListener('pointerleave', this.onLeave);\n this.trigger?.addEventListener('focusin', this.onFocusIn);\n this.trigger?.addEventListener('focusout', this.onFocusOut);\n }\n\n disconnectedCallback(): void {\n this.hide();\n this.trigger?.removeEventListener('pointerenter', this.onEnter);\n this.trigger?.removeEventListener('pointermove', this.onMove);\n this.trigger?.removeEventListener('pointerleave', this.onLeave);\n this.trigger?.removeEventListener('focusin', this.onFocusIn);\n this.trigger?.removeEventListener('focusout', this.onFocusOut);\n this.trigger = undefined;\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.render();\n }\n }\n\n private readonly onEnter = (event: PointerEvent) => this.scheduleShow(event);\n\n private readonly onMove = (event: PointerEvent) => {\n if (event.pointerType === 'mouse') {\n this.pointer = { x: event.clientX, y: event.clientY };\n }\n };\n\n private readonly onLeave = () => this.hide();\n\n private readonly onFocusIn = () => this.scheduleShow();\n\n private readonly onFocusOut = () => this.hide();\n\n private render(): void {\n const text = (this.getAttribute('text') ?? '').trim();\n if (!text) {\n this.bubble?.remove();\n this.bubble = undefined;\n return;\n }\n const bubble = this.bubble ?? this.createBubble();\n bubble.textContent = text;\n bubble.style.maxWidth = this.getAttribute('max-width') ?? '16rem';\n }\n\n private createBubble(): HTMLSpanElement {\n const bubble = document.createElement('span');\n bubble.className = 'lw-tooltip-bubble';\n bubble.setAttribute('role', 'tooltip');\n\n bubble.setAttribute('popover', 'manual');\n this.append(bubble);\n this.bubble = bubble;\n return bubble;\n }\n\n private scheduleShow(event?: PointerEvent): void {\n if (event && event.pointerType !== 'mouse') {\n return;\n }\n\n this.pointer = event ? { x: event.clientX, y: event.clientY } : undefined;\n this.clearTimer();\n this.showTimer = setTimeout(() => this.show(), this.delayMs());\n }\n\n private delayMs(): number {\n const raw = this.getAttribute('delay-ms');\n if (raw === null || raw.trim() === '') {\n return DEFAULT_DELAY_MS;\n }\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_DELAY_MS;\n }\n\n private show(): void {\n const bubble = this.bubble;\n if (!bubble?.isConnected || typeof bubble.showPopover !== 'function') {\n return;\n }\n try {\n bubble.showPopover();\n } catch {\n return;\n }\n this.placeBubble(bubble);\n }\n\n private placeBubble(bubble: HTMLElement): void {\n const b = bubble.getBoundingClientRect();\n let left: number;\n let top: number;\n if (this.pointer) {\n left = this.pointer.x + CURSOR_OFFSET_X;\n const below = this.pointer.y + CURSOR_BELOW_Y;\n top =\n below + b.height + VIEWPORT_MARGIN > window.innerHeight\n ? this.pointer.y - b.height - CURSOR_ABOVE_GAP\n : below;\n } else if (this.trigger) {\n const t = this.trigger.getBoundingClientRect();\n const centerX = t.left + t.width / 2 - b.width / 2;\n const centerY = t.top + t.height / 2 - b.height / 2;\n switch (this.position) {\n case 'bottom':\n [left, top] = [centerX, t.bottom + TOOLTIP_GAP];\n break;\n case 'left':\n [left, top] = [t.left - b.width - TOOLTIP_GAP, centerY];\n break;\n case 'right':\n [left, top] = [t.right + TOOLTIP_GAP, centerY];\n break;\n default:\n [left, top] = [centerX, t.top - b.height - TOOLTIP_GAP];\n }\n } else {\n return;\n }\n const maxLeft = window.innerWidth - b.width - VIEWPORT_MARGIN;\n const maxTop = window.innerHeight - b.height - VIEWPORT_MARGIN;\n bubble.style.left = `${Math.round(Math.max(VIEWPORT_MARGIN, Math.min(left, maxLeft)))}px`;\n bubble.style.top = `${Math.round(Math.max(VIEWPORT_MARGIN, Math.min(top, maxTop)))}px`;\n }\n\n private hide(): void {\n this.clearTimer();\n const bubble = this.bubble;\n if (!bubble || typeof bubble.hidePopover !== 'function') {\n return;\n }\n try {\n bubble.hidePopover();\n } catch {\n return;\n }\n }\n\n private clearTimer(): void {\n if (this.showTimer !== undefined) {\n clearTimeout(this.showTimer);\n this.showTimer = undefined;\n }\n }\n}\n\n/** Registers `<lw-tooltip>` once (idempotent) — called from {@link provideShell} at bootstrap. */\nexport function defineLwTooltip(): void {\n if (\n typeof customElements !== 'undefined' &&\n !customElements.get(LW_TOOLTIP_TAG)\n ) {\n customElements.define(LW_TOOLTIP_TAG, LwTooltipElement);\n }\n}\n","import {\n reflectAttribute,\n upgradeElementProperty,\n} from '../custom-element-property';\n\nexport const LW_SELECT_TAG = 'lw-select';\nexport const LW_OPTION_TAG = 'lw-option';\n\nexport const LW_SELECT_CHANGE = 'lw-select-change';\n\nlet nextSelectId = 0;\n\nconst TYPEAHEAD_RESET_MS = 500;\n\ninterface Choice {\n readonly value: string;\n readonly label: string;\n readonly icon: string | null;\n readonly disabled: boolean;\n}\n\nexport class LwOptionElement extends HTMLElement {\n get value(): string | null {\n return this.getAttribute('value');\n }\n set value(value: string | null) {\n reflectAttribute(this, 'value', value);\n }\n get icon(): string | null {\n return this.getAttribute('icon');\n }\n set icon(value: string | null) {\n reflectAttribute(this, 'icon', value);\n }\n\n connectedCallback(): void {\n upgradeElementProperty(this, 'value');\n upgradeElementProperty(this, 'icon');\n }\n}\n\nexport class LwSelectElement extends HTMLElement {\n static readonly observedAttributes = [\n 'value',\n 'label',\n 'placeholder',\n 'disabled',\n ];\n\n private readonly selectId = nextSelectId++;\n\n private readonly anchorName = `--lw-select-${this.selectId}`;\n\n private readonly listboxId = `lw-select-listbox-${this.selectId}`;\n\n private open = false;\n\n private activeIndex = 0;\n\n private typeahead = '';\n\n private typeaheadTimer?: ReturnType<typeof setTimeout>;\n\n private trigger?: HTMLButtonElement;\n\n private valueSlot?: HTMLSpanElement;\n\n private listbox?: HTMLDivElement;\n\n private observer?: MutationObserver;\n\n get value(): string | null {\n return this.getAttribute('value');\n }\n\n set value(value: string | null) {\n reflectAttribute(this, 'value', value);\n }\n\n connectedCallback(): void {\n upgradeElementProperty(this, 'value');\n if (!this.trigger) {\n this.buildControl();\n }\n\n this.observer = new MutationObserver(() => this.syncTrigger());\n this.observe();\n this.syncTrigger();\n }\n\n disconnectedCallback(): void {\n this.observer?.disconnect();\n document.removeEventListener('pointerdown', this.onOutsidePointer, true);\n if (this.typeaheadTimer !== undefined) {\n clearTimeout(this.typeaheadTimer);\n }\n }\n\n attributeChangedCallback(name: string): void {\n if (!this.trigger) {\n return;\n }\n\n if (\n name === 'value' ||\n name === 'label' ||\n name === 'placeholder' ||\n name === 'disabled'\n ) {\n this.syncTrigger();\n }\n if (name === 'disabled' && this.hasAttribute('disabled')) {\n this.close(false);\n }\n }\n\n private readonly onOutsidePointer = (event: PointerEvent) => {\n if (!this.contains(event.target as Node)) {\n this.close(false);\n }\n };\n\n private observe(): void {\n this.observer?.observe(this, {\n childList: true,\n characterData: true,\n subtree: true,\n attributes: true,\n });\n }\n\n private write(fn: () => void): void {\n this.observer?.disconnect();\n try {\n fn();\n } finally {\n this.observe();\n }\n }\n\n private choices(): Choice[] {\n return [...this.querySelectorAll(LW_OPTION_TAG)].map((option) => ({\n value: option.getAttribute('value') ?? '',\n label: (option.textContent ?? '').trim(),\n icon: option.getAttribute('icon'),\n disabled: option.hasAttribute('disabled'),\n }));\n }\n\n private selectedChoice(): Choice | undefined {\n const value = this.value;\n return this.choices().find((choice) => choice.value === value);\n }\n\n private buildControl(): void {\n const trigger = document.createElement('button');\n trigger.type = 'button';\n trigger.className = 'lw-select-trigger';\n trigger.setAttribute('aria-haspopup', 'listbox');\n trigger.setAttribute('aria-expanded', 'false');\n trigger.setAttribute('aria-controls', this.listboxId);\n trigger.style.setProperty('anchor-name', this.anchorName);\n trigger.addEventListener('click', () => this.toggle());\n trigger.addEventListener('keydown', (event) =>\n this.onTriggerKeydown(event),\n );\n\n const valueSlot = document.createElement('span');\n valueSlot.className = 'lw-select-value';\n const chevron = document.createElement('span');\n chevron.className = 'lw-select-chevron';\n chevron.setAttribute('aria-hidden', 'true');\n chevron.textContent = '▾';\n trigger.append(valueSlot, chevron);\n\n const listbox = document.createElement('div');\n listbox.id = this.listboxId;\n listbox.className = 'lw-select-listbox';\n listbox.setAttribute('role', 'listbox');\n listbox.hidden = true;\n listbox.style.setProperty('position-anchor', this.anchorName);\n listbox.addEventListener('keydown', (event) =>\n this.onListboxKeydown(event),\n );\n\n this.append(trigger, listbox);\n this.trigger = trigger;\n this.valueSlot = valueSlot;\n this.listbox = listbox;\n }\n\n private syncTrigger(): void {\n const trigger = this.trigger;\n const valueSlot = this.valueSlot;\n if (!trigger || !valueSlot) {\n return;\n }\n const label = this.getAttribute('label');\n const selected = this.selectedChoice();\n const text = selected?.label ?? this.getAttribute('placeholder') ?? '';\n const icon = selected?.icon ?? null;\n this.write(() => {\n trigger.disabled = this.hasAttribute('disabled');\n if (label !== null) {\n trigger.setAttribute('aria-label', label);\n this.listbox?.setAttribute('aria-label', label);\n }\n valueSlot.textContent = '';\n if (icon) {\n const glyph = document.createElement('span');\n glyph.className = 'lw-select-glyph';\n glyph.setAttribute('aria-hidden', 'true');\n glyph.textContent = icon;\n valueSlot.append(glyph);\n }\n valueSlot.append(document.createTextNode(text));\n });\n }\n\n private toggle(): void {\n if (this.open) {\n this.close();\n } else {\n this.openListbox();\n }\n }\n\n private openListbox(): void {\n const listbox = this.listbox;\n const trigger = this.trigger;\n if (this.open || this.hasAttribute('disabled') || !listbox || !trigger) {\n return;\n }\n this.renderOptions();\n this.open = true;\n this.write(() => {\n listbox.hidden = false;\n trigger.setAttribute('aria-expanded', 'true');\n });\n const choices = this.choices();\n const selected = choices.findIndex((choice) => choice.value === this.value);\n this.setActive(Math.max(0, selected));\n\n document.addEventListener('pointerdown', this.onOutsidePointer, true);\n }\n\n private close(refocusTrigger = true): void {\n const listbox = this.listbox;\n const trigger = this.trigger;\n if (!this.open || !listbox || !trigger) {\n return;\n }\n this.open = false;\n this.write(() => {\n listbox.hidden = true;\n listbox.replaceChildren();\n trigger.setAttribute('aria-expanded', 'false');\n });\n document.removeEventListener('pointerdown', this.onOutsidePointer, true);\n if (refocusTrigger) {\n trigger.focus();\n }\n }\n\n private renderOptions(): void {\n if (!this.listbox) {\n return;\n }\n const items = this.choices().map((choice, index) => {\n const option = document.createElement('div');\n option.className = 'lw-select-option';\n option.setAttribute('role', 'option');\n option.id = `${this.listboxId}-opt-${index}`;\n option.dataset['value'] = choice.value;\n option.setAttribute('aria-selected', String(choice.value === this.value));\n option.tabIndex = -1;\n if (choice.disabled) {\n option.setAttribute('aria-disabled', 'true');\n }\n if (choice.icon) {\n const glyph = document.createElement('span');\n glyph.className = 'lw-select-glyph';\n glyph.setAttribute('aria-hidden', 'true');\n glyph.textContent = choice.icon;\n option.append(glyph);\n }\n option.append(document.createTextNode(choice.label));\n option.addEventListener('click', () => {\n if (!choice.disabled) {\n this.commit(choice.value);\n }\n });\n option.addEventListener('pointermove', () => this.setActive(index));\n return option;\n });\n const listbox = this.listbox;\n this.write(() => listbox.replaceChildren(...items));\n }\n\n private setActive(index: number): void {\n if (!this.listbox) {\n return;\n }\n const options = [...this.listbox.children] as HTMLElement[];\n if (options.length === 0) {\n return;\n }\n this.activeIndex = Math.max(0, Math.min(index, options.length - 1));\n this.write(() => {\n options.forEach((option, i) => {\n option.classList.toggle('is-active', i === this.activeIndex);\n option.tabIndex = i === this.activeIndex ? 0 : -1;\n });\n });\n const active = options[this.activeIndex];\n active.focus();\n active.scrollIntoView?.({ block: 'nearest' });\n }\n\n private onTriggerKeydown(event: KeyboardEvent): void {\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n this.openListbox();\n }\n }\n\n private onListboxKeydown(event: KeyboardEvent): void {\n const last = this.choices().length - 1;\n switch (event.key) {\n case 'ArrowDown':\n this.setActive(this.activeIndex >= last ? 0 : this.activeIndex + 1);\n break;\n case 'ArrowUp':\n this.setActive(this.activeIndex <= 0 ? last : this.activeIndex - 1);\n break;\n case 'Home':\n this.setActive(0);\n break;\n case 'End':\n this.setActive(last);\n break;\n case 'Enter':\n case ' ':\n this.commitActive();\n break;\n case 'Escape':\n this.close();\n break;\n case 'Tab':\n this.close(false);\n return;\n default:\n if (event.key.length === 1) {\n this.onTypeahead(event.key);\n }\n return;\n }\n event.preventDefault();\n }\n\n private onTypeahead(char: string): void {\n this.typeahead += char.toLowerCase();\n if (this.typeaheadTimer !== undefined) {\n clearTimeout(this.typeaheadTimer);\n }\n this.typeaheadTimer = setTimeout(\n () => (this.typeahead = ''),\n TYPEAHEAD_RESET_MS,\n );\n const match = this.choices().findIndex(\n (choice) =>\n !choice.disabled &&\n choice.label.toLowerCase().startsWith(this.typeahead),\n );\n if (match >= 0) {\n this.setActive(match);\n }\n }\n\n private commitActive(): void {\n const choice = this.choices()[this.activeIndex];\n if (choice && !choice.disabled) {\n this.commit(choice.value);\n }\n }\n\n private commit(value: string): void {\n const changed = value !== this.value;\n this.value = value;\n this.close();\n if (changed) {\n this.dispatchEvent(\n new CustomEvent(LW_SELECT_CHANGE, { detail: { value }, bubbles: true }),\n );\n }\n }\n}\n\nexport function defineLwSelect(): void {\n if (typeof customElements === 'undefined') {\n return;\n }\n if (!customElements.get(LW_OPTION_TAG)) {\n customElements.define(LW_OPTION_TAG, LwOptionElement);\n }\n if (!customElements.get(LW_SELECT_TAG)) {\n customElements.define(LW_SELECT_TAG, LwSelectElement);\n }\n}\n","import DOMPurify from 'dompurify';\nimport { marked } from 'marked';\nimport {\n reflectAttribute,\n upgradeElementProperty,\n} from '../custom-element-property';\n\n/** The custom-element tag. */\nexport const LW_MARKDOWN_TAG = 'lw-markdown';\n\n/**\n * `<lw-markdown source=\"…\">` — the host rich-text primitive as a framework-agnostic custom element\n * (like `<lw-tooltip>`/`<lw-select>`/`<lw-menu>`): a plain `HTMLElement`, **light DOM**, so the\n * `prose-lw` Tailwind-Typography classes + `--lw-*` tokens cascade in (auto dark-mode). It does\n * no formatting logic of its own — `marked` parses, **DOMPurify** sanitizes (scripts / `on*` / `javascript:`\n * stripped; the element renders raw `innerHTML`, so this is the security seam, like the icon registry).\n * Reusable anywhere rich text is needed (dialog bodies, About, weaver content), and — unlike the old\n * Angular component — usable in a weaver body by tag, no `@loomweaver/shell` import.\n *\n * <lw-markdown [source]=\"'Delete **' + name + '**? This cannot be undone.'\"></lw-markdown>\n */\nexport class LwMarkdownElement extends HTMLElement {\n static readonly observedAttributes = ['source'];\n\n private prose?: HTMLElement;\n\n get source(): string {\n return this.getAttribute('source') ?? '';\n }\n set source(value: string | null) {\n reflectAttribute(this, 'source', value);\n }\n\n connectedCallback(): void {\n upgradeElementProperty(this, 'source');\n if (!this.prose) {\n this.prose = document.createElement('div');\n this.prose.className = 'prose prose-sm max-w-none prose-lw';\n this.append(this.prose);\n }\n this.render(this.prose);\n }\n\n attributeChangedCallback(): void {\n if (this.prose) {\n this.render(this.prose);\n }\n }\n\n private render(prose: HTMLElement): void {\n const html = marked.parse(this.source, {\n async: false,\n gfm: true,\n breaks: true,\n });\n\n prose.innerHTML = DOMPurify.sanitize(html);\n }\n}\n\n/** Registers `<lw-markdown>` once (idempotent) — called from {@link provideShell} at bootstrap. */\nexport function defineLwMarkdown(): void {\n if (\n typeof customElements !== 'undefined' &&\n !customElements.get(LW_MARKDOWN_TAG)\n ) {\n customElements.define(LW_MARKDOWN_TAG, LwMarkdownElement);\n }\n}\n","import { LwButtonSize, LwButtonVariant } from '@loomweaver/plugin-sdk';\nimport {\n reflectAttribute,\n upgradeElementProperty,\n} from '../custom-element-property';\nimport { lwButtonClasses } from './lw-button-classes';\n\n/** The custom-element tag. */\nexport const LW_BUTTON_TAG = 'lw-button';\n\n/**\n * `<lw-button variant=\"primary\">Save</lw-button>` — the host button primitive as a framework-agnostic\n * custom element (like `<lw-tooltip>`/`<lw-select>`/`<lw-menu>`): light DOM (its content stays\n * in place), a `role=\"button\"` element that emits the same **`.lw-btn` CSS-class contract**\n * (`theme.css`) the {@link LwButton} directive does — one source of truth for the look, on semantic tokens.\n *\n * The Angular {@link LwButton} directive stays the idiomatic choice for host chrome (it sits on a **native**\n * `<button>`/`<a>`, keeping native semantics). This element is the framework-agnostic path for a weaver body\n * or a sandboxed iframe that cannot import the directive across the Nx boundary. It adds keyboard activation\n * (Enter/Space) and `disabled` so a `role=\"button\"` behaves like a button.\n *\n * <lw-button variant=\"primary\" (click)=\"save()\">Speichern</lw-button>\n * <lw-button variant=\"ghost\" size=\"sm\" icon-only aria-label=\"…\"><!-- icon --></lw-button>\n */\nexport class LwButtonElement extends HTMLElement {\n static readonly observedAttributes = [\n 'variant',\n 'size',\n 'icon-only',\n 'disabled',\n ];\n\n get variant(): LwButtonVariant {\n return (\n (this.getAttribute('variant') as LwButtonVariant | null) ?? 'default'\n );\n }\n\n set variant(value: LwButtonVariant | null) {\n reflectAttribute(this, 'variant', value);\n }\n\n get size(): LwButtonSize {\n return (this.getAttribute('size') as LwButtonSize | null) ?? 'md';\n }\n\n set size(value: LwButtonSize | null) {\n reflectAttribute(this, 'size', value);\n }\n\n get iconOnly(): boolean {\n return this.hasAttribute('icon-only');\n }\n\n set iconOnly(value: boolean) {\n this.toggleAttribute('icon-only', value);\n }\n\n get disabled(): boolean {\n return this.hasAttribute('disabled');\n }\n\n set disabled(value: boolean) {\n this.toggleAttribute('disabled', value);\n }\n\n connectedCallback(): void {\n upgradeElementProperty(this, 'variant');\n upgradeElementProperty(this, 'size');\n upgradeElementProperty(this, 'iconOnly');\n upgradeElementProperty(this, 'disabled');\n this.setAttribute('role', 'button');\n this.addEventListener('keydown', this.onKeydown);\n this.render();\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('keydown', this.onKeydown);\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.render();\n }\n }\n\n private readonly onKeydown = (event: KeyboardEvent) => {\n if ((event.key === 'Enter' || event.key === ' ') && !this.disabled) {\n event.preventDefault();\n this.click();\n }\n };\n\n private render(): void {\n const stale = [...this.classList].filter((cls) => cls.startsWith('lw-btn'));\n this.classList.remove(...stale);\n this.classList.add(\n ...lwButtonClasses(this.variant, this.size, this.iconOnly),\n );\n this.setAttribute('aria-disabled', String(this.disabled));\n this.tabIndex = this.disabled ? -1 : 0;\n }\n}\n\n/** Registers `<lw-button>` once (idempotent) — called from {@link provideShell} at bootstrap. */\nexport function defineLwButton(): void {\n if (\n typeof customElements !== 'undefined' &&\n !customElements.get(LW_BUTTON_TAG)\n ) {\n customElements.define(LW_BUTTON_TAG, LwButtonElement);\n }\n}\n","export const LW_PROGRESS_RING_TAG = 'lw-progress-ring';\n\nconst RADIUS = 15.9155;\n\nexport class LwProgressRingElement extends HTMLElement {\n static readonly observedAttributes = ['value', 'max', 'size'];\n\n connectedCallback(): void {\n this.render();\n }\n\n attributeChangedCallback(): void {\n if (this.isConnected) {\n this.render();\n }\n }\n\n private num(name: string, fallback: number): number {\n const raw = this.getAttribute(name);\n if (raw === null || raw.trim() === '') {\n return fallback;\n }\n const parsed = Number(raw);\n return Number.isFinite(parsed) ? parsed : fallback;\n }\n\n private render(): void {\n const max = Math.max(this.num('max', 100), 1);\n const value = Math.min(Math.max(this.num('value', 0), 0), max);\n const percent = Math.round((value / max) * 100);\n const size = this.getAttribute('size') ?? '2.5rem';\n\n this.style.width = size;\n this.style.height = size;\n this.setAttribute('role', 'progressbar');\n this.setAttribute('aria-valuenow', String(value));\n this.setAttribute('aria-valuemin', '0');\n this.setAttribute('aria-valuemax', String(max));\n\n this.innerHTML =\n `<svg class=\"lw-progress-ring-svg\" viewBox=\"0 0 36 36\" aria-hidden=\"true\">` +\n `<circle class=\"lw-progress-ring-track\" cx=\"18\" cy=\"18\" r=\"${RADIUS}\"></circle>` +\n `<circle class=\"lw-progress-ring-value\" cx=\"18\" cy=\"18\" r=\"${RADIUS}\" transform=\"rotate(-90 18 18)\"` +\n ` stroke-dasharray=\"100\" stroke-dashoffset=\"${100 - percent}\"></circle>` +\n `<text class=\"lw-progress-ring-text\" x=\"18\" y=\"18\">${percent}%</text>` +\n `</svg>`;\n }\n}\n\nexport function defineLwProgressRing(): void {\n if (\n typeof customElements !== 'undefined' &&\n !customElements.get(LW_PROGRESS_RING_TAG)\n ) {\n customElements.define(LW_PROGRESS_RING_TAG, LwProgressRingElement);\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { PaneMoveService } from '../pane/drag/pane-move.service';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { PanelState } from './panel-state';\n\n@Service()\nexport class ViewMoveService {\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly panels = inject(PanelState);\n private readonly paneTree = inject(PaneTreeService);\n private readonly paneMove = inject(PaneMoveService);\n private readonly registry = inject(ContributionRegistry);\n private readonly announcer = inject(LiveAnnouncer);\n private readonly transloco = inject(TranslocoService);\n\n move(viewId: string, targetRegion: string, index?: number): void {\n const path = VIEW_PANE_PREFIX + viewId;\n const source = this.paneTree.sourceOf(path);\n const targetPrimary = this.paneTree.primaryId(targetRegion);\n if (source === null) {\n this.paneTree.insertTab(targetRegion, targetPrimary, path);\n } else if (\n source.dock === targetRegion &&\n source.paneId === targetPrimary\n ) {\n this.paneTree.setActiveTab(targetRegion, targetPrimary, path);\n } else {\n this.paneMove.moveToStrip(\n source,\n path,\n { dock: targetRegion, paneId: targetPrimary },\n index,\n );\n }\n this.panels.expand(targetRegion);\n const title = this.registry\n .views()\n .find((view) => view.id === viewId)?.title;\n void this.announcer.announce(\n this.transloco.translate('panel.viewMove.announce', {\n view: title ? this.transloco.translate(title) : viewId,\n target: this.targetLabel(targetRegion),\n }),\n );\n }\n\n otherPanel(fromRegion: string): string | undefined {\n const from = this.layout.regions.find((region) => region.id === fromRegion);\n if (!from) {\n return undefined;\n }\n return this.layout.regions.find(\n (region) =>\n region.type === 'panel' &&\n region.id !== fromRegion &&\n region.dock !== from.dock,\n )?.id;\n }\n\n private targetLabel(regionId: string): string {\n const dock = this.layout.regions.find((r) => r.id === regionId)?.dock;\n if (dock === 'left') {\n return this.transloco.translate('panel.viewMove.targetLeft');\n }\n if (dock === 'right') {\n return this.transloco.translate('panel.viewMove.targetRight');\n }\n return regionId;\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { tabHolderOf } from '../pane/tree/pane-queries';\nimport {\n CONTAINER_DOCK_PREFIX,\n isContainerDock,\n} from '../pane/container/container-children';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { RetainedViewStash } from '../pane/retention/retained-view-stash';\nimport { SurfaceCloseGuard } from '../pane/close/surface-close-guard';\nimport { HiddenViewsService } from './hidden-views.service';\nimport { PanelGroupService } from './panel-group.service';\nimport { ViewMoveService } from './view-move.service';\n\n@Service()\nexport class ViewVisibilityService {\n private readonly hiddenViews = inject(HiddenViewsService);\n private readonly paneTree = inject(PaneTreeService);\n private readonly panelGroup = inject(PanelGroupService);\n private readonly closeGuard = inject(SurfaceCloseGuard);\n private readonly stash = inject(RetainedViewStash);\n private readonly registry = inject(ContributionRegistry);\n private readonly moves = inject(ViewMoveService);\n\n isHidden(viewId: string): boolean {\n return this.hiddenViews.isHidden(viewId);\n }\n\n hide(viewId: string): void {\n this.closeGuard.guarded(this.candidates(viewId), () => {\n this.hiddenViews.hide(viewId);\n this.removeTabs(VIEW_PANE_PREFIX + viewId);\n });\n }\n\n reveal(viewId: string, region?: string): void {\n this.hiddenViews.show(viewId);\n const target = region ?? this.regionOf(viewId);\n if (target === undefined) {\n return;\n }\n const path = VIEW_PANE_PREFIX + viewId;\n if (this.regionOf(viewId) === target && !this.paneTree.hasTab(path)) {\n this.panelGroup.seed(target);\n return;\n }\n this.moves.move(viewId, target);\n }\n\n toggle(viewId: string, region?: string): void {\n if (region !== undefined) {\n this.toggleIn(viewId, region);\n return;\n }\n if (this.hiddenViews.isHidden(viewId)) {\n this.reveal(viewId);\n return;\n }\n this.hide(viewId);\n }\n\n private toggleIn(viewId: string, region: string): void {\n if (this.paneTree.sourceOf(VIEW_PANE_PREFIX + viewId)?.dock === region) {\n this.hide(viewId);\n return;\n }\n this.reveal(viewId, region);\n }\n\n private regionOf(viewId: string): string | undefined {\n const view = this.registry.views().find((v) => v.id === viewId);\n return view?.region;\n }\n\n private candidates(viewId: string): unknown[] {\n const path = VIEW_PANE_PREFIX + viewId;\n return this.stash\n .keyedInstances()\n .filter(\n (entry) =>\n !entry.key.startsWith(CONTAINER_DOCK_PREFIX) &&\n entry.key.split('|')[1] === path,\n )\n .map((entry) => entry.instance);\n }\n\n private removeTabs(path: string): void {\n for (const dock of Object.keys(this.paneTree.dockTrees())) {\n if (!isContainerDock(dock)) {\n this.removeFromDock(dock, path);\n }\n }\n }\n\n private removeFromDock(dock: string, path: string): void {\n const primary = this.paneTree.primaryTabs(dock);\n if (primary.some((tab) => tab.path === path)) {\n this.paneTree.setPrimaryTabs(\n dock,\n primary.filter((tab) => tab.path !== path),\n );\n }\n let holder = tabHolderOf(this.paneTree.tree(dock), path);\n while (holder !== null) {\n this.paneTree.removeTab(dock, holder, path);\n const next = tabHolderOf(this.paneTree.tree(dock), path);\n if (next === holder) {\n return;\n }\n holder = next;\n }\n }\n}\n","import { afterNextRender, effect, inject, Injector, isDevMode, Service } from '@angular/core';\nimport { Disposable } from '@loomweaver/plugin-sdk';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { RailItem } from '../../foundation/rail-item';\nimport { WorkspaceService } from '../../workspace/workspace.service';\nimport { RailItemsService, workspaceRailItemId } from './rail-items.service';\nimport { SHELL_FEATURES } from '../../foundation/shell-features';\n\nconst WORKSPACE_ENTRY_ORDER = 1000;\n\ninterface Registration {\n readonly item: RailItem;\n readonly disposable: Disposable;\n}\n\n@Service()\nexport class RailWorkspaceEntries {\n private readonly registry = inject(ContributionRegistry);\n private readonly workspaces = inject(WorkspaceService);\n private readonly railItems = inject(RailItemsService);\n private readonly injector = inject(Injector);\n private readonly rails = inject(SHELL_LAYOUT)\n .regions.filter((region) => region.type === 'rail')\n .map((region) => region.id);\n private readonly features = inject(SHELL_FEATURES).workspaces;\n private readonly enabled = this.features.enabled;\n\n private readonly registered = new Map<string, Registration>();\n\n start(): void {\n if (this.rails.length === 0 || !this.enabled) {\n return;\n }\n effect(() => this.reconcile(), { injector: this.injector });\n if (isDevMode()) {\n afterNextRender(() => this.reportUnoffered(), {\n injector: this.injector,\n });\n }\n }\n\n private reportUnoffered(): void {\n const offered = new Set(\n this.registry\n .railItems()\n .map((item) => item.workspace)\n .filter((id): id is string => id !== undefined),\n );\n for (const definition of this.workspaces.definitions) {\n if (offered.has(definition.id)) {\n continue;\n }\n console.warn(\n `Workspace \"${definition.id}\" is declared but nothing switches to it — ` +\n `it is reachable only through the workspace dialog. Register a rail item ` +\n `carrying workspace: \"${definition.id}\" to offer it under an icon of your own.`,\n );\n }\n }\n\n private reconcile(): void {\n const wanted = this.wantedItems();\n for (const [id, registration] of this.registered) {\n if (!wanted.has(id)) {\n registration.disposable.dispose();\n this.registered.delete(id);\n }\n }\n for (const [id, item] of wanted) {\n const current = this.registered.get(id);\n if (current && sameItem(current.item, item)) {\n continue;\n }\n current?.disposable.dispose();\n this.registered.set(id, {\n item,\n disposable: this.registry.addRailItem(item),\n });\n }\n }\n\n private wantedItems(): Map<string, RailItem> {\n const wanted = new Map<string, RailItem>();\n const initials = this.workspaces.initials();\n let order = WORKSPACE_ENTRY_ORDER;\n const offered = this.features.savedInRail ? this.workspaces.workspaces() : [];\n for (const workspace of offered) {\n const id = workspaceRailItemId(workspace.id);\n if (!this.railItems.isVisible(id)) {\n continue;\n }\n const rail = this.railItems.regionOf(id, this.rails[0]);\n wanted.set(id, {\n id,\n rail: this.rails.includes(rail) ? rail : this.rails[0],\n icon: 'workspaces',\n initials: initials.get(workspace.id),\n title: workspace.name,\n order,\n workspace: workspace.id,\n });\n order += 1;\n }\n return wanted;\n }\n}\n\nfunction sameItem(a: RailItem, b: RailItem): boolean {\n return (\n a.title === b.title &&\n a.order === b.order &&\n a.rail === b.rail &&\n a.initials === b.initials\n );\n}\n","import { inject, Service } from '@angular/core';\nimport { ContributionRegistry } from '../plugin/contribution-registry';\nimport { PanelSizeService } from '../regions/panel/panel-size.service';\nimport { PanelState } from '../regions/panel/panel-state';\nimport { RailItemsService } from '../regions/rail/rail-items.service';\nimport { UserOrderService } from '../regions/reorder/user-order.service';\nimport { ViewInstanceService } from '../views/view-instance.service';\n\n@Service()\nexport class AppResetService {\n private readonly registry = inject(ContributionRegistry);\n private readonly railItems = inject(RailItemsService);\n private readonly panels = inject(PanelState);\n private readonly panelSizes = inject(PanelSizeService);\n private readonly order = inject(UserOrderService);\n private readonly instances = inject(ViewInstanceService);\n\n reset(): void {\n this.railItems.reset();\n this.panels.reset();\n this.panelSizes.reset();\n this.order.reset();\n for (const view of this.registry.views()) {\n this.instances.reset(view.id);\n }\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { MenuItem, SettingsSection } from '@loomweaver/plugin-sdk';\nimport { BAR_ITEM } from '../foundation/bar-item';\nimport { RAIL_ITEM } from '../foundation/rail-item';\nimport { VIEW } from '../layout/view';\nimport { ContributionRegistry } from '../plugin/contribution-registry';\nimport { RegionType, SHELL_LAYOUT } from '../layout/layout';\nimport { ROUTE_OMIT_PREFIX } from '../plugin/route-omit';\nimport { SETTING_OMIT_PREFIX } from '../settings/setting-omit';\nimport { SettingsService } from '../settings/settings.service';\nimport { DEFAULT_SHELL_FEATURES, SHELL_FEATURES } from '../foundation/shell-features';\n\n@Service()\nexport class CompositionReport {\n private readonly registry = inject(ContributionRegistry);\n private readonly settings = inject(SettingsService);\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly features = inject(SHELL_FEATURES);\n private readonly barItems = inject(BAR_ITEM, { optional: true }) ?? [];\n private readonly railItems = inject(RAIL_ITEM, { optional: true }) ?? [];\n private readonly views = inject(VIEW, { optional: true }) ?? [];\n\n checkStaticContributions(): void {\n for (const problem of this.staticProblems()) {\n console.warn(problem);\n }\n }\n\n print(): void {\n const lines = [\n `Layout: ${this.layout.regions\n .map((region) => `${region.id} (${region.type}/${region.dock})`)\n .join(', ')}`,\n `Capabilities off: ${this.disabledFeatures().join(', ') || 'none'}`,\n `Omitted: ${[...this.registry.omitted()].join(', ') || 'none'}`,\n ];\n const problems = [...this.staticProblems(), ...this.problems()];\n console.info(\n ['LoomWeaver composition', ...lines.map((line) => ` ${line}`)].join(\n '\\n',\n ),\n );\n if (problems.length === 0) {\n console.info(' No problems found.');\n return;\n }\n for (const problem of problems) {\n console.warn(problem);\n }\n }\n\n private disabledFeatures(): string[] {\n const off: string[] = [];\n for (const group of Object.keys(\n DEFAULT_SHELL_FEATURES,\n ) as (keyof typeof DEFAULT_SHELL_FEATURES)[]) {\n const flags = this.features[group] as unknown as Readonly<\n Record<string, boolean>\n >;\n for (const [name, enabled] of Object.entries(flags)) {\n if (!enabled) {\n off.push(`${group}.${name}`);\n }\n }\n }\n return off;\n }\n\n private staticProblems(): string[] {\n const problems: string[] = [];\n for (const item of this.barItems) {\n this.pushUnlessRegion(problems, item.id, item.bar, 'bar');\n }\n for (const item of this.railItems) {\n this.pushUnlessRegion(problems, item.id, item.rail, 'rail');\n }\n for (const view of this.views) {\n this.pushUnlessRegion(problems, view.id, view.region, 'panel');\n }\n return problems;\n }\n\n private pushUnlessRegion(\n problems: string[],\n itemId: string,\n regionId: string,\n expected: RegionType,\n ): void {\n const region = this.layout.regions.find((entry) => entry.id === regionId);\n if (region?.type === expected) {\n return;\n }\n const detail = region\n ? `a '${region.type}' region`\n : 'a region this layout does not declare';\n const alternatives = this.layout.regions\n .filter((entry) => entry.type === expected)\n .map((entry) => entry.id);\n const hint = alternatives.length\n ? ` Declared '${expected}' regions: ${alternatives.join(', ')}.`\n : ` This layout declares no '${expected}' region at all.`;\n problems.push(\n `Composition: \"${itemId}\" is contributed to '${regionId}' — ${detail}. ` +\n `A '${expected}' contribution renders only in a '${expected}' region, so it will not ` +\n `appear.${hint}`,\n );\n }\n\n private problems(): string[] {\n return [...this.unmatchedOmits(), ...this.danglingCommands()];\n }\n\n private unmatchedOmits(): string[] {\n const problems: string[] = [];\n for (const id of this.registry.omitted()) {\n if (this.omitMatches(id)) {\n continue;\n }\n problems.push(\n `Composition: omit '${id}' matched nothing, so it hides nothing.${this.omitHint(id)}`,\n );\n }\n return problems;\n }\n\n private omitMatches(id: string): boolean {\n if (id.startsWith(SETTING_OMIT_PREFIX)) {\n return this.settingIds().has(id.slice(SETTING_OMIT_PREFIX.length));\n }\n if (id.startsWith(ROUTE_OMIT_PREFIX)) {\n return this.routeIds().has(id.slice(ROUTE_OMIT_PREFIX.length));\n }\n return this.registry.registeredIds().has(id);\n }\n\n private omitHint(id: string): string {\n if (id.includes(':')) {\n return '';\n }\n if (this.settingIds().has(id)) {\n return ` A settings section or row carries that id — did you mean '${SETTING_OMIT_PREFIX}${id}'?`;\n }\n if (this.routeIds().has(id)) {\n return ` A routable surface carries that id — did you mean '${ROUTE_OMIT_PREFIX}${id}'?`;\n }\n if (this.registry.registeredIds().has(`menu:${id}`)) {\n return ` A menu entry carries that id — did you mean 'menu:${id}'?`;\n }\n return '';\n }\n\n private danglingCommands(): string[] {\n const commands = new Set(\n this.registry.commands().map((command) => command.id),\n );\n const problems: string[] = [];\n for (const item of this.registry.menuItems()) {\n this.pushUnlessCommand(problems, commands, item.command, menuLabel(item));\n }\n for (const item of this.registry.barItems()) {\n if ('command' in item) {\n this.pushUnlessCommand(\n problems,\n commands,\n item.command,\n `bar item \"${item.id}\"`,\n );\n }\n }\n for (const item of this.registry.railItems()) {\n this.pushUnlessCommand(\n problems,\n commands,\n item.command,\n `rail item \"${item.id}\"`,\n );\n }\n for (const view of this.registry.views()) {\n for (const action of view.actions ?? []) {\n this.pushUnlessCommand(\n problems,\n commands,\n action.command,\n `view action \"${action.id}\"`,\n );\n }\n }\n for (const section of this.settings.registered()) {\n for (const row of section.rows) {\n if (row.control.kind === 'button') {\n this.pushUnlessCommand(\n problems,\n commands,\n row.control.command,\n `settings row \"${row.id}\"`,\n );\n }\n }\n }\n return problems;\n }\n\n private pushUnlessCommand(\n problems: string[],\n commands: ReadonlySet<string>,\n command: string | undefined,\n what: string,\n ): void {\n if (command === undefined || commands.has(command)) {\n return;\n }\n problems.push(\n `Composition: ${what} points at command '${command}', which no one registers (or which an ` +\n `omit removed). The shell drops it rather than drawing a dead control.`,\n );\n }\n\n private settingIds(): ReadonlySet<string> {\n return idsOf(this.settings.registered());\n }\n\n private routeIds(): ReadonlySet<string> {\n const ids = new Set<string>();\n for (const route of [\n ...this.registry.contentRoutes(),\n ...this.registry.omittedContentRoutes(),\n ]) {\n if (route.id !== undefined) {\n ids.add(route.id);\n }\n }\n return ids;\n }\n}\n\nexport function installCompositionReport(report: CompositionReport): void {\n if (typeof window === 'undefined') {\n return;\n }\n const host = window as unknown as Record<string, unknown>;\n if (host['loomweaver'] !== undefined) {\n return;\n }\n host['loomweaver'] = { report: () => report.print() };\n console.info(\n 'LoomWeaver: call loomweaver.report() for this product’s composition.',\n );\n}\n\nfunction idsOf(sections: readonly SettingsSection[]): ReadonlySet<string> {\n const ids = new Set<string>();\n for (const section of sections) {\n ids.add(section.id);\n for (const row of section.rows) {\n ids.add(row.id);\n }\n }\n return ids;\n}\n\nfunction menuLabel(item: MenuItem): string {\n return item.id === undefined\n ? `menu entry in '${item.menu}'`\n : `menu entry \"${item.id}\"`;\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { FontScale, FontScaleService } from './font-scale.service';\n\n@Component({\n selector: 'lw-text-size-toggle',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './text-size-toggle.html',\n})\nexport class TextSizeToggle {\n private readonly fontScale = inject(FontScaleService);\n protected readonly scale = this.fontScale.scale;\n protected readonly scales: readonly FontScale[] = ['sm', 'md', 'lg', 'xl'];\n\n private readonly glyph: Record<FontScale, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n };\n\n protected glyphClass(scale: FontScale): string {\n return this.glyph[scale];\n }\n\n protected select(scale: FontScale): void {\n this.fontScale.setScale(scale);\n }\n}\n","<fieldset class=\"lw-segmented\" [attr.aria-label]=\"'textSize.label' | transloco\">\n @for (s of scales; track s) {\n <button\n type=\"button\"\n (click)=\"select(s)\"\n [attr.aria-pressed]=\"scale() === s\"\n [attr.aria-label]=\"'textSize.' + s | transloco\"\n class=\"lw-segmented-item font-semibold\"\n >\n <span [class]=\"glyphClass(s)\" aria-hidden=\"true\">A</span>\n <lw-tooltip [text]=\"'textSize.' + s | transloco\" position=\"bottom\" />\n </button>\n }\n</fieldset>\n","import { computed, inject, Service, signal } from '@angular/core';\nimport { SETTINGS_STORE } from '../../persistence/settings-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\nimport { StateSyncService } from '../../persistence/state-sync.service';\nimport { parseIdSet, toggledIdSet } from '../../persistence/persisted-id-set';\nimport { PluginInfo } from './plugin-info';\n\nconst STORAGE_KEY = 'lw.shell.disabled-plugins';\n\n/**\n * Whether each plugin is turned on — plugin enable/disable, distinct from capability revocation. Disabling a plugin is coarse: it does not restrict a power, it unloads the\n * whole plugin so **none** of its contributions appear; enabling loads it again. The decision is\n * user-local and persisted through the {@link SETTINGS_STORE}, exactly like the rest of the chrome state.\n *\n * This service holds only the state; the runtimes ({@link PluginRuntime}, {@link FramePluginRuntime})\n * inject it and reconcile activation against {@link disabled} reactively, so a toggle takes effect at\n * once without a reload. It never depends on the runtimes, which keeps the dependency one-way.\n */\n@Service()\nexport class PluginEnablementService {\n private readonly store = inject(SETTINGS_STORE);\n private readonly sync = inject(StateSyncService);\n\n private readonly disabledSet = signal<ReadonlySet<string>>(\n parseIdSet(this.store.peek?.(STORAGE_KEY)),\n );\n\n private readonly names = signal<ReadonlyMap<string, string>>(new Map());\n\n /** The disabled plugin ids (reactive) — a runtime reconciles activation against this. */\n readonly disabled = this.disabledSet.asReadonly();\n\n /** Every known plugin with its enabled state, for the permissions settings surface. */\n readonly plugins = computed<readonly PluginInfo[]>(() => {\n const disabled = this.disabledSet();\n return [...this.names().entries()]\n .map(([id, name]) => ({ id, name, enabled: !disabled.has(id) }))\n .sort((a, b) => a.name.localeCompare(b.name));\n });\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.disabledSet.set(parseIdSet(raw)),\n );\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.disabledSet.set(parseIdSet(raw)),\n );\n }\n\n /** Records a plugin so the permissions surface can list it (enabled or not). Idempotent. A runtime calls it for every plugin it knows. */\n register(id: string, name: string): void {\n this.names.update((map) =>\n map.has(id) ? map : new Map(map).set(id, name),\n );\n }\n\n /** Drops a plugin from the list — it was uninstalled, not merely disabled. Idempotent. */\n unregister(id: string): void {\n this.names.update((map) => {\n if (!map.has(id)) {\n return map;\n }\n const next = new Map(map);\n next.delete(id);\n return next;\n });\n }\n\n /** Whether `id` is currently enabled (default: yes — a plugin is on until the user turns it off). */\n isEnabled(id: string): boolean {\n return !this.disabledSet().has(id);\n }\n\n /** Turns a whole plugin on or off (persisted). The runtimes react by loading/unloading it. */\n setEnabled(id: string, enabled: boolean): void {\n const next = toggledIdSet(this.disabledSet(), id, !enabled);\n this.disabledSet.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify([...next]));\n }\n}\n","import { inject, Service } from '@angular/core';\nimport { RetentionCandidates } from '../../regions/pane/retention/retention-candidates';\nimport { SurfaceCloseGuard } from '../../regions/pane/close/surface-close-guard';\nimport { PluginEnablementService } from './plugin-enablement.service';\n\n@Service()\nexport class PluginDisableGuard {\n private readonly candidates = inject(RetentionCandidates);\n private readonly closeGuard = inject(SurfaceCloseGuard);\n private readonly enablement = inject(PluginEnablementService);\n\n toggle(id: string, input: HTMLInputElement): void {\n if (input.checked) {\n this.enablement.setEnabled(id, true);\n return;\n }\n const candidates = this.candidates.ofPlugin(id);\n if (!this.closeGuard.anyDirty(candidates)) {\n this.enablement.setEnabled(id, false);\n return;\n }\n void this.closeGuard.confirmDiscard(candidates).then((ok) => {\n if (ok) {\n this.enablement.setEnabled(id, false);\n } else {\n input.checked = true;\n }\n });\n }\n\n confirmRemoval(id: string): Promise<boolean> {\n return this.closeGuard.confirmDiscard(this.candidates.ofPlugin(id));\n }\n}\n","import { CAPABILITIES, Capability } from '@loomweaver/plugin-sdk';\nimport { PluginIsolationLevel } from '../foundation/plugin-isolation-level';\n\n/**\n * A community plugin the user installed from the distribution's catalog. Plain data — the\n * same shape the sandbox runtime needs to spawn it, plus display metadata for the store and\n * permissions surfaces.\n */\nexport interface InstalledPlugin {\n /** Stable plugin id — also the id capabilities are granted to (default-deny). */\n readonly id: string;\n /** Display name shown in the store and permissions surfaces. */\n readonly name: string;\n /** Same-origin URL of the plugin's entry document. */\n readonly entryUrl: string;\n /**\n * Capabilities the plugin declares. Accepting the install dialog grants exactly these — the user's\n * consent replaces the composition root's grant for installed plugins.\n */\n readonly capabilities?: readonly Capability[];\n /**\n * Catalog version at install/update time. Drives update detection (a strictly newer catalog\n * version offers an update) and is part of the runtime's respawn signature — a version-only\n * change respawns the running plugin.\n */\n readonly version?: string;\n /** Same-origin URL of the plugin's list icon (an image the operator ships with the plugin). */\n readonly iconUrl?: string;\n /**\n * The level this entry asks to run at. It is a request, not a decision: the composition sets the\n * highest level a catalog may confer, an entry at or below it runs at what it asked for, and one\n * above it is refused rather than quietly run lower. Omitted means isolated.\n */\n readonly level?: PluginIsolationLevel;\n}\n\n/**\n * One entry of the distribution's plugin catalog: an {@link InstalledPlugin} plus the\n * display metadata the store dialog shows (the Obsidian community-plugins model — list of name,\n * author, downloads, last update and description; a detail pane rendering the plugin's README\n * **in-app**, never an embedded external page).\n */\nexport interface PluginCatalogEntry extends InstalledPlugin {\n /** Short description shown in the store list. */\n readonly description?: string;\n /** Icon name for the install-consent dialog — resolved by the host icon registry. */\n readonly icon?: string;\n /** Operator-curated category, shown as a badge and matched by the store search. */\n readonly category?: string;\n /** Plugin author, shown in the list and the detail pane. */\n readonly author?: string;\n /** Install/download count, display-only (the operator's stats). */\n readonly downloads?: number;\n /** ISO date of the last update, display-only. */\n readonly updated?: string;\n /** External link to the plugin's repository/homepage — rendered as a plain link, never framed. */\n readonly repository?: string;\n /**\n * Same-origin URL of the plugin's README (Markdown) — the operator copies it into the store next\n * to the plugin files; the detail pane fetches and renders it sanitized in-app.\n */\n readonly readmeUrl?: string;\n /**\n * `true` for a plugin the operator **deploys**: active for every user without a consent dialog,\n * holding exactly the capabilities this entry names, and gone again once the catalog stops\n * carrying it. Omitted or `false` means the entry is merely **offered** — the user browses it,\n * consents and installs it, which is the only path that grants anything on their say-so.\n *\n * The authority behind a deployed entry is the operator's, so the user is shown it but is not\n * asked about it and cannot remove it.\n */\n readonly deployed?: boolean;\n}\n\nexport function isSameOriginUrl(url: string): boolean {\n try {\n return new URL(url, document.baseURI).origin === location.origin;\n } catch {\n return false;\n }\n}\n\nfunction parseCapabilities(raw: unknown): readonly Capability[] | undefined {\n if (!Array.isArray(raw)) {\n return undefined;\n }\n return raw.filter(\n (cap): cap is Capability =>\n typeof cap === 'string' &&\n (CAPABILITIES as readonly string[]).includes(cap),\n );\n}\n\nfunction optionalString(raw: unknown): string | undefined {\n return typeof raw === 'string' && raw.length > 0 ? raw : undefined;\n}\n\nexport function parseInstalledPlugin(\n raw: unknown,\n): InstalledPlugin | undefined {\n if (typeof raw !== 'object' || raw === null) {\n return undefined;\n }\n const entry = raw as Record<string, unknown>;\n if (typeof entry['id'] !== 'string' || entry['id'].length === 0) {\n return undefined;\n }\n if (\n typeof entry['entryUrl'] !== 'string' ||\n !isSameOriginUrl(entry['entryUrl'])\n ) {\n return undefined;\n }\n const iconUrl = optionalString(entry['iconUrl']);\n return {\n id: entry['id'],\n name: optionalString(entry['name']) ?? entry['id'],\n entryUrl: entry['entryUrl'],\n capabilities: parseCapabilities(entry['capabilities']),\n version: optionalString(entry['version']),\n iconUrl: iconUrl && isSameOriginUrl(iconUrl) ? iconUrl : undefined,\n level:\n entry['level'] === 'embedded' || entry['level'] === 'isolated'\n ? entry['level']\n : undefined,\n };\n}\n\nfunction httpUrl(raw: unknown): string | undefined {\n if (typeof raw !== 'string') {\n return undefined;\n }\n try {\n const url = new URL(raw);\n return url.protocol === 'https:' || url.protocol === 'http:'\n ? raw\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function parseCatalogEntry(\n raw: unknown,\n): PluginCatalogEntry | undefined {\n const base = parseInstalledPlugin(raw);\n if (!base) {\n return undefined;\n }\n const entry = raw as Record<string, unknown>;\n const readmeUrl = optionalString(entry['readmeUrl']);\n return {\n ...base,\n description: optionalString(entry['description']),\n icon: optionalString(entry['icon']),\n category: optionalString(entry['category']),\n author: optionalString(entry['author']),\n downloads:\n typeof entry['downloads'] === 'number' && entry['downloads'] >= 0\n ? entry['downloads']\n : undefined,\n updated: optionalString(entry['updated']),\n repository: httpUrl(entry['repository']),\n readmeUrl: readmeUrl && isSameOriginUrl(readmeUrl) ? readmeUrl : undefined,\n deployed: entry['deployed'] === true ? true : undefined,\n };\n}\n\nfunction dedupeById<T extends { readonly id: string }>(\n items: readonly (T | undefined)[],\n): readonly T[] {\n const result: T[] = [];\n for (const item of items) {\n if (item && !result.some((existing) => existing.id === item.id)) {\n result.push(item);\n }\n }\n return result;\n}\n\nexport function parseInstalledList(\n raw: string | undefined,\n): readonly InstalledPlugin[] {\n if (!raw) {\n return [];\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return [];\n }\n return dedupeById(parsed.map(parseInstalledPlugin));\n } catch {\n return [];\n }\n}\n\nexport function parseCatalogList(raw: unknown): readonly PluginCatalogEntry[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n return dedupeById(raw.map(parseCatalogEntry));\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { SETTINGS_STORE } from '../../persistence/settings-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\nimport { StateSyncService } from '../../persistence/state-sync.service';\nimport {\n InstalledPlugin,\n PluginCatalogEntry,\n parseInstalledList,\n} from '../installed-plugin';\n\nconst STORAGE_KEY = 'lw.shell.deployed-plugins';\n\nfunction withoutCatalogMetadata(entry: PluginCatalogEntry): InstalledPlugin {\n return {\n id: entry.id,\n name: entry.name,\n entryUrl: entry.entryUrl,\n capabilities: entry.capabilities,\n version: entry.version,\n iconUrl: entry.iconUrl,\n level: entry.level,\n };\n}\n\n@Service()\nexport class PluginDeploymentService {\n private readonly store = inject(SETTINGS_STORE);\n\n private readonly sync = inject(StateSyncService);\n\n private readonly entries = signal<readonly InstalledPlugin[]>(\n parseInstalledList(this.store.peek?.(STORAGE_KEY)),\n );\n\n readonly deployed = this.entries.asReadonly();\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.entries.set(parseInstalledList(raw)),\n );\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.entries.set(parseInstalledList(raw)),\n );\n }\n\n adopt(entries: readonly PluginCatalogEntry[]): void {\n this.persist(\n entries\n .filter((entry) => entry.deployed === true)\n .map(withoutCatalogMetadata),\n );\n }\n\n isDeployed(id: string): boolean {\n return this.entries().some((entry) => entry.id === id);\n }\n\n private persist(next: readonly InstalledPlugin[]): void {\n this.entries.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify(next));\n }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport {\n CapabilityGrantService,\n PluginCapabilityState,\n} from './capability-grant.service';\nimport { PluginEnablementService } from '../plugin-store/lifecycle/plugin-enablement.service';\nimport { PluginDisableGuard } from '../plugin-store/lifecycle/plugin-disable-guard';\nimport { PluginDeploymentService } from '../plugin-store/lifecycle/plugin-deployment.service';\nimport {\n PluginRung,\n PluginIsolationLevelService,\n} from '../foundation/plugin-isolation-level';\n\nconst RUNG_NOTES: Readonly<Record<PluginRung, string>> = {\n trusted: 'settings.pluginLevel.trusted',\n isolated: 'settings.pluginLevel.isolated',\n embedded: 'settings.pluginLevel.embedded',\n};\n\nfunction rungNoteKey(rung: PluginRung): string | null {\n return RUNG_NOTES[rung] ?? null;\n}\n\ninterface PluginRow {\n readonly id: string;\n readonly name: string;\n readonly enabled: boolean;\n readonly provided: boolean;\n readonly rungNote: string | null;\n readonly capabilities: readonly PluginCapabilityState[];\n}\n\n@Component({\n selector: 'lw-permissions-settings',\n imports: [TranslocoPipe],\n templateUrl: './permissions-settings.html',\n})\nexport class PermissionsSettings {\n private readonly grants = inject(CapabilityGrantService);\n private readonly enablement = inject(PluginEnablementService);\n private readonly disableGuard = inject(PluginDisableGuard);\n private readonly deployment = inject(PluginDeploymentService);\n private readonly isolation = inject(PluginIsolationLevelService);\n\n protected readonly plugins = computed<readonly PluginRow[]>(() => {\n const caps = this.grants.permissions();\n return this.enablement.plugins().map((plugin) => {\n const provided = this.deployment.isDeployed(plugin.id);\n return {\n ...plugin,\n enabled: provided || plugin.enabled,\n provided,\n rungNote: rungNoteKey(this.isolation.rungOf(plugin.id)),\n capabilities:\n caps.find((entry) => entry.pluginId === plugin.id)?.capabilities ??\n [],\n };\n });\n });\n\n protected togglePlugin(id: string, event: Event): void {\n this.disableGuard.toggle(id, event.target as HTMLInputElement);\n }\n\n protected toggleCapability(\n pluginId: string,\n capability: Capability,\n event: Event,\n ): void {\n this.grants.setGranted(\n pluginId,\n capability,\n (event.target as HTMLInputElement).checked,\n );\n }\n}\n","<p class=\"mb-4 text-sm text-content-muted\">\n {{ 'settings.permissionsDesc' | transloco }}\n</p>\n@if (plugins().length === 0) {\n <p class=\"text-sm text-content-muted\">\n {{ 'settings.permissionsEmpty' | transloco }}\n </p>\n} @else {\n <div class=\"flex flex-col gap-6\">\n @for (plugin of plugins(); track plugin.id) {\n <section class=\"flex flex-col gap-3\">\n <div class=\"flex items-center justify-between gap-4\">\n <h3 class=\"text-sm font-semibold text-content\">\n {{ plugin.name }}\n </h3>\n @if (!plugin.provided) {\n <input\n type=\"checkbox\"\n role=\"switch\"\n class=\"lw-switch shrink-0\"\n [checked]=\"plugin.enabled\"\n [attr.aria-checked]=\"plugin.enabled\"\n [attr.aria-label]=\"'settings.pluginEnabled' | transloco\"\n [attr.data-testid]=\"'plugin-enabled-' + plugin.id\"\n (change)=\"togglePlugin(plugin.id, $event)\"\n />\n }\n </div>\n @if (plugin.rungNote; as rungNote) {\n <p\n class=\"text-xs text-content-muted\"\n [attr.data-testid]=\"'perm-level-' + plugin.id\"\n >\n {{ rungNote | transloco }}\n </p>\n }\n @if (plugin.provided) {\n <p\n class=\"text-xs text-content-muted\"\n [attr.data-testid]=\"'perm-provided-' + plugin.id\"\n >\n {{ 'settings.permissionsProvided' | transloco }}\n </p>\n }\n @if (plugin.enabled) {\n <ul class=\"flex flex-col gap-3\">\n @for (cap of plugin.capabilities; track cap.capability) {\n <li class=\"flex items-start justify-between gap-4\">\n <div class=\"flex flex-col\">\n <span class=\"text-sm text-content\">{{\n 'settings.capability.' + cap.capability | transloco\n }}</span>\n <span class=\"text-xs text-content-muted\">{{\n 'settings.capabilityDesc.' + cap.capability | transloco\n }}</span>\n </div>\n @if (!plugin.provided) {\n <input\n type=\"checkbox\"\n role=\"switch\"\n class=\"lw-switch shrink-0\"\n [checked]=\"cap.effective\"\n [attr.aria-checked]=\"cap.effective\"\n [attr.aria-label]=\"\n 'settings.capability.' + cap.capability | transloco\n \"\n [attr.data-testid]=\"\n 'perm-' + plugin.id + '-' + cap.capability\n \"\n (change)=\"\n toggleCapability(plugin.id, cap.capability, $event)\n \"\n />\n }\n </li>\n }\n </ul>\n } @else {\n <p class=\"text-xs text-content-muted\">\n {{ 'settings.pluginDisabled' | transloco }}\n </p>\n }\n </section>\n }\n </div>\n}\n","import { SettingsService } from './settings/settings.service';\nimport { ThemeToggle } from './theme/theme-toggle';\nimport { TextSizeToggle } from './text-size/text-size-toggle';\nimport { LanguageSwitcher } from './i18n/language-switcher';\nimport { PermissionsSettings } from './permissions/permissions-settings';\n\nexport function registerDefaultSettings(settings: SettingsService): void {\n settings.register({\n id: 'shell.general',\n title: 'settings.general',\n group: 'settings.group.options',\n order: 0,\n rows: [\n {\n id: 'shell.theme',\n label: 'theme.label',\n description: 'theme.desc',\n control: { kind: 'component', component: ThemeToggle },\n },\n {\n id: 'shell.language',\n label: 'language.label',\n description: 'language.desc',\n control: { kind: 'component', component: LanguageSwitcher },\n },\n {\n id: 'shell.textSize',\n label: 'textSize.label',\n description: 'textSize.desc',\n control: { kind: 'component', component: TextSizeToggle },\n },\n {\n id: 'shell.appReset',\n label: 'appReset.title',\n description: 'appReset.desc',\n control: {\n kind: 'button',\n label: 'appReset.action',\n variant: 'danger',\n command: 'shell.app.reset',\n },\n },\n ],\n });\n settings.register({\n id: 'shell.permissions',\n title: 'settings.permissions',\n group: 'settings.group.options',\n order: 10,\n rows: [\n {\n id: 'shell.pluginPermissions',\n label: 'settings.permissions',\n control: {\n kind: 'component',\n component: PermissionsSettings,\n fullWidth: true,\n },\n },\n ],\n });\n}\n","export function fuzzyScore(query: string, label: string): number | null {\n const needle = query.toLowerCase();\n const haystack = label.toLowerCase();\n if (!needle) {\n return 0;\n }\n let score = 0;\n let searchFrom = 0;\n let previous = -2;\n for (const char of needle) {\n const found = haystack.indexOf(char, searchFrom);\n if (found === -1) {\n return null;\n }\n if (found === 0 || haystack[found - 1] === ' ') {\n score += 3;\n }\n if (found === previous + 1) {\n score += 2;\n }\n previous = found;\n searchFrom = found + 1;\n }\n return score;\n}\n","const SECONDS_PER_MINUTE = 60;\nconst MINUTES_PER_HOUR = 60;\nconst HOURS_PER_DAY = 24;\n\nfunction formatterFor(locale: string): Intl.RelativeTimeFormat {\n try {\n return new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });\n } catch {\n try {\n return new Intl.RelativeTimeFormat(locale.replace(/_/g, '-'), {\n numeric: 'auto',\n });\n } catch {\n return new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' });\n }\n }\n}\n\nexport function formatRelativeTime(\n locale: string,\n epochMs: number,\n now: number,\n): string {\n const rtf = formatterFor(locale);\n const seconds = Math.round((epochMs - now) / 1000);\n if (Math.abs(seconds) < SECONDS_PER_MINUTE) {\n return rtf.format(seconds, 'second');\n }\n const minutes = Math.round(seconds / SECONDS_PER_MINUTE);\n if (Math.abs(minutes) < MINUTES_PER_HOUR) {\n return rtf.format(minutes, 'minute');\n }\n const hours = Math.round(minutes / MINUTES_PER_HOUR);\n if (Math.abs(hours) < HOURS_PER_DAY) {\n return rtf.format(hours, 'hour');\n }\n return rtf.format(Math.round(hours / HOURS_PER_DAY), 'day');\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { hydrateAsync } from '../persistence/hydrate';\nimport { StateSyncService } from '../persistence/state-sync.service';\n\nconst STORAGE_KEY = 'lw.shell.command-mru';\nconst LIMIT = 8;\n\nfunction parseMru(raw: string | undefined): readonly string[] {\n if (!raw) {\n return [];\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (!Array.isArray(parsed)) {\n return [];\n }\n const ids = parsed.filter((entry): entry is string => {\n return typeof entry === 'string';\n });\n return [...new Set(ids)].slice(0, LIMIT);\n } catch {\n return [];\n }\n}\n\n@Service()\nexport class PaletteMruService {\n private readonly store = inject(WORKING_STATE_STORE);\n private readonly sync = inject(StateSyncService);\n\n private readonly state = signal<readonly string[]>(\n parseMru(this.store.peek?.(STORAGE_KEY)),\n );\n\n readonly ids = this.state.asReadonly();\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.state.set(parseMru(raw)),\n );\n this.sync.register('working-state', STORAGE_KEY, (raw) =>\n this.state.set(parseMru(raw)),\n );\n }\n\n record(id: string): void {\n const next = [id, ...this.state().filter((known) => known !== id)].slice(\n 0,\n LIMIT,\n );\n this.state.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify(next));\n }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, computed, inject, signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { CommandService } from './command.service';\nimport { fuzzyScore } from './palette-fuzzy';\nimport { formatRelativeTime } from './relative-time';\nimport { PaletteMruService } from './palette-mru.service';\nimport { SHELL_FEATURES } from '../foundation/shell-features';\nimport { DialogRef } from '../dialog/dialog-ref';\nimport { ContentTabsService } from '../regions/content/tabs/content-tabs.service';\nimport { MenuService, MENU_ANCHOR_GAP } from '../menu/menu.service';\nimport { TAB_CONTEXT_MENU } from '../regions/content/tabs/tab-context-menu';\n\nexport const PALETTE_COMMAND_ID = 'shell.commandPalette';\nexport const QUICK_OPEN_COMMAND_ID = 'shell.quickOpen';\n\nexport type PaletteMode = 'commands' | 'tabs';\n\ninterface PaletteData {\n readonly mode?: PaletteMode;\n}\n\ninterface CommandEntry {\n readonly kind: 'command';\n readonly id: string;\n readonly label: string;\n readonly icon?: string;\n readonly shortcut?: string;\n}\n\ninterface TabEntry {\n readonly kind: 'tab';\n readonly id: string;\n readonly label: string;\n readonly icon?: string;\n readonly navPath: string;\n readonly pinned: boolean;\n readonly closable: boolean;\n readonly lastActive?: number;\n readonly time?: string;\n}\n\ntype PaletteEntry = CommandEntry | TabEntry;\n\ninterface CommandSections {\n readonly recent: readonly CommandEntry[];\n readonly others: readonly CommandEntry[];\n}\n\nfunction matching<T extends { label: string }>(\n query: string,\n entries: readonly T[],\n): readonly T[] {\n return entries.filter((entry) => fuzzyScore(query, entry.label) !== null);\n}\n\nfunction ranked<T extends { label: string }>(\n query: string,\n entries: readonly T[],\n): readonly T[] {\n return entries\n .map((entry) => ({ entry, score: fuzzyScore(query, entry.label) }))\n .filter(\n (scored): scored is { entry: T; score: number } => scored.score !== null,\n )\n .sort((a, b) => b.score - a.score)\n .map((scored) => scored.entry);\n}\n\n@Component({\n selector: 'lw-command-palette',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [TranslocoPipe],\n templateUrl: './command-palette.html',\n})\nexport class CommandPalette {\n private readonly ref = inject(DialogRef);\n private readonly commands = inject(CommandService);\n private readonly mru = inject(PaletteMruService);\n private readonly contentTabs = inject(ContentTabsService);\n private readonly menu = inject(MenuService);\n private readonly transloco = inject(TranslocoService);\n private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly recentlyUsed = inject(SHELL_FEATURES).commands.recentlyUsed;\n private readonly lang = toSignal(this.transloco.langChanges$, {\n initialValue: this.transloco.getActiveLang(),\n });\n private readonly translations = toSignal(this.transloco.events$, {\n initialValue: null,\n });\n\n protected readonly mode = signal<PaletteMode>(\n (this.ref.data as PaletteData | undefined)?.mode === 'tabs'\n ? 'tabs'\n : 'commands',\n );\n protected readonly query = signal('');\n private readonly rawIndex = signal(0);\n\n private readonly commandEntries = computed<readonly CommandEntry[]>(() => {\n this.lang();\n this.translations();\n return this.commands\n .commands()\n .filter(\n (command) =>\n command.id !== PALETTE_COMMAND_ID &&\n !command.paletteHidden &&\n this.commands.available(command),\n )\n .map((command) => ({\n kind: 'command' as const,\n id: command.id,\n label: this.transloco.translate(command.title),\n icon: command.icon,\n shortcut: this.commands.shortcutOf(command),\n }));\n });\n\n private readonly tabEntries = computed<readonly TabEntry[]>(() => {\n this.lang();\n this.translations();\n const locale = this.transloco.getActiveLang();\n const now = Date.now();\n return this.contentTabs.quickOpenTargets().map((tab) => ({\n kind: 'tab' as const,\n id: tab.path,\n label: tab.literalTitle ? tab.title : this.transloco.translate(tab.title),\n icon: tab.icon,\n navPath: tab.navPath,\n pinned: tab.pinned,\n closable: tab.closable,\n lastActive: tab.lastActive,\n time:\n tab.lastActive !== undefined\n ? formatRelativeTime(locale, tab.lastActive, now)\n : undefined,\n }));\n });\n\n private readonly commandSections = computed<CommandSections>(() => {\n const query = this.query().trim();\n const entries = this.commandEntries();\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n const recent = this.recentlyUsed\n ? this.mru\n .ids()\n .map((id) => byId.get(id))\n .filter((entry): entry is CommandEntry => entry !== undefined)\n : [];\n const recentIds = new Set(recent.map((entry) => entry.id));\n const others = entries.filter((entry) => !recentIds.has(entry.id));\n if (!query) {\n return { recent, others };\n }\n return {\n recent: matching(query, recent),\n others: ranked(query, others),\n };\n });\n\n private readonly tabResults = computed<readonly TabEntry[]>(() => {\n const query = this.query().trim();\n const entries = this.tabEntries();\n if (!query) {\n return [...entries].sort(\n (a, b) => (b.lastActive ?? 0) - (a.lastActive ?? 0),\n );\n }\n return ranked(query, entries);\n });\n\n protected readonly recentCount = computed(() =>\n this.mode() === 'tabs' ? 0 : this.commandSections().recent.length,\n );\n\n protected readonly results = computed<readonly PaletteEntry[]>(() => {\n if (this.mode() === 'tabs') {\n return this.tabResults();\n }\n const sections = this.commandSections();\n return [...sections.recent, ...sections.others];\n });\n\n protected readonly activeIndex = computed(() => {\n const last = this.results().length - 1;\n return Math.max(0, Math.min(this.rawIndex(), last));\n });\n\n protected readonly activeId = computed<string | null>(() =>\n this.results().length ? this.optionId(this.activeIndex()) : null,\n );\n\n protected optionId(index: number): string {\n return `lw-palette-option-${index}`;\n }\n\n protected shortcutOf(entry: PaletteEntry): string | undefined {\n return entry.kind === 'command' ? entry.shortcut : undefined;\n }\n\n protected timeOf(entry: PaletteEntry): string | undefined {\n return entry.kind === 'tab' ? entry.time : undefined;\n }\n\n protected setActive(index: number): void {\n this.rawIndex.set(index);\n }\n\n protected onQuery(event: Event): void {\n this.query.set((event.target as HTMLInputElement).value);\n this.rawIndex.set(0);\n this.scrollListToTop();\n }\n\n protected move(event: Event, delta: number): void {\n event.preventDefault();\n const count = this.results().length;\n if (count === 0) {\n return;\n }\n const next = (this.activeIndex() + delta + count) % count;\n this.rawIndex.set(next);\n this.element.nativeElement\n .querySelector(`#${this.optionId(next)}`)\n ?.scrollIntoView?.({ block: 'nearest' });\n }\n\n protected runActive(event: Event): void {\n event.preventDefault();\n const entry = this.results()[this.activeIndex()];\n if (entry) {\n this.select(entry);\n }\n }\n\n protected select(entry: PaletteEntry): void {\n if (entry.kind === 'command') {\n if (this.recentlyUsed) {\n this.mru.record(entry.id);\n }\n this.ref.close();\n this.commands.execute(entry.id);\n return;\n }\n this.ref.close();\n this.contentTabs.revealContentTab(entry.navPath);\n }\n\n protected openTabActions(event: Event): void {\n if (this.mode() !== 'tabs') {\n return;\n }\n const entry = this.results()[this.activeIndex()];\n if (!entry || entry.kind !== 'tab') {\n return;\n }\n event.preventDefault();\n const rect = this.element.nativeElement\n .querySelector(`#${this.optionId(this.activeIndex())}`)\n ?.getBoundingClientRect();\n const at = rect\n ? { x: rect.right - MENU_ANCHOR_GAP, y: rect.top }\n : { x: 0, y: 0 };\n this.ref.close();\n this.menu.open(\n TAB_CONTEXT_MENU,\n {\n tabId: entry.navPath,\n closable: entry.closable,\n pinned: entry.pinned,\n },\n at,\n );\n }\n\n private scrollListToTop(): void {\n const list = this.element.nativeElement.querySelector('#lw-palette-list');\n if (list) {\n list.scrollTop = 0;\n }\n }\n}\n","<div class=\"flex max-h-[60vh] w-full flex-col overflow-hidden\">\n <div class=\"flex items-center gap-2 border-b border-border px-4\">\n <lw-icon name=\"search\" size=\"1.1rem\" class=\"text-content-muted\" />\n <input\n data-lw-autofocus\n type=\"text\"\n role=\"combobox\"\n aria-controls=\"lw-palette-list\"\n [attr.aria-expanded]=\"true\"\n [attr.aria-activedescendant]=\"activeId()\"\n [attr.aria-label]=\"'palette.title' | transloco\"\n [value]=\"query()\"\n [placeholder]=\"\n (mode() === 'tabs' ? 'palette.tabsPlaceholder' : 'palette.placeholder')\n | transloco\n \"\n class=\"flex-1 bg-transparent py-3 text-sm text-content outline-none placeholder:text-content-faint\"\n (input)=\"onQuery($event)\"\n (keydown.arrowdown)=\"move($event, 1)\"\n (keydown.arrowup)=\"move($event, -1)\"\n (keydown.arrowright)=\"openTabActions($event)\"\n (keydown.enter)=\"runActive($event)\"\n />\n </div>\n\n <ul\n id=\"lw-palette-list\"\n role=\"listbox\"\n class=\"min-h-0 flex-1 overflow-y-auto p-1\"\n >\n @for (entry of results(); track entry.id; let i = $index) {\n @if (recentCount() > 0 && i === 0) {\n <li\n role=\"presentation\"\n data-testid=\"palette-section-recent\"\n class=\"px-3 pt-2 pb-1 text-xs font-medium text-content-faint\"\n >\n {{ 'palette.recent' | transloco }}\n </li>\n }\n @if (recentCount() > 0 && i === recentCount()) {\n <li\n role=\"presentation\"\n data-testid=\"palette-section-all\"\n class=\"px-3 pt-2 pb-1 text-xs font-medium text-content-faint\"\n >\n {{ 'palette.all' | transloco }}\n </li>\n }\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <li\n role=\"option\"\n [id]=\"optionId(i)\"\n [attr.aria-selected]=\"i === activeIndex()\"\n class=\"flex cursor-pointer items-center gap-3 rounded-md px-3 py-2 text-sm\"\n [class]=\"\n i === activeIndex()\n ? 'bg-brand/10 text-brand-text'\n : 'text-content hover:bg-surface-overlay'\n \"\n (click)=\"select(entry)\"\n (mouseenter)=\"setActive(i)\"\n >\n @if (entry.icon; as icon) {\n <lw-icon [name]=\"icon\" size=\"1rem\" class=\"text-content-muted\" />\n }\n <span class=\"flex-1 truncate\">{{ entry.label }}</span>\n @if (timeOf(entry); as time) {\n <span class=\"shrink-0 text-xs text-content-faint\">{{ time }}</span>\n }\n @if (shortcutOf(entry); as shortcut) {\n <kbd\n class=\"rounded border border-border px-1.5 py-0.5 text-xs text-content-muted\"\n >{{ shortcut }}</kbd\n >\n }\n </li>\n } @empty {\n <li class=\"px-3 py-6 text-center text-sm text-content-muted\">\n {{\n (mode() === 'tabs' ? 'palette.tabsEmpty' : 'palette.empty') | transloco\n }}\n </li>\n }\n </ul>\n\n <div\n data-testid=\"palette-footer\"\n class=\"flex items-center gap-4 border-t border-border px-4 py-2 text-xs text-content-faint\"\n >\n <span class=\"flex items-center gap-1.5\">\n <kbd class=\"rounded border border-border px-1 py-0.5\">↑↓</kbd>\n {{ 'palette.hint.navigate' | transloco }}\n </span>\n <span class=\"flex items-center gap-1.5\">\n <kbd class=\"rounded border border-border px-1 py-0.5\">↵</kbd>\n {{ 'palette.hint.run' | transloco }}\n </span>\n @if (mode() === 'tabs') {\n <span class=\"flex items-center gap-1.5\" data-testid=\"palette-hint-actions\">\n <kbd class=\"rounded border border-border px-1 py-0.5\">→</kbd>\n {{ 'palette.hint.actions' | transloco }}\n </span>\n }\n <span class=\"ml-auto flex items-center gap-1.5\">\n <kbd class=\"rounded border border-border px-1 py-0.5\">Esc</kbd>\n {{ 'palette.hint.close' | transloco }}\n </span>\n </div>\n</div>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, signal } from '@angular/core';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { DialogRef } from '../dialog/dialog-ref';\nimport { DialogService } from '../dialog/dialog.service';\nimport { DEFAULT_WORKSPACE_ID } from './active-workspace.service';\nimport { WorkspaceService } from './workspace.service';\nimport { CommandService } from '../commands/command.service';\n\n@Component({\n selector: 'lw-workspace-dialog',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './workspace-dialog.html',\n})\nexport class WorkspaceDialog {\n private readonly ws = inject(WorkspaceService);\n private readonly ref = inject<DialogRef>(DialogRef);\n private readonly dialogs = inject(DialogService);\n private readonly transloco = inject(TranslocoService);\n private readonly commands = inject(CommandService);\n\n protected readonly workspaces = this.ws.workspaces;\n protected readonly initials = this.ws.initials;\n protected readonly definitions = this.ws.definitions;\n protected readonly activeId = this.ws.activeId;\n protected readonly hasChanges = this.ws.hasChanges;\n protected readonly defaultId = DEFAULT_WORKSPACE_ID;\n protected readonly name = signal('');\n\n protected readonly tab = signal<'mine' | 'provided'>(\n this.definitions.some((definition) => definition.id === this.ws.activeId())\n ? 'provided'\n : 'mine',\n );\n\n protected originName(id: string): string | null {\n const origin = this.ws.originOf(id);\n const definition = this.definitions.find(\n (candidate) => candidate.id === origin,\n );\n return definition ? this.transloco.translate(definition.title) : null;\n }\n\n protected changed(id: string): boolean {\n return this.ws.changedIds().has(id);\n }\n\n protected save(): void {\n const name = this.name().trim();\n if (!name) {\n return;\n }\n void this.ws.saveCurrent(name).then(() => this.name.set(''));\n }\n\n protected applyChanges(): void {\n void this.dialogs\n .confirm({\n title: this.transloco.translate('workspace.saveBaseline'),\n message: this.transloco.translate('workspace.applyConfirm'),\n })\n .then((ok) => {\n if (ok) {\n void this.ws.saveBaseline();\n }\n });\n }\n\n protected switchTo(id: string): void {\n void this.ws.switchTo(id);\n this.ref.close();\n }\n\n protected rename(id: string, current: string): void {\n void this.dialogs\n .prompt({\n title: this.transloco.translate('workspace.rename'),\n message: '',\n initial: current,\n placeholder: this.transloco.translate('workspace.namePlaceholder'),\n })\n .then((name) => name?.trim() && this.ws.rename(id, name.trim()));\n }\n\n protected resetLayout(): void {\n this.ref.close();\n this.commands.execute('shell.workspace.reset');\n }\n\n protected remove(id: string, name: string): void {\n void this.dialogs\n .confirm({\n title: this.transloco.translate('workspace.delete'),\n message: this.transloco.translate('workspace.deleteConfirm', { name }),\n tone: 'danger',\n })\n .then((ok) => ok && this.ws.remove(id));\n }\n}\n","<div class=\"flex w-full flex-col gap-4\">\n @if (definitions.length > 0) {\n <div class=\"lw-segmented self-start\">\n <button\n type=\"button\"\n class=\"lw-segmented-item w-auto px-3 text-sm\"\n data-testid=\"workspace-tab-mine\"\n [attr.aria-pressed]=\"tab() === 'mine'\"\n (click)=\"tab.set('mine')\"\n >\n {{ 'workspace.tabMine' | transloco }} ({{ workspaces().length + 1 }})\n </button>\n <button\n type=\"button\"\n class=\"lw-segmented-item w-auto px-3 text-sm\"\n data-testid=\"workspace-tab-provided\"\n [attr.aria-pressed]=\"tab() === 'provided'\"\n (click)=\"tab.set('provided')\"\n >\n {{ 'workspace.tabProvided' | transloco }} ({{ definitions.length }})\n </button>\n </div>\n }\n\n @if (tab() === 'mine') {\n <div class=\"flex gap-2\">\n <input\n class=\"lw-field flex-1\"\n [value]=\"name()\"\n (input)=\"name.set($any($event.target).value)\"\n (keydown.enter)=\"save()\"\n [placeholder]=\"'workspace.namePlaceholder' | transloco\"\n [attr.aria-label]=\"'workspace.namePlaceholder' | transloco\"\n />\n <button\n type=\"button\"\n class=\"lw-btn lw-btn--primary relative\"\n [disabled]=\"!name().trim()\"\n (click)=\"save()\"\n data-testid=\"workspace-save\"\n >\n <lw-icon name=\"add\" size=\"0.9rem\" />\n {{ 'workspace.save' | transloco }}\n <lw-tooltip [text]=\"'workspace.saveAsHint' | transloco\" position=\"bottom\" />\n </button>\n </div>\n }\n\n <ul class=\"flex max-h-[45vh] flex-col gap-1.5 overflow-y-auto px-0.5 py-0.5\">\n @if (tab() === 'mine') {\n <li\n class=\"flex items-center gap-1 rounded-md border p-1.5\"\n [class.border-brand]=\"activeId() === defaultId\"\n [class.border-border]=\"activeId() !== defaultId\"\n >\n <button\n type=\"button\"\n class=\"flex-1 truncate rounded px-2 py-1 text-left text-sm text-content transition-colors hover:bg-surface-overlay\"\n [attr.aria-current]=\"activeId() === defaultId ? 'true' : null\"\n (click)=\"switchTo(defaultId)\"\n data-testid=\"workspace-default\"\n >\n {{ 'workspace.default' | transloco }}\n @if (changed(defaultId)) {\n <span\n aria-hidden=\"true\"\n class=\"ml-0.5 inline-block h-1.5 w-1.5 rounded-full bg-brand align-middle\"\n data-testid=\"workspace-changed\"\n ></span>\n }\n </button>\n @if (activeId() === defaultId) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-7 w-7 rounded-md disabled:opacity-40\"\n [disabled]=\"!hasChanges()\"\n (click)=\"resetLayout()\"\n [attr.aria-label]=\"'workspace.reset' | transloco\"\n data-testid=\"workspace-reset\"\n >\n <lw-icon name=\"undo\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'workspace.resetHint' | transloco\"\n position=\"bottom\"\n />\n </button>\n }\n </li>\n }\n @if (tab() === 'provided') {\n @for (definition of definitions; track definition.id) {\n <li\n class=\"flex items-center gap-1 rounded-md border p-1.5\"\n [class.border-brand]=\"activeId() === definition.id\"\n [class.border-border]=\"activeId() !== definition.id\"\n >\n <button\n type=\"button\"\n class=\"flex min-w-0 flex-1 items-center gap-1.5 rounded px-2 py-1 text-left text-sm text-content transition-colors hover:bg-surface-overlay\"\n [attr.aria-current]=\"activeId() === definition.id ? 'true' : null\"\n (click)=\"switchTo(definition.id)\"\n [attr.data-testid]=\"'workspace-def-' + definition.id\"\n >\n @if (definition.icon) {\n <lw-icon [name]=\"definition.icon\" size=\"0.9rem\" class=\"shrink-0\" />\n }\n <span class=\"truncate\">{{ definition.title | transloco }}</span>\n @if (changed(definition.id)) {\n <span\n aria-hidden=\"true\"\n class=\"h-1.5 w-1.5 shrink-0 rounded-full bg-brand\"\n data-testid=\"workspace-changed\"\n ></span>\n }\n </button>\n @if (activeId() === definition.id) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-7 w-7 rounded-md disabled:opacity-40\"\n [disabled]=\"!hasChanges()\"\n (click)=\"resetLayout()\"\n [attr.aria-label]=\"'workspace.reset' | transloco\"\n data-testid=\"workspace-reset\"\n >\n <lw-icon name=\"undo\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'workspace.resetHint' | transloco\"\n position=\"bottom\"\n />\n </button>\n }\n </li>\n }\n }\n @if (tab() === 'mine') {\n @for (workspace of workspaces(); track workspace.id) {\n <li\n class=\"flex items-center gap-1 rounded-md border p-1.5\"\n [class.border-brand]=\"activeId() === workspace.id\"\n [class.border-border]=\"activeId() !== workspace.id\"\n >\n <button\n type=\"button\"\n class=\"flex flex-1 items-center gap-2 truncate rounded px-2 py-1 text-left text-sm text-content transition-colors hover:bg-surface-overlay\"\n [attr.aria-current]=\"activeId() === workspace.id ? 'true' : null\"\n (click)=\"switchTo(workspace.id)\"\n >\n @if (initials().get(workspace.id); as badge) {\n <span\n aria-hidden=\"true\"\n class=\"lw-rail-initials shrink-0 text-content-faint\"\n data-testid=\"workspace-initials\"\n >{{ badge }}</span\n >\n }\n <span class=\"min-w-0 flex-1 truncate\">\n <span class=\"block truncate\">{{ workspace.name }}</span>\n @if (originName(workspace.id); as origin) {\n <span\n class=\"block truncate text-xs text-content-faint\"\n data-testid=\"workspace-origin\"\n >{{ 'workspace.variantOf' | transloco: { name: origin } }}</span\n >\n }\n </span>\n @if (changed(workspace.id)) {\n <span\n aria-hidden=\"true\"\n class=\"ml-0.5 inline-block h-1.5 w-1.5 rounded-full bg-brand align-middle\"\n data-testid=\"workspace-changed\"\n ></span>\n }\n </button>\n @if (activeId() === workspace.id) {\n <button\n type=\"button\"\n class=\"lw-icon-btn h-7 w-7 rounded-md disabled:opacity-40\"\n [disabled]=\"!hasChanges()\"\n (click)=\"applyChanges()\"\n [attr.aria-label]=\"'workspace.saveBaseline' | transloco\"\n data-testid=\"workspace-save-baseline\"\n >\n <lw-icon name=\"save\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'workspace.saveBaselineHint' | transloco\"\n position=\"bottom\"\n />\n </button>\n <button\n type=\"button\"\n class=\"lw-icon-btn h-7 w-7 rounded-md disabled:opacity-40\"\n [disabled]=\"!hasChanges()\"\n (click)=\"resetLayout()\"\n [attr.aria-label]=\"'workspace.reset' | transloco\"\n data-testid=\"workspace-reset\"\n >\n <lw-icon name=\"undo\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'workspace.resetHint' | transloco\"\n position=\"bottom\"\n />\n </button>\n }\n <button\n type=\"button\"\n class=\"lw-icon-btn h-7 w-7 rounded-md\"\n (click)=\"rename(workspace.id, workspace.name)\"\n [attr.aria-label]=\"'workspace.rename' | transloco\"\n >\n <lw-icon name=\"edit\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'workspace.rename' | transloco\"\n position=\"bottom\"\n />\n </button>\n <button\n type=\"button\"\n class=\"lw-icon-btn h-7 w-7 rounded-md hover:text-negative\"\n (click)=\"remove(workspace.id, workspace.name)\"\n [attr.aria-label]=\"'workspace.delete' | transloco\"\n >\n <lw-icon name=\"trash\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'workspace.delete' | transloco\"\n position=\"bottom\"\n />\n </button>\n </li>\n }\n }\n </ul>\n</div>\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, signal } from '@angular/core';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { DialogRef } from '../../dialog/dialog-ref';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { CommandService } from '../../commands/command.service';\nimport {\n RailItemsService,\n workspaceRailItemId,\n} from '../rail/rail-items.service';\nimport { RailMoveService } from '../rail/rail-move.service';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { VIEW_PANE_PREFIX } from '../pane/tree/pane-address';\nimport { ViewVisibilityService } from '../panel/view-visibility.service';\nimport { WorkspaceService } from '../../workspace/workspace.service';\nimport { SHELL_FEATURES } from '../../foundation/shell-features';\n\nexport type CurationKind = 'rail' | 'views';\n\nexport interface CurationDialogData {\n readonly kind: CurationKind;\n}\n\nexport const HIDDEN = 'hidden';\n\nexport const CURATION_CHROME: Record<\n CurationKind,\n { readonly title: string; readonly icon: string }\n> = {\n rail: { title: 'rail.customize', icon: 'edit' },\n views: { title: 'panel.customizeViews', icon: 'navigator' },\n};\n\ninterface CurationRow {\n readonly id: string;\n readonly label: string;\n readonly icon?: string;\n readonly initials?: string;\n readonly place: string;\n}\n\ninterface CurationPlace {\n readonly id: string;\n readonly label: string;\n}\n\n@Component({\n selector: 'lw-curation-dialog',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './curation-dialog.html',\n})\nexport class CurationDialog {\n private readonly ref = inject(DialogRef);\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly registry = inject(ContributionRegistry);\n private readonly auth = inject(AuthContext);\n private readonly commands = inject(CommandService);\n private readonly transloco = inject(TranslocoService);\n private readonly railItems = inject(RailItemsService);\n private readonly railMove = inject(RailMoveService);\n private readonly paneTree = inject(PaneTreeService);\n private readonly visibility = inject(ViewVisibilityService);\n private readonly workspaces = inject(WorkspaceService);\n private readonly features = inject(SHELL_FEATURES);\n\n protected readonly query = signal('');\n\n private readonly kind =\n (this.ref.data as CurationDialogData | undefined)?.kind ?? 'rail';\n\n protected readonly chrome = CURATION_CHROME[this.kind];\n\n private readonly regions = computed(() =>\n this.layout.regions.filter((region) =>\n this.kind === 'rail' ? region.type === 'rail' : region.type === 'panel',\n ),\n );\n\n protected readonly places = computed<CurationPlace[]>(() => {\n const regions = this.regions();\n const hidden = {\n id: HIDDEN,\n label: this.transloco.translate('curation.hidden'),\n };\n if (regions.length < 2) {\n return [\n hidden,\n {\n id: regions[0]?.id ?? HIDDEN,\n label: this.transloco.translate('curation.shown'),\n },\n ];\n }\n return [\n hidden,\n ...regions.map((region) => ({\n id: region.id,\n label: this.transloco.translate(\n region.dock === 'right' ? 'curation.right' : 'curation.left',\n ),\n })),\n ];\n });\n\n protected readonly rows = computed<CurationRow[]>(() => {\n const all = this.kind === 'rail' ? this.railRows() : this.viewRows();\n const query = this.query().trim().toLowerCase();\n return query\n ? all.filter((row) => row.label.toLowerCase().includes(query))\n : all;\n });\n\n protected place(row: CurationRow, place: string): void {\n if (place === row.place) {\n return;\n }\n if (this.kind === 'rail') {\n if (place === HIDDEN) {\n this.railItems.hide(row.id);\n } else {\n this.railMove.move(row.id, place);\n }\n return;\n }\n if (place === HIDDEN) {\n this.visibility.hide(row.id);\n } else {\n this.visibility.reveal(row.id, place);\n }\n }\n\n private railRows(): CurationRow[] {\n const fallback = this.regions()[0]?.id ?? '';\n const registered = this.registry\n .railItems()\n .filter((item) => this.auth.visible(item.access))\n .filter(\n (item) =>\n item.workspace !== undefined || this.commands.triggerable(item),\n )\n .map((item) => ({\n id: item.id,\n label: this.transloco.translate(item.title),\n icon: item.icon,\n initials: item.initials,\n place: this.railPlace(item.id, item.rail ?? fallback),\n }));\n const known = new Set(this.registry.railItems().map((item) => item.id));\n const initials = this.workspaces.initials();\n const saved = (this.features.workspaces.savedInRail\n ? this.workspaces.workspaces()\n : [])\n .filter((workspace) => !known.has(workspaceRailItemId(workspace.id)))\n .map((workspace) => ({\n id: workspaceRailItemId(workspace.id),\n label: workspace.name,\n icon: 'workspaces',\n initials: initials.get(workspace.id),\n place: this.railPlace(workspaceRailItemId(workspace.id), fallback),\n }));\n return [...registered, ...saved];\n }\n\n private railPlace(itemId: string, declaredRail: string): string {\n return this.railItems.isVisible(itemId)\n ? this.railItems.regionOf(itemId, declaredRail)\n : HIDDEN;\n }\n\n private viewRows(): CurationRow[] {\n const panels = new Set(this.regions().map((region) => region.id));\n return this.registry\n .views()\n .filter((view) => this.auth.meets(view.access))\n .map((view) => ({ view, holder: this.holderOf(view.id) }))\n .filter(\n ({ view, holder }) =>\n panels.has(view.region) || (holder !== null && panels.has(holder)),\n )\n .map(({ view, holder }) => ({\n id: view.id,\n label: this.transloco.translate(view.title),\n icon: view.icon,\n place: holder !== null && panels.has(holder) ? holder : HIDDEN,\n }));\n }\n\n private holderOf(viewId: string): string | null {\n return this.paneTree.sourceOf(VIEW_PANE_PREFIX + viewId)?.dock ?? null;\n }\n}\n","<div class=\"flex max-h-[60vh] w-full flex-col overflow-hidden\">\n <header class=\"flex items-center gap-2 border-b border-border px-4 py-3\">\n <lw-icon\n [attr.name]=\"chrome.icon\"\n size=\"1.125rem\"\n class=\"text-content-muted\"\n ></lw-icon>\n <h2 class=\"min-w-0 flex-1 truncate text-sm font-semibold text-content\">\n {{ chrome.title | transloco }}\n </h2>\n </header>\n\n <div class=\"flex items-center gap-2 border-b border-border px-4\">\n <lw-icon name=\"search\" size=\"1.1rem\" class=\"text-content-muted\"></lw-icon>\n <input\n data-lw-autofocus\n type=\"text\"\n data-testid=\"curation-search\"\n class=\"flex-1 bg-transparent py-3 text-sm text-content outline-none placeholder:text-content-faint\"\n [attr.placeholder]=\"'curation.search' | transloco\"\n [attr.aria-label]=\"'curation.search' | transloco\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n </div>\n\n <ul class=\"min-h-0 flex-1 overflow-y-auto p-1\" data-testid=\"curation-list\">\n @for (row of rows(); track row.id) {\n <li\n class=\"flex items-center gap-3 rounded-md px-3 py-2 hover:bg-surface-overlay\"\n [attr.data-curation-row]=\"row.id\"\n >\n @if (row.initials) {\n <span\n aria-hidden=\"true\"\n class=\"lw-rail-initials w-[1.125rem] shrink-0 text-center text-content-muted\"\n >{{ row.initials }}</span\n >\n } @else if (row.icon) {\n <lw-icon\n [attr.name]=\"row.icon\"\n size=\"1.125rem\"\n class=\"shrink-0 text-content-muted\"\n ></lw-icon>\n }\n <span class=\"min-w-0 flex-1 truncate text-sm\">{{ row.label }}</span>\n <div class=\"lw-segmented shrink-0\">\n @for (option of places(); track option.id) {\n <button\n type=\"button\"\n class=\"lw-segmented-item w-auto px-3 text-sm\"\n [attr.data-curation-place]=\"option.id\"\n [attr.aria-label]=\"row.label + ': ' + option.label\"\n [attr.aria-pressed]=\"row.place === option.id\"\n (click)=\"place(row, option.id)\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n </li>\n } @empty {\n <li class=\"px-3 py-6 text-center text-sm text-content-muted\">\n {{ 'curation.empty' | transloco }}\n </li>\n }\n </ul>\n\n <div\n data-testid=\"curation-footer\"\n class=\"flex items-center border-t border-border px-4 py-2 text-xs text-content-faint\"\n >\n <span class=\"ml-auto flex items-center gap-1.5\">\n <kbd class=\"rounded border border-border px-1 py-0.5\">Esc</kbd>\n {{ 'dialog.close' | transloco }}\n </span>\n </div>\n</div>\n","import { TranslocoService } from '@jsverse/transloco';\nimport { AuthContext } from './auth/auth-context';\nimport { ContributionRegistry } from './plugin/contribution-registry';\nimport { DialogService } from './dialog/dialog.service';\nimport { SettingsService } from './settings/settings.service';\nimport { WorkspaceService } from './workspace/workspace.service';\nimport { ViewStateService } from './views/view-state.service';\nimport { ViewInstanceService } from './views/view-instance.service';\nimport {\n CommandPalette,\n PALETTE_COMMAND_ID,\n QUICK_OPEN_COMMAND_ID,\n} from './commands/command-palette';\nimport { WorkspaceDialog } from './workspace/workspace-dialog';\nimport { ContentTabsService } from './regions/content/tabs/content-tabs.service';\nimport { offRouterMountable } from './regions/content/pane-targets';\nimport { registerTabContextMenu } from './regions/content/tabs/tab-context-menu';\nimport { CONTENT_DOCK } from './regions/pane/tree/pane-address';\nimport { PaneTreeService } from './regions/pane/tree/pane-tree.service';\nimport { PaneMoveService } from './regions/pane/drag/pane-move.service';\nimport { RetentionCandidates } from './regions/pane/retention/retention-candidates';\nimport { SurfaceCloseGuard } from './regions/pane/close/surface-close-guard';\nimport {\n registerViewContextMenu,\n registerViewHideMenu,\n registerViewStackMenu,\n registerViewOpenInContentMenu,\n registerViewPopoutMenu,\n registerViewResetMenu,\n registerViewCustomizeMenu,\n} from './regions/panel/view-context-menu';\nimport { ViewMoveService } from './regions/panel/view-move.service';\nimport {\n registerRailContextMenu,\n registerRailCustomizeMenu,\n registerRailMoveMenu,\n} from './regions/rail/rail-context-menu';\nimport { RailItemsService } from './regions/rail/rail-items.service';\nimport { RailMoveService } from './regions/rail/rail-move.service';\nimport { ViewVisibilityService } from './regions/panel/view-visibility.service';\nimport { PopoutService } from './popout/popout.service';\nimport { ShellFeatures } from './foundation/shell-features';\nimport {\n CURATION_CHROME,\n CurationDialog,\n} from './regions/curation/curation-dialog';\nimport { AppResetService } from './layout/app-reset.service';\n\nexport interface ShellRegions {\n readonly regions: readonly {\n readonly type: string;\n readonly dock?: string;\n }[];\n}\n\nfunction hasRegion(layout: ShellRegions, type: string): boolean {\n return layout.regions.some((region) => region.type === type);\n}\n\nfunction docks(layout: ShellRegions, type: string): number {\n return new Set(\n layout.regions\n .filter((region) => region.type === type)\n .map((region) => region.dock),\n ).size;\n}\n\nexport interface HostCommandDeps {\n readonly dialogs: DialogService;\n readonly paneTree: PaneTreeService;\n readonly tabs: ContentTabsService;\n readonly workspace: WorkspaceService;\n readonly transloco: TranslocoService;\n readonly settings: SettingsService;\n readonly popout: PopoutService;\n readonly auth: AuthContext;\n readonly closeGuard: SurfaceCloseGuard;\n readonly retention: RetentionCandidates;\n readonly appReset: AppResetService;\n readonly features: ShellFeatures;\n}\n\nexport interface BuiltInMenuDeps {\n readonly tabs: ContentTabsService;\n readonly paneMove: PaneMoveService;\n readonly viewMove: ViewMoveService;\n readonly viewVisibility: ViewVisibilityService;\n readonly railItems: RailItemsService;\n readonly railMove: RailMoveService;\n readonly paneTree: PaneTreeService;\n readonly viewStates: ViewStateService;\n readonly viewInstances: ViewInstanceService;\n readonly popout: PopoutService;\n readonly features: ShellFeatures;\n}\n\nexport interface SeedInput {\n readonly views: readonly Parameters<ContributionRegistry['addView']>[0][];\n readonly barItems: readonly Parameters<\n ContributionRegistry['addBarItem']\n >[0][];\n readonly railItems: readonly Parameters<\n ContributionRegistry['addRailItem']\n >[0][];\n readonly omit: readonly string[];\n}\n\nexport function seedHostCommands(\n registry: ContributionRegistry,\n layout: ShellRegions,\n deps: HostCommandDeps,\n): void {\n const {\n dialogs,\n paneTree,\n tabs,\n workspace,\n transloco,\n settings,\n popout,\n auth,\n closeGuard,\n retention,\n appReset,\n features,\n } = deps;\n registry.addCommand({\n id: PALETTE_COMMAND_ID,\n title: 'palette.title',\n icon: 'search',\n shortcut: 'mod+k',\n popout: true,\n run: () => {\n dialogs.open(CommandPalette, { bare: true, size: 'lg', align: 'top' });\n },\n });\n registry.addCommand({\n id: 'shell.openSettings',\n title: 'settings.title',\n icon: 'settings',\n popout: true,\n run: () => {\n settings.open();\n },\n });\n if (popout.active) {\n return;\n }\n registry.addCommand({\n id: QUICK_OPEN_COMMAND_ID,\n title: 'palette.quickOpenTitle',\n icon: 'document',\n shortcut: 'mod+p',\n run: () => {\n dialogs.open(CommandPalette, {\n bare: true,\n size: 'lg',\n align: 'top',\n data: { mode: 'tabs' },\n });\n },\n });\n if (features.rail.curate && hasRegion(layout, 'rail')) {\n registry.addCommand({\n id: 'shell.rail.customize',\n title: CURATION_CHROME.rail.title,\n icon: CURATION_CHROME.rail.icon,\n run: () => {\n dialogs.open(CurationDialog, {\n bare: true,\n size: 'lg',\n align: 'top',\n title: CURATION_CHROME.rail.title,\n data: { kind: 'rail' },\n });\n },\n });\n }\n if (features.sidebar.curate && hasRegion(layout, 'panel')) {\n registry.addCommand({\n id: 'shell.views.customize',\n title: CURATION_CHROME.views.title,\n icon: CURATION_CHROME.views.icon,\n run: () => {\n dialogs.open(CurationDialog, {\n bare: true,\n size: 'lg',\n align: 'top',\n title: CURATION_CHROME.views.title,\n data: { kind: 'views' },\n });\n },\n });\n }\n registry.addCommand({\n id: 'shell.app.reset',\n title: 'appReset.title',\n icon: 'undo',\n run: () => {\n void dialogs\n .confirm({\n title: transloco.translate('appReset.title'),\n message: transloco.translate('appReset.confirm'),\n })\n .then(async (ok) => {\n if (!ok) {\n return;\n }\n if (await closeGuard.confirmDiscard(retention.all())) {\n appReset.reset();\n }\n });\n },\n });\n if (features.content.splitRight) {\n registry.addCommand({\n id: 'shell.content.splitRight',\n title: 'content.split.open',\n icon: 'splitPanes',\n shortcut: 'mod+\\\\',\n run: () => {\n if (paneTree.isSplit(CONTENT_DOCK)) {\n paneTree.unsplit(CONTENT_DOCK);\n } else if (offRouterMountable(registry, auth, tabs.activeTabRoot())) {\n paneTree.splitPane(\n CONTENT_DOCK,\n paneTree.primaryId(CONTENT_DOCK),\n 'row',\n tabs.activeTabRoot(),\n );\n }\n },\n });\n }\n if (!features.workspaces.enabled) {\n return;\n }\n registry.addCommand({\n id: 'shell.workspace.manage',\n title: 'workspace.title',\n icon: 'workspaces',\n run: () => {\n dialogs.open(WorkspaceDialog, {\n size: 'md',\n align: 'top',\n title: 'workspace.title',\n icon: 'workspaces',\n });\n },\n });\n registry.addCommand({\n id: 'shell.workspace.reset',\n title: 'workspace.reset',\n icon: 'undo',\n run: () => {\n void dialogs\n .confirm({\n title: transloco.translate('workspace.reset'),\n message: transloco.translate('workspace.resetConfirm'),\n })\n .then(async (ok) => {\n if (!ok) {\n return;\n }\n if (await closeGuard.confirmDiscard(retention.all())) {\n workspace.reset();\n }\n });\n },\n });\n}\n\nexport function seedBuiltInMenus(\n registry: ContributionRegistry,\n layout: ShellRegions,\n deps: BuiltInMenuDeps,\n): void {\n if (deps.popout.active) {\n return;\n }\n registerTabContextMenu(\n registry,\n deps.tabs,\n deps.paneMove,\n deps.popout,\n deps.features,\n );\n const railCount = layout.regions.filter(\n (region) => region.type === 'rail',\n ).length;\n const rail = deps.features.rail;\n const sidebar = deps.features.sidebar;\n if (railCount >= 1 && rail.hideItems) {\n registerRailContextMenu(registry, deps.railItems);\n }\n if (docks(layout, 'rail') >= 2 && rail.moveItems) {\n registerRailMoveMenu(registry, deps.railMove);\n }\n if (railCount >= 1 && rail.curate) {\n registerRailCustomizeMenu(registry);\n }\n if (sidebar.resetViewState) {\n registerViewResetMenu(registry, deps.viewStates, deps.viewInstances);\n }\n if (deps.features.windows.popout) {\n registerViewPopoutMenu(registry, deps.popout);\n }\n const panelCount = layout.regions.filter(\n (region) => region.type === 'panel',\n ).length;\n if (docks(layout, 'panel') >= 2 && sidebar.moveViews) {\n registerViewContextMenu(registry, deps.viewMove);\n }\n if (panelCount === 0) {\n return;\n }\n if (sidebar.curate) {\n registerViewCustomizeMenu(registry);\n }\n if (sidebar.hideViews) {\n registerViewHideMenu(registry, deps.viewVisibility);\n }\n if (sidebar.stackViews) {\n registerViewStackMenu(registry, deps.paneTree);\n }\n if (\n sidebar.openViewInContent &&\n layout.regions.some((region) => region.type === 'content')\n ) {\n registerViewOpenInContentMenu(registry, deps.paneTree);\n }\n}\n\nexport function seedContributions(\n registry: ContributionRegistry,\n input: SeedInput,\n): void {\n for (const view of input.views) {\n registry.addView(view);\n }\n for (const item of input.barItems) {\n registry.addBarItem(item);\n }\n for (const item of input.railItems) {\n registry.addRailItem(item);\n }\n registry.omit(input.omit);\n}\n","import {\n EnvironmentProviders,\n ErrorHandler,\n Provider,\n inject,\n isDevMode,\n provideBrowserGlobalErrorListeners,\n provideEnvironmentInitializer,\n provideZonelessChangeDetection,\n} from '@angular/core';\nimport { provideHttpClient } from '@angular/common/http';\nimport { provideServiceWorker } from '@angular/service-worker';\nimport {\n provideTransloco,\n provideTranslocoMissingHandler,\n TranslocoService,\n} from '@jsverse/transloco';\nimport { detectInitialLang, SUPPORTED_LANGS } from './i18n/locale.service';\nimport { SettingsService } from './settings/settings.service';\nimport { settingOmitIds } from './settings/setting-omit';\nimport { ShellMissingTranslationHandler } from './i18n/missing-translation-handler';\nimport { TranslocoHttpLoader } from './i18n/transloco-loader';\nimport { defineLwIcon } from './elements/icon/lw-icon.element';\nimport { BAR_ITEM, provideBarItems } from './foundation/bar-item';\nimport { DEFAULT_BAR_ITEMS } from './regions/bar/default-bar-items';\nimport { RAIL_ITEM } from './foundation/rail-item';\nimport { VIEW } from './layout/view';\nimport { ContributionRegistry } from './plugin/contribution-registry';\nimport { ShellErrorHandler } from './permissions/capability-refusal';\nimport { COMMAND_INVOKER } from './foundation/command-invoker';\nimport { WORKSPACE_CLAIMS } from './foundation/workspace-claims';\nimport { CommandInvocationService } from './commands/command-invocation.service';\nimport { KeybindingService } from './commands/keybinding.service';\nimport { DialogService } from './dialog/dialog.service';\nimport { defineLwTooltip } from './elements/tooltip/lw-tooltip.element';\nimport { defineLwSelect } from './elements/select/lw-select.element';\nimport { defineLwMenu } from './elements/menu/lw-menu.element';\nimport { defineLwMarkdown } from './elements/markdown/lw-markdown.element';\nimport { defineLwButton } from './elements/button/lw-button.element';\nimport { defineLwProgressRing } from './elements/progress/lw-progress-ring.element';\nimport { ContentTabsService } from './regions/content/tabs/content-tabs.service';\nimport { PaneTreeService } from './regions/pane/tree/pane-tree.service';\nimport { PaneMoveService } from './regions/pane/drag/pane-move.service';\nimport { RetentionCandidates } from './regions/pane/retention/retention-candidates';\nimport { SurfaceCloseGuard } from './regions/pane/close/surface-close-guard';\nimport { WorkspaceService } from './workspace/workspace.service';\nimport { ViewStateService } from './views/view-state.service';\nimport { ViewInstanceService } from './views/view-instance.service';\nimport { ViewMoveService } from './regions/panel/view-move.service';\nimport { ViewVisibilityService } from './regions/panel/view-visibility.service';\nimport { RailItemsService } from './regions/rail/rail-items.service';\nimport { RailMoveService } from './regions/rail/rail-move.service';\nimport { RailWorkspaceEntries } from './regions/rail/rail-workspace-entries';\nimport { PopoutService } from './popout/popout.service';\nimport { AuthContext } from './auth/auth-context';\nimport { AppResetService } from './layout/app-reset.service';\nimport { SHELL_LAYOUT } from './layout/layout';\nimport {\n RetentionDefault,\n SURFACE_RETENTION,\n} from './regions/pane/retention/retention-policy';\nimport { SHELL_FEATURES } from './foundation/shell-features';\nimport {\n CompositionReport,\n installCompositionReport,\n} from './diagnostics/composition-report';\nimport { registerDefaultSettings } from './default-settings';\nimport {\n seedBuiltInMenus,\n seedContributions,\n seedHostCommands,\n} from './shell-seeds';\n\n/** Options a distribution can pass to {@link provideShell}. */\nexport interface ShellOptions {\n /**\n * Contribution ids to hide — a distribution drops a default it does not want (e.g.\n * `['shell.language']`). A **lasting** filter, not a one-time delete: an id a plugin\n * registers later stays hidden too. To *replace* a default instead of hiding it, register\n * your own contribution with the same id (last-in wins) and do **not** omit it.\n *\n * Covers **every** contribution kind. Chrome — commands, views, bar items, rail items — is\n * addressed by bare id. The other kinds carry a **prefix**, because ids from different kinds may\n * coincide and there is exactly one shared omit set: an unprefixed omit stays chrome-only and never\n * silently takes a same-named contribution of another kind with it (`shell.language`, for one, is\n * both a top-bar item and a settings row).\n *\n * - `menu:<commandId>` — one menu entry, leaving the command itself (palette/shortcut) alive.\n * - `setting:<id>` — a whole section (`'setting:shell.permissions'`) or a single row\n * (`'setting:shell.textSize'`); a section left without rows disappears.\n * - `route:<surfaceId>` — a routable surface's content route. It leaves the tab strip,\n * the auto-open on deep-link and the pane target picker; its URL renders a neutral \"not available\n * here\" placeholder rather than falling back to home, so a shared deep-link explains itself.\n * Addressed by the surface **id**, while a route is *overridden* by its `path` (registering your\n * own surface on the same path wins) — two handles, deliberately, for two different operations.\n */\n readonly omit?: readonly string[];\n\n /**\n * Whether to register the application's service worker — `true` by default, and inert in dev\n * either way. The shell owns the registration so that the update badge, the update\n * toast and `ctx.host.checkForUpdate()` work in a distribution that only ships the build\n * artefacts; you do **not** add `provideServiceWorker` yourself.\n *\n * Pass `false` when your build emits no `ngsw-worker.js` (no `serviceWorker` option in the build\n * target). Registration would otherwise 404 in production and log a failure. Nothing else\n * changes: `UpdateService` injects `SwUpdate` optionally, so it simply reports\n * {@link UpdateService.enabled} as `false` and never offers an update.\n *\n * `@angular/service-worker` stays a peer dependency regardless — the opt-out removes the\n * registration, not the import.\n */\n readonly serviceWorker?: boolean;\n\n /**\n * The app-wide retention default for **hidden** surfaces: `'destroy'` (the default) destroys a\n * hidden, clean surface, so state that must survive belongs in `VIEW_STATE`; `'retain'` keeps\n * every hidden instance alive at the price of memory growing with every surface ever shown. A\n * surface's own `retain: 'always' | 'never'` declaration wins over this default. `iframe` and\n * `container` surfaces are always rebuilt regardless.\n *\n * This is a storage policy for the developer, not a capability the user can see, which is why it\n * lives here rather than in `provideShellFeatures`.\n */\n readonly retention?: RetentionDefault;\n}\n\n/**\n * Wires the neutral shell host (theme, i18n, icons, error handling) for a\n * distribution. A distribution adds its own router and product identity; the\n * bare platform falls back to the LoomWeaver identity.\n */\nexport function provideShell(\n options: ShellOptions = {},\n): (Provider | EnvironmentProviders)[] {\n return [\n provideZonelessChangeDetection(),\n provideBrowserGlobalErrorListeners(),\n { provide: ErrorHandler, useClass: ShellErrorHandler },\n { provide: COMMAND_INVOKER, useExisting: CommandInvocationService },\n { provide: WORKSPACE_CLAIMS, useExisting: WorkspaceService },\n\n provideHttpClient(),\n\n ...(options.retention === undefined\n ? []\n : [{ provide: SURFACE_RETENTION, useValue: options.retention }]),\n\n ...(options.serviceWorker === false\n ? []\n : [\n provideServiceWorker('ngsw-worker.js', {\n enabled: !isDevMode(),\n registrationStrategy: 'registerWhenStable:30000',\n }),\n ]),\n ...provideBarItems(...DEFAULT_BAR_ITEMS),\n\n provideEnvironmentInitializer(() => defineLwIcon()),\n provideEnvironmentInitializer(() => defineLwTooltip()),\n provideEnvironmentInitializer(() => defineLwSelect()),\n provideEnvironmentInitializer(() => defineLwMenu()),\n provideEnvironmentInitializer(() => defineLwMarkdown()),\n provideEnvironmentInitializer(() => defineLwButton()),\n provideEnvironmentInitializer(() => defineLwProgressRing()),\n\n provideEnvironmentInitializer(() => {\n const registry = inject(ContributionRegistry);\n seedHostCommands(registry, inject(SHELL_LAYOUT), {\n dialogs: inject(DialogService),\n paneTree: inject(PaneTreeService),\n tabs: inject(ContentTabsService),\n workspace: inject(WorkspaceService),\n transloco: inject(TranslocoService),\n settings: inject(SettingsService),\n popout: inject(PopoutService),\n auth: inject(AuthContext),\n closeGuard: inject(SurfaceCloseGuard),\n retention: inject(RetentionCandidates),\n appReset: inject(AppResetService),\n features: inject(SHELL_FEATURES),\n });\n seedBuiltInMenus(registry, inject(SHELL_LAYOUT), {\n tabs: inject(ContentTabsService),\n paneMove: inject(PaneMoveService),\n viewMove: inject(ViewMoveService),\n viewVisibility: inject(ViewVisibilityService),\n railItems: inject(RailItemsService),\n railMove: inject(RailMoveService),\n paneTree: inject(PaneTreeService),\n viewStates: inject(ViewStateService),\n viewInstances: inject(ViewInstanceService),\n popout: inject(PopoutService),\n features: inject(SHELL_FEATURES),\n });\n seedContributions(registry, {\n views: inject(VIEW, { optional: true }) ?? [],\n barItems: inject(BAR_ITEM, { optional: true }) ?? [],\n railItems: inject(RAIL_ITEM, { optional: true }) ?? [],\n omit: options.omit ?? [],\n });\n }),\n\n provideEnvironmentInitializer(() => {\n if (!isDevMode()) {\n return;\n }\n const report = inject(CompositionReport);\n report.checkStaticContributions();\n installCompositionReport(report);\n }),\n\n provideEnvironmentInitializer(() => inject(KeybindingService).start()),\n\n provideEnvironmentInitializer(() => inject(RailWorkspaceEntries).start()),\n\n provideEnvironmentInitializer(() => {\n const settings = inject(SettingsService);\n settings.omit(settingOmitIds(options.omit ?? []));\n registerDefaultSettings(settings);\n }),\n provideTransloco({\n config: {\n availableLangs: [...SUPPORTED_LANGS],\n defaultLang: detectInitialLang(),\n fallbackLang: 'en',\n reRenderOnLangChange: true,\n prodMode: !isDevMode(),\n },\n loader: TranslocoHttpLoader,\n }),\n provideTranslocoMissingHandler(ShellMissingTranslationHandler),\n ];\n}\n","import { KeyValueStore } from './key-value-store';\n\nexport class BootLatchedIdentity {\n private latched: string | null = null;\n\n constructor(private readonly read: () => string | null | undefined) {}\n\n current(): string | null {\n if (this.latched !== null) {\n return this.latched;\n }\n const id = this.read();\n if (id === null || id === undefined || id === '') {\n return null;\n }\n this.latched = id;\n return id;\n }\n}\n\nexport class IdentityScopedStore implements KeyValueStore {\n peek?: (key: string) => string | undefined;\n\n private readonly inner: KeyValueStore;\n private readonly latch: BootLatchedIdentity;\n private readonly deviceKeys: ReadonlySet<string>;\n\n constructor(\n inner: KeyValueStore,\n latch: BootLatchedIdentity,\n deviceKeys: ReadonlySet<string>,\n ) {\n this.inner = inner;\n this.latch = latch;\n this.deviceKeys = deviceKeys;\n const innerPeek = inner.peek?.bind(inner);\n if (innerPeek) {\n this.peek = (key) => innerPeek(this.scoped(key));\n }\n }\n\n get(key: string): Promise<string | undefined> {\n return this.inner.get(this.scoped(key));\n }\n\n set(key: string, value: string): Promise<void> {\n return this.inner.set(this.scoped(key), value);\n }\n\n delete(key: string): Promise<void> {\n return this.inner.delete(this.scoped(key));\n }\n\n private scoped(key: string): string {\n if (this.deviceKeys.has(key)) {\n return key;\n }\n const id = this.latch.current();\n if (id === null) {\n return key;\n }\n return `lw.id.${encodeURIComponent(id)}:${key}`;\n }\n}\n","import { Provider } from '@angular/core';\nimport { KeyValueStore, LocalStorageStore } from './key-value-store';\nimport { SETTINGS_STORE } from './settings-store';\nimport { WORKING_STATE_STORE } from './working-state-store';\nimport { withCrossTabSync } from './cross-tab-sync-store';\nimport { BootLatchedIdentity, IdentityScopedStore } from './boot-latched-scope';\n\n/**\n * The storage keys that stay **device-level** by default when the stores are identity-scoped\n *: preferences that reasonably belong to the browser, not the signed-in user. Extend the\n * default via `provideIdentityScopedStores({ deviceKeys: [...DEVICE_LEVEL_KEYS, 'my.key'] })`.\n */\nexport const DEVICE_LEVEL_KEYS: readonly string[] = [\n 'lw.shell.theme',\n 'lw.shell.lang',\n 'lw.shell.font-scale',\n];\n\n/** Configuration for {@link provideIdentityScopedStores}. */\nexport interface IdentityScopedStoreOptions {\n /**\n * The identity discriminator, read synchronously. Return the current principal's stable id\n * (typically `AuthSnapshot.subject`; encode the tenant into it if tenant switches should\n * separate state). `null`/`undefined`/`''` means anonymous — keys pass through **unscoped**, so\n * a signed-out app behaves exactly like the unwrapped stores. Both stores **latch the first\n * non-empty value per boot** through one shared latch and never follow a live switch afterwards\n *: a change to a *different* subject only takes effect across the reload boundary\n * (`provideAuthSource(..., { onIdentityChange: 'reload' })`), so in-flight writes of the\n * departing user — a pending debounce, a commit during the login transition — can never land in\n * the next user's namespace. The shell peeks bootstrap-critical keys before first paint, so the\n * discriminator must be answerable synchronously at boot (persist the last-known subject\n * yourself).\n */\n identity: () => string | null | undefined;\n /**\n * Exact keys that stay unscoped regardless of identity. **Replaces** the default\n * ({@link DEVICE_LEVEL_KEYS}) — spread it to extend. Applied to both stores; the built-in\n * defaults are all settings keys, but a distribution may declare device-level keys of its own.\n */\n deviceKeys?: readonly string[];\n /** The wrapped settings store. Defaults to the built-in `localStorage` store. */\n settingsStore?: KeyValueStore;\n /** The wrapped working-state store. Defaults to the built-in `localStorage` store. */\n workingStateStore?: KeyValueStore;\n}\n\n/**\n * Scopes **both** persistence ports (`SETTINGS_STORE` and `WORKING_STATE_STORE`) per\n * signed-in user: every key outside `deviceKeys` is prefixed `lw.id.<identity>:` while\n * someone is signed in, so on a shared browser one user's pane trees, tab titles, workspaces,\n * view state and plugin settings are never re-hydrated for the next. Device-level keys and the\n * anonymous session write the original, unprefixed keys — a distribution without auth is\n * byte-identical to the unwrapped stores.\n *\n * Place after `provideShell()` (last provider wins). The standard answer to per-user state on a\n * shared browser; pair with `provideAuthSource(..., { onIdentityChange: 'reload' })` so a user\n * switch re-hydrates cleanly from the new namespace. The cross-tab sync wrapper is applied on top\n * of both stores; `peek` is offered only when the wrapped store offers it, because the\n * shell branches on the *presence* of `peek` (sync bootstrap vs. async hydration).\n */\nexport function provideIdentityScopedStores(\n options: IdentityScopedStoreOptions,\n): Provider {\n const latch = new BootLatchedIdentity(options.identity);\n const deviceKeys = new Set(options.deviceKeys ?? DEVICE_LEVEL_KEYS);\n const scoped = (inner: KeyValueStore | undefined): KeyValueStore =>\n new IdentityScopedStore(\n inner ?? new LocalStorageStore(),\n latch,\n deviceKeys,\n );\n return [\n {\n provide: SETTINGS_STORE,\n useFactory: () => withCrossTabSync(scoped(options.settingsStore)),\n },\n {\n provide: WORKING_STATE_STORE,\n useFactory: () => withCrossTabSync(scoped(options.workingStateStore)),\n },\n ];\n}\n","import { Component, computed, effect, inject, untracked } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport {\n ActivatedRoute,\n NavigationEnd,\n Router,\n RouterOutlet,\n} from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport {\n CONTAINER_HANDLE,\n ContainerSpec,\n ContainerTabLabel,\n} from '@loomweaver/plugin-sdk';\nimport { CONTAINER_CONTEXT, ContainerContext } from './container-context';\nimport { containerDockFor } from './container-children';\nimport { CONTAINER_PANE_OPTIONS } from '../pane-view-options';\nimport { PaneDragService } from '../drag/pane-drag.service';\nimport { PaneTreeView } from '../pane-tree-view';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { PaneContainersService } from './pane-containers.service';\nimport { activeTab } from '../tree/pane-node';\nimport { findLeaf } from '../tree/pane-queries';\nimport { normalizePath, restBelow } from '../../content/content-path';\n\n@Component({\n selector: 'lw-container-pane-host',\n imports: [PaneTreeView, RouterOutlet],\n providers: [\n PaneDragService,\n {\n provide: CONTAINER_CONTEXT,\n useFactory: (\n route: ActivatedRoute,\n containers: PaneContainersService,\n ) => {\n const spec = route.snapshot.data['container'] as\n ContainerSpec | undefined;\n const dock = containerDockFor(\n route.snapshot.url.map((segment) => segment.path).join('/'),\n );\n return {\n params: route.snapshot.params as Record<string, string>,\n spec,\n open: (segmentPath: string, label?: ContainerTabLabel) =>\n containers.openContainerChild(dock, spec, segmentPath, label),\n };\n },\n deps: [ActivatedRoute, PaneContainersService],\n },\n {\n provide: CONTAINER_HANDLE,\n useFactory: (ctx: ContainerContext) => ({ open: ctx.open }),\n deps: [CONTAINER_CONTEXT],\n },\n ],\n host: { class: 'flex min-h-0 min-w-0 flex-1' },\n templateUrl: './container-pane-host.html',\n})\nexport class ContainerPaneHost {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly paneTree = inject(PaneTreeService);\n private readonly containers = inject(PaneContainersService);\n\n protected readonly paneOptions = CONTAINER_PANE_OPTIONS;\n protected readonly dock: string;\n protected readonly tree = computed(() => this.paneTree.tree(this.dock));\n\n private readonly containerPath: string;\n private readonly spec: ContainerSpec | undefined;\n\n private readonly currentUrl = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map(() => this.router.url),\n ),\n { initialValue: this.router.url },\n );\n\n private readonly urlSegment = computed(() => {\n const url = normalizePath(this.currentUrl());\n const holdsUrl =\n url === this.containerPath || url.startsWith(`${this.containerPath}/`);\n return holdsUrl ? restBelow(this.containerPath, url) : null;\n });\n\n private readonly focusedSegment = computed(() => {\n const leaf = findLeaf(this.tree(), this.paneTree.primaryId(this.dock));\n const path = leaf ? activeTab(leaf)?.path : undefined;\n return path === undefined\n ? ''\n : restBelow(this.containerPath, normalizePath(path));\n });\n\n constructor() {\n this.containerPath = this.route.snapshot.url\n .map((segment) => segment.path)\n .join('/');\n this.dock = containerDockFor(this.containerPath);\n this.spec = this.route.snapshot.data['container'] as\n ContainerSpec | undefined;\n this.containers.ensureContainer(this.dock, this.spec);\n this.followUrl();\n this.leadUrl();\n }\n\n private followUrl(): void {\n effect(() => {\n const segment = this.urlSegment();\n if (!segment || segment === untracked(() => this.focusedSegment())) {\n return;\n }\n untracked(() =>\n this.containers.openContainerChild(this.dock, this.spec, segment),\n );\n });\n }\n\n private leadUrl(): void {\n effect(() => {\n const segment = this.focusedSegment();\n const url = this.urlSegment();\n if (url === null || url === segment) {\n return;\n }\n const target = segment\n ? `/${this.containerPath}/${segment}`\n : `/${this.containerPath}`;\n void this.router.navigateByUrl(target).catch(() => undefined);\n });\n }\n}\n","<lw-pane-tree-view class=\"min-h-0 min-w-0 flex-1\" [dock]=\"dock\" [node]=\"tree()\" [paneOptions]=\"paneOptions\" />\n<router-outlet />\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lw-content-sub',\n template: '',\n})\nexport class ContentSubStub {}\n","import { Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'lw-surface-route',\n imports: [RouterOutlet],\n template: '<router-outlet />',\n})\nexport class SurfaceRouteStub {}\n","import { InjectionToken, Provider, inject } from '@angular/core';\nimport { CanMatchFn, Router } from '@angular/router';\nimport { AccessRequirement } from '@loomweaver/plugin-sdk';\nimport { AuthContext } from '../../../auth/auth-context';\n\n/**\n * A distribution's redirect for a gated content route the session cannot reach. Given the\n * attempted path, it returns an in-app URL to redirect to (e.g. the product's login route), or `null`\n * to fall back to the host's neutral \"sign-in required\" placeholder. LoomWeaver owns no login UI, so\n * this is how a product plugs in its own auth flow. Defaults to `null` (placeholder).\n */\nexport type UnauthorizedHandler = (attemptedPath: string) => string | null;\n\nexport const AUTH_UNAUTHORIZED = new InjectionToken<UnauthorizedHandler | null>(\n 'AUTH_UNAUTHORIZED',\n {\n providedIn: 'root',\n factory: () => null,\n },\n);\n\n/** A distribution registers a login redirect for gated content routes. */\nexport function provideUnauthorizedRedirect(\n handler: UnauthorizedHandler,\n): Provider {\n return { provide: AUTH_UNAUTHORIZED, useValue: handler };\n}\n\nexport function accessCanMatch(access: AccessRequirement): CanMatchFn {\n return (_route, segments) => {\n if (inject(AuthContext).meets(access)) {\n return true;\n }\n const attempted = segments.map((s) => s.path).join('/');\n const redirect = inject(AUTH_UNAUTHORIZED)?.(attempted) ?? null;\n return redirect ? inject(Router).parseUrl(redirect) : false;\n };\n}\n","import { inject } from '@angular/core';\nimport type { CanActivateFn } from '@angular/router';\nimport { WORKSPACE_CLAIMS } from '../../../foundation/workspace-claims';\nimport { normalizePath } from '../content-path';\n\nexport const settleWorkspace: CanActivateFn = async (_route, state) => {\n const claims = inject(WORKSPACE_CLAIMS);\n await claims.settle(normalizePath(state.url));\n return true;\n};\n","import { DOCUMENT } from '@angular/common';\nimport { Component, computed, effect, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter, map } from 'rxjs/operators';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { PRODUCT_IDENTITY } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../plugin/contribution-registry';\nimport { ContentSecondaryPane } from '../regions/content/content-secondary-pane';\nimport { paneLabelOf, resolveTitle } from '../regions/pane/drag/pane-label';\nimport { LocaleService } from '../i18n/locale.service';\nimport { popoutTargetFromUrl } from './popout-path';\n\n@Component({\n selector: 'lw-popout-view',\n imports: [ContentSecondaryPane],\n templateUrl: './popout-view.html',\n host: { class: 'block h-full min-h-0' },\n})\nexport class PopoutView {\n private readonly router = inject(Router);\n private readonly registry = inject(ContributionRegistry);\n private readonly transloco = inject(TranslocoService);\n private readonly locale = inject(LocaleService);\n private readonly product = inject(PRODUCT_IDENTITY);\n private readonly document = inject(DOCUMENT);\n\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map((event) => event.urlAfterRedirects),\n ),\n { initialValue: this.router.url },\n );\n\n protected readonly target = computed(\n () => popoutTargetFromUrl(this.url()) ?? '',\n );\n\n private readonly translations = toSignal(this.transloco.events$, {\n initialValue: null,\n });\n\n constructor() {\n effect(() => {\n this.locale.lang();\n this.translations();\n const label = paneLabelOf(this.registry, this.target());\n const title = resolveTitle(label, (key) => this.transloco.translate(key));\n this.document.title = `${title} — ${this.product.name}`;\n });\n }\n}\n","<lw-content-secondary-pane\n [path]=\"target()\"\n variant=\"content\"\n data-testid=\"popout-surface\"\n/>\n","import { Location } from '@angular/common';\nimport { effect, inject, Injector, Service, untracked } from '@angular/core';\nimport { Route, Router, Routes } from '@angular/router';\nimport { ContentRoute } from '@loomweaver/plugin-sdk';\nimport {\n ContributionRegistry,\n RegisteredContentRoute,\n} from '../../../plugin/contribution-registry';\nimport { AuthContext } from '../../../auth/auth-context';\nimport { ContainerPaneHost } from '../../pane/container/container-pane-host';\nimport { ContentSubStub } from './content-sub-stub';\nimport { SurfaceRouteStub } from './surface-route-stub';\nimport { AuthRequiredView } from '../access/auth-required-view';\nimport { RouteUnavailableView } from '../access/route-unavailable-view';\nimport { accessCanMatch } from '../access/content-access';\nimport { BootAddress } from './boot-address';\nimport { ContentReuseStrategy } from './content-reuse-strategy';\nimport { settleWorkspace } from './settle-workspace.guard';\nimport {\n RetentionDefault,\n routeRetains,\n SURFACE_RETENTION,\n} from '../../pane/retention/retention-policy';\nimport { containerChildren } from '../../pane/container/container-children';\nimport { matchRoute, normalizePath, segmentsOf } from '../content-path';\nimport { POPOUT_PREFIX } from '../../../popout/popout-path';\nimport { PopoutView } from '../../../popout/popout-view';\n\nexport function buildContentRoutes(\n contentRoutes: readonly RegisteredContentRoute[],\n omitted: readonly ContentRoute[] = [],\n retention: RetentionDefault = 'destroy',\n): Routes {\n const placeholders: Routes = omitted.map((route) => ({\n path: route.path,\n component: RouteUnavailableView,\n data: { content: true, routePlaceholder: true },\n }));\n return [...buildRegisteredRoutes(contentRoutes, retention), ...placeholders];\n}\n\nfunction surfaceRoute(\n route: RegisteredContentRoute,\n retained: boolean,\n): Partial<Route> {\n if (route.container !== undefined) {\n return { component: ContainerPaneHost };\n }\n if (route.iframe !== undefined || retained) {\n return { component: SurfaceRouteStub };\n }\n return route.loadComponent\n ? { loadComponent: route.loadComponent }\n : { component: route.component };\n}\n\nfunction subStub(path: string, pathMatch?: 'full'): Route {\n return {\n path,\n ...(pathMatch ? { pathMatch } : {}),\n component: ContentSubStub,\n data: { content: true, sub: true },\n };\n}\n\nfunction containerSubs(route: RegisteredContentRoute): readonly string[] {\n return containerChildren(route.container)\n .map((child) => child.segment)\n .filter((segment): segment is string => segment !== undefined);\n}\n\nfunction childRoutes(route: RegisteredContentRoute): Routes {\n const subs = [...(route.subRoutes ?? []), ...containerSubs(route)];\n const children: Routes = subs.map((sub) => subStub(sub));\n if (subs.length) {\n children.unshift(subStub('', 'full'));\n }\n if (route.rest === true) {\n children.push(subStub('**'));\n }\n return children;\n}\n\nfunction buildRegisteredRoutes(\n contentRoutes: readonly RegisteredContentRoute[],\n retention: RetentionDefault,\n): Routes {\n return contentRoutes.flatMap((route) => {\n const retained = routeRetains(route, retention);\n const angular: Route = {\n path: route.path,\n ...surfaceRoute(route, retained),\n canActivate: [settleWorkspace],\n data: {\n content: true,\n chromeless: route.chromeless,\n iframe: route.iframe,\n container: route.container,\n pluginId: route.pluginId,\n retain: retained,\n },\n };\n const children = childRoutes(route);\n if (children.length) {\n angular.children = children;\n }\n\n if (route.access) {\n angular.canMatch = [accessCanMatch(route.access)];\n const placeholder: Route = {\n path: route.path,\n component: AuthRequiredView,\n data: {\n content: true,\n authPlaceholder: true,\n chromeless: route.chromeless,\n },\n };\n return [angular, placeholder];\n }\n return [angular];\n });\n}\n\n@Service()\nexport class ContentRouter {\n private readonly registry = inject(ContributionRegistry);\n private readonly router = inject(Router);\n private readonly location = inject(Location);\n private readonly bootAddress = inject(BootAddress);\n private readonly injector = inject(Injector);\n private readonly reuse = inject(ContentReuseStrategy);\n private readonly auth = inject(AuthContext);\n private readonly retention = inject(SURFACE_RETENTION);\n private started = false;\n private lastRoutes: readonly ContentRoute[] = [];\n private lastOmitted: readonly ContentRoute[] = [];\n\n private pendingDeepLink: string | null = null;\n private userNavigated = false;\n\n start(): void {\n if (this.started) {\n return;\n }\n this.started = true;\n\n const deepLink = this.bootAddress.path;\n this.pendingDeepLink = normalizePath(deepLink) === '' ? null : deepLink;\n this.location.subscribe(() => {\n this.userNavigated = true;\n });\n\n this.lastRoutes = this.registry.contentRoutes();\n this.lastOmitted = this.registry.omittedContentRoutes();\n this.applyConfig(this.lastRoutes, this.lastOmitted);\n this.router.initialNavigation();\n\n effect(\n () => {\n const routes = this.registry.contentRoutes();\n const omitted = this.registry.omittedContentRoutes();\n if (routes === this.lastRoutes && omitted === this.lastOmitted) {\n return;\n }\n this.lastRoutes = routes;\n this.lastOmitted = omitted;\n this.applyConfig(routes, omitted);\n\n this.reuse.pruneExcept((key) => matchRoute(routes, key) !== undefined);\n this.retryDeepLink();\n },\n { injector: this.injector },\n );\n\n let firstAuthRun = true;\n effect(\n () => {\n this.auth.state();\n if (firstAuthRun) {\n firstAuthRun = false;\n return;\n }\n untracked(() => {\n const current = matchRoute(\n this.registry.contentRoutes(),\n this.router.url,\n );\n if (!current?.access) {\n return;\n }\n void this.router\n .navigateByUrl(this.router.url, { onSameUrlNavigation: 'reload' })\n .catch(() => undefined);\n });\n },\n { injector: this.injector },\n );\n }\n\n private applyConfig(\n routes: readonly RegisteredContentRoute[],\n omitted: readonly ContentRoute[],\n ): void {\n this.router.resetConfig([\n { path: `${POPOUT_PREFIX}/**`, component: PopoutView },\n ...buildContentRoutes(routes, omitted, this.retention),\n ]);\n }\n\n private retryDeepLink(): void {\n const target = this.pendingDeepLink;\n if (!target) {\n return;\n }\n const here = normalizePath(this.router.url);\n if (here === normalizePath(target) || this.userNavigated) {\n this.pendingDeepLink = null;\n return;\n }\n\n const matched = matchRoute(this.lastRoutes, target);\n if (matched === undefined || segmentsOf(matched.path).length === 0) {\n return;\n }\n void this.router\n .navigateByUrl(target)\n .then((ok) => {\n if (ok) {\n this.pendingDeepLink = null;\n }\n })\n .catch(() => {\n this.pendingDeepLink = null;\n });\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { effect, inject, Injector, Service, untracked } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { isPopoutUrl } from '../../../popout/popout-path';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { normalizePath, tabRootOf } from '../../content/content-path';\nimport { collectTabPaths } from '../tree/pane-queries';\nimport { PaneChromeService } from '../chrome/pane-chrome.service';\nimport { CONTAINER_DOCK_PREFIX, isContainerDock } from './container-children';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { PaneContainersService } from './pane-containers.service';\n\n@Service()\nexport class ContainerDockGc {\n private readonly paneTree = inject(PaneTreeService);\n private readonly containers = inject(PaneContainersService);\n private readonly chrome = inject(PaneChromeService);\n private readonly registry = inject(ContributionRegistry);\n private readonly router = inject(Router);\n private readonly injector = inject(Injector);\n private readonly popout = isPopoutUrl(\n inject(DOCUMENT).location?.pathname ?? '',\n );\n private started = false;\n\n start(): void {\n if (this.started || this.popout) {\n return;\n }\n this.started = true;\n effect(\n () => {\n const trees = this.paneTree.dockTrees();\n const containerDocks = Object.keys(trees).filter(isContainerDock);\n if (containerDocks.length === 0) {\n return;\n }\n const open = new Set(\n Object.entries(trees)\n .filter(([dock]) => !isContainerDock(dock))\n .flatMap(([, tree]) => collectTabPaths(tree)),\n );\n untracked(() => {\n const active = tabRootOf(\n this.registry.contentRoutes(),\n normalizePath(this.router.url),\n );\n for (const dock of containerDocks) {\n const contentPath = dock.slice(CONTAINER_DOCK_PREFIX.length);\n if (contentPath === active || open.has(contentPath)) {\n continue;\n }\n this.containers.dropContainer(dock);\n this.chrome.clearMinimized(dock);\n }\n });\n },\n { injector: this.injector },\n );\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { effect, inject, Injector, Service, untracked } from '@angular/core';\nimport { ContentRoute, View } from '@loomweaver/plugin-sdk';\nimport { isPopoutUrl } from '../../../popout/popout-path';\nimport { ActiveWorkspaceService } from '../../../workspace/active-workspace.service';\nimport { ContributionRegistry } from '../../../plugin/contribution-registry';\nimport { NotificationService } from '../../../notifications/notification.service';\nimport { ContentReuseStrategy } from '../../content/routing/content-reuse-strategy';\nimport { tabRootOf } from '../../content/content-path';\nimport { PaneNode } from '../tree/pane-node';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { RetainedViewStash } from './retained-view-stash';\nimport {\n PRIMARY_RETENTION_PREFIX,\n dirtySurfaceOf,\n instanceDirty,\n paneRetentionScope,\n resolvableSurfacePath,\n saveOnHidePath,\n} from './retention-policy';\n\ninterface ParkedInstance {\n readonly instance?: unknown;\n readonly retained: boolean;\n readonly path: string;\n readonly dirty: boolean;\n readonly evict: () => void;\n readonly tabLive: boolean;\n readonly parkedElsewhere: boolean;\n}\n\n@Service()\nexport class RetentionGc {\n private readonly paneTree = inject(PaneTreeService);\n private readonly registry = inject(ContributionRegistry);\n private readonly stash = inject(RetainedViewStash);\n private readonly reuse = inject(ContentReuseStrategy);\n private readonly notifications = inject(NotificationService);\n private readonly injector = inject(Injector);\n private readonly workspace = inject(ActiveWorkspaceService);\n private readonly popout = isPopoutUrl(\n inject(DOCUMENT).location?.pathname ?? '',\n );\n private autoSaved = new Set<unknown>();\n private started = false;\n\n start(): void {\n if (this.started || this.popout) {\n return;\n }\n this.started = true;\n effect(\n () => {\n this.stash.version();\n this.reuse.version();\n const trees = this.paneTree.dockTrees();\n const routes = this.registry.contentRoutes();\n const views = this.registry.views();\n const open = openPathsByScope(trees);\n const active = this.workspace.id();\n const parked = [\n ...this.parkedStash(open, routes, views, active),\n ...this.parkedHandles(),\n ];\n untracked(() => this.settle(parked, routes, views));\n },\n { injector: this.injector },\n );\n }\n\n private parkedStash(\n open: Map<string, Set<string>>,\n routes: readonly ContentRoute[],\n views: readonly View[],\n active: string,\n ): ParkedInstance[] {\n return this.stash.parked().map((entry) => ({\n instance: entry.instance,\n retained: entry.retained,\n path: pathOfKey(entry.key),\n dirty: instanceDirty(entry.instance),\n evict: () => this.stash.evictParked(entry.key),\n tabLive: stashKeyLive(entry.key, open, routes, views),\n parkedElsewhere: entry.workspace !== active,\n }));\n }\n\n private parkedHandles(): ParkedInstance[] {\n return this.reuse.parkedHandles().map((handle) => ({\n instance: handle.instance,\n retained: false,\n path: handle.key,\n dirty: instanceDirty(handle.instance),\n evict: () => this.reuse.evict(handle.key),\n tabLive: true,\n parkedElsewhere: false,\n }));\n }\n\n private settle(\n parked: readonly ParkedInstance[],\n routes: readonly ContentRoute[],\n views: readonly View[],\n ): void {\n const stillParked = new Set(parked.map((entry) => entry.instance));\n this.autoSaved = new Set(\n [...this.autoSaved].filter((instance) => stillParked.has(instance)),\n );\n for (const entry of parked) {\n if (!entry.tabLive && !entry.parkedElsewhere) {\n entry.evict();\n continue;\n }\n if (entry.dirty) {\n this.autoSaveOnce(entry, routes, views);\n continue;\n }\n if (!entry.retained) {\n entry.evict();\n }\n }\n }\n\n private autoSaveOnce(\n entry: ParkedInstance,\n routes: readonly ContentRoute[],\n views: readonly View[],\n ): void {\n if (\n this.autoSaved.has(entry.instance) ||\n !saveOnHidePath(routes, views, entry.path)\n ) {\n return;\n }\n const save = dirtySurfaceOf(entry.instance)?.surfaceSave;\n if (!save) {\n return;\n }\n this.autoSaved.add(entry.instance);\n save.call(entry.instance).catch((error: unknown) => {\n console.error('saveOn:hide failed — the surface stays dirty', error);\n this.notifications.show({\n message: 'retention.saveFailed',\n kind: 'warning',\n });\n });\n }\n}\n\nfunction pathOfKey(key: string): string {\n return key.split('|')[1] ?? '';\n}\n\nfunction stashKeyLive(\n key: string,\n open: Map<string, Set<string>>,\n routes: readonly ContentRoute[],\n views: readonly View[],\n): boolean {\n if (key.startsWith(PRIMARY_RETENTION_PREFIX)) {\n return true;\n }\n const [scope, path] = key.split('|');\n if (!tabOpen(open.get(scope), routes, path)) {\n return false;\n }\n return resolvableSurfacePath(routes, views, path);\n}\n\nfunction tabOpen(\n paths: ReadonlySet<string> | undefined,\n routes: readonly ContentRoute[],\n path: string,\n): boolean {\n if (!paths) {\n return false;\n }\n return (\n paths.has(path) ||\n [...paths].some((open) => tabRootOf(routes, open) === path)\n );\n}\n\nfunction openPathsByScope(\n trees: Record<string, PaneNode>,\n): Map<string, Set<string>> {\n const open = new Map<string, Set<string>>();\n for (const [dock, tree] of Object.entries(trees)) {\n collectLeafPaths(dock, tree, open);\n }\n return open;\n}\n\nfunction collectLeafPaths(\n dock: string,\n node: PaneNode,\n open: Map<string, Set<string>>,\n): void {\n if (node.kind === 'split') {\n collectLeafPaths(dock, node.first, open);\n collectLeafPaths(dock, node.second, open);\n return;\n }\n const scope = paneRetentionScope(dock, node.id);\n let paths = open.get(scope);\n if (!paths) {\n paths = new Set<string>();\n open.set(scope, paths);\n }\n for (const tab of node.tabs) {\n paths.add(tab.path);\n }\n}\n","import {\n EnvironmentProviders,\n Provider,\n inject,\n provideAppInitializer,\n} from '@angular/core';\nimport {\n RouteReuseStrategy,\n Routes,\n provideRouter,\n withDisabledInitialNavigation,\n} from '@angular/router';\nimport { ContentRouter } from './content-router';\nimport { ContentReuseStrategy } from './content-reuse-strategy';\nimport { ContainerDockGc } from '../../pane/container/container-dock-gc';\nimport { RetentionGc } from '../../pane/retention/retention-gc';\nimport { RetentionUnloadGuard } from '../../pane/retention/retention-unload-guard';\nimport { ContainerPaneHost } from '../../pane/container/container-pane-host';\nimport { CONTAINER_PANE_HOST } from '../../pane/container/container-context';\n\n/**\n * The distribution's router, set up for the content area — call this **instead of**\n * `provideRouter([])`. It bundles the three pieces that make plugin-contributed content routes work\n * as one foolproof unit, so a distribution author cannot forget the initial-navigation flag:\n *\n * - `withDisabledInitialNavigation()` — the router does not navigate until the plugin routes exist.\n * - `ContentReuseStrategy` — keeps a surface's instance across tab/perspective switches when its\n * retention policy says so (`retain: 'always'` or a `retention: 'retain'` default).\n * - an app-initializer that runs {@link ContentRouter.start} after plugins activate: it mirrors the\n * registered content routes into the router and then performs the deferred initial navigation.\n *\n * Pass `extraRoutes` for any non-content routes the distribution owns.\n */\nexport function provideShellRouter(\n extraRoutes: Routes = [],\n): (Provider | EnvironmentProviders)[] {\n return [\n provideRouter([...extraRoutes], withDisabledInitialNavigation()),\n\n { provide: RouteReuseStrategy, useExisting: ContentReuseStrategy },\n { provide: CONTAINER_PANE_HOST, useValue: ContainerPaneHost },\n provideAppInitializer(() => {\n inject(ContentRouter).start();\n inject(ContainerDockGc).start();\n inject(RetentionGc).start();\n inject(RetentionUnloadGuard).start();\n }),\n ];\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { BAR_CONTEXT } from '../regions/bar/bar-context';\nimport { CommandService } from './command.service';\nimport { PALETTE_COMMAND_ID } from './command-palette';\n\n@Component({\n selector: 'lw-command-palette-entry',\n imports: [TranslocoPipe],\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n templateUrl: './command-palette-entry.html',\n})\nexport class CommandPaletteEntry {\n private readonly commands = inject(CommandService);\n\n protected readonly compact = inject(BAR_CONTEXT, { optional: true })?.dock === 'bottom';\n\n protected readonly shortcut = computed<string | undefined>(() =>\n this.commands.shortcutOf(\n this.commands.commands().find((entry) => entry.id === PALETTE_COMMAND_ID),\n ),\n );\n\n protected open(): void {\n this.commands.execute(PALETTE_COMMAND_ID);\n }\n}\n","<button\n type=\"button\"\n (click)=\"open()\"\n data-testid=\"command-palette-entry\"\n [class]=\"compact ? 'flex items-center rounded px-1.5 py-0.5 text-content-faint transition-colors hover:bg-surface-overlay hover:text-content' : 'lw-segmented'\"\n [attr.aria-label]=\"'palette.title' | transloco\"\n>\n <span\n [class]=\"compact ? 'relative flex items-center gap-1' : 'lw-segmented-item w-auto gap-2 px-1.5'\"\n >\n <lw-icon name=\"search\" size=\"1rem\" />\n @if (shortcut(); as chord) {\n <kbd class=\"text-[0.6875rem] leading-tight text-content-faint\">{{ chord }}</kbd>\n }\n <lw-tooltip\n [text]=\"'palette.title' | transloco\"\n [position]=\"compact ? 'top' : 'bottom'\"\n />\n </span>\n</button>\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { BarSlot } from '@loomweaver/plugin-sdk';\nimport { provideBarItems } from '../foundation/bar-item';\nimport { CommandPaletteEntry } from './command-palette-entry';\n\n/** Where the built command-palette entry goes (LWF-05). Defaults: top bar, end slot, order 5. */\nexport interface CommandPaletteEntryOptions {\n /**\n * Target Bar region id. Default `'top-bar'`. The badge adapts to the bar it lands in: a top bar is\n * a fixed band, so there it pins the shared bar-control height and lines up with the theme and\n * language controls; a bottom bar takes the height of its tallest item, so there it renders like a\n * plain bar item rather than growing the bar and costing the content area.\n */\n readonly bar?: string;\n /** Which Bar slot the entry renders in. Default `'end'`. */\n readonly slot?: BarSlot;\n /** Lower renders first within the slot. Default `5` (left of the built update/language/theme items). */\n readonly order?: number;\n}\n\n/**\n * Places a built command-palette entry in a Bar (LWF-05) — a badge-styled affordance (search icon +\n * the palette's OS-correct shortcut) that opens `shell.commandPalette`, correct-by-construction and\n * without a distribution component. Opt-in: omit it for a palette that opens only by shortcut. Uses the\n * `shell.commandPaletteEntry` bar-item id, so `provideShell({ omit: ['shell.commandPaletteEntry'] })`\n * removes it.\n */\nexport function provideCommandPaletteEntry(\n options: CommandPaletteEntryOptions = {},\n): EnvironmentProviders {\n return makeEnvironmentProviders(\n provideBarItems({\n id: 'shell.commandPaletteEntry',\n bar: options.bar ?? 'top-bar',\n slot: options.slot ?? 'end',\n order: options.order ?? 5,\n component: CommandPaletteEntry,\n }),\n );\n}\n","import { inject, Service } from '@angular/core';\nimport { VIEW_PANE_PREFIX } from '../regions/pane/tree/pane-address';\nimport { findLeafWithTab } from '../regions/pane/tree/pane-queries';\nimport { CONTAINER_DOCK_PREFIX } from '../regions/pane/container/container-children';\nimport { CONTENT_DOCK } from '../regions/pane/tree/pane-address';\nimport { PaneTreeService } from '../regions/pane/tree/pane-tree.service';\nimport { ContentTabsService } from '../regions/content/tabs/content-tabs.service';\nimport { PanelState } from '../regions/panel/panel-state';\n\n@Service()\nexport class SurfaceRevealService {\n private readonly paneTree = inject(PaneTreeService);\n private readonly tabs = inject(ContentTabsService);\n private readonly panels = inject(PanelState);\n\n reveal(surfaceId: string): void {\n const path = VIEW_PANE_PREFIX + surfaceId;\n for (const [dock, tree] of Object.entries(this.paneTree.dockTrees())) {\n if (dock.startsWith(CONTAINER_DOCK_PREFIX)) {\n continue;\n }\n const leaf = findLeafWithTab(tree, path);\n if (!leaf) {\n continue;\n }\n this.activate(dock, leaf.id, path);\n return;\n }\n }\n\n private activate(dock: string, paneId: string, path: string): void {\n if (\n dock === CONTENT_DOCK &&\n paneId === this.paneTree.primaryId(CONTENT_DOCK)\n ) {\n this.tabs.activateViewTab(path);\n return;\n }\n this.paneTree.setActiveTab(dock, paneId, path);\n if (dock !== CONTENT_DOCK) {\n this.panels.expand(dock);\n }\n }\n}\n","import { isDevMode } from '@angular/core';\nimport { Command, Surface } from '@loomweaver/plugin-sdk';\nimport { LayoutRegion, RegionType } from '../layout/layout';\nimport { View } from '../layout/view';\nimport { containerLayout } from '../regions/pane/container/container-layout';\nimport { CONTAINER_CHILD_REGION } from './surface-normalize';\n\nexport function warnUndescribedCallable(pluginId: string, command: Command): void {\n if (!isDevMode() || command.callable !== true) {\n return;\n }\n if (command.description === undefined) {\n console.warn(\n `Plugin \"${pluginId}\" opened command \"${command.id}\" to other callers but gave it no ` +\n `description — the caller it opened itself to has nothing to go on but an id, since the ` +\n `title labels a control rather than explaining the action.`,\n );\n }\n for (const argument of command.arguments ?? []) {\n if (argument.description === '') {\n console.warn(\n `Plugin \"${pluginId}\": command \"${command.id}\" declares the argument ` +\n `\"${argument.name}\" with an empty description, which tells a caller nothing about what ` +\n `to put there.`,\n );\n }\n }\n}\n\nexport function warnUnsupportedRetain(pluginId: string, surface: Surface): void {\n if (!isDevMode()) {\n return;\n }\n if (surface.retain !== undefined && surface.container !== undefined) {\n console.warn(\n `Plugin \"${pluginId}\" declares retain: '${surface.retain}' on surface \"${surface.id}\" — ` +\n `a container surface is not retainable and is always rebuilt when hidden. ` +\n `The declaration is ignored.`,\n );\n }\n if (surface.saveOn !== undefined && surface.iframe !== undefined) {\n console.warn(\n `Plugin \"${pluginId}\" declares saveOn: '${surface.saveOn}' on surface \"${surface.id}\" — ` +\n `a sandboxed surface has no save channel across the RPC boundary, so the host cannot save it ` +\n `for you. Save from inside the surface and push setDirty(false). The declaration is ignored.`,\n );\n }\n if (\n surface.retain === 'always' &&\n (surface.routable?.subRoutes?.length ?? 0) > 0\n ) {\n console.warn(\n `Plugin \"${pluginId}\" declares retain: 'always' on surface \"${surface.id}\", which also ` +\n `declares subRoutes. A retained surface mounts outside the router — its route activates only ` +\n `a stub — so a <router-outlet> inside it stays inert and sub-routes will not render there. ` +\n `Read the sub-segment from the address instead, or drop one of the two declarations.`,\n );\n }\n}\n\nexport function warnUnusableContainerLayout(\n pluginId: string,\n surface: Surface,\n): void {\n if (!isDevMode() || surface.container === undefined) {\n return;\n }\n const problems: string[] = [];\n const { node } = containerLayout(\n '',\n surface.container,\n problems,\n `Plugin \"${pluginId}\": surface \"${surface.id}\"`,\n );\n for (const problem of problems) {\n console.warn(problem);\n }\n if (node === null && surface.container.initial !== undefined) {\n console.warn(\n `Plugin \"${pluginId}\": surface \"${surface.id}\" declares an initial arrangement that ` +\n `holds nothing usable — the container opens empty and the user picks its children.`,\n );\n }\n}\n\nexport function warnUnlessPanelRegion(\n pluginId: string,\n regions: readonly LayoutRegion[],\n view: View,\n): void {\n if (!isDevMode()) {\n return;\n }\n if (view.region === CONTAINER_CHILD_REGION) {\n return;\n }\n const region = regions.find((r) => r.id === view.region);\n if (region?.type !== 'panel') {\n const detail = region ? `a '${region.type}' region` : 'an unknown region';\n console.warn(\n `Plugin \"${pluginId}\" registered surface \"${view.id}\" with home dock \"${view.region}\" — ` +\n `${detail}. A non-routable surface renders only in 'panel' regions; for the content area ` +\n `add routable: { path }. This surface will not appear.`,\n );\n }\n}\n\nexport function warnUnlessRegionType(\n pluginId: string,\n regions: readonly LayoutRegion[],\n itemId: string,\n regionId: string,\n expected: RegionType,\n): void {\n if (!isDevMode()) {\n return;\n }\n const region = regions.find((r) => r.id === regionId);\n if (region?.type === expected) {\n return;\n }\n const detail = region\n ? `a '${region.type}' region`\n : 'a region this distribution does not declare';\n console.warn(\n `Plugin \"${pluginId}\" registered \"${itemId}\" into '${regionId}' — ${detail}. ` +\n `A '${expected}' item renders only in a '${expected}' region, so this will not appear. ` +\n `Check the region ids in the distribution's provideLayout().`,\n );\n}\n","import { ContributionRegistry, Disposable } from './contribution-registry';\nimport { BarItem } from '../foundation/bar-item';\nimport { RailItem } from '../foundation/rail-item';\nimport { LayoutRegion } from '../layout/layout';\nimport { PluginContext, PluginHost, PluginSession, PluginUi } from './plugin';\nimport {\n ActiveContent,\n Capability,\n CapabilityError,\n Command,\n CommandArguments,\n CommandOutcome,\n InvocableCommand,\n MenuItem,\n OpenTabInput,\n PluginState,\n StateHandle,\n Surface,\n} from '@loomweaver/plugin-sdk';\nimport {\n entryToContentRoute,\n entryToView,\n isRoutableSurface,\n surfaceToEntry,\n} from './surface-normalize';\nimport { AuthContext } from '../auth/auth-context';\nimport { segmentsOf } from '../regions/content/content-path';\nimport { collidingParam } from '../regions/content/tabs/tab-address';\nimport { ContentTabsService } from '../regions/content/tabs/content-tabs.service';\nimport { DialogService } from '../dialog/dialog.service';\nimport { NotificationService } from '../notifications/notification.service';\nimport { MenuService } from '../menu/menu.service';\nimport { SettingsService } from '../settings/settings.service';\nimport { SettingsSection } from '../settings/settings-model';\nimport { VersionService } from '../version/version.service';\nimport { UpdateService } from '../update/update.service';\nimport { IconRegistry } from '../elements/icon/icon-registry';\nimport { ThemeRegistry } from '../theme/theme-registry';\nimport { SurfaceRevealService } from '../views/surface-reveal.service';\nimport { PluginStateService } from './plugin-state.service';\nimport { CommandInvoker } from '../foundation/command-invoker';\nimport {\n warnUndescribedCallable,\n warnUnlessPanelRegion,\n warnUnlessRegionType,\n warnUnsupportedRetain,\n warnUnusableContainerLayout,\n} from './host-context-warnings';\n\nexport class HostPluginContext implements PluginContext {\n private readonly disposables: Disposable[] = [];\n\n readonly ui: PluginUi;\n\n readonly state: PluginState;\n\n private readonly hostFacts: PluginHost;\n private readonly sessionFacts: PluginSession;\n\n constructor(\n private readonly pluginId: string,\n private readonly isGranted: (capability: Capability) => boolean,\n private readonly registry: ContributionRegistry,\n dialogs: DialogService,\n notifications: NotificationService,\n private readonly settings: SettingsService,\n version: VersionService,\n update: UpdateService,\n private readonly tabs: ContentTabsService,\n\n private readonly regions: readonly LayoutRegion[],\n private readonly icons: IconRegistry,\n auth: AuthContext,\n menu: MenuService,\n private readonly themes: ThemeRegistry,\n private readonly reveal: SurfaceRevealService,\n pluginState: PluginStateService,\n private readonly invocation: CommandInvoker,\n ) {\n this.ui = {\n confirm: (options) => {\n this.require('ui');\n return dialogs.confirm(options);\n },\n alert: (options) => {\n this.require('ui');\n return dialogs.alert(options);\n },\n prompt: (options) => {\n this.require('ui');\n return dialogs.prompt(options);\n },\n open: (component, options) => {\n this.require('ui');\n return dialogs.open(component, options);\n },\n progress: (options) => {\n this.require('ui');\n return dialogs.progress(options);\n },\n withProgress: (options, work) => {\n this.require('ui');\n return dialogs.withProgress(options, work);\n },\n toast: (input) => {\n this.require('ui');\n\n const id =\n input.id === undefined ? undefined : `${this.pluginId}.${input.id}`;\n return notifications.show({ ...input, id });\n },\n openSettings: () => {\n this.require('ui');\n return settings.open();\n },\n openMenu: (items, at) => {\n this.require('ui');\n\n const entries = items.map((item, index) => ({\n key: String(index),\n label: item.label,\n icon: item.icon,\n }));\n menu.openList(entries, at, (key) => items[Number(key)]?.run());\n },\n };\n this.hostFacts = {\n version: version.version,\n updateAvailable: update.updateAvailable,\n updatesEnabled: update.enabled,\n checkForUpdate: () => update.checkForUpdate(),\n activateUpdate: () => update.activateUpdate(),\n };\n\n const store = pluginState.facade(this.pluginId);\n this.state = {\n watch: <T>(key: string) => this.trackHandle(store.watch<T>(key)),\n };\n\n this.sessionFacts = {\n authenticated: auth.authenticated,\n roles: auth.roles,\n hasRole: (role) => auth.hasRole(role),\n };\n }\n\n get host(): PluginHost {\n this.require('host');\n return this.hostFacts;\n }\n\n get session(): PluginSession {\n this.require('session');\n return this.sessionFacts;\n }\n\n get activeContent(): () => ActiveContent | null {\n this.require('navigation');\n return this.tabs.activeContent;\n }\n\n get invocableCommands(): () => readonly InvocableCommand[] {\n return () =>\n this.invocation.invocable(this.pluginId, this.isGranted('automation'));\n }\n\n invokeCommand(\n id: string,\n args?: CommandArguments,\n ): Promise<CommandOutcome> {\n return this.invocation.invoke(\n this.pluginId,\n this.isGranted('automation'),\n id,\n args,\n );\n }\n\n registerCommand(command: Command): Disposable {\n this.require('contributions');\n warnUndescribedCallable(this.pluginId, command);\n return this.track(this.registry.addCommand(command, this.pluginId));\n }\n\n registerSurface(surface: Surface): Disposable {\n this.require('contributions');\n this.requireNavigationForBroadPrefix(surface);\n warnUnsupportedRetain(this.pluginId, surface);\n warnUnusableContainerLayout(this.pluginId, surface);\n\n const entry = surfaceToEntry(surface);\n if (isRoutableSurface(surface)) {\n const collision = this.followCollision(surface);\n if (collision) {\n console.error(collision);\n return { dispose: () => undefined };\n }\n return this.track(\n this.registry.addContentRoute(\n entryToContentRoute(entry),\n this.pluginId,\n ),\n );\n }\n const view = entryToView(entry);\n warnUnlessPanelRegion(this.pluginId, this.regions, view);\n return this.track(this.registry.addView(view, this.pluginId));\n }\n\n registerBarItem(item: BarItem): Disposable {\n this.require('contributions');\n warnUnlessRegionType(this.pluginId, this.regions, item.id, item.bar, 'bar');\n return this.track(this.registry.addBarItem(item));\n }\n\n registerRailItem(item: RailItem): Disposable {\n this.require('contributions');\n warnUnlessRegionType(this.pluginId, this.regions, item.id, item.rail, 'rail');\n return this.track(this.registry.addRailItem(item));\n }\n\n registerSettingsSection(section: SettingsSection): Disposable {\n this.require('contributions');\n return this.track(this.settings.register(section));\n }\n\n registerMenuItem(item: MenuItem): Disposable {\n this.require('contributions');\n return this.track(this.registry.addMenuItem(item));\n }\n\n contributeIcons(icons: Readonly<Record<string, string>>): Disposable {\n this.require('contributions');\n return this.track(this.icons.register(this.pluginId, icons));\n }\n\n contributeTheme(\n tokens: Readonly<Record<string, string>>,\n dark?: Readonly<Record<string, string>>,\n ): Disposable {\n this.require('theme');\n return this.track(this.themes.register(this.pluginId, tokens, dark));\n }\n\n navigateContent(path: string): void {\n this.require('navigation');\n this.tabs.navigate(path);\n }\n\n openContentTab(input: OpenTabInput): void {\n this.require('navigation');\n this.tabs.open(input);\n }\n\n keepContentTab(path: string): void {\n this.require('navigation');\n this.tabs.keep(path);\n }\n\n pinContentTab(path: string): void {\n this.require('navigation');\n this.tabs.pin(path);\n }\n\n unpinContentTab(path: string): void {\n this.require('navigation');\n this.tabs.unpin(path);\n }\n\n closeContentTab(path: string): void {\n this.require('navigation');\n this.tabs.close(path);\n }\n\n revealSurface(id: string): void {\n this.require('navigation');\n this.reveal.reveal(id);\n }\n\n disposeAll(): void {\n while (this.disposables.length > 0) {\n this.disposables.pop()?.dispose();\n }\n }\n\n private followCollision(surface: Surface): string | null {\n const routable = surface.routable;\n if (routable?.follows !== true) {\n return null;\n }\n for (const other of this.registry.contentRoutes()) {\n if (other.follows !== true || other.path === routable.path) {\n continue;\n }\n const name = collidingParam(routable.path, other.path);\n if (name !== undefined) {\n return (\n `Plugin \"${this.pluginId}\": surface \"${surface.id}\" was refused. Its pattern ` +\n `\"${routable.path}\" and the following surface \"${other.path}\" both use \":${name}\" but differ ` +\n `before it, so the name means two different things and substituting it by name would fill ` +\n `one surface's address with the other's value. Rename the parameter or align the patterns.`\n );\n }\n }\n return null;\n }\n\n private requireNavigationForBroadPrefix(surface: Surface): void {\n const routable = surface.routable;\n if (routable?.rest !== true || segmentsOf(routable.path).length >= 2) {\n return;\n }\n this.require(\n 'navigation',\n `The surface \"${surface.id}\" claims \"${routable.path}\" with rest: true, which owns most of ` +\n `the address space — the surface channel's confinement to its own tab root no longer ` +\n `constrains it, so the grant is required.`,\n );\n }\n\n private require(capability: Capability, reason?: string): void {\n if (!this.isGranted(capability)) {\n throw new CapabilityError(capability, this.pluginId, reason);\n }\n }\n\n private trackHandle<T>(handle: StateHandle<T>): StateHandle<T> {\n this.track({ dispose: () => handle.dispose() });\n return handle;\n }\n\n private track(disposable: Disposable): Disposable {\n this.disposables.push(disposable);\n return disposable;\n }\n}\n","import { isDevMode, Service } from '@angular/core';\nimport { Disposable } from '@loomweaver/plugin-sdk';\nimport {\n hasIcon,\n removeIcon,\n resolveIcon,\n sanitizeIconSvg,\n setIcon,\n} from './icon-registry-global';\n\n@Service()\nexport class IconRegistry {\n register(\n pluginId: string,\n icons: Readonly<Record<string, string>>,\n ): Disposable {\n const added: string[] = [];\n for (const [name, svg] of Object.entries(icons)) {\n if (hasIcon(name)) {\n this.warn(\n `Plugin \"${pluginId}\" tried to contribute icon \"${name}\", but that name is already ` +\n `registered — ignored (first-wins). Pick a unique name.`,\n );\n continue;\n }\n const safe = sanitizeIconSvg(svg);\n if (safe.length === 0) {\n this.warn(\n `Plugin \"${pluginId}\" contributed icon \"${name}\" whose SVG did not survive ` +\n `sanitization — ignored.`,\n );\n continue;\n }\n setIcon(name, safe);\n added.push(name);\n }\n return { dispose: () => added.forEach((name) => removeIcon(name)) };\n }\n\n resolve(name: string): string | undefined {\n return resolveIcon(name);\n }\n\n private warn(message: string): void {\n if (isDevMode()) {\n console.warn(message);\n }\n }\n}\n","import { SurfaceRevealService } from '../views/surface-reveal.service';\nimport { inject, Service } from '@angular/core';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from './contribution-registry';\nimport { HostPluginContext } from './host-plugin-context';\nimport { SHELL_LAYOUT } from '../layout/layout';\nimport { IconRegistry } from '../elements/icon/icon-registry';\nimport { ThemeRegistry } from '../theme/theme-registry';\nimport { ContentTabsService } from '../regions/content/tabs/content-tabs.service';\nimport { DialogService } from '../dialog/dialog.service';\nimport { NotificationService } from '../notifications/notification.service';\nimport { SettingsService } from '../settings/settings.service';\nimport { VersionService } from '../version/version.service';\nimport { UpdateService } from '../update/update.service';\nimport { AuthContext } from '../auth/auth-context';\nimport { MenuService } from '../menu/menu.service';\nimport { PluginStateService } from './plugin-state.service';\nimport { COMMAND_INVOKER } from '../foundation/command-invoker';\n\n@Service()\nexport class HostContextFactory {\n private readonly registry = inject(ContributionRegistry);\n private readonly dialogs = inject(DialogService);\n private readonly notifications = inject(NotificationService);\n private readonly settings = inject(SettingsService);\n private readonly version = inject(VersionService);\n private readonly update = inject(UpdateService);\n private readonly layout = inject(SHELL_LAYOUT);\n private readonly icons = inject(IconRegistry);\n private readonly tabs = inject(ContentTabsService);\n private readonly auth = inject(AuthContext);\n private readonly menu = inject(MenuService);\n private readonly themes = inject(ThemeRegistry);\n private readonly reveal = inject(SurfaceRevealService);\n private readonly state = inject(PluginStateService);\n private readonly invocation = inject(COMMAND_INVOKER);\n\n create(\n pluginId: string,\n isGranted: (capability: Capability) => boolean,\n ): HostPluginContext {\n return new HostPluginContext(\n pluginId,\n isGranted,\n this.registry,\n this.dialogs,\n this.notifications,\n this.settings,\n this.version,\n this.update,\n this.tabs,\n this.layout.regions,\n this.icons,\n this.auth,\n this.menu,\n this.themes,\n this.reveal,\n this.state,\n this.invocation,\n );\n }\n}\n","import { effect, EnvironmentInjector, EnvironmentProviders, inject, InjectionToken, provideEnvironmentInitializer, Provider, Service, untracked } from '@angular/core';\nimport { HostPluginContext } from './host-plugin-context';\nimport { HostContextFactory } from './host-context-factory';\nimport { Plugin } from './plugin';\nimport { CapabilityGrantService } from '../permissions/capability-grant.service';\nimport { PluginEnablementService } from '../plugin-store/lifecycle/plugin-enablement.service';\n\n/** Multi-provider token: each contribution adds one plugin to load. */\nexport const PLUGIN = new InjectionToken<readonly Plugin[]>('PLUGIN');\n\n/**\n * Activates the registered plugins. Trusted in-process runtime (the lowest isolation\n * rung); this abstraction lets a sandboxed runtime slot in later\n * without touching plugins or the host.\n */\n@Service()\nexport class PluginRuntime {\n private readonly grants = inject(CapabilityGrantService);\n\n private readonly enablement = inject(PluginEnablementService);\n\n private readonly factory = inject(HostContextFactory);\n\n private readonly injector = inject(EnvironmentInjector);\n\n private readonly plugins =\n inject<readonly Plugin[]>(PLUGIN, { optional: true }) ?? [];\n\n private readonly active = new Map<string, HostPluginContext>();\n\n private started = false;\n\n activateAll(): void {\n if (this.started) {\n return;\n }\n this.started = true;\n for (const plugin of this.plugins) {\n this.enablement.register(\n plugin.manifest.id,\n plugin.manifest.name ?? plugin.manifest.id,\n );\n }\n this.reconcile(this.enablement.disabled());\n effect(\n () => {\n const disabled = this.enablement.disabled();\n untracked(() => this.reconcile(disabled));\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Unloads a plugin: undoes every contribution it made (via its context's tracked\n * disposables) and runs its optional `deactivate` hook. Idempotent — unknown/inactive\n * ids are a no-op. This is the counterpart to {@link activateAll} that keeps the `active`\n * map from being write-only (a real unload path, needed before an untrusted loader lands).\n */\n deactivate(id: string): void {\n const ctx = this.active.get(id);\n if (!ctx) {\n return;\n }\n ctx.disposeAll();\n this.plugins.find((plugin) => plugin.manifest.id === id)?.deactivate?.();\n this.active.delete(id);\n this.grants.unregister(id);\n }\n\n /** Unloads every active plugin (e.g. on teardown). */\n deactivateAll(): void {\n for (const id of this.active.keys()) {\n this.deactivate(id);\n }\n }\n\n private reconcile(disabled: ReadonlySet<string>): void {\n for (const plugin of this.plugins) {\n const id = plugin.manifest.id;\n const enabled = !disabled.has(id);\n if (enabled && !this.active.has(id)) {\n this.activate(plugin);\n } else if (!enabled && this.active.has(id)) {\n this.deactivate(id);\n }\n }\n }\n\n private activate(plugin: Plugin): void {\n const id = plugin.manifest.id;\n this.grants.register(id, plugin.manifest.capabilities);\n let activating = true;\n const ctx = this.factory.create(id, (capability) =>\n activating\n ? this.grants.isBaseGranted(id, capability)\n : this.grants.isGranted(id, capability),\n );\n this.active.set(id, ctx);\n\n try {\n const result = plugin.activate(ctx);\n if (result instanceof Promise) {\n result.then(\n () => (activating = false),\n (error: unknown) => this.onActivationError(id, error),\n );\n } else {\n activating = false;\n }\n } catch (error) {\n this.onActivationError(id, error);\n }\n }\n\n private onActivationError(id: string, error: unknown): void {\n this.active.get(id)?.disposeAll();\n this.active.delete(id);\n console.error(`Plugin \"${id}\" activation failed`, error);\n }\n}\n\n/** A distribution registers its plugins; they are activated eagerly at startup. */\nexport function providePlugins(\n ...plugins: Plugin[]\n): (Provider | EnvironmentProviders)[] {\n return [\n ...plugins.map((plugin) => ({\n provide: PLUGIN,\n useValue: plugin,\n multi: true,\n })),\n provideEnvironmentInitializer(() => inject(PluginRuntime).activateAll()),\n ];\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { SETTINGS_STORE } from '../../persistence/settings-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\nimport { StateSyncService } from '../../persistence/state-sync.service';\nimport { PluginStateService } from '../../plugin/plugin-state.service';\nimport {\n InstalledPlugin,\n isSameOriginUrl,\n parseInstalledList,\n parseInstalledPlugin,\n} from '../installed-plugin';\n\nconst STORAGE_KEY = 'lw.shell.installed-plugins';\n\n/**\n * The user's installed community plugins. Holds only the state: which catalog entries the\n * user installed, persisted user-locally through the {@link SETTINGS_STORE} — a product that wants\n * tenant-wide or server-held installs implements that in its store backend, the seam does not change.\n * The {@link FramePluginRuntime} reconciles activation against {@link installed} reactively, so an\n * install spawns the plugin at once and an uninstall unloads it, both without a reload. It never\n * depends on the runtime, which keeps the dependency one-way (the {@link PluginEnablementService}\n * precedent).\n */\n@Service()\nexport class PluginInstallService {\n private readonly store = inject(SETTINGS_STORE);\n private readonly sync = inject(StateSyncService);\n private readonly pluginState = inject(PluginStateService);\n\n private readonly entries = signal<readonly InstalledPlugin[]>(\n parseInstalledList(this.store.peek?.(STORAGE_KEY)),\n );\n\n private composedIds: ReadonlySet<string> = new Set();\n\n /** The installed plugins (reactive) — the sandbox runtime reconciles against this. */\n readonly installed = this.entries.asReadonly();\n\n constructor() {\n hydrateAsync(this.store, STORAGE_KEY, (raw) =>\n this.entries.set(parseInstalledList(raw)),\n );\n this.sync.register('settings', STORAGE_KEY, (raw) =>\n this.entries.set(parseInstalledList(raw)),\n );\n }\n\n /** Records the composition-time plugin ids so an install can never shadow a composed plugin. */\n markComposed(ids: readonly string[]): void {\n this.composedIds = new Set([...this.composedIds, ...ids]);\n }\n\n isInstalled(id: string): boolean {\n return this.entries().some((entry) => entry.id === id);\n }\n\n /** The installed entry for an id, or `undefined` — the baseline an update is compared against. */\n find(id: string): InstalledPlugin | undefined {\n return this.entries().find((entry) => entry.id === id);\n }\n\n /**\n * Installs a catalog entry after the user consented to its declared capabilities. Fail-fast: the\n * `entryUrl` must be same-origin (the store is the distribution's own origin) and the id\n * must be neither composed nor already installed. Persisted; the runtime spawns the plugin live.\n */\n install(plugin: InstalledPlugin): void {\n const entry = this.validEntry(plugin);\n if (this.composedIds.has(plugin.id)) {\n throw new Error(\n `Plugin \"${plugin.id}\" is already part of this distribution's composition.`,\n );\n }\n if (this.isInstalled(plugin.id)) {\n throw new Error(`Plugin \"${plugin.id}\" is already installed.`);\n }\n this.persist([...this.entries(), entry]);\n }\n\n /**\n * Replaces an installed entry with a newer catalog entry (the update flow).\n * Same fail-fast validation as {@link install}, except the id must already be installed. The\n * persisted entry carries the plugin's capabilities, so a declaration that grew must be consented\n * to before this is called — see `confirmUpdate`. The runtime respawns the plugin live.\n */\n update(plugin: InstalledPlugin): void {\n const entry = this.validEntry(plugin);\n if (!this.isInstalled(plugin.id)) {\n throw new Error(`Plugin \"${plugin.id}\" is not installed.`);\n }\n this.persist(\n this.entries().map((current) =>\n current.id === entry.id ? entry : current,\n ),\n );\n }\n\n /** Removes an installed plugin (idempotent); the runtime unloads it live. */\n /**\n * Removes an installed plugin and **deletes its own store** — deliberately the\n * opposite of its settings section, which survives so a reinstall finds its configuration. An\n * abandoned draft of a plugin the user just removed is litter; a preference is not.\n */\n uninstall(id: string): void {\n if (!this.isInstalled(id)) {\n return;\n }\n this.persist(this.entries().filter((entry) => entry.id !== id));\n this.pluginState.removePlugin(id);\n }\n\n private validEntry(plugin: InstalledPlugin): InstalledPlugin {\n if (!isSameOriginUrl(plugin.entryUrl)) {\n throw new Error(\n `Plugin \"${plugin.id}\": the entryUrl must be same-origin, got \"${plugin.entryUrl}\".`,\n );\n }\n const entry = parseInstalledPlugin(plugin);\n if (!entry) {\n throw new Error(`Plugin \"${plugin.id}\" is not a valid catalog entry.`);\n }\n return entry;\n }\n\n private persist(next: readonly InstalledPlugin[]): void {\n this.entries.set(next);\n void this.store.set(STORAGE_KEY, JSON.stringify(next));\n }\n}\n","import { signal } from '@angular/core';\nimport {\n FrameSettingControl,\n FrameSettingRow,\n FrameSettingsSection,\n SelectOption,\n SettingControl,\n SettingsSection,\n} from '@loomweaver/plugin-sdk';\nimport { KeyValueStore } from '../../persistence/key-value-store';\nimport { hydrateAsync } from '../../persistence/hydrate';\nimport { StateSyncService } from '../../persistence/state-sync.service';\n\nexport type FrameSettingValue = boolean | string | number;\nexport type FrameSettingValues = Readonly<\n Record<string, FrameSettingValue>\n>;\n\nconst INPUT_TYPES = ['text', 'date', 'email', 'number', 'password'] as const;\n\nfunction sanitizeOptions(raw: unknown): readonly SelectOption[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n return raw\n .filter(\n (option): option is { value: string; label: string } =>\n typeof option === 'object' &&\n option !== null &&\n typeof (option as Record<string, unknown>)['value'] === 'string' &&\n typeof (option as Record<string, unknown>)['label'] === 'string',\n )\n .map((option) => ({ value: option.value, label: option.label }));\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction buildTextControl(\n value: string,\n control: Record<string, unknown>,\n): FrameSettingControl {\n return {\n kind: 'text',\n value,\n inputType: INPUT_TYPES.find((type) => type === control['inputType']),\n placeholder: optionalString(control['placeholder']),\n };\n}\n\nfunction buildSelectControl(\n pluginId: string,\n value: string,\n control: Record<string, unknown>,\n): FrameSettingControl {\n const options = sanitizeOptions(control['options']);\n if (options.length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": a select control needs at least one { value, label } option.`,\n );\n }\n return { kind: 'select', value, options };\n}\n\nfunction buildSliderControl(\n value: number,\n control: Record<string, unknown>,\n): FrameSettingControl {\n return {\n kind: 'slider',\n value,\n min: optionalNumber(control['min']),\n max: optionalNumber(control['max']),\n step: optionalNumber(control['step']),\n };\n}\n\nfunction sanitizeControl(\n pluginId: string,\n raw: unknown,\n): FrameSettingControl {\n const control = (raw ?? {}) as Record<string, unknown>;\n const kind = control['kind'];\n const value = control['value'];\n if (kind === 'toggle' && typeof value === 'boolean') {\n return { kind, value };\n }\n if (kind === 'text' && typeof value === 'string') {\n return buildTextControl(value, control);\n }\n if (kind === 'select' && typeof value === 'string') {\n return buildSelectControl(pluginId, value, control);\n }\n if (kind === 'slider' && typeof value === 'number') {\n return buildSliderControl(value, control);\n }\n throw new Error(\n `Sandbox plugin \"${pluginId}\": a settings control must be toggle/text/select/slider with a matching default 'value'.`,\n );\n}\n\nfunction sanitizeRow(pluginId: string, raw: unknown): FrameSettingRow {\n const row = (raw ?? {}) as Record<string, unknown>;\n if (typeof row['id'] !== 'string' || row['id'].length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": every settings row needs a non-empty 'id'.`,\n );\n }\n if (typeof row['label'] !== 'string' || row['label'].length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": every settings row needs a non-empty 'label'.`,\n );\n }\n return {\n id: row['id'],\n label: row['label'],\n description:\n typeof row['description'] === 'string' ? row['description'] : undefined,\n control: sanitizeControl(pluginId, row['control']),\n };\n}\n\nexport function sanitizeRpcSettingsSection(\n pluginId: string,\n section: FrameSettingsSection,\n): FrameSettingsSection {\n const raw = (section ?? {}) as unknown as Record<string, unknown>;\n if (typeof raw['id'] !== 'string' || raw['id'].length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": registerSettingsSection requires a non-empty 'id'.`,\n );\n }\n if (typeof raw['title'] !== 'string' || raw['title'].length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": registerSettingsSection requires a non-empty 'title'.`,\n );\n }\n if (!Array.isArray(raw['rows']) || raw['rows'].length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": registerSettingsSection requires at least one row.`,\n );\n }\n return {\n id: raw['id'],\n title: raw['title'],\n order: typeof raw['order'] === 'number' ? raw['order'] : undefined,\n rows: raw['rows'].map((row) => sanitizeRow(pluginId, row)),\n };\n}\n\nfunction defaultsOf(wire: FrameSettingsSection): FrameSettingValues {\n const defaults: Record<string, FrameSettingValue> = {};\n for (const row of wire.rows) {\n defaults[row.id] = row.control.value;\n }\n return defaults;\n}\n\nfunction typedOverlay(\n defaults: FrameSettingValues,\n raw: string | undefined,\n): FrameSettingValues {\n if (!raw) {\n return defaults;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null) {\n return defaults;\n }\n const merged: Record<string, FrameSettingValue> = { ...defaults };\n for (const [key, value] of Object.entries(\n parsed as Record<string, unknown>,\n )) {\n if (key in defaults && typeof value === typeof defaults[key]) {\n merged[key] = value as FrameSettingValue;\n }\n }\n return merged;\n } catch {\n return defaults;\n }\n}\n\ninterface FrameSectionDeps {\n readonly pluginId: string;\n readonly wire: FrameSettingsSection;\n readonly group: string;\n readonly store: KeyValueStore;\n readonly sync: StateSyncService;\n readonly notify: (sectionId: string, values: FrameSettingValues) => void;\n}\n\nexport interface FrameSectionHandle {\n readonly section: SettingsSection;\n readonly disposeSync: () => void;\n}\n\nexport function buildFrameSection(\n deps: FrameSectionDeps,\n): FrameSectionHandle {\n const { pluginId, wire, group, store, sync, notify } = deps;\n const key = `lw.plugin-settings:${pluginId}:${wire.id}`;\n const defaults = defaultsOf(wire);\n const values = signal<FrameSettingValues>(\n typedOverlay(defaults, store.peek?.(key)),\n );\n const applyStored = (raw: string | undefined): void => {\n values.set(typedOverlay(defaults, raw));\n notify(wire.id, values());\n };\n if (store.peek) {\n notify(wire.id, values());\n } else {\n hydrateAsync(store, key, applyStored);\n }\n const disposeSync = sync.register('settings', key, applyStored);\n const set = (rowId: string, value: FrameSettingValue): void => {\n values.update((current) => ({ ...current, [rowId]: value }));\n void store.set(key, JSON.stringify(values()));\n notify(wire.id, values());\n };\n const section: SettingsSection = {\n id: `${pluginId}.${wire.id}`,\n title: wire.title,\n group,\n order: wire.order,\n rows: wire.rows.map((row) => ({\n id: `${pluginId}.${wire.id}.${row.id}`,\n label: row.label,\n description: row.description,\n control: hostControl(row, values, set),\n })),\n };\n return { section, disposeSync };\n}\n\nfunction hostControl(\n row: FrameSettingRow,\n values: () => FrameSettingValues,\n set: (rowId: string, value: FrameSettingValue) => void,\n): SettingControl {\n const control = row.control;\n switch (control.kind) {\n case 'toggle':\n return {\n kind: 'toggle',\n value: () => values()[row.id] === true,\n set: (value) => set(row.id, value),\n };\n case 'text':\n return {\n kind: 'text',\n inputType: control.inputType,\n placeholder: control.placeholder,\n value: () => String(values()[row.id] ?? ''),\n set: (value) => set(row.id, value),\n };\n case 'select':\n return {\n kind: 'select',\n options: control.options,\n value: () => String(values()[row.id] ?? control.value),\n set: (value) => set(row.id, value),\n };\n case 'slider':\n return {\n kind: 'slider',\n min: control.min,\n max: control.max,\n step: control.step,\n value: () => Number(values()[row.id] ?? control.value),\n set: (value) => set(row.id, value),\n };\n }\n}\n","import {\n ContainerArea,\n ContainerSpec,\n ContainerTabEntry,\n MenuContext,\n MenuItem,\n NotificationInput,\n NotificationKind,\n OpenTabInput,\n Surface,\n SurfacePresentation,\n} from '@loomweaver/plugin-sdk';\n\nconst MAX_RPC_AREA_DEPTH = 8;\n\nexport function sanitizeRpcSurface(\n pluginId: string,\n surface: Surface,\n permitted?: readonly string[],\n): Surface {\n const raw = (surface ?? {}) as unknown as Record<string, unknown>;\n if (typeof raw['id'] !== 'string' || raw['id'].length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": registerSurface requires a non-empty 'id'.`,\n );\n }\n if (typeof raw['title'] !== 'string' || raw['title'].length === 0) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": registerSurface requires a non-empty 'title'.`,\n );\n }\n if ('component' in raw || 'loadComponent' in raw) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": a component surface cannot cross the RPC boundary — ` +\n `use the { iframe } or { container } form.`,\n );\n }\n if ('access' in raw) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": 'access' does not cross the RPC boundary — ` +\n `a sandboxed surface gates itself from the pushed session state.`,\n );\n }\n const container = sanitizeRpcContainer(raw['container']);\n const iframe = raw['iframe'];\n if (container === undefined) {\n if (typeof iframe !== 'string') {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": registerSurface needs an { iframe } URL or a { container } spec.`,\n );\n }\n const origin = surfaceOrigin(iframe);\n if (origin === null || !permittedOrigins(permitted).has(origin)) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": the iframe surface must be served from an origin this ` +\n `distribution permitted for it, got \"${iframe}\".`,\n );\n }\n }\n\n const routable = sanitizeRpcRoutable(raw['routable']);\n const docks = sanitizeRpcDocks(raw['docks']);\n if (routable === undefined && docks === undefined) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": registerSurface needs 'routable.path' (a URL-addressed surface) ` +\n `or 'docks' (a surface hosted at a dock).`,\n );\n }\n if (container !== undefined && routable === undefined) {\n throw new Error(\n `Sandbox plugin \"${pluginId}\": a container surface must be routable — a container tab holds ` +\n `its own ':id'.`,\n );\n }\n\n const shared: Omit<Surface, keyof SurfacePresentation> = {\n id: raw['id'],\n title: raw['title'],\n icon: typeof raw['icon'] === 'string' ? raw['icon'] : undefined,\n order: typeof raw['order'] === 'number' ? raw['order'] : undefined,\n instanceable: raw['instanceable'] === true ? true : undefined,\n retain:\n raw['retain'] === 'always' || raw['retain'] === 'never'\n ? raw['retain']\n : undefined,\n saveOn: raw['saveOn'] === 'hide' ? 'hide' : undefined,\n closable: raw['closable'] === false ? false : undefined,\n padded: raw['padded'] === false ? false : undefined,\n routable,\n docks,\n };\n return container !== undefined\n ? { ...shared, container }\n : { ...shared, iframe: iframe as string };\n}\n\nfunction sanitizeRpcRoutable(value: unknown): Surface['routable'] | undefined {\n if (typeof value !== 'object' || value === null) {\n return undefined;\n }\n const routable = value as Record<string, unknown>;\n if (typeof routable['path'] !== 'string' || routable['path'].length === 0) {\n return undefined;\n }\n return {\n path: routable['path'],\n chromeless: routable['chromeless'] === true ? true : undefined,\n title:\n typeof routable['title'] === 'string' ? routable['title'] : undefined,\n titleIsLiteral: routable['titleIsLiteral'] === true ? true : undefined,\n icon: typeof routable['icon'] === 'string' ? routable['icon'] : undefined,\n subRoutes: Array.isArray(routable['subRoutes'])\n ? routable['subRoutes'].filter(\n (sub): sub is string => typeof sub === 'string',\n )\n : undefined,\n rest: routable['rest'] === true ? true : undefined,\n follows: routable['follows'] === true ? true : undefined,\n };\n}\n\nfunction sanitizeRpcDocks(value: unknown): readonly string[] | undefined {\n return Array.isArray(value)\n ? value.filter((dock): dock is string => typeof dock === 'string')\n : undefined;\n}\n\nfunction sanitizeRpcContainer(value: unknown): ContainerSpec | undefined {\n if (typeof value !== 'object' || value === null) {\n return undefined;\n }\n const raw = value as Record<string, unknown>;\n const children = Array.isArray(raw['children'])\n ? raw['children'].filter((id): id is string => typeof id === 'string')\n : [];\n return { children, initial: sanitizeRpcInitial(raw['initial']) };\n}\n\nfunction sanitizeRpcInitial(value: unknown): ContainerSpec['initial'] {\n if (Array.isArray(value)) {\n return value.filter((id): id is string => typeof id === 'string');\n }\n return sanitizeRpcArea(value, 1);\n}\n\nfunction sanitizeRpcArea(\n value: unknown,\n depth: number,\n): ContainerArea | undefined {\n if (\n depth > MAX_RPC_AREA_DEPTH ||\n typeof value !== 'object' ||\n value === null\n ) {\n return undefined;\n }\n const raw = value as Record<string, unknown>;\n const size = typeof raw['size'] === 'number' ? { size: raw['size'] } : {};\n if (Array.isArray(raw['tabs'])) {\n return { ...size, tabs: raw['tabs'].flatMap(sanitizeRpcContainerTab) };\n }\n for (const kind of ['rows', 'columns'] as const) {\n const declared = raw[kind];\n if (Array.isArray(declared)) {\n const children = declared\n .map((child) => sanitizeRpcArea(child, depth + 1))\n .filter((child): child is ContainerArea => child !== undefined);\n return { ...size, [kind]: children } as ContainerArea;\n }\n }\n return undefined;\n}\n\nfunction sanitizeRpcContainerTab(value: unknown): ContainerTabEntry[] {\n if (typeof value === 'string') {\n return [value];\n }\n if (typeof value !== 'object' || value === null) {\n return [];\n }\n const raw = value as Record<string, unknown>;\n if (typeof raw['surface'] !== 'string') {\n return [];\n }\n return [\n {\n surface: raw['surface'],\n ...(raw['closable'] === false ? { closable: false } : {}),\n ...(raw['active'] === true ? { active: true } : {}),\n },\n ];\n}\n\nfunction surfaceOrigin(iframe: string): string | null {\n try {\n const origin = new URL(iframe, document.baseURI).origin;\n return origin === 'null' ? null : origin;\n } catch {\n return null;\n }\n}\n\nfunction permittedOrigins(extra: readonly string[] | undefined): Set<string> {\n const permitted = new Set([location.origin]);\n for (const candidate of extra ?? []) {\n try {\n const url = new URL(candidate);\n if (url.protocol === 'https:' || url.protocol === 'http:') {\n permitted.add(url.origin);\n }\n } catch {\n continue;\n }\n }\n return permitted;\n}\n\nexport function sanitizeRpcTabInput(input: OpenTabInput): OpenTabInput {\n const raw = (input ?? {}) as unknown as Record<string, unknown>;\n if (typeof raw['path'] !== 'string' || raw['path'].length === 0) {\n throw new Error(\n 'Sandbox plugin: openContentTab requires a non-empty string path.',\n );\n }\n return {\n path: raw['path'],\n title: typeof raw['title'] === 'string' ? raw['title'] : raw['path'],\n titleIsLiteral: raw['titleIsLiteral'] === true ? true : undefined,\n icon: typeof raw['icon'] === 'string' ? raw['icon'] : undefined,\n preview: raw['preview'] === true ? true : undefined,\n };\n}\n\nexport function sanitizeRpcToastInput(\n input: NotificationInput,\n): NotificationInput {\n const raw = (input ?? {}) as unknown as Record<string, unknown>;\n if (typeof raw['message'] !== 'string' || raw['message'].length === 0) {\n throw new Error(\n 'Sandbox plugin: toast requires a non-empty string message.',\n );\n }\n const kind = raw['kind'];\n const timeoutMs = raw['timeoutMs'];\n return {\n message: raw['message'],\n kind: isNotificationKind(kind) ? kind : undefined,\n timeoutMs:\n typeof timeoutMs === 'number' && Number.isFinite(timeoutMs)\n ? timeoutMs\n : undefined,\n id: typeof raw['id'] === 'string' ? raw['id'] : undefined,\n };\n}\n\nfunction isNotificationKind(value: unknown): value is NotificationKind {\n return (\n value === 'info' ||\n value === 'success' ||\n value === 'warning' ||\n value === 'error'\n );\n}\n\nexport function sanitizeRpcMenuItem(item: MenuItem): MenuItem {\n const raw = (item ?? {}) as unknown as Record<string, unknown>;\n if (typeof raw['menu'] !== 'string' || raw['menu'].length === 0) {\n throw new Error(\n 'Sandbox plugin: registerMenuItem requires a non-empty string menu slot.',\n );\n }\n return {\n id: typeof raw['id'] === 'string' ? raw['id'] : undefined,\n menu: raw['menu'],\n command: typeof raw['command'] === 'string' ? raw['command'] : undefined,\n title: typeof raw['title'] === 'string' ? raw['title'] : undefined,\n group: typeof raw['group'] === 'string' ? raw['group'] : undefined,\n order: typeof raw['order'] === 'number' ? raw['order'] : undefined,\n when: sanitizeMenuContext(raw['when']),\n checkedWhen: sanitizeMenuContext(raw['checkedWhen']),\n };\n}\n\nfunction sanitizeMenuContext(value: unknown): MenuContext | undefined {\n if (typeof value !== 'object' || value === null) {\n return undefined;\n }\n const clean: Record<string, string | number | boolean> = {};\n for (const [key, raw] of Object.entries(value as Record<string, unknown>)) {\n if (\n typeof raw === 'string' ||\n typeof raw === 'number' ||\n typeof raw === 'boolean'\n ) {\n clean[key] = raw;\n }\n }\n return clean;\n}\n","import { Methods } from 'penpal';\nimport {\n CommandArguments,\n CommandOutcome,\n FrameSettingsSection,\n InvocableCommand,\n MenuItem,\n NotificationInput,\n OpenTabInput,\n Surface,\n} from '@loomweaver/plugin-sdk';\nimport { FrameSettingValues } from './sandbox-settings';\nimport { asCommandArguments } from '../../foundation/command-arguments';\n\nconst UNCARRIABLE_ARGUMENTS: CommandOutcome = {\n outcome: 'refused',\n reason: 'invalid-arguments',\n message:\n 'Arguments must be an object of single values or lists of them; anything else cannot cross the ' +\n 'sandbox boundary as the value it was.',\n};\n\nexport type FrameRpc = Methods & {\n registerSurface(surface: Surface): void;\n registerMenuItem(item: MenuItem): void;\n registerSettingsSection(section: FrameSettingsSection): void;\n navigateContent(path: string): void;\n openContentTab(input: OpenTabInput): void;\n keepContentTab(path: string): void;\n pinContentTab(path: string): void;\n unpinContentTab(path: string): void;\n closeContentTab(path: string): void;\n revealSurface(id: string): void;\n invokeCommand(id: string, args?: unknown): Promise<CommandOutcome>;\n invocableCommands(): readonly InvocableCommand[];\n toast(input: NotificationInput): string;\n stateWatch(key: string): void;\n stateSet(key: string, value: unknown): void;\n stateClear(key: string): void;\n stateUnwatch(key: string): void;\n};\n\nexport type FrameRemote = Methods & {\n settingsChanged(sectionId: string, values: FrameSettingValues): void;\n contentTabClosed(path: string): void;\n stateChanged(key: string, value: unknown, loaded: boolean): void;\n};\n\nexport function invokeRpcCommand(\n ctx: {\n invokeCommand(id: string, args?: CommandArguments): Promise<CommandOutcome>;\n },\n id: unknown,\n args: unknown,\n): Promise<CommandOutcome> {\n const carried = args === undefined ? undefined : asCommandArguments(args);\n return carried === null\n ? Promise.resolve(UNCARRIABLE_ARGUMENTS)\n : ctx.invokeCommand(String(id), carried);\n}\n","import { effect, EnvironmentInjector, EnvironmentProviders, inject, InjectionToken, provideEnvironmentInitializer, Provider, Service, untracked } from '@angular/core';\nimport { Connection, WindowMessenger, connect } from 'penpal';\nimport {\n Capability,\n StateHandle,\n} from '@loomweaver/plugin-sdk';\nimport { SETTINGS_STORE } from '../../persistence/settings-store';\nimport { StateSyncService } from '../../persistence/state-sync.service';\nimport { HostPluginContext } from '../host-plugin-context';\nimport { HostContextFactory } from '../host-context-factory';\nimport { CapabilityGrantService } from '../../permissions/capability-grant.service';\nimport { PluginEnablementService } from '../../plugin-store/lifecycle/plugin-enablement.service';\nimport { InstalledPlugin } from '../../plugin-store/installed-plugin';\nimport { PluginInstallService } from '../../plugin-store/lifecycle/plugin-install.service';\nimport { CapabilityRefusalReporter } from '../../permissions/capability-refusal';\nimport {\n CATALOG_MAX_ISOLATION_LEVEL,\n DEFAULT_ISOLATION_LEVEL,\n PluginIsolationLevel,\n PluginIsolationLevelService,\n exceedsLevel,\n} from '../../foundation/plugin-isolation-level';\nimport { PluginDeploymentService } from '../../plugin-store/lifecycle/plugin-deployment.service';\nimport {\n FrameSettingValues,\n buildFrameSection,\n sanitizeRpcSettingsSection,\n} from './sandbox-settings';\nimport {\n sanitizeRpcMenuItem,\n sanitizeRpcSurface,\n sanitizeRpcTabInput,\n sanitizeRpcToastInput,\n} from './sandbox-rpc-sanitize';\nimport {\n FrameRemote,\n FrameRpc,\n invokeRpcCommand,\n} from './sandbox-rpc-contract';\n\n/**\n * A **sandboxed** plugin a distribution registers: its code is not an in-process\n * {@link Plugin} object but a URL to an isolated document, loaded into an `<iframe sandbox>` and given\n * `ctx` over RPC. Contrast {@link providePlugins} (trusted, in-process).\n */\nexport interface FramePlugin {\n /** Stable plugin id — the same id the distribution grants capabilities to (default-deny). */\n readonly id: string;\n /**\n * What the workbench calls this plugin where it names it to the user — the permissions surface,\n * the plugin list. Omit it and the id is shown, which is a poor name but a correct one: nothing is\n * derived from it. Grants, collisions and the user's stored decisions all follow {@link id}, never\n * this, so naming a plugin changes what is read and nothing else.\n */\n readonly name?: string;\n /** URL of the plugin's entry document (served by the distribution, e.g. `/my-plugin/plugin.html`). */\n readonly entryUrl: string;\n /** Capabilities the plugin declares it needs; the distribution still has to grant them. */\n readonly capabilities?: readonly Capability[];\n /**\n * Origins this plugin's own surfaces may be served from, beyond the application's own — the seam\n * refuses anything else, and refuses an address that would execute or carry its content inline at\n * any level. Omit it and the application's own origin is the only one, which is the right answer\n * for a plugin whose files the distribution serves itself.\n *\n * A sibling subdomain belongs here: it is what gives an embedded application its own storage and\n * keeps it out of the hosting document, while a session cookie scoped to the shared domain still\n * reaches it.\n */\n readonly origins?: readonly string[];\n /**\n * How much the browser holds this plugin back. Omitted means\n * {@link PluginIsolationLevel `'isolated'`} — the frame is stripped of an origin and reaches\n * neither the hosting document nor any storage. `'embedded'` lets it keep an origin, which is what\n * a first-party application composed for its own deployment needs and what a plugin you did not\n * write must never be given.\n */\n readonly level?: PluginIsolationLevel;\n}\n\n/** Multi-provider token: each contribution adds one sandboxed plugin to load. */\nexport const FRAME_PLUGIN = new InjectionToken<readonly FramePlugin[]>(\n 'FRAME_PLUGIN',\n);\n\ninterface FrameInstance {\n readonly ctx: HostPluginContext;\n readonly connection: Connection<FrameRemote>;\n readonly frame: HTMLIFrameElement;\n readonly signature: string;\n readonly syncCleanups: (() => void)[];\n readonly watched: Map<string, WatchedKey>;\n}\n\ninterface WatchedKey {\n readonly handle: StateHandle;\n readonly stop: () => void;\n}\n\ninterface RunnableFramePlugin extends FramePlugin {\n readonly granted?: readonly Capability[];\n readonly version?: string;\n readonly provided?: boolean;\n}\n\nfunction levelOf(plugin: RunnableFramePlugin): PluginIsolationLevel {\n return plugin.level ?? DEFAULT_ISOLATION_LEVEL;\n}\n\nfunction signatureOf(plugin: RunnableFramePlugin): string {\n const caps = [...(plugin.capabilities ?? [])].sort().join(',');\n const granted = [...(plugin.granted ?? [])].sort().join(',');\n return `${plugin.entryUrl}|${caps}|${granted}|${plugin.version ?? ''}|${levelOf(plugin)}`;\n}\n\n/**\n * Second {@link PluginRuntime} implementation:\n * runs each plugin in an isolated `<iframe sandbox=\"allow-scripts\">` and hands it `ctx` over **Penpal**\n * RPC. The RPC endpoints are backed by the **same** {@link HostPluginContext} the trusted runtime uses,\n * so the default-deny capability broker enforces grants identically — the isolation and\n * transport change, the broker does not. Data-oriented `ctx` calls (`registerRoute({iframe})`, `toast`)\n * serialise across the boundary; the reserved Angular-only surface (`component`) never crosses it.\n *\n * Activation reconciles against the union of three sets: the composed {@link FramePlugin} list,\n * what the operator deployed through the catalog, and what the user installed. Installing spawns a\n * plugin live, uninstalling unloads it, and a catalog that stops carrying a deployed entry unloads\n * that one — all without a reload. Authority decides an id collision: composed wins over deployed,\n * and deployed wins over installed, because a deployed entry holds exactly what it names and a\n * user's consent cannot narrow what the operator issued.\n */\n@Service()\nexport class FramePluginRuntime {\n private readonly grants = inject(CapabilityGrantService);\n\n private readonly enablement = inject(PluginEnablementService);\n\n private readonly install = inject(PluginInstallService);\n\n private readonly deployment = inject(PluginDeploymentService);\n\n private readonly isolation = inject(PluginIsolationLevelService);\n\n private readonly catalogCap = inject(CATALOG_MAX_ISOLATION_LEVEL);\n private readonly refusals = inject(CapabilityRefusalReporter);\n\n private readonly store = inject(SETTINGS_STORE);\n private readonly sync = inject(StateSyncService);\n\n private readonly factory = inject(HostContextFactory);\n\n private readonly injector = inject(EnvironmentInjector);\n\n private readonly plugins =\n inject<readonly FramePlugin[]>(FRAME_PLUGIN, { optional: true }) ?? [];\n\n private readonly instances = new Map<string, FrameInstance>();\n\n private started = false;\n\n activateAll(): void {\n if (this.started) {\n return;\n }\n this.started = true;\n this.install.markComposed(this.plugins.map((plugin) => plugin.id));\n this.reconcile(\n this.enablement.disabled(),\n this.install.installed(),\n this.deployment.deployed(),\n );\n effect(\n () => {\n const disabled = this.enablement.disabled();\n const installed = this.install.installed();\n const deployed = this.deployment.deployed();\n untracked(() => this.reconcile(disabled, installed, deployed));\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Unloads one sandboxed plugin: closes the RPC connection, removes the frame, disposes `ctx`\n * (undoing its contributions). Idempotent — unknown/inactive ids are a no-op; the counterpart\n * to the trusted runtime's `deactivate(id)`.\n */\n deactivate(id: string): void {\n const instance = this.instances.get(id);\n if (!instance) {\n return;\n }\n this.instances.delete(id);\n instance.connection.destroy();\n instance.frame.remove();\n instance.watched.forEach((entry) => entry.stop());\n instance.ctx.disposeAll();\n instance.syncCleanups.forEach((cleanup) => cleanup());\n this.grants.unregister(id);\n this.isolation.unregister(id);\n }\n\n /** Tears down every sandboxed plugin (e.g. on teardown). */\n deactivateAll(): void {\n const ids = [...this.instances.keys()];\n for (const id of ids) {\n this.deactivate(id);\n }\n }\n\n private reconcile(\n disabled: ReadonlySet<string>,\n installed: readonly InstalledPlugin[],\n deployed: readonly InstalledPlugin[],\n ): void {\n const runnable = this.runnablePlugins(installed, deployed);\n for (const plugin of runnable) {\n this.enablement.register(plugin.id, plugin.name ?? plugin.id);\n const enabled = plugin.provided === true || !disabled.has(plugin.id);\n const running = this.instances.get(plugin.id);\n if (enabled && !running) {\n this.spawn(plugin);\n } else if (!enabled && running) {\n this.deactivate(plugin.id);\n } else if (enabled && running?.signature !== signatureOf(plugin)) {\n this.deactivate(plugin.id);\n this.spawn(plugin);\n }\n }\n this.dropUninstalled(runnable);\n }\n\n private runnablePlugins(\n installed: readonly InstalledPlugin[],\n deployed: readonly InstalledPlugin[],\n ): readonly RunnableFramePlugin[] {\n const claimed = new Set(this.plugins.map((plugin) => plugin.id));\n const provided = new Set(deployed.map((plugin) => plugin.id));\n const fromCatalog: RunnableFramePlugin[] = [];\n for (const plugin of [...deployed, ...installed]) {\n if (claimed.has(plugin.id)) {\n continue;\n }\n const asked = plugin.level ?? DEFAULT_ISOLATION_LEVEL;\n if (exceedsLevel(asked, this.catalogCap)) {\n console.error(\n `Plugin \"${plugin.id}\" asks to run ${asked}, which this catalog may not confer ` +\n `(its cap is ${this.catalogCap}). It is not started.`,\n );\n continue;\n }\n claimed.add(plugin.id);\n fromCatalog.push({\n id: plugin.id,\n entryUrl: plugin.entryUrl,\n capabilities: plugin.capabilities,\n name: plugin.name,\n granted: plugin.capabilities ?? [],\n version: plugin.version,\n level: asked,\n provided: provided.has(plugin.id) || undefined,\n });\n }\n return [...this.plugins, ...fromCatalog];\n }\n\n private dropUninstalled(runnable: readonly RunnableFramePlugin[]): void {\n const known = new Set(runnable.map((plugin) => plugin.id));\n for (const id of this.instances.keys()) {\n if (known.has(id)) {\n continue;\n }\n this.deactivate(id);\n this.enablement.unregister(id);\n }\n }\n\n private spawn(plugin: RunnableFramePlugin): void {\n this.grants.register(plugin.id, plugin.capabilities, plugin.granted);\n this.isolation.register(plugin.id, levelOf(plugin));\n const ctx = this.factory.create(plugin.id, (capability) =>\n this.grants.isGranted(plugin.id, capability),\n );\n const frame = this.createFrame(plugin.entryUrl, levelOf(plugin));\n const messenger = new WindowMessenger({\n remoteWindow: frame.contentWindow as Window,\n allowedOrigins: ['*'],\n });\n const syncCleanups: (() => void)[] = [];\n const watched = new Map<string, WatchedKey>();\n const connection = connect<FrameRemote>({\n messenger,\n methods: this.reportingRefusals(\n this.rpcMethods(\n plugin.id,\n ctx,\n syncCleanups,\n watched,\n plugin.origins,\n ),\n ),\n });\n this.instances.set(plugin.id, {\n ctx,\n connection,\n frame,\n signature: signatureOf(plugin),\n syncCleanups,\n watched,\n });\n\n connection.promise.catch((error: unknown) => {\n if (this.instances.has(plugin.id)) {\n console.error(`Sandbox plugin \"${plugin.id}\" failed to connect`, error);\n this.deactivate(plugin.id);\n }\n });\n }\n\n private createFrame(\n entryUrl: string,\n level: PluginIsolationLevel,\n ): HTMLIFrameElement {\n const frame = document.createElement('iframe');\n if (level === 'isolated') {\n frame.setAttribute('sandbox', 'allow-scripts');\n }\n frame.setAttribute('aria-hidden', 'true');\n frame.style.display = 'none';\n frame.src = entryUrl;\n document.body.appendChild(frame);\n return frame;\n }\n\n private reportingRefusals(methods: FrameRpc): FrameRpc {\n const reported = Object.entries(methods).map(([name, method]) => [\n name,\n (...args: unknown[]) => {\n try {\n return (method as (...rest: unknown[]) => unknown)(...args);\n } catch (error) {\n this.refusals.report(error);\n throw error;\n }\n },\n ]);\n return Object.fromEntries(reported) as FrameRpc;\n }\n\n private rpcMethods(\n pluginId: string,\n ctx: HostPluginContext,\n syncCleanups: (() => void)[],\n watched: Map<string, WatchedKey>,\n origins: readonly string[] | undefined,\n ): FrameRpc {\n return {\n registerSurface: (surface) => {\n ctx.registerSurface(sanitizeRpcSurface(pluginId, surface, origins));\n },\n registerMenuItem: (item) => {\n ctx.registerMenuItem(sanitizeRpcMenuItem(item));\n },\n registerSettingsSection: (section) => {\n const built = buildFrameSection({\n pluginId,\n wire: sanitizeRpcSettingsSection(pluginId, section),\n group: this.install.isInstalled(pluginId)\n ? 'settings.group.community'\n : 'settings.group.plugins',\n store: this.store,\n sync: this.sync,\n notify: (sectionId, values) =>\n this.notifySettings(pluginId, sectionId, values),\n });\n syncCleanups.push(built.disposeSync);\n ctx.registerSettingsSection(built.section);\n },\n navigateContent: (path) => ctx.navigateContent(path),\n openContentTab: (input) => {\n const sanitized = sanitizeRpcTabInput(input);\n ctx.openContentTab({\n ...sanitized,\n onClose: () => this.notifyTabClosed(pluginId, sanitized.path),\n });\n },\n keepContentTab: (path) => ctx.keepContentTab(path),\n pinContentTab: (path) => ctx.pinContentTab(path),\n unpinContentTab: (path) => ctx.unpinContentTab(path),\n closeContentTab: (path) => ctx.closeContentTab(path),\n revealSurface: (id) => ctx.revealSurface(id),\n invokeCommand: (id, args) => invokeRpcCommand(ctx, id, args),\n invocableCommands: () => ctx.invocableCommands(),\n toast: (input) => ctx.ui.toast(sanitizeRpcToastInput(input)),\n stateWatch: (key) => this.watchState(pluginId, ctx, watched, key),\n stateSet: (key, value) => watched.get(key)?.handle.set(value),\n stateClear: (key) => watched.get(key)?.handle.clear(),\n stateUnwatch: (key) => {\n watched.get(key)?.stop();\n watched.delete(key);\n },\n };\n }\n\n private watchState(\n pluginId: string,\n ctx: HostPluginContext,\n watched: Map<string, WatchedKey>,\n key: string,\n ): void {\n if (watched.has(key)) {\n return;\n }\n const handle = ctx.state.watch(key);\n const ref = effect(\n () => {\n const value = handle.value();\n const loaded = handle.loaded();\n untracked(() => this.notifyState(pluginId, key, value, loaded));\n },\n { injector: this.injector },\n );\n watched.set(key, {\n handle,\n stop: () => {\n ref.destroy();\n handle.dispose();\n },\n });\n }\n\n private notifyState(\n pluginId: string,\n key: string,\n value: unknown,\n loaded: boolean,\n ): void {\n const instance = this.instances.get(pluginId);\n if (!instance) {\n return;\n }\n void instance.connection.promise\n .then((remote) => remote.stateChanged(key, value, loaded))\n .catch(() => undefined);\n }\n\n private notifyTabClosed(pluginId: string, path: string): void {\n const instance = this.instances.get(pluginId);\n if (!instance) {\n return;\n }\n void instance.connection.promise\n .then((remote) => remote.contentTabClosed(path))\n .catch(() => undefined);\n }\n\n private notifySettings(\n pluginId: string,\n sectionId: string,\n values: FrameSettingValues,\n ): void {\n const instance = this.instances.get(pluginId);\n if (!instance) {\n return;\n }\n void instance.connection.promise\n .then((remote) => remote.settingsChanged(sectionId, values))\n .catch(() => undefined);\n }\n}\n\n/** A distribution registers its sandboxed plugins; they are activated eagerly at startup. */\nexport function provideFramePlugins(\n ...plugins: FramePlugin[]\n): (Provider | EnvironmentProviders)[] {\n return [\n ...plugins.map((plugin) => ({\n provide: FRAME_PLUGIN,\n useValue: plugin,\n multi: true,\n })),\n provideEnvironmentInitializer(() =>\n inject(FramePluginRuntime).activateAll(),\n ),\n ];\n}\n","import { InjectionToken } from '@angular/core';\nimport {\n PluginCatalogEntry,\n isSameOriginUrl,\n parseCatalogList,\n} from '../installed-plugin';\n\n\n/**\n * The distribution's plugin catalog port: the operator-curated list of community plugins a\n * user may install. The platform only defines the seam — what is not in the catalog does not exist\n * for the shell; per-tenant curation is the product backend answering the catalog request\n * tenant-dependently.\n */\nexport interface PluginCatalog {\n load(): Promise<readonly PluginCatalogEntry[]>;\n}\n\n/**\n * Injection token for the {@link PluginCatalog}. No default — a distribution without a catalog has no\n * plugin store (and no store settings section). Provide one with {@link providePluginCatalog}.\n */\nexport const PLUGIN_CATALOG = new InjectionToken<PluginCatalog>(\n 'lw.plugin-catalog',\n);\n\n/**\n * A {@link PluginCatalog} that fetches a same-origin JSON document (an array of\n * {@link PluginCatalogEntry}). Entries are parsed defensively: junk shapes, foreign-origin\n * `entryUrl`s and unknown capability names are dropped. The catalog URL itself must be same-origin —\n * the store is the distribution's own origin; a product that wants another source\n * implements the {@link PluginCatalog} port directly.\n */\nexport function urlPluginCatalog(url: string): PluginCatalog {\n if (!isSameOriginUrl(url)) {\n throw new Error(`Plugin catalog URL must be same-origin, got \"${url}\".`);\n }\n return {\n async load() {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(\n `Plugin catalog at \"${url}\" answered ${response.status}.`,\n );\n }\n return parseCatalogList(await response.json());\n },\n };\n}\n","import { Service, signal } from '@angular/core';\n\n@Service()\nexport class PluginStoreTitle {\n private readonly value = signal('settings.pluginStore');\n\n readonly current = this.value.asReadonly();\n\n set(title: string): void {\n this.value.set(title);\n }\n}\n","import { PluginCatalog } from './plugin-catalog';\nimport { PluginCatalogEntry } from '../installed-plugin';\n\nexport async function loadCatalogEntries(\n catalog: PluginCatalog | null,\n): Promise<readonly PluginCatalogEntry[] | undefined> {\n if (!catalog) {\n return [];\n }\n try {\n return await catalog.load();\n } catch {\n return undefined;\n }\n}\n\nexport function matchesQuery(\n fields: readonly (string | undefined)[],\n query: string,\n): boolean {\n const normalized = query.trim().toLowerCase();\n if (!normalized.length) {\n return true;\n }\n return fields\n .map((field) => field ?? '')\n .join(' ')\n .toLowerCase()\n .includes(normalized);\n}\n","import { StoreConsentDeps } from './consent-deps';\n\nexport async function confirmUninstall(\n deps: StoreConsentDeps,\n id: string,\n name: string,\n): Promise<void> {\n const accepted = await deps.dialogs.confirm({\n title: deps.transloco.translate('settings.storeUninstallTitle', { name }),\n message: deps.transloco.translate('settings.storeUninstallConfirm', {\n name,\n }),\n confirmLabel: deps.transloco.translate('settings.storeUninstall'),\n tone: 'danger',\n });\n if (!accepted) {\n return;\n }\n if (!(await deps.disableGuard.confirmRemoval(id))) {\n return;\n }\n deps.installs.uninstall(id);\n}\n","import { inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport { DialogService } from '../../dialog/dialog.service';\nimport { PluginDisableGuard } from './plugin-disable-guard';\nimport { PluginInstallService } from './plugin-install.service';\n\nexport interface StoreConsentDeps {\n readonly dialogs: DialogService;\n readonly transloco: TranslocoService;\n readonly installs: PluginInstallService;\n readonly disableGuard: PluginDisableGuard;\n}\n\nexport function injectStoreConsentDeps(): StoreConsentDeps {\n return {\n dialogs: inject(DialogService),\n transloco: inject(TranslocoService),\n installs: inject(PluginInstallService),\n disableGuard: inject(PluginDisableGuard),\n };\n}\n\nexport function consentLine(\n transloco: TranslocoService,\n cap: Capability,\n): string {\n const label = transloco.translate(`settings.capability.${cap}`);\n const description = transloco.translate(`settings.capabilityDesc.${cap}`);\n return `- **${label}** — ${description}`;\n}\n","import { Capability } from '@loomweaver/plugin-sdk';\nimport { InstalledPlugin, PluginCatalogEntry } from '../installed-plugin';\n\nfunction segments(version: string): readonly number[] {\n return version\n .split('.')\n .map((part) => Number.parseInt(part, 10))\n .map((value) => (Number.isNaN(value) ? 0 : value));\n}\n\nexport function isNewerVersion(\n candidate: string | undefined,\n current: string | undefined,\n): boolean {\n if (!candidate || !current || candidate === current) {\n return false;\n }\n const left = segments(candidate);\n const right = segments(current);\n for (let index = 0; index < Math.max(left.length, right.length); index++) {\n const a = left[index] ?? 0;\n const b = right[index] ?? 0;\n if (a !== b) {\n return a > b;\n }\n }\n return false;\n}\n\nexport function availableUpdate(\n installed: InstalledPlugin | undefined,\n entry: PluginCatalogEntry | undefined,\n): PluginCatalogEntry | undefined {\n if (!installed || !entry) {\n return undefined;\n }\n return isNewerVersion(entry.version, installed.version) ? entry : undefined;\n}\n\nexport function addedCapabilities(\n entry: PluginCatalogEntry,\n installed: InstalledPlugin,\n): readonly Capability[] {\n const consented = new Set(installed.capabilities ?? []);\n return (entry.capabilities ?? []).filter(\n (capability) => !consented.has(capability),\n );\n}\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport { PluginCatalogEntry } from '../installed-plugin';\nimport { addedCapabilities } from './plugin-update';\nimport { StoreConsentDeps, consentLine } from './consent-deps';\n\nexport async function confirmUpdate(\n deps: StoreConsentDeps,\n entry: PluginCatalogEntry,\n): Promise<void> {\n const installed = deps.installs.find(entry.id);\n if (!installed) {\n return;\n }\n const added = addedCapabilities(entry, installed);\n if (added.length > 0) {\n const accepted = await deps.dialogs.confirm({\n title: deps.transloco.translate('settings.storeUpdateTitle', {\n name: entry.name,\n }),\n message: consentMessage(deps.transloco, entry, added),\n confirmLabel: deps.transloco.translate('settings.storeUpdate'),\n icon: entry.icon ?? 'plugin',\n });\n if (!accepted) {\n return;\n }\n }\n if (!(await deps.disableGuard.confirmRemoval(entry.id))) {\n return;\n }\n deps.installs.update(entry);\n}\n\nfunction consentMessage(\n transloco: TranslocoService,\n entry: PluginCatalogEntry,\n added: readonly Capability[],\n): string {\n return [\n transloco.translate('settings.storeUpdateConsent', {\n name: entry.name,\n version: entry.version ?? '',\n }),\n '',\n ...added.map((capability) => consentLine(transloco, capability)),\n ].join('\\n');\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input, OnInit, output, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { SettingsService } from '../settings/settings.service';\nimport { PLUGIN_CATALOG } from './catalog/plugin-catalog';\nimport { PluginCatalogEntry } from './installed-plugin';\nimport { PluginDisableGuard } from './lifecycle/plugin-disable-guard';\nimport { PluginEnablementService } from './lifecycle/plugin-enablement.service';\nimport { PluginInstallService } from './lifecycle/plugin-install.service';\nimport { PluginDeploymentService } from './lifecycle/plugin-deployment.service';\nimport { loadCatalogEntries, matchesQuery } from './catalog/catalog-entries';\nimport { confirmUninstall } from './lifecycle/uninstall-confirm';\nimport { injectStoreConsentDeps } from './lifecycle/consent-deps';\nimport { confirmUpdate } from './lifecycle/update-consent';\nimport { availableUpdate } from './lifecycle/plugin-update';\n\nconst COMMUNITY_GROUP = 'settings.group.community';\n\ninterface InstalledRow {\n readonly id: string;\n readonly name: string;\n readonly version?: string;\n readonly author?: string;\n readonly category?: string;\n readonly iconUrl?: string;\n readonly enabled: boolean;\n readonly provided: boolean;\n readonly settingsSectionId?: string;\n readonly update?: PluginCatalogEntry;\n}\n\n@Component({\n selector: 'lw-installed-plugin-list',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [TranslocoPipe],\n templateUrl: './installed-plugin-list.html',\n})\nexport class InstalledPluginList implements OnInit {\n private readonly catalog = inject(PLUGIN_CATALOG, { optional: true });\n\n private readonly settings = inject(SettingsService);\n\n private readonly enablement = inject(PluginEnablementService);\n\n private readonly disableGuard = inject(PluginDisableGuard);\n\n protected readonly installs = inject(PluginInstallService);\n\n protected readonly deployment = inject(PluginDeploymentService);\n\n private readonly consentDeps = injectStoreConsentDeps();\n\n readonly query = input('');\n\n readonly settingsOpened = output<void>();\n\n private readonly entries = signal<readonly PluginCatalogEntry[]>([]);\n\n protected readonly rows = computed<readonly InstalledRow[]>(() => {\n const catalog = new Map(this.entries().map((entry) => [entry.id, entry]));\n const sections = this.settings.all();\n const deployed = this.deployment.deployed();\n const provided = new Set(deployed.map((plugin) => plugin.id));\n return [\n ...deployed,\n ...this.installs.installed().filter((plugin) => !provided.has(plugin.id)),\n ]\n .map((plugin) => {\n const entry = catalog.get(plugin.id);\n const isProvided = provided.has(plugin.id);\n return {\n id: plugin.id,\n name: plugin.name,\n version: plugin.version,\n author: entry?.author,\n category: entry?.category,\n iconUrl: plugin.iconUrl ?? entry?.iconUrl,\n enabled: isProvided || this.enablement.isEnabled(plugin.id),\n provided: isProvided,\n settingsSectionId: sections.find(\n (section) =>\n section.group === COMMUNITY_GROUP &&\n section.id.startsWith(`${plugin.id}.`),\n )?.id,\n update: isProvided ? undefined : availableUpdate(plugin, entry),\n };\n })\n .filter((row) =>\n matchesQuery([row.name, row.author, row.category], this.query()),\n );\n });\n\n ngOnInit(): void {\n void this.load();\n }\n\n protected togglePlugin(id: string, event: Event): void {\n this.disableGuard.toggle(id, event.target as HTMLInputElement);\n }\n\n protected update(entry: PluginCatalogEntry): void {\n void confirmUpdate(this.consentDeps, entry);\n }\n\n protected uninstall(row: InstalledRow): void {\n void confirmUninstall(this.consentDeps, row.id, row.name);\n }\n\n protected openPluginSettings(sectionId: string): void {\n this.settingsOpened.emit();\n this.settings.open(sectionId);\n }\n\n private async load(): Promise<void> {\n this.entries.set((await loadCatalogEntries(this.catalog)) ?? []);\n }\n}\n","<ul class=\"flex flex-col gap-1\">\n @if (rows().length === 0) {\n <li class=\"p-3 text-sm text-content-muted\">\n {{\n installs.installed().length === 0 &&\n deployment.deployed().length === 0\n ? ('settings.storeNoInstalled' | transloco)\n : ('settings.storeNoResults' | transloco)\n }}\n </li>\n } @else {\n @for (row of rows(); track row.id) {\n <li\n class=\"flex items-center gap-3 rounded-md px-3 py-2\"\n [class.opacity-60]=\"!row.enabled\"\n [attr.data-testid]=\"'store-installed-' + row.id\"\n >\n @if (row.iconUrl) {\n <img\n class=\"size-8 shrink-0 rounded-md\"\n [src]=\"row.iconUrl\"\n alt=\"\"\n />\n } @else {\n <span\n class=\"flex size-8 shrink-0 items-center justify-center rounded-md bg-surface-overlay text-content-muted\"\n >\n <lw-icon name=\"plugin\" size=\"1rem\" />\n </span>\n }\n <span class=\"min-w-0 flex-1\">\n <span class=\"flex items-center gap-2\">\n <span class=\"truncate text-sm font-semibold text-content\">{{\n row.name\n }}</span>\n @if (row.version) {\n <span class=\"text-xs text-content-muted\"\n >v{{ row.version }}</span\n >\n }\n @if (row.category) {\n <span class=\"lw-badge\">{{ row.category }}</span>\n }\n @if (row.provided) {\n <span\n class=\"lw-badge\"\n [attr.data-testid]=\"'store-provided-' + row.id\"\n >{{ 'settings.storeProvidedBadge' | transloco }}</span\n >\n }\n </span>\n @if (row.author) {\n <span class=\"block text-xs text-content-muted\">{{\n 'settings.storeBy' | transloco: { author: row.author }\n }}</span>\n }\n @if (row.provided) {\n <span class=\"block text-xs text-content-muted\">{{\n 'settings.storeProvidedHint' | transloco\n }}</span>\n }\n </span>\n <span class=\"flex shrink-0 items-center gap-1\">\n @if (row.update; as pending) {\n <button\n class=\"lw-btn lw-btn--primary lw-btn--sm\"\n [attr.data-testid]=\"'store-update-' + row.id\"\n (click)=\"update(pending)\"\n >\n {{\n 'settings.storeUpdateTo'\n | transloco: { version: pending.version }\n }}\n </button>\n }\n @if (row.settingsSectionId) {\n <button\n type=\"button\"\n class=\"lw-icon-btn relative size-7 rounded-md\"\n [attr.aria-label]=\"'settings.storeActionSettings' | transloco\"\n [attr.data-testid]=\"'store-settings-' + row.id\"\n (click)=\"openPluginSettings(row.settingsSectionId)\"\n >\n <lw-icon name=\"settings\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'settings.storeActionSettings' | transloco\"\n position=\"top\"\n />\n </button>\n }\n @if (!row.provided) {\n <input\n type=\"checkbox\"\n role=\"switch\"\n class=\"lw-switch shrink-0\"\n [checked]=\"row.enabled\"\n [attr.aria-checked]=\"row.enabled\"\n [attr.aria-label]=\"\n (row.enabled\n ? 'settings.storeActionDisable'\n : 'settings.storeActionEnable'\n ) | transloco\n \"\n [attr.data-testid]=\"'store-toggle-' + row.id\"\n (change)=\"togglePlugin(row.id, $event)\"\n />\n <button\n type=\"button\"\n class=\"lw-icon-btn relative size-7 rounded-md\"\n [attr.aria-label]=\"'settings.storeUninstall' | transloco\"\n [attr.data-testid]=\"'store-remove-' + row.id\"\n (click)=\"uninstall(row)\"\n >\n <lw-icon name=\"trash\" size=\"1rem\" />\n <lw-tooltip\n [text]=\"'settings.storeUninstall' | transloco\"\n position=\"top\"\n />\n </button>\n }\n </span>\n </li>\n }\n }\n</ul>\n","const MS_PER_DAY = 86_400_000;\nconst DAYS_PER_WEEK = 7;\nconst DAYS_PER_MONTH = 30;\nconst DAYS_PER_YEAR = 365;\n\nexport function formatCount(locale: string, count: number): string {\n return new Intl.NumberFormat(locale).format(count);\n}\n\nexport function formatUpdated(locale: string, iso: string): string {\n const date = new Date(iso);\n if (Number.isNaN(date.getTime())) {\n return iso;\n }\n const relative = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' });\n const days = Math.round((date.getTime() - Date.now()) / MS_PER_DAY);\n const elapsed = Math.abs(days);\n if (elapsed < DAYS_PER_WEEK) {\n return relative.format(days, 'day');\n }\n if (elapsed < DAYS_PER_MONTH) {\n return relative.format(Math.round(days / DAYS_PER_WEEK), 'week');\n }\n if (elapsed < DAYS_PER_YEAR) {\n return relative.format(Math.round(days / DAYS_PER_MONTH), 'month');\n }\n return relative.format(Math.round(days / DAYS_PER_YEAR), 'year');\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, inject, input, output } from '@angular/core';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { PluginCatalogEntry } from './installed-plugin';\nimport { formatCount, formatUpdated } from './format';\n\n@Component({\n selector: 'lw-plugin-store-card',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [TranslocoPipe],\n templateUrl: './plugin-store-card.html',\n})\nexport class PluginStoreCard {\n readonly entry = input.required<PluginCatalogEntry>();\n readonly selected = input(false);\n readonly installed = input(false);\n readonly hasUpdate = input(false);\n readonly picked = output<void>();\n\n private readonly transloco = inject(TranslocoService);\n\n protected count(downloads: number): string {\n return formatCount(this.transloco.getActiveLang(), downloads);\n }\n\n protected updated(iso: string): string {\n return formatUpdated(this.transloco.getActiveLang(), iso);\n }\n}\n","@if (entry(); as entry) {\n <button\n type=\"button\"\n class=\"flex w-full items-start gap-3 rounded-md px-3 py-2 text-left transition-colors\"\n [class]=\"selected() ? 'bg-brand/10' : 'hover:bg-surface-overlay'\"\n [attr.data-testid]=\"'store-card-' + entry.id\"\n [attr.aria-current]=\"selected() ? 'true' : null\"\n (click)=\"picked.emit()\"\n >\n @if (entry.iconUrl) {\n <img\n class=\"mt-0.5 size-8 shrink-0 rounded-md\"\n [src]=\"entry.iconUrl\"\n alt=\"\"\n />\n } @else {\n <span\n class=\"mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-md bg-surface-overlay text-content-muted\"\n >\n <lw-icon name=\"plugin\" size=\"1rem\" />\n </span>\n }\n <span class=\"min-w-0 flex-1\">\n <span class=\"flex items-center gap-2\">\n <span class=\"truncate text-sm font-semibold text-content\">{{\n entry.name\n }}</span>\n @if (entry.category) {\n <span class=\"lw-badge\">{{ entry.category }}</span>\n }\n @if (hasUpdate()) {\n <span\n class=\"lw-badge lw-badge--brand\"\n [attr.data-testid]=\"'store-update-badge-' + entry.id\"\n >{{ 'settings.storeUpdateAvailable' | transloco }}</span\n >\n } @else if (installed()) {\n <span class=\"lw-badge lw-badge--brand\">{{\n 'settings.storeInstalledBadge' | transloco\n }}</span>\n }\n </span>\n @if (entry.author) {\n <span class=\"block text-xs text-content-muted\">{{\n 'settings.storeBy' | transloco: { author: entry.author }\n }}</span>\n }\n <span class=\"flex items-center gap-1 text-xs text-content-faint\">\n @if (entry.downloads !== undefined) {\n <lw-icon name=\"download\" size=\"0.8rem\" />\n {{\n 'settings.storeDownloads'\n | transloco: { count: count(entry.downloads) }\n }}\n }\n @if (entry.downloads !== undefined && entry.updated) {\n ·\n }\n @if (entry.updated) {\n {{\n 'settings.storeUpdated' | transloco: { date: updated(entry.updated) }\n }}\n }\n </span>\n @if (entry.description) {\n <span class=\"mt-1 line-clamp-2 block text-xs text-content-muted\">{{\n entry.description\n }}</span>\n }\n </span>\n </button>\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { PluginCatalogEntry } from './installed-plugin';\nimport { PluginInstallService } from './lifecycle/plugin-install.service';\nimport { formatCount, formatUpdated } from './format';\nimport { availableUpdate } from './lifecycle/plugin-update';\n\n@Component({\n selector: 'lw-plugin-store-detail',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [TranslocoPipe],\n templateUrl: './plugin-store-detail.html',\n})\nexport class PluginStoreDetail {\n readonly entry = input.required<PluginCatalogEntry>();\n readonly install = output<PluginCatalogEntry>();\n readonly uninstall = output<PluginCatalogEntry>();\n readonly updateRequested = output<PluginCatalogEntry>();\n\n protected readonly installs = inject(PluginInstallService);\n private readonly transloco = inject(TranslocoService);\n\n protected readonly readme = signal<string | undefined>(undefined);\n\n protected readonly update = computed(() =>\n availableUpdate(this.installs.find(this.entry().id), this.entry()),\n );\n\n constructor() {\n effect(() => {\n const entry = this.entry();\n this.readme.set(undefined);\n if (entry.readmeUrl) {\n void this.loadReadme(entry.id, entry.readmeUrl);\n }\n });\n }\n\n protected count(downloads: number): string {\n return formatCount(this.transloco.getActiveLang(), downloads);\n }\n\n protected updated(iso: string): string {\n return formatUpdated(this.transloco.getActiveLang(), iso);\n }\n\n private async loadReadme(entryId: string, url: string): Promise<void> {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n return;\n }\n const text = await response.text();\n if (this.entry().id === entryId) {\n this.readme.set(text);\n }\n } catch {\n return;\n }\n }\n}\n","@if (entry(); as entry) {\n <div class=\"flex flex-col gap-4\" data-testid=\"store-detail\">\n <div class=\"flex items-start justify-between gap-4\">\n <div class=\"flex items-start gap-3\">\n @if (entry.iconUrl) {\n <img\n class=\"mt-1 size-12 shrink-0 rounded-lg\"\n [src]=\"entry.iconUrl\"\n alt=\"\"\n />\n }\n <div class=\"flex flex-col gap-1\">\n <h3\n class=\"flex items-center gap-2 text-xl font-semibold text-content\"\n >\n {{ entry.name }}\n @if (entry.version) {\n <span class=\"text-sm font-normal text-content-muted\">\n v{{ entry.version }}\n </span>\n }\n @if (entry.category) {\n <span class=\"lw-badge\">{{ entry.category }}</span>\n }\n </h3>\n <p class=\"flex items-center gap-1 text-sm text-content-muted\">\n @if (entry.author) {\n {{ 'settings.storeBy' | transloco: { author: entry.author } }}\n }\n @if (entry.author && entry.downloads !== undefined) {\n ·\n }\n @if (entry.downloads !== undefined) {\n <lw-icon name=\"download\" size=\"0.9rem\" />\n {{\n 'settings.storeDownloads'\n | transloco: { count: count(entry.downloads) }\n }}\n }\n @if (entry.updated) {\n ·\n {{\n 'settings.storeUpdated'\n | transloco: { date: updated(entry.updated) }\n }}\n }\n </p>\n @if (entry.repository) {\n <a\n class=\"text-sm text-brand-text hover:underline\"\n [href]=\"entry.repository\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n data-testid=\"store-repository\"\n >\n {{ 'settings.storeRepository' | transloco }} ↗\n </a>\n }\n </div>\n </div>\n <span class=\"flex shrink-0 items-center gap-2\">\n @if (installs.isInstalled(entry.id)) {\n @if (update(); as pending) {\n <button\n class=\"lw-btn lw-btn--primary\"\n [attr.data-testid]=\"'store-update-' + entry.id\"\n (click)=\"updateRequested.emit(pending)\"\n >\n {{\n 'settings.storeUpdateTo'\n | transloco: { version: pending.version }\n }}\n </button>\n }\n <button\n class=\"lw-btn lw-btn--default\"\n [attr.data-testid]=\"'store-uninstall-' + entry.id\"\n (click)=\"uninstall.emit(entry)\"\n >\n {{ 'settings.storeUninstall' | transloco }}\n </button>\n } @else {\n <button\n class=\"lw-btn lw-btn--primary\"\n [attr.data-testid]=\"'store-install-' + entry.id\"\n (click)=\"install.emit(entry)\"\n >\n {{ 'settings.storeInstall' | transloco }}\n </button>\n }\n </span>\n </div>\n @if (entry.description) {\n <p class=\"text-sm text-content\">{{ entry.description }}</p>\n }\n @if (readme(); as text) {\n <div class=\"border-t border-border pt-4\" data-testid=\"store-readme\">\n <lw-markdown [source]=\"text\"></lw-markdown>\n </div>\n }\n </div>\n}\n","import { TranslocoService } from '@jsverse/transloco';\nimport { PluginCatalogEntry } from '../installed-plugin';\nimport { StoreConsentDeps, consentLine } from './consent-deps';\n\nexport async function confirmInstall(\n deps: StoreConsentDeps,\n entry: PluginCatalogEntry,\n): Promise<void> {\n const accepted = await deps.dialogs.confirm({\n title: deps.transloco.translate('settings.storeInstallTitle', {\n name: entry.name,\n }),\n message: consentMessage(deps.transloco, entry),\n confirmLabel: deps.transloco.translate('settings.storeInstall'),\n icon: entry.icon ?? 'plugin',\n });\n if (!accepted) {\n return;\n }\n deps.installs.install(entry);\n}\n\nfunction consentMessage(\n transloco: TranslocoService,\n entry: PluginCatalogEntry,\n): string {\n const paragraphs: string[] = [];\n if (entry.description) {\n paragraphs.push(entry.description, '');\n }\n const capabilities = entry.capabilities ?? [];\n if (capabilities.length === 0) {\n paragraphs.push(\n transloco.translate('settings.storeConsentNone', { name: entry.name }),\n );\n return paragraphs.join('\\n');\n }\n paragraphs.push(\n transloco.translate('settings.storeConsent', { name: entry.name }),\n '',\n ...capabilities.map((cap) => consentLine(transloco, cap)),\n );\n return paragraphs.join('\\n');\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, OnInit, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { DialogRef } from '../dialog/dialog-ref';\nimport { PLUGIN_CATALOG } from './catalog/plugin-catalog';\nimport { PluginCatalogEntry } from './installed-plugin';\nimport { PluginInstallService } from './lifecycle/plugin-install.service';\nimport { PluginStoreTitle } from './plugin-store-title';\nimport { LwButton } from '../elements/button/lw-button';\nimport { InstalledPluginList } from './installed-plugin-list';\nimport { PluginStoreCard } from './plugin-store-card';\nimport { PluginStoreDetail } from './plugin-store-detail';\nimport { loadCatalogEntries, matchesQuery } from './catalog/catalog-entries';\nimport { confirmInstall } from './lifecycle/install-consent';\nimport { injectStoreConsentDeps } from './lifecycle/consent-deps';\nimport { confirmUninstall } from './lifecycle/uninstall-confirm';\nimport { confirmUpdate } from './lifecycle/update-consent';\nimport { availableUpdate } from './lifecycle/plugin-update';\n\n@Component({\n selector: 'lw-plugin-store-dialog',\n schemas: [CUSTOM_ELEMENTS_SCHEMA],\n imports: [\n TranslocoPipe,\n LwButton,\n InstalledPluginList,\n PluginStoreCard,\n PluginStoreDetail,\n ],\n templateUrl: './plugin-store-dialog.html',\n})\nexport class PluginStoreDialog implements OnInit {\n protected readonly ref = inject(DialogRef);\n protected readonly title = inject(PluginStoreTitle).current;\n protected readonly installs = inject(PluginInstallService);\n\n private readonly catalog = inject(PLUGIN_CATALOG, { optional: true });\n\n private readonly consentDeps = injectStoreConsentDeps();\n\n protected readonly entries = signal<\n readonly PluginCatalogEntry[] | undefined\n >(undefined);\n protected readonly failed = signal(false);\n protected readonly view = signal<'browse' | 'installed'>('browse');\n protected readonly query = signal('');\n protected readonly selectedId = signal<string | undefined>(undefined);\n\n protected readonly filtered = computed<readonly PluginCatalogEntry[]>(() => {\n const list = (this.entries() ?? []).filter((entry) =>\n matchesQuery(\n [entry.name, entry.author, entry.category, entry.description],\n this.query(),\n ),\n );\n return list.sort(\n (a, b) =>\n (b.downloads ?? 0) - (a.downloads ?? 0) || a.name.localeCompare(b.name),\n );\n });\n\n protected readonly selected = computed<PluginCatalogEntry | undefined>(() =>\n this.filtered().find((entry) => entry.id === this.selectedId()),\n );\n\n ngOnInit(): void {\n void this.load();\n }\n\n protected requestInstall(entry: PluginCatalogEntry): void {\n void confirmInstall(\n this.consentDeps,\n entry,\n );\n }\n\n protected hasUpdate(entry: PluginCatalogEntry): boolean {\n return availableUpdate(this.installs.find(entry.id), entry) !== undefined;\n }\n\n protected requestUpdate(entry: PluginCatalogEntry): void {\n void confirmUpdate(\n this.consentDeps,\n entry,\n );\n }\n\n protected requestUninstall(entry: PluginCatalogEntry): void {\n void confirmUninstall(\n this.consentDeps,\n entry.id,\n entry.name,\n );\n }\n\n protected close(): void {\n this.ref.close();\n }\n\n private async load(): Promise<void> {\n const entries = await loadCatalogEntries(this.catalog);\n if (entries === undefined) {\n this.failed.set(true);\n return;\n }\n this.entries.set(entries);\n }\n}\n","<div\n class=\"flex w-full flex-col overflow-hidden\"\n [class]=\"ref.maximized() ? 'h-full' : 'h-[80vh] max-h-[85vh]'\"\n>\n <header\n class=\"flex items-center justify-between gap-4 border-b border-border px-5 py-3\"\n >\n <h2 class=\"text-lg font-semibold text-content\">\n {{ title() | transloco }}\n </h2>\n <span class=\"flex items-center gap-1\">\n <button\n lwButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n data-testid=\"dialog-maximize\"\n [attr.aria-label]=\"\n (ref.maximized() ? 'dialog.restore' : 'dialog.maximize')\n | transloco\n \"\n (click)=\"ref.toggleMaximized()\"\n >\n <lw-icon\n [name]=\"ref.maximized() ? 'restore' : 'maximize'\"\n size=\"1rem\"\n />\n </button>\n <button\n lwButton\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n type=\"button\"\n [attr.aria-label]=\"'dialog.close' | transloco\"\n (click)=\"close()\"\n >\n <lw-icon name=\"close\" size=\"1rem\" />\n </button>\n </span>\n </header>\n\n <div class=\"flex items-center gap-3 border-b border-border px-5 py-3\">\n <div class=\"lw-segmented shrink-0\">\n <button\n type=\"button\"\n class=\"lw-segmented-item w-auto px-3 text-sm\"\n data-testid=\"store-tab-browse\"\n [attr.aria-pressed]=\"view() === 'browse'\"\n (click)=\"view.set('browse')\"\n >\n {{ 'settings.storeTabBrowse' | transloco }}\n </button>\n <button\n type=\"button\"\n class=\"lw-segmented-item w-auto px-3 text-sm\"\n data-testid=\"store-tab-installed\"\n [attr.aria-pressed]=\"view() === 'installed'\"\n (click)=\"view.set('installed')\"\n >\n {{ 'settings.storeTabInstalled' | transloco }} ({{\n installs.installed().length\n }})\n </button>\n </div>\n <input\n class=\"lw-field w-full\"\n type=\"search\"\n data-testid=\"store-search\"\n [attr.placeholder]=\"'settings.storeSearch' | transloco\"\n [attr.aria-label]=\"'settings.storeSearch' | transloco\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n </div>\n\n @if (view() === 'browse') {\n <div class=\"flex min-h-0 flex-1\">\n <ul\n class=\"flex w-80 shrink-0 flex-col gap-1 overflow-y-auto border-r border-border p-2 max-sm:w-full\"\n >\n @if (failed()) {\n <li\n class=\"p-3 text-sm text-content-muted\"\n data-testid=\"store-error\"\n >\n {{ 'settings.storeError' | transloco }}\n </li>\n } @else if (entries(); as list) {\n @if (list.length === 0) {\n <li class=\"p-3 text-sm text-content-muted\">\n {{ 'settings.storeEmpty' | transloco }}\n </li>\n } @else if (filtered().length === 0) {\n <li class=\"p-3 text-sm text-content-muted\">\n {{ 'settings.storeNoResults' | transloco }}\n </li>\n } @else {\n @for (entry of filtered(); track entry.id) {\n <li>\n <lw-plugin-store-card\n [entry]=\"entry\"\n [selected]=\"entry.id === selectedId()\"\n [installed]=\"installs.isInstalled(entry.id)\"\n [hasUpdate]=\"hasUpdate(entry)\"\n (picked)=\"selectedId.set(entry.id)\"\n />\n </li>\n }\n }\n } @else {\n <li class=\"p-3 text-sm text-content-muted\">\n {{ 'settings.storeLoading' | transloco }}\n </li>\n }\n </ul>\n\n <div class=\"min-h-0 flex-1 overflow-y-auto p-5 max-sm:hidden\">\n @if (selected(); as entry) {\n <lw-plugin-store-detail\n [entry]=\"entry\"\n (install)=\"requestInstall($event)\"\n (uninstall)=\"requestUninstall($event)\"\n (updateRequested)=\"requestUpdate($event)\"\n />\n } @else {\n <p class=\"text-sm text-content-muted\">\n {{ 'settings.storeSelectHint' | transloco }}\n </p>\n }\n </div>\n </div>\n } @else {\n <div class=\"min-h-0 flex-1 overflow-y-auto p-3\">\n <lw-installed-plugin-list\n [query]=\"query()\"\n (settingsOpened)=\"close()\"\n />\n </div>\n }\n</div>\n","import { inject, Service } from '@angular/core';\nimport { DialogService } from '../dialog/dialog.service';\nimport { DialogRef } from '../dialog/dialog-ref';\nimport { PluginStoreDialog } from './plugin-store-dialog';\nimport { PluginStoreTitle } from './plugin-store-title';\n\n@Service()\nexport class PluginStoreService {\n private readonly dialogs = inject(DialogService);\n private readonly storeTitle = inject(PluginStoreTitle);\n\n readonly title = this.storeTitle.current;\n\n configure(title: string): void {\n this.storeTitle.set(title);\n }\n\n open(): DialogRef {\n return this.dialogs.open(PluginStoreDialog, {\n title: this.storeTitle.current(),\n bare: true,\n size: 'xl',\n dismissable: true,\n });\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PluginStoreService } from './plugin-store.service';\nimport { InstalledPluginList } from './installed-plugin-list';\n\n@Component({\n selector: 'lw-plugin-store-settings',\n imports: [TranslocoPipe, InstalledPluginList],\n templateUrl: './plugin-store-settings.html',\n})\nexport class PluginStoreSettings {\n private readonly store = inject(PluginStoreService);\n\n protected readonly query = signal('');\n\n protected browse(): void {\n this.store.open();\n }\n}\n","<p class=\"mb-4 text-sm text-content-muted\">\n {{ 'settings.storeDesc' | transloco }}\n</p>\n<div class=\"mb-4 flex items-center gap-3\">\n <input\n class=\"lw-field w-full\"\n type=\"search\"\n data-testid=\"store-settings-search\"\n [attr.placeholder]=\"'settings.storeSearch' | transloco\"\n [attr.aria-label]=\"'settings.storeSearch' | transloco\"\n [value]=\"query()\"\n (input)=\"query.set($any($event.target).value)\"\n />\n <button\n class=\"lw-btn lw-btn--primary shrink-0\"\n data-testid=\"store-browse\"\n (click)=\"browse()\"\n >\n {{ 'settings.storeBrowse' | transloco }}\n </button>\n</div>\n<lw-installed-plugin-list [query]=\"query()\" />\n","import {\n EnvironmentProviders,\n Provider,\n inject,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { SettingsService } from '../../settings/settings.service';\nimport { PluginStoreSettings } from '../plugin-store-settings';\nimport { ContributionRegistry } from '../../plugin/contribution-registry';\nimport { PluginStoreService } from '../plugin-store.service';\nimport { FramePluginRuntime } from '../../plugin/sandbox/sandbox-plugin-runtime';\nimport {\n PLUGIN_CATALOG,\n PluginCatalog,\n urlPluginCatalog,\n} from './plugin-catalog';\nimport { PluginDeploymentService } from '../lifecycle/plugin-deployment.service';\nimport {\n CATALOG_MAX_ISOLATION_LEVEL,\n PluginIsolationLevel,\n} from '../../foundation/plugin-isolation-level';\n\n/** Options for {@link providePluginCatalog}. */\nexport interface PluginCatalogOptions {\n /**\n * Transloco key (or literal) for the store's settings-section title — brand the store per product\n * (e.g. `'product.marketplace'`). Defaults to the built-in `settings.pluginStore` (\"Plugin store\").\n */\n readonly title?: string;\n /**\n * The highest level this catalog may confer on what it carries. Defaults to the strict one, so a\n * catalog can never hand out an embedded application unless the composition said it may. An entry\n * asking for more is refused rather than started lower — a plugin running below what it needs\n * fails in ways nobody can trace back to a line of configuration.\n */\n readonly maxLevel?: PluginIsolationLevel;\n}\n\n/**\n * Wires the plugin store into a distribution: provides the catalog (a same-origin JSON URL\n * or a custom {@link PluginCatalog} implementation), makes sure the sandbox runtime is active even\n * when no plugin is composed statically, and registers the store's entry points — a settings section\n * (`setting:shell.pluginStore`, omit-able) whose Browse button opens the **store dialog** (the\n * Obsidian browse model: searchable list + in-app detail pane with README), plus the palette command\n * `shell.openPluginStore`. The title is brandable via {@link PluginCatalogOptions.title}. Installing\n * and uninstalling happens in the store; an installed plugin that declares its own settings gets its\n * own entry under the **Community plugins** nav group. Place after `provideShell()`.\n */\nexport function providePluginCatalog(\n source: PluginCatalog | string,\n options: PluginCatalogOptions = {},\n): (Provider | EnvironmentProviders)[] {\n const catalog =\n typeof source === 'string' ? urlPluginCatalog(source) : source;\n const title = options.title ?? 'settings.pluginStore';\n return [\n { provide: PLUGIN_CATALOG, useValue: catalog },\n ...(options.maxLevel\n ? [{ provide: CATALOG_MAX_ISOLATION_LEVEL, useValue: options.maxLevel }]\n : []),\n provideEnvironmentInitializer(() =>\n inject(FramePluginRuntime).activateAll(),\n ),\n provideEnvironmentInitializer(() => {\n const deployment = inject(PluginDeploymentService);\n void inject(PLUGIN_CATALOG)\n .load()\n .then((entries) => deployment.adopt(entries))\n .catch((error: unknown) => {\n console.error(\n 'The plugin catalog could not be read; the plugins it last deployed stay active.',\n error,\n );\n });\n }),\n provideEnvironmentInitializer(() => {\n const store = inject(PluginStoreService);\n store.configure(title);\n inject(ContributionRegistry).addCommand({\n id: 'shell.openPluginStore',\n title,\n icon: 'plugin',\n run: () => {\n store.open();\n },\n });\n inject(SettingsService).register({\n id: 'shell.pluginStore',\n title,\n group: 'settings.group.options',\n order: 20,\n rows: [\n {\n id: 'shell.pluginStoreBrowse',\n label: title,\n control: {\n kind: 'component',\n component: PluginStoreSettings,\n fullWidth: true,\n },\n },\n ],\n });\n }),\n ];\n}\n","import {\n EnvironmentProviders,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { setDistributionIcon } from './icon-registry-global';\nimport { LoomIconName } from './loom-icons';\n\n/**\n * Distribution-level icons: seed `name → SVG` into the module-global registry at bootstrap,\n * resolved by `<lw-icon>`. **The distribution wins:** naming one of the first-party icons replaces it\n * everywhere the chrome draws it, which is how a product re-skins the workbench; naming a new one adds it.\n * A *weaver* instead contributes at runtime via `ctx.contributeIcons` and can never shadow a name that is\n * already taken, so an installed plugin cannot repaint the chrome. Distribution icons are build-time and\n * trusted like the first-party set, so they are not re-sanitized.\n *\n * The key type suggests the shipped names while still accepting your own, so a typo in an intended\n * replacement shows up while writing it instead of silently adding a glyph nothing draws.\n *\n * These icons also travel into sandboxed surfaces, so a plugin drawing `<lw-icon name=\"trash\">` shows\n * your glyph rather than ours.\n */\nexport function provideIcons(\n icons: Readonly<Partial<Record<LoomIconName | (string & {}), string>>>,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n provideEnvironmentInitializer(() => {\n for (const [name, svg] of Object.entries(icons)) {\n if (svg !== undefined) {\n setDistributionIcon(name, svg);\n }\n }\n }),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["collectTabs","VIEWPORT_MARGIN","STORAGE_KEY","parse","STORAGE_PREFIX","SAVE_DEBOUNCE_MS","parseBlob","STEP","STEP_COARSE","NOT_COMPOSED","optionalString","filter","map","consentMessage"],"mappings":"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"}
|