{"version":3,"file":"loomweaver-shell.mjs","names":[],"sources":["../../../../../libs/core/shell/src/lib/layout/panel-widths.ts","../../../../../libs/core/shell/src/lib/layout/layout.ts","../../../../../libs/core/shell/src/lib/foundation/identified.ts","../../../../../libs/core/shell/src/lib/contributions/route-omit.ts","../../../../../libs/core/shell/src/lib/contributions/tab-badge.ts","../../../../../libs/core/shell/src/lib/contributions/surface-badges.ts","../../../../../libs/core/shell/src/lib/contributions/surface-normalize.ts","../../../../../libs/core/shell/src/lib/contributions/registry-filters.ts","../../../../../libs/core/shell/src/lib/contributions/contribution-registry.ts","../../../../../libs/core/shell/src/lib/foundation/served-base.ts","../../../../../libs/core/shell/src/lib/foundation/wire/path-text.ts","../../../../../libs/core/shell/src/lib/regions/content/content-path.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/popout/popout-window.ts","../../../../../libs/core/shell/src/lib/regions/pane/unsaved-work/dirty-surface.ts","../../../../../libs/core/shell/src/lib/plugin/context/plugin-surface-ownership.ts","../../../../../libs/core/shell/src/lib/persistence/stored-values/hydrate.ts","../../../../../libs/core/shell/src/lib/persistence/key-value-store.ts","../../../../../libs/core/shell/src/lib/persistence/peek-through.ts","../../../../../libs/core/shell/src/lib/persistence/cross-tab/state-sync-channel.ts","../../../../../libs/core/shell/src/lib/persistence/cross-tab/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/declaration/provide-workspaces.ts","../../../../../libs/core/shell/src/lib/workspace/declaration/composed-definitions.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/container/container-children.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retention-keys.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/stash-entries.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/holding-area.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retained-view-stash.ts","../../../../../libs/core/shell/src/lib/regions/pane/unsaved-work/unsaved-work.ts","../../../../../libs/core/shell/src/lib/regions/pane/unsaved-work/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/merge-shell-features.ts","../../../../../libs/core/shell/src/lib/foundation/shell-features.ts","../../../../../libs/core/shell/src/lib/features/feature-switches.service.ts","../../../../../libs/core/shell/src/lib/commands/keyboard/chord.ts","../../../../../libs/core/shell/src/lib/commands/keyboard/key-words.ts","../../../../../libs/core/shell/src/lib/commands/keyboard/format-chord.ts","../../../../../libs/core/shell/src/lib/commands/command.service.ts","../../../../../libs/core/shell/src/lib/menu/chrome-item-menu.ts","../../../../../libs/core/shell/src/lib/menu/menu-resolution.ts","../../../../../libs/core/shell/src/lib/foundation/name-showing.ts","../../../../../libs/core/shell/src/lib/menu/menu-heading.ts","../../../../../libs/core/shell/src/lib/menu/menu-placement.ts","../../../../../libs/core/shell/src/lib/elements/roving-focus.ts","../../../../../libs/core/shell/src/lib/elements/viewport-fit.ts","../../../../../libs/core/shell/src/lib/elements/custom-elements.ts","../../../../../libs/core/shell/src/lib/elements/menu/lw-submenu.ts","../../../../../libs/core/shell/src/lib/elements/menu/lw-menu-item.element.ts","../../../../../libs/core/shell/src/lib/elements/menu/lw-menu.element.ts","../../../../../libs/core/shell/src/lib/menu/menu-wording.ts","../../../../../libs/core/shell/src/lib/menu/menu-drawing.ts","../../../../../libs/core/shell/src/lib/i18n/missing-translation-handler.ts","../../../../../libs/core/shell/src/lib/i18n/wording.ts","../../../../../libs/core/shell/src/lib/menu/menu.service.ts","../../../../../libs/core/shell/src/lib/menu/slot-resolution.service.ts","../../../../../libs/core/shell/src/lib/menu/menu-trigger.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/elements/row-fold.ts","../../../../../libs/core/shell/src/lib/regions/bar/bar-fold.ts","../../../../../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/layout/layout-queries.ts","../../../../../libs/core/shell/src/lib/layout/viewport.service.ts","../../../../../libs/core/shell/src/lib/persistence/settings-store.ts","../../../../../libs/core/shell/src/lib/persistence/cross-tab/state-sync.service.ts","../../../../../libs/core/shell/src/lib/persistence/stored-values/parse-stored.ts","../../../../../libs/core/shell/src/lib/persistence/stored-values/persisted-record.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-state.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/surface-hold.ts","../../../../../libs/core/shell/src/lib/persistence/held-writes/held-writes.ts","../../../../../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/regions/pane/component-loader.service.ts","../../../../../libs/core/shell/src/lib/dialog/dialog.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/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-structure.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-handover.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/stored-pane-tree.ts","../../../../../libs/core/shell/src/lib/workspace/catalog/saved-workspaces.ts","../../../../../libs/core/shell/src/lib/persistence/stored-values/persisted-setting.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-claims.ts","../../../../../libs/core/shell/src/lib/workspace/catalog/workspace-lookup.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/declared-pane-layout.ts","../../../../../libs/core/shell/src/lib/workspace/declaration/declared-content.ts","../../../../../libs/core/shell/src/lib/workspace/declaration/definition-audit.ts","../../../../../libs/core/shell/src/lib/workspace/catalog/workspace-catalog.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/pane-tree-storage.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/reorder/user-order.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/panel-views.service.ts","../../../../../libs/core/shell/src/lib/persistence/stored-values/persisted-id-set.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/regions/pane/chrome/strip-tab.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-surface.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/tab-label.ts","../../../../../libs/core/shell/src/lib/regions/content/pane-targets.ts","../../../../../libs/core/shell/src/lib/regions/content/pane-admission.ts","../../../../../libs/core/shell/src/lib/regions/content/access/content-access.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/content-sub-stub.ts","../../../../../libs/core/shell/src/lib/popout/popout-refusal.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/boot-address.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/keep-popout.guard.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/workspace-settlement.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/settle-workspace.guard.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/surface-route-stub.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/content-route-table.ts","../../../../../libs/core/shell/src/lib/regions/content/current-address.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/content-tab-projection.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-close-hooks.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/quick-open-target.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-address.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/content-tab-state.ts","../../../../../libs/core/shell/src/lib/regions/pane/tree/active-content-path.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-navigation.service.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/preview-slot.service.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-label-update.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-opening.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/left-out-children.ts","../../../../../libs/core/shell/src/lib/notifications/lifetime-clock.ts","../../../../../libs/core/shell/src/lib/notifications/notification-lifetime.ts","../../../../../libs/core/shell/src/lib/notifications/notification-board.ts","../../../../../libs/core/shell/src/lib/notifications/notification.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/unsaved-work/close-prompt-message.ts","../../../../../libs/core/shell/src/lib/regions/pane/unsaved-work/close-prompt-message.html","../../../../../libs/core/shell/src/lib/regions/pane/unsaved-work/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/pane/drag/pane-move.service.ts","../../../../../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/pane/pane-actions.service.ts","../../../../../libs/core/shell/src/lib/regions/reorder/reorderable.directive.ts","../../../../../libs/core/shell/src/lib/regions/pane/drag/pane-drag.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/roving-tabs.directive.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/strip-overflow.directive.ts","../../../../../libs/core/shell/src/lib/contributions/toolbar-registry.ts","../../../../../libs/core/shell/src/lib/foundation/wire/menu-context-of.ts","../../../../../libs/core/shell/src/lib/elements/button/lw-button-classes.ts","../../../../../libs/core/shell/src/lib/elements/toolbar/toolbar-dom.ts","../../../../../libs/core/shell/src/lib/elements/toolbar/toolbar-layout.ts","../../../../../libs/core/shell/src/lib/elements/toolbar/toolbar-bridge.ts","../../../../../libs/core/shell/src/lib/elements/toolbar/lw-toolbar.element.ts","../../../../../libs/core/shell/src/lib/regions/toolbar/toolbar-entries.ts","../../../../../libs/core/shell/src/lib/regions/toolbar/toolbar-slots.service.ts","../../../../../libs/core/shell/src/lib/regions/toolbar/toolbar-host.service.ts","../../../../../libs/core/shell/src/lib/regions/content/actions/surface-actions.ts","../../../../../libs/core/shell/src/lib/regions/content/actions/surface-actions.html","../../../../../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/pane/chrome/tab-escalation.ts","../../../../../libs/core/shell/src/lib/regions/pane/chrome/pane-affordances.ts","../../../../../libs/core/shell/src/lib/regions/content/pane-target-picker.ts","../../../../../libs/core/shell/src/lib/contributions/dispose-together.ts","../../../../../libs/core/shell/src/lib/features/while-on.ts","../../../../../libs/core/shell/src/lib/menu/menu-context.ts","../../../../../libs/core/shell/src/lib/menu/menu-entry-id.ts","../../../../../libs/core/shell/src/lib/menu/context-menu-entry.ts","../../../../../libs/core/shell/src/lib/regions/content/tabs/tab-context-menu.ts","../../../../../libs/core/shell/src/lib/regions/content/address-pane-header.ts","../../../../../libs/core/shell/src/lib/regions/content/address-pane-header.html","../../../../../libs/core/shell/src/lib/regions/content/address-pane-body.ts","../../../../../libs/core/shell/src/lib/workspace/usability/unusable-workspaces.ts","../../../../../libs/core/shell/src/lib/commands/host-command-ids.ts","../../../../../libs/core/shell/src/lib/workspace/usability/unusable-workspace-notice.ts","../../../../../libs/core/shell/src/lib/workspace/usability/unusable-workspace-notice.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/persistence/device-level-keys.ts","../../../../../libs/core/shell/src/lib/i18n/served-languages.ts","../../../../../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-tokens.ts","../../../../../libs/core/shell/src/lib/theme/plugin-theme-layer.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/permissions/provide-capability-grants.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/plugin-isolation/plugin-isolation-level.service.ts","../../../../../libs/core/shell/src/lib/capture/deadline.ts","../../../../../libs/core/shell/src/lib/capture/surface-answer.ts","../../../../../libs/core/shell/src/lib/capture/ask-surface.ts","../../../../../libs/core/shell/src/lib/capture/surface-capture-registry.ts","../../../../../libs/core/shell/src/lib/elements/icon/loom-icons.ts","../../../../../libs/core/shell/src/lib/elements/icon/icon-registry.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/iframe-surface-protocol.ts","../../../../../libs/core/shell/src/lib/plugin/frame/rpc/wire-fields.ts","../../../../../libs/core/shell/src/lib/plugin/plugin-state-bridge.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/slot-bridge.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/surface-route-data.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/iframe-surface.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/iframe-surface.html","../../../../../libs/core/shell/src/lib/regions/content/surface/route-snapshot.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/synthetic-route.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/live-surface-route.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/surface-injector.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retained-component.ts","../../../../../libs/core/shell/src/lib/foundation/surface-padding.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/retention-policy.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/surface-body.ts","../../../../../libs/core/shell/src/lib/regions/content/surface/surface-body.html","../../../../../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/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/reorder/move-announcer.ts","../../../../../libs/core/shell/src/lib/regions/panel/view-move.service.ts","../../../../../libs/core/shell/src/lib/regions/panel/view-context-menu.ts","../../../../../libs/core/shell/src/lib/regions/reorder/move-chord.ts","../../../../../libs/core/shell/src/lib/regions/reorder/focus-moved-entry.ts","../../../../../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/rail/rail-context-menu.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/workspace/working-state/state-channels.ts","../../../../../libs/core/shell/src/lib/workspace/declaration/definition-baseline.ts","../../../../../libs/core/shell/src/lib/workspace/working-state/workspace-changes.ts","../../../../../libs/core/shell/src/lib/workspace/working-state/unsaved-workspaces.ts","../../../../../libs/core/shell/src/lib/workspace/working-state/working-state-io.ts","../../../../../libs/core/shell/src/lib/regions/content/routing/distribution-routes.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/workspace/settlement/withheld-visits.ts","../../../../../libs/core/shell/src/lib/workspace/settlement/address-settlement.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-switcher.ts","../../../../../libs/core/shell/src/lib/workspace/opening/workbench-opening.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-discard-confirmation.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/rail-labels.service.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-label-fit.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-workspace-entries.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-entries.ts","../../../../../libs/core/shell/src/lib/regions/rail/rail-name.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/shell-edge.ts","../../../../../libs/core/shell/src/lib/shell-edge.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.ts","../../../../../libs/core/shell/src/lib/notifications/feedback-colors.ts","../../../../../libs/core/shell/src/lib/notifications/toast-options.ts","../../../../../libs/core/shell/src/lib/notifications/toast-placement.ts","../../../../../libs/core/shell/src/lib/notifications/toast-outlet.ts","../../../../../libs/core/shell/src/lib/notifications/toast-outlet.html","../../../../../libs/core/shell/src/lib/dialog/dialog-close-guard.ts","../../../../../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-dialog/settings-registry.ts","../../../../../libs/core/shell/src/lib/dialog/wide-dialog-frame.ts","../../../../../libs/core/shell/src/lib/dialog/wide-dialog-frame.html","../../../../../libs/core/shell/src/lib/settings-dialog/lw-setting-row.ts","../../../../../libs/core/shell/src/lib/settings-dialog/lw-setting-row.html","../../../../../libs/core/shell/src/lib/settings-dialog/settings-dialog.ts","../../../../../libs/core/shell/src/lib/settings-dialog/settings-dialog.html","../../../../../libs/core/shell/src/lib/settings-dialog/settings.service.ts","../../../../../libs/core/shell/src/lib/settings-dialog/setting-omit.ts","../../../../../libs/core/shell/src/lib/i18n/translation-namespaces.ts","../../../../../libs/core/shell/src/lib/i18n/translation-overrides.ts","../../../../../libs/core/shell/src/lib/i18n/translation-tree.ts","../../../../../libs/core/shell/src/lib/i18n/transloco-loader.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/preview-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/announce-updates.ts","../../../../../libs/core/shell/src/lib/update/update-notices.ts","../../../../../libs/core/shell/src/lib/update/worker-repair.ts","../../../../../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/views/view.ts","../../../../../libs/core/shell/src/lib/permissions/capability-refusal.ts","../../../../../libs/core/shell/src/lib/permissions/refusal-error-handler.ts","../../../../../libs/core/shell/src/lib/foundation/command-invoker.ts","../../../../../libs/core/shell/src/lib/workspace/usability/workspace-usability.ts","../../../../../libs/core/shell/src/lib/workspace/usability/unusable-workspaces.service.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/keyboard/keybinding.service.ts","../../../../../libs/core/shell/src/lib/commands/keyboard/chord-wording.ts","../../../../../libs/core/shell/src/lib/regions/panel/view-visibility.service.ts","../../../../../libs/core/shell/src/lib/regions/reset/app-reset.service.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-handle.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane.service.ts","../../../../../libs/core/shell/src/lib/plugin/activation-settled.ts","../../../../../libs/core/shell/src/lib/foundation/required-plugins.ts","../../../../../libs/core/shell/src/lib/plugin/plugin.ts","../../../../../libs/core/shell/src/lib/plugin/frame/frame-plugin.ts","../../../../../libs/core/shell/src/lib/diagnostics/composition-checks.ts","../../../../../libs/core/shell/src/lib/diagnostics/declared-slots.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/installed-plugin.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-deployment.service.ts","../../../../../libs/core/shell/src/lib/plugin/enablement/plugin-enablement.service.ts","../../../../../libs/core/shell/src/lib/plugin/enablement/plugin-disable-guard.ts","../../../../../libs/core/shell/src/lib/plugin/enablement/permissions-settings.ts","../../../../../libs/core/shell/src/lib/plugin/enablement/permissions-settings.html","../../../../../libs/core/shell/src/lib/default-settings.ts","../../../../../libs/core/shell/src/lib/settings-dialog/settings-command.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-dialog.ts","../../../../../libs/core/shell/src/lib/workspace/workspace-dialog.html","../../../../../libs/core/shell/src/lib/workspace/workspace-commands.ts","../../../../../libs/core/shell/src/lib/commands/palette/palette-fuzzy.ts","../../../../../libs/core/shell/src/lib/commands/palette/command-rows.ts","../../../../../libs/core/shell/src/lib/commands/palette/relative-time.ts","../../../../../libs/core/shell/src/lib/commands/palette/tab-rows.ts","../../../../../libs/core/shell/src/lib/commands/palette/recent-commands.service.ts","../../../../../libs/core/shell/src/lib/commands/palette/command-palette.ts","../../../../../libs/core/shell/src/lib/commands/palette/command-palette.html","../../../../../libs/core/shell/src/lib/commands/palette/palette-commands.ts","../../../../../libs/core/shell/src/lib/regions/pane/split-command.ts","../../../../../libs/core/shell/src/lib/regions/curation/curation-source.ts","../../../../../libs/core/shell/src/lib/regions/curation/rail-curation.ts","../../../../../libs/core/shell/src/lib/regions/curation/view-curation.ts","../../../../../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/regions/curation/curation-commands.ts","../../../../../libs/core/shell/src/lib/regions/reset/app-reset-dialog.ts","../../../../../libs/core/shell/src/lib/regions/reset/app-reset-dialog.html","../../../../../libs/core/shell/src/lib/regions/reset/app-reset-command.ts","../../../../../libs/core/shell/src/lib/host-commands.ts","../../../../../libs/core/shell/src/lib/built-in-menus.ts","../../../../../libs/core/shell/src/lib/elements/button/lw-button.element.ts","../../../../../libs/core/shell/src/lib/elements/icon/lw-icon.element.ts","../../../../../libs/core/shell/src/lib/elements/markdown/lw-markdown.element.ts","../../../../../libs/core/shell/src/lib/addressing/address-is-under.ts","../../../../../libs/core/shell/src/lib/elements/nav-tree/nav-tree-parts.ts","../../../../../libs/core/shell/src/lib/elements/nav-tree/lw-nav-item.element.ts","../../../../../libs/core/shell/src/lib/elements/nav-tree/nav-fold-state.ts","../../../../../libs/core/shell/src/lib/elements/nav-tree/lw-nav-group.element.ts","../../../../../libs/core/shell/src/lib/elements/nav-tree/lw-nav-tree.element.ts","../../../../../libs/core/shell/src/lib/elements/progress/lw-progress-ring.element.ts","../../../../../libs/core/shell/src/lib/elements/select/lw-option.element.ts","../../../../../libs/core/shell/src/lib/elements/select/lw-select-parts.ts","../../../../../libs/core/shell/src/lib/elements/select/lw-select-name.ts","../../../../../libs/core/shell/src/lib/elements/select/lw-select-keys.ts","../../../../../libs/core/shell/src/lib/elements/select/lw-select.element.ts","../../../../../libs/core/shell/src/lib/elements/spinner/lw-spinner.element.ts","../../../../../libs/core/shell/src/lib/elements/tooltip/lw-tooltip.element.ts","../../../../../libs/core/shell/src/lib/elements/lw-elements.ts","../../../../../libs/core/shell/src/lib/provide-shell.ts","../../../../../libs/core/shell/src/lib/surface-kit/picture-primitives.ts","../../../../../libs/core/shell/src/lib/capture/picture-assembly.ts","../../../../../libs/core/shell/src/lib/capture/picture-size.ts","../../../../../libs/core/shell/src/lib/capture/picture-form.ts","../../../../../libs/core/shell/src/lib/capture/workbench-capture.service.ts","../../../../../libs/core/shell/src/lib/commands/palette/entry/search-entry.ts","../../../../../libs/core/shell/src/lib/commands/palette/entry/search-entry.html","../../../../../libs/core/shell/src/lib/commands/palette/entry/command-palette-entry.ts","../../../../../libs/core/shell/src/lib/commands/palette/entry/provide-command-palette-entry.ts","../../../../../libs/core/shell/src/lib/commands/palette/entry/quick-open-entry.ts","../../../../../libs/core/shell/src/lib/commands/palette/entry/provide-quick-open-entry.ts","../../../../../libs/core/shell/src/lib/elements/icon/provide-icons.ts","../../../../../libs/core/shell/src/lib/persistence/identity-scope/boot-latched-identity.ts","../../../../../libs/core/shell/src/lib/persistence/identity-scope/identity-scoped-store.ts","../../../../../libs/core/shell/src/lib/persistence/identity-scope/provide-identity-scoped-stores.ts","../../../../../libs/core/shell/src/lib/elements/icon/plugin-icon-contributions.ts","../../../../../libs/core/shell/src/lib/regions/reveal/surface-reveal.service.ts","../../../../../libs/core/shell/src/lib/plugin/context/host-context-warnings.ts","../../../../../libs/core/shell/src/lib/plugin/context/plugin-facades.ts","../../../../../libs/core/shell/src/lib/plugin/context/surface-admission.ts","../../../../../libs/core/shell/src/lib/plugin/context/host-plugin-context.ts","../../../../../libs/core/shell/src/lib/plugin/context/host-context-factory.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-install.service.ts","../../../../../libs/core/shell/src/lib/plugin-store/catalog/catalog-level-cap.ts","../../../../../libs/core/shell/src/lib/plugin/frame/runnable-frame-plugins.ts","../../../../../libs/core/shell/src/lib/plugin/frame/frame-settings-section.ts","../../../../../libs/core/shell/src/lib/plugin/frame/rpc/sanitize-inputs.ts","../../../../../libs/core/shell/src/lib/plugin/frame/rpc/sanitize-settings.ts","../../../../../libs/core/shell/src/lib/plugin/frame/rpc/sanitize-surface.ts","../../../../../libs/core/shell/src/lib/plugin/frame/rpc/frame-rpc-methods.ts","../../../../../libs/core/shell/src/lib/plugin/frame/frame-session.ts","../../../../../libs/core/shell/src/lib/plugin/frame/frame-plugin-runtime.ts","../../../../../libs/core/shell/src/lib/plugin/plugin-runtime.ts","../../../../../libs/core/shell/src/lib/plugin-store/catalog/catalog-entry.ts","../../../../../libs/core/shell/src/lib/plugin-store/catalog/plugin-catalog.ts","../../../../../libs/core/shell/src/lib/plugin-store/catalog/catalog-search.ts","../../../../../libs/core/shell/src/lib/plugin-store/catalog/plugin-catalog-entries.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-update.ts","../../../../../libs/core/shell/src/lib/plugin-store/lifecycle/plugin-store-consent.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-icon.ts","../../../../../libs/core/shell/src/lib/plugin-store/plugin-icon.html","../../../../../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/catalog-figures.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/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/regions/content/routing/content-reuse-strategy.ts","../../../../../libs/core/shell/src/lib/regions/pane/container/container-dock-gc.ts","../../../../../libs/core/shell/src/lib/regions/pane/unsaved-work/save-on-hide.ts","../../../../../libs/core/shell/src/lib/regions/pane/retention/parked-view-sweep.ts","../../../../../libs/core/shell/src/lib/regions/pane/pane-housekeeping.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/provide-shell-router.ts","../../../../../libs/core/shell/src/lib/regions/panel/sidebar.service.ts"],"sourcesContent":["export const DEFAULT_PANEL_WIDTH = 256;\nexport const MIN_PANEL_WIDTH = 180;\nexport const MAX_PANEL_WIDTH = 480;\nexport const DEFAULT_OVERLAY_WIDTH = 288;\n\nconst OVERLAY_DISMISS_MARGIN = '3rem';\n\nexport interface DeclaredPanelWidths {\n  readonly width?: number;\n  readonly minWidth?: number;\n  readonly maxWidth?: number;\n  readonly overlayWidth?: number;\n}\n\nconst DECLARED_WIDTHS = [\n  'width',\n  'minWidth',\n  'maxWidth',\n  'overlayWidth',\n] as const satisfies readonly (keyof DeclaredPanelWidths)[];\n\nexport interface PanelWidths {\n  readonly start: number;\n  readonly min: number;\n  readonly max: number;\n}\n\nexport const WORKBENCH_PANEL_WIDTHS: PanelWidths = {\n  start: DEFAULT_PANEL_WIDTH,\n  min: MIN_PANEL_WIDTH,\n  max: MAX_PANEL_WIDTH,\n};\n\nexport function resolvePanelWidths(declared: DeclaredPanelWidths): PanelWidths {\n  return {\n    start: declared.width ?? DEFAULT_PANEL_WIDTH,\n    min: declared.minWidth ?? MIN_PANEL_WIDTH,\n    max: declared.maxWidth ?? MAX_PANEL_WIDTH,\n  };\n}\n\nexport function overlayWidthStyle(declared: DeclaredPanelWidths): string {\n  const width = declared.overlayWidth ?? DEFAULT_OVERLAY_WIDTH;\n  return `min(${width}px, calc(100vw - ${OVERLAY_DISMISS_MARGIN}))`;\n}\n\nexport function assertPanelWidths(\n  regionId: string,\n  declared: DeclaredPanelWidths,\n): void {\n  for (const field of DECLARED_WIDTHS) {\n    const value = declared[field];\n    if (value !== undefined && !(Number.isFinite(value) && value > 0)) {\n      throw new Error(\n        `provideLayout(): panel \"${regionId}\" declares ${field} as ${value}; it has to be a positive number of pixels.`,\n      );\n    }\n  }\n  const { start, min, max } = resolvePanelWidths(declared);\n  if (min > max) {\n    throw new Error(\n      `provideLayout(): panel \"${regionId}\" declares a narrowest width of ${min} above its widest of ${max}.`,\n    );\n  }\n  if (start < min || start > max) {\n    throw new Error(\n      `provideLayout(): panel \"${regionId}\" starts at ${start}, outside its bounds of ${min} to ${max}.`,\n    );\n  }\n}\n\nexport function clampToPanelWidths(px: number, widths: PanelWidths): number {\n  return Math.round(Math.min(widths.max, Math.max(widths.min, px)));\n}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { assertPanelWidths } from './panel-widths';\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/**\n * A side panel the distribution places into the border frame. It is the one kind of region the user\n * resizes, so it is the one kind that may declare its widths, in pixels. Each is optional and falls\n * back to the workbench's own (start 256, narrowest 180, widest 480). Those apply where the panel\n * stands beside the content; on a narrow viewport the panel is an overlay sized by `overlayWidth`.\n */\nexport interface PanelRegion {\n  /** Stable id (slot targeting, collapse state, ordering). */\n  readonly id: string;\n  readonly type: 'panel';\n  readonly dock: DockPosition;\n  /** The width the panel shows until the user resizes it, and what resetting the layout returns to. */\n  readonly width?: number;\n  /** The narrowest the panel may be made, by dragging, from the keyboard or from code. */\n  readonly minWidth?: number;\n  /** The widest the panel may be made; a stored width above it is shown at this width. */\n  readonly maxWidth?: number;\n  /**\n   * The width of this panel when a narrow viewport presents it as an overlay, in pixels (default 288).\n   * The workbench caps it at the viewport's width less a margin that leaves room to dismiss the\n   * overlay. It is not dragged, stored or set from code, and the widths above do not reach it.\n   */\n  readonly overlayWidth?: number;\n}\n\n/** A bar, rail or content region the distribution places into the border frame. */\nexport interface NonPanelRegion {\n  /** Stable id (slot targeting, collapse state, ordering). */\n  readonly id: string;\n  readonly type: Exclude<RegionType, 'panel'>;\n  readonly dock: DockPosition;\n}\n\n/** One region the distribution places into the border frame. */\nexport type LayoutRegion = PanelRegion | NonPanelRegion;\n\n/** A distribution's declared base layout — the workbench renders it. */\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.\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/**\n * A distribution declares its base layout with this provider. A panel region whose narrowest width\n * exceeds its widest, or whose start width lies outside its own bounds, is refused here, naming the\n * region.\n */\nexport function provideLayout(layout: ShellLayout): Provider {\n  for (const region of layout.regions) {\n    if (region.type === 'panel') {\n      assertPanelWidths(region.id, region);\n    }\n  }\n  return { provide: SHELL_LAYOUT, useValue: layout };\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((existing) => matches(existing));\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 { TabBadge, TabBadgeTone } from '@loomweaver/plugin-sdk';\n\nconst TONES: readonly TabBadgeTone[] = ['neutral', 'brand', 'success', 'danger'];\n\nconst MAX_LITERAL_LENGTH = 40;\n\nconst MAX_KEY_LENGTH = 200;\n\nexport function tabBadgeOf(value: unknown): TabBadge | undefined {\n  if (!value || typeof value !== 'object') {\n    return undefined;\n  }\n  const raw = value as Record<string, unknown>;\n  const literal = raw['textIsLiteral'] === true;\n  const longest = literal ? MAX_LITERAL_LENGTH : MAX_KEY_LENGTH;\n  const text =\n    typeof raw['text'] === 'string' && raw['text'].length > 0\n      ? [...raw['text']].slice(0, longest).join('')\n      : undefined;\n  const icon =\n    typeof raw['icon'] === 'string' && raw['icon'].length > 0\n      ? raw['icon']\n      : undefined;\n  if (text === undefined && icon === undefined) {\n    return undefined;\n  }\n  const tone = TONES.find((candidate) => candidate === raw['tone']);\n  return {\n    ...(text !== undefined && { text }),\n    ...(text !== undefined && literal && { textIsLiteral: true }),\n    ...(icon !== undefined && { icon }),\n    ...(tone !== undefined && tone !== 'neutral' && { tone }),\n  };\n}\n","import { signal } from '@angular/core';\nimport { TabBadge } from '@loomweaver/plugin-sdk';\n\nexport class SurfaceBadges {\n  private readonly badges = signal<ReadonlyMap<string, TabBadge>>(new Map());\n\n  badgeOf(id: string | undefined): TabBadge | undefined {\n    return id === undefined ? undefined : this.badges().get(id);\n  }\n\n  set(id: string, badge: TabBadge | undefined): void {\n    this.badges.update((badges) => {\n      if (JSON.stringify(badges.get(id)) === JSON.stringify(badge)) {\n        return badges;\n      }\n      const next = new Map([...badges].filter(([key]) => key !== id));\n      return badge === undefined ? next : next.set(id, badge);\n    });\n  }\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  readonly actions?: readonly ViewAction[];\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\ntype CommonSurfaceFields = Pick<\n  RegisteredSurface,\n  'access' | 'retain' | 'saveOn' | 'closable' | 'padded' | 'order'\n>;\n\ntype DockedSurfaceFields = Pick<\n  RegisteredSurface,\n  'id' | 'title' | 'icon' | 'actions' | 'instanceable'\n>;\n\nfunction commonSurfaceFields(source: CommonSurfaceFields): CommonSurfaceFields {\n  return {\n    access: source.access,\n    retain: source.retain,\n    saveOn: source.saveOn,\n    closable: source.closable,\n    padded: source.padded,\n    order: source.order,\n  };\n}\n\nfunction dockedSurfaceFields(source: DockedSurfaceFields): DockedSurfaceFields {\n  return {\n    id: source.id,\n    title: source.title,\n    icon: source.icon,\n    actions: source.actions,\n    instanceable: source.instanceable,\n  };\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  assertPlaceable(surface);\n  return {\n    ...dockedSurfaceFields(surface),\n    ...commonSurfaceFields(surface),\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    ...dockedSurfaceFields(view),\n    ...commonSurfaceFields(view),\n    docks: [view.region],\n    pluginId,\n    ...presentationOf(view),\n  } as RegisteredSurface;\n}\n\nexport function contentRouteToEntry(\n  route: RegisteredContentRoute,\n  pluginId?: string,\n): RegisteredSurface {\n  return {\n    id: route.id,\n    actions: route.actions,\n    ...commonSurfaceFields(route),\n    routable: routableFields(route),\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      ...routableFields(routable),\n      title: routable.title ?? entry.title,\n      icon: routable.icon ?? entry.icon,\n      actions: entry.actions,\n      ...commonSurfaceFields(entry),\n      pluginId: entry.pluginId,\n      ...presentationOf(entry),\n    } as RegisteredContentRoute;\n  });\n}\n\nfunction routableFields(\n  source: NonNullable<Surface['routable']>,\n): NonNullable<Surface['routable']> {\n  return {\n    path: source.path,\n    chromeless: source.chromeless,\n    title: source.title,\n    icon: source.icon,\n    titleIsLiteral: source.titleIsLiteral,\n    subRoutes: source.subRoutes,\n    rest: source.rest,\n    follows: source.follows,\n  };\n}\n\nexport function entryToView(entry: RegisteredSurface): RegisteredView {\n  return cached(viewCache, entry, () => ({\n    ...dockedSurfaceFields(entry),\n    ...commonSurfaceFields(entry),\n    id: entry.id ?? '',\n    region: entry.docks?.[0] ?? CONTAINER_CHILD_REGION,\n    title: entry.title ?? '',\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\nexport function assertPlaceable(\n  surface: Pick<Surface, 'id' | 'routable' | 'container' | 'docks'>,\n  who = `Surface \"${surface.id}\"`,\n): void {\n  if (surface.routable !== undefined) {\n    return;\n  }\n  if (surface.container !== undefined) {\n    throw new Error(\n      `${who}: a container surface must be routable, because 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      `${who} needs 'routable.path' (a URL-addressed surface) or 'docks' (a surface hosted at a dock); ` +\n        `it declares no docks, so it has no home region. Add docks: ['<regionId>'] (e.g. a panel region), ` +\n        `or docks: [] for a container-only child.`,\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 { RegisteredSurface } from './surface-normalize';\n\nexport function withoutOmitted<T>(\n  items: readonly T[],\n  omitted: ReadonlySet<string>,\n  idOf: (item: T) => string | undefined,\n): readonly T[] {\n  if (omitted.size === 0) {\n    return items;\n  }\n  return items.filter((item) => {\n    const id = idOf(item);\n    return id === undefined || !omitted.has(id);\n  });\n}\n\nexport function idsOf(\n  list: readonly { readonly id?: string }[],\n): readonly string[] {\n  return list.flatMap((item) => (item.id === undefined ? [] : [item.id]));\n}\n\nexport function 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 { computed, Service, signal, Signal, untracked, WritableSignal } from '@angular/core';\nimport { Command, ContentRoute, Disposable, MenuItem, TabBadge } from '@loomweaver/plugin-sdk';\nimport { BarItem } from '../foundation/bar-item';\nimport { RailItem } from '../foundation/rail-item';\nimport { View, ViewAction } from '../views/view';\nimport { Identified, upsertBy, upsertById } from '../foundation/identified';\nimport { isRouteOmitted } from './route-omit';\nimport { tabBadgeOf } from './tab-badge';\nimport { SurfaceBadges } from './surface-badges';\nimport {\n  RegisteredContentRoute,\n  RegisteredSurface,\n  RegisteredView,\n  contentRouteToEntry,\n  entryToContentRoute,\n  entryToView,\n  viewToEntry,\n} from './surface-normalize';\nimport { idsOf, sameSlotAs, withoutOmitted } from './registry-filters';\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\n/**\n * A menu entry as the registry holds it: the entry a plugin handed in, plus the owner the host\n * stamped on it, so that an entry aimed at a slot nothing declares can be reported with the plugin\n * that contributed it.\n */\nexport interface RegisteredMenuItem {\n  readonly item: MenuItem;\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 added to at runtime by plugins. Signal-based so the\n * 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.\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 badges = new SurfaceBadges();\n\n  private readonly barItemsSignal = signal<readonly BarItem[]>([]);\n\n  private readonly railItemsSignal = signal<readonly RailItem[]>([]);\n\n  private readonly menuEntriesSignal = signal<readonly RegisteredMenuItem[]>(\n    [],\n  );\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      withoutOmitted(\n        this.commandsSignal(),\n        this.omittedSignal(),\n        (entry) => 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    withoutOmitted(\n      this.dockedSurfaces(),\n      this.omittedSignal(),\n      (entry) => entry.id,\n    ).map((entry) => entryToView(entry)),\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 host 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((entry) => entryToContentRoute(entry));\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 host 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((entry) => entryToContentRoute(entry))\n        .filter((route) => isRouteOmitted(route, omitted));\n    });\n\n  readonly registeredMenuItems: Signal<readonly RegisteredMenuItem[]> =\n    computed(() =>\n      withoutOmitted(\n        this.menuEntriesSignal(),\n        this.omittedSignal(),\n        (entry) => entry.item.id,\n      ),\n    );\n\n  /** Menu-slot contributions; a menu filters these by slot and `when` as it opens. */\n  readonly menuItems: Signal<readonly MenuItem[]> = computed(() =>\n    this.registeredMenuItems().map((entry) => entry.item),\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    () =>\n      new Set([\n        ...this.commandsSignal().map((entry) => entry.command.id),\n        ...idsOf(this.surfacesSignal()),\n        ...idsOf(this.barItemsSignal()),\n        ...idsOf(this.railItemsSignal()),\n        ...idsOf(this.menuEntriesSignal().map((entry) => entry.item)),\n      ]),\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((entry) => entry.routable !== undefined || entry.id !== id),\n    );\n    this.forgetBadgeOfGone(id);\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  /**\n   * Adds a menu-slot item. With an `id` a re-registration replaces in place (last-in wins); without\n   * one the item is additive and dispose removes this exact contribution. `pluginId` is stamped by\n   * the host, never claimed by the plugin; the shell's own entries carry none.\n   */\n  addMenuItem(item: MenuItem, pluginId?: string): Disposable {\n    const entry: RegisteredMenuItem = { item, ownerId: pluginId };\n    this.menuEntriesSignal.update((entries) =>\n      upsertBy(\n        entries,\n        entry,\n        (existing) => item.id !== undefined && existing.item.id === item.id,\n      ),\n    );\n    return {\n      dispose: () =>\n        this.menuEntriesSignal.update((entries) =>\n          entries.filter((existing) => existing !== entry),\n        ),\n    };\n  }\n\n  removeMenuItemById(id: string): void {\n    this.menuEntriesSignal.update((entries) =>\n      entries.filter((existing) => existing.item.id !== id),\n    );\n  }\n\n  /**\n   * Replaces the title of a registered surface in place, leaving everything else it declared alone.\n   * A rename is not a re-registration: the entry keeps its identity, so nothing mounted from it is\n   * rebuilt. An id nothing was registered under is a no-op.\n   */\n  retitleSurface(id: string, title: string): void {\n    this.surfacesSignal.update((entries) =>\n      entries.map((entry) =>\n        entry.id === id && entry.title !== title ? { ...entry, title } : entry,\n      ),\n    );\n  }\n\n  updateSurfaceBadge(id: string, badge: TabBadge | null, pluginId?: string): void {\n    const owned = untracked(() =>\n      this.surfacesSignal().some(\n        (entry) => entry.id === id && (pluginId === undefined || entry.pluginId === pluginId),\n      ),\n    );\n    if (owned) {\n      this.badges.set(id, tabBadgeOf(badge));\n    }\n  }\n\n  badgeOf(id: string | undefined): TabBadge | undefined {\n    return this.badges.badgeOf(id);\n  }\n\n  /**\n   * Replaces one action of a registered surface in place, by the action's id, leaving the entry's\n   * identity and everything else it declared alone. An action id the surface did not carry is added.\n   * A surface id nothing was registered under is a no-op.\n   */\n  updateSurfaceAction(id: string, action: ViewAction): void {\n    this.surfacesSignal.update((entries) =>\n      entries.map((entry) =>\n        entry.id === id\n          ? { ...entry, actions: upsertById(entry.actions ?? [], action) }\n          : entry,\n      ),\n    );\n  }\n\n  ownerOfSurface(id: string): string | undefined {\n    return this.surfacesSignal().find((entry) => entry.id === id)?.pluginId;\n  }\n\n  actionsOf(id: string | undefined): readonly ViewAction[] {\n    if (id === undefined) {\n      return [];\n    }\n    return (\n      this.surfacesSignal().find((entry) => entry.id === id)?.actions ?? []\n    );\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((existing) => existing !== entry),\n        );\n        this.forgetBadgeOfGone(entry.id);\n      },\n    };\n  }\n\n  private forgetBadgeOfGone(id: string | undefined): void {\n    if (\n      id !== undefined &&\n      untracked(() => this.surfacesSignal().every((entry) => entry.id !== id))\n    ) {\n      this.badges.set(id, undefined);\n    }\n  }\n\n  private visible<T extends { readonly id?: string }>(\n    source: Signal<readonly T[]>,\n  ): Signal<readonly T[]> {\n    return computed(() =>\n      withoutOmitted(source(), this.omittedSignal(), (item) => item.id),\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((existing) => existing !== 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((existing) => existing.id !== id));\n  }\n}\n","import { APP_BASE_HREF, Location, PlatformLocation } from '@angular/common';\nimport { inject, Service } from '@angular/core';\n\n@Service()\nexport class ServedBase {\n  private readonly href =\n    inject(APP_BASE_HREF, { optional: true }) ||\n    inject(PlatformLocation).getBaseHrefFromDOM() ||\n    '/';\n  private readonly prefix = Location.stripTrailingSlash(this.href);\n  readonly path = `${this.prefix}/`;\n\n  under(path: string): string {\n    return Location.joinWithSlash(this.href, path);\n  }\n\n  below(pathname: string): string {\n    const within =\n      this.prefix !== '' &&\n      (pathname === this.prefix || pathname.startsWith(`${this.prefix}/`));\n    return within ? pathname.slice(this.prefix.length) : pathname;\n  }\n}\n","export function withoutTrailingSlashes(path: string): string {\n  let end = path.length;\n  while (end > 0 && path[end - 1] === '/') {\n    end -= 1;\n  }\n  return path.slice(0, end);\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(/[?#]/, 1)[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 isAtOrBelow(root: string, path: string): boolean {\n  return path === root || path.startsWith(`${root}/`);\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  for (const [index, part] of parts.entries()) {\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","export const PRIMARY_PANE = 'main';\n\nexport const VIEW_PANE_PREFIX = 'view:';\n\nexport const CONTENT_DOCK = 'content';\n\n/**\n * Names one pane of the workbench: the dock it belongs to (`'content'` for the main area, a\n * sidebar region's id otherwise) and the pane's id within it. A tab's menu context carries both as\n * `group` and `paneId`, so a command can act on the pane the tab stands in.\n */\nexport interface PaneRef {\n  readonly dock: string;\n  readonly paneId: string;\n}\n\nexport function isViewPanePath(path: string): boolean {\n  return path.startsWith(VIEW_PANE_PREFIX);\n}\n\nexport function viewPanePath(viewId: string): string {\n  return VIEW_PANE_PREFIX + viewId;\n}\n\nexport function isSamePane(a: PaneRef, b: PaneRef): boolean {\n  return a.dock === b.dock && a.paneId === b.paneId;\n}\n\nexport function viewIdOfPanePath(path: string): string | null {\n  return isViewPanePath(path) ? path.slice(VIEW_PANE_PREFIX.length) : 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 isViewPanePath(promoted) ? '' : promoted;\n}\n","import { withoutTrailingSlashes } from '../foundation/wire/path-text';\nimport { normalizePath } from '../regions/content/content-path';\nimport { viewIdOfPanePath, viewPanePath } from '../regions/pane/tree/pane-address';\n\nexport const POPOUT_PREFIX = 'popout';\n\nconst VIEW_SEGMENT = 'view/';\n\nfunction bare(url: string): string {\n  return withoutTrailingSlashes(normalizePath(url));\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 viewPanePath(rest.slice(VIEW_SEGMENT.length));\n  }\n  return rest;\n}\n\nexport function popoutUrlFor(paneTarget: string): string {\n  const viewId = viewIdOfPanePath(paneTarget);\n  if (viewId !== null) {\n    return `/${POPOUT_PREFIX}/${VIEW_SEGMENT}${viewId}`;\n  }\n  const path = paneTarget.replace(/^\\/+/, '');\n  return path === ''\n    ? `/${POPOUT_PREFIX}`\n    : `/${POPOUT_PREFIX}/${path}`;\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Service } from '@angular/core';\nimport { ServedBase } from '../foundation/served-base';\nimport { isPopoutUrl } from './popout-path';\n\n@Service()\nexport class PopoutWindow {\n  readonly active = isPopoutUrl(\n    inject(ServedBase).below(inject(DOCUMENT).location?.pathname ?? ''),\n  );\n}\n","import { DirtySurface } from '@loomweaver/plugin-sdk';\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 { untracked } from '@angular/core';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { matchRoute } from '../../regions/content/content-path';\nimport { viewIdOfPanePath } from '../../regions/pane/tree/pane-address';\n\nexport function pathOwnedBy(\n  registry: ContributionRegistry,\n  pluginId: string,\n): (path: string) => boolean {\n  const routes = registry\n    .contentRoutes()\n    .filter((route) => route.pluginId === pluginId);\n  const viewIds = new Set(\n    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    const viewId = viewIdOfPanePath(path);\n    if (viewId !== null) {\n      return viewIds.has(viewId);\n    }\n    return matchRoute(routes, path) !== undefined;\n  };\n}\n\nexport function surfaceOwnedBy(\n  registry: ContributionRegistry,\n  pluginId: string,\n  surfaceId: string,\n): boolean {\n  return untracked(() =>\n    [...registry.views(), ...registry.contentRoutes()].some(\n      (surface) => surface.id === surfaceId && surface.pluginId === pluginId,\n    ),\n  );\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","/**\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 and validate their own payloads.\n * `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 a best-effort\n * try/catch (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    whereStorageAllows(() => localStorage.setItem(key, value));\n    return Promise.resolve();\n  }\n\n  delete(key: string): Promise<void> {\n    whereStorageAllows(() => localStorage.removeItem(key));\n    return Promise.resolve();\n  }\n}\n\nfunction whereStorageAllows(write: () => void): void {\n  try {\n    write();\n  } catch {\n    return;\n  }\n}\n","import { KeyValueStore } from './key-value-store';\n\nexport function peekThrough(\n  inner: KeyValueStore,\n  keyOf: (key: string) => string = (key) => key,\n): ((key: string) => string | undefined) | undefined {\n  const innerPeek = inner.peek?.bind(inner);\n  return innerPeek === undefined ? undefined : (key) => innerPeek(keyOf(key));\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.addEventListener('message', (event: MessageEvent) =>\n        this.receive(event.data),\n      );\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 { peekThrough } from '../peek-through';\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    this.peek = peekThrough(inner);\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/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/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 * Whether the workbench tells the user, in the workspace itself, that a workspace cannot work as its\n * declaration describes, and offers the reset that repairs it. On unless the composition passes\n * {@link withoutUnusableWorkspaceNotice}. Read by the workbench; a distribution never injects it.\n */\nexport const ANNOUNCE_UNUSABLE_WORKSPACES = new InjectionToken<boolean>(\n  'lw.announceUnusableWorkspaces',\n  { providedIn: 'root', factory: () => true },\n);\n\n/**\n * One optional setting for the workspaces of a composition, passed alongside the declarations to\n * {@link provideWorkspaces}. Produced by a `without…` function; a distribution never writes one.\n */\nexport interface WorkspacesFeature {\n  readonly kind: 'workspaces-feature';\n  readonly announcesUnusable: boolean;\n}\n\n/**\n * Silences the workbench where a workspace cannot work as its declaration describes, for the whole\n * composition. Nothing else changes: the stored arrangement is still restored untouched, the\n * workspace is still entered rather than exchanged for another, and which workspaces are affected\n * stays readable — so a product that takes this turns the answer over to itself rather than away.\n */\nexport function withoutUnusableWorkspaceNotice(): WorkspacesFeature {\n  return { kind: 'workspaces-feature', announcesUnusable: false };\n}\n\nfunction isFeature(\n  declaration: WorkspaceDefinition | WorkspacesFeature,\n): declaration is WorkspacesFeature {\n  return (declaration as WorkspacesFeature).kind === 'workspaces-feature';\n}\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 *\n * A {@link WorkspacesFeature} such as {@link withoutUnusableWorkspaceNotice} may be passed among the\n * declarations; it settles that one question for the whole composition rather than per workspace.\n */\nexport function provideWorkspaces(\n  ...declarations: (WorkspaceDefinition | WorkspacesFeature)[]\n): EnvironmentProviders {\n  const features = declarations.filter(isFeature);\n  const definitions = declarations.filter(\n    (declaration): declaration is WorkspaceDefinition =>\n      !isFeature(declaration),\n  );\n  return makeEnvironmentProviders([\n    { provide: WORKSPACE_DEFINITIONS, useValue: definitions, multi: true },\n    ...(features.length === 0\n      ? []\n      : [\n          {\n            provide: ANNOUNCE_UNUSABLE_WORKSPACES,\n            useValue: features.every((feature) => feature.announcesUnusable),\n          },\n        ]),\n  ]);\n}\n","import { type WorkspaceClaim } from '../workspace-claims';\nimport { WorkspaceDefinition } from './workspace-definition';\n\nexport const BUILT_IN_WORKSPACE_ID = 'default';\n\nexport function startingWorkspaceId(\n  definitions: readonly WorkspaceDefinition[],\n): string {\n  return (\n    dedupedDefinitions(definitions).find((definition) => definition.initial)\n      ?.id ?? BUILT_IN_WORKSPACE_ID\n  );\n}\n\nexport function offersBuiltInWorkspace(\n  definitions: readonly WorkspaceDefinition[],\n): boolean {\n  return startingWorkspaceId(definitions) === BUILT_IN_WORKSPACE_ID;\n}\n\nexport function dedupedDefinitions(\n  definitions: readonly WorkspaceDefinition[],\n): WorkspaceDefinition[] {\n  const seen = new Set<string>([BUILT_IN_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 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","import { inject, Service, signal } from '@angular/core';\nimport { readStoredValue } from '../persistence/stored-values/hydrate';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { WORKSPACE_DEFINITIONS } from './declaration/provide-workspaces';\nimport {\n  BUILT_IN_WORKSPACE_ID,\n  startingWorkspaceId,\n} from './declaration/composed-definitions';\n\nconst ACTIVE_KEY = 'lw.shell.active-workspace';\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 workingStateStore = inject(WORKING_STATE_STORE);\n  private readonly startingId = startingWorkspaceId(\n    (inject(WORKSPACE_DEFINITIONS, { optional: true }) ?? []).flat(),\n  );\n  private readonly declaredInitial =\n    this.startingId === BUILT_IN_WORKSPACE_ID ? null : this.startingId;\n  private readonly active = signal(\n    this.fromStore(this.workingStateStore.peek?.(ACTIVE_KEY)) ??\n      this.startingId,\n  );\n  readonly id = this.active.asReadonly();\n\n  private adopted = false;\n  private chosen = false;\n  readonly ready: Promise<string> = this.resolveInitial();\n\n  set(id: string): void {\n    this.adopted = false;\n    this.chosen = true;\n    this.active.set(id);\n    void this.workingStateStore.set(ACTIVE_KEY, id);\n  }\n\n  wasChosen(): boolean {\n    return this.chosen;\n  }\n\n  async reread(): Promise<void> {\n    const id = this.fromStore(\n      await readStoredValue(this.workingStateStore, ACTIVE_KEY),\n    );\n    if (id !== null) {\n      this.active.set(id);\n    }\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.workingStateStore.peek) {\n      const raw = this.workingStateStore.peek(ACTIVE_KEY);\n      this.adoptIfUnseen(storedId(raw));\n      this.rewriteSuperseded(raw);\n      return Promise.resolve(this.active());\n    }\n    return this.workingStateStore\n      .get(ACTIVE_KEY)\n      .then((raw) => {\n        const id = this.fromStore(raw);\n        if (id) {\n          this.active.set(id);\n          this.rewriteSuperseded(raw);\n        } else {\n          this.adoptIfUnseen(null);\n        }\n        return this.active();\n      })\n      .catch(() => this.active());\n  }\n\n  private fromStore(raw: string | undefined): string | null {\n    const id = storedId(raw);\n    return id === BUILT_IN_WORKSPACE_ID ? this.startingId : id;\n  }\n\n  private rewriteSuperseded(raw: string | undefined): void {\n    if (\n      storedId(raw) === BUILT_IN_WORKSPACE_ID &&\n      this.declaredInitial !== null\n    ) {\n      void this.workingStateStore.set(ACTIVE_KEY, this.declaredInitial);\n    }\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.workingStateStore.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\nfunction insertNode(parent: Node, node: Node, before: Node | null): void {\n  if (before === null) {\n    (parent as ParentNode).append(node);\n    return;\n  }\n  (before as ChildNode).before(node);\n}\n\nexport function placeBefore(anchor: Node, nodes: readonly Node[]): void {\n  const parent = anchor.parentNode;\n  if (!parent) {\n    return;\n  }\n  for (const node of nodes) {\n    moveNode(parent, node, anchor);\n  }\n}\n\nexport function moveNode(\n  parent: Node,\n  node: Node,\n  before: Node | null,\n): boolean {\n  if (!movable(parent) || !node.isConnected) {\n    insertNode(parent, node, before);\n    return false;\n  }\n  try {\n    parent.moveBefore(node, before);\n    return true;\n  } catch {\n    insertNode(parent, node, before);\n    return false;\n  }\n}\n","import { ContainerChild, ContainerSpec, View } from '@loomweaver/plugin-sdk';\nimport { matchRoute, segmentsOf } from '../../content/content-path';\nimport { CONTENT_DOCK } from '../tree/pane-address';\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 isContentSideDock(dock: string): boolean {\n  return dock === CONTENT_DOCK || isContainerDock(dock);\n}\n\nexport function containerInstanceId(dock: string, key: string): string {\n  return `${dock}::${key}`;\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 { containerDockFor } from '../container/container-children';\n\nconst PRIMARY_PREFIX = 'primary:';\nconst PANE_SEPARATOR = ':';\nconst PART_SEPARATOR = '|';\n\nexport function paneRetentionScope(dock: string, paneId: string): string {\n  return `${dock}${PANE_SEPARATOR}${paneId}`;\n}\n\nexport function surfaceRetentionKey(scope: string, path: string): string {\n  return `${scope}${PART_SEPARATOR}${path}`;\n}\n\nexport function viewRetentionKey(\n  scope: string,\n  path: string,\n  instance: string | undefined,\n): string {\n  return `${surfaceRetentionKey(scope, path)}${PART_SEPARATOR}${instance ?? ''}`;\n}\n\nexport function primaryRetentionKey(dock: string): string {\n  return `${PRIMARY_PREFIX}${dock}`;\n}\n\nexport function isPrimaryRetentionKey(key: string): boolean {\n  return key.startsWith(PRIMARY_PREFIX);\n}\n\nexport function scopeOfRetentionKey(key: string): string {\n  return key.split(PART_SEPARATOR, 1)[0];\n}\n\nexport function pathOfRetentionKey(key: string): string {\n  return key.split(PART_SEPARATOR, 2)[1] ?? '';\n}\n\nexport function isKeyOfDock(key: string, dock: string): boolean {\n  return key.startsWith(`${dock}${PANE_SEPARATOR}`);\n}\n\nexport function isKeyOfPane(\n  key: string,\n  dock: string,\n  paneId: string,\n): boolean {\n  return key.startsWith(`${paneRetentionScope(dock, paneId)}${PART_SEPARATOR}`);\n}\n\nexport function isKeyForSurface(\n  key: string,\n  scope: string,\n  path: string,\n): boolean {\n  const exact = surfaceRetentionKey(scope, path);\n  return key === exact || key.startsWith(`${exact}${PART_SEPARATOR}`);\n}\n\nexport function containerChildInstances(\n  entries: readonly { key: string; instance: unknown }[],\n  tabPath: string,\n): unknown[] {\n  const dock = containerDockFor(tabPath);\n  return entries\n    .filter((entry) => isKeyOfDock(entry.key, dock))\n    .map((entry) => entry.instance);\n}\n","import { EmbeddedViewRef } from '@angular/core';\nimport { SurfaceRetentionMode } from './retention-policy';\nimport { ParkedEntry, RetainedViewSource } from './retained-view-model';\nimport { SurfaceHoldState } from './surface-hold';\nimport { isKeyForSurface } from './retention-keys';\nimport { HiddenNode } from './holding-area';\n\nexport type DeferredPlacement = 'detach' | 'hideInPlace';\n\nexport interface StashEntry {\n  key: string;\n  readonly source: RetainedViewSource;\n  readonly view: EmbeddedViewRef<unknown>;\n  readonly instance?: unknown;\n  readonly tracked: boolean;\n  readonly hold: SurfaceHoldState | null;\n  workspace: string;\n  owner: object | null;\n  inUse: boolean;\n  retains: boolean;\n  inPlace: boolean;\n  mode: SurfaceRetentionMode;\n  hidden: readonly HiddenNode[];\n  deferred: DeferredPlacement | null;\n  unlisten: () => void;\n}\n\nexport function liveRootNodes(entry: StashEntry): readonly Node[] {\n  return entry.view.destroyed ? [] : entry.view.rootNodes;\n}\n\nexport function elementsOf(entry: StashEntry): HTMLElement[] {\n  return liveRootNodes(entry).filter(\n    (node): node is HTMLElement => node.nodeType === 1,\n  );\n}\n\nexport function parkedInPlaceAt(\n  entry: StashEntry,\n  parent: Node | null,\n): boolean {\n  const nodes = liveRootNodes(entry);\n  return (\n    nodes.length > 0 &&\n    nodes.every((node) => node.isConnected && node.parentNode === parent)\n  );\n}\n\nexport function orphaned(entry: StashEntry): boolean {\n  return (\n    entry.inPlace && liveRootNodes(entry).some((node) => !node.isConnected)\n  );\n}\n\nexport function isHeld(entry: StashEntry): boolean {\n  return entry.hold?.held() === true;\n}\n\nfunction holderOf(\n  entries: Iterable<StashEntry>,\n  hold: SurfaceHoldState | null,\n): StashEntry | undefined {\n  if (!hold?.held()) {\n    return undefined;\n  }\n  return [...entries].find((entry) => entry.hold === hold);\n}\n\nexport function heldInUseElsewhere(\n  entries: Iterable<StashEntry>,\n  key: string,\n  hold: SurfaceHoldState | null,\n): boolean {\n  const holder = holderOf(entries, hold);\n  return holder !== undefined && holder.inUse && holder.key !== key;\n}\n\nexport function adoptHeld(\n  entries: Map<string, StashEntry>,\n  key: string,\n  hold: SurfaceHoldState | null,\n): StashEntry | null {\n  const holder = holderOf(entries.values(), hold);\n  if (!holder || holder.inUse) {\n    return null;\n  }\n  entries.delete(holder.key);\n  holder.key = key;\n  entries.set(key, holder);\n  return holder;\n}\n\nexport function parkedEntriesOf(entries: Iterable<StashEntry>): ParkedEntry[] {\n  return [...entries]\n    .filter((entry) => !entry.inUse)\n    .map((entry) => ({\n      key: entry.key,\n      retains: entry.retains,\n      held: isHeld(entry),\n      workspace: entry.workspace,\n      instance: entry.instance,\n    }));\n}\n\nexport function instancesOf(entries: Iterable<StashEntry>): unknown[] {\n  return [...entries]\n    .map((entry) => entry.instance)\n    .filter((instance) => instance !== undefined);\n}\n\nexport function keyedInstancesOf(\n  entries: Iterable<StashEntry>,\n): { key: string; instance: unknown }[] {\n  return [...entries]\n    .filter((entry) => entry.instance !== undefined)\n    .map((entry) => ({ key: entry.key, instance: entry.instance }));\n}\n\nexport function parkedInstancesIn(\n  entries: Iterable<StashEntry>,\n  workspaceId: string,\n): unknown[] {\n  return [...entries]\n    .filter((entry) => !entry.inUse && entry.workspace === workspaceId)\n    .map((entry) => entry.instance)\n    .filter((instance) => instance !== undefined);\n}\n\nexport function instancesAt(\n  entries: Iterable<StashEntry>,\n  scope: string,\n  path: string,\n): unknown[] {\n  return [...entries]\n    .filter((entry) => isKeyForSurface(entry.key, scope, path))\n    .map((entry) => entry.instance)\n    .filter((instance) => instance !== undefined);\n}\n\nexport function lastHolder(\n  entry: StashEntry,\n  entries: Iterable<StashEntry>,\n): boolean {\n  return [...entries].every((other) => other.hold !== entry.hold);\n}\n\nexport function endHoldsIn(\n  entries: Iterable<StashEntry>,\n  workspaceId: string,\n): void {\n  for (const entry of entries) {\n    if (entry.workspace === workspaceId) {\n      entry.hold?.end();\n    }\n  }\n}\n","import { moveNode } from './atomic-move';\n\nexport interface HiddenNode {\n  readonly element: HTMLElement;\n  readonly display: string;\n}\n\nexport class HoldingArea {\n  private element: HTMLElement | null = null;\n\n  constructor(private readonly document: Document) {}\n\n  moveInto(nodes: readonly Node[]): void {\n    const area = this.connected();\n    for (const node of nodes) {\n      if (node.parentNode !== area) {\n        moveNode(area, node, null);\n      }\n    }\n  }\n\n  remove(): void {\n    this.element?.remove();\n    this.element = null;\n  }\n\n  private connected(): HTMLElement {\n    if (this.element?.isConnected) {\n      return this.element;\n    }\n    const area = this.document.createElement('div');\n    area.dataset['lwRetentionHold'] = '';\n    area.style.display = 'none';\n    this.document.body.append(area);\n    this.element = area;\n    return area;\n  }\n}\n\nexport function hideElements(\n  elements: readonly HTMLElement[],\n): readonly HiddenNode[] {\n  return elements.map((element) => {\n    const display = element.style.display;\n    element.style.display = 'none';\n    return { element, display };\n  });\n}\n\nexport function revealElements(hidden: readonly HiddenNode[]): void {\n  for (const { element, display } of hidden) {\n    element.style.display = display;\n  }\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n  ApplicationRef,\n  inject,\n  OnDestroy,\n  Service,\n  signal,\n  Signal,\n} from '@angular/core';\nimport { ActiveWorkspaceService } from '../../../workspace/active-workspace.service';\nimport { supportsAtomicMove } from './atomic-move';\nimport { SurfaceRetentionMode } from './retention-policy';\nimport { instanceDirty } from '../unsaved-work/dirty-surface';\nimport {\n  ParkedEntry,\n  RetainedSlot,\n  RetainedViewHandle,\n  RetainedViewSource,\n  SlotPlacement,\n} from './retained-view-model';\nimport {\n  adoptHeld,\n  elementsOf,\n  endHoldsIn,\n  heldInUseElsewhere,\n  instancesAt,\n  instancesOf,\n  isHeld,\n  keyedInstancesOf,\n  lastHolder,\n  liveRootNodes,\n  orphaned,\n  parkedEntriesOf,\n  parkedInPlaceAt,\n  parkedInstancesIn,\n  StashEntry,\n} from './stash-entries';\nimport { SurfaceHoldState } from './surface-hold';\nimport { HoldingArea, hideElements, revealElements } from './holding-area';\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 readonly holdingArea = new HoldingArea(this.document);\n\n  readonly version: Signal<number> = this.changes.asReadonly();\n\n  acquire(\n    key: string,\n    source: RetainedViewSource,\n    create: () => RetainedViewHandle,\n    { parent = null, hold = null }: SlotPlacement = {},\n  ): RetainedSlot {\n    const entry =\n      this.claimableEntry(key, source, parent) ??\n      adoptHeld(this.entries, key, hold) ??\n      this.createEntry(key, source, create);\n    const attached = entry.inPlace && parkedInPlaceAt(entry, parent);\n    this.showNodes(entry);\n    const token = {};\n    entry.owner = token;\n    entry.workspace = this.workspace.id();\n    entry.inUse = true;\n    entry.retains = false;\n    entry.inPlace = false;\n    entry.deferred = null;\n    this.bump();\n    return this.slotFor(entry, token, attached);\n  }\n\n  parked(): ParkedEntry[] {\n    return parkedEntriesOf(this.entries.values());\n  }\n\n  heldElsewhere(key: string, hold: SurfaceHoldState | null): boolean {\n    return heldInUseElsewhere(this.entries.values(), key, hold);\n  }\n\n  instances(): unknown[] {\n    return instancesOf(this.entries.values());\n  }\n\n  parkedInstancesOf(workspaceId: string): unknown[] {\n    return parkedInstancesIn(this.entries.values(), workspaceId);\n  }\n\n  keyedInstances(): { key: string; instance: unknown }[] {\n    return keyedInstancesOf(this.entries.values());\n  }\n\n  instancesFor(scope: string, path: string): unknown[] {\n    return instancesAt(this.entries.values(), scope, path);\n  }\n\n  evacuate(matches: (key: string) => boolean): void {\n    if (!this.atomicMove) {\n      return;\n    }\n    let moved = false;\n    for (const entry of this.entries.values()) {\n      if (\n        !entry.inUse ||\n        !entry.retains ||\n        entry.mode !== 'in-place' ||\n        isHeld(entry) ||\n        !matches(entry.key)\n      ) {\n        continue;\n      }\n      this.holdingArea.moveInto(liveRootNodes(entry));\n      moved = true;\n    }\n    if (moved) {\n      this.bump();\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    const snapshot = [...this.entries.values()];\n    for (const entry of snapshot) {\n      if (!entry.inUse && entry.workspace === workspaceId) {\n        this.destroyEntry(entry);\n      }\n    }\n  }\n\n  endHolds(workspaceId: string): void {\n    endHoldsIn(this.entries.values(), workspaceId);\n  }\n\n  ngOnDestroy(): void {\n    const snapshot = [...this.entries.values()];\n    for (const entry of snapshot) {\n      this.destroyEntry(entry);\n    }\n    this.holdingArea.remove();\n  }\n\n  private slotFor(\n    entry: StashEntry,\n    token: object,\n    attached: boolean,\n  ): RetainedSlot {\n    const key = entry.key;\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      held: () => isHeld(entry),\n      describe: (mode: SurfaceRetentionMode, retains: boolean) => {\n        if (!owns()) {\n          return;\n        }\n        entry.mode = mode;\n        entry.retains = retains;\n      },\n      detach: (retains: boolean) => {\n        if (owns()) {\n          this.detachEntry(entry, retains);\n        }\n      },\n      hideInPlace: (retains: boolean) => {\n        if (owns()) {\n          this.parkInPlace(entry, retains);\n        }\n      },\n      discard: () => {\n        if (owns()) {\n          this.discard(entry);\n        }\n      },\n    };\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, hold = null } = create();\n    this.appRef.attachView(view);\n    const entry: StashEntry = {\n      key,\n      source,\n      view,\n      instance,\n      tracked: !occupied,\n      hold,\n      workspace: this.workspace.id(),\n      owner: null,\n      inUse: false,\n      retains: false,\n      inPlace: false,\n      mode: 'move',\n      hidden: [],\n      deferred: null,\n      unlisten: () => undefined,\n    };\n    if (hold) {\n      entry.unlisten = hold.onRelease(() => this.applyDeferredPlacement(entry));\n    }\n    if (entry.tracked) {\n      this.entries.set(key, entry);\n    }\n    return entry;\n  }\n\n  private detachEntry(entry: StashEntry, retains: boolean): void {\n    if (!entry.inUse) {\n      return;\n    }\n    if (isHeld(entry)) {\n      entry.deferred = 'detach';\n    } else {\n      this.pullNodes(entry);\n    }\n    this.letGoOf(entry, retains);\n  }\n\n  private parkInPlace(entry: StashEntry, retains: boolean): void {\n    if (!entry.inUse) {\n      return;\n    }\n    entry.retains = retains;\n    if (isHeld(entry)) {\n      entry.deferred = 'hideInPlace';\n      entry.inPlace = false;\n    } else {\n      this.hideNodes(entry);\n    }\n    this.letGoOf(entry, retains);\n  }\n\n  private hideNodes(entry: StashEntry): void {\n    if (entry.retains && this.atomicMove) {\n      this.holdingArea.moveInto(liveRootNodes(entry));\n    }\n    entry.hidden = hideElements(elementsOf(entry));\n    entry.inPlace = true;\n  }\n\n  private showNodes(entry: StashEntry): void {\n    revealElements(entry.hidden);\n    entry.hidden = [];\n  }\n\n  private applyDeferredPlacement(entry: StashEntry): void {\n    const deferred = entry.deferred;\n    entry.deferred = null;\n    if (!entry.inUse && deferred !== null) {\n      if (deferred === 'detach') {\n        this.pullNodes(entry);\n      } else {\n        this.hideNodes(entry);\n      }\n      this.queueSweep();\n    }\n    this.bump();\n  }\n\n  private letGoOf(entry: StashEntry, retains: boolean): void {\n    entry.inUse = false;\n    entry.owner = null;\n    if (!entry.tracked) {\n      this.destroyEntry(entry);\n      return;\n    }\n    entry.retains = retains;\n    this.bump();\n    this.queueSweep();\n  }\n\n  private relocatable(entry: StashEntry): boolean {\n    return (\n      this.atomicMove && liveRootNodes(entry).every((node) => node.isConnected)\n    );\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 as ChildNode).remove();\n    }\n  }\n\n  private destroyEntry(entry: StashEntry): void {\n    entry.unlisten();\n    this.pullNodes(entry);\n    if (this.entries.get(entry.key) === entry) {\n      this.entries.delete(entry.key);\n    }\n    if (lastHolder(entry, this.entries.values())) {\n      entry.hold?.end();\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      const snapshot = [...this.entries.values()];\n      for (const entry of snapshot) {\n        if (entry.inUse || isHeld(entry)) {\n          continue;\n        }\n        if (\n          orphaned(entry) ||\n          (!entry.retains && !instanceDirty(entry.instance))\n        ) {\n          this.destroyEntry(entry);\n        }\n      }\n    });\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { pathOwnedBy } from '../../../plugin/context/plugin-surface-ownership';\nimport { normalizePath, tabRootOf } from '../../content/content-path';\nimport { isViewPanePath } from '../tree/pane-address';\nimport { RetainedViewStash } from '../retention/retained-view-stash';\nimport { instanceDirty } from './dirty-surface';\nimport {\n  containerChildInstances,\n  pathOfRetentionKey,\n} from '../retention/retention-keys';\n\n@Service()\nexport class UnsavedWork {\n  private readonly stash = inject(RetainedViewStash);\n  private readonly registry = inject(ContributionRegistry);\n\n  instancesAt(scope: string, path: string): unknown[] {\n    this.stash.version();\n    const keyed = this.stash.keyedInstances();\n    const addresses = this.addressesOf(path);\n    return [\n      ...new Set([\n        ...addresses.flatMap((address) =>\n          this.stash.instancesFor(scope, address),\n        ),\n        ...addresses.flatMap((address) =>\n          containerChildInstances(keyed, address),\n        ),\n      ]),\n    ];\n  }\n\n  instancesEverywhere(): unknown[] {\n    return this.stash.instances();\n  }\n\n  instancesOfPlugin(pluginId: string): unknown[] {\n    const owns = pathOwnedBy(this.registry, pluginId);\n    return this.stash\n      .keyedInstances()\n      .filter((entry) => owns(pathOfRetentionKey(entry.key)))\n      .map((entry) => entry.instance);\n  }\n\n  at(scope: string, path: string): boolean {\n    return this.instancesAt(scope, path).some((instance) =>\n      instanceDirty(instance),\n    );\n  }\n\n  anywhere(path: string): boolean {\n    return this.instancesAnywhere(path).some((instance) =>\n      instanceDirty(instance),\n    );\n  }\n\n  private instancesAnywhere(path: string): unknown[] {\n    this.stash.version();\n    const keyed = this.stash.keyedInstances();\n    const addresses = this.addressesOf(path);\n    const named = new Set(addresses);\n    return [\n      ...new Set([\n        ...keyed\n          .filter((entry) => named.has(pathOfRetentionKey(entry.key)))\n          .map((entry) => entry.instance),\n        ...addresses.flatMap((address) =>\n          containerChildInstances(keyed, address),\n        ),\n      ]),\n    ];\n  }\n\n  private addressesOf(path: string): string[] {\n    if (isViewPanePath(path)) {\n      return [path];\n    }\n    const normalized = normalizePath(path);\n    const root = tabRootOf(this.registry.contentRoutes(), normalized);\n    return root === normalized ? [normalized] : [normalized, root];\n  }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, OnDestroy, Service } from '@angular/core';\nimport { PopoutWindow } from '../../../popout/popout-window';\nimport { instanceDirty } from './dirty-surface';\nimport { UnsavedWork } from './unsaved-work';\n\n@Service()\nexport class RetentionUnloadGuard implements OnDestroy {\n  private readonly unsavedWork = inject(UnsavedWork);\n  private readonly document = inject(DOCUMENT);\n  private readonly popout = inject(PopoutWindow).active;\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.unsavedWork\n      .instancesEverywhere()\n      .some((instance) => instanceDirty(instance));\n    if (!dirty) {\n      return;\n    }\n    event.preventDefault();\n  };\n}\n","import {\n  effect,\n  inject,\n  Injector,\n  Service,\n  Signal,\n  untracked,\n} from '@angular/core';\nimport { AuthSnapshot } from '@loomweaver/plugin-sdk';\nimport { RetentionUnloadGuard } from '../regions/pane/unsaved-work/retention-unload-guard';\nimport { ServedBase } from '../foundation/served-base';\nimport { PopoutWindow } from '../popout/popout-window';\n\n@Service()\nexport class IdentityChangeReload {\n  private readonly injector = inject(Injector);\n  private readonly unloadGuard = inject(RetentionUnloadGuard);\n  private readonly base = inject(ServedBase);\n  private readonly popout = inject(PopoutWindow);\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.leave();\n          });\n          return;\n        }\n        this.lastSubject = subject;\n      },\n      { injector: this.injector },\n    );\n  }\n\n  protected closeWindow(): boolean {\n    window.close();\n    return window.closed;\n  }\n\n  protected openAt(url: string): void {\n    location.replace(url);\n  }\n\n  private leave(): void {\n    if (this.popout.active && this.closeWindow()) {\n      return;\n    }\n    this.openAt(this.base.path);\n  }\n}\n","import {\n  computed,\n  EnvironmentProviders,\n  inject,\n  InjectionToken,\n  makeEnvironmentProviders,\n  provideEnvironmentInitializer,\n  Provider,\n  Service,\n  signal,\n  Signal,\n} 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 opens the application afresh at its start (the\n   * served base, never the previous user's address) — the guaranteed-clean user switch (no pane\n   * trees, tab titles, address or plugin in-memory state of the previous user survive; paired\n   * with an identity-scoped settings store, the new session re-hydrates entirely from its own\n   * namespace). A pop-out window closes instead. 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 type { ShellFeatures, ShellFeaturesInput } from './shell-features';\n\nexport function mergeShellFeatures(\n  base: ShellFeatures,\n  input: ShellFeaturesInput,\n): ShellFeatures {\n  return {\n    content: { ...base.content, ...input.content },\n    sidebar: { ...base.sidebar, ...input.sidebar },\n    rail: { ...base.rail, ...input.rail },\n    workspaces: { ...base.workspaces, ...input.workspaces },\n    windows: { ...base.windows, ...input.windows },\n    commands: { ...base.commands, ...input.commands },\n  };\n}\n","import {\n  EnvironmentProviders,\n  InjectionToken,\n  makeEnvironmentProviders,\n} from '@angular/core';\nimport { mergeShellFeatures } from './merge-shell-features';\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 *\n * Two fields are finer than that, and say so in their own names: `splitRightButton` and\n * `splitDownButton` leave out the one route to splitting that has no handle of its own, the button\n * the pane toolbar draws. Everything else about splitting stays. A route a distribution can already\n * remove by naming the contribution behind it — the tab menu's entry (`menu:shell.tab.splitRight`),\n * the command with its shortcut and its palette row (`shell.content.splitRight`) — gets no second\n * handle here, because one decision belongs in one place.\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  /**\n   * The one reused italic **preview** tab of the main area: a surface opened as a preview replaces the\n   * previous preview instead of adding a tab. With it off, `openContentTab({ preview: true })` opens a\n   * permanent tab.\n   */\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  /**\n   * The pane toolbar's button for splitting horizontally, and nothing else. Switch it off for a\n   * product that offers splitting by dragging a tab to a pane's edge and wants no split control in\n   * the toolbar. The drop edges, `mod+\\` and the tab menu's entry are untouched; switching\n   * {@link ContentFeatures.splitRight} off still takes the button with everything else.\n   */\n  readonly splitRightButton: boolean;\n  /** Splitting a pane vertically: the toolbar button and the top/bottom drop edges. */\n  readonly splitDown: boolean;\n  /** The pane toolbar's button for splitting vertically, and nothing else — see {@link ContentFeatures.splitRightButton}. */\n  readonly splitDownButton: 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    splitRightButton: true,\n    splitDown: true,\n    splitDownButton: 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\n/**\n * The switches as the distribution **declared** them: the starting value of every switch, fixed at\n * composition. The current value can change while the application runs, so read it from\n * `FeatureSwitches` rather than from this token; the shell itself reads this token exactly once.\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 * Declares which shell capabilities this distribution starts with switched off, 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 * The declaration is the starting value: `FeatureSwitches.update` changes switches from there while\n * the application runs.\n */\nexport function provideShellFeatures(\n  features: ShellFeaturesInput,\n): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: SHELL_FEATURES,\n      useValue: mergeShellFeatures(DEFAULT_SHELL_FEATURES, features),\n    },\n  ]);\n}\n","import { computed, inject, Service, Signal, signal } from '@angular/core';\nimport { mergeShellFeatures } from '../foundation/merge-shell-features';\nimport {\n  DEFAULT_SHELL_FEATURES,\n  SHELL_FEATURES,\n  ShellFeatures,\n  ShellFeaturesInput,\n} from '../foundation/shell-features';\n\n/** One read-only signal per switch of a group, under the switch's own name. */\nexport type SwitchSignals<Group> = {\n  readonly [Switch in keyof Group]: Signal<boolean>;\n};\n\n/**\n * The current state of every shell capability switch, readable as signals and changeable while the\n * application runs. What `provideShellFeatures` declares is the starting value; `update` changes\n * switches from there, naming only what changes, in the same shape the declaration uses:\n *\n * ```ts\n * const switches = inject(FeatureSwitches);\n * switches.content.splitRight();                       // Signal<boolean>, true by default\n * switches.update({ content: { splitRight: false } }); // the button, drop edges and mod+\\ go\n * ```\n *\n * A switch removes the user's routes, not the capability: what a distribution switches off, its own\n * code still reaches through the services that carry it. Switching off acts forward only, so a pane\n * that was split stays split; put the state where you want it before taking the way away. Nothing\n * here is persisted, and the next start begins from the declaration again; whether a change made\n * at runtime survives, and for whom, is the distribution's decision, made with its own stores.\n */\n@Service()\nexport class FeatureSwitches {\n  private readonly state = signal<ShellFeatures>(\n    mergeShellFeatures(DEFAULT_SHELL_FEATURES, inject(SHELL_FEATURES)),\n  );\n\n  /** The whole set as it stands now. */\n  readonly current: Signal<ShellFeatures> = this.state.asReadonly();\n  /** Gestures of the content area, one signal per switch. */\n  readonly content = this.group('content');\n  /** Gestures of the side panels, one signal per switch. */\n  readonly sidebar = this.group('sidebar');\n  /** Gestures of the rail, one signal per switch. */\n  readonly rail = this.group('rail');\n  /** The workspace switches, one signal each. */\n  readonly workspaces = this.group('workspaces');\n  /** The detached-window switch. */\n  readonly windows = this.group('windows');\n  /** How commands reach the user, one signal per switch. */\n  readonly commands = this.group('commands');\n\n  /**\n   * Changes switches while the application runs. Fields merge group by group, so naming one switch\n   * leaves its neighbours alone. Every reader of the affected switches re-evaluates.\n   */\n  update(input: ShellFeaturesInput): void {\n    this.state.update((current) => mergeShellFeatures(current, input));\n  }\n\n  private group<Group extends keyof ShellFeatures>(\n    name: Group,\n  ): SwitchSignals<ShellFeatures[Group]> {\n    const keys = Object.keys(\n      this.state()[name],\n    ) as (keyof ShellFeatures[Group] & string)[];\n    const signals = keys.map((key) => [\n      key,\n      computed(() => this.state()[name][key] as boolean),\n    ]);\n    return Object.fromEntries(signals) as SwitchSignals<ShellFeatures[Group]>;\n  }\n}\n","import { Command } from '@loomweaver/plugin-sdk';\n\ninterface 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\nconst TOKEN_ALIASES: ReadonlyMap<string, string> = new Map([\n  ['control', 'ctrl'],\n  ['cmd', 'meta'],\n  ['command', 'meta'],\n  ['win', 'meta'],\n  ['option', 'alt'],\n  ['esc', 'escape'],\n  ['return', 'enter'],\n  ['spacebar', 'space'],\n  [' ', 'space'],\n]);\n\ninterface KeyLabel {\n  readonly word: string;\n  readonly symbol?: string;\n  readonly everywhere?: boolean;\n}\n\nconst KEY_LABELS: ReadonlyMap<string, KeyLabel> = new Map([\n  ['mod', { word: 'Ctrl', symbol: '⌘' }],\n  ['ctrl', { word: 'Ctrl', symbol: '⌃' }],\n  ['meta', { word: 'Meta', symbol: '⌘' }],\n  ['alt', { word: 'Alt', symbol: '⌥' }],\n  ['shift', { word: 'Shift', symbol: '⇧' }],\n  ['enter', { word: 'Enter', symbol: '↵' }],\n  ['escape', { word: 'Esc' }],\n  ['space', { word: 'Space' }],\n  ['delete', { word: 'Del', symbol: '⌦' }],\n  ['backspace', { word: 'Backspace', symbol: '⌫' }],\n  ['tab', { word: 'Tab', symbol: '⇥' }],\n  ['home', { word: 'Home', symbol: '↖' }],\n  ['end', { word: 'End', symbol: '↘' }],\n  ['pageup', { word: 'PgUp', symbol: '⇞' }],\n  ['pagedown', { word: 'PgDn', symbol: '⇟' }],\n  ['insert', { word: 'Ins' }],\n  ['arrowup', { word: '↑', everywhere: true }],\n  ['arrowdown', { word: '↓', everywhere: true }],\n  ['arrowleft', { word: '←', everywhere: true }],\n  ['arrowright', { word: '→', everywhere: true }],\n]);\n\nconst WORD_OF: ReadonlyMap<string, string> = new Map([['mod', 'ctrl']]);\n\nexport type KeyWords = (key: string) => string | undefined;\n\ntype Modifier = 'ctrl' | 'meta' | 'alt' | 'shift';\n\nconst MODIFIERS: ReadonlySet<string> = new Set<Modifier>([\n  'ctrl',\n  'meta',\n  'alt',\n  'shift',\n]);\n\nfunction canonicalToken(token: string): string {\n  const lower = token.toLowerCase();\n  return TOKEN_ALIASES.get(lower) ?? lower;\n}\n\nfunction platformToken(token: string, isMac: boolean): string {\n  const canonical = canonicalToken(token);\n  if (canonical === 'del') {\n    return isMac ? 'backspace' : 'delete';\n  }\n  return canonical;\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      applyToken(parts, token, isMac);\n    }\n  }\n  return parts.key ? toSignature(parts) : null;\n}\n\nfunction applyToken(parts: ChordParts, token: string, isMac: boolean): void {\n  const canonical = platformToken(token, isMac);\n  if (canonical === 'mod') {\n    parts[isMac ? 'meta' : 'ctrl'] = true;\n    return;\n  }\n  if (MODIFIERS.has(canonical)) {\n    parts[canonical as Modifier] = true;\n    return;\n  }\n  parts.key = canonical;\n}\n\nexport function formatChordOn(\n  chord: string,\n  isMac: boolean,\n  words?: KeyWords,\n): string {\n  return chord\n    .split('+')\n    .map((raw) => tokenLabel(raw.trim(), isMac, words))\n    .join(isMac ? '' : '+');\n}\n\nconst ARIA_KEY_NAMES: ReadonlyMap<string, string> = new Map([\n  ['ctrl', 'Control'],\n  ['capslock', 'CapsLock'],\n  ['contextmenu', 'ContextMenu'],\n  ['numlock', 'NumLock'],\n  ['printscreen', 'PrintScreen'],\n  ['scrolllock', 'ScrollLock'],\n  ['pageup', 'PageUp'],\n  ['pagedown', 'PageDown'],\n  ['arrowup', 'ArrowUp'],\n  ['arrowdown', 'ArrowDown'],\n  ['arrowleft', 'ArrowLeft'],\n  ['arrowright', 'ArrowRight'],\n]);\n\nexport function ariaKeyShortcutsOn(\n  chord: string,\n  isMac: boolean,\n): string | undefined {\n  const signature = chordSignature(chord, isMac);\n  if (signature === null) {\n    return undefined;\n  }\n  return signature\n    .split('+')\n    .map(\n      (token) =>\n        ARIA_KEY_NAMES.get(token) ??\n        token.charAt(0).toUpperCase() + token.slice(1),\n    )\n    .join('+');\n}\n\nexport function ariaKeyShortcuts(chord: string | undefined): string | undefined {\n  return chord ? ariaKeyShortcutsOn(chord, isMacPlatform()) : undefined;\n}\n\nfunction tokenLabel(token: string, isMac: boolean, words?: KeyWords): string {\n  const canonical = platformToken(token, isMac);\n  const label = KEY_LABELS.get(canonical);\n  if (label === undefined) {\n    return canonical.charAt(0).toUpperCase() + canonical.slice(1);\n  }\n  if (label.everywhere) {\n    return label.word;\n  }\n  if (isMac && label.symbol !== undefined) {\n    return label.symbol;\n  }\n  return words?.(WORD_OF.get(canonical) ?? canonical) ?? label.word;\n}\n\nexport interface ChordClaims {\n  readonly bySignature: ReadonlyMap<string, readonly Command[]>;\n  readonly unparsable: readonly Command[];\n}\n\nexport function chordClaims(\n  commands: readonly Command[],\n  isMac: boolean,\n): ChordClaims {\n  const bySignature = new Map<string, Command[]>();\n  const unparsable: Command[] = [];\n  for (const command of commands) {\n    if (!command.shortcut) {\n      continue;\n    }\n    const signature = chordSignature(command.shortcut, isMac);\n    if (signature === null) {\n      unparsable.push(command);\n      continue;\n    }\n    bySignature.set(signature, [\n      ...(bySignature.get(signature) ?? []),\n      command,\n    ]);\n  }\n  return { bySignature, unparsable };\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) ?? canonicalToken(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 { KeyWords } from './chord';\n\nlet inUse: KeyWords | undefined;\n\nexport function keyWordsInUse(): KeyWords | undefined {\n  return inUse;\n}\n\nexport function wordChordKeysWith(words: KeyWords | undefined): void {\n  inUse = words;\n}\n","import { formatChordOn, isMacPlatform } from './chord';\nimport { keyWordsInUse } from './key-words';\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. Named keys take the platform's symbol where\n * it has one (⌦ ⌫ ⇥ on macOS) and otherwise a word in the interface language once the shell is\n * running (`Strg+Entf` in German on Windows and Linux), so the result matches every hint the shell\n * draws; without a running shell the words are English. `del` is the platform's delete key and is\n * drawn as that key: `formatChord('mod+del')` → `'⌘⌫'` on macOS, `'Ctrl+Del'` elsewhere. Lets a distribution or plugin show a\n * shortcut anywhere without duplicating the platform detection the shell already does internally.\n */\nexport function formatChord(chord: string): string {\n  return formatChordOn(chord, isMacPlatform(), keyWordsInUse());\n}\n","import {\n  ErrorHandler,\n  inject,\n  isDevMode,\n  Service,\n  Signal,\n} from '@angular/core';\nimport { Command, CommandArguments, MenuContext } from '@loomweaver/plugin-sdk';\nimport { PopoutWindow } from '../popout/popout-window';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { AuthContext } from '../auth/auth-context';\nimport { FeatureSwitches } from '../features/feature-switches.service';\nimport { formatChord } from './keyboard/format-chord';\n\nexport interface Triggerable {\n  readonly command?: string;\n  run?(context?: MenuContext): unknown;\n}\n\n/**\n * Executes commands by id. Every trigger runs through here: rail, bar and surface action items,\n * menus, keybindings and the command palette. The registry only stores, so one place resolves an id,\n * one place fires the 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(FeatureSwitches).commands.shortcuts;\n  private readonly inPopout = inject(PopoutWindow).active;\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. Named keys are spelled the platform's way and in the\n   * interface language, as {@link formatChord} spells them. A palette row, a bar button and a toolbar\n   * entry ask here; a menu asks {@link chordOf} and spells the hint when it words its labels.\n   */\n  shortcutOf(command: Command | undefined): string | undefined {\n    const chord = this.chordOf(command);\n    return chord === undefined ? undefined : formatChord(chord);\n  }\n\n  /**\n   * The command's keyboard chord as declared (`'mod+k'`), or `undefined` where it has none or where\n   * this distribution has switched shortcuts off. For a hint that is spelled later, such as a menu\n   * entry that is worded again when the language changes; to show it now, use {@link shortcutOf}.\n   */\n  chordOf(command: Command | undefined): string | undefined {\n    if (!command?.shortcut || !this.shortcuts()) {\n      return undefined;\n    }\n    return 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  /**\n   * Fires a UI item's trigger: its bound command if it names one, else its inline callback, either\n   * with the context the item was activated against where the trigger has one.\n   */\n  trigger(item: Triggerable, context?: MenuContext): void {\n    if (item.command) {\n      this.execute(item.command, context);\n      return;\n    }\n    const run = item.run;\n    if (run) {\n      this.callInline(() => run.call(item, context));\n    }\n  }\n\n  private callInline(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","import { isDevMode } from '@angular/core';\nimport { MenuContext, MenuHeader, MenuTrigger } from '@loomweaver/plugin-sdk';\n\nexport interface ChromeItemMenu {\n  readonly id?: string;\n  readonly menu?: string;\n  readonly menuTrigger?: MenuTrigger;\n  readonly submenu?: string;\n  readonly menuHeader?: MenuHeader;\n  readonly command?: string;\n  readonly workspace?: string;\n  run?(context?: MenuContext): unknown;\n}\n\nconst warned = new Set<string>();\n\nexport function menuOnActivate(item: ChromeItemMenu): string | undefined {\n  if (item.submenu) {\n    return item.submenu;\n  }\n  if (!item.menu || item.menuTrigger === undefined || item.menuTrigger === 'context') {\n    return undefined;\n  }\n  return item.workspace === undefined ? item.menu : undefined;\n}\n\nexport function menuOnContext(item: ChromeItemMenu): string | undefined {\n  if (!item.menu) {\n    return undefined;\n  }\n  return menuOnActivate(item) && item.menuTrigger === 'primary'\n    ? undefined\n    : item.menu;\n}\n\nexport function warnMenuTriggerConflict(item: ChromeItemMenu): void {\n  const id = item.id ?? '';\n  if (!isDevMode() || warned.has(id) || item.workspace === undefined || item.menuTrigger === undefined || item.menuTrigger === 'context') {\n    return;\n  }\n\n  warned.add(id);\n  console.warn(\n    `Item \"${item.id}\" switches to workspace \"${item.workspace}\" and asks for its menu on ` +\n      `activation — activating it is the switch, so the menu \"${item.menu}\" stays on the ` +\n      `right-click.`,\n  );\n}\n\nexport interface ChromeItemState {\n  readonly disabled: boolean;\n  readonly opensMenu?: string;\n}\n\nexport function activateChromeItem(\n  item: ChromeItemMenu,\n  state: ChromeItemState | undefined,\n  run: () => void,\n): void {\n  if (state?.disabled) {\n    return;\n  }\n  warnMenuTriggerConflict(item);\n  if (state?.opensMenu) {\n    return;\n  }\n  run();\n}\n","import {\n  AccessRequirement,\n  Command,\n  MenuContext,\n  MenuHeader,\n  MenuTrigger,\n} from '@loomweaver/plugin-sdk';\nimport { formatChord } from '../commands/keyboard/format-chord';\n\nexport interface SlotEntry {\n  readonly id?: string;\n  readonly command?: string;\n  run?(context?: MenuContext): unknown;\n  readonly title?: string;\n  readonly icon?: string;\n  readonly pressed?: boolean;\n  readonly access?: AccessRequirement;\n  readonly group?: string;\n  readonly order?: number;\n  readonly when?: MenuContext;\n  readonly checkedWhen?: MenuContext;\n  readonly menu?: string;\n  readonly menuTrigger?: MenuTrigger;\n  readonly submenu?: string;\n  readonly menuHeader?: MenuHeader;\n  readonly workspace?: string;\n}\n\nexport interface ResolvedEntry<T extends SlotEntry = SlotEntry> {\n  readonly key: string;\n  readonly title?: string;\n  readonly group: string;\n  readonly order: number;\n  readonly icon?: string;\n  readonly chord?: string;\n  readonly shortcut?: string;\n  readonly checkbox: boolean;\n  readonly checked: boolean;\n  readonly pressed?: boolean;\n  readonly disabled: boolean;\n  readonly opensMenu?: string;\n  readonly command?: Command;\n  readonly item: T;\n}\n\nexport interface SlotSources {\n  readonly commands: readonly Command[];\n  readonly available: (command: Command) => boolean;\n  readonly chordOf: (command: Command | undefined) => string | undefined;\n  readonly visible: (access: AccessRequirement | undefined) => boolean;\n  readonly disabled: (access: AccessRequirement | undefined) => boolean;\n  readonly menuOffered?: (\n    entry: SlotEntry,\n    context: MenuContext,\n  ) => string | undefined;\n}\n\nexport interface SlotSourceServices {\n  readonly registry: { readonly commands: () => readonly Command[] };\n  readonly commands: {\n    available(command: Command): boolean;\n    chordOf(command: Command | undefined): string | undefined;\n  };\n  readonly auth: {\n    visible(access: AccessRequirement | undefined): boolean;\n    disabled(access: AccessRequirement | undefined): boolean;\n  };\n}\n\nexport function slotSources(\n  { registry, commands, auth }: SlotSourceServices,\n  menuOffered?: SlotSources['menuOffered'],\n): SlotSources {\n  return {\n    commands: registry.commands(),\n    available: (command) => commands.available(command),\n    chordOf: (command) => commands.chordOf(command),\n    visible: (access) => auth.visible(access),\n    disabled: (access) => auth.disabled(access),\n    menuOffered,\n  };\n}\n\nexport function resolveSlot<T extends SlotEntry>(\n  entries: readonly T[],\n  contextOf: (entry: T) => MenuContext,\n  sources: SlotSources,\n): ResolvedEntry<T>[] {\n  return entries\n    .map((entry, index) =>\n      resolveEntry(entry, index, contextOf(entry), sources),\n    )\n    .filter((entry): entry is ResolvedEntry<T> => entry !== null)\n    .toSorted((a, b) => a.group.localeCompare(b.group) || a.order - b.order);\n}\n\nexport function headingCommand(\n  header: MenuHeader | undefined,\n  commands: readonly Command[],\n): Command | undefined {\n  if (!header?.command) {\n    return undefined;\n  }\n  const command = commands.find((candidate) => candidate.id === header.command);\n  return command?.title ? command : undefined;\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\nfunction resolveEntry<T extends SlotEntry>(\n  entry: T,\n  index: number,\n  context: MenuContext,\n  sources: SlotSources,\n): ResolvedEntry<T> | null {\n  if (!whenMatches(entry.when, context) || !sources.visible(entry.access)) {\n    return null;\n  }\n  const command = commandOf(entry, sources);\n  if (entry.command && !command) {\n    return null;\n  }\n  const opensMenu = sources.menuOffered?.(entry, context);\n  if (!leadsSomewhere(entry, command, opensMenu)) {\n    return null;\n  }\n  const checkbox = entry.checkedWhen !== undefined;\n  return {\n    key: entry.command ?? entry.id ?? `__inline-${index}`,\n    title: entry.title ?? command?.title,\n    group: entry.group ?? '',\n    order: entry.order ?? 0,\n    icon: entry.icon ?? command?.icon,\n    ...chordAndShortcut(sources.chordOf(command)),\n    checkbox,\n    checked: checkbox && whenMatches(entry.checkedWhen, context),\n    pressed: entry.pressed ?? (checkbox ? whenMatches(entry.checkedWhen, context) : undefined),\n    disabled: sources.disabled(entry.access),\n    opensMenu,\n    command,\n    item: entry,\n  };\n}\n\nfunction commandOf(\n  entry: SlotEntry,\n  sources: SlotSources,\n): Command | undefined {\n  if (!entry.command) {\n    return undefined;\n  }\n  const command = sources.commands.find(\n    (candidate) => candidate.id === entry.command,\n  );\n  return command && sources.available(command) ? command : undefined;\n}\n\nfunction leadsSomewhere(\n  entry: SlotEntry,\n  command: Command | undefined,\n  opensMenu: string | undefined,\n): boolean {\n  return (\n    command !== undefined ||\n    entry.run !== undefined ||\n    opensMenu !== undefined ||\n    entry.workspace !== undefined\n  );\n}\n\nfunction chordAndShortcut(\n  chord: string | undefined,\n): Pick<ResolvedEntry, 'chord' | 'shortcut'> {\n  return chord === undefined ? {} : { chord, shortcut: formatChord(chord) };\n}\n","export function nameShowing(\n  shown: readonly (string | undefined)[],\n  purpose: string,\n): string {\n  const words = shown.filter((text): text is string => !!text?.trim());\n  const spoken = words.join(', ');\n  if (!spoken) {\n    return purpose;\n  }\n  if (contains(purpose, spoken)) {\n    return purpose;\n  }\n  if (!purpose.trim() || contains(spoken, purpose)) {\n    return spoken;\n  }\n  return `${spoken}, ${purpose}`;\n}\n\nexport function nameWithHint(name: string, hint: string | undefined): string {\n  return hint && !name.includes(hint) ? `${name} ${hint}` : name;\n}\n\nfunction contains(text: string, part: string): boolean {\n  return ` ${wordsOf(text)} `.includes(` ${wordsOf(part)} `);\n}\n\nfunction wordsOf(text: string): string {\n  return text\n    .toLowerCase()\n    .replaceAll(/[^\\p{L}\\p{N}]+/gu, ' ')\n    .trim();\n}\n","import { Command, MenuHeader } from '@loomweaver/plugin-sdk';\nimport { nameShowing } from '../foundation/name-showing';\n\nexport const HEADING_KEY = '__heading';\n\nexport type HeadingTarget = Pick<Command, 'title'>;\n\nconst purposes = new WeakMap<HTMLElement, string>();\n\nexport function drawMenuHeading(\n  header: MenuHeader,\n  leadsTo?: HeadingTarget,\n): HTMLElement {\n  const element = document.createElement('div');\n  element.className = 'lw-menu-header';\n  if (leadsTo) {\n    element.setAttribute('role', 'menuitem');\n    element.setAttribute('command', HEADING_KEY);\n    element.tabIndex = -1;\n  } else {\n    element.setAttribute('aria-hidden', 'true');\n  }\n\n  const mark = drawMark(header, () => nameHeading(element));\n  if (mark) {\n    element.append(mark, ' ');\n  }\n  element.append(drawLines(header));\n  return element;\n}\n\nexport function wordMenuHeading(\n  element: HTMLElement,\n  header: MenuHeader,\n  translate: (key: string) => string,\n  leadsTo?: HeadingTarget,\n): string {\n  const title = translate(header.title);\n  const detail = header.detail ? translate(header.detail) : undefined;\n  const name = element.querySelector('.lw-menu-header-title');\n  if (name) {\n    name.textContent = title;\n  }\n  const second = element.querySelector<HTMLElement>('.lw-menu-header-detail');\n  if (second) {\n    second.textContent = detail ?? '';\n    second.hidden = !detail;\n  }\n  if (leadsTo) {\n    purposes.set(element, translate(leadsTo.title));\n    nameHeading(element);\n  }\n  return detail ? `${title}, ${detail}` : title;\n}\n\nfunction nameHeading(element: HTMLElement): void {\n  const purpose = purposes.get(element);\n  if (purpose === undefined) {\n    return;\n  }\n  const mark = element.querySelector('.lw-menu-header-mark');\n  const shown = [\n    mark?.querySelector('lw-icon') ? undefined : mark?.textContent,\n    element.querySelector('.lw-menu-header-title')?.textContent,\n    element.querySelector('.lw-menu-header-detail:not([hidden])')?.textContent,\n  ].map((text) => text ?? undefined);\n  element.setAttribute('aria-label', nameShowing(shown, purpose));\n}\n\nfunction drawLines(header: MenuHeader): HTMLElement {\n  const lines = document.createElement('span');\n  lines.className = 'lw-menu-header-lines';\n  const name = document.createElement('span');\n  name.className = 'lw-menu-header-title';\n  lines.append(name);\n  if (header.detail) {\n    const second = document.createElement('span');\n    second.className = 'lw-menu-header-detail';\n    lines.append(' ', second);\n  }\n  return lines;\n}\n\nfunction drawMark(\n  header: MenuHeader,\n  onChange: () => void,\n): HTMLElement | undefined {\n  if (!header.image && !header.initials && !header.icon) {\n    return undefined;\n  }\n  const mark = document.createElement('span');\n  mark.className = 'lw-menu-header-mark';\n  mark.append(...markContent(header));\n  if (header.image) {\n    const picture = mark.firstElementChild as HTMLImageElement;\n    picture.addEventListener('error', () => {\n      mark.replaceChildren(...markContent({ ...header, image: undefined }));\n      onChange();\n    });\n  }\n  return mark;\n}\n\nfunction markContent(header: MenuHeader): Node[] {\n  if (header.image) {\n    const picture = document.createElement('img');\n    picture.src = header.image;\n    picture.alt = '';\n    picture.className = 'lw-menu-header-picture';\n    return [picture];\n  }\n  if (header.initials) {\n    return [document.createTextNode(header.initials)];\n  }\n  if (header.icon) {\n    const icon = document.createElement('lw-icon');\n    icon.setAttribute('name', header.icon);\n    icon.setAttribute('size', '1rem');\n    return [icon];\n  }\n  return [];\n}\n","import {\n  LwMenuElement,\n  MenuAnchorRect,\n  MenuSide,\n} from '../elements/menu/lw-menu.element';\n\nexport type MenuAnchor =\n  | { readonly x: number; readonly y: number }\n  | { readonly rect: MenuAnchorRect; readonly side: MenuSide };\n\nexport function followed(\n  at: MenuAnchor,\n  trigger: HTMLElement | undefined,\n  openedAt: DOMRect | undefined,\n): MenuAnchor | null {\n  if (trigger === undefined || openedAt === undefined) {\n    return at;\n  }\n  const now = trigger.getBoundingClientRect();\n  const hidden =\n    (now.width === 0 && now.height === 0) ||\n    trigger.checkVisibility?.({ visibilityProperty: true }) === false;\n  if (!trigger.isConnected || hidden) {\n    return null;\n  }\n  if (!('rect' in at)) {\n    const nearRight =\n      Math.abs(at.x - openedAt.right) < Math.abs(at.x - openedAt.left);\n    const nearBottom =\n      Math.abs(at.y - openedAt.bottom) < Math.abs(at.y - openedAt.top);\n    return {\n      x: at.x + (nearRight ? now.right - openedAt.right : now.left - openedAt.left),\n      y: at.y + (nearBottom ? now.bottom - openedAt.bottom : now.top - openedAt.top),\n    };\n  }\n  const dx = now.left - openedAt.left;\n  const dy = now.top - openedAt.top;\n  return {\n    rect: {\n      left: at.rect.left + dx,\n      top: at.rect.top + dy,\n      right: at.rect.right + now.right - openedAt.right,\n      bottom: at.rect.bottom + now.bottom - openedAt.bottom,\n    },\n    side: at.side,\n  };\n}\n\nexport function place(menu: LwMenuElement, at: MenuAnchor): void {\n  if ('rect' in at) {\n    menu.openBeside(at.rect, at.side);\n  } else {\n    menu.openAt(at.x, at.y);\n  }\n}\n","export function rovingTabIndex(\n  items: readonly HTMLElement[],\n  activeIndex: number,\n): void {\n  for (const [index, item] of items.entries()) {\n    item.tabIndex = index === activeIndex ? 0 : -1;\n  }\n}\n\nexport function focusAndReveal(item: HTMLElement): void {\n  item.focus();\n  item.scrollIntoView?.({ block: 'nearest' });\n}\n\nexport type RovingAxis = 'horizontal' | 'vertical';\n\nconst STEP_KEYS: Readonly<Record<RovingAxis, { next: string; previous: string }>> = {\n  horizontal: { next: 'ArrowRight', previous: 'ArrowLeft' },\n  vertical: { next: 'ArrowDown', previous: 'ArrowUp' },\n};\n\nexport function rovingStep(\n  key: string,\n  index: number,\n  count: number,\n  axis: RovingAxis,\n): number | undefined {\n  if (count === 0) {\n    return undefined;\n  }\n  const { next, previous } = STEP_KEYS[axis];\n  switch (key) {\n    case next: {\n      return index < 0 ? 0 : (index + 1) % count;\n    }\n    case previous: {\n      return index < 0 ? count - 1 : (index - 1 + count) % count;\n    }\n    case 'Home': {\n      return 0;\n    }\n    case 'End': {\n      return count - 1;\n    }\n    default: {\n      return undefined;\n    }\n  }\n}\n","export const VIEWPORT_MARGIN = 4;\n\nexport function fitsInViewport(\n  start: number,\n  size: number,\n  limit: number,\n): boolean {\n  return start >= VIEWPORT_MARGIN && start + size <= limit - VIEWPORT_MARGIN;\n}\n\nexport function clampIntoViewport(\n  start: number,\n  size: number,\n  limit: number,\n): number {\n  return Math.max(\n    VIEWPORT_MARGIN,\n    Math.min(start, limit - size - VIEWPORT_MARGIN),\n  );\n}\n","export function upgradeElementProperty(element: HTMLElement, name: string): void {\n  const self = element as unknown as Record<string, unknown>;\n  if (!Object.hasOwn(element, name)) {\n    return;\n  }\n  const value = self[name];\n  delete self[name];\n  self[name] = value;\n}\n\nexport function reflectAttribute(\n  element: HTMLElement,\n  name: string,\n  value: string | null | undefined,\n): void {\n  if (value === null || value === undefined) {\n    element.removeAttribute(name);\n  } else {\n    element.setAttribute(name, value);\n  }\n}\n\nexport function defineElementOnce(\n  tag: string,\n  element: CustomElementConstructor,\n): void {\n  if (typeof customElements !== 'undefined' && !customElements.get(tag)) {\n    customElements.define(tag, element);\n  }\n}\n\nexport function numberAttribute(\n  element: HTMLElement,\n  name: string,\n  fallback: number,\n): number {\n  const raw = element.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\nexport function clickOnEnterOrSpace(\n  element: HTMLElement,\n  isDisabled: () => boolean = () => false,\n): (event: KeyboardEvent) => void {\n  return (event) => {\n    if ((event.key !== 'Enter' && event.key !== ' ') || isDisabled()) {\n      return;\n    }\n    event.preventDefault();\n    element.click();\n  };\n}\n","import type { MenuAnchorRect } from './lw-menu.element';\n\nexport const SUBMENU_PAUSE_MS = 150;\n\nexport const SUBMENU_GAP = 2;\n\nconst NESTED_MENU = ':scope > lw-menu';\n\nexport const ENTRY_ROW_CLASS = 'lw-menu-item-row';\n\nexport function holderOf(entry: Element): Element | null {\n  return entry.classList.contains(ENTRY_ROW_CLASS) ? entry.parentElement : entry;\n}\n\nexport function entryOf(child: Element): HTMLElement | null {\n  return child.getAttribute('role') === 'none'\n    ? child.querySelector<HTMLElement>(':scope > [role^=\"menuitem\"]')\n    : (child as HTMLElement);\n}\n\nexport function nestedMenu(item: Element): HTMLElement | null {\n  return holderOf(item)?.querySelector<HTMLElement>(NESTED_MENU) ?? null;\n}\n\nexport function isNested(menu: HTMLElement): boolean {\n  return menu.parentElement?.matches('lw-menu-item') ?? false;\n}\n\nexport function submenuAnchor(\n  menu: HTMLElement,\n  item: HTMLElement,\n  submenu: HTMLElement,\n): MenuAnchorRect {\n  const outer = menu.getBoundingClientRect();\n  const row = item.getBoundingClientRect();\n  const inset = Number.parseFloat(getComputedStyle(submenu).paddingTop) || 0;\n  return {\n    left: outer.left,\n    right: outer.right,\n    top: row.top - inset,\n    bottom: row.bottom + inset,\n  };\n}\n\nexport function submenuMark(): HTMLSpanElement {\n  const mark = document.createElement('span');\n  mark.className = 'lw-menu-item-submenu';\n  mark.setAttribute('aria-hidden', 'true');\n  const icon = document.createElement('lw-icon');\n  icon.setAttribute('name', 'chevronDown');\n  icon.setAttribute('size', '0.875rem');\n  mark.append(icon);\n  return mark;\n}\n\nexport function markOpener(item: HTMLElement, opens: boolean): void {\n  if (!opens) {\n    item.removeAttribute('aria-haspopup');\n    item.removeAttribute('aria-expanded');\n    return;\n  }\n  item.setAttribute('aria-haspopup', 'menu');\n  if (!item.hasAttribute('aria-expanded')) {\n    item.setAttribute('aria-expanded', 'false');\n  }\n}\n\nexport class SubmenuPause {\n  private timer?: ReturnType<typeof setTimeout>;\n\n  after(run: () => void): void {\n    this.cancel();\n    this.timer = setTimeout(() => {\n      this.timer = undefined;\n      run();\n    }, SUBMENU_PAUSE_MS);\n  }\n\n  cancel(): void {\n    if (this.timer === undefined) {\n      return;\n    }\n    clearTimeout(this.timer);\n    this.timer = undefined;\n  }\n}\n","import { reflectAttribute, upgradeElementProperty } from '../custom-elements';\nimport { ENTRY_ROW_CLASS, markOpener, nestedMenu, submenuMark } from './lw-submenu';\n\nexport const LW_MENU_ITEM_TAG = 'lw-menu-item';\n\nfunction leadingPlace(\n  className: string,\n  iconName: string | null,\n): HTMLSpanElement {\n  const place = document.createElement('span');\n  place.className = className;\n  place.setAttribute('aria-hidden', 'true');\n  if (iconName) {\n    const icon = document.createElement('lw-icon');\n    icon.setAttribute('name', iconName);\n    icon.setAttribute('size', '0.9rem');\n    place.append(icon);\n  }\n  return place;\n}\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  private opens = false;\n\n  private observer?: MutationObserver;\n\n  private row?: HTMLElement;\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.render();\n    this.observer = new MutationObserver(() => {\n      const opens = nestedMenu(this) !== null;\n      if (opens !== this.opens) {\n        this.render();\n      }\n    });\n    this.observer.observe(this, { childList: true });\n  }\n\n  disconnectedCallback(): void {\n    this.observer?.disconnect();\n  }\n\n  attributeChangedCallback(): void {\n    if (this.isConnected) {\n      this.render();\n    }\n  }\n\n  private render(): void {\n    const submenu = nestedMenu(this);\n    this.opens = submenu !== null;\n    const entry = this.opens ? this.rowBeside() : this.withoutRow();\n    const stale = [...this.childNodes].filter(\n      (child) => child !== submenu && child !== this.row,\n    );\n    for (const child of stale) {\n      child.remove();\n    }\n\n    const checkbox = this.hasAttribute('checkbox');\n    const checked = this.hasAttribute('checked');\n    entry.setAttribute('role', checkbox ? 'menuitemcheckbox' : 'menuitem');\n    if (checkbox) {\n      entry.setAttribute('aria-checked', String(checked));\n    } else {\n      entry.removeAttribute('aria-checked');\n    }\n    entry.setAttribute('aria-disabled', String(this.hasAttribute('disabled')));\n\n    const check = leadingPlace('lw-menu-item-check', checked ? 'check' : null);\n    const lead = leadingPlace('lw-menu-item-lead', this.getAttribute('icon'));\n    const label = document.createElement('span');\n    label.className = 'lw-menu-item-label';\n    label.textContent = this.getAttribute('label') ?? '';\n    const content = [check, lead, label, ...this.trailing()];\n    if (this.row) {\n      this.row.replaceChildren(...content);\n    } else {\n      this.prepend(...content);\n    }\n    markOpener(entry, this.opens);\n  }\n\n  private rowBeside(): HTMLElement {\n    if (!this.row) {\n      this.row = document.createElement('span');\n      this.row.className = ENTRY_ROW_CLASS;\n      this.row.tabIndex = -1;\n    }\n    for (const name of ['aria-checked', 'aria-disabled', 'aria-haspopup', 'aria-expanded', 'tabindex']) {\n      this.removeAttribute(name);\n    }\n    this.setAttribute('role', 'none');\n    this.prepend(this.row);\n    return this.row;\n  }\n\n  private withoutRow(): HTMLElement {\n    this.row?.remove();\n    this.row = undefined;\n    if (!this.hasAttribute('tabindex')) {\n      this.tabIndex = -1;\n    }\n    return this;\n  }\n\n  private trailing(): HTMLElement[] {\n    if (this.opens) {\n      return [submenuMark()];\n    }\n    const shortcut = this.getAttribute('shortcut');\n    if (!shortcut) {\n      return [];\n    }\n    const hint = document.createElement('span');\n    hint.className = 'lw-menu-item-shortcut';\n    hint.setAttribute('aria-hidden', 'true');\n    hint.textContent = shortcut;\n    return [hint];\n  }\n}\n","import { focusAndReveal, rovingStep, rovingTabIndex } from '../roving-focus';\nimport { clampIntoViewport, fitsInViewport } from '../viewport-fit';\nimport { defineElementOnce } from '../custom-elements';\nimport {\n  entryOf,\n  holderOf,\n  isNested,\n  nestedMenu,\n  SUBMENU_GAP,\n  submenuAnchor,\n  SubmenuPause,\n} from './lw-submenu';\nimport { LW_MENU_ITEM_TAG, LwMenuItemElement } from './lw-menu-item.element';\n\nexport { LW_MENU_ITEM_TAG, LwMenuItemElement } from './lw-menu-item.element';\n\nexport const LW_MENU_TAG = 'lw-menu';\n\nexport const MENU_ANCHOR_GAP = 4;\n\nexport const LW_MENU_SELECT = 'lw-menu-select';\n\nexport const LW_MENU_DISMISS = 'lw-menu-dismiss';\n\nexport type MenuSide = 'top' | 'right' | 'bottom' | 'left';\n\nexport interface MenuAnchorRect {\n  readonly top: number;\n  readonly right: number;\n  readonly bottom: number;\n  readonly left: number;\n}\n\nfunction beside(\n  preferred: number,\n  opposite: number,\n  size: number,\n  limit: number,\n): number {\n  if (fitsInViewport(preferred, size, limit)) {\n    return preferred;\n  }\n  return fitsInViewport(opposite, size, limit) ? opposite : clampIntoViewport(preferred, size, limit);\n}\n\nfunction aligned(\n  near: number,\n  far: number,\n  size: number,\n  limit: number,\n): number {\n  return fitsInViewport(near, size, limit) ? near : clampIntoViewport(far - size, size, limit);\n}\n\nexport class LwMenuElement extends HTMLElement {\n  private active = -1;\n\n  private opener?: HTMLElement;\n\n  private readonly pause = new SubmenuPause();\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    this.addEventListener('pointerover', this.onPointerOver);\n    if (isNested(this)) {\n      this.hidden = true;\n      return;\n    }\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    this.removeEventListener('pointerover', this.onPointerOver);\n    this.pause.cancel();\n  }\n\n  openAt(x: number, y: number): void {\n    const { width, height } = this.measured();\n    this.place(\n      clampIntoViewport(x, width, window.innerWidth),\n      clampIntoViewport(y, height, window.innerHeight),\n    );\n  }\n\n  openBeside(rect: MenuAnchorRect, side: MenuSide): void {\n    const { width, height } = this.measured();\n    const viewportWidth = window.innerWidth;\n    const viewportHeight = window.innerHeight;\n    const after = { x: rect.right + MENU_ANCHOR_GAP, y: rect.bottom + MENU_ANCHOR_GAP };\n    const before = {\n      x: rect.left - MENU_ANCHOR_GAP - width,\n      y: rect.top - MENU_ANCHOR_GAP - height,\n    };\n    if (side === 'left' || side === 'right') {\n      const preferred = side === 'right' ? after.x : before.x;\n      const opposite = side === 'right' ? before.x : after.x;\n      this.place(\n        beside(preferred, opposite, width, viewportWidth),\n        aligned(rect.top, rect.bottom, height, viewportHeight),\n      );\n      return;\n    }\n    const preferred = side === 'bottom' ? after.y : before.y;\n    const opposite = side === 'bottom' ? before.y : after.y;\n    this.place(\n      aligned(rect.left, rect.right, width, viewportWidth),\n      beside(preferred, opposite, height, viewportHeight),\n    );\n  }\n\n  private readonly onKeydown = (event: KeyboardEvent) =>\n    this.handleKeydown(event);\n\n  private readonly onClick = (event: MouseEvent) => {\n    const item = this.ownItemAt(event.target);\n    if (!item || this.isDisabled(item)) {\n      return;\n    }\n    if (nestedMenu(item)) {\n      this.openSubmenu(item, false);\n    } else {\n      this.select(item);\n    }\n  };\n\n  private readonly onPointerOver = (event: Event) => {\n    const target = event.target as Node;\n    if (this.opener && holderOf(this.opener)?.contains(target)) {\n      this.pause.cancel();\n      return;\n    }\n    const item = this.ownItemAt(event.target);\n    if (!item) {\n      return;\n    }\n    if (nestedMenu(item) && !this.isDisabled(item)) {\n      this.pause.after(() => this.openSubmenu(item, false));\n    } else if (this.opener) {\n      this.pause.after(() => this.closeSubmenu(false));\n    } else {\n      this.pause.cancel();\n    }\n  };\n\n  private owns(target: EventTarget | null): boolean {\n    return (target as Element | null)?.closest?.(LW_MENU_TAG) === this;\n  }\n\n  private ownItemAt(target: EventTarget | null): HTMLElement | null {\n    if (!this.owns(target)) {\n      return null;\n    }\n    return (target as Element).closest<HTMLElement>('[role^=\"menuitem\"]');\n  }\n\n  private openSubmenu(item: HTMLElement, focusFirst: boolean): void {\n    const submenu = nestedMenu(item) as LwMenuElement | null;\n    if (!submenu) {\n      return;\n    }\n    this.pause.cancel();\n    if (this.opener !== item) {\n      this.closeSubmenu(false);\n    }\n    this.opener = item;\n    this.active = this.items().indexOf(item);\n    submenu.hidden = false;\n    item.setAttribute('aria-expanded', 'true');\n    submenu.unfoldBeside(submenuAnchor(this, item, submenu));\n    if (focusFirst) {\n      submenu.setActive(0);\n    }\n  }\n\n  private unfoldBeside(rect: MenuAnchorRect): void {\n    const { width, height } = this.measured();\n    this.place(\n      beside(\n        rect.right + SUBMENU_GAP,\n        rect.left - SUBMENU_GAP - width,\n        width,\n        window.innerWidth,\n      ),\n      clampIntoViewport(rect.top, height, window.innerHeight),\n    );\n  }\n\n  private closeSubmenu(focusOpener: boolean): void {\n    const item = this.opener;\n    if (!item) {\n      return;\n    }\n    this.opener = undefined;\n    this.pause.cancel();\n    const submenu = nestedMenu(item) as LwMenuElement | null;\n    if (submenu) {\n      submenu.closeSubmenu(false);\n      submenu.active = -1;\n      submenu.hidden = true;\n    }\n    item.setAttribute('aria-expanded', 'false');\n    if (focusOpener) {\n      item.focus();\n    }\n  }\n\n  private closeFromInside(): void {\n    const owner = this.parentElement?.closest<LwMenuElement>(LW_MENU_TAG);\n    owner?.closeSubmenu(true);\n  }\n\n  private measured(): DOMRect {\n    this.place(0, 0);\n    return this.getBoundingClientRect();\n  }\n\n  private place(left: number, top: number): void {\n    this.style.left = `${left}px`;\n    this.style.top = `${top}px`;\n  }\n\n  private items(): HTMLElement[] {\n    return [...this.children]\n      .map((child) => entryOf(child))\n      .filter(\n        (item): item is HTMLElement =>\n          item !== null && item.matches('[role^=\"menuitem\"]') && !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    if (this.opener && this.opener !== items[this.active]) {\n      this.closeSubmenu(false);\n    }\n    rovingTabIndex(items, this.active);\n    focusAndReveal(items[this.active]);\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    if (!this.owns(event.target)) {\n      return;\n    }\n    const step = rovingStep(event.key, this.active, this.items().length, 'vertical');\n    if (step !== undefined) {\n      this.setActive(step);\n      event.preventDefault();\n      return;\n    }\n    const item = this.active >= 0 ? this.items()[this.active] : undefined;\n    switch (event.key) {\n      case 'ArrowRight': {\n        if (item && nestedMenu(item)) {\n          this.openSubmenu(item, true);\n        }\n        break;\n      }\n      case 'ArrowLeft': {\n        if (isNested(this)) {\n          this.closeFromInside();\n        }\n        break;\n      }\n      case 'Enter':\n      case ' ': {\n        if (item && nestedMenu(item)) {\n          this.openSubmenu(item, true);\n        } else if (item) {\n          this.select(item);\n        }\n        break;\n      }\n      case 'Escape': {\n        if (isNested(this)) {\n          this.closeFromInside();\n        } else {\n          this.dispatchEvent(new CustomEvent(LW_MENU_DISMISS, { bubbles: true }));\n        }\n        break;\n      }\n      case 'Tab': {\n        this.dispatchEvent(new CustomEvent(LW_MENU_DISMISS, { bubbles: true }));\n        return;\n      }\n      default: {\n        return;\n      }\n    }\n    event.preventDefault();\n  }\n}\n\n/** Registers `<lw-menu>` and its items once (idempotent), called from {@link provideShell} at bootstrap. */\nexport function defineLwMenu(): void {\n  defineElementOnce(LW_MENU_ITEM_TAG, LwMenuItemElement);\n  defineElementOnce(LW_MENU_TAG, LwMenuElement);\n}\n","export type MenuLabel = string | ((translate: (key: string) => string) => string);\n\nexport function wordEntries(\n  labelled: readonly [HTMLElement, MenuLabel][],\n  translate: (key: string) => string,\n): void {\n  for (const [item, label] of labelled) {\n    const words =\n      typeof label === 'function' ? label(translate) : translate(String(label));\n    if (item.getAttribute('label') !== words) {\n      item.setAttribute('label', words);\n    }\n  }\n}\n","import { MenuHeader } from '@loomweaver/plugin-sdk';\nimport {\n  LW_MENU_ITEM_TAG,\n  LW_MENU_TAG,\n  LwMenuElement,\n} from '../elements/menu/lw-menu.element';\nimport {\n  drawMenuHeading,\n  HeadingTarget,\n  wordMenuHeading,\n} from './menu-heading';\nimport { formatChord } from '../commands/keyboard/format-chord';\nimport { MenuLabel, wordEntries } from './menu-wording';\n\nexport interface MenuRow {\n  readonly key: string;\n  readonly label: MenuLabel;\n  readonly group: string;\n  readonly icon?: string;\n  readonly chord?: string;\n  readonly shortcut?: string;\n  readonly checkbox: boolean;\n  readonly checked: boolean;\n  readonly disabled?: boolean;\n  readonly children?: readonly MenuRow[];\n}\n\nexport interface MenuHeading {\n  readonly header: MenuHeader;\n  readonly leadsTo?: HeadingTarget;\n}\n\nexport interface WordedMenu {\n  readonly menu: LwMenuElement;\n  readonly word: () => void;\n}\n\nexport function drawMenu(\n  rows: readonly MenuRow[],\n  translate: (key: string) => string,\n  heading?: MenuHeading,\n): WordedMenu {\n  const menu = document.createElement(LW_MENU_TAG) as LwMenuElement;\n  const wordHeading = heading\n    ? appendHeading(menu, heading, translate)\n    : () => undefined;\n  const chorded: [HTMLElement, string][] = [];\n  const labelled = appendRows(menu, rows, chorded);\n  const word = (): void => {\n    wordEntries(labelled, translate);\n    wordChords(chorded);\n    wordHeading();\n  };\n  word();\n  return { menu, word };\n}\n\nfunction reserveLeadingColumns(\n  menu: HTMLElement,\n  rows: readonly MenuRow[],\n): void {\n  const checks = rows.some((row) => row.checkbox);\n  const icons = rows.some((row) => row.icon);\n  if (checks && icons && rows.every((row) => !(row.checkbox && row.icon))) {\n    menu.classList.add('lw-menu--shared');\n    return;\n  }\n  if (checks) {\n    menu.classList.add('lw-menu--checks');\n  }\n  if (icons) {\n    menu.classList.add('lw-menu--leading');\n  }\n}\n\nfunction appendHeading(\n  menu: HTMLElement,\n  { header, leadsTo }: MenuHeading,\n  translate: (key: string) => string,\n): () => void {\n  const element = drawMenuHeading(header, leadsTo);\n  menu.append(element);\n  return () =>\n    menu.setAttribute(\n      'aria-label',\n      wordMenuHeading(element, header, translate, leadsTo),\n    );\n}\n\nfunction appendRows(\n  menu: HTMLElement,\n  rows: readonly MenuRow[],\n  chorded: [HTMLElement, string][],\n  labelled: [HTMLElement, MenuLabel][] = [],\n): [HTMLElement, MenuLabel][] {\n  reserveLeadingColumns(menu, rows);\n  let lastGroup: string | undefined;\n  for (const row of rows) {\n    if (lastGroup !== undefined && row.group !== lastGroup) {\n      menu.append(separator());\n    }\n    lastGroup = row.group;\n    const item = menuItemElement(row);\n    labelled.push([item, row.label]);\n    if (row.chord) {\n      chorded.push([item, row.chord]);\n    }\n    menu.append(item);\n    if (!row.children) {\n      continue;\n    }\n    const submenu = document.createElement(LW_MENU_TAG);\n    appendRows(submenu, row.children, chorded, labelled);\n    item.append(submenu);\n  }\n  return labelled;\n}\n\nfunction menuItemElement(row: MenuRow): HTMLElement {\n  const item = document.createElement(LW_MENU_ITEM_TAG);\n  item.setAttribute('command', row.key);\n  if (row.icon) {\n    item.setAttribute('icon', row.icon);\n  }\n  if (row.shortcut) {\n    item.setAttribute('shortcut', row.shortcut);\n  }\n  if (row.checkbox) {\n    item.setAttribute('checkbox', '');\n    if (row.checked) {\n      item.setAttribute('checked', '');\n    }\n  }\n  if (row.disabled) {\n    item.setAttribute('disabled', '');\n  }\n  return item;\n}\n\nfunction wordChords(chorded: readonly [HTMLElement, string][]): void {\n  for (const [item, chord] of chorded) {\n    const hint = formatChord(chord);\n    if (item.getAttribute('shortcut') !== hint) {\n      item.setAttribute('shortcut', hint);\n    }\n  }\n}\n\nfunction separator(): HTMLElement {\n  const element = document.createElement('div');\n  element.setAttribute('role', 'separator');\n  element.className = 'lw-menu-separator';\n  return element;\n}\n","import { Injectable, Injector, inject, isDevMode } from '@angular/core';\nimport {\n  TranslocoConfig,\n  TranslocoMissingHandler,\n  TranslocoService,\n} from '@jsverse/transloco';\n\nconst KEY_SHAPE = /^[\\w-]+(?:\\.[\\w-]+)+$/;\n\nexport function hasKeyShape(text: string): boolean {\n  return KEY_SHAPE.test(text);\n}\n\nexport function holdsStrings(transloco: TranslocoService, lang: string): boolean {\n  return Object.keys(transloco.getTranslation(lang) ?? {}).length > 0;\n}\n\n@Injectable()\nexport class ShellMissingTranslationHandler implements TranslocoMissingHandler {\n  private readonly injector = inject(Injector);\n\n  handle(key: string, config: TranslocoConfig): string {\n    if (\n      isDevMode() &&\n      config.missingHandler.logMissingKey &&\n      hasKeyShape(key) &&\n      this.loaded()\n    ) {\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    return holdsStrings(transloco, transloco.getActiveLang());\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { filter, merge, Observable, scan, skip } from 'rxjs';\nimport { holdsStrings } from './missing-translation-handler';\n\nexport function wordingChanges(\n  transloco: TranslocoService,\n): Observable<unknown> {\n  return merge(\n    transloco.langChanges$.pipe(\n      skip(1),\n      filter((lang) => holdsStrings(transloco, lang)),\n    ),\n    transloco.events$.pipe(\n      filter(\n        (event) =>\n          event.type === 'translationLoadSuccess' &&\n          event.payload.langName === transloco.getActiveLang(),\n      ),\n    ),\n  );\n}\n\n@Service()\nexport class Wording {\n  private readonly transloco = inject(TranslocoService);\n\n  private readonly version = toSignal(\n    wordingChanges(this.transloco).pipe(scan((count) => count + 1, 0)),\n    { initialValue: 0 },\n  );\n\n  translate(key: string): string {\n    this.version();\n    return this.transloco.translate(key);\n  }\n\n  activeLang(): string {\n    this.version();\n    return this.transloco.getActiveLang();\n  }\n}\n","import {\n  afterNextRender,\n  DestroyRef,\n  inject,\n  Injector,\n  Service,\n  signal,\n} from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Subscription } from 'rxjs';\nimport {\n  Command,\n  MenuContext,\n  MenuHeader,\n  MenuItem,\n} from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { CommandService } from '../commands/command.service';\nimport { AuthContext } from '../auth/auth-context';\nimport { HEADING_KEY } from './menu-heading';\nimport { followed, MenuAnchor, place } from './menu-placement';\nimport { MenuLabel } from './menu-wording';\nimport { drawMenu, MenuRow, WordedMenu } from './menu-drawing';\nimport {\n  headingCommand,\n  ResolvedEntry,\n  resolveSlot,\n  SlotEntry,\n  slotSources,\n} from './menu-resolution';\nimport { wordingChanges } from '../i18n/wording';\nimport {\n  LW_MENU_DISMISS,\n  LW_MENU_SELECT,\n} from '../elements/menu/lw-menu.element';\n\nexport interface MenuOpenOptions {\n  readonly trigger?: HTMLElement;\n  readonly header?: MenuHeader;\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  readonly wording: Subscription;\n}\n\nexport type LabelledEntry = ResolvedEntry<MenuItem> & {\n  readonly title: string;\n  readonly submenu?: readonly LabelledEntry[];\n};\n\nexport interface MenuAnswer {\n  readonly entries: readonly LabelledEntry[];\n  readonly leadsTo?: Command;\n}\n\nfunction labelled(entry: ResolvedEntry<MenuItem>): entry is LabelledEntry {\n  return entry.title !== undefined;\n}\n\nexport interface MenuListEntry {\n  readonly key: string;\n  readonly label: MenuLabel;\n  readonly icon?: string;\n  readonly chord?: string;\n  readonly active?: boolean;\n  readonly checked?: boolean;\n  readonly children?: readonly MenuListEntry[];\n}\n\n@Service()\nexport class MenuService {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly commands = inject(CommandService);\n\n  private readonly auth = inject(AuthContext);\n\n  private readonly transloco = inject(TranslocoService);\n\n  private readonly injector = inject(Injector);\n\n  private readonly trigger = signal<HTMLElement | null>(null);\n\n  private current?: OpenMenu;\n\n  readonly openTrigger = this.trigger.asReadonly();\n\n  constructor() {\n    inject(DestroyRef).onDestroy(() => this.close());\n  }\n\n  open(\n    menuId: string | readonly string[],\n    context: MenuContext,\n    at: MenuAnchor,\n    options: MenuOpenOptions = {},\n  ): void {\n    this.close();\n    const answer = this.answer(\n      typeof menuId === 'string' ? [menuId] : menuId,\n      context,\n      options.header,\n    );\n    if (answer.entries.length === 0 && !answer.leadsTo) {\n      return;\n    }\n    const worded = drawMenu(\n      answer.entries.map((entry) => menuRowOf(entry)),\n      this.translate,\n      options.header && { header: options.header, leadsTo: answer.leadsTo },\n    );\n    this.present(\n      worded,\n      at,\n      (key) => {\n        if (key !== null) {\n          this.choose(answer, key, context);\n        }\n      },\n      options.trigger,\n    );\n  }\n\n  answer(\n    menuIds: readonly string[],\n    context: MenuContext,\n    header?: MenuHeader,\n  ): MenuAnswer {\n    return {\n      entries: this.resolve(menuIds, context),\n      leadsTo: headingCommand(header, this.usableCommands()),\n    };\n  }\n\n  choose(answer: MenuAnswer, key: string, context: MenuContext): void {\n    if (key === HEADING_KEY && answer.leadsTo) {\n      this.commands.execute(answer.leadsTo.id, context);\n      return;\n    }\n    const entry = everyEntry(answer.entries).find(\n      (candidate) => candidate.key === key,\n    );\n    if (entry && !entry.disabled) {\n      this.commands.trigger(entry.item, context);\n    }\n  }\n\n  offers(\n    menuId: string,\n    context: MenuContext,\n    header?: MenuHeader,\n  ): boolean {\n    const answer = this.answer([menuId], context, header);\n    return answer.entries.length > 0 || answer.leadsTo !== undefined;\n  }\n\n  openList(\n    entries: readonly MenuListEntry[],\n    at: MenuAnchor,\n    onPick: (key: string) => void,\n    trigger?: HTMLElement,\n  ): void {\n    this.close();\n    if (entries.length === 0) {\n      return;\n    }\n    this.present(\n      drawMenu(\n        entries.map((entry) => listRow(entry)),\n        this.translate,\n      ),\n      at,\n      (key) => {\n        if (key !== null) {\n          onPick(key);\n        }\n      },\n      trigger,\n    );\n  }\n\n  close(): void {\n    const open = this.current;\n    if (!open) {\n      return;\n    }\n    this.current = undefined;\n    this.trigger.set(null);\n    clearTimeout(open.listenTimer);\n    open.wording.unsubscribe();\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, word }: WordedMenu,\n    at: MenuAnchor,\n    onSelect: (key: string | null) => void,\n    trigger?: HTMLElement,\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    place(menu, at);\n    const openedAt = trigger?.getBoundingClientRect();\n    let placedAt = at;\n    this.trigger.set(trigger ?? null);\n    const listenTimer = setTimeout(\n      () =>\n        document.addEventListener('pointerdown', onOutside, { capture: true }),\n      0,\n    );\n    const wording = wordingChanges(this.transloco).subscribe(() => {\n      word();\n      place(menu, placedAt);\n      afterNextRender(\n        () => {\n          if (this.current?.menu !== menu) {\n            return;\n          }\n          placedAt = followed(at, trigger, openedAt) ?? placedAt;\n          place(menu, placedAt);\n        },\n        { injector: this.injector },\n      );\n    });\n    this.current = { menu, onOutside, restore, listenTimer, wording };\n  }\n\n  private readonly translate = (key: string): string => {\n    const words: unknown = this.transloco.translate(key);\n    return typeof words === 'string' ? words : key;\n  };\n\n  private resolve(\n    menuIds: readonly string[],\n    context: MenuContext,\n    open: ReadonlySet<string> = new Set(menuIds),\n  ): LabelledEntry[] {\n    const submenus = new Map<string, LabelledEntry[]>();\n    const offered = (entry: SlotEntry): string | undefined => {\n      const slot = entry.submenu;\n      if (slot === undefined || open.has(slot)) {\n        return undefined;\n      }\n      const entries = this.resolve([slot], context, new Set([...open, slot]));\n      if (entries.length === 0) {\n        return undefined;\n      }\n      submenus.set(slot, entries);\n      return slot;\n    };\n    return resolveSlot(\n      this.registry.menuItems().filter((item) => menuIds.includes(item.menu)),\n      () => context,\n      slotSources(\n        {\n          registry: this.registry,\n          commands: this.commands,\n          auth: this.auth,\n        },\n        offered,\n      ),\n    )\n      .filter((entry) => labelled(entry))\n      .map((entry) => withSubmenu(entry, submenus));\n  }\n\n  private usableCommands(): readonly Command[] {\n    return this.registry\n      .commands()\n      .filter((command) => this.commands.available(command));\n  }\n}\n\nexport function menuRowOf(entry: LabelledEntry): MenuRow {\n  return {\n    key: entry.key,\n    label: entry.title,\n    group: entry.group,\n    icon: entry.icon,\n    chord: entry.chord,\n    checkbox: entry.checkbox,\n    checked: entry.checked,\n    disabled: entry.disabled,\n    children: entry.submenu?.map((child) => menuRowOf(child)),\n  };\n}\n\nfunction listRow(entry: MenuListEntry): MenuRow {\n  const checkbox = entry.checked !== undefined || entry.active === true;\n  return {\n    key: entry.key,\n    label: entry.label,\n    group: '',\n    icon: entry.icon,\n    chord: entry.chord,\n    checkbox,\n    checked: checkbox && (entry.checked ?? entry.active) === true,\n    children: entry.children?.map((child) => listRow(child)),\n  };\n}\n\nfunction withSubmenu(\n  entry: LabelledEntry,\n  submenus: ReadonlyMap<string, readonly LabelledEntry[]>,\n): LabelledEntry {\n  const submenu = entry.opensMenu && submenus.get(entry.opensMenu);\n  return submenu ? { ...entry, submenu: keyedUnder(entry.key, submenu) } : entry;\n}\n\nfunction keyedUnder(\n  parent: string,\n  entries: readonly LabelledEntry[],\n): LabelledEntry[] {\n  return entries.map((entry) => {\n    const key = `${parent}>${entry.key}`;\n    return {\n      ...entry,\n      key,\n      submenu: entry.submenu && keyedUnder(key, entry.submenu),\n    };\n  });\n}\n\nfunction everyEntry(entries: readonly LabelledEntry[]): LabelledEntry[] {\n  return entries.flatMap((entry) => [entry, ...everyEntry(entry.submenu ?? [])]);\n}\n","import { inject, Service } from '@angular/core';\nimport { MenuContext } from '@loomweaver/plugin-sdk';\nimport { AuthContext } from '../auth/auth-context';\nimport { CommandService } from '../commands/command.service';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { ChromeItemMenu, menuOnActivate } from './chrome-item-menu';\nimport {\n  ResolvedEntry,\n  resolveSlot,\n  SlotEntry,\n  slotSources,\n} from './menu-resolution';\nimport { MenuService } from './menu.service';\n\n@Service()\nexport class SlotResolution {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly commands = inject(CommandService);\n\n  private readonly auth = inject(AuthContext);\n\n  private readonly menus = inject(MenuService);\n\n  resolve<T extends SlotEntry>(\n    entries: readonly T[],\n    contextOf: (entry: T) => MenuContext,\n  ): ResolvedEntry<T>[] {\n    return resolveSlot(\n      entries,\n      contextOf,\n      slotSources(\n        { registry: this.registry, commands: this.commands, auth: this.auth },\n        (entry, context) => this.menuOnActivation(entry, context),\n      ),\n    );\n  }\n\n  menuOnActivation(\n    item: ChromeItemMenu,\n    context: MenuContext,\n  ): string | undefined {\n    const menu = menuOnActivate(item);\n    if (menu === undefined) {\n      return undefined;\n    }\n    const heading = this.commands.triggerable(item)\n      ? undefined\n      : item.menuHeader;\n    return this.menus.offers(menu, context, heading) ? menu : undefined;\n  }\n}\n","import {\n  booleanAttribute,\n  computed,\n  Directive,\n  ElementRef,\n  inject,\n  input,\n} from '@angular/core';\nimport { MenuContext, MenuHeader } from '@loomweaver/plugin-sdk';\nimport { MenuSide } from '../elements/menu/lw-menu.element';\nimport { MenuService } from './menu.service';\n\ntype MenuIds = string | readonly string[] | undefined;\n\nfunction hasMenuIds(ids: MenuIds): ids is string | readonly string[] {\n  return ids !== undefined && ids.length > 0;\n}\n\n@Directive({\n  selector: '[lwMenu], [lwMenuOnActivate], [lwMenuAnnounced]',\n  host: {\n    '(contextmenu)': 'onContextMenu($event)',\n    '(click)': 'onActivate($event)',\n    '[attr.aria-haspopup]': 'hasPopup()',\n    '[attr.aria-expanded]': 'expanded()',\n  },\n})\nexport class MenuTriggerDirective {\n  private readonly menus = inject(MenuService);\n\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n  readonly menu = input<MenuIds>(undefined, { alias: 'lwMenu' });\n\n  readonly onActivateMenu = input<MenuIds>(undefined, {\n    alias: 'lwMenuOnActivate',\n  });\n\n  readonly context = input<MenuContext>({}, { alias: 'lwMenuContext' });\n\n  readonly side = input<MenuSide>('bottom', { alias: 'lwMenuSide' });\n\n  readonly header = input<MenuHeader | undefined>(undefined, {\n    alias: 'lwMenuHeader',\n  });\n\n  readonly announced = input(false, {\n    alias: 'lwMenuAnnounced',\n    transform: booleanAttribute,\n  });\n\n  private readonly announcesMenu = computed(\n    () => this.announced() || hasMenuIds(this.onActivateMenu()),\n  );\n\n  protected readonly hasPopup = computed(() =>\n    this.announcesMenu() ? 'menu' : null,\n  );\n\n  protected readonly expanded = computed(() =>\n    this.announcesMenu()\n      ? String(this.menus.openTrigger() === this.host.nativeElement)\n      : null,\n  );\n\n  protected onContextMenu(event: MouseEvent): void {\n    const menuIds = this.menu();\n    if (!hasMenuIds(menuIds)) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n    this.menus.open(menuIds, this.context(), {\n      x: event.clientX,\n      y: event.clientY,\n    });\n  }\n\n  protected onActivate(event: MouseEvent): void {\n    const menuIds = this.onActivateMenu();\n    if (!hasMenuIds(menuIds)) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n    const control = this.host.nativeElement;\n    this.menus.open(\n      menuIds,\n      this.context(),\n      { rect: control.getBoundingClientRect(), side: this.side() },\n      { trigger: control, header: this.header() },\n    );\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { MenuContext } from '@loomweaver/plugin-sdk';\nimport { DockPosition } from '../../layout/layout';\nimport {\n  BarButtonItem,\n  BarComponentItem,\n  BarItem,\n  BarSlot,\n} from '../../foundation/bar-item';\nimport { ResolvedEntry } from '../../menu/menu-resolution';\n\nexport interface BarContext {\n  readonly bar: string;\n  readonly dock: DockPosition;\n  readonly slot: BarSlot;\n}\n\nexport type BarEntry =\n  | ResolvedEntry<BarButtonItem>\n  | { readonly item: BarComponentItem };\n\nexport const BAR_CONTEXT = new InjectionToken<BarContext>('BAR_CONTEXT');\n\nexport function isBarButton(item: BarItem): item is BarButtonItem {\n  return !('component' in item);\n}\n\nexport function barMenuContext(item: BarItem): MenuContext {\n  return { targetKind: 'bar-item', id: item.id, bar: item.bar };\n}\n\nexport function isButtonEntry(\n  entry: BarEntry,\n): entry is ResolvedEntry<BarButtonItem> {\n  return 'key' in entry;\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  Injector,\n  computed,\n  inject,\n  input,\n  signal,\n} 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 { MenuContext } from '@loomweaver/plugin-sdk';\nimport { MenuTriggerDirective } from '../../menu/menu-trigger.directive';\nimport {\n  activateChromeItem,\n  menuOnContext,\n} from '../../menu/chrome-item-menu';\nimport { MenuSide } from '../../elements/menu/lw-menu.element';\nimport { BarButtonItem, BarComponentItem } from '../../foundation/bar-item';\nimport { nameShowing, nameWithHint } from '../../foundation/name-showing';\nimport { ariaKeyShortcuts } from '../../commands/keyboard/chord';\nimport {\n  BAR_CONTEXT,\n  BarEntry,\n  barMenuContext,\n  isButtonEntry,\n} from './bar-context';\n\nconst MENU_SIDE_BY_DOCK: Readonly<Record<DockPosition, MenuSide>> = {\n  top: 'bottom',\n  bottom: 'top',\n  left: 'right',\n  right: 'left',\n  center: 'bottom',\n};\n\n@Component({\n  selector: 'lw-shell-bar-item',\n  imports: [NgComponentOutlet, TranslocoPipe, MenuTriggerDirective],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  host: { class: 'min-w-0' },\n  templateUrl: './shell-bar-item.html',\n})\nexport class ShellBarItem {\n  readonly entry = input.required<BarEntry>();\n\n  readonly dock = input.required<DockPosition>();\n\n  private readonly commands = inject(CommandService);\n  private readonly injector = inject(Injector);\n\n  private readonly resolved = computed(() => {\n    const entry = this.entry();\n    return isButtonEntry(entry) ? entry : undefined;\n  });\n  protected readonly asComponent = computed<BarComponentItem | null>(() => {\n    const entry = this.entry();\n    return isButtonEntry(entry) ? null : entry.item;\n  });\n  protected readonly asButton = computed<BarButtonItem | null>(\n    () => this.resolved()?.item ?? null,\n  );\n  private readonly brokenPicture = signal(false);\n\n  protected readonly tooltipPosition = computed<TooltipPosition>(() =>\n    this.dock() === 'bottom' ? 'top' : 'bottom',\n  );\n  protected readonly menuSide = computed<MenuSide>(\n    () => MENU_SIDE_BY_DOCK[this.dock()],\n  );\n  protected readonly contextMenu = computed<string | undefined>(() => {\n    const button = this.asButton();\n    return button ? menuOnContext(button) : undefined;\n  });\n  protected readonly menuContext = computed<MenuContext>(() =>\n    barMenuContext(this.entry().item),\n  );\n  protected readonly activateMenu = computed<string | undefined>(\n    () => this.resolved()?.opensMenu,\n  );\n\n  protected readonly componentInjector = computed<Injector>(() => {\n    const item = this.entry().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.resolved()?.disabled ?? false,\n  );\n  protected readonly shortcut = computed<string | undefined>(() =>\n    this.asButton()?.showShortcut ? this.resolved()?.shortcut : undefined,\n  );\n  protected readonly keyShortcuts = computed<string | undefined>(() =>\n    ariaKeyShortcuts(this.asButton()?.showShortcut ? this.resolved()?.chord : undefined),\n  );\n\n  protected pictureOf(button: BarButtonItem): string | undefined {\n    return this.brokenPicture() ? undefined : button.image;\n  }\n\n  protected nameOf(\n    button: BarButtonItem,\n    label: string,\n    purpose: string,\n  ): string {\n    const initials = this.pictureOf(button) ? undefined : button.initials;\n    return nameWithHint(\n      nameShowing([initials, label], purpose),\n      this.shortcut(),\n    );\n  }\n\n  protected onPictureError(): void {\n    this.brokenPicture.set(true);\n  }\n\n  protected run(button: BarButtonItem): void {\n    activateChromeItem(button, this.resolved(), () =>\n      this.commands.trigger(button),\n    );\n  }\n}\n","@if (asButton(); as btn) {\n  <button\n    type=\"button\"\n    (click)=\"run(btn)\"\n    [disabled]=\"disabled()\"\n    [lwMenu]=\"contextMenu()\"\n    [lwMenuOnActivate]=\"activateMenu()\"\n    [lwMenuHeader]=\"btn.menuHeader\"\n    [lwMenuSide]=\"menuSide()\"\n    [lwMenuContext]=\"menuContext()\"\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]=\"nameOf(btn, (btn.label ?? '') | transloco, (btn.tooltip ?? btn.label ?? '') | transloco)\"\n    [attr.aria-keyshortcuts]=\"keyShortcuts()\"\n  >\n    @if (pictureOf(btn); as picture) {\n      <img\n        [src]=\"picture\"\n        alt=\"\"\n        aria-hidden=\"true\"\n        data-testid=\"bar-picture\"\n        class=\"lw-chrome-picture h-5 w-5\"\n        (error)=\"onPictureError()\"\n      />\n    } @else if (btn.initials) {\n      <span\n        aria-hidden=\"true\"\n        data-testid=\"bar-initials\"\n        class=\"lw-rail-initials lw-chrome-mark h-5 w-5\"\n        >{{ btn.initials }}</span\n      >\n    } @else if (btn.icon; as icon) {\n      <lw-icon [name]=\"icon\" size=\"1rem\" />\n    }\n    @if (btn.label; as label) {\n      &ngsp;<span>{{ label | transloco }}</span>\n    }\n    @if (shortcut(); as chord) {\n      &ngsp;<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","export const FOLD_CONTROL_PX = 28;\n\nexport function entryWidth(node: HTMLElement): number {\n  return Math.max(node.getBoundingClientRect().width, node.scrollWidth);\n}\n\nexport function closeOnOutsidePointer(\n  document: Document,\n  inside: (target: Node | null) => boolean,\n  close: () => void,\n): () => void {\n  const onPointer = (event: PointerEvent): void => {\n    if (!inside(event.target as Node | null)) {\n      close();\n    }\n  };\n  document.addEventListener('pointerdown', onPointer, { capture: true });\n  return () =>\n    document.removeEventListener('pointerdown', onPointer, { capture: true });\n}\n\nexport interface FoldMeasure {\n  readonly available: number;\n  readonly control: number;\n  readonly gap: number;\n  readonly widthOf: (id: string) => number | undefined;\n}\n\nexport interface Foldable {\n  readonly id: string;\n}\n\nexport function foldedIds(\n  rank: readonly Foldable[],\n  measure: FoldMeasure,\n): readonly string[] {\n  const kept = [...rank];\n  if (rowWidth(kept, measure) <= measure.available) {\n    return [];\n  }\n  const folded: string[] = [];\n  while (kept.length > 0) {\n    const next = kept.shift() as Foldable;\n    folded.push(next.id);\n    const row = rowWidth(kept, measure) + measure.gap + measure.control;\n    if (row <= measure.available) {\n      break;\n    }\n  }\n  return folded;\n}\n\nexport function sameIds(a: readonly string[], b: readonly string[]): boolean {\n  return a.length === b.length && a.every((id, index) => id === b[index]);\n}\n\nfunction rowWidth(items: readonly Foldable[], measure: FoldMeasure): number {\n  if (items.length === 0) {\n    return 0;\n  }\n  const widths = items.reduce(\n    (sum, item) => sum + (measure.widthOf(item.id) ?? 0),\n    0,\n  );\n  return widths + measure.gap * (items.length - 1);\n}\n","import { BarItem, BarSlot } from '../../foundation/bar-item';\n\nexport {\n  closeOnOutsidePointer,\n  entryWidth,\n  FOLD_CONTROL_PX,\n  foldedIds,\n  sameIds,\n  type FoldMeasure,\n} from '../../elements/row-fold';\n\nconst FOLD_SLOTS: readonly BarSlot[] = ['end', 'center', 'start'];\n\nexport function foldRank(items: readonly BarItem[]): readonly BarItem[] {\n  return FOLD_SLOTS.flatMap((slot) =>\n    items\n      .filter((item) => item.slot === slot)\n      .toReversed()\n      .toSorted((a, b) => (b.order ?? 0) - (a.order ?? 0)),\n  );\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n  afterNextRender,\n  afterRenderEffect,\n  Component,\n  computed,\n  CUSTOM_ELEMENTS_SCHEMA,\n  DestroyRef,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  signal,\n  untracked,\n  viewChild,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { BarSlot } from '../../foundation/bar-item';\nimport { LayoutRegion } from '../../layout/layout';\nimport { AuthContext } from '../../auth/auth-context';\nimport { SlotResolution } from '../../menu/slot-resolution.service';\nimport { ShellBarItem } from './shell-bar-item';\nimport { BarEntry, barMenuContext, isBarButton } from './bar-context';\nimport {\n  closeOnOutsidePointer,\n  entryWidth,\n  FOLD_CONTROL_PX,\n  foldedIds,\n  foldRank,\n  sameIds,\n} from './bar-fold';\n\nconst GAP_PX = 8;\n\nfunction availableWidth(bar: HTMLElement): number {\n  const style = getComputedStyle(bar);\n  return (\n    bar.clientWidth -\n    Number.parseFloat(style.paddingLeft || '0') -\n    Number.parseFloat(style.paddingRight || '0')\n  );\n}\n\n@Component({\n  selector: 'lw-shell-bar',\n  imports: [ShellBarItem, TranslocoPipe],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\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 slots = inject(SlotResolution);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly document = inject(DOCUMENT);\n\n  private readonly bar = viewChild<ElementRef<HTMLElement>>('bar');\n  private readonly tray = viewChild<ElementRef<HTMLElement>>('tray');\n  private readonly foldControl =\n    viewChild<ElementRef<HTMLButtonElement>>('foldControl');\n\n  private readonly widths = new Map<string, number>();\n  private observer?: ResizeObserver;\n\n  private stopOutside?: () => void;\n  private controlWidth = FOLD_CONTROL_PX;\n\n  private readonly folded = signal<readonly string[]>([], { equal: sameIds });\n  protected readonly trayOpen = signal(false);\n\n  protected readonly dock = computed(() => this.region().dock);\n\n  protected readonly footer = computed(\n    () => this.dock() === 'left' || this.dock() === 'right',\n  );\n\n  protected readonly nameKey = computed(() => {\n    if (this.footer()) {\n      return 'landmark.panelFooter';\n    }\n    return this.dock() === 'bottom' ? 'landmark.statusBar' : 'landmark.topBar';\n  });\n\n  protected readonly anchorName = computed(\n    () => `--lw-bar-fold-${this.region().id.replaceAll(/[^a-zA-Z0-9-]/g, '-')}`,\n  );\n\n  protected readonly trayId = computed(() => `lw-bar-tray-${this.region().id}`);\n\n  private readonly contributed = computed<readonly BarEntry[]>(() => {\n    const here = this.registry\n      .barItems()\n      .filter((item) => item.bar === this.region().id);\n    const cells = here\n      .filter((item) => !isBarButton(item) && this.auth.visible(item.access))\n      .map((item) => ({ item }) as BarEntry);\n    const buttons = this.slots.resolve(\n      here.filter((item) => isBarButton(item)),\n      barMenuContext,\n    );\n    return [...cells, ...buttons];\n  });\n\n  protected readonly startItems = computed(() => this.inBar('start'));\n  protected readonly centerItems = computed(() => this.inBar('center'));\n  protected readonly endItems = computed(() => this.inBar('end'));\n\n  protected readonly foldedItems = computed<readonly BarEntry[]>(() => {\n    const folded = new Set(this.folded());\n    return (['start', 'center', 'end'] as const).flatMap((slot) =>\n      this.bySlot(slot).filter((entry) => folded.has(entry.item.id)),\n    );\n  });\n\n  constructor() {\n    afterRenderEffect(() => {\n      this.contributed();\n      this.folded();\n      this.measure();\n    });\n    afterNextRender(() => this.observeResize());\n    effect(() => {\n      if (this.folded().length === 0) {\n        untracked(() => this.closeTray());\n      }\n    });\n    afterRenderEffect(() => {\n      if (this.trayOpen()) {\n        this.tray()\n          ?.nativeElement.querySelector<HTMLElement>(\n            'a[href], button, [tabindex]',\n          )\n          ?.focus();\n      }\n    });\n    this.destroyRef.onDestroy(() => this.stopListeningOutside());\n  }\n\n  protected toggleTray(): void {\n    if (this.trayOpen()) {\n      this.closeTray();\n    } else {\n      this.openTray();\n    }\n  }\n\n  protected closeTray(): void {\n    if (!this.trayOpen()) {\n      return;\n    }\n    this.trayOpen.set(false);\n    this.stopListeningOutside();\n    this.foldControl()?.nativeElement.focus();\n  }\n\n  private openTray(): void {\n    this.trayOpen.set(true);\n    this.stopOutside = closeOnOutsidePointer(\n      this.document,\n      (target) =>\n        this.tray()?.nativeElement.contains(target) === true ||\n        this.foldControl()?.nativeElement.contains(target) === true,\n      () => this.closeTray(),\n    );\n    this.document.addEventListener('keydown', this.onEscape);\n  }\n\n  private readonly onEscape = (event: KeyboardEvent): void => {\n    if (event.key === 'Escape' && !event.defaultPrevented) {\n      this.closeTray();\n    }\n  };\n\n  private stopListeningOutside(): void {\n    this.stopOutside?.();\n    this.stopOutside = undefined;\n    this.document.removeEventListener('keydown', this.onEscape);\n  }\n\n  private inBar(slot: BarSlot): BarEntry[] {\n    const folded = new Set(this.folded());\n    return this.bySlot(slot).filter((entry) => !folded.has(entry.item.id));\n  }\n\n  private bySlot(slot: BarSlot): BarEntry[] {\n    return this.contributed()\n      .filter((entry) => entry.item.slot === slot)\n      .toSorted((a, b) => (a.item.order ?? 0) - (b.item.order ?? 0));\n  }\n\n  private observeResize(): void {\n    const element = this.bar()?.nativeElement;\n    if (!element || typeof ResizeObserver === 'undefined') {\n      return;\n    }\n    const observer = new ResizeObserver(() => this.measure());\n    observer.observe(element);\n    this.observer = observer;\n    this.destroyRef.onDestroy(() => observer.disconnect());\n  }\n\n  private measure(): void {\n    const bar = this.bar()?.nativeElement;\n    if (!bar) {\n      return;\n    }\n    this.observeEntries(bar);\n    this.measureFoldControl();\n    const available = availableWidth(bar);\n    this.folded.set(\n      available > 0\n        ? foldedIds(foldRank(this.contributed().map((entry) => entry.item)), {\n            available,\n            control: this.controlWidth,\n            gap: GAP_PX,\n            widthOf: (id) => this.widths.get(id),\n          })\n        : [],\n    );\n  }\n\n  private observeEntries(bar: HTMLElement): void {\n    for (const host of bar.querySelectorAll<HTMLElement>('[data-bar-entry]')) {\n      this.observer?.observe(host);\n      this.widths.set(host.dataset['barEntry'] ?? '', entryWidth(host));\n    }\n  }\n\n  private measureFoldControl(): void {\n    const control = this.foldControl()?.nativeElement;\n    if (control) {\n      this.controlWidth = control.getBoundingClientRect().width;\n    }\n  }\n}\n","<div\n  #bar\n  role=\"group\"\n  [attr.aria-label]=\"nameKey() | transloco\"\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 (entry of startItems(); track entry.item.id) {\n      <lw-shell-bar-item [entry]=\"entry\" [dock]=\"dock()\" [attr.data-bar-entry]=\"entry.item.id\" />\n    }\n  </div>\n\n  @if (centerItems().length) {\n    <div class=\"mx-auto flex shrink-0 items-center gap-2\">\n      @for (entry of centerItems(); track entry.item.id) {\n        <lw-shell-bar-item [entry]=\"entry\" [dock]=\"dock()\" [attr.data-bar-entry]=\"entry.item.id\" />\n      }\n    </div>\n  }\n\n  <div class=\"ml-auto flex shrink-0 items-center gap-2\">\n    @for (entry of endItems(); track entry.item.id) {\n      <lw-shell-bar-item [entry]=\"entry\" [dock]=\"dock()\" [attr.data-bar-entry]=\"entry.item.id\" />\n    }\n    @if (foldedItems().length) {\n      <button\n        #foldControl\n        type=\"button\"\n        data-bar-fold\n        class=\"lw-icon-btn h-7 w-7\"\n        [style.anchor-name]=\"anchorName()\"\n        [attr.aria-expanded]=\"trayOpen()\"\n        [attr.aria-controls]=\"trayOpen() ? trayId() : null\"\n        [attr.aria-label]=\"'bar.more' | transloco\"\n        (click)=\"toggleTray()\"\n      >\n        <lw-icon name=\"more\" size=\"1rem\" />\n        <lw-tooltip\n          [text]=\"'bar.more' | transloco\"\n          [position]=\"dock() === 'bottom' ? 'top' : 'bottom'\"\n        />\n      </button>\n    }\n  </div>\n\n  @if (trayOpen()) {\n    <div\n      #tray\n      role=\"group\"\n      [id]=\"trayId()\"\n      class=\"lw-bar-tray\"\n      [class.lw-bar-tray-up]=\"dock() === 'bottom'\"\n      [style.position-anchor]=\"anchorName()\"\n      [attr.aria-label]=\"'bar.more' | transloco\"\n    >\n      @for (entry of foldedItems(); track entry.item.id) {\n        <lw-shell-bar-item [entry]=\"entry\" [dock]=\"dock()\" />\n      }\n    </div>\n  }\n</div>\n","import {\n  DockPosition,\n  LayoutRegion,\n  PanelRegion,\n  RegionType,\n  ShellLayout,\n} from './layout';\n\nexport function regionsOfType(\n  layout: ShellLayout,\n  type: RegionType,\n): LayoutRegion[] {\n  return layout.regions.filter((region) => region.type === type);\n}\n\nexport function panelRegions(layout: ShellLayout): PanelRegion[] {\n  return layout.regions.filter(\n    (region): region is PanelRegion => region.type === 'panel',\n  );\n}\n\nexport function regionIdsOfType(\n  layout: ShellLayout,\n  type: RegionType,\n): string[] {\n  return regionsOfType(layout, type).map((region) => region.id);\n}\n\nexport function hasRegionOfType(\n  layout: ShellLayout,\n  type: RegionType,\n): boolean {\n  return layout.regions.some((region) => region.type === type);\n}\n\nexport function hasContentRegion(layout: ShellLayout): boolean {\n  return hasRegionOfType(layout, 'content');\n}\n\nexport function sideCount(layout: ShellLayout, type: RegionType): number {\n  return new Set(regionsOfType(layout, type).map((region) => region.dock)).size;\n}\n\nexport function regionsAt(\n  layout: ShellLayout,\n  dock: DockPosition,\n  type: RegionType,\n): LayoutRegion[] {\n  return layout.regions.filter(\n    (region) => region.dock === dock && region.type === type,\n  );\n}\n\nexport function regionById(\n  layout: ShellLayout,\n  id: string,\n): LayoutRegion | undefined {\n  return layout.regions.find((region) => region.id === id);\n}\n\nexport function regionOnSide(\n  layout: ShellLayout,\n  type: RegionType,\n  dock: DockPosition,\n  exceptId: string,\n): LayoutRegion | undefined {\n  return layout.regions.find(\n    (region) =>\n      region.type === type && region.dock === dock && region.id !== exceptId,\n  );\n}\n\nexport function regionOnOtherSide(\n  layout: ShellLayout,\n  type: RegionType,\n  fromId: string,\n): LayoutRegion | undefined {\n  const from = regionById(layout, fromId);\n  if (!from) {\n    return undefined;\n  }\n  return layout.regions.find(\n    (region) =>\n      region.type === type && region.id !== fromId && region.dock !== from.dock,\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 { InjectionToken, Provider, Type } from '@angular/core';\nimport { KeyValueStore, LocalStorageStore } from './key-value-store';\nimport { withCrossTabSync } from './cross-tab/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 one for a product backend: writes are rare, small and roaming-worthy, so a\n * REST-backed implementation receives exactly 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 { 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 '../stored-values/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 ports. 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  private readonly adopters = new Set<() => void | Promise<void>>();\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    return registerIn(this.exact, key, { source, apply });\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    return registerIn(this.prefixes, prefix, { source, apply });\n  }\n\n  /**\n   * Reacts to the workbench's storage namespace being adopted after state was already read from\n   * another one — the first sign-in of a session that began anonymously. Registered keys are read\n   * again on their own; this is for state whose keys are not known in advance, such as a family\n   * keyed per plugin or per workspace: the handler re-reads what its owner holds. Returns a\n   * disposer.\n   */\n  onNamespaceAdopted(handler: () => void | Promise<void>): () => void {\n    this.adopters.add(handler);\n    return () => {\n      this.adopters.delete(handler);\n    };\n  }\n\n  /**\n   * Reads every registered key again through its port and runs the handlers registered with\n   * {@link onNamespaceAdopted}. Called by the shell when the identity behind the stores becomes\n   * known after the first read; a distribution that scopes the ports itself calls it when its own\n   * namespace changes under a running application.\n   */\n  async namespaceAdopted(): Promise<void> {\n    for (const [key, registration] of this.exact) {\n      const raw = await this.readBack(registration.source, key);\n      this.channel.whileApplying(() => registration.apply(raw, key));\n    }\n    for (const handler of this.adopters) {\n      await handler();\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\nfunction registerIn(\n  registrations: Map<string, Registration>,\n  key: string,\n  registration: Registration,\n): () => void {\n  registrations.set(key, registration);\n  return () => {\n    if (registrations.get(key) === registration) {\n      registrations.delete(key);\n    }\n  };\n}\n","export function parseStored(raw: string | null | undefined): unknown {\n  if (!raw) {\n    return undefined;\n  }\n  try {\n    return JSON.parse(raw);\n  } catch {\n    return undefined;\n  }\n}\n","import { parseStored } from './parse-stored';\nexport type FlagRecord = Readonly<Record<string, true>>;\n\nexport function isTrue(value: unknown): value is true {\n  return value === true;\n}\n\nexport function recordOf<T>(\n  value: unknown,\n  isValue: (entry: unknown) => entry is T,\n): Readonly<Record<string, T>> {\n  if (!value || typeof value !== 'object' || Array.isArray(value)) {\n    return {};\n  }\n  return Object.fromEntries(\n    Object.entries(value).filter((entry): entry is [string, T] =>\n      isValue(entry[1]),\n    ),\n  );\n}\n\nexport function parseRecord<T>(\n  raw: string | undefined,\n  isValue: (entry: unknown) => entry is T,\n): Readonly<Record<string, T>> {\n  return recordOf(parseStored(raw), isValue);\n}\n\nexport function toggledFlag(\n  record: FlagRecord,\n  key: string,\n  on: boolean,\n): FlagRecord {\n  const next: Record<string, true> = { ...record };\n  if (on) {\n    next[key] = true;\n  } else {\n    delete next[key];\n  }\n  return next;\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport {\n  hydrateAsync,\n  readStoredValue,\n} from '../../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../../persistence/cross-tab/state-sync.service';\nimport {\n  FlagRecord,\n  isTrue,\n  parseRecord,\n  toggledFlag,\n} from '../../persistence/stored-values/persisted-record';\nimport { RetainedViewStash } from '../pane/retention/retained-view-stash';\nimport { isKeyOfDock } from '../pane/retention/retention-keys';\n\nconst STORAGE_KEY = 'lw.shell.panels';\n\nfunction parseCollapsed(raw: string | undefined): FlagRecord {\n  return parseRecord(raw, isTrue);\n}\n\n@Service()\nexport class PanelState {\n  private readonly store = inject(WORKING_STATE_STORE);\n  private readonly stash = inject(RetainedViewStash);\n  private readonly sync = inject(StateSyncService);\n  private readonly collapsed = signal<FlagRecord>(\n    parseCollapsed(this.store.peek?.(STORAGE_KEY)),\n  );\n\n  private readonly overlay = signal<string | null>(null);\n\n  constructor() {\n    const apply = (raw: string | undefined) =>\n      this.collapsed.set(parseCollapsed(raw));\n    hydrateAsync(this.store, STORAGE_KEY, apply);\n    this.sync.onNamespaceAdopted(async () =>\n      apply(await readStoredValue(this.store, STORAGE_KEY)),\n    );\n  }\n\n  isCollapsed(regionId: string): boolean {\n    return this.collapsed()[regionId] === true;\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((key) => isKeyOfDock(key, regionId));\n    }\n    const next = toggledFlag(this.collapsed(), regionId, value);\n    this.collapsed.set(next);\n    void this.store.set(STORAGE_KEY, JSON.stringify(next));\n  }\n}\n","import { InjectionToken, Signal, signal } from '@angular/core';\nimport { SurfaceHold } from '@loomweaver/plugin-sdk';\n\nexport interface SurfaceHoldState {\n  readonly held: Signal<boolean>;\n  onRelease(listener: () => void): () => void;\n  end(): void;\n}\n\nexport const SURFACE_HOLD_STATE = new InjectionToken<SurfaceHoldState>(\n  'lw.surface-hold-state',\n);\n\nexport interface SurfaceHoldPair {\n  readonly handle: SurfaceHold;\n  readonly state: SurfaceHoldState;\n}\n\nexport function createSurfaceHold(): SurfaceHoldPair {\n  const held = signal(false);\n  const listeners = new Set<() => void>();\n  const release = () => {\n    if (!held()) {\n      return;\n    }\n    held.set(false);\n    for (const listener of listeners) {\n      listener();\n    }\n  };\n  return {\n    handle: {\n      held: held.asReadonly(),\n      hold: () => held.set(true),\n      release,\n    },\n    state: {\n      held: held.asReadonly(),\n      onRelease: (listener) => {\n        listeners.add(listener);\n        return () => listeners.delete(listener);\n      },\n      end: release,\n    },\n  };\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, OnDestroy, Service } from '@angular/core';\n\nconst QUIET_MS = 400;\nconst LONGEST_WAIT_MS = 2000;\n\ntype Send = (value: string) => void;\ntype Timer = ReturnType<typeof setTimeout>;\n\ninterface Held {\n  value: string;\n  send: Send;\n  quiet: Timer;\n  readonly longest: Timer;\n}\n\n@Service()\nexport class HeldWrites implements OnDestroy {\n  private readonly window = inject(DOCUMENT).defaultView;\n  private readonly held = new Map<string, Held>();\n\n  constructor() {\n    this.window?.addEventListener('pagehide', this.flushAll);\n  }\n\n  ngOnDestroy(): void {\n    this.window?.removeEventListener('pagehide', this.flushAll);\n  }\n\n  hold(key: string, value: string, send: Send): void {\n    const existing = this.held.get(key);\n    if (existing) {\n      clearTimeout(existing.quiet);\n      existing.value = value;\n      existing.send = send;\n      existing.quiet = this.flushAfter(key, QUIET_MS);\n      return;\n    }\n    this.held.set(key, {\n      value,\n      send,\n      quiet: this.flushAfter(key, QUIET_MS),\n      longest: this.flushAfter(key, LONGEST_WAIT_MS),\n    });\n  }\n\n  flush(key: string): void {\n    const held = this.release(key);\n    held?.send(held.value);\n  }\n\n  cancel(key: string): void {\n    this.release(key);\n  }\n\n  private readonly flushAll = (): void => {\n    for (const key of this.held.keys()) {\n      this.flush(key);\n    }\n  };\n\n  private flushAfter(key: string, wait: number): Timer {\n    return setTimeout(() => this.flush(key), wait);\n  }\n\n  private release(key: string): Held | undefined {\n    const held = this.held.get(key);\n    if (!held) {\n      return undefined;\n    }\n    clearTimeout(held.quiet);\n    clearTimeout(held.longest);\n    this.held.delete(key);\n    return held;\n  }\n}\n","import { inject, Service, signal, WritableSignal } from '@angular/core';\nimport { ViewState } from '@loomweaver/plugin-sdk';\nimport { HeldWrites } from '../persistence/held-writes/held-writes';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { hydrateAsync, readStoredValue } from '../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../persistence/cross-tab/state-sync.service';\nimport { parseStored } from '../persistence/stored-values/parse-stored';\n\nconst STORAGE_PREFIX = 'lw.shell.view-state:';\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 heldWrites = inject(HeldWrites);\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(parseStored(raw));\n    });\n    this.sync.onNamespaceAdopted(() => this.rereadEntries());\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 async rereadEntries(): Promise<void> {\n    for (const [instanceId, entry] of this.entries) {\n      const raw = await readStoredValue(\n        this.store,\n        STORAGE_PREFIX + instanceId,\n      );\n      entry.cancelPendingSave();\n      entry.value.set(parseStored(raw));\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>(parseStored(this.store.peek?.(key)));\n    hydrateAsync(this.store, key, (raw) => value.set(parseStored(raw)));\n    const cancelPendingSave = () => this.heldWrites.cancel(key);\n    const save = () => {\n      const current = value();\n      if (current === undefined) {\n        cancelPendingSave();\n        return;\n      }\n      this.heldWrites.hold(key, JSON.stringify(current), (held) => {\n        void this.store.set(key, held);\n      });\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, readStoredValue } from '../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../persistence/cross-tab/state-sync.service';\nimport { parseStored } from '../persistence/stored-values/parse-stored';\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  const parsed = parseStored(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        (instance): instance is ViewInstance =>\n          !!instance && typeof instance.id === 'string' && typeof instance.name === 'string',\n      )\n    : [];\n  const withoutDefault = instances.filter((instance) => instance.id !== viewId);\n  const merged = [{ id: viewId, name: '' }, ...withoutDefault];\n  const activeId =\n    typeof record.activeId === 'string' &&\n    merged.some((instance) => instance.id === record.activeId)\n      ? record.activeId\n      : viewId;\n  return { instances: merged, activeId };\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    this.sync.onNamespaceAdopted(() => this.rereadRecords());\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  activeInstance(viewId: string): ViewInstance | undefined {\n    const activeId = this.activeId(viewId)();\n    return this.instances(viewId)().find(\n      (instance) => instance.id === 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((instance) => instance.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((instance) =>\n        instance.id === instanceId ? { ...instance, name } : instance,\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((instance) => instance.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 async rereadRecords(): Promise<void> {\n    for (const [viewId, record] of this.records) {\n      const raw = await readStoredValue(this.store, STORAGE_PREFIX + viewId);\n      record.set(parseRecord(viewId, raw));\n    }\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 { SURFACE_HOLD, VIEW_STATE } from '@loomweaver/plugin-sdk';\nimport { View } from './view';\nimport {\n  createSurfaceHold,\n  SURFACE_HOLD_STATE,\n} from '../regions/pane/retention/surface-hold';\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      const hold = createSurfaceHold();\n      injector = Injector.create({\n        parent: this.env,\n        providers: [\n          { provide: VIEW_STATE, useValue: this.viewStates.handle(instanceId) },\n          { provide: SURFACE_HOLD, useValue: hold.handle },\n          { provide: SURFACE_HOLD_STATE, useValue: hold.state },\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 byLoader = 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.byLoader.get(loader);\n    if (known) {\n      return known();\n    }\n    const resolved = signal<Type<unknown> | null>(null);\n    this.byLoader.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 { DOCUMENT } from '@angular/common';\nimport {\n  afterNextRender,\n  inject,\n  Injector,\n  Service,\n  signal,\n  Type,\n  WritableSignal,\n} from '@angular/core';\nimport { LwButtonVariant } from '../elements/button/lw-button';\nimport { LoomIconName } from '../elements/icon/loom-icons';\nimport {\n  AlertOptions,\n  ConfirmOptions,\n  DialogButton,\n  DialogDismiss,\n  DialogRef,\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  DialogDismiss,\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\nexport type DialogKind = 'confirm' | 'alert' | 'prompt' | 'custom' | 'progress';\nexport type 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 dismiss: DialogDismiss;\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\n  private dismissal: ((dialog: DialogInstance) => Promise<boolean>) | undefined;\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: toneIcon(options, 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      dismiss: 'any',\n      buttons: cancelAndConfirm(tone, options, !guard),\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: toneIcon(options, tone),\n      title: options.title,\n      message: options.message,\n      dismiss: 'any',\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: toneIcon(options, tone),\n      title: options.title,\n      message: options.message,\n      placeholder: options.placeholder,\n      promptValue: value,\n      dismiss: 'any',\n      buttons: cancelAndConfirm(tone, options, false),\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: DialogRef = new DialogRef(options.data, () =>\n      this.requestClose(ref),\n    );\n    const injector = Injector.create({\n      providers: [{ provide: DialogRef, useValue: ref }],\n      parent: this.injector,\n    });\n    const tone = options.tone ?? 'default';\n    this.mount(\n      {\n        kind: 'custom',\n        tone,\n        icon: toneIcon(options, tone),\n        title: options.title,\n        component,\n        injector,\n        buttons: customButtons(options.buttons ?? []),\n        dismiss: options.dismiss ?? 'any',\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      dismiss: 'none',\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  /**\n   * Connects the outlet that draws the dialogs, so a body's `requestClose` runs the outlet's own\n   * dismissal. Returns the disconnect.\n   */\n  connectDismissal(\n    dismiss: (dialog: DialogInstance) => Promise<boolean>,\n  ): () => void {\n    this.dismissal = dismiss;\n    return () => {\n      if (this.dismissal === dismiss) {\n        this.dismissal = undefined;\n      }\n    };\n  }\n\n  private requestClose(ref: DialogRef): Promise<boolean> {\n    const dialog = this.items().find((open) => open.ref === ref);\n    if (dialog && this.dismissal) {\n      return this.dismissal(dialog);\n    }\n    ref.close();\n    return Promise.resolve(true);\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      afterNextRender(() => this.giveFocusBack(trigger), {\n        injector: this.injector,\n      });\n    });\n  }\n\n  private giveFocusBack(trigger: HTMLElement | null): void {\n    if (trigger?.isConnected) {\n      trigger.focus();\n    }\n  }\n}\n\nfunction toneIcon(\n  options: { readonly icon?: string },\n  tone: DialogTone,\n): string | undefined {\n  return options.icon ?? TONE_ICON[tone];\n}\n\nfunction cancelAndConfirm(\n  tone: DialogTone,\n  labels: { readonly cancelLabel?: string; readonly confirmLabel?: string },\n  focusConfirm: boolean,\n): DialogButtonView[] {\n  return [\n    {\n      label: labels.cancelLabel ?? 'dialog.cancel',\n      variant: 'default',\n      role: 'cancel',\n      autofocus: false,\n    },\n    {\n      label: labels.confirmLabel ?? 'dialog.ok',\n      variant: TONE_BUTTON[tone],\n      role: 'confirm',\n      autofocus: focusConfirm,\n    },\n  ];\n}\n\nfunction customButtons(specs: readonly DialogButton[]): DialogButtonView[] {\n  return 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}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input, output } from '@angular/core';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { View } from './view';\nimport { DialogService } from '../dialog/dialog.service';\nimport { MenuListEntry, MenuService } from '../menu/menu.service';\nimport { MENU_ANCHOR_GAP } from '../elements/menu/lw-menu.element';\nimport { MenuTriggerDirective } from '../menu/menu-trigger.directive';\nimport { ViewInstanceService } from './view-instance.service';\nimport { nameShowing } from '../foundation/name-showing';\n\n@Component({\n  selector: 'lw-view-instance-switcher',\n  imports: [TranslocoPipe, MenuTriggerDirective],\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 active = this.viewInstances.activeInstance(viewId);\n    if (!active || this.viewInstances.isDefault(viewId, active.id)) {\n      return '';\n    }\n    return active.name;\n  });\n\n  protected nameOf(shown: string, purpose: string): string {\n    return nameShowing([shown], purpose);\n  }\n\n  protected openSwitcher(event: MouseEvent): void {\n    const viewId = this.view().id;\n    const activeId = this.viewInstances.activeId(viewId)();\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          ? 'viewInstance.default'\n          : () => instance.name,\n        active: instance.id === activeId,\n      }));\n    entries.push({ key: 'new', label: 'viewInstance.new', icon: 'add' });\n    if (!this.viewInstances.isDefault(viewId, activeId)) {\n      entries.push(\n        { key: 'rename', label: 'viewInstance.rename' },\n        { key: 'delete', label: 'viewInstance.delete' },\n      );\n    }\n    const control = event.currentTarget as HTMLElement;\n    const rect = control.getBoundingClientRect();\n    this.menu.openList(\n      entries,\n      { x: rect.left, y: rect.bottom + MENU_ANCHOR_GAP },\n      (key) => this.onPick(key),\n      control,\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 active = this.viewInstances.activeInstance(viewId);\n    if (!active) {\n      return;\n    }\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((name) => {\n        if (name?.trim()) {\n          this.viewInstances.rename(viewId, active.id, name.trim());\n        }\n      });\n  }\n\n  private deleteActiveInstance(viewId: string): void {\n    const active = this.viewInstances.activeInstance(viewId);\n    if (!active) {\n      return;\n    }\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) => {\n        if (ok) {\n          this.viewInstances.remove(viewId, active.id);\n        }\n      });\n  }\n}\n","@let shown = activeName() || ('viewInstance.default' | transloco);\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  lwMenuAnnounced\n  [attr.aria-label]=\"nameOf(shown, 'viewInstance.switcher' | transloco)\"\n  data-testid=\"view-switcher\"\n>\n  <span class=\"truncate\">{{ shown }}</span>\n  <lw-icon name=\"chevronDown\" size=\"0.85rem\" class=\"shrink-0\" />\n</button>\n","import { ContentTabLabel, TabBadge } from '@loomweaver/plugin-sdk';\nimport { tabBadgeOf } from '../../../contributions/tab-badge';\nimport { isViewPanePath, PRIMARY_PANE } 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 badge?: TabBadge;\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 = isViewPanePath(path) ? { path, instance: id } : { 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 isDisposableLeaf(\n  leaf: PaneLeaf,\n  kept: readonly (string | undefined)[],\n): boolean {\n  return leaf.tabs.length === 0 && !leaf.declared && !kept.includes(leaf.id);\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\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 labelOf(tab: PaneTab): ContentTabLabel {\n  return {\n    title: tab.title,\n    titleIsLiteral: tab.literalTitle,\n    icon: tab.icon,\n    badge: tab.badge,\n  };\n}\n\nexport function withLabel(tab: PaneTab, label: ContentTabLabel): PaneTab {\n  let next = tab;\n  if (label.title !== undefined) {\n    next =\n      label.titleIsLiteral === true\n        ? { ...next, title: label.title, literalTitle: true }\n        : tabWithout({ ...next, title: label.title }, 'literalTitle');\n  }\n  if (label.icon !== undefined) {\n    next = { ...next, icon: label.icon };\n  }\n  if (label.badge !== undefined) {\n    const badge = label.badge === null ? undefined : tabBadgeOf(label.badge);\n    next = badge === undefined ? tabWithout(next, 'badge') : { ...next, badge };\n  }\n  return next;\n}\n\nexport function withoutLabel(tab: PaneTab): PaneTab {\n  const { title, literalTitle, icon, ...rest } = tab;\n  return rest;\n}\n\nexport function labelledTabs(\n  node: PaneNode,\n  matches: (tab: PaneTab) => boolean,\n  relabel: (tab: PaneTab) => PaneTab,\n): PaneNode | null {\n  if (node.kind === 'leaf') {\n    if (node.tabs.every((tab) => !matches(tab))) {\n      return null;\n    }\n    return {\n      ...node,\n      tabs: node.tabs.map((tab) => (matches(tab) ? relabel(tab) : tab)),\n    };\n  }\n  const first = labelledTabs(node.first, matches, relabel);\n  const second = labelledTabs(node.second, matches, relabel);\n  if (first === null && second === null) {\n    return null;\n  }\n  return { ...node, first: first ?? node.first, second: second ?? node.second };\n}\n","import { PaneLeaf, PaneNode, PaneTab, leafPath } from './pane-node';\n\nexport function leavesOf(node: PaneNode): PaneLeaf[] {\n  return node.kind === 'leaf'\n    ? [node]\n    : [...leavesOf(node.first), ...leavesOf(node.second)];\n}\n\nexport function findLeafWhere(\n  node: PaneNode,\n  predicate: (leaf: PaneLeaf) => boolean,\n): PaneLeaf | null {\n  return leavesOf(node).find((leaf) => predicate(leaf)) ?? null;\n}\n\nexport function findLeaf(node: PaneNode, paneId: string): PaneLeaf | null {\n  return findLeafWhere(node, (leaf) => leaf.id === paneId);\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 landingLeaf(node: PaneNode): PaneLeaf | null {\n  return findLeafWhere(node, (leaf) => leaf.declared === true);\n}\n\nexport function collectLeafIds(node: PaneNode): string[] {\n  return leavesOf(node).map((leaf) => leaf.id);\n}\n\nexport function collectTabs(node: PaneNode): PaneTab[] {\n  return leavesOf(node).flatMap((leaf) => leaf.tabs);\n}\n\nexport function collectTabPaths(node: PaneNode): string[] {\n  return collectTabs(node).map((tab) => tab.path);\n}\n\nexport function tabPathsWhere(\n  node: PaneNode,\n  match: (path: string) => boolean,\n): string[] {\n  return collectTabPaths(node).filter((path) => match(path));\n}\n\nexport function tabHolderOf(node: PaneNode, tabPath: string): string | null {\n  return findLeafWithTab(node, tabPath)?.id ?? null;\n}\n\nexport interface PaneSegment {\n  readonly id: string;\n  readonly path?: string;\n}\n\nexport function paneSegments(node: PaneNode): PaneSegment[] {\n  return leavesOf(node).map((leaf) => ({ id: leaf.id, path: leafPath(leaf) }));\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 {\n  PRIMARY_LEAF,\n  PaneLeaf,\n  PaneNode,\n  PaneTab,\n  isDisposableLeaf,\n  labelOf,\n  leafOf,\n  leafWith,\n  newPaneId,\n  withLabel,\n} from './pane-node';\nimport { findLeaf, leavesOf } from './pane-queries';\nimport { DEFAULT_RATIO } from './pane-ratio';\nimport { isAtOrBelow } from '../../content/content-path';\n\nexport function transformLeaf(\n  node: PaneNode,\n  paneId: string,\n  change: (leaf: PaneLeaf) => PaneLeaf,\n): PaneNode {\n  if (node.kind === 'leaf') {\n    return node.id === paneId ? change(node) : node;\n  }\n  const first = transformLeaf(node.first, paneId, change);\n  const second = transformLeaf(node.second, paneId, change);\n  return first === node.first && second === node.second\n    ? node\n    : { ...node, first, second };\n}\n\nexport function collapseLeaves(\n  node: PaneNode,\n  replace: (leaf: PaneLeaf) => PaneNode | null,\n): PaneNode | null {\n  if (node.kind === 'leaf') {\n    return replace(node);\n  }\n  const first = collapseLeaves(node.first, replace);\n  const second = collapseLeaves(node.second, replace);\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\nexport function collapseLeaf(\n  node: PaneNode,\n  paneId: string,\n  replace: (leaf: PaneLeaf) => PaneNode | null,\n): PaneNode | null {\n  return collapseLeaves(node, (leaf) =>\n    leaf.id === paneId ? replace(leaf) : leaf,\n  );\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) => isAtOrBelow(path, tab.path))\n  );\n}\n\nfunction labelledLike(leaf: PaneLeaf, source: PaneTab): PaneLeaf {\n  const label = labelOf(source);\n  return { ...leaf, tabs: leaf.tabs.map((tab) => withLabel(tab, label)) };\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  return leavesOf(node).some(\n    (leaf) =>\n      leaf.id !== primaryId &&\n      leaf.tabs.some((tab) => isAtOrBelow(path, tab.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((tab) => isAtOrBelow(shown, tab.path));\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  return collapseLeaves(node, (leaf) =>\n    isDisposableLeaf(leaf, [primaryId, spare]) ? null : leaf,\n  );\n}\n\nexport function withoutEmptyPrimary(\n  node: PaneNode,\n  primaryId: string,\n): PaneNode {\n  if (node.kind !== 'split') {\n    return node;\n  }\n  const primary = findLeaf(node, primaryId);\n  if (!primary || !isDisposableLeaf(primary, [])) {\n    return node;\n  }\n  return removeLeaf(node, primaryId) ?? PRIMARY_LEAF;\n}\n","import { PaneLeaf, PaneNode, PaneTab } from './pane-node';\nimport { collectLeafIds, findLeaf, leavesOf } from './pane-queries';\nimport { removeLeaf, transformLeaf } from './pane-structure';\n\nexport type TabKeep = (tab: PaneTab) => boolean;\n\nexport const keepsNothing: TabKeep = () => false;\n\nexport const keepsEverything: TabKeep = () => true;\n\nexport function closedWithHandover(\n  node: PaneNode,\n  paneId: string,\n  keeps: TabKeep,\n): PaneNode | null {\n  return handedOverAndRemoved(\n    node,\n    paneId,\n    adjacentLeafOf(node, paneId),\n    keeps,\n  );\n}\n\nexport function collapsedWithHandover(\n  node: PaneNode,\n  primaryId: string,\n  keeps: TabKeep,\n): PaneNode | null {\n  return handedOverAndRemoved(\n    node,\n    primaryId,\n    promotedLeafOf(node, primaryId),\n    keeps,\n  );\n}\n\nexport function unsplitWithHandover(\n  node: PaneNode,\n  primaryId: string,\n  keeps: TabKeep,\n): PaneLeaf | null {\n  const primary = findLeaf(node, primaryId);\n  if (primary === null) {\n    return null;\n  }\n  const kept = leavesOf(node)\n    .filter((leaf) => leaf.id !== primaryId)\n    .flatMap((leaf) => leaf.tabs.filter((tab) => keeps(tab)));\n  return withTabsAppended(primary, kept);\n}\n\nfunction adjacentLeafOf(node: PaneNode, paneId: string): string | null {\n  if (node.kind === 'leaf') {\n    return null;\n  }\n  if (node.first.kind === 'leaf' && node.first.id === paneId) {\n    return collectLeafIds(node.second)[0] ?? null;\n  }\n  if (node.second.kind === 'leaf' && node.second.id === paneId) {\n    return collectLeafIds(node.first).at(-1) ?? null;\n  }\n  return (\n    adjacentLeafOf(node.first, paneId) ?? adjacentLeafOf(node.second, paneId)\n  );\n}\n\nfunction promotedLeafOf(node: PaneNode, primaryId: string): string | null {\n  const collapsed = removeLeaf(node, primaryId);\n  return collapsed === null ? null : (collectLeafIds(collapsed)[0] ?? null);\n}\n\nfunction handedOverAndRemoved(\n  node: PaneNode,\n  paneId: string,\n  receiverId: string | null,\n  keeps: TabKeep,\n): PaneNode | null {\n  const closing = findLeaf(node, paneId);\n  const handed =\n    closing === null || receiverId === null\n      ? node\n      : transformLeaf(node, receiverId, (leaf) =>\n          withTabsAppended(\n            leaf,\n            closing.tabs.filter((tab) => keeps(tab)),\n          ),\n        );\n  return removeLeaf(handed, paneId);\n}\n\nfunction withTabsAppended(leaf: PaneLeaf, tabs: readonly PaneTab[]): PaneLeaf {\n  const held = new Set(leaf.tabs.map((tab) => tab.path));\n  const added = tabs.filter((tab) => !held.has(tab.path));\n  if (added.length === 0) {\n    return leaf;\n  }\n  return {\n    ...leaf,\n    tabs: [...leaf.tabs, ...added],\n    active: leaf.tabs.length === 0 ? added[0].path : leaf.active,\n  };\n}\n","import { PRIMARY_PANE } from './pane-address';\nimport {\n  PaneNode,\n  PaneTab,\n  labelledTabs,\n  leafOf,\n  leafWith,\n  withoutLabel,\n} from './pane-node';\nimport { collectLeafIds, findLeaf } from './pane-queries';\nimport { DEFAULT_RATIO, sanitizeRatio } from './pane-ratio';\nimport { tabBadgeOf } from '../../../contributions/tab-badge';\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  const badge = tabBadgeOf(tab['badge']);\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    ...(badge !== undefined && { badge }),\n    ...(typeof tab['instance'] === 'string' && { instance: tab['instance'] }),\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\n        .map((value) => normalizeTab(value))\n        .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    ? collectLeafIds(node)[0]\n    : candidate;\n}\n\nexport function withoutBorrowedLabels(\n  node: PaneNode,\n  borrowed: (tab: PaneTab) => boolean,\n): { node: PaneNode; stripped: readonly string[] } {\n  const stripped: string[] = [];\n  const next = labelledTabs(node, borrowed, (tab) => {\n    stripped.push(tab.path);\n    return withoutLabel(tab);\n  });\n  return { node: next ?? node, stripped };\n}\n","import { parseStored } from '../../persistence/stored-values/parse-stored';\nexport const WORKSPACES_KEY = 'lw.shell.workspaces';\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\nexport function parseWorkspaces(raw: string | undefined): Workspace[] {\n  const parsed = parseStored(raw);\n  if (!Array.isArray(parsed)) {\n    return [];\n  }\n  return parsed.filter(\n      (workspace): workspace is Workspace =>\n        !!workspace &&\n        typeof (workspace as Workspace).id === 'string' &&\n        typeof (workspace as Workspace).name === 'string' &&\n        typeof (workspace as Workspace).baseline === 'object' &&\n        (workspace as Workspace).baseline !== null &&\n        !Array.isArray((workspace as Workspace).baseline),\n  );\n}\n","import { inject, Signal, signal } from '@angular/core';\nimport { hydrateAsync } from './hydrate';\nimport { SETTINGS_STORE } from '../settings-store';\nimport { StateSyncService } from '../cross-tab/state-sync.service';\n\nexport interface PersistedSetting<T> {\n  readonly value: Signal<T>;\n  set(next: T): void;\n  update(change: (current: T) => T): void;\n  clear(): void;\n}\n\nexport interface SettingCodec<T> {\n  readonly parse: (raw: string | undefined) => T;\n  readonly serialize: (value: T) => string;\n}\n\ntype Change<T> = { readonly clear: true } | { readonly clear: false; readonly change: (current: T) => T };\n\nexport function persistedSetting<T>(\n  key: string,\n  codec: SettingCodec<T>,\n): PersistedSetting<T> {\n  const store = inject(SETTINGS_STORE);\n  const state = signal(codec.parse(store.peek?.(key)));\n  let hydrated = store.peek !== undefined;\n  let early: Change<T>[] = [];\n\n  const write = (next: Change<T>): void => {\n    if (next.clear) {\n      state.set(codec.parse(undefined));\n      void store.delete(key);\n      return;\n    }\n    const value = next.change(state());\n    state.set(value);\n    void store.set(key, codec.serialize(value));\n  };\n\n  const replay = (raw: string | undefined): void => {\n    const changes = early;\n    early = [];\n    hydrated = true;\n    state.set(codec.parse(raw));\n    for (const change of changes) {\n      write(change);\n    }\n  };\n\n  const apply = (raw: string | undefined): void => {\n    if (!hydrated) {\n      replay(raw);\n      return;\n    }\n    state.set(codec.parse(raw));\n  };\n\n  const change = (next: Change<T>): void => {\n    if (hydrated) {\n      write(next);\n      return;\n    }\n    early.push(next);\n    state.set(next.clear ? codec.parse(undefined) : next.change(state()));\n  };\n\n  hydrateAsync(store, key, apply, (loaded) => {\n    if (!loaded && !hydrated) {\n      replay(undefined);\n    }\n  });\n  inject(StateSyncService).register('settings', key, apply);\n  return {\n    value: state.asReadonly(),\n    set: (next) => change({ clear: false, change: () => next }),\n    update: (next) => change({ clear: false, change: next }),\n    clear: () => change({ clear: true }),\n  };\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  let best = matching[0];\n  for (const claim of matching) {\n    if (narrower(claim.pattern, best.pattern) > 0) {\n      best = claim;\n    }\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([...byShape].filter(([, owners]) => owners.length > 1));\n}\n\nexport function conflictingClaims(\n  claims: readonly WorkspaceClaim[],\n): readonly string[] {\n  return [\n    ...[...contestedShapes(claims)].map(([shape, owners]) =>\n      sameShapeConflict(shape, owners),\n    ),\n    ...tiedOverlaps(claims).map(([one, other]) => overlapConflict(one, other)),\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\nfunction tiedOverlaps(\n  claims: readonly WorkspaceClaim[],\n): (readonly [WorkspaceClaim, WorkspaceClaim])[] {\n  const tied: (readonly [WorkspaceClaim, WorkspaceClaim])[] = [];\n  for (const [position, one] of claims.entries()) {\n    for (const other of claims.slice(position + 1)) {\n      if (\n        one.workspaceId !== other.workspaceId &&\n        claimShape(one.pattern) !== claimShape(other.pattern) &&\n        tieOnSomeAddress(one.pattern, other.pattern)\n      ) {\n        tied.push([one, other]);\n      }\n    }\n  }\n  return tied;\n}\n\nfunction tieOnSomeAddress(one: string, other: string): boolean {\n  const otherParts = segmentsOf(other);\n  return (\n    narrower(one, other) === 0 &&\n    segmentsOf(one).every(\n      (part, position) =>\n        part.startsWith(':') ||\n        otherParts[position].startsWith(':') ||\n        part === otherParts[position],\n    )\n  );\n}\n\nfunction sameShapeConflict(shape: string, owners: readonly string[]): string {\n  const named = owners.map((id) => `\"${id}\"`).join(' and ');\n  return (\n    `Workspaces ${named} 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\nfunction overlapConflict(one: WorkspaceClaim, other: WorkspaceClaim): string {\n  return (\n    `Workspaces \"${one.workspaceId}\" and \"${other.workspaceId}\" claim \"${one.pattern}\" and ` +\n    `\"${other.pattern}\", which meet on some addresses without either being narrower, so an ` +\n    `address both match behaves as though nothing claimed it. Give such an address one home.`\n  );\n}\n","import {\n  claimsOf,\n  startingWorkspaceId,\n} from '../declaration/composed-definitions';\nimport { WorkspaceDefinition } from '../declaration/workspace-definition';\nimport {\n  settlementFor,\n  withoutConflicts,\n  type WorkspaceClaim,\n} from '../workspace-claims';\nimport { type Workspace } from './saved-workspaces';\n\nexport function definitionOf(\n  definitions: readonly WorkspaceDefinition[],\n  id: string,\n): WorkspaceDefinition | undefined {\n  return definitions.find((definition) => definition.id === id);\n}\n\nexport function workspaceExists(\n  id: string,\n  definitions: readonly WorkspaceDefinition[],\n  saved: readonly Workspace[],\n): boolean {\n  return (\n    id === startingWorkspaceId(definitions) ||\n    definitionOf(definitions, id) !== undefined ||\n    saved.some((workspace) => workspace.id === id)\n  );\n}\n\nexport function activeClaims(\n  definitions: readonly WorkspaceDefinition[],\n): readonly WorkspaceClaim[] {\n  return withoutConflicts(claimsOf(definitions));\n}\n\nexport function originOf(\n  id: string,\n  definitions: readonly WorkspaceDefinition[],\n  saved: readonly Workspace[],\n): string | null {\n  if (definitionOf(definitions, id) !== undefined) {\n    return id;\n  }\n  const origin = saved.find((workspace) => workspace.id === id)?.origin;\n  return origin === undefined || definitionOf(definitions, origin) === undefined\n    ? null\n    : origin;\n}\n\nexport function claimsOfWorkspace(\n  id: string,\n  definitions: readonly WorkspaceDefinition[],\n  saved: readonly Workspace[],\n): readonly WorkspaceClaim[] {\n  const origin = originOf(id, definitions, saved);\n  return origin === null\n    ? []\n    : activeClaims(definitions).filter((claim) => claim.workspaceId === origin);\n}\n\nexport function settlementDestination(\n  path: string,\n  here: string,\n  definitions: readonly WorkspaceDefinition[],\n  saved: readonly Workspace[],\n): string | null {\n  return settlementFor(\n    activeClaims(definitions),\n    claimsOfWorkspace(here, definitions, saved),\n    here,\n    path,\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) =>\n    Object.hasOwn(area, key),\n  );\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((child) => collectTabs(child));\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 evenShareOf(\n  remainder: number,\n  declaredSum: number,\n  children: number,\n  unspecified: number,\n): number {\n  if (unspecified === 0) {\n    return 0;\n  }\n  return remainder > 0 ? remainder / unspecified : declaredSum / children;\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 = evenShareOf(\n    remainder,\n    declaredSum,\n    children.length,\n    unspecified,\n  );\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 {\n  BakedTab,\n  PaneAreaTree,\n  paneAreaTree,\n} from '../../regions/pane/tree/declared-pane-layout';\nimport { isViewPanePath } from '../../regions/pane/tree/pane-address';\nimport { WorkspaceDefinition, WorkspaceTabEntry } from './workspace-definition';\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\nexport function 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 (isViewPanePath(tab.path)) {\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 { ContentRoute } from '@loomweaver/plugin-sdk';\nimport { matchRoute, normalizePath } from '../../regions/content/content-path';\nimport { VIEW_PANE_PREFIX } from '../../regions/pane/tree/pane-address';\nimport { conflictingClaims } from '../workspace-claims';\nimport { BUILT_IN_WORKSPACE_ID, claimsOf } from './composed-definitions';\nimport { contentTree, declaredTabPaths } from './declared-content';\nimport { WorkspaceDefinition } from './workspace-definition';\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 === BUILT_IN_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        initial = definition.id;\n      } else {\n        problems.push(\n          `Workspace \"${definition.id}\" also declares initial: true — \"${initial}\" already does, so this one is ignored.`,\n        );\n      }\n    }\n    auditDefinition(definition, panelRegions, problems);\n  }\n  problems.push(...conflictingClaims(claimsOf(definitions)));\n  return problems;\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 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  return [\n    ...claimGaps(definition, around.routes),\n    ...tabGaps(definition, around.routes),\n    ...sidebarGaps(definition, around.declaredPaths),\n  ];\n}\n\nfunction claimGaps(\n  definition: WorkspaceDefinition,\n  routes: readonly ContentRoute[],\n): readonly string[] {\n  const id = definition.id;\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): readonly string[] {\n  const id = definition.id;\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): readonly string[] {\n  const id = definition.id;\n  return Object.entries(definition.sidebars ?? {}).flatMap(\n    ([region, visible]) => {\n      const declared = new Set(\n        declaredPaths(region).map((path) =>\n          path.slice(VIEW_PANE_PREFIX.length),\n        ),\n      );\n      return visible\n        .filter((viewId) => !declared.has(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\nexport function warnDeclarationGaps(\n  definition: WorkspaceDefinition,\n  around: DeclarationSurroundings,\n): void {\n  for (const gap of declarationGaps(definition, around)) {\n    console.warn(gap);\n  }\n}\n","import { inject, isDevMode, Service } from '@angular/core';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { regionIdsOfType } from '../../layout/layout-queries';\nimport { persistedSetting } from '../../persistence/stored-values/persisted-setting';\nimport {\n  activeClaims,\n  claimsOfWorkspace,\n  definitionOf,\n  originOf,\n  workspaceExists,\n} from './workspace-lookup';\nimport {\n  WORKSPACES_KEY,\n  parseWorkspaces,\n  type Workspace,\n} from './saved-workspaces';\nimport {\n  BUILT_IN_WORKSPACE_ID,\n  dedupedDefinitions,\n  offersBuiltInWorkspace,\n  startingWorkspaceId,\n} from '../declaration/composed-definitions';\nimport { auditWorkspaceDefinitions } from '../declaration/definition-audit';\nimport { WORKSPACE_DEFINITIONS } from '../declaration/provide-workspaces';\nimport { WorkspaceDefinition } from '../declaration/workspace-definition';\nimport { type WorkspaceClaim } from '../workspace-claims';\n\nexport interface WorkspaceOrigin {\n  readonly id: string;\n  readonly origin: string | null;\n}\n\n@Service()\nexport class WorkspaceCatalog {\n  private readonly declared = (\n    inject(WORKSPACE_DEFINITIONS, { optional: true }) ?? []\n  ).flat();\n\n  private readonly stored = persistedSetting<Workspace[]>(WORKSPACES_KEY, {\n    parse: parseWorkspaces,\n    serialize: (list) => JSON.stringify(list),\n  });\n\n  readonly definitions: readonly WorkspaceDefinition[] = dedupedDefinitions(\n    this.declared,\n  );\n\n  readonly saved = this.stored.value;\n\n  readonly startingId = startingWorkspaceId(this.definitions);\n\n  readonly offersBuiltIn = offersBuiltInWorkspace(this.definitions);\n\n  constructor() {\n    if (!isDevMode()) {\n      return;\n    }\n    const panelRegions = regionIdsOfType(inject(SHELL_LAYOUT), 'panel');\n    for (const problem of auditWorkspaceDefinitions(\n      this.declared,\n      panelRegions,\n    )) {\n      console.warn(problem);\n    }\n  }\n\n  commit(next: Workspace[]): void {\n    this.stored.set(next);\n  }\n\n  definitionOf(id: string): WorkspaceDefinition | undefined {\n    return definitionOf(this.definitions, id);\n  }\n\n  isBuiltInOrDeclared(id: string): boolean {\n    return id === BUILT_IN_WORKSPACE_ID || this.definitionOf(id) !== undefined;\n  }\n\n  exists(id: string): boolean {\n    return workspaceExists(id, this.definitions, this.saved());\n  }\n\n  originOf(id: string): string | null {\n    return originOf(id, this.definitions, this.saved());\n  }\n\n  claimsOfWorkspace(id: string): readonly WorkspaceClaim[] {\n    return claimsOfWorkspace(id, this.definitions, this.saved());\n  }\n\n  activeClaims(): readonly WorkspaceClaim[] {\n    return activeClaims(this.definitions);\n  }\n\n  everyOrigin(): readonly WorkspaceOrigin[] {\n    return [\n      ...this.definitions.map((definition) => ({\n        id: definition.id,\n        origin: definition.id,\n      })),\n      ...this.saved().map((workspace) => ({\n        id: workspace.id,\n        origin: this.originOf(workspace.id),\n      })),\n    ];\n  }\n}\n","import { inject, isDevMode, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../../persistence/working-state-store';\nimport { SETTINGS_STORE } from '../../../persistence/settings-store';\nimport { hydrateAsync } from '../../../persistence/stored-values/hydrate';\nimport { PopoutWindow } from '../../../popout/popout-window';\nimport { ActiveWorkspaceService } from '../../../workspace/active-workspace.service';\nimport {\n  DockEntry,\n  normalizeDockEntry,\n  withoutBorrowedLabels,\n} from './stored-pane-tree';\nimport { PaneNode } from './pane-node';\nimport { tabPathsWhere } from './pane-queries';\nimport { isAtOrBelow } from '../../content/content-path';\nimport { WORKSPACES_KEY } from '../../../workspace/catalog/saved-workspaces';\nimport { WorkspaceCatalog } from '../../../workspace/catalog/workspace-catalog';\nimport { declaredTabPaths } from '../../../workspace/declaration/declared-content';\nimport { claimFor } from '../../../workspace/workspace-claims';\n\nexport const PANE_TREES_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\nexport function parseDocks(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 originsIn(raw: string | undefined): ReadonlyMap<string, string> {\n  const origins = new Map<string, string>();\n  if (!raw) {\n    return origins;\n  }\n  try {\n    for (const saved of JSON.parse(raw) as readonly unknown[]) {\n      const entry = saved as { id?: unknown; origin?: unknown };\n      if (typeof entry.id === 'string' && typeof entry.origin === 'string') {\n        origins.set(entry.id, entry.origin);\n      }\n    }\n  } catch {\n    return origins;\n  }\n  return origins;\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 workingStateStore = inject(WORKING_STATE_STORE);\n  private readonly settingsStore = inject(SETTINGS_STORE);\n  private readonly workspace = inject(ActiveWorkspaceService);\n\n  private readonly catalog = inject(WorkspaceCatalog);\n\n  private readonly popout = inject(PopoutWindow).active;\n\n  private relabelled = false;\n\n  private readonly hydratedFlag = signal(false);\n  readonly hydrated = this.hydratedFlag.asReadonly();\n\n  private resolveSettled: (() => void) | undefined;\n  readonly arrangementSettled = new Promise<void>((resolve) => {\n    this.resolveSettled = resolve;\n  });\n\n  peek(): Record<string, DockEntry> {\n    return this.reconciledWithWorkspace(\n      parseDocks(this.workingStateStore.peek?.(this.key())),\n    );\n  }\n\n  hydrate(\n    apply: (raw: string | undefined) => void,\n    onHydrated: (relabelled: boolean) => void,\n  ): void {\n    const hydrated = () => {\n      this.hydratedFlag.set(true);\n      onHydrated(this.takeRelabelled());\n      this.resolveSettled?.();\n    };\n    if (this.workingStateStore.peek) {\n      hydrated();\n      return;\n    }\n    void this.workspace.ready.then(() =>\n      hydrateAsync(this.workingStateStore, this.key(), apply, (loaded) => {\n        if (loaded) {\n          hydrated();\n          return;\n        }\n        this.retryOnce(apply, hydrated);\n      }),\n    );\n  }\n\n  save(docks: Record<string, DockEntry>): void {\n    if (this.popout) {\n      return;\n    }\n    void this.workingStateStore.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 this.reconciledWithWorkspace(parseDocks(raw));\n  }\n\n  private takeRelabelled(): boolean {\n    const relabelled = this.relabelled;\n    this.relabelled = false;\n    return relabelled;\n  }\n\n  private reconciledWithWorkspace(\n    docks: Record<string, DockEntry>,\n  ): Record<string, DockEntry> {\n    const here = this.declaredHome();\n    const home = this.catalog.definitionOf(here);\n    if (home === undefined) {\n      return docks;\n    }\n    const claims = this.catalog.activeClaims();\n    const ownTabs = declaredTabPaths(home);\n    const isDeclared = (path: string) =>\n      ownTabs.some((own) => isAtOrBelow(own, path));\n    const out: Record<string, DockEntry> = {};\n    const contested: string[] = [];\n    const stripped: string[] = [];\n    for (const [dock, entry] of Object.entries(docks)) {\n      contested.push(\n        ...tabPathsWhere(\n          entry.node,\n          (path) => (claimFor(claims, path)?.workspaceId ?? here) !== here,\n        ),\n      );\n      const relabelled = withoutBorrowedLabels(\n        entry.node,\n        (tab) =>\n          tab.title !== undefined &&\n          tab.literalTitle !== true &&\n          isDeclared(tab.path),\n      );\n      stripped.push(...relabelled.stripped);\n      const kept = { ...entry, node: relabelled.node };\n      if (!isDefault(kept)) {\n        out[dock] = kept;\n      }\n    }\n    this.relabelled ||= stripped.length > 0;\n    if (isDevMode() && (contested.length > 0 || stripped.length > 0)) {\n      this.reportFindings(contested, stripped);\n    }\n    return out;\n  }\n\n  private reportFindings(\n    contested: readonly string[],\n    stripped: readonly string[],\n  ): void {\n    const quoted = (paths: readonly string[]) =>\n      paths.map((path) => `\"${path}\"`).join(', ');\n    const notes: string[] = [];\n    if (contested.length > 0) {\n      notes.push(\n        `stored content at ${quoted(contested)} is claimed by another workspace — ` +\n          `it is restored here as it was stored, and the address is contested`,\n      );\n    }\n    if (stripped.length > 0) {\n      notes.push(\n        `stored labels on ${quoted(stripped)} were worked out rather than ` +\n          `carried — they are dropped so the tab is labelled from its own content`,\n      );\n    }\n    console.warn(`Workspace \"${this.workspace.id()}\": ${notes.join('; ')}.`);\n  }\n\n  private declaredHome(): string {\n    const active = this.workspace.id();\n    return (\n      originsIn(this.settingsStore.peek?.(WORKSPACES_KEY)).get(active) ?? active\n    );\n  }\n\n  private key(): string {\n    return this.workspace.scopedKey(PANE_TREES_KEY);\n  }\n\n  private retryOnce(\n    apply: (raw: string | undefined) => void,\n    hydrated: () => void,\n  ): void {\n    setTimeout(() => {\n      void this.workingStateStore\n        .get(this.key())\n        .then((raw) => {\n          apply(raw);\n          hydrated();\n        })\n        .catch(() => hydrated());\n    }, HYDRATION_RETRY_MS);\n  }\n}\n","import {\n  isDisposableLeaf,\n  leafWith,\n  PaneNode,\n  PaneTab,\n  tabWithout,\n} 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 !== -1) {\n      const tabs = leaf.tabs.map((existing, position) =>\n        position === 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 function replacePreviewTab(\n  node: PaneNode,\n  paneId: string,\n  tab: PaneTab,\n): PaneNode {\n  return transformLeaf(node, paneId, (leaf) => ({\n    ...leaf,\n    tabs: leaf.tabs.map((held) => (held.preview === true ? tab : held)),\n    active: tab.path,\n  }));\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 === -1 || 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 === -1) {\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 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 (isDisposableLeaf({ ...leaf, tabs }, [primaryId])) {\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\nexport function sparedByBulkClose(tab: PaneTab): boolean {\n  return tab.pinned === true || tab.closable === false;\n}\n\nexport function reorderedTabs(\n  tabs: readonly PaneTab[],\n  order: readonly string[],\n): PaneTab[] {\n  const rank = new Map(order.map((path, index) => [path, index]));\n  return tabs.toSorted(\n    (a, b) =>\n      (rank.get(a.path) ?? tabs.indexOf(a)) -\n      (rank.get(b.path) ?? tabs.indexOf(b)),\n  );\n}\n\nexport function seededTabs(\n  existing: readonly PaneTab[],\n  paths: readonly string[],\n  order: readonly string[],\n): PaneTab[] {\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((tab) => (rank.get(tab.path) ?? -1) > target);\n    tabs.splice(before === -1 ? tabs.length : before, 0, { path });\n  }\n  return tabs;\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { RetainedViewStash } from '../retention/retained-view-stash';\nimport {\n  CONTENT_DOCK,\n  isViewPanePath,\n  PaneRef,\n  PRIMARY_PANE,\n  viewPanePath,\n} from './pane-address';\nimport {\n  PRIMARY_LEAF,\n  PaneNode,\n  PaneTab,\n  activeTab,\n  isDisposableLeaf,\n  leafPath,\n} from './pane-node';\nimport {\n  collectLeafIds,\n  findLeaf,\n  landingLeaf,\n  leavesOf,\n  tabHolderOf,\n} from './pane-queries';\nimport {\n  TabKeep,\n  closedWithHandover,\n  collapsedWithHandover,\n  keepsNothing,\n  unsplitWithHandover,\n} from './pane-handover';\nimport { clampRatio, withRatio } from './pane-ratio';\nimport { DockEntry, healedPrimary } from './stored-pane-tree';\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  reorderedTabs,\n  seededTabs,\n  setActiveTab,\n  setTabs,\n  unpinTab,\n} from './pane-tabs';\nimport { isContainerDock } from '../container/container-children';\nimport { isKeyOfDock, isKeyOfPane } from '../retention/retention-keys';\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  readonly hydrated = this.storage.hydrated;\n  readonly arrangementSettled = this.storage.arrangementSettled;\n\n  constructor() {\n    this.storage.hydrate(\n      (raw) => this.applyHydratedTrees(raw),\n      (relabelled) => {\n        if (relabelled) {\n          this.persist();\n        }\n      },\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  carriesAddress(pane: PaneRef): boolean {\n    return (\n      pane.dock === CONTENT_DOCK && pane.paneId === this.primaryId(CONTENT_DOCK)\n    );\n  }\n\n  isSplit(dock: string): boolean {\n    return this.tree(dock).kind === 'split';\n  }\n\n  unsplit(dock: string, keeps: TabKeep = keepsNothing): void {\n    this.commit(\n      dock,\n      unsplitWithHandover(this.tree(dock), this.primaryId(dock), keeps) ??\n        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 last = leavesOf(this.tree(dock)).at(-1);\n    if (last) {\n      this.splitPane(dock, last.id, 'column', viewPanePath(viewId));\n    }\n  }\n\n  closePane(dock: string, paneId: string, keeps: TabKeep = keepsNothing): void {\n    if (paneId === this.primaryId(dock)) {\n      return;\n    }\n    this.commit(\n      dock,\n      closedWithHandover(this.tree(dock), paneId, keeps) ?? PRIMARY_LEAF,\n    );\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    this.commit(\n      dock,\n      setTabs(this.tree(dock), paneId, reorderedTabs(leaf.tabs, order)),\n    );\n  }\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): PaneRef | 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    this.commit(\n      dock,\n      setTabs(tree, primary, seededTabs(existing, paths, order)),\n    );\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?.tabs.every((tab) => tab.path !== tabPath)) {\n      return;\n    }\n    const emptied = leaf && {\n      ...leaf,\n      tabs: leaf.tabs.filter((tab) => tab.path !== tabPath),\n    };\n    if (emptied && isDisposableLeaf(emptied, [])) {\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, keeps: TabKeep = keepsNothing): string | null {\n    const collapsed = collapsedWithHandover(\n      this.tree(dock),\n      this.primaryId(dock),\n      keeps,\n    );\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 = findLeaf(this.tree(dock), paneId);\n    const path = leaf ? leafPath(leaf) : undefined;\n    const primary = this.primaryId(dock);\n    if (\n      paneId === primary ||\n      path === undefined ||\n      path === '' ||\n      isViewPanePath(path)\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.hasDock(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((key) => isKeyOfDock(key, 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 landingLeaf(this.tree(dock))?.id ?? this.primaryId(dock);\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) && !Object.hasOwn(persisted, dock)) {\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((key) => isKeyOfPane(key, dock, id));\n      }\n    }\n  }\n\n  private persist(): void {\n    if (!this.hydrated()) {\n      return;\n    }\n    this.storage.save(this.docks());\n  }\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { hydrateAsync, readStoredValue } from '../../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../../persistence/cross-tab/state-sync.service';\nimport { parseStored } from '../../persistence/stored-values/parse-stored';\nimport { recordOf } from '../../persistence/stored-values/persisted-record';\n\nconst STORAGE_KEY = 'lw.shell.item-order';\n\nfunction isIdList(value: unknown): value is readonly string[] {\n  return Array.isArray(value) && value.every((id) => typeof id === 'string');\n}\n\nfunction parseOrders(\n  raw: string | undefined,\n): Record<string, readonly string[]> {\n  return recordOf(parseStored(raw), isIdList);\n}\n\n@Service()\nexport class UserOrderService {\n  private readonly store = inject(WORKING_STATE_STORE);\n  private readonly sync = inject(StateSyncService);\n  private readonly orders = signal<Record<string, readonly string[]>>(\n    parseOrders(this.store.peek?.(STORAGE_KEY)),\n  );\n\n  constructor() {\n    const apply = (raw: string | undefined) =>\n      this.orders.set(parseOrders(raw));\n    hydrateAsync(this.store, STORAGE_KEY, apply);\n    this.sync.onNamespaceAdopted(async () =>\n      apply(await readStoredValue(this.store, STORAGE_KEY)),\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((item) => ranked(item))\n      .toSorted((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 { inject, Service } from '@angular/core';\nimport { View } from '../../views/view';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { UserOrderService } from '../reorder/user-order.service';\n\nfunction panelViewsContainerId(regionId: string): string {\n  return `panel-views:${regionId}`;\n}\n\n@Service()\nexport class PanelViewsService {\n  private readonly registry = inject(ContributionRegistry);\n  private readonly order = inject(UserOrderService);\n\n  viewsInRegion(regionId: string): View[] {\n    const declared = this.registry\n      .views()\n      .filter((view) => view.region === regionId)\n      .toSorted((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","import { SettingCodec } from './persisted-setting';\nimport { parseStored } from './parse-stored';\n\nexport 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  const parsed = parseStored(raw);\n  return Array.isArray(parsed)\n    ? new Set(\n        parsed.filter((entry): entry is string => typeof entry === 'string'),\n      )\n    : new Set();\n}\n\nexport const ID_SET_CODEC: SettingCodec<ReadonlySet<string>> = {\n  parse: parseIdSet,\n  serialize: (set) => JSON.stringify([...set]),\n};\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { hydrateAsync } from '../../persistence/stored-values/hydrate';\nimport { parseIdSet } from '../../persistence/stored-values/persisted-id-set';\nimport { ActiveWorkspaceService } from '../../workspace/active-workspace.service';\n\nexport const HIDDEN_VIEWS_KEY = 'lw.shell.hidden-views';\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    parseIdSet(this.store.peek?.(this.workspace.scopedKey(HIDDEN_VIEWS_KEY))),\n  );\n  readonly hidden = this.ids.asReadonly();\n\n  constructor() {\n    this.hydrateWhenWorkspaceReady();\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(parseIdSet(raw));\n    void this.store.set(this.storageKey(), this.serialize());\n  }\n\n  serialize(): string {\n    return JSON.stringify(\n      [...this.ids()].toSorted((a, b) => a.localeCompare(b)),\n    );\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(HIDDEN_VIEWS_KEY);\n  }\n\n  private hydrateWhenWorkspaceReady(): void {\n    void this.workspace.ready.then(() =>\n      hydrateAsync(this.store, this.storageKey(), (raw) =>\n        this.ids.set(parseIdSet(raw)),\n      ),\n    );\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport {\n  isViewPanePath,\n  VIEW_PANE_PREFIX,\n  viewForPanePath,\n  viewIdOfPanePath,\n  viewPanePath,\n} 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 '../../contributions/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) => viewPanePath(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    const viewId = viewIdOfPanePath(tab.path);\n    return viewId !== null && this.hiddenViews.isHidden(viewId);\n  }\n\n  private displayable(tab: PaneTab): boolean {\n    if (!isViewPanePath(tab.path)) {\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 { MenuContext, TabBadge } from '@loomweaver/plugin-sdk';\nimport { CONTENT_DOCK, viewIdOfPanePath } from '../tree/pane-address';\n\nexport const VIEW_CONTEXT_MENU = 'panel/view/context';\n\nexport function tabIdIn(stripId: string, path: string): string {\n  return `${stripId}:tab:${path}`;\n}\n\nexport function panelIdIn(stripId: string): string {\n  return `${stripId}:panel`;\n}\n\nexport interface StripTab {\n  readonly path: string;\n  readonly title: string;\n  readonly literalTitle: boolean;\n  readonly icon?: string;\n  readonly badge?: TabBadge;\n  readonly navPath?: string;\n  readonly closable: boolean;\n  readonly movable: boolean;\n  readonly preview: boolean;\n  readonly pinned: boolean;\n  readonly instance?: string;\n}\n\nexport type TabAcceptance = boolean | ((path: string) => boolean);\n\nexport interface TabMenuPlace {\n  readonly group: string;\n  readonly paneId: string;\n  readonly primary: boolean;\n  readonly sole: boolean;\n}\n\nexport function tabMenuContext(\n  tab: StripTab,\n  place: TabMenuPlace,\n): MenuContext {\n  const viewId = viewIdOfPanePath(tab.path);\n  if (viewId !== null) {\n    return {\n      targetKind: 'view-tab',\n      viewId,\n      region: place.group,\n      inContent: place.group === CONTENT_DOCK,\n      sole: place.sole,\n      ...(tab.instance && { instance: tab.instance }),\n    };\n  }\n  return {\n    targetKind: 'content-tab',\n    tabId: tab.path,\n    group: place.group,\n    paneId: place.paneId,\n    primary: place.primary,\n    pinned: tab.pinned,\n    closable: tab.closable,\n    sole: place.sole,\n  };\n}\n","import { ContentRoute, View } from '@loomweaver/plugin-sdk';\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 { isViewPanePath, 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 (isViewPanePath(path)) {\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 { viewIdOfPanePath } from '../tree/pane-address';\nimport { PaneTab } from '../tree/pane-node';\nimport { surfaceForPanePath } from '../pane-surface';\nimport type { StripTab } from './strip-tab';\nimport { isHomePath } from '../../content/content-path';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { TabBadge } from '@loomweaver/plugin-sdk';\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 surfaceBadge(\n  registry: ContributionRegistry,\n  path: string,\n): TabBadge | undefined {\n  return registry.badgeOf(\n    surfaceForPanePath(registry.contentRoutes(), registry.views(), path)?.id,\n  );\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    badge: tab.badge ?? surfaceBadge(registry, tab.path),\n    closable: tab.closable !== false && surfaceClosable(registry, tab.path),\n    movable: true,\n    preview: tab.preview ?? false,\n    pinned: tab.pinned ?? false,\n    instance: tab.instance,\n  };\n}\n","import { ContainerSpec, ContentRoute, View } from '@loomweaver/plugin-sdk';\nimport {\n  containerChildren,\n  isAddressable,\n} from '../pane/container/container-children';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { MenuListEntry } from '../../menu/menu.service';\nimport { viewPanePath } from '../pane/tree/pane-address';\nimport { resolveTitle } from '../pane/chrome/tab-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: viewPanePath(view.id),\n    title: view.title,\n    icon: view.icon,\n  };\n}\n\nexport function canHostInPane(\n  registry: ContributionRegistry,\n  auth: AuthContext,\n  path: string,\n): boolean {\n  const route = paneHostableRoute(registry, path);\n  return route !== null && auth.meets(route.access);\n}\n\nexport function navigablePaneTargets(\n  registry: ContributionRegistry,\n  auth: AuthContext,\n): PaneTarget[] {\n  return registry\n    .contentRoutes()\n    .filter(\n      (route) =>\n        paneHostableRoute(registry, route.path) !== null &&\n        auth.meets(route.access),\n    )\n    .map((route) => routeTarget(route));\n}\n\nexport function hostablePaneTargets(\n  registry: ContributionRegistry,\n  auth: AuthContext,\n): PaneTarget[] {\n  const views = registry\n    .views()\n    .filter((view) => auth.meets(view.access))\n    .map((view) => viewTarget(view));\n  return [...navigablePaneTargets(registry, auth), ...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((view) => viewTarget(view));\n}\n\nexport function paneTargetEntries(\n  targets: readonly PaneTarget[],\n): MenuListEntry[] {\n  return targets.map((target) => ({\n    key: target.path,\n    label: (translate) => paneTargetLabel(target, translate),\n    icon: target.icon,\n  }));\n}\n\nfunction paneHostableRoute(\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 { inject, Service } from '@angular/core';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { isViewPanePath } from '../pane/tree/pane-address';\nimport { surfaceForPanePath } from '../pane/pane-surface';\nimport { canHostInPane } from './pane-targets';\nimport { matchRoute } from './content-path';\n\n@Service()\nexport class PaneAdmission {\n  private readonly registry = inject(ContributionRegistry);\n  private readonly auth = inject(AuthContext);\n\n  canOfferAsPaneTarget(path: string): boolean {\n    if (isViewPanePath(path)) {\n      return this.viewAllowed(path);\n    }\n    return canHostInPane(this.registry, this.auth, path);\n  }\n\n  canDuplicate(path: string): boolean {\n    if (isViewPanePath(path)) {\n      return this.viewAllowed(path);\n    }\n    const route = matchRoute(this.registry.contentRoutes(), path);\n    return route !== undefined && this.auth.meets(route.access);\n  }\n\n  routerBound(path: string): boolean {\n    return !isViewPanePath(path) && !this.canOfferAsPaneTarget(path);\n  }\n\n  private viewAllowed(path: string): boolean {\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}\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 { Component } from '@angular/core';\n\n@Component({\n  selector: 'lw-content-sub',\n  template: '',\n})\nexport class ContentSubStub {}\n","export function popoutNavigationRefusal(path: string): string {\n  return (\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","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, isDevMode } from '@angular/core';\nimport type { CanActivateFn } from '@angular/router';\nimport { isPopoutUrl } from '../../../popout/popout-path';\nimport { popoutNavigationRefusal } from '../../../popout/popout-refusal';\nimport { normalizePath } from '../content-path';\nimport { BootAddress } from './boot-address';\n\nexport const keepPopout: CanActivateFn = (_route, state) => {\n  if (!isPopoutUrl(inject(BootAddress).path)) {\n    return true;\n  }\n  if (isDevMode()) {\n    console.warn(popoutNavigationRefusal(normalizePath(state.url)));\n  }\n  return false;\n};\n","import { InjectionToken } from '@angular/core';\n\nexport interface WorkspaceSettlement {\n  wouldSettle(path: string): boolean;\n  settle(path: string): Promise<void>;\n  withhold(path: string): void;\n}\n\nconst NOT_COMPOSED: WorkspaceSettlement = {\n  wouldSettle: () => false,\n  settle: async () => undefined,\n  withhold: () => undefined,\n};\n\nexport const WORKSPACE_SETTLEMENT = new InjectionToken<WorkspaceSettlement>(\n  'lw.workspace-settlement',\n  { providedIn: 'root', factory: () => NOT_COMPOSED },\n);\n","import { inject } from '@angular/core';\nimport type { CanActivateFn } from '@angular/router';\nimport { WORKSPACE_SETTLEMENT } from './workspace-settlement';\nimport { isPopoutUrl } from '../../../popout/popout-path';\nimport { normalizePath } from '../content-path';\nimport { BootAddress } from './boot-address';\n\nexport const settleWorkspace: CanActivateFn = async (_route, state) => {\n  const settlement = inject(WORKSPACE_SETTLEMENT);\n  await settlement.settle(normalizePath(state.url));\n  return true;\n};\n\nexport const withholdSettlement: CanActivateFn = (_route, state) => {\n  if (!isPopoutUrl(inject(BootAddress).path)) {\n    inject(WORKSPACE_SETTLEMENT).withhold(normalizePath(state.url));\n  }\n  return true;\n};\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 { ActivatedRouteSnapshot, Route, Routes } from '@angular/router';\nimport { ContentRoute } from '@loomweaver/plugin-sdk';\nimport { RegisteredContentRoute } from '../../../contributions/contribution-registry';\nimport { containerChildren } from '../../pane/container/container-children';\nimport { accessCanMatch } from '../access/content-access';\nimport { ContentSubStub } from './content-sub-stub';\nimport { keepPopout } from './keep-popout.guard';\nimport { settleWorkspace, withholdSettlement } from './settle-workspace.guard';\nimport { SurfaceRouteStub } from './surface-route-stub';\n\nconst CONTENT_DATA = { content: true };\n\nexport function isContentRoute(route: ActivatedRouteSnapshot): boolean {\n  return route.routeConfig?.data?.['content'] === true;\n}\n\nexport function routePlaceholder(path: string): Route {\n  return {\n    path,\n    component: SurfaceRouteStub,\n    canActivate: [keepPopout, settleWorkspace],\n    data: CONTENT_DATA,\n  };\n}\n\nexport function buildContentRoutes(\n  contentRoutes: readonly RegisteredContentRoute[],\n  omitted: readonly ContentRoute[] = [],\n): Routes {\n  return [\n    ...buildRegisteredRoutes(contentRoutes),\n    ...omitted.map((route) => routePlaceholder(route.path)),\n  ];\n}\n\nfunction buildRegisteredRoutes(\n  contentRoutes: readonly RegisteredContentRoute[],\n): Routes {\n  return contentRoutes.flatMap((route) => {\n    const angular: Route = {\n      path: route.path,\n      component: SurfaceRouteStub,\n      canActivate: [keepPopout, settleWorkspace],\n      data: CONTENT_DATA,\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: SurfaceRouteStub,\n        canActivate: [keepPopout, withholdSettlement],\n        data: CONTENT_DATA,\n        ...(children.length && { children }),\n      };\n      return [angular, placeholder];\n    }\n    return [angular];\n  });\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 subStub(path: string, pathMatch?: 'full'): Route {\n  return {\n    path,\n    ...(pathMatch && { pathMatch }),\n    component: ContentSubStub,\n    data: CONTENT_DATA,\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","import { Service, Signal, computed, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router } from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport { normalizePath } from './content-path';\nimport { isContentRoute } from './routing/content-route-table';\n\nexport interface AddressParts {\n  readonly path: string;\n  readonly queryParams: Params;\n  readonly fragment: string | null;\n}\n\n@Service()\nexport class CurrentAddress {\n  private readonly router = inject(Router);\n\n  readonly url: Signal<string> = 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 showsContent: Signal<boolean> = computed(() => {\n    this.url();\n    const shown = this.router.routerState.snapshot.root.firstChild;\n    return shown === null || isContentRoute(shown);\n  });\n\n  readonly snapshot: Signal<AddressParts> = computed(() => {\n    const url = this.url();\n    const tree = this.router.parseUrl(url);\n    return {\n      path: normalizePath(url),\n      queryParams: tree.queryParams,\n      fragment: tree.fragment,\n    };\n  });\n}\n","import {\n  AccessRequirement,\n  ContentRoute,\n  TabBadge,\n} from '@loomweaver/plugin-sdk';\nimport { View } from '../../../views/view';\nimport { PaneTab } from '../../pane/tree/pane-node';\nimport { viewIdOfPanePath } from '../../pane/tree/pane-address';\nimport { overlayTabTitle } from '../../pane/chrome/tab-label';\nimport {\n  isHomePath,\n  matchRoute,\n  normalizePath,\n  segmentsOf,\n  tabRootOf,\n} from '../content-path';\n\nconst DYNAMIC_TAB_ORDER_BASE = 1000;\nconst VIEW_TAB_ORDER_BASE = 2000;\n\nexport interface NavigationOptions {\n  readonly replace?: boolean;\n}\n\nexport interface OpenTab {\n  readonly path: string;\n  readonly title: string;\n  readonly icon?: string;\n  readonly badge?: TabBadge;\n  readonly literalTitle: boolean;\n  readonly ownLabel: 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. */\n  readonly literalTitle: boolean;\n  readonly icon?: string;\n  readonly badge?: TabBadge;\n  readonly order: number;\n  /** Dynamic tabs show a close affordance; static (registered) tabs do not. */\n  readonly closable: boolean;\n  /**\n   * Whether the pane really holds this tab, so that moving and reordering it can take effect. A\n   * facet tab is projected from the address rather than held, and has nothing to move.\n   */\n  readonly movable: 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}\n\nexport function declaringRoute(\n  routes: readonly ContentRoute[],\n  path: string,\n): ContentRoute | undefined {\n  const route = matchRoute(routes, path);\n  if (route === undefined) {\n    return undefined;\n  }\n  return segmentsOf(route.path).length === 0 && segmentsOf(path).length > 0\n    ? undefined\n    : route;\n}\n\nexport interface RouteTitle {\n  readonly title: string;\n  readonly literalTitle: boolean;\n}\n\nexport function routeTitle(\n  route: ContentRoute | undefined,\n  fallback: string,\n): RouteTitle {\n  return route?.title === undefined\n    ? { title: fallback, literalTitle: true }\n    : { title: route.title, literalTitle: route.titleIsLiteral ?? false };\n}\n\nexport function opensATab(\n  route: ContentRoute | undefined,\n  root: string,\n): route is ContentRoute {\n  return (\n    route !== undefined &&\n    route.chromeless !== true &&\n    route.follows !== true &&\n    root !== ''\n  );\n}\n\nexport function isStrippable(\n  routes: readonly ContentRoute[],\n  tab: OpenTab,\n): 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\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, position) =>\n        position === index ? { ...tab, path } : tab,\n      );\n}\n\nexport function autoOpenedTab(\n  route: ContentRoute | undefined,\n  root: string,\n  path: string,\n): OpenTab | null {\n  if (!opensATab(route, root)) {\n    return null;\n  }\n  return {\n    path,\n    ...defaultTabTitle(route, root),\n    icon: route.icon,\n    ownLabel: false,\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 route = declaringRoute(routes, tab.path);\n  const root =\n    route === undefined ? normalizePath(tab.path) : tabRootOf(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    badge: tab.badge,\n    ownLabel: tab.title !== undefined,\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    ...(tab.ownLabel && { title: tab.title }),\n    ...(tab.ownLabel && tab.literalTitle && { literalTitle: true }),\n    ...(tab.ownLabel && tab.icon !== undefined && { icon: tab.icon }),\n    ...(tab.badge !== undefined && { badge: tab.badge }),\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    .toSorted(\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      ...routeTitle(route, route.path),\n      icon: route.icon,\n      order: index,\n      closable: false,\n      movable: 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    badge: tab.badge,\n    order: DYNAMIC_TAB_ORDER_BASE + index,\n    closable: tab.closable,\n    movable: true,\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): ContentTabView[] {\n  return paneTabs\n    .flatMap((tab) => {\n      const viewId = viewIdOfPanePath(tab.path);\n      return viewId === null ? [] : [{ tab, viewId }];\n    })\n    .flatMap(({ tab, viewId }, index) => {\n      const view = viewOf(viewId);\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          movable: true,\n          preview: false,\n          pinned: false,\n        },\n      ];\n    });\n}\n\nfunction defaultTabTitle(\n  route: ContentRoute | undefined,\n  root: string,\n): RouteTitle {\n  return routeTitle(route, root.split('/').pop() ?? root);\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 { AccessRequirement, ContentRoute } from '@loomweaver/plugin-sdk';\nimport { PaneNode } from '../../pane/tree/pane-node';\nimport { collectTabs } from '../../pane/tree/pane-queries';\nimport { isViewPanePath } from '../../pane/tree/pane-address';\nimport { normalizePath, tabRootOf } from '../content-path';\nimport { routeTitle, toOpenTab } from './content-tab-projection';\n\n/**\n * A navigable content target the command palette's Quick-Open mode lists:\n * a registered surface reachable by plain navigation (a parameterless, non-chromeless route), or a\n * currently **open** tab — across every workspace pane. `lastActive` is a session-only epoch stamp of\n * when the target was last the active tab — it is not persisted (a fresh window starts with no\n * times), and it floats recently visited targets up.\n */\nexport interface QuickOpenTarget {\n  /** The tab root — stable identity and the `tabId` for the tab context menu. */\n  readonly path: string;\n  /** The full path to navigate to (open: root + remembered sub-route; else the route path). */\n  readonly navPath: string;\n  readonly title: string;\n  readonly literalTitle: boolean;\n  readonly icon?: string;\n  readonly pinned: boolean;\n  /** A target that is not an open tab is not closable — the context menu hides Close/Split/Pin. */\n  readonly closable: boolean;\n  readonly lastActive?: number;\n}\n\nexport function quickOpenTargetsOf(\n  tree: PaneNode,\n  routes: readonly ContentRoute[],\n  lastActive: ReadonlyMap<string, number>,\n  meets: (access: AccessRequirement | undefined) => boolean,\n): QuickOpenTarget[] {\n  const openRoots = new Set<string>();\n  const open: QuickOpenTarget[] = [];\n  for (const paneTab of collectTabs(tree)) {\n    if (isViewPanePath(paneTab.path)) {\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: lastActive.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      !meets(route.access) ||\n      openRoots.has(path)\n    ) {\n      return [];\n    }\n    return [\n      {\n        path,\n        navPath: route.path,\n        ...routeTitle(route, path),\n        icon: route.icon,\n        pinned: false,\n        closable: false,\n        lastActive: lastActive.get(path),\n      },\n    ];\n  });\n  return [...open, ...statics];\n}\n","import {\n  EnvironmentProviders,\n  InjectionToken,\n  makeEnvironmentProviders,\n} from '@angular/core';\nimport { ContentRoute } from '@loomweaver/plugin-sdk';\nimport { matchRoute, 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. `customers/:customerId/orders/:orderId/notes`. */\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 interface FollowingContext {\n  readonly routes: readonly ContentRoute[];\n  readonly params: Readonly<Record<string, string>>;\n  readonly activePath: string;\n  readonly resolver: TabAddressResolver | null;\n}\n\nexport function followingTabAddress(\n  route: ContentRoute,\n  context: FollowingContext,\n): string | null {\n  const resolved = context.resolver?.({\n    surfaceId: route.id,\n    pattern: route.path,\n    params: context.params,\n    activePath: context.activePath,\n  });\n  if (resolved) {\n    return resolved;\n  }\n  const computed = computedTabAddress(route.path, context.params);\n  return leadsSomewhere(context.routes, computed) ? computed : null;\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  for (const [index, segment] of segments.entries()) {\n    if (segment.startsWith(':')) {\n      prefixes.set(segment.slice(1), segments.slice(0, index).join('/'));\n    }\n  }\n  return prefixes;\n}\n\nfunction leadsSomewhere(\n  routes: readonly ContentRoute[],\n  address: string,\n): boolean {\n  const owner = matchRoute(routes, address);\n  return (\n    owner !== undefined &&\n    (owner.rest === true ||\n      segmentsOf(owner.path).length === segmentsOf(address).length)\n  );\n}\n","import { computed, inject, Service, signal, Signal } from '@angular/core';\nimport { ActiveContent, ContentRoute } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { AuthContext } from '../../../auth/auth-context';\nimport {\n  matchRoute,\n  normalizePath,\n  routeParams,\n  tabRootOf,\n} from '../content-path';\nimport { CurrentAddress } from '../current-address';\nimport {\n  ContentTabView,\n  OpenTab,\n  dynamicTabViews,\n  facetTabViews,\n  isStrippable,\n  toOpenTab,\n  toPaneTab,\n  viewTabViews,\n} from './content-tab-projection';\nimport { TabCloseHooks } from './tab-close-hooks';\nimport { QuickOpenTarget, quickOpenTargetsOf } from './quick-open-target';\nimport { TAB_ADDRESS_RESOLVER, followingTabAddress } from './tab-address';\nimport { CONTENT_DOCK, isViewPanePath } from '../../pane/tree/pane-address';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { reseatPinned } from '../../pane/tree/pane-tabs';\nimport { surfaceBadge } from '../../pane/chrome/tab-label';\n\nexport interface RootedPath {\n  readonly routes: readonly ContentRoute[];\n  readonly root: string;\n}\n\n@Service()\nexport class ContentTabState {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly auth = inject(AuthContext);\n\n  private readonly paneTree = inject(PaneTreeService);\n\n  private readonly address = inject(CurrentAddress);\n\n  private readonly tabAddress = inject(TAB_ADDRESS_RESOLVER, {\n    optional: true,\n  });\n\n  private readonly closeHooks = inject(TabCloseHooks);\n\n  private readonly lastActive = signal<ReadonlyMap<string, number>>(new Map());\n\n  private readonly viewTabSelection = signal<string | null>(null);\n\n  readonly openTabs = computed<readonly OpenTab[]>(() => {\n    const routes = this.registry.contentRoutes();\n    return this.paneTree\n      .primaryTabs(CONTENT_DOCK)\n      .filter((tab) => !isViewPanePath(tab.path))\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    quickOpenTargetsOf(\n      this.paneTree.tree(CONTENT_DOCK),\n      this.registry.contentRoutes(),\n      this.lastActive(),\n      (access) => this.auth.meets(access),\n    ),\n  );\n\n  readonly activeViewPath: Signal<string | null> = computed(() => {\n    const path = this.viewTabSelection();\n    return path !== null && this.holdsInAddressPane(path) ? path : null;\n  });\n\n  readonly activeViewInstance: Signal<string | undefined> = computed(() => {\n    const path = this.activeViewPath();\n    if (path === null) {\n      return;\n    }\n    return this.paneTree\n      .primaryTabs(CONTENT_DOCK)\n      .find((tab) => tab.path === path)?.instance;\n  });\n\n  readonly activePath: Signal<string> = computed(() =>\n    normalizePath(this.address.url()),\n  );\n\n  readonly activeRoute: Signal<ContentRoute | undefined> = 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  readonly showStrip: Signal<boolean> = computed(\n    () => this.activeRoute()?.chromeless !== true && 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) =>\n      this.followingAddress(routes, route),\n    );\n    const open = this.openTabs().filter((tab) => isStrippable(routes, tab));\n    const dynamics = dynamicTabViews(routes, open);\n    return [...facets, ...dynamics, ...this.viewTabs()]\n      .map((tab) => ({\n        ...tab,\n        badge: tab.badge ?? surfaceBadge(this.registry, tab.path),\n      }))\n      .toSorted((a, b) => a.order - b.order);\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    ),\n  );\n\n  activateViewTab(path: string): void {\n    if (this.holdsInAddressPane(path)) {\n      this.viewTabSelection.set(path);\n    }\n  }\n\n  clearViewTabSelection(): void {\n    this.viewTabSelection.set(null);\n  }\n\n  markActive(root: string): void {\n    const next = new Map(this.lastActive());\n    next.set(root, Date.now());\n    this.lastActive.set(next);\n  }\n\n  updateOpen(change: (tabs: readonly OpenTab[]) => readonly OpenTab[]): void {\n    const current = this.openTabs();\n    const next = change(current);\n    if (next === current) {\n      return;\n    }\n    const viewTabs = this.paneTree\n      .primaryTabs(CONTENT_DOCK)\n      .filter((tab) => isViewPanePath(tab.path));\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  reorder(roots: readonly string[]): void {\n    const routes = this.registry.contentRoutes();\n    const rank = new Map(roots.map((root, position) => [root, position]));\n    const seat = (tab: OpenTab, fallback: number) =>\n      rank.get(tabRootOf(routes, tab.path)) ?? fallback;\n    this.updateOpen((tabs) =>\n      tabs\n        .map((tab, position) => ({ tab, position }))\n        .toSorted((a, b) => seat(a.tab, a.position) - seat(b.tab, b.position))\n        .map((entry) => entry.tab),\n    );\n  }\n\n  bringToFront(path: string): void {\n    const { routes, root } = this.rootFor(path);\n    this.updateOpen((tabs) => {\n      const position = tabs.findIndex(\n        (tab) => tabRootOf(routes, tab.path) === root,\n      );\n      return position === -1 || tabs[position].pinned\n        ? tabs\n        : reseatPinned(tabs, position, tabs[position]);\n    });\n  }\n\n  setPinned(path: string, pinned: boolean): void {\n    const { routes, root } = this.rootFor(path);\n    this.updateOpen((tabs) => {\n      const position = tabs.findIndex(\n        (tab) => tabRootOf(routes, tab.path) === root,\n      );\n      if (position === -1 || tabs[position].pinned === pinned) {\n        return tabs;\n      }\n      const updated = pinned\n        ? { ...tabs[position], pinned: true, preview: false }\n        : { ...tabs[position], pinned: false };\n      return reseatPinned(tabs, position, updated);\n    });\n  }\n\n  private holdsInAddressPane(path: string): boolean {\n    return this.paneTree\n      .primaryTabs(CONTENT_DOCK)\n      .some((tab) => tab.path === path);\n  }\n\n  private followingAddress(\n    routes: readonly ContentRoute[],\n    route: ContentRoute,\n  ): string | null {\n    const active = this.activeRoute();\n    const activePath = this.activePath();\n    return followingTabAddress(route, {\n      routes,\n      params: active ? routeParams(active, activePath) : {},\n      activePath,\n      resolver: this.tabAddress,\n    });\n  }\n}\n","import { CONTENT_DOCK, promotedContentPath } from './pane-address';\nimport { leafPath } from './pane-node';\nimport { findLeaf } from './pane-queries';\nimport { PaneTreeService } from './pane-tree.service';\n\nexport function activeContentPath(paneTree: PaneTreeService): string {\n  const primary = findLeaf(\n    paneTree.tree(CONTENT_DOCK),\n    paneTree.primaryId(CONTENT_DOCK),\n  );\n  const path = primary ? leafPath(primary) : undefined;\n  return path ? promotedContentPath(path) : '';\n}\n","import {\n  computed,\n  effect,\n  inject,\n  isDevMode,\n  Service,\n  signal,\n  untracked,\n} from '@angular/core';\nimport { Router } from '@angular/router';\nimport { ContentRoute } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { normalizePath, suffixOf, tabRootOf } from '../content-path';\nimport { CurrentAddress } from '../current-address';\nimport {\n  NavigationOptions,\n  autoOpenedTab,\n  withRefreshedPath,\n} from './content-tab-projection';\nimport { ContentTabState } from './content-tab-state';\nimport { CONTENT_DOCK, isViewPanePath } from '../../pane/tree/pane-address';\nimport { findLeaf, findLeafWhere } from '../../pane/tree/pane-queries';\nimport { activeContentPath } from '../../pane/tree/active-content-path';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { PopoutWindow } from '../../../popout/popout-window';\nimport { popoutNavigationRefusal } from '../../../popout/popout-refusal';\n\ninterface AddressFacts {\n  readonly url: string;\n  readonly path: string;\n  readonly root: string;\n  readonly route: ContentRoute | undefined;\n  readonly restored: boolean;\n}\n\n@Service()\nexport class TabNavigationService {\n  private readonly router = inject(Router);\n\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly paneTree = inject(PaneTreeService);\n\n  private readonly state = inject(ContentTabState);\n\n  private readonly address = inject(CurrentAddress);\n\n  private readonly inPopout = inject(PopoutWindow).active;\n\n  private readonly keptAddress = signal<string | null>(null);\n\n  private readonly navigating = computed(\n    () => this.router.currentNavigation() !== null,\n  );\n\n  private lastUrl = this.router.url;\n\n  private followed: AddressFacts | null = null;\n\n  private ownNavigation: string | null = null;\n\n  constructor() {\n    effect(() => {\n      if (this.navigating()) {\n        return;\n      }\n      const now = this.currentFacts();\n      const kept = this.keptAddress();\n      untracked(() => this.follow(now, kept));\n    });\n  }\n\n  keepAddress(address: string): void {\n    this.keptAddress.set(normalizePath(address));\n  }\n\n  navigate(path: string, options: NavigationOptions = {}): Promise<boolean> {\n    if (this.inPopout) {\n      if (isDevMode()) {\n        console.warn(popoutNavigationRefusal(path));\n      }\n      return Promise.resolve(false);\n    }\n    const target = normalizePath(path);\n    this.revealHolderOf(target, this.state.activeTabRoot());\n    this.ownNavigation = target;\n    this.state.clearViewTabSelection();\n    return this.router.navigateByUrl('/' + target + suffixOf(path), {\n      replaceUrl: options.replace === true,\n    });\n  }\n\n  navigateTo(path: string, options: NavigationOptions = {}): void {\n    this.navigate(path, options).catch((error: unknown) =>\n      console.error('Content navigation failed', error),\n    );\n  }\n\n  private currentFacts(): AddressFacts {\n    return {\n      url: this.address.url(),\n      path: this.state.activePath(),\n      root: this.state.activeTabRoot(),\n      route: this.state.activeRoute(),\n      restored: this.paneTree.hydrated(),\n    };\n  }\n\n  private follow(now: AddressFacts, kept: string | null): void {\n    const keptHere = kept === now.path;\n    if (kept !== null) {\n      this.keptAddress.set(null);\n    }\n    const moved = now.url !== this.lastUrl;\n    if (!moved && !keptHere && this.unchangedSinceFollowed(now)) {\n      return;\n    }\n    const cameFromOutside =\n      moved && this.ownNavigation !== normalizePath(now.url);\n    if (keptHere || cameFromOutside) {\n      this.state.clearViewTabSelection();\n      const shown = keptHere ? activeContentPath(this.paneTree) : this.lastUrl;\n      this.revealHolderOf(now.path, this.state.rootFor(shown).root);\n    }\n    if (moved) {\n      this.lastUrl = now.url;\n      this.ownNavigation = null;\n    }\n    this.followed = now;\n    this.syncActiveTab(now);\n  }\n\n  private unchangedSinceFollowed(now: AddressFacts): boolean {\n    const followed = this.followed;\n    return (\n      followed !== null &&\n      now.restored === followed.restored &&\n      now.route === followed.route &&\n      now.root === followed.root\n    );\n  }\n\n  private revealHolderOf(target: string, previousContent: 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      !isViewPanePath(path) && 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, previousContent);\n  }\n\n  private syncActiveTab({ path, root, route }: AddressFacts): void {\n    const routes = this.registry.contentRoutes();\n    this.state.updateOpen((tabs) => {\n      const position = tabs.findIndex(\n        (tab) => tabRootOf(routes, tab.path) === root,\n      );\n      if (position !== -1) {\n        return withRefreshedPath(tabs, position, path);\n      }\n      const opened = autoOpenedTab(route, root, path);\n      return opened ? [...tabs, opened] : tabs;\n    });\n    const held = this.paneTree\n      .primaryTabs(CONTENT_DOCK)\n      .find((tab) => tabRootOf(routes, tab.path) === root);\n    if (held) {\n      this.paneTree.setActiveTab(\n        CONTENT_DOCK,\n        this.paneTree.primaryId(CONTENT_DOCK),\n        held.path,\n      );\n    }\n    if (root) {\n      this.state.markActive(root);\n    }\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { matchRoute, tabRootOf } from '../content-path';\nimport { OpenTab, toPaneTab } from './content-tab-projection';\nimport { TabCloseHooks } from './tab-close-hooks';\nimport { ContentTabState } from './content-tab-state';\nimport { CONTENT_DOCK } from '../../pane/tree/pane-address';\nimport { PaneLeaf } from '../../pane/tree/pane-node';\nimport { findLeafWhere } from '../../pane/tree/pane-queries';\nimport { replacePreviewTab } from '../../pane/tree/pane-tabs';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\n\n@Service()\nexport class PreviewSlotService {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly state = inject(ContentTabState);\n\n  private readonly closeHooks = inject(TabCloseHooks);\n\n  private readonly paneTree = inject(PaneTreeService);\n\n  fill(root: string, slot: OpenTab): void {\n    const elsewhere = this.state.openTabs().some((tab) => tab.preview)\n      ? null\n      : this.previewPaneElsewhere();\n    if (elsewhere === null) {\n      this.replaceHere(root, slot);\n    } else {\n      this.replaceIn(elsewhere, slot);\n    }\n  }\n\n  private previewPaneElsewhere(): PaneLeaf | null {\n    const primary = this.paneTree.primaryId(CONTENT_DOCK);\n    return findLeafWhere(\n      this.paneTree.tree(CONTENT_DOCK),\n      (leaf) => leaf.id !== primary && leaf.tabs.some((tab) => tab.preview),\n    );\n  }\n\n  private replaceHere(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      return;\n    }\n\n    this.closeHooks.runSafely(previous?.onClose);\n    this.closeHooks.delete(previousRoot);\n  }\n\n  private replaceIn(pane: PaneLeaf, slot: OpenTab): void {\n    const routes = this.registry.contentRoutes();\n    const previous = pane.tabs.find((tab) => tab.preview);\n    const shown = this.shownContent();\n    this.paneTree.commit(\n      CONTENT_DOCK,\n      replacePreviewTab(\n        this.paneTree.tree(CONTENT_DOCK),\n        pane.id,\n        toPaneTab(slot),\n      ),\n    );\n    this.paneTree.focusPane(CONTENT_DOCK, pane.id, shown);\n    if (previous !== undefined) {\n      this.closeHooks.runSafely(\n        this.closeHooks.take(tabRootOf(routes, previous.path)),\n      );\n    }\n  }\n\n  private shownContent(): string {\n    const root = this.state.activeTabRoot();\n    return matchRoute(this.registry.contentRoutes(), root) ? root : '';\n  }\n}\n","import { isDevMode } from '@angular/core';\nimport { ContentTabLabel } from '@loomweaver/plugin-sdk';\nimport { RegisteredContentRoute } from '../../../contributions/surface-normalize';\nimport { CONTENT_DOCK } from '../../pane/tree/pane-address';\nimport { labelledTabs, PaneNode, withLabel } from '../../pane/tree/pane-node';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { matchRoute, normalizePath, tabRootOf } from '../content-path';\n\nexport function relabelled(\n  node: PaneNode,\n  matches: (path: string) => boolean,\n  label: ContentTabLabel,\n): PaneNode | null {\n  return labelledTabs(\n    node,\n    (tab) => matches(tab.path),\n    (tab) => withLabel(tab, label),\n  );\n}\n\nexport function updateTabLabel(\n  paneTree: PaneTreeService,\n  routes: readonly RegisteredContentRoute[],\n  change: { path: string; label: ContentTabLabel; pluginId?: string },\n): void {\n  const root = tabRootOf(routes, normalizePath(change.path));\n  const owner = matchRoute(routes, root)?.pluginId;\n  if (change.pluginId !== undefined && owner !== change.pluginId) {\n    if (owner !== undefined && isDevMode()) {\n      console.warn(\n        `Plugin \"${change.pluginId}\": updateContentTab(\"${change.path}\") changed nothing, because another plugin registered that content.`,\n      );\n    }\n    return;\n  }\n  const next = relabelled(\n    paneTree.tree(CONTENT_DOCK),\n    (tabPath) => tabRootOf(routes, tabPath) === root,\n    change.label,\n  );\n  if (next !== null) {\n    paneTree.commit(CONTENT_DOCK, next);\n  }\n}\n","import { inject, Injector, Service } from '@angular/core';\nimport { OpenTabInput } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { FeatureSwitches } from '../../../features/feature-switches.service';\nimport {\n  WORKSPACE_SETTLEMENT,\n  WorkspaceSettlement,\n} from '../routing/workspace-settlement';\nimport { normalizePath, tabRootOf } from '../content-path';\nimport { OpenTab } from './content-tab-projection';\nimport { ContentTabState } from './content-tab-state';\nimport { TabNavigationService } from './tab-navigation.service';\nimport { PreviewSlotService } from './preview-slot.service';\nimport { TabCloseHooks } from './tab-close-hooks';\nimport { relabelled } from './tab-label-update';\nimport { tabBadgeOf } from '../../../contributions/tab-badge';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\n\n@Service()\nexport class TabOpeningService {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly features = inject(FeatureSwitches).content;\n\n  private readonly state = inject(ContentTabState);\n\n  private readonly navigation = inject(TabNavigationService);\n\n  private readonly previewSlot = inject(PreviewSlotService);\n\n  private readonly closeHooks = inject(TabCloseHooks);\n\n  private readonly paneTree = inject(PaneTreeService);\n\n  private readonly injector = inject(Injector);\n\n  private resolvedSettlement: WorkspaceSettlement | null = null;\n\n  private queue: Promise<void> = Promise.resolve();\n\n  private queued = 0;\n\n  open(input: OpenTabInput): void {\n    const path = normalizePath(input.path);\n    if (this.queued === 0 && !this.settlement.wouldSettle(path)) {\n      this.openHere(input);\n      return;\n    }\n    this.inOrder(\n      () => this.openHere(input),\n      () => this.settlement.settle(path),\n    );\n  }\n\n  keep(path: string): void {\n    if (this.queued === 0) {\n      this.keepHere(path);\n      return;\n    }\n    this.inOrder(() => this.keepHere(path));\n  }\n\n  private get settlement(): WorkspaceSettlement {\n    this.resolvedSettlement ??= this.injector.get(WORKSPACE_SETTLEMENT);\n    return this.resolvedSettlement;\n  }\n\n  private inOrder(\n    work: () => void,\n    before: () => Promise<void> | undefined = () => undefined,\n  ): void {\n    this.queued += 1;\n    this.queue = this.queue\n      .then(before)\n      .then(work)\n      .catch((error: unknown) =>\n        console.error('Opening a content tab failed', error),\n      )\n      .then(() => {\n        this.queued -= 1;\n      });\n  }\n\n  private openHere(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.relabelWhereHeld(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      badge:\n        input.badge === undefined ? existing?.badge : tabBadgeOf(input.badge),\n      onClose: input.onClose,\n      preview: existing ? existing.preview : previewSlot,\n      pinned: existing ? existing.pinned : false,\n      closable: existing ? existing.closable : true,\n      ownLabel: true,\n    };\n    if (previewSlot && !existing) {\n      this.previewSlot.fill(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.navigation.navigateTo(stored.path);\n  }\n\n  private relabelWhereHeld(root: string, input: OpenTabInput): boolean {\n    const routes = this.registry.contentRoutes();\n    let found = false;\n    for (const [dock, tree] of Object.entries(this.paneTree.dockTrees())) {\n      const next = relabelled(\n        tree,\n        (tabPath) => tabRootOf(routes, tabPath) === root,\n        input,\n      );\n      if (next === null) {\n        continue;\n      }\n\n      this.paneTree.commit(dock, next);\n      found = true;\n    }\n    return found;\n  }\n\n  private keepHere(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","import { inject, isDevMode, Service, signal, untracked } from '@angular/core';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { CONTAINER_CHILD_REGION } from '../../../contributions/surface-normalize';\nimport { surfaceForPanePath } from '../pane-surface';\nimport { PaneNode, isDisposableLeaf, leafWith } from '../tree/pane-node';\nimport { collapseLeaves } from '../tree/pane-structure';\n\n@Service()\nexport class LeftOutChildren {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly ids = signal<ReadonlySet<string>>(new Set());\n\n  setShown(surfaceId: string, shown: boolean): void {\n    this.ids.update((ids) => {\n      if (ids.has(surfaceId) !== shown) {\n        return ids;\n      }\n      const next = new Set(ids);\n      if (shown) {\n        next.delete(surfaceId);\n      } else {\n        next.add(surfaceId);\n      }\n      return next;\n    });\n  }\n\n  setShownBy(pluginId: string, surfaceId: string, shown: boolean): void {\n    const child = untracked(() =>\n      this.registry.views().find((view) => view.id === surfaceId),\n    );\n    if (\n      child?.region !== CONTAINER_CHILD_REGION ||\n      child.pluginId !== pluginId\n    ) {\n      if (isDevMode()) {\n        console.warn(\n          `Plugin \"${pluginId}\": setChildShown(\"${surfaceId}\") changed nothing, because it is not a container child this plugin registered.`,\n        );\n      }\n      return;\n    }\n    this.setShown(surfaceId, shown);\n  }\n\n  hides(path: string): boolean {\n    const ids = this.ids();\n    if (ids.size === 0) {\n      return false;\n    }\n    const surface = surfaceForPanePath(\n      this.registry.contentRoutes(),\n      this.registry.views(),\n      path,\n    );\n    return surface?.id !== undefined && ids.has(surface.id);\n  }\n}\n\nexport function shownTree(\n  node: PaneNode,\n  hides: (path: string) => boolean,\n): PaneNode | null {\n  return collapseLeaves(node, (leaf) => {\n    const tabs = leaf.tabs.filter((tab) => !hides(tab.path));\n    if (tabs.length === leaf.tabs.length) {\n      return leaf;\n    }\n    const shown = leafWith(leaf.id, tabs, leaf.active, leaf.declared);\n    return isDisposableLeaf(shown, []) ? null : shown;\n  });\n}\n","interface RunningLifetime {\n  readonly timer: ReturnType<typeof setTimeout>;\n  readonly endsAt: number;\n}\n\nexport class LifetimeClock {\n  private readonly running = new Map<number, RunningLifetime>();\n  private readonly paused = new Map<number, number>();\n  private isHeld = false;\n\n  constructor(private readonly elapsed: (key: number) => void) {}\n\n  isTiming(key: number): boolean {\n    return this.running.has(key) || this.paused.has(key);\n  }\n\n  start(key: number, lifetimeMs: number): void {\n    this.stop(key);\n    if (this.isHeld) {\n      this.paused.set(key, lifetimeMs);\n      return;\n    }\n    this.run(key, lifetimeMs);\n  }\n\n  stop(key: number): void {\n    clearTimeout(this.running.get(key)?.timer);\n    this.running.delete(key);\n    this.paused.delete(key);\n  }\n\n  hold(): void {\n    if (this.isHeld) {\n      return;\n    }\n    this.isHeld = true;\n    const now = Date.now();\n    for (const [key, { timer, endsAt }] of this.running) {\n      clearTimeout(timer);\n      this.paused.set(key, Math.max(endsAt - now, 0));\n    }\n    this.running.clear();\n  }\n\n  release(atLeastMs: number): void {\n    if (!this.isHeld) {\n      return;\n    }\n    this.isHeld = false;\n    const paused = [...this.paused];\n    this.paused.clear();\n    for (const [key, remainingMs] of paused) {\n      this.run(key, Math.max(remainingMs, atLeastMs));\n    }\n  }\n\n  private run(key: number, lifetimeMs: number): void {\n    const timer = setTimeout(() => {\n      this.running.delete(key);\n      this.elapsed(key);\n    }, lifetimeMs);\n    this.running.set(key, { timer, endsAt: Date.now() + lifetimeMs });\n  }\n}\n","import { NotificationInput, NotificationKind } from '@loomweaver/plugin-sdk';\n\nexport const STAYS = 0;\nexport const HOLD_REMAINDER_MS = 1000;\n\nconst LONGEST_TIMER_MS = 2 ** 31 - 1;\n\nconst LIFETIME_BY_KIND: Record<NotificationKind, number> = {\n  info: 5000,\n  success: 5000,\n  warning: 8000,\n  error: STAYS,\n};\n\nexport function lifetimeOf(input: NotificationInput): number {\n  const stated = input.timeoutMs;\n  if (stated === undefined) {\n    return LIFETIME_BY_KIND[input.kind ?? 'info'];\n  }\n  return Number.isFinite(stated) && stated > 0\n    ? Math.min(stated, LONGEST_TIMER_MS)\n    : STAYS;\n}\n","import { computed, Service, signal } from '@angular/core';\nimport {\n  NotificationAction,\n  NotificationInput,\n  NotificationKind,\n} from '@loomweaver/plugin-sdk';\nimport { LifetimeClock } from './lifetime-clock';\nimport {\n  HOLD_REMAINDER_MS,\n  lifetimeOf,\n  STAYS,\n} from './notification-lifetime';\n\n/** A notification to show, as the toast outlet or a distribution's own drawing reads it. */\nexport interface Notification {\n  readonly id: string;\n  readonly kind: NotificationKind;\n  readonly message: string;\n  /** The icon the raiser named instead of the kind's (registry name); absent where the kind's is shown. */\n  readonly icon?: string;\n  /** How often the notification was raised while it was there: `1`, and more once it was repeated. */\n  readonly count: number;\n  readonly action?: NotificationAction;\n}\n\nexport interface RaiserLimits {\n  readonly atOnce: number;\n  readonly lifetimeMs: number;\n}\n\ninterface LiveNotification {\n  readonly key: number;\n  readonly notification: Notification;\n  readonly raiser: string | undefined;\n  readonly name: string | undefined;\n  readonly returnedId: string;\n  readonly lifetimeMs: number;\n  readonly isLimited: boolean;\n}\n\nconst SHOWN_AT_ONCE = 3;\n\n@Service()\nexport class NotificationBoard {\n  private readonly live = signal<readonly LiveNotification[]>([]);\n  private readonly clock = new LifetimeClock((key) => this.remove(key));\n  private readonly limits = new Map<string, RaiserLimits>();\n  private nextKey = 0;\n  private nextGeneratedId = 0;\n\n  readonly shown = computed<readonly Notification[]>(() =>\n    this.live()\n      .slice(0, SHOWN_AT_ONCE)\n      .map((entry) => entry.notification),\n  );\n\n  show(input: NotificationInput, raiser?: string): string {\n    const existing = this.liveAs(input, raiser);\n    if (existing) {\n      return this.showAgain(existing, input);\n    }\n    const limits = raiser === undefined ? undefined : this.limits.get(raiser);\n    if (raiser !== undefined && limits) {\n      this.refuseBeyond(limits, raiser);\n    }\n    if (raiser === undefined && input.id !== undefined) {\n      this.takeBack(input.id);\n    }\n    return this.showFirst(input, raiser, limits);\n  }\n\n  dismiss(id: string): void {\n    const entry = this.live().find((live) => live.notification.id === id);\n    if (entry) {\n      this.remove(entry.key);\n    }\n  }\n\n  hold(): void {\n    if (this.live().length > 0) {\n      this.clock.hold();\n    }\n  }\n\n  release(): void {\n    this.clock.release(HOLD_REMAINDER_MS);\n  }\n\n  limit(raiser: string, limits: RaiserLimits): () => void {\n    this.limits.set(raiser, limits);\n    return () => this.limits.delete(raiser);\n  }\n\n  private showFirst(\n    input: NotificationInput,\n    raiser: string | undefined,\n    limits: RaiserLimits | undefined,\n  ): string {\n    const id = this.freeIdFor(input, raiser);\n    const entry: LiveNotification = {\n      key: this.nextKey++,\n      notification: notificationOf(id, input, 1),\n      raiser,\n      name: input.id,\n      returnedId: id,\n      lifetimeMs: limitedLifetime(lifetimeOf(input), limits),\n      isLimited: limits !== undefined,\n    };\n    this.live.update((entries) => queued(entries, entry));\n    this.startLifetimesOfShown();\n    return id;\n  }\n\n  private showAgain(\n    existing: LiveNotification,\n    input: NotificationInput,\n  ): string {\n    const { id, count } = existing.notification;\n    const isReplacement = input.id !== undefined;\n    const restartsLifetime = !existing.isLimited;\n    const entry: LiveNotification = {\n      ...existing,\n      notification: notificationOf(id, input, isReplacement ? 1 : count + 1),\n      name: isReplacement ? (existing.name ?? input.id) : existing.name,\n      lifetimeMs: restartsLifetime ? lifetimeOf(input) : existing.lifetimeMs,\n    };\n    this.live.update((entries) =>\n      entries.map((live) => (live.key === entry.key ? entry : live)),\n    );\n    if (restartsLifetime) {\n      this.clock.stop(entry.key);\n    }\n    this.startLifetimesOfShown();\n    return existing.returnedId;\n  }\n\n  private remove(key: number): void {\n    this.clock.stop(key);\n    this.live.update((entries) => entries.filter((live) => live.key !== key));\n    if (this.live().length === 0) {\n      this.release();\n    }\n    this.startLifetimesOfShown();\n  }\n\n  private liveAs(\n    input: NotificationInput,\n    raiser: string | undefined,\n  ): LiveNotification | undefined {\n    return this.live().find(\n      (entry) =>\n        entry.raiser === raiser &&\n        (input.id === undefined\n          ? isRepeatOf(entry, input)\n          : entry.name === input.id || entry.returnedId === input.id),\n    );\n  }\n\n  private refuseBeyond(limits: RaiserLimits, raiser: string): void {\n    const live = this.live().filter((entry) => entry.raiser === raiser);\n    if (live.length >= limits.atOnce) {\n      throw new Error(\n        `Plugin '${raiser}' already holds ${limits.atOnce} toasts, shown and waiting together. ` +\n          'A further one is refused until one of them has left.',\n      );\n    }\n  }\n\n  private takeBack(id: string): void {\n    if (!this.isTaken(id)) {\n      return;\n    }\n    const generated = this.generatedId();\n    this.live.update((entries) =>\n      entries.map((entry) =>\n        entry.notification.id === id\n          ? { ...entry, notification: { ...entry.notification, id: generated } }\n          : entry,\n      ),\n    );\n  }\n\n  private freeIdFor(\n    input: NotificationInput,\n    raiser: string | undefined,\n  ): string {\n    if (input.id === undefined) {\n      return this.generatedId();\n    }\n    const wanted = raiser === undefined ? input.id : `${raiser}.${input.id}`;\n    return this.isTaken(wanted) ? this.generatedId() : wanted;\n  }\n\n  private generatedId(): string {\n    let id: string;\n    do {\n      id = `lw.toast.${this.nextGeneratedId++}`;\n    } while (this.isTaken(id));\n    return id;\n  }\n\n  private isTaken(id: string): boolean {\n    return this.live().some((entry) => entry.notification.id === id);\n  }\n\n  private startLifetimesOfShown(): void {\n    for (const entry of this.live().slice(0, SHOWN_AT_ONCE)) {\n      if (entry.lifetimeMs !== STAYS && !this.clock.isTiming(entry.key)) {\n        this.clock.start(entry.key, entry.lifetimeMs);\n      }\n    }\n  }\n}\n\nfunction queued(\n  entries: readonly LiveNotification[],\n  entry: LiveNotification,\n): readonly LiveNotification[] {\n  if (entry.isLimited) {\n    return [...entries, entry];\n  }\n  const firstToGiveWay = entries.findIndex(\n    (live, place) => place >= SHOWN_AT_ONCE && live.isLimited,\n  );\n  return firstToGiveWay === -1\n    ? [...entries, entry]\n    : entries.toSpliced(firstToGiveWay, 0, entry);\n}\n\nfunction limitedLifetime(\n  lifetimeMs: number,\n  limits: RaiserLimits | undefined,\n): number {\n  if (!limits) {\n    return lifetimeMs;\n  }\n  return lifetimeMs === STAYS\n    ? limits.lifetimeMs\n    : Math.min(lifetimeMs, limits.lifetimeMs);\n}\n\nfunction notificationOf(\n  id: string,\n  input: NotificationInput,\n  count: number,\n): Notification {\n  return {\n    id,\n    kind: input.kind ?? 'info',\n    message: input.message,\n    icon: input.icon,\n    count,\n    action: input.action,\n  };\n}\n\nfunction isRepeatOf(\n  existing: LiveNotification,\n  input: NotificationInput,\n): boolean {\n  const { kind, message, icon, action } = existing.notification;\n  return (\n    existing.name === undefined &&\n    kind === (input.kind ?? 'info') &&\n    message === input.message &&\n    icon === input.icon &&\n    action?.label === input.action?.label\n  );\n}\n","import { inject, Service } from '@angular/core';\nimport { NotificationInput } from '@loomweaver/plugin-sdk';\nimport { NotificationBoard } from './notification-board';\n\nexport type {\n  NotificationInput,\n  NotificationKind,\n  NotificationAction,\n} from '@loomweaver/plugin-sdk';\nexport type { Notification } from './notification-board';\n\n/**\n * Neutral host service for transient notifications (\"toasts\"). The shell renders them once via\n * the toast outlet; distributions and plugins raise them through `ctx`.\n *\n * A toast leaves by itself unless it is an `error` or states `timeoutMs: 0`, at most three are\n * shown at once while the rest wait their turn, and the same toast raised again without an id is\n * counted on the one already there. All of that is decided here and not by the outlet, so it holds\n * for a distribution that draws the toasts itself (`provideShell({ drawToasts: false })`).\n */\n@Service()\nexport class NotificationService {\n  private readonly board = inject(NotificationBoard);\n\n  /**\n   * The notifications to show now, oldest first. Never more than three: a further one waits and\n   * appears here when one of these leaves or is dismissed, and its lifetime starts only then.\n   */\n  readonly notifications = this.board.shown;\n\n  /**\n   * Shows a notification and returns its id. With an `id` it replaces the notification of that id;\n   * without one, the same notification raised again is counted on the one still there.\n   */\n  show(input: NotificationInput): string {\n    return this.board.show(input);\n  }\n\n  /** Removes the notification with the given id (no-op if already gone). */\n  dismiss(id: string): void {\n    this.board.dismiss(id);\n  }\n\n  /**\n   * Says the user is attending to the notifications: none leaves by itself until\n   * {@link release}. The toast outlet calls it when the pointer moves on a toast or keyboard focus\n   * enters one; a distribution that draws the toasts itself calls it for the same moments. Calling it\n   * twice is the same as calling it once, and calling it while nothing is shown does nothing.\n   */\n  hold(): void {\n    this.board.hold();\n  }\n\n  /**\n   * Ends {@link hold}. Every notification runs what was left of its lifetime, and at least a\n   * second, so that none vanishes the moment the pointer leaves. Dismissing the last notification\n   * ends a hold too.\n   */\n  release(): void {\n    this.board.release();\n  }\n}\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport { Component, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\n@Component({\n  selector: 'lw-close-prompt-message',\n  imports: [TranslocoPipe],\n  templateUrl: './close-prompt-message.html',\n})\nexport class ClosePromptMessage {\n  protected readonly message = inject(DialogRef).data as string;\n}\n","<p class=\"text-sm text-content\">{{ message | transloco }}</p>\n","import { inject, Service } from '@angular/core';\nimport { DialogButton, DirtySurface } from '@loomweaver/plugin-sdk';\nimport { DialogCloseGuard } from '../../../dialog/dialog-close-guard';\nimport { DialogService } from '../../../dialog/dialog.service';\nimport { NotificationService } from '../../../notifications/notification.service';\nimport { ClosePromptMessage } from './close-prompt-message';\nimport { beforeCloseOf, dirtySurfaceOf, instanceDirty } from './dirty-surface';\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 implements DialogCloseGuard {\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  mustAsk(candidates: readonly unknown[]): boolean {\n    return (\n      this.anyDirty(candidates) || this.vetoHooksOf(candidates).length > 0\n    );\n  }\n\n  guarded(candidates: readonly unknown[], proceed: () => void): void {\n    if (!this.mustAsk(candidates)) {\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'>(ClosePromptMessage, {\n      data: 'retention.vetoPendingMessage',\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>(ClosePromptMessage, {\n      data: 'retention.unsavedMessage',\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(async (surface) => surface.surfaceSave?.()));\n    } catch (error) {\n      console.error('Save before closing failed', error);\n      this.notifications.show({\n        message: 'retention.saveFailed',\n        kind: 'error',\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 { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { normalizePath, tabRootOf } from '../content-path';\nimport { TabCloseHooks } from './tab-close-hooks';\nimport { ContentTabState } from './content-tab-state';\nimport { TabNavigationService } from './tab-navigation.service';\nimport {\n  CONTENT_DOCK,\n  isViewPanePath,\n  PaneRef,\n  promotedContentPath,\n} from '../../pane/tree/pane-address';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { PaneTab } from '../../pane/tree/pane-node';\nimport { TabKeep, keepsNothing } from '../../pane/tree/pane-handover';\nimport { sparedByBulkClose } from '../../pane/tree/pane-tabs';\nimport { LeftOutChildren } from '../../pane/container/left-out-children';\nimport { findLeaf } from '../../pane/tree/pane-queries';\nimport { paneRetentionScope } from '../../pane/retention/retention-keys';\nimport { UnsavedWork } from '../../pane/unsaved-work/unsaved-work';\nimport { SurfaceCloseGuard } from '../../pane/unsaved-work/surface-close-guard';\n\n@Service()\nexport class TabClosingService {\n  private readonly state = inject(ContentTabState);\n\n  private readonly navigation = inject(TabNavigationService);\n\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly paneTree = inject(PaneTreeService);\n\n  private readonly unsavedWork = inject(UnsavedWork);\n\n  private readonly closeGuard = inject(SurfaceCloseGuard);\n\n  private readonly closeHooks = inject(TabCloseHooks);\n\n  private readonly leftOut = inject(LeftOutChildren);\n\n  closeOthers(path: string, pane?: PaneRef): void {\n    if (this.inOtherPane(pane)) {\n      this.closeInPane(\n        pane,\n        this.closablePaneTabs(pane).filter((tab) => tab.path !== path),\n      );\n      return;\n    }\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\n        .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    const chosen = normalizePath(path);\n    const views = this.closableViewTabs().filter((view) => view !== chosen);\n    this.closeBulk(roots, views, target?.path ?? keep);\n  }\n\n  closeAll(pane?: PaneRef): void {\n    if (this.inOtherPane(pane)) {\n      this.closeInPane(pane, this.closablePaneTabs(pane));\n      return;\n    }\n    const routes = this.registry.contentRoutes();\n    const roots = new Set(\n      this.state\n        .openTabs()\n        .filter((tab) => !tab.pinned && tab.closable)\n        .map((tab) => tabRootOf(routes, tab.path)),\n    );\n    const survivor = this.state\n      .openTabs()\n      .find((tab) => tab.pinned || !tab.closable);\n    this.closeBulk(roots, this.closableViewTabs(), survivor?.path ?? '');\n  }\n\n  closeToRight(path: string, pane?: PaneRef): void {\n    if (this.inOtherPane(pane)) {\n      const tabs = this.paneTabs(pane);\n      const index = tabs.findIndex((tab) => tab.path === path);\n      this.closeInPane(\n        pane,\n        tabs.slice(index + 1).filter((tab) => closable(tab)),\n      );\n      return;\n    }\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 right = new Set(\n      rendered\n        .slice(index + 1)\n        .filter((tab) => tab.closable && !tab.pinned)\n        .map((tab) => tab.path),\n    );\n    const views = this.closableViewTabs().filter((view) => right.has(view));\n    const roots = new Set([...right].filter((path) => !isViewPanePath(path)));\n    const target = this.state.openTabRootedAt(routes, keep);\n    this.closeBulk(roots, views, target?.path ?? keep);\n  }\n\n  closePrimaryPane(keeps: TabKeep = keepsNothing): void {\n    const candidates = this.paneTree\n      .primaryTabs(CONTENT_DOCK)\n      .flatMap((tab) => (keeps(tab) ? [] : this.urlPaneCandidates(tab.path)));\n    this.closeGuard.guarded(candidates, () => {\n      const promoted = this.paneTree.collapsePrimary(CONTENT_DOCK, keeps);\n      if (promoted !== null) {\n        void this.navigateAfterClose(promoted);\n      }\n    });\n  }\n\n  close(path: string, pane?: PaneRef): void {\n    if (this.inOtherPane(pane)) {\n      this.closeInPane(\n        pane,\n        this.paneTabs(pane).filter((tab) => tab.path === path),\n      );\n      return;\n    }\n    const normalized = normalizePath(path);\n    if (isViewPanePath(normalized)) {\n      this.closeGuard.guarded(this.urlPaneCandidates(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 (\n      this.state.openTabs().some((tab) => tabRootOf(routes, tab.path) === root)\n    ) {\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 inOtherPane(pane: PaneRef | undefined): pane is PaneRef {\n    return pane !== undefined && !this.paneTree.carriesAddress(pane);\n  }\n\n  private paneTabs(pane: PaneRef): readonly PaneTab[] {\n    const tabs =\n      findLeaf(this.paneTree.tree(pane.dock), pane.paneId)?.tabs ?? [];\n    return tabs.filter((tab) => !this.leftOut.hides(tab.path));\n  }\n\n  private closablePaneTabs(pane: PaneRef): readonly PaneTab[] {\n    return this.paneTabs(pane).filter((tab) => closable(tab));\n  }\n\n  private closeInPane(pane: PaneRef, tabs: readonly PaneTab[]): void {\n    if (tabs.length === 0) {\n      return;\n    }\n    const scope = paneRetentionScope(pane.dock, pane.paneId);\n    const candidates = tabs.flatMap((tab) =>\n      this.unsavedWork.instancesAt(scope, tab.path),\n    );\n    this.closeGuard.guarded(candidates, () => {\n      for (const tab of tabs) {\n        this.paneTree.removeTab(pane.dock, pane.paneId, tab.path);\n        if (!isViewPanePath(tab.path)) {\n          this.runCloseHook(tab.path);\n        }\n      }\n    });\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    if (closing === undefined) {\n      return;\n    }\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));\n    }\n  }\n\n  private closeViewTab(path: string): void {\n    this.closeViewTabs(new Set([path]));\n  }\n\n  private urlPaneCandidates(path: string): unknown[] {\n    return this.unsavedWork.instancesAt(\n      paneRetentionScope(CONTENT_DOCK, this.paneTree.primaryId(CONTENT_DOCK)),\n      path,\n    );\n  }\n\n  private closableViewTabs(): string[] {\n    const rendered = new Set(\n      this.state\n        .tabs()\n        .filter((tab) => tab.closable && isViewPanePath(tab.path))\n        .map((tab) => tab.path),\n    );\n    return this.paneTree\n      .primaryTabs(CONTENT_DOCK)\n      .filter((tab) => rendered.has(tab.path) && closable(tab))\n      .map((tab) => tab.path);\n  }\n\n  private closeBulk(\n    roots: ReadonlySet<string>,\n    views: readonly string[],\n    fallbackPath: string,\n  ): void {\n    const candidates = [...roots, ...views].flatMap((path) =>\n      this.urlPaneCandidates(path),\n    );\n    this.closeGuard.guarded(candidates, () => {\n      this.closeViewTabs(new Set(views));\n      this.closeSet(roots, fallbackPath);\n    });\n  }\n\n  private closeViewTabs(paths: ReadonlySet<string>): void {\n    if (paths.size === 0) {\n      return;\n    }\n    this.paneTree.setPrimaryTabs(\n      CONTENT_DOCK,\n      this.paneTree\n        .primaryTabs(CONTENT_DOCK)\n        .filter((tab) => !paths.has(tab.path)),\n    );\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\n      .openTabs()\n      .filter((tab) => roots.has(tabRootOf(routes, tab.path)));\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    for (const tab of closing) {\n      this.closeHooks.runSafely(tab.onClose);\n    }\n    for (const root of roots) {\n      this.closeHooks.delete(root);\n    }\n    if (activeWentAway) {\n      void this.navigateAfterClose(fallbackPath);\n    }\n  }\n\n  private navigateAfterClose(target: string): Promise<void> {\n    return this.navigation\n      .navigate(promotedContentPath(target))\n      .then(() => {\n        if (isViewPanePath(target)) {\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\n      .openTabs()\n      .filter((tab) => tabRootOf(routes, tab.path) !== root);\n    return siblings.at(-1)?.path ?? '';\n  }\n}\n\nfunction closable(tab: PaneTab): boolean {\n  return !sparedByBulkClose(tab);\n}\n","import { inject, Service, Signal } from '@angular/core';\nimport {\n  ActiveContent,\n  ContentTabLabel,\n  OpenTabInput,\n} from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { FeatureSwitches } from '../../../features/feature-switches.service';\nimport { ContentTabView } from './content-tab-projection';\nimport { ContentTabState } from './content-tab-state';\nimport { TabNavigationService } from './tab-navigation.service';\nimport { TabOpeningService } from './tab-opening.service';\nimport { TabClosingService } from './tab-closing.service';\nimport { QuickOpenTarget } from './quick-open-target';\nimport { updateTabLabel } from './tab-label-update';\nimport { PaneRef } from '../../pane/tree/pane-address';\nimport { keepsEverything } from '../../pane/tree/pane-handover';\nimport { sparedByBulkClose } from '../../pane/tree/pane-tabs';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { UnsavedWork } from '../../pane/unsaved-work/unsaved-work';\n\n/**\n * The tabs of the pane that carries the address: what its strip shows, which tab is active, and\n * the ways to open, move, pin and close them. The open tabs live in that pane of the pane tree, so\n * they persist and reload with the arrangement; only the `onClose` hooks stay in the session. A tab\n * is identified by its tab root, and moving between the sub-routes below a root stays in one tab.\n * A chromeless surface shows no strip. The close methods take an optional {@link PaneRef}: naming a\n * pane that does not carry the address acts on that pane's tabs instead, asking about unsaved work\n * there first.\n */\n@Service()\nexport class ContentTabsService {\n  private readonly state = inject(ContentTabState);\n\n  private readonly navigation = inject(TabNavigationService);\n\n  private readonly opening = inject(TabOpeningService);\n\n  private readonly closing = inject(TabClosingService);\n\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly features = inject(FeatureSwitches).content;\n\n  private readonly paneTree = inject(PaneTreeService);\n\n  private readonly unsavedWork = inject(UnsavedWork);\n\n  /**\n   * What the command palette's Quick Open lists: every open tab of every content pane, and every\n   * registered route the user could open that takes no route parameter and is not chromeless. A\n   * route the user has visited carries when it was last active in this session, and an open tab wins\n   * over a route with the same path. View tabs are not listed; they are reached through their rail\n   * item.\n   *\n   * A route that is not open is listed only when the session meets its `access` requirement; an open\n   * tab is listed as the strip shows it. This is presentation, not enforcement: opening a target\n   * still passes the route's access check, and content the session no longer qualifies for renders\n   * the neutral placeholder.\n   */\n  readonly quickOpenTargets: Signal<readonly QuickOpenTarget[]> =\n    this.state.quickOpenTargets;\n\n  /** The active view tab of the pane that carries the address, or `null` while the address decides. */\n  readonly activeViewPath: Signal<string | null> = this.state.activeViewPath;\n\n  readonly activeViewInstance: Signal<string | undefined> =\n    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, as a plugin reads it through `ctx.activeContent`. */\n  readonly activeContent: Signal<ActiveContent | null> =\n    this.state.activeContent;\n\n  /** Whether the strip is drawn: whenever the pane holds tabs, and never while a chromeless surface is active. */\n  readonly showStrip: Signal<boolean> = this.state.showStrip;\n\n  /**\n   * Everything the strip holds, in order: the facet tabs of surfaces that follow the address, then\n   * the open tabs, then the view tabs.\n   */\n  readonly tabs: Signal<readonly ContentTabView[]> = this.state.tabs;\n\n  /**\n   * Activates a view held as a tab beside the content tabs: the pane shows the view and the address\n   * stays where it was. Does nothing unless the pane holds that tab.\n   */\n  activateViewTab(path: string): void {\n    this.state.activateViewTab(path);\n  }\n\n  /**\n   * Applies a reorder of the strip's movable tabs. `ids` is the new full order of their roots, pinned\n   * first. A facet tab is left out, because the pane does not hold it. The order is written to the\n   * pane that holds the tabs, as a reorder in any other pane is.\n   */\n  reorder(ids: string[]): void {\n    this.state.reorder(ids);\n  }\n\n  /**\n   * Moves the tab rooted at `path` to the front of the unpinned tabs, so a tab the strip had clipped\n   * becomes visible again. Does nothing for a pinned or unknown tab.\n   */\n  bringToFront(path: string): void {\n    this.state.bringToFront(path);\n  }\n\n  /**\n   * Navigates the content area to a path: a full-area screen, another tab, or a sub-route.\n   *\n   * When another pane already holds that tab, that pane takes the address and the tab is activated\n   * there, instead of a second copy opening beside the current one. Navigating ends a view tab's\n   * selection.\n   *\n   * Does nothing in a pop-out window, with a warning in development: a pop-out shows exactly one\n   * surface, and navigating it would take it out of its pop-out address.\n   */\n  navigate(path: string): Promise<boolean> {\n    return this.navigation.navigate(path);\n  }\n\n  /** Like {@link navigate}, for a caller that does not wait: a failed navigation is logged. */\n  navigateTo(path: string): void {\n    this.navigation.navigateTo(path);\n  }\n\n  /**\n   * Reveals a content tab where it already lives: a tab held by another pane is activated there and\n   * that pane takes the address; anything else is navigated to. The tab is never duplicated.\n   */\n  revealContentTab(navPath: string): void {\n    this.navigateTo(navPath);\n  }\n\n  /**\n   * Opens a titled tab for `path` and activates it; opening the same root again restores its sub-route.\n   * With `preview`, and preview enabled, a new tab takes the strip's single preview slot and replaces\n   * the preview tab that was there, whose `onClose` runs. Opening a tab that is already open keeps\n   * its preview state; {@link keep} promotes it.\n   */\n  open(input: OpenTabInput): void {\n    this.opening.open(input);\n  }\n\n  /**\n   * Changes the title, icon or badge of the open tab rooted at `path` where it stands, without bringing\n   * it forward; what `label` leaves out stays, `badge: null` removes the tab's own badge. No-op when no\n   * tab is open for `path`; with a `pluginId`, only content that plugin registered changes.\n   */\n  update(path: string, label: ContentTabLabel, pluginId?: string): void {\n    updateTabLabel(this.paneTree, this.registry.contentRoutes(), {\n      path,\n      label,\n      pluginId,\n    });\n  }\n\n  /** Promotes the preview tab rooted at `path` to a permanent tab. Does nothing if it is permanent already. */\n  keep(path: string): void {\n    this.opening.keep(path);\n  }\n\n  /**\n   * Pins the tab rooted at `path`: it moves behind the tabs already pinned, its close control becomes\n   * an unpin control, and a preview tab is promoted. Does nothing if the tab is not open.\n   */\n  pin(path: string): void {\n    this.state.setPinned(path, true);\n  }\n\n  /** Unpins the tab rooted at `path`; it takes the first place after the tabs still pinned. */\n  unpin(path: string): void {\n    this.state.setPinned(path, false);\n  }\n\n  /** Closes every tab in the strip except the target; pinned tabs and tabs that cannot close stay. */\n  closeOthers(path: string, pane?: PaneRef): void {\n    this.closing.closeOthers(path, pane);\n  }\n\n  /** Closes every tab in the strip; pinned tabs and tabs that cannot close stay. */\n  closeAll(pane?: PaneRef): void {\n    this.closing.closeAll(pane);\n  }\n\n  /** Closes the tabs after the target in the strip; pinned tabs stay. */\n  closeToRight(path: string, pane?: PaneRef): void {\n    this.closing.closeToRight(path, pane);\n  }\n\n  /**\n   * Closes the pane that carries the address, in a split: a neighbour takes the address, is navigated\n   * to, and receives the pinned tabs and those that cannot close (every tab while closing is switched\n   * off). Unsaved work in the tabs that really close is asked about first.\n   */\n  closePrimaryPane(): void {\n    this.closing.closePrimaryPane(\n      this.features.close() ? sparedByBulkClose : keepsEverything,\n    );\n  }\n\n  /**\n   * Closes a tab, by any path below its root. If it was active, a neighbour is navigated to first.\n   * The pane that showed it lets its surface go once the tab is no longer open anywhere.\n   */\n  close(path: string, pane?: PaneRef): void {\n    this.closing.close(path, pane);\n  }\n\n  /**\n   * Runs and clears the close hook of the tab rooted at `path`, for a close outside the pane that\n   * carries the address. Does nothing while the tab is still open there, since closing it there runs\n   * the hook.\n   */\n  runCloseHook(path: string): void {\n    this.closing.runCloseHook(path);\n  }\n\n  /**\n   * Whether the surface at `path` holds **unsaved work** — the fact behind the mark the workbench\n   * draws on a tab, readable so that a distribution can draw its own: a badge in the status bar, a\n   * count beside a module, a mark on a row in a list. An arrangement answers for what is inside it,\n   * so a document whose panel is dirty reads `true` at the document's own address, and the answer\n   * covers every pane the address is open in.\n   *\n   * It is a **reactive read**: call it inside a `computed` or a template and the reader follows the\n   * work being saved without further wiring. `false` for an address with nothing open, because a\n   * surface holding unsaved work is never destroyed while it does.\n   */\n  hasUnsavedWork(path: string): boolean {\n    return this.unsavedWork.anywhere(path);\n  }\n\n  /**\n   * Where the address goes when the tab rooted at `path` leaves the pane or closes: the last remaining\n   * tab, else home (`''`).\n   */\n  neighbourOf(path: string): string {\n    return this.closing.neighbourOf(path);\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport {\n  CONTENT_DOCK,\n  isSamePane,\n  isViewPanePath,\n  PaneRef,\n} from '../tree/pane-address';\nimport {\n  PaneLeaf,\n  PaneNode,\n  PaneTab,\n  PRIMARY_LEAF,\n  newPaneId,\n  tabWithout,\n} from '../tree/pane-node';\nimport { findLeaf } from '../tree/pane-queries';\nimport { splitLeafWith, withoutEmptyPrimary } from '../tree/pane-structure';\nimport { isContainerDock } from '../container/container-children';\nimport { insertTab, removeTab } from '../tree/pane-tabs';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { PaneAdmission } from '../../content/pane-admission';\nimport { ContentTabsService } from '../../content/tabs/content-tabs.service';\nimport { matchRoute, tabRootOf } from '../../content/content-path';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { LeftOutChildren } from '../container/left-out-children';\n\nexport type PaneDropEdge = 'top' | 'bottom' | 'left' | 'right';\n\nexport function stripSourceOf(listId: string): PaneRef | null {\n  const parts = listId.split(':');\n  if (parts[0] !== 'pane-strip' || parts.length !== 3) {\n    return null;\n  }\n  return { dock: unescapeColons(parts[1]), paneId: unescapeColons(parts[2]) };\n}\n\nexport function stripIdOf(source: PaneRef): string {\n  return `pane-strip:${escapeColons(source.dock)}:${escapeColons(source.paneId)}`;\n}\n\nfunction escapeColons(part: string): string {\n  return part.replaceAll('%', '%25').replaceAll(':', '%3A');\n}\n\nfunction unescapeColons(part: string): string {\n  return part.replaceAll('%3A', ':').replaceAll('%25', '%');\n}\n\nfunction departedTab(targetDock: string, tab: PaneTab): PaneTab {\n  return tab.preview && targetDock !== CONTENT_DOCK\n    ? tabWithout(tab, 'preview')\n    : tab;\n}\n\n@Service()\nexport class PaneMoveService {\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly admission = inject(PaneAdmission);\n  private readonly tabs = inject(ContentTabsService);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly leftOut = inject(LeftOutChildren);\n\n  moveToStrip(\n    source: PaneRef,\n    rawPath: string,\n    target: PaneRef,\n    index?: number,\n  ): void {\n    const tab = this.resolveTab(source, rawPath);\n    if (!tab || isSamePane(source, target)) {\n      return;\n    }\n    const at = this.paneTree.carriesAddress(target)\n      ? undefined\n      : this.storedIndex(target, index);\n    const follow = this.urlFollowup(source, tab);\n    const moved = departedTab(target.dock, 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: PaneRef,\n    rawPath: string,\n    target: PaneRef,\n    edge: PaneDropEdge,\n  ): void {\n    const tab = this.resolveTab(source, rawPath);\n    if (!tab) {\n      return;\n    }\n    if (isSamePane(source, target) && !this.sourceRetainsContent(source, tab)) {\n      return;\n    }\n    const follow = this.urlFollowup(source, tab);\n    const moved = departedTab(target.dock, 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  splitTabOut(\n    rootPath: string,\n    orientation: 'row' | 'column',\n    pane?: PaneRef,\n  ): void {\n    const source: PaneRef = pane ?? {\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: PaneRef,\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.commit(\n      targetDock,\n      applyToTarget(this.paneTree.tree(targetDock)),\n    );\n  }\n\n  private resolveTab(source: PaneRef, rawPath: string): 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.paneTree.carriesAddress(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 storedIndex(\n    target: PaneRef,\n    drawn: number | undefined,\n  ): number | undefined {\n    const tabs =\n      findLeaf(this.paneTree.tree(target.dock), target.paneId)?.tabs ?? [];\n    const shown = tabs.filter((tab) => !this.leftOut.hides(tab.path));\n    if (drawn === undefined || shown.length === tabs.length) {\n      return drawn;\n    }\n    const before = shown[drawn];\n    return before ? tabs.indexOf(before) : tabs.length;\n  }\n\n  private tabCount(source: PaneRef): number {\n    return (\n      findLeaf(this.paneTree.tree(source.dock), source.paneId)?.tabs.length ?? 0\n    );\n  }\n\n  private sourceRetainsContent(source: PaneRef, tab: PaneTab): boolean {\n    if (this.tabCount(source) > 1) {\n      return true;\n    }\n    return (\n      this.paneTree.carriesAddress(source) &&\n      this.tabs.neighbourOf(tab.path) !== ''\n    );\n  }\n\n  private removeSourceTab(\n    tree: PaneNode,\n    source: PaneRef,\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.commit(\n      dock,\n      isContainerDock(dock)\n        ? withoutEmptyPrimary(node, this.paneTree.primaryId(dock))\n        : node,\n    );\n  }\n\n  private urlFollowup(source: PaneRef, tab: PaneTab): string | null {\n    if (!this.paneTree.carriesAddress(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: PaneRef,\n    tab: PaneTab,\n    urlFollowup: string | null,\n  ): void {\n    if (this.paneTree.carriesAddress(target)) {\n      if (isViewPanePath(tab.path)) {\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.admission.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 { inject, Service, signal } from '@angular/core';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { findLeaf } from '../tree/pane-queries';\nimport { PaneRef } from '../tree/pane-address';\n\n@Service()\nexport class PaneChromeService {\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly maximized = signal<PaneRef | null>(null);\n  private readonly minimizedPanes = signal<ReadonlySet<string>>(new Set());\n\n  isMaximized(dock: string, paneId: string): boolean {\n    return this.maximizedPaneIn(dock) === paneId;\n  }\n\n  maximizedPaneIn(dock: string): string | null {\n    const current = this.maximized();\n    return current?.dock === dock &&\n      findLeaf(this.paneTree.tree(dock), current.paneId) !== null\n      ? current.paneId\n      : null;\n  }\n\n  toggleMaximize(dock: string, paneId: string): void {\n    this.maximized.update((current) =>\n      this.isMaximized(dock, paneId) && current ? null : { dock, paneId },\n    );\n  }\n\n  endMaximize(): void {\n    this.maximized.set(null);\n  }\n\n  isMinimized(dock: string, paneId: string): boolean {\n    return this.minimizedPanes().has(paneKey(dock, paneId));\n  }\n\n  toggleMinimize(dock: string, paneId: string): void {\n    this.minimizedPanes.update((current) => {\n      const next = new Set(current);\n      const id = paneKey(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.minimizedPanes();\n    if ([...current].every((id) => !id.startsWith(prefix))) {\n      return;\n    }\n    this.minimizedPanes.set(\n      new Set([...current].filter((id) => !id.startsWith(prefix))),\n    );\n  }\n}\n\nfunction paneKey(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  containerInstanceId,\n  containerPathOfDock,\n  isAddressable,\n} from './container-children';\nimport { BakedTab, PaneAreaTree, paneAreaTree } from '../tree/declared-pane-layout';\nimport { viewPanePath } 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: viewPanePath(childId),\n      instance: containerInstanceId(dock, childId),\n    };\n  }\n  const path = containerChildPath(containerPathOfDock(dock), address);\n  return { path, instance: containerInstanceId(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, isDevMode, Service } from '@angular/core';\nimport { ContainerSpec, ContainerTabLabel } from '@loomweaver/plugin-sdk';\nimport { landingLeaf, tabHolderOf } from '../tree/pane-queries';\nimport { insertTab } from '../tree/pane-tabs';\nimport {\n  containerChildPath,\n  containerInstanceId,\n  containerPathOfDock,\n} from './container-children';\nimport { containerChildTab, containerLayout } from './container-layout';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { LeftOutChildren } from './left-out-children';\nimport { withLabel } from '../tree/pane-node';\n\n@Service()\nexport class PaneContainersService {\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly leftOut = inject(LeftOutChildren);\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      return;\n    }\n    const landing = landingLeaf(node);\n    this.paneTree.commit(dock, node, landing?.id);\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    if (this.leftOut.hides(path)) {\n      if (isDevMode()) {\n        console.warn(\n          `Container child \"${segmentPath}\" is left out and was not opened; bring it back with ctx.setChildShown first.`,\n        );\n      }\n      return;\n    }\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 = withLabel(\n      { path, instance: containerInstanceId(dock, path) },\n      label ?? {},\n    );\n    this.paneTree.commit(dock, insertTab(tree, target, tab));\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport { ContentTabsService } from '../content/tabs/content-tabs.service';\nimport { tabRootOf } from '../content/content-path';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { PaneChromeService } from './chrome/pane-chrome.service';\nimport { SurfaceCloseGuard } from './unsaved-work/surface-close-guard';\nimport { PaneAdmission } from '../content/pane-admission';\nimport { PaneMoveService } from './drag/pane-move.service';\nimport {\n  containerChildInstances,\n  paneRetentionScope,\n} from './retention/retention-keys';\nimport { RetainedViewStash } from './retention/retained-view-stash';\nimport { isContentSideDock } from './container/container-children';\nimport { LeftOutChildren } from './container/left-out-children';\nimport { CONTENT_DOCK, isSamePane } from './tree/pane-address';\nimport { TabKeep, keepsEverything } from './tree/pane-handover';\nimport { sparedByBulkClose } from './tree/pane-tabs';\nimport { PaneLeaf, leafPath } from './tree/pane-node';\nimport { findLeaf, leavesOf } from './tree/pane-queries';\nimport { PaneTreeService } from './tree/pane-tree.service';\n\n@Service()\nexport class PaneActions {\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly chrome = inject(PaneChromeService);\n  private readonly moves = inject(PaneMoveService);\n  private readonly tabs = inject(ContentTabsService);\n  private readonly closeGuard = inject(SurfaceCloseGuard);\n  private readonly stash = inject(RetainedViewStash);\n  private readonly admission = inject(PaneAdmission);\n  private readonly features = inject(FeatureSwitches).content;\n  private readonly registry = inject(ContributionRegistry);\n  private readonly leftOut = inject(LeftOutChildren);\n\n  split(dock: string, paneId: string, orientation: 'row' | 'column'): void {\n    const leaf = this.leaf(dock, paneId);\n    if (leaf === null) {\n      return;\n    }\n    const path = leafPath(leaf) ?? this.addressCarriedBy(dock, paneId);\n    if (path === undefined || !this.duplicable(path)) {\n      return;\n    }\n    this.paneTree.splitPane(dock, paneId, orientation, path);\n  }\n\n  close(dock: string, paneId: string): void {\n    const leaf = this.leaf(dock, paneId);\n    if (leaf === null) {\n      return;\n    }\n    const primary = paneId === this.paneTree.primaryId(dock);\n    if (primary && !this.paneTree.isSplit(dock)) {\n      return;\n    }\n    if (primary && dock === CONTENT_DOCK) {\n      this.tabs.closePrimaryPane();\n      return;\n    }\n    const keeps = this.keepsOnClose(dock);\n    this.closeGuard.guarded(this.candidatesOf(dock, leaf, keeps), () => {\n      if (primary) {\n        this.paneTree.collapsePrimary(dock, keeps);\n        return;\n      }\n      this.paneTree.closePane(dock, paneId, keeps);\n    });\n  }\n\n  unsplit(dock: string): void {\n    if (!this.paneTree.isSplit(dock)) {\n      return;\n    }\n    const primary = this.paneTree.primaryId(dock);\n    const keeps = this.keepsOnClose(dock);\n    const candidates = leavesOf(this.paneTree.tree(dock))\n      .filter((leaf) => leaf.id !== primary)\n      .flatMap((leaf) => this.candidatesOf(dock, leaf, keeps));\n    this.closeGuard.guarded(candidates, () =>\n      this.paneTree.unsplit(dock, keeps),\n    );\n  }\n\n  maximize(dock: string, paneId: string): void {\n    if (this.leaf(dock, paneId) && !this.chrome.isMaximized(dock, paneId)) {\n      this.chrome.toggleMaximize(dock, paneId);\n    }\n  }\n\n  minimize(dock: string, paneId: string): void {\n    if (this.leaf(dock, paneId) && !this.chrome.isMinimized(dock, paneId)) {\n      this.chrome.toggleMinimize(dock, paneId);\n    }\n  }\n\n  restore(dock: string, paneId?: string): void {\n    if (paneId === undefined) {\n      this.chrome.endMaximize();\n      return;\n    }\n    if (this.chrome.isMaximized(dock, paneId)) {\n      this.chrome.endMaximize();\n    }\n    if (this.chrome.isMinimized(dock, paneId)) {\n      this.chrome.toggleMinimize(dock, paneId);\n    }\n  }\n\n  focus(dock: string, paneId: string): void {\n    if (this.leaf(dock, paneId) === null) {\n      return;\n    }\n    const path = this.paneTree.focusPane(\n      dock,\n      paneId,\n      this.tabs.activeTabRoot(),\n    );\n    if (path !== null) {\n      this.tabs.navigateTo(path);\n    }\n  }\n\n  moveTab(path: string, dock: string, paneId: string): void {\n    const source = this.paneTree.sourceOf(path);\n    if (\n      source === null ||\n      this.leaf(dock, paneId) === null ||\n      isSamePane(source, { dock, paneId })\n    ) {\n      return;\n    }\n    this.moves.moveToStrip(source, path, { dock, paneId });\n  }\n\n  duplicable(path: string): boolean {\n    return this.admission.canDuplicate(path);\n  }\n\n  private addressCarriedBy(dock: string, paneId: string): string | undefined {\n    return this.paneTree.carriesAddress({ dock, paneId })\n      ? this.tabs.activeTabRoot()\n      : undefined;\n  }\n\n  private leaf(dock: string, paneId: string): PaneLeaf | null {\n    return findLeaf(this.paneTree.tree(dock), paneId);\n  }\n\n  private keepsOnClose(dock: string): TabKeep {\n    const keeps =\n      isContentSideDock(dock) && !this.features.close()\n        ? keepsEverything\n        : sparedByBulkClose;\n    return (tab) => keeps(tab) || this.leftOut.hides(tab.path);\n  }\n\n  private candidatesOf(\n    dock: string,\n    leaf: PaneLeaf,\n    keeps: TabKeep,\n  ): unknown[] {\n    const scope = paneRetentionScope(dock, leaf.id);\n    return leaf.tabs.flatMap((tab) =>\n      keeps(tab)\n        ? []\n        : [\n            ...this.stash.instancesFor(\n              scope,\n              tabRootOf(this.registry.contentRoutes(), tab.path),\n            ),\n            ...containerChildInstances(this.stash.keyedInstances(), tab.path),\n          ],\n    );\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 (\n      !item ||\n      !this.host.nativeElement.contains(item) ||\n      !this.moveByKeyboard(item, direction)\n    ) {\n      return;\n    }\n    event.preventDefault();\n    const id = item.dataset['reorderId'] ?? '';\n    setTimeout(() => this.focusItem(id), 0);\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      (element) => (element.dataset['reorderBand'] ?? '') === band,\n    );\n    const bandIds = inBand.map((element) => element.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((element) => element.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((element) => (element.dataset['reorderId'] ?? '') === id)\n      ?.focus();\n  }\n}\n","import { computed, Service, signal, Signal } from '@angular/core';\n\n@Service()\nexport class PaneDragService {\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 () => this.zones.update((ids) => withoutOne(ids, id));\n  }\n\n  registerStrip(id: string): () => void {\n    this.strips.update((ids) => [...ids, id]);\n    return () => this.strips.update((ids) => withoutOne(ids, id));\n  }\n}\n\nfunction withoutOne(ids: readonly string[], id: string): readonly string[] {\n  const at = ids.indexOf(id);\n  return at === -1 ? ids : [...ids.slice(0, at), ...ids.slice(at + 1)];\n}\n","import { afterEveryRender, Directive, ElementRef, inject } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { rovingStep, rovingTabIndex } from '../../../elements/roving-focus';\n\n@Directive({\n  selector: '[lwRovingTabs]',\n  host: {\n    '(keydown)': 'onKeydown($event)',\n    '(focusin)': 'assignStop()',\n    '(focusout)': 'onFocusOut($event)',\n  },\n})\nexport class RovingTabs {\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly document = inject(DOCUMENT);\n\n  constructor() {\n    afterEveryRender({ write: () => this.assignStop() });\n  }\n\n  protected onKeydown(event: KeyboardEvent): void {\n    if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n      return;\n    }\n    const tabs = this.tabs();\n    const current = tabs.indexOf(event.target as HTMLElement);\n    if (current === -1) {\n      return;\n    }\n    const next = rovingStep(event.key, current, tabs.length, 'horizontal');\n    if (next === undefined) {\n      return;\n    }\n    event.preventDefault();\n    tabs[next].focus();\n  }\n\n  protected onFocusOut(event: FocusEvent): void {\n    this.assignStop(event.relatedTarget);\n  }\n\n  protected assignStop(\n    focused: EventTarget | null = this.document.activeElement,\n  ): void {\n    const tabs = this.tabs();\n    const stop =\n      tabs.find((tab) => tab === focused) ??\n      tabs.find((tab) => tab.getAttribute('aria-selected') === 'true') ??\n      tabs[0];\n    rovingTabIndex(tabs, tabs.indexOf(stop));\n  }\n\n  private tabs(): HTMLElement[] {\n    const list = this.host.nativeElement;\n    return [...list.querySelectorAll<HTMLElement>('[role=\"tab\"]')].filter(\n      (tab) => tab.parentElement?.closest('[role=\"tablist\"]') === list,\n    );\n  }\n}\n","import {\n  afterNextRender,\n  afterRenderEffect,\n  DestroyRef,\n  Directive,\n  ElementRef,\n  inject,\n  input,\n  output,\n  signal,\n} from '@angular/core';\n\nconst EDGE_TOLERANCE_PX = 1;\n\n@Directive({ selector: '[lwStripOverflow]', exportAs: 'lwStripOverflow' })\nexport class StripOverflow {\n  readonly enabled = input(false, { alias: 'lwStripOverflow' });\n  readonly active = input.required<string>({\n    alias: 'lwStripOverflowActive',\n  });\n  readonly tabs = input<readonly unknown[]>([], {\n    alias: 'lwStripOverflowTabs',\n  });\n\n  readonly revealRequest = output<string>();\n\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly overflowingState = signal(false);\n  private pickedHere: string | null = null;\n\n  readonly overflowing = this.overflowingState.asReadonly();\n\n  constructor() {\n    afterRenderEffect(() => {\n      this.tabs();\n      if (this.enabled()) {\n        this.measure();\n      }\n    });\n    afterNextRender(() => this.observeResize());\n    afterRenderEffect(() => {\n      const active = this.active();\n      const picked = this.pickedHere;\n      this.pickedHere = null;\n      if (picked !== active && this.enabled()) {\n        this.revealActiveTab();\n      }\n    });\n  }\n\n  notePicked(path: string): void {\n    if (path !== this.active()) {\n      this.pickedHere = path;\n    }\n  }\n\n  private observeResize(): void {\n    if (typeof ResizeObserver === 'undefined') {\n      return;\n    }\n    const observer = new ResizeObserver(() => this.enabled() && this.measure());\n    observer.observe(this.host.nativeElement);\n    this.destroyRef.onDestroy(() => observer.disconnect());\n  }\n\n  private measure(): void {\n    const element = this.host.nativeElement;\n    this.overflowingState.set(\n      element.scrollWidth - element.clientWidth > EDGE_TOLERANCE_PX,\n    );\n  }\n\n  private revealActiveTab(): void {\n    const strip = this.host.nativeElement;\n    const active = this.active();\n    const wrapper = strip.querySelector<HTMLElement>(\n      `[data-tab-path=\"${CSS.escape(active)}\"]`,\n    )?.parentElement;\n    if (!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","import { Service, Signal, signal, untracked } from '@angular/core';\nimport { Disposable, Toolbar, ToolbarCell } from '@loomweaver/plugin-sdk';\nimport { upsertBy, upsertById } from '../foundation/identified';\n\nexport interface RegisteredToolbar {\n  readonly toolbar: Toolbar;\n  readonly ownerId?: string;\n}\n\nconst ACTIONS_SLOT_SUFFIX = '/actions';\n\nexport function surfaceActionsSlot(surfaceId: string): string {\n  return `${surfaceId}${ACTIONS_SLOT_SUFFIX}`;\n}\n\nexport function surfaceOfActionsSlot(slot: string): string | undefined {\n  return slot.endsWith(ACTIONS_SLOT_SUFFIX) && slot.length > ACTIONS_SLOT_SUFFIX.length\n    ? slot.slice(0, -ACTIONS_SLOT_SUFFIX.length)\n    : undefined;\n}\n\n@Service()\nexport class ToolbarRegistry {\n  private readonly toolbarsSignal = signal<readonly RegisteredToolbar[]>([]);\n\n  private readonly cellsSignal = signal<readonly ToolbarCell[]>([]);\n\n  readonly toolbars: Signal<readonly RegisteredToolbar[]> =\n    this.toolbarsSignal.asReadonly();\n\n  readonly cells: Signal<readonly ToolbarCell[]> = this.cellsSignal.asReadonly();\n\n  addToolbar(toolbar: Toolbar, pluginId?: string): Disposable {\n    const taken = untracked(() =>\n      this.toolbarsSignal().find(\n        (entry) =>\n          entry.toolbar.slot === toolbar.slot && entry.ownerId !== pluginId,\n      ),\n    );\n    if (taken) {\n      console.warn(\n        `Toolbar slot '${toolbar.slot}' is already registered by ${ownerName(taken.ownerId)}; ` +\n          `the registration from ${ownerName(pluginId)} is refused.`,\n      );\n      return { dispose: () => undefined };\n    }\n    const entry: RegisteredToolbar = { toolbar, ownerId: pluginId };\n    this.toolbarsSignal.update((entries) =>\n      upsertBy(entries, entry, (existing) => existing.toolbar.slot === toolbar.slot),\n    );\n    return {\n      dispose: () =>\n        this.toolbarsSignal.update((entries) =>\n          entries.filter((existing) => existing !== entry),\n        ),\n    };\n  }\n\n  addCell(cell: ToolbarCell): Disposable {\n    this.cellsSignal.update((cells) => upsertById(cells, cell));\n    return {\n      dispose: () =>\n        this.cellsSignal.update((cells) =>\n          cells.filter((existing) => existing !== cell),\n        ),\n    };\n  }\n\n  ownerOf(slot: string): string | undefined {\n    return this.toolbars().find((entry) => entry.toolbar.slot === slot)?.ownerId;\n  }\n\n  titleOf(slot: string): string | undefined {\n    return this.toolbars().find((entry) => entry.toolbar.slot === slot)?.toolbar\n      .title;\n  }\n}\n\nexport function ownerName(pluginId: string | undefined): string {\n  return pluginId === undefined ? 'the workbench' : `plugin \"${pluginId}\"`;\n}\n","import { MenuContext } from '@loomweaver/plugin-sdk';\n\ntype ContextValue = string | number | boolean;\n\nfunction isContextValue(value: unknown): value is ContextValue {\n  return (\n    typeof value === 'string' ||\n    typeof value === 'number' ||\n    typeof value === 'boolean'\n  );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function menuContextOf(value: unknown): MenuContext | undefined {\n  if (!isRecord(value)) {\n    return undefined;\n  }\n  return Object.fromEntries(\n    Object.entries(value).filter((entry): entry is [string, ContextValue] =>\n      isContextValue(entry[1]),\n    ),\n  );\n}\n\nexport function requiredMenuContext(value: unknown, refusal: string): MenuContext {\n  if (!isRecord(value) || Object.values(value).some((raw) => !isContextValue(raw))) {\n    throw new TypeError(refusal);\n  }\n  return menuContextOf(value) as MenuContext;\n}\n","import { LwButtonSize, LwButtonVariant } from '@loomweaver/plugin-sdk';\n\nconst BUTTON_VARIANTS: Readonly<Record<LwButtonVariant, true>> = {\n  primary: true,\n  default: true,\n  success: true,\n  danger: true,\n  warning: true,\n  info: true,\n  ghost: true,\n};\n\nexport function isButtonVariant(value: unknown): value is LwButtonVariant {\n  return typeof value === 'string' && Object.hasOwn(BUTTON_VARIANTS, value);\n}\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 { LwButtonVariant, MenuContext } from '@loomweaver/plugin-sdk';\nimport { menuContextOf } from '../../foundation/wire/menu-context-of';\nimport { isButtonVariant, lwButtonClasses } from '../button/lw-button-classes';\nimport { LwToolbarEntry } from './toolbar-entry';\n\nexport const ENTRY_ATTRIBUTE = 'data-lw-entry';\n\nexport const FOLD_ATTRIBUTE = 'data-lw-fold';\n\nexport const CELL_ATTRIBUTE = 'data-lw-cell';\n\nexport const FOLDED_ATTRIBUTE = 'data-lw-folded';\n\nexport const CELL_ORDER_ATTRIBUTE = 'order';\n\nexport const TRAY_CLASS = 'lw-toolbar-tray';\n\nexport const SEPARATOR_CLASS = 'lw-toolbar-separator';\n\nexport const ENTRY_SELECTOR = `[${ENTRY_ATTRIBUTE}]`;\n\nexport const FOLD_SELECTOR = `[${FOLD_ATTRIBUTE}]`;\n\nexport const ENTRY_BUTTON_SELECTOR = `button${ENTRY_SELECTOR}`;\n\nexport const FOCUSABLE_SELECTOR = 'button, a[href], input, [tabindex]';\n\nexport interface RowItem {\n  readonly id: string;\n  readonly order: number;\n  readonly node: HTMLElement;\n  readonly group?: string;\n}\n\nlet counter = 0;\n\nexport function nextToolbarId(prefix: string): string {\n  counter += 1;\n  return `${prefix}-${counter}`;\n}\n\nexport function parseContext(raw: string | null): MenuContext {\n  if (!raw) {\n    return {};\n  }\n  try {\n    return menuContextOf(JSON.parse(raw)) ?? {};\n  } catch {\n    return {};\n  }\n}\n\nexport function orderOf(cell: HTMLElement): number {\n  const parsed = Number(cell.getAttribute(CELL_ORDER_ATTRIBUTE));\n  return Number.isFinite(parsed) ? parsed : 0;\n}\n\nexport function isCellNode(node: Node): node is HTMLElement {\n  return (\n    node instanceof HTMLElement &&\n    !node.hasAttribute(ENTRY_ATTRIBUTE) &&\n    !node.hasAttribute(FOLD_ATTRIBUTE) &&\n    !node.classList.contains(TRAY_CLASS) &&\n    !node.classList.contains(SEPARATOR_CLASS)\n  );\n}\n\nexport function cellIdOf(cell: HTMLElement): string {\n  let id = cell.getAttribute(CELL_ATTRIBUTE);\n  if (!id) {\n    id = nextToolbarId('cell');\n    cell.setAttribute(CELL_ATTRIBUTE, id);\n  }\n  return `cell:${id}`;\n}\n\nexport function reflectExpanded(\n  button: HTMLButtonElement,\n  openKey: string | null,\n): void {\n  if (!button.hasAttribute('aria-haspopup')) {\n    button.removeAttribute('aria-expanded');\n    return;\n  }\n  button.setAttribute(\n    'aria-expanded',\n    String(button.getAttribute(ENTRY_ATTRIBUTE) === openKey),\n  );\n}\n\nexport function entryButton(\n  entry: LwToolbarEntry,\n  existing: HTMLButtonElement | undefined,\n  openKey: string | null,\n): HTMLButtonElement {\n  const button = existing ?? document.createElement('button');\n  button.type = 'button';\n  button.setAttribute(ENTRY_ATTRIBUTE, entry.key);\n  const variant = isButtonVariant(entry.variant) ? entry.variant : undefined;\n  const labelled = !entry.icon || variant === 'primary';\n  button.className = entryClasses(variant, labelled);\n  button.disabled = entry.disabled === true;\n  button.setAttribute('aria-label', entry.label);\n  if (entry.pressed === undefined) {\n    button.removeAttribute('aria-pressed');\n  } else {\n    button.setAttribute('aria-pressed', String(entry.pressed));\n  }\n  if (entry.opensMenu) {\n    button.setAttribute('aria-haspopup', 'menu');\n  } else {\n    button.removeAttribute('aria-haspopup');\n  }\n  reflectExpanded(button, openKey);\n  button.replaceChildren(\n    ...(labelled || !entry.icon ? labelledContent(entry) : iconContent(entry, entry.icon)),\n  );\n  return button;\n}\n\nfunction entryClasses(variant: LwButtonVariant | undefined, labelled: boolean): string {\n  if (variant) {\n    return [\n      'lw-toolbar-entry',\n      'lw-toolbar-entry--button',\n      ...lwButtonClasses(variant, 'md', !labelled),\n    ].join(' ');\n  }\n  return labelled ? 'lw-toolbar-entry lw-toolbar-entry--text' : 'lw-icon-btn lw-toolbar-entry';\n}\n\nfunction icon(name: string, size: string): HTMLElement {\n  const element = document.createElement('lw-icon');\n  element.setAttribute('name', name);\n  element.setAttribute('size', size);\n  return element;\n}\n\nfunction iconContent(entry: LwToolbarEntry, name: string): HTMLElement[] {\n  const tooltip = document.createElement('lw-tooltip');\n  tooltip.setAttribute(\n    'text',\n    entry.shortcut ? `${entry.label} (${entry.shortcut})` : entry.label,\n  );\n  tooltip.setAttribute('position', 'bottom');\n  return [icon(name, '1rem'), tooltip];\n}\n\nfunction labelledContent(entry: LwToolbarEntry): HTMLElement[] {\n  const content: HTMLElement[] = [];\n  if (entry.icon) {\n    content.push(icon(entry.icon, '1rem'));\n  }\n  const text = document.createElement('span');\n  text.textContent = entry.label;\n  content.push(text);\n  if (entry.shortcut) {\n    const shortcut = document.createElement('kbd');\n    shortcut.className = 'lw-toolbar-shortcut';\n    shortcut.setAttribute('aria-hidden', 'true');\n    shortcut.textContent = entry.shortcut;\n    content.push(shortcut);\n  }\n  if (entry.opensMenu) {\n    const chevron = icon('chevronDown', '0.875rem');\n    chevron.setAttribute('aria-hidden', 'true');\n    content.push(chevron);\n  }\n  return content;\n}\n\nexport function separator(): HTMLElement {\n  const element = document.createElement('span');\n  element.className = SEPARATOR_CLASS;\n  element.setAttribute('role', 'separator');\n  element.setAttribute('aria-orientation', 'vertical');\n  return element;\n}\n\nexport function foldControl(label: string, anchorName: string): HTMLButtonElement {\n  const control = document.createElement('button');\n  control.type = 'button';\n  control.setAttribute(FOLD_ATTRIBUTE, '');\n  control.className = 'lw-icon-btn lw-toolbar-entry';\n  control.setAttribute('aria-label', label);\n  control.setAttribute('aria-haspopup', 'true');\n  control.style.setProperty('anchor-name', anchorName);\n  const icon = document.createElement('lw-icon');\n  icon.setAttribute('name', 'more');\n  icon.setAttribute('size', '1rem');\n  control.append(icon);\n  return control;\n}\n\nexport function tray(label: string, anchorName: string): HTMLElement {\n  const element = document.createElement('div');\n  element.className = TRAY_CLASS;\n  element.setAttribute('role', 'group');\n  element.setAttribute('aria-label', label);\n  element.style.setProperty('position-anchor', anchorName);\n  element.hidden = true;\n  return element;\n}\n\nexport function focusStopsOf(children: HTMLCollection): HTMLElement[] {\n  const stops: HTMLElement[] = [];\n  for (const child of children) {\n    if (child instanceof HTMLButtonElement) {\n      if (!child.disabled) {\n        stops.push(child);\n      }\n      continue;\n    }\n    if (!(child instanceof HTMLElement) || child.classList.contains(TRAY_CLASS)) {\n      continue;\n    }\n    const inner = child.matches(FOCUSABLE_SELECTOR)\n      ? child\n      : child.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);\n    if (inner) {\n      stops.push(inner);\n    }\n  }\n  return stops;\n}\n","import { entryWidth, FOLD_CONTROL_PX, foldedIds, sameIds } from '../row-fold';\nimport {\n  FOCUSABLE_SELECTOR,\n  FOLD_SELECTOR,\n  FOLDED_ATTRIBUTE,\n  foldControl,\n  RowItem,\n  SEPARATOR_CLASS,\n  separator,\n  tray,\n  TRAY_CLASS,\n} from './toolbar-dom';\n\nconst GAP_PX = 2;\n\nexport class ToolbarLayout {\n  private folded: readonly string[] = [];\n\n  private trayOpen = false;\n\n  private readonly widths = new Map<string, number>();\n\n  constructor(\n    private readonly host: HTMLElement,\n    private readonly anchorName: string,\n    private readonly onTrayChange: (open: boolean) => void,\n  ) {}\n\n  isTrayOpen(): boolean {\n    return this.trayOpen;\n  }\n\n  foldControl(): HTMLButtonElement | null {\n    return this.host.querySelector<HTMLButtonElement>(`:scope > ${FOLD_SELECTOR}`);\n  }\n\n  tray(): HTMLElement | null {\n    return this.host.querySelector<HTMLElement>(`:scope > .${TRAY_CLASS}`);\n  }\n\n  relabel(label: string): void {\n    this.foldControl()?.setAttribute('aria-label', label);\n    this.tray()?.setAttribute('aria-label', label);\n  }\n\n  layOut(items: readonly RowItem[], moreLabel: string): void {\n    const folded = new Set(this.folded);\n    const row = items.filter((item) => !folded.has(item.id));\n    const away = items.filter((item) => folded.has(item.id));\n    for (const old of this.host.querySelectorAll(`:scope > .${SEPARATOR_CLASS}`)) {\n      old.remove();\n    }\n    let cursor: ChildNode | null = this.host.firstChild;\n    let previousGroup: string | undefined;\n    for (const [index, item] of row.entries()) {\n      if (index > 0 && this.startsNewGroup(item, previousGroup)) {\n        this.host.insertBefore(separator(), cursor);\n      }\n      if (item.node === cursor) {\n        cursor = cursor.nextSibling;\n      } else {\n        this.host.insertBefore(item.node, cursor);\n      }\n      item.node.removeAttribute(FOLDED_ATTRIBUTE);\n      previousGroup = item.group ?? previousGroup;\n    }\n    this.layOutFold(away, cursor, moreLabel);\n  }\n\n  measure(items: readonly RowItem[], moreLabel: string): void {\n    const available = this.host.clientWidth;\n    if (available <= 0 || items.length === 0) {\n      return;\n    }\n    for (const item of items) {\n      const width = entryWidth(item.node);\n      if (width > 0) {\n        this.widths.set(item.id, width);\n      }\n    }\n    const folded = foldedIds([...items].toReversed(), {\n      available,\n      control: this.foldControl()?.getBoundingClientRect().width || FOLD_CONTROL_PX,\n      gap: GAP_PX,\n      widthOf: (id) => this.widths.get(id),\n    });\n    if (sameIds(folded, this.folded)) {\n      return;\n    }\n\n    this.folded = folded;\n    this.layOut(items, moreLabel);\n  }\n\n  toggleTray(): void {\n    if (this.trayOpen) {\n      this.closeTray();\n    } else {\n      this.openTray();\n    }\n  }\n\n  openTray(): void {\n    const tray = this.tray();\n    const control = this.foldControl();\n    if (!tray || !control) {\n      return;\n    }\n    this.trayOpen = true;\n    tray.hidden = false;\n    control.setAttribute('aria-expanded', 'true');\n    this.onTrayChange(true);\n    (tray.querySelector<HTMLElement>(FOCUSABLE_SELECTOR) ?? tray).focus?.();\n  }\n\n  closeTray(): void {\n    if (!this.trayOpen) {\n      return;\n    }\n    this.trayOpen = false;\n    const tray = this.tray();\n    if (tray) {\n      tray.hidden = true;\n    }\n    this.foldControl()?.setAttribute('aria-expanded', 'false');\n    this.onTrayChange(false);\n  }\n\n  private startsNewGroup(item: RowItem, previousGroup: string | undefined): boolean {\n    return (\n      item.group !== undefined &&\n      previousGroup !== undefined &&\n      item.group !== previousGroup\n    );\n  }\n\n  private layOutFold(\n    away: readonly RowItem[],\n    cursor: ChildNode | null,\n    moreLabel: string,\n  ): void {\n    let control = this.foldControl();\n    let trayElement = this.tray();\n    if (away.length === 0) {\n      control?.remove();\n      trayElement?.remove();\n      this.trayOpen = false;\n      return;\n    }\n    control ??= foldControl(moreLabel, this.anchorName);\n    trayElement ??= tray(moreLabel, this.anchorName);\n    if (control !== cursor) {\n      this.host.insertBefore(control, cursor);\n    }\n    this.host.append(trayElement);\n    for (const item of away) {\n      item.node.setAttribute(FOLDED_ATTRIBUTE, '');\n      trayElement.append(item.node);\n    }\n    trayElement.hidden = !this.trayOpen;\n    control.setAttribute('aria-expanded', String(this.trayOpen));\n  }\n}\n","import type { LwToolbarElement } from './lw-toolbar.element';\n\nexport interface LwToolbarHost {\n  attach(toolbar: LwToolbarElement): void;\n  changed(toolbar: LwToolbarElement): void;\n  detach(toolbar: LwToolbarElement): void;\n}\n\nlet host: LwToolbarHost | undefined;\n\nconst connected = new Set<LwToolbarElement>();\n\nexport function installedLwToolbarHost(): LwToolbarHost | undefined {\n  return host;\n}\n\nexport function installLwToolbarHost(next: LwToolbarHost | undefined): void {\n  for (const toolbar of connected) {\n    host?.detach(toolbar);\n  }\n  host = next;\n  for (const toolbar of connected) {\n    next?.attach(toolbar);\n  }\n}\n\nexport function toolbarConnected(toolbar: LwToolbarElement): void {\n  connected.add(toolbar);\n  host?.attach(toolbar);\n}\n\nexport function toolbarChanged(toolbar: LwToolbarElement): void {\n  if (connected.has(toolbar)) {\n    host?.changed(toolbar);\n  }\n}\n\nexport function toolbarDisconnected(toolbar: LwToolbarElement): void {\n  connected.delete(toolbar);\n  host?.detach(toolbar);\n}\n","import { MenuContext } from '@loomweaver/plugin-sdk';\nimport { defineElementOnce, reflectAttribute, upgradeElementProperty } from '../custom-elements';\nimport { focusAndReveal, rovingStep, rovingTabIndex } from '../roving-focus';\nimport { closeOnOutsidePointer } from '../row-fold';\nimport {\n  cellIdOf,\n  ENTRY_ATTRIBUTE,\n  ENTRY_BUTTON_SELECTOR,\n  ENTRY_SELECTOR,\n  entryButton,\n  FOLD_SELECTOR,\n  focusStopsOf,\n  isCellNode,\n  nextToolbarId,\n  orderOf,\n  parseContext,\n  reflectExpanded,\n  RowItem,\n} from './toolbar-dom';\nimport { LwToolbarEntry } from './toolbar-entry';\nimport { ToolbarLayout } from './toolbar-layout';\nimport {\n  toolbarChanged,\n  toolbarConnected,\n  toolbarDisconnected,\n} from './toolbar-bridge';\n\nexport const LW_TOOLBAR_TAG = 'lw-toolbar';\n\nexport const LW_TOOLBAR_SELECT = 'lw-toolbar-select';\n\nexport const LW_TOOLBAR_CONTEXT = 'lw-toolbar-context';\n\nexport type LwToolbarSize = 'sm' | 'md';\n\nexport type { LwToolbarEntry } from './toolbar-entry';\n\nexport interface LwToolbarSelectDetail {\n  readonly key: string;\n  readonly trigger: HTMLElement;\n}\n\nexport interface LwToolbarContextDetail {\n  readonly key: string;\n  readonly x: number;\n  readonly y: number;\n}\n\nexport class LwToolbarElement extends HTMLElement {\n  static readonly observedAttributes = ['menu', 'context', 'label', 'size'];\n\n  private entriesValue: readonly LwToolbarEntry[] = [];\n\n  private contextValue: MenuContext | undefined;\n\n  private openKeyValue: string | null = null;\n\n  private moreLabelValue = 'More';\n\n  private accessibleNameValue: string | null = null;\n\n  private active = 0;\n\n  private rendering = false;\n\n  private connecting = false;\n\n  private observer?: ResizeObserver;\n\n  private childObserver?: MutationObserver;\n\n  private stopOutside?: () => void;\n\n  private readonly layout = new ToolbarLayout(\n    this,\n    nextToolbarId('--lw-toolbar-fold'),\n    (open) => this.listenOutside(open),\n  );\n\n  get menu(): string | null {\n    return this.getAttribute('menu');\n  }\n\n  set menu(value: string | null) {\n    reflectAttribute(this, 'menu', value);\n  }\n\n  get label(): string | null {\n    return this.getAttribute('label');\n  }\n\n  set label(value: string | null) {\n    reflectAttribute(this, 'label', value);\n  }\n\n  get size(): LwToolbarSize {\n    return this.getAttribute('size') === 'sm' ? 'sm' : 'md';\n  }\n\n  set size(value: LwToolbarSize | null) {\n    reflectAttribute(this, 'size', value);\n  }\n\n  get context(): MenuContext {\n    return this.contextValue ?? parseContext(this.getAttribute('context'));\n  }\n\n  set context(value: MenuContext | undefined) {\n    this.contextValue = value;\n    toolbarChanged(this);\n  }\n\n  get entries(): readonly LwToolbarEntry[] {\n    return this.entriesValue;\n  }\n\n  set entries(value: readonly LwToolbarEntry[]) {\n    this.entriesValue = value;\n    this.refresh();\n  }\n\n  get openKey(): string | null {\n    return this.openKeyValue;\n  }\n\n  set openKey(value: string | null) {\n    this.openKeyValue = value;\n    for (const button of this.entryButtons()) {\n      reflectExpanded(button, value);\n    }\n  }\n\n  get moreLabel(): string {\n    return this.moreLabelValue;\n  }\n\n  set moreLabel(value: string) {\n    this.moreLabelValue = value;\n    this.layout.relabel(value);\n  }\n\n  get accessibleName(): string | null {\n    return this.accessibleNameValue;\n  }\n\n  set accessibleName(value: string | null) {\n    this.accessibleNameValue = value;\n    this.reflectName();\n  }\n\n  connectedCallback(): void {\n    for (const name of ['menu', 'label', 'size', 'context', 'entries', 'openKey', 'moreLabel', 'accessibleName']) {\n      upgradeElementProperty(this, name);\n    }\n    this.setAttribute('role', 'toolbar');\n    this.setAttribute('aria-orientation', 'horizontal');\n    this.classList.add('lw-toolbar');\n    this.addEventListener('click', this.onClick);\n    this.addEventListener('contextmenu', this.onContextMenu);\n    this.addEventListener('keydown', this.onKeydown);\n    this.connecting = true;\n    try {\n      this.observe();\n      this.render();\n      toolbarConnected(this);\n    } finally {\n      this.connecting = false;\n    }\n  }\n\n  disconnectedCallback(): void {\n    toolbarDisconnected(this);\n    this.removeEventListener('click', this.onClick);\n    this.removeEventListener('contextmenu', this.onContextMenu);\n    this.removeEventListener('keydown', this.onKeydown);\n    this.observer?.disconnect();\n    this.observer = undefined;\n    this.childObserver?.disconnect();\n    this.childObserver = undefined;\n    this.layout.closeTray();\n  }\n\n  attributeChangedCallback(name: string): void {\n    if (!this.isConnected) {\n      return;\n    }\n    if (name === 'label') {\n      this.accessibleNameValue = null;\n      this.reflectName();\n      toolbarChanged(this);\n      return;\n    }\n    if (name === 'size') {\n      this.classList.toggle('lw-toolbar--sm', this.size === 'sm');\n      return;\n    }\n    toolbarChanged(this);\n  }\n\n  refresh(): void {\n    if (this.isConnected) {\n      this.render();\n    }\n  }\n\n  buttonOf(key: string): HTMLButtonElement | null {\n    return this.querySelector<HTMLButtonElement>(\n      `button[data-lw-entry=\"${CSS.escape(key)}\"]`,\n    );\n  }\n\n  private readonly onClick = (event: MouseEvent): void => {\n    const target = event.target as HTMLElement | null;\n    if (target?.closest(FOLD_SELECTOR)) {\n      this.layout.toggleTray();\n      return;\n    }\n    const button = target?.closest<HTMLButtonElement>(ENTRY_SELECTOR);\n    if (!button || button.disabled || !this.contains(button)) {\n      return;\n    }\n    this.dispatchEvent(\n      new CustomEvent<LwToolbarSelectDetail>(LW_TOOLBAR_SELECT, {\n        detail: { key: button.getAttribute(ENTRY_ATTRIBUTE) ?? '', trigger: button },\n        bubbles: true,\n      }),\n    );\n  };\n\n  private readonly onContextMenu = (event: MouseEvent): void => {\n    const button = (event.target as HTMLElement | null)?.closest<HTMLButtonElement>(\n      ENTRY_SELECTOR,\n    );\n    const key = button?.getAttribute(ENTRY_ATTRIBUTE) ?? null;\n    const entry = this.entriesValue.find((candidate) => candidate.key === key);\n    if (!button || !entry?.hasContextMenu) {\n      return;\n    }\n    event.preventDefault();\n    event.stopPropagation();\n    this.dispatchEvent(\n      new CustomEvent<LwToolbarContextDetail>(LW_TOOLBAR_CONTEXT, {\n        detail: { key: entry.key, x: event.clientX, y: event.clientY },\n        bubbles: true,\n      }),\n    );\n  };\n\n  private readonly onKeydown = (event: KeyboardEvent): void => {\n    if (event.key === 'Escape' && this.layout.isTrayOpen()) {\n      this.layout.closeTray();\n      this.layout.foldControl()?.focus();\n      event.preventDefault();\n      return;\n    }\n    const stops = focusStopsOf(this.children);\n    if (stops.length === 0) {\n      return;\n    }\n    const current = stops.indexOf(document.activeElement as HTMLElement);\n    const index = current === -1 ? this.active : current;\n    const next = rovingStep(event.key, index, stops.length, 'horizontal');\n    if (next === undefined) {\n      return;\n    }\n    this.active = next;\n    rovingTabIndex(stops, next);\n    focusAndReveal(stops[next]);\n    event.preventDefault();\n  };\n\n  private listenOutside(open: boolean): void {\n    this.stopOutside?.();\n    this.stopOutside = open\n      ? closeOnOutsidePointer(\n          document,\n          (target) => this.contains(target),\n          () => this.layout.closeTray(),\n        )\n      : undefined;\n  }\n\n  private render(): void {\n    this.rendering = true;\n    try {\n      this.draw();\n    } finally {\n      this.rendering = false;\n    }\n  }\n\n  private draw(): void {\n    const buttons = new Map(\n      this.entryButtons().map((button) => [button.getAttribute(ENTRY_ATTRIBUTE) ?? '', button]),\n    );\n    const items = this.rowItems((entry) =>\n      entryButton(entry, buttons.get(entry.key), this.openKeyValue),\n    );\n    for (const [key, button] of buttons) {\n      if (this.entriesValue.every((entry) => entry.key !== key)) {\n        button.remove();\n      }\n    }\n    this.layout.layOut(items, this.moreLabelValue);\n    this.reflectName();\n    this.classList.toggle('lw-toolbar--sm', this.size === 'sm');\n    this.toggleAttribute('hidden', items.length === 0);\n    if (!this.connecting) {\n      this.layout.measure(items, this.moreLabelValue);\n    }\n    this.roveFocus();\n  }\n\n  private rowItems(nodeOf: (entry: LwToolbarEntry) => HTMLElement | null): RowItem[] {\n    const sorted = [...this.entriesValue].toSorted((a, b) => (a.order ?? 0) - (b.order ?? 0));\n    const entries = sorted.flatMap((entry) => {\n      const node = nodeOf(entry);\n      return node ? [{ id: entry.key, order: entry.order ?? 0, group: entry.group, node }] : [];\n    });\n    const cells = this.cells().map((cell) => ({\n      id: cellIdOf(cell),\n      order: orderOf(cell),\n      node: cell,\n    }));\n    return [...entries, ...cells].toSorted((a, b) => a.order - b.order);\n  }\n\n  private entryButtons(): HTMLButtonElement[] {\n    return [...this.querySelectorAll<HTMLButtonElement>(ENTRY_BUTTON_SELECTOR)];\n  }\n\n  private cells(): HTMLElement[] {\n    return [...this.children, ...(this.layout.tray()?.children ?? [])].filter(\n      (child) => isCellNode(child),\n    );\n  }\n\n  private reflectName(): void {\n    reflectAttribute(this, 'aria-label', this.accessibleNameValue ?? this.label);\n  }\n\n  private roveFocus(): void {\n    const stops = focusStopsOf(this.children);\n    if (stops.length === 0) {\n      return;\n    }\n    this.active = Math.min(this.active, stops.length - 1);\n    rovingTabIndex(stops, this.active);\n  }\n\n  private observe(): void {\n    if (typeof ResizeObserver !== 'undefined') {\n      this.observer = new ResizeObserver(() => this.remeasure());\n      this.observer.observe(this);\n    }\n    if (typeof MutationObserver === 'undefined') {\n      return;\n    }\n\n    this.childObserver = new MutationObserver((mutations) => this.onChildren(mutations));\n    this.childObserver.observe(this, { childList: true });\n  }\n\n  private remeasure(): void {\n    this.rendering = true;\n    try {\n      this.layout.measure(\n        this.rowItems((entry) => this.buttonOf(entry.key)),\n        this.moreLabelValue,\n      );\n      this.roveFocus();\n    } finally {\n      this.rendering = false;\n    }\n  }\n\n  private onChildren(mutations: readonly MutationRecord[]): void {\n    if (this.rendering) {\n      return;\n    }\n    const foreign = mutations.some((mutation) =>\n      [...mutation.addedNodes, ...mutation.removedNodes].some((node) => isCellNode(node)),\n    );\n    if (foreign) {\n      this.render();\n    }\n  }\n}\n\n/** Registers `<lw-toolbar>` once (idempotent), called from {@link provideShell} at bootstrap. */\nexport function defineLwToolbar(): void {\n  defineElementOnce(LW_TOOLBAR_TAG, LwToolbarElement);\n}\n","import {\n  LwButtonVariant,\n  MenuContext,\n  MenuItem,\n  ViewAction,\n} from '@loomweaver/plugin-sdk';\nimport { SlotEntry } from '../../menu/menu-resolution';\n\nexport interface ToolbarEntry extends SlotEntry {\n  readonly id: string;\n  readonly source: MenuItem | ViewAction;\n  readonly variant?: LwButtonVariant;\n  readonly ownerId?: string;\n}\n\nexport function entryOfAction(action: ViewAction): ToolbarEntry {\n  return {\n    id: action.id,\n    title: action.title,\n    icon: action.icon,\n    pressed: action.pressed,\n    access: action.access,\n    order: action.order,\n    command: action.command,\n    run: action.run === undefined ? undefined : () => action.run?.(),\n    menu: action.menu,\n    menuTrigger: action.menuTrigger,\n    menuHeader: action.menuHeader,\n    source: action,\n  };\n}\n\nexport function entryOfMenuItem(\n  item: MenuItem,\n  index: number,\n  ownerId?: string,\n): ToolbarEntry {\n  return {\n    id: item.id ?? `${item.menu}#${item.command ?? index}`,\n    title: item.title,\n    icon: item.icon,\n    access: item.access,\n    group: item.group,\n    order: item.order,\n    when: item.when,\n    checkedWhen: item.checkedWhen,\n    command: item.command,\n    run:\n      item.run === undefined\n        ? undefined\n        : (context?: MenuContext) => item.run?.(context),\n    submenu: item.submenu,\n    menuHeader: item.menuHeader,\n    source: item,\n    variant: item.variant,\n    ownerId,\n  };\n}\n","import { inject, Service } from '@angular/core';\nimport { LwButtonVariant, MenuContext } from '@loomweaver/plugin-sdk';\nimport { CommandService } from '../../commands/command.service';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport {\n  ownerName,\n  surfaceOfActionsSlot,\n  ToolbarRegistry,\n} from '../../contributions/toolbar-registry';\nimport { isButtonVariant } from '../../elements/button/lw-button-classes';\nimport { LwToolbarEntry } from '../../elements/toolbar/lw-toolbar.element';\nimport { Wording } from '../../i18n/wording';\nimport { menuOnContext } from '../../menu/chrome-item-menu';\nimport { ResolvedEntry } from '../../menu/menu-resolution';\nimport { SlotResolution } from '../../menu/slot-resolution.service';\nimport {\n  entryOfAction,\n  entryOfMenuItem,\n  ToolbarEntry,\n} from './toolbar-entries';\n\nexport const MORE_KEY = 'bar.more';\n\nexport interface ToolbarSlotView {\n  readonly resolved: readonly ResolvedEntry<ToolbarEntry>[];\n  readonly entries: readonly LwToolbarEntry[];\n  readonly label: string;\n  readonly moreLabel: string;\n}\n\n@Service()\nexport class ToolbarSlots {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly toolbars = inject(ToolbarRegistry);\n\n  private readonly slots = inject(SlotResolution);\n\n  private readonly commands = inject(CommandService);\n\n  private readonly wording = inject(Wording);\n\n  private readonly reported = new Set<string>();\n\n  view(slot: string, context: MenuContext, label?: string | null): ToolbarSlotView {\n    const resolved = this.slots.resolve(this.entriesOf(slot), (entry) =>\n      this.contextFor(entry, context),\n    );\n    return {\n      resolved,\n      entries: resolved.map((entry) => this.drawn(entry, slot)),\n      label: this.wording.translate(label || (this.toolbars.titleOf(slot) ?? '')),\n      moreLabel: this.wording.translate(MORE_KEY),\n    };\n  }\n\n  contextFor(entry: ToolbarEntry, context: MenuContext): MenuContext {\n    return { ...context, id: entry.id };\n  }\n\n  run(entry: ResolvedEntry<ToolbarEntry>, context: MenuContext): void {\n    if (!entry.disabled) {\n      this.commands.trigger(entry.item, this.contextFor(entry.item, context));\n    }\n  }\n\n  private entriesOf(slot: string): ToolbarEntry[] {\n    const surfaceId = surfaceOfActionsSlot(slot);\n    const actions =\n      surfaceId === undefined\n        ? []\n        : this.registry.actionsOf(surfaceId).map((action) => entryOfAction(action));\n    const items = this.registry\n      .registeredMenuItems()\n      .filter((entry) => entry.item.menu === slot)\n      .map((entry, index) => entryOfMenuItem(entry.item, index, entry.ownerId));\n    return [...actions, ...items];\n  }\n\n  private drawn(entry: ResolvedEntry<ToolbarEntry>, slot: string): LwToolbarEntry {\n    return {\n      key: entry.item.id,\n      label: this.wording.translate(entry.title ?? ''),\n      group: entry.group,\n      order: entry.order,\n      icon: entry.icon,\n      shortcut: entry.shortcut,\n      pressed: entry.pressed,\n      disabled: entry.disabled,\n      opensMenu: entry.opensMenu !== undefined,\n      hasContextMenu: menuOnContext(entry.item) !== undefined,\n      variant: this.variantOf(entry.item, slot),\n    };\n  }\n\n  private variantOf(entry: ToolbarEntry, slot: string): LwButtonVariant | undefined {\n    const asked: unknown = entry.variant;\n    if (asked === undefined) {\n      return undefined;\n    }\n    if (!isButtonVariant(asked)) {\n      this.reportOnce(\n        `${slot}\\u{0}${entry.id}\\u{0}unknown`,\n        `Toolbar entry '${entry.id}' in slot '${slot}' names ${describedVariant(asked)}, ` +\n          'which no button has; it is drawn without a variant.',\n      );\n      return undefined;\n    }\n    if (asked !== 'primary') {\n      return asked;\n    }\n    const owner = this.ownerOf(slot);\n    if (owner !== undefined && entry.ownerId === owner) {\n      return asked;\n    }\n    this.reportOnce(\n      `${slot}\\u{0}${entry.id}\\u{0}primary`,\n      `Toolbar entry '${entry.id}' from ${ownerName(entry.ownerId)} asks for 'primary' in slot ` +\n        `'${slot}', which belongs to ${ownerName(owner)}; only the slot's owner draws a primary ` +\n        'entry, so it is drawn without a variant.',\n    );\n    return undefined;\n  }\n\n  private ownerOf(slot: string): string | undefined {\n    const surfaceId = surfaceOfActionsSlot(slot);\n    return surfaceId === undefined\n      ? this.toolbars.ownerOf(slot)\n      : this.registry.ownerOfSurface(surfaceId);\n  }\n\n  private reportOnce(key: string, message: string): void {\n    if (this.reported.has(key)) {\n      return;\n    }\n    this.reported.add(key);\n    console.warn(message);\n  }\n}\n\nfunction describedVariant(asked: unknown): string {\n  if (typeof asked === 'string') {\n    return `the variant '${asked}'`;\n  }\n  return `a variant of type ${asked === null ? 'null' : typeof asked}`;\n}\n","import {\n  ApplicationRef,\n  ComponentRef,\n  createComponent,\n  DestroyRef,\n  effect,\n  EffectRef,\n  EnvironmentInjector,\n  inject,\n  Injector,\n  Service,\n  untracked,\n} from '@angular/core';\nimport { MenuContext, TOOLBAR_CONTEXT, ToolbarCell } from '@loomweaver/plugin-sdk';\nimport { AuthContext } from '../../auth/auth-context';\nimport { ToolbarRegistry } from '../../contributions/toolbar-registry';\nimport {\n  LW_TOOLBAR_CONTEXT,\n  LW_TOOLBAR_SELECT,\n  LwToolbarContextDetail,\n  LwToolbarElement,\n  LwToolbarSelectDetail,\n} from '../../elements/toolbar/lw-toolbar.element';\nimport {\n  installedLwToolbarHost,\n  installLwToolbarHost,\n  LwToolbarHost,\n} from '../../elements/toolbar/toolbar-bridge';\nimport { CELL_ATTRIBUTE } from '../../elements/toolbar/toolbar-dom';\nimport { menuOnContext } from '../../menu/chrome-item-menu';\nimport { ResolvedEntry } from '../../menu/menu-resolution';\nimport { MenuService } from '../../menu/menu.service';\nimport { ToolbarEntry } from './toolbar-entries';\nimport { ToolbarSlots } from './toolbar-slots.service';\n\ninterface MountedCell {\n  readonly ref: ComponentRef<unknown>;\n  readonly cell: ToolbarCell;\n  readonly context: MenuContext;\n}\n\ninterface Attachment {\n  readonly cells: Map<string, MountedCell>;\n  readonly effect: EffectRef;\n  readonly onSelect: (event: Event) => void;\n  readonly onContext: (event: Event) => void;\n  resolved: readonly ResolvedEntry<ToolbarEntry>[];\n}\n\n@Service()\nexport class ToolbarHost implements LwToolbarHost {\n  private readonly toolbars = inject(ToolbarRegistry);\n\n  private readonly slots = inject(ToolbarSlots);\n\n  private readonly menus = inject(MenuService);\n\n  private readonly auth = inject(AuthContext);\n\n  private readonly injector = inject(EnvironmentInjector);\n\n  private readonly appRef = inject(ApplicationRef);\n\n  private readonly attachments = new Map<LwToolbarElement, Attachment>();\n\n  constructor() {\n    installLwToolbarHost(this);\n    inject(DestroyRef).onDestroy(() => {\n      if (installedLwToolbarHost() === this) {\n        installLwToolbarHost(undefined);\n      }\n    });\n  }\n\n  attach(toolbar: LwToolbarElement): void {\n    if (this.attachments.has(toolbar)) {\n      return;\n    }\n    const attachment: Attachment = {\n      cells: new Map(),\n      resolved: [],\n      onSelect: (event) =>\n        this.select(toolbar, (event as CustomEvent<LwToolbarSelectDetail>).detail),\n      onContext: (event) =>\n        this.openContextMenu(\n          toolbar,\n          (event as CustomEvent<LwToolbarContextDetail>).detail,\n        ),\n      effect: effect(() => this.draw(toolbar), { injector: this.injector }),\n    };\n    toolbar.addEventListener(LW_TOOLBAR_SELECT, attachment.onSelect);\n    toolbar.addEventListener(LW_TOOLBAR_CONTEXT, attachment.onContext);\n    this.attachments.set(toolbar, attachment);\n    untracked(() => this.draw(toolbar));\n  }\n\n  changed(toolbar: LwToolbarElement): void {\n    if (this.attachments.has(toolbar)) {\n      untracked(() => this.draw(toolbar));\n    }\n  }\n\n  detach(toolbar: LwToolbarElement): void {\n    const attachment = this.attachments.get(toolbar);\n    if (!attachment) {\n      return;\n    }\n    this.attachments.delete(toolbar);\n    attachment.effect.destroy();\n    toolbar.removeEventListener(LW_TOOLBAR_SELECT, attachment.onSelect);\n    toolbar.removeEventListener(LW_TOOLBAR_CONTEXT, attachment.onContext);\n    for (const mounted of attachment.cells.values()) {\n      mounted.ref.destroy();\n    }\n    attachment.cells.clear();\n  }\n\n  private draw(toolbar: LwToolbarElement): void {\n    const attachment = this.attachments.get(toolbar);\n    const slot = toolbar.menu;\n    if (!attachment || !slot) {\n      return;\n    }\n    const context = toolbar.context;\n    const view = this.slots.view(slot, context, toolbar.getAttribute('label'));\n    attachment.resolved = view.resolved;\n    toolbar.entries = view.entries;\n    toolbar.moreLabel = view.moreLabel;\n    toolbar.accessibleName = view.label;\n    toolbar.openKey = this.openKeyOf(toolbar, view.resolved);\n    this.drawCells(toolbar, attachment, slot, context);\n  }\n\n  private openKeyOf(\n    toolbar: LwToolbarElement,\n    resolved: readonly ResolvedEntry<ToolbarEntry>[],\n  ): string | null {\n    const trigger = this.menus.openTrigger();\n    if (!trigger || !toolbar.contains(trigger)) {\n      return null;\n    }\n    return (\n      resolved.find((entry) => toolbar.buttonOf(entry.item.id) === trigger)\n        ?.item.id ?? null\n    );\n  }\n\n  private drawCells(\n    toolbar: LwToolbarElement,\n    attachment: Attachment,\n    slot: string,\n    context: MenuContext,\n  ): void {\n    const wanted = this.toolbars\n      .cells()\n      .filter((cell) => cell.slot === slot && this.auth.visible(cell.access));\n    let changed = false;\n    for (const [id, mounted] of attachment.cells) {\n      if (wanted.includes(mounted.cell) && sameContext(mounted.context, context)) {\n        continue;\n      }\n      mounted.ref.destroy();\n      attachment.cells.delete(id);\n      changed = true;\n    }\n    for (const cell of wanted) {\n      if (attachment.cells.has(cell.id)) {\n        continue;\n      }\n      attachment.cells.set(cell.id, {\n        ref: this.mountCell(toolbar, cell, slot, context),\n        cell,\n        context,\n      });\n      changed = true;\n    }\n    if (changed) {\n      toolbar.refresh();\n    }\n  }\n\n  private mountCell(\n    toolbar: LwToolbarElement,\n    cell: ToolbarCell,\n    slot: string,\n    context: MenuContext,\n  ): ComponentRef<unknown> {\n    const ref = createComponent(cell.component, {\n      environmentInjector: this.injector,\n      elementInjector: Injector.create({\n        parent: this.injector,\n        providers: [{ provide: TOOLBAR_CONTEXT, useValue: { slot, context } }],\n      }),\n    });\n    const host = ref.location.nativeElement as HTMLElement;\n    host.setAttribute(CELL_ATTRIBUTE, cell.id);\n    host.setAttribute('order', String(cell.order ?? 0));\n    toolbar.append(host);\n    this.appRef.attachView(ref.hostView);\n    ref.changeDetectorRef.detectChanges();\n    return ref;\n  }\n\n  private select(toolbar: LwToolbarElement, detail: LwToolbarSelectDetail): void {\n    const attachment = this.attachments.get(toolbar);\n    const entry = attachment?.resolved.find((candidate) => candidate.item.id === detail.key);\n    if (!entry || entry.disabled) {\n      return;\n    }\n    const context = toolbar.context;\n    if (entry.opensMenu !== undefined) {\n      this.menus.open(\n        entry.opensMenu,\n        this.slots.contextFor(entry.item, context),\n        { rect: detail.trigger.getBoundingClientRect(), side: 'bottom' },\n        { trigger: detail.trigger, header: entry.item.menuHeader },\n      );\n      this.changed(toolbar);\n      return;\n    }\n    this.slots.run(entry, context);\n  }\n\n  private openContextMenu(\n    toolbar: LwToolbarElement,\n    detail: LwToolbarContextDetail,\n  ): void {\n    const attachment = this.attachments.get(toolbar);\n    const entry = attachment?.resolved.find((candidate) => candidate.item.id === detail.key);\n    const menu = entry ? menuOnContext(entry.item) : undefined;\n    if (!entry || !menu) {\n      return;\n    }\n    this.menus.open(menu, this.slots.contextFor(entry.item, toolbar.context), {\n      x: detail.x,\n      y: detail.y,\n    });\n  }\n}\n\nfunction sameContext(a: MenuContext, b: MenuContext): boolean {\n  const keys = Object.keys(a);\n  return (\n    keys.length === Object.keys(b).length &&\n    keys.every((key) => Object.is(a[key], b[key]))\n  );\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  booleanAttribute,\n  computed,\n  inject,\n  input,\n} from '@angular/core';\nimport { MenuContext } from '@loomweaver/plugin-sdk';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { surfaceActionsSlot } from '../../../contributions/toolbar-registry';\nimport { ToolbarHost } from '../../toolbar/toolbar-host.service';\nimport { surfaceForPanePath } from '../../pane/pane-surface';\nimport { paneLabelOf } from '../../pane/chrome/tab-label';\n\n@Component({\n  selector: 'lw-surface-actions',\n  imports: [TranslocoPipe],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  host: { class: 'contents' },\n  templateUrl: './surface-actions.html',\n})\nexport class SurfaceActions {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly host = inject(ToolbarHost);\n\n  readonly path = input<string | undefined>();\n\n  readonly region = input.required<string>();\n\n  readonly inStrip = input(false, { transform: booleanAttribute });\n\n  private readonly surface = computed(() => {\n    const path = this.path();\n    return path === undefined\n      ? undefined\n      : surfaceForPanePath(\n          this.registry.contentRoutes(),\n          this.registry.views(),\n          path,\n        );\n  });\n\n  protected readonly slot = computed(() => {\n    const id = this.surface()?.id;\n    return id === undefined ? undefined : surfaceActionsSlot(id);\n  });\n\n  protected readonly title = computed(() => {\n    const path = this.path();\n    return path === undefined || this.surface() === undefined\n      ? undefined\n      : paneLabelOf(this.registry, path);\n  });\n\n  protected readonly context = computed<MenuContext>(() => ({\n    targetKind: 'view-action',\n    region: this.region(),\n    surface: this.surface()?.id ?? '',\n  }));\n}\n","@if (slot(); as slot) {\n  @let label = title();\n  <lw-toolbar\n    [attr.menu]=\"slot\"\n    [attr.label]=\"label ? (label.literalTitle ? label.title : (label.title | transloco)) : null\"\n    [attr.size]=\"inStrip() ? 'sm' : 'md'\"\n    [context]=\"context()\"\n    [class.border-l]=\"inStrip()\"\n    [class.border-border]=\"inStrip()\"\n    [class.px-2]=\"inStrip()\"\n    data-testid=\"surface-actions\"\n  ></lw-toolbar>\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  TemplateRef,\n  computed,\n  effect,\n  inject,\n  input,\n  output,\n  viewChild,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport {\n  CdkDrag,\n  CdkDragDrop,\n  CdkDragHandle,\n  CdkDropList,\n  moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { MenuContext } from '@loomweaver/plugin-sdk';\nimport { MenuService } from '../../../menu/menu.service';\nimport { MENU_ANCHOR_GAP } from '../../../elements/menu/lw-menu.element';\nimport { MenuTriggerDirective } from '../../../menu/menu-trigger.directive';\nimport { Reorderable } from '../../reorder/reorderable.directive';\nimport { isViewPanePath, PaneRef } from '../tree/pane-address';\nimport { paneRetentionScope } from '../retention/retention-keys';\nimport { UnsavedWork } from '../unsaved-work/unsaved-work';\nimport { resolveTitle } from './tab-label';\nimport { FeatureSwitches } from '../../../features/feature-switches.service';\nimport { PaneDragService } from '../drag/pane-drag.service';\nimport {\n  PaneMoveService,\n  stripIdOf,\n  stripSourceOf,\n} from '../drag/pane-move.service';\nimport { RovingTabs } from './roving-tabs.directive';\nimport { StripOverflow } from './strip-overflow.directive';\nimport { StripTab, TabAcceptance, tabIdIn, tabMenuContext } from './strip-tab';\nimport { SurfaceActions } from '../../content/actions/surface-actions';\n\n@Component({\n  selector: 'lw-pane-tab-strip',\n  imports: [\n    NgTemplateOutlet,\n    TranslocoPipe,\n    MenuTriggerDirective,\n    Reorderable,\n    RovingTabs,\n    StripOverflow,\n    SurfaceActions,\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<PaneRef>();\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 panelId = input<string | null>(null);\n\n  readonly surfaceActions = input(false);\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 addTab = output<Event>();\n\n  readonly revealRequest = output<string>();\n\n  private readonly menu = inject(MenuService);\n\n  private readonly paneDrag = inject(PaneDragService);\n\n  private readonly paneMove = inject(PaneMoveService);\n\n  private readonly unsavedWork = inject(UnsavedWork);\n\n  private readonly stripOverflow = viewChild.required(StripOverflow);\n\n  protected readonly escalatable = inject(FeatureSwitches).content.escalate;\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 icons = computed(() => this.variant() === 'icons');\n\n  private readonly retentionScope = computed(() =>\n    paneRetentionScope(this.source().dock, this.source().paneId),\n  );\n\n  private readonly unsavedPaths = computed(() => {\n    const scope = this.retentionScope();\n    return new Set(\n      this.tabs()\n        .filter((tab) => this.unsavedWork.at(scope, tab.path))\n        .map((tab) => tab.path),\n    );\n  });\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    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 control = event.currentTarget as HTMLElement;\n    const anchor = control.getBoundingClientRect();\n    const entries = this.tabs().map((tab) => ({\n      key: tab.path,\n      label: (translate: (key: string) => string) =>\n        resolveTitle(tab, translate),\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      control,\n    );\n  }\n\n  protected onSelectTab(tab: StripTab): void {\n    this.stripOverflow().notePicked(tab.path);\n    this.selectTab.emit(tab);\n  }\n\n  protected unsaved(tab: StripTab): boolean {\n    return this.unsavedPaths().has(tab.path);\n  }\n\n  protected closeControlClass(tab: StripTab): string {\n    const base =\n      'lw-icon-btn absolute inset-0 cursor-pointer opacity-70 hover:opacity-100';\n    return this.unsaved(tab)\n      ? `${base} pointer-fine:hidden pointer-fine:group-hover/mark:flex`\n      : base;\n  }\n\n  protected isActive(tab: StripTab): boolean {\n    return this.activeId() === tab.path;\n  }\n\n  protected tabId(tab: StripTab): string {\n    return tabIdIn(this.stripId(), tab.path);\n  }\n\n  protected controls(tab: StripTab): string | null {\n    return this.isActive(tab) ? this.panelId() : null;\n  }\n\n  protected menuSlotFor(tab: StripTab): string {\n    return isViewPanePath(tab.path)\n      ? this.viewContextMenuSlot()\n      : this.contextMenuSlot();\n  }\n\n  protected tabContext(tab: StripTab): MenuContext {\n    return tabMenuContext(tab, {\n      group: this.contextGroup(),\n      paneId: this.source().paneId,\n      primary: this.urlDriven(),\n      sole: this.tabs().length === 1,\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 bandOf(tab: StripTab): string {\n    return tab.pinned ? 'pinned' : 'dynamic';\n  }\n\n  protected canReorder(tab: StripTab): boolean {\n    return this.reorderable() && tab.movable;\n  }\n\n  protected canDrag(tab: StripTab): boolean {\n    return this.draggable() && tab.movable;\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) => tab.movable).map((tab) => tab.path),\n    );\n  }\n}\n","<div [class]=\"bandClass()\">\n  <div\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    lwRovingTabs\n    [lwStripOverflow]=\"overflow()\"\n    [lwStripOverflowActive]=\"activeId()\"\n    [lwStripOverflowTabs]=\"tabs()\"\n    (revealRequest)=\"revealRequest.emit($event)\"\n    #stripOverflow=\"lwStripOverflow\"\n  >\n    @for (tab of tabs(); track tab.path) {\n      @let title = tab.literalTitle ? tab.title : (tab.title | transloco);\n      @let badge = tab.badge;\n      @let badgeText = !badge?.text ? '' : badge.textIsLiteral ? badge.text : (badge.text | transloco);\n      @let named = badgeText ? ('content.badgedTab' | transloco: { title, badge: badgeText }) : title;\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          [lwMenu]=\"menuSlotFor(tab)\"\n          [lwMenuContext]=\"tabContext(tab)\"\n          [attr.aria-selected]=\"isActive(tab)\"\n          [attr.id]=\"tabId(tab)\"\n          [attr.aria-controls]=\"controls(tab)\"\n          [attr.aria-label]=\"unsaved(tab) ? ('content.unsavedTab' | transloco: { title: named }) : named\"\n          [attr.data-reorder-id]=\"canReorder(tab) ? tab.path : null\"\n          [attr.data-reorder-band]=\"bandOf(tab)\"\n          [attr.data-tab-path]=\"tab.path\"\n          (click)=\"onSelectTab(tab)\"\n          (dblclick)=\"escalate.emit(tab)\"\n          class=\"lw-icon-btn relative 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          @if (unsaved(tab)) {\n            <span\n              aria-hidden=\"true\"\n              data-testid=\"tab-unsaved\"\n              class=\"absolute top-1 right-1 h-1.5 w-1.5 rounded-full bg-unsaved\"\n            ></span>\n          }\n          <lw-tooltip [text]=\"named\" 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          [lwMenu]=\"menuSlotFor(tab)\"\n          [lwMenuContext]=\"tabContext(tab)\"\n        >\n          <button\n            type=\"button\"\n            role=\"tab\"\n            cdkDragHandle\n            [attr.aria-selected]=\"isActive(tab)\"\n            [attr.id]=\"tabId(tab)\"\n            [attr.aria-controls]=\"controls(tab)\"\n            [attr.aria-label]=\"unsaved(tab) ? ('content.unsavedTab' | transloco: { title: named }) : named\"\n            [attr.data-reorder-id]=\"canReorder(tab) ? tab.path : null\"\n            [attr.data-reorder-band]=\"bandOf(tab)\"\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            @if (badge && (badgeText || badge.icon)) {\n              &ngsp;<span\n                aria-hidden=\"true\"\n                data-testid=\"tab-badge\"\n                class=\"lw-badge max-w-max min-w-0 grow basis-0 gap-1 overflow-hidden px-1.5 py-0 not-italic\"\n                [class.lw-badge--brand]=\"badge.tone === 'brand'\"\n                [class.lw-badge--success]=\"badge.tone === 'success'\"\n                [class.lw-badge--danger]=\"badge.tone === 'danger'\"\n              >\n                @if (badge.icon) {\n                  <lw-icon [name]=\"badge.icon\" size=\"0.75rem\" />\n                }\n                @if (badgeText) {\n                  <span class=\"min-w-0 truncate\">{{ badgeText }}</span>\n                }\n              </span>\n            }\n\n            <lw-tooltip\n              [text]=\"\n                tab.preview && escalatable()\n                  ? named + ' — ' + ('content.previewHint' | transloco)\n                  : named\n              \"\n              position=\"bottom\"\n            />\n          </button>\n\n          @if (tab.pinned) {\n            @if (unsaved(tab)) {\n              <span\n                aria-hidden=\"true\"\n                data-testid=\"tab-unsaved\"\n                class=\"flex h-6 w-4 items-center justify-center\"\n              >\n                <span class=\"h-2 w-2 rounded-full bg-unsaved\"></span>\n              </span>\n            }\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 class=\"group/mark relative mr-1 flex h-6 w-6 items-center justify-center\">\n              @if (unsaved(tab)) {\n                <span\n                  aria-hidden=\"true\"\n                  data-testid=\"tab-unsaved\"\n                  class=\"h-2 w-2 rounded-full bg-unsaved pointer-fine:group-hover/mark:hidden\"\n                ></span>\n              }\n              <span\n                aria-hidden=\"true\"\n                data-testid=\"tab-close\"\n                (click)=\"onClose($event, tab)\"\n                [class]=\"closeControlClass(tab)\"\n              >\n                <lw-icon name=\"close\" size=\"0.85rem\" />\n                <lw-tooltip [text]=\"'content.closeTab' | transloco\" position=\"bottom\" />\n              </span>\n            </span>\n          } @else if (unsaved(tab)) {\n            <span\n              aria-hidden=\"true\"\n              data-testid=\"tab-unsaved\"\n              class=\"mr-1 flex h-6 w-6 items-center justify-center\"\n            >\n              <span class=\"h-2 w-2 rounded-full bg-unsaved\"></span>\n            </span>\n          }\n        </div>\n      }\n    }\n  </div>\n\n  @if (canAddTab()) {\n    <button\n      type=\"button\"\n      (click)=\"addTab.emit($event)\"\n      lwMenuAnnounced\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() && stripOverflow.overflowing()) {\n    <button\n      type=\"button\"\n      (click)=\"openOverflow($event)\"\n      lwMenuAnnounced\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 (surfaceActions()) {\n    <lw-surface-actions [path]=\"activeId()\" [region]=\"source().dock\" inStrip />\n  }\n  @if (paneActions(); as actions) {\n    <ng-container [ngTemplateOutlet]=\"actions\" />\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 { isViewPanePath } from '../tree/pane-address';\nimport { StripTab } from './strip-tab';\n\nexport type EscalationStep = 'keep' | 'pin' | 'unpin';\n\nexport function escalationStep(\n  tab: StripTab,\n  allowed: { readonly escalate: boolean; readonly pin: boolean },\n): EscalationStep | null {\n  if (!allowed.escalate || isViewPanePath(tab.path)) {\n    return null;\n  }\n  if (tab.preview) {\n    return 'keep';\n  }\n  if (!allowed.pin) {\n    return null;\n  }\n  if (tab.pinned) {\n    return 'unpin';\n  }\n  return tab.closable ? 'pin' : null;\n}\n","import { SwitchSignals } from '../../../features/feature-switches.service';\nimport { ContentFeatures } from '../../../foundation/shell-features';\n\ntype ContentSwitches = SwitchSignals<ContentFeatures>;\n\nexport function offersSplitRight(content: ContentSwitches): boolean {\n  return content.splitRight() && content.splitRightButton();\n}\n\nexport function offersSplitDown(content: ContentSwitches): boolean {\n  return content.splitDown() && content.splitDownButton();\n}\n\nexport function offersMinimize(\n  content: ContentSwitches,\n  pane: { readonly split: boolean; readonly maximized: boolean },\n): boolean {\n  return content.minimize() && pane.split && !pane.maximized;\n}\n\nexport function tabsReorderable(\n  content: ContentSwitches,\n  contentSide: boolean,\n): boolean {\n  return !contentSide || content.reorderTabs();\n}\n\nexport function tabsDraggable(\n  content: ContentSwitches,\n  contentSide: boolean,\n): boolean {\n  return (\n    !contentSide ||\n    content.reorderTabs() ||\n    content.moveTabs() ||\n    content.splitRight() ||\n    content.splitDown()\n  );\n}\n\nexport function escalationSwitches(content: ContentSwitches): {\n  readonly escalate: boolean;\n  readonly pin: boolean;\n} {\n  return { escalate: content.escalate(), pin: content.pin() };\n}\n","import { inject, Service } from '@angular/core';\nimport { ContainerSpec } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { MenuService } from '../../menu/menu.service';\nimport { MENU_ANCHOR_GAP } from '../../elements/menu/lw-menu.element';\nimport { LeftOutChildren } from '../pane/container/left-out-children';\nimport {\n  PaneTarget,\n  containerChildTargets,\n  hostablePaneTargets,\n  navigablePaneTargets,\n  paneTargetEntries,\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 leftOut = inject(LeftOutChildren);\n\n  openForNavigation(anchor: HTMLElement, onPick: (path: string) => void): void {\n    this.present(\n      navigablePaneTargets(this.registry, this.auth),\n      anchor,\n      onPick,\n    );\n  }\n\n  openForHosting(anchor: HTMLElement, onPick: (path: string) => void): void {\n    this.present(hostablePaneTargets(this.registry, this.auth), anchor, onPick);\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).filter(\n        (target) => !this.leftOut.hides(target.path),\n      ),\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);\n    this.menu.openList(\n      entries,\n      { x: rect.left, y: rect.bottom + MENU_ANCHOR_GAP },\n      onPick,\n      anchor,\n    );\n  }\n}\n","import { Disposable } from '@loomweaver/plugin-sdk';\n\nexport function disposeTogether(\n  disposables: readonly Disposable[],\n): Disposable {\n  return {\n    dispose: () => {\n      for (const disposable of disposables) {\n        disposable.dispose();\n      }\n    },\n  };\n}\n","import {\n  DestroyRef,\n  effect,\n  Injector,\n  Signal,\n  untracked,\n} from '@angular/core';\nimport { Disposable } from '@loomweaver/plugin-sdk';\n\nexport function whileOn(\n  injector: Injector,\n  on: Signal<boolean>,\n  register: () => Disposable,\n): void {\n  let registration: Disposable | undefined;\n  const release = (): void => {\n    registration?.dispose();\n    registration = undefined;\n  };\n  effect(\n    () => {\n      if (on()) {\n        registration ??= untracked(register);\n        return;\n      }\n      release();\n    },\n    { injector },\n  );\n  injector.get(DestroyRef).onDestroy(release);\n}\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","export function menuEntryId(commandId: string): string {\n  return `menu:${commandId}`;\n}\n","import { Command, Disposable, MenuItem } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { disposeTogether } from '../contributions/dispose-together';\nimport { menuEntryId } from './menu-entry-id';\n\nexport type MenuPlacement = Pick<MenuItem, 'group' | 'order' | 'when' | 'checkedWhen'>;\n\nexport function registerMenuCommand(\n  registry: ContributionRegistry,\n  menu: string,\n  command: Command,\n  placement: MenuPlacement,\n): Disposable {\n  return disposeTogether([\n    registry.addCommand({ ...command, paletteHidden: true }),\n    registry.addMenuItem({\n      id: menuEntryId(command.id),\n      menu,\n      command: command.id,\n      ...placement,\n    }),\n  ]);\n}\n","import { Injector, Signal } from '@angular/core';\nimport {\n  Command,\n  Disposable,\n  MenuContext,\n} from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { disposeTogether } from '../../../contributions/dispose-together';\nimport { FeatureSwitches } from '../../../features/feature-switches.service';\nimport { whileOn } from '../../../features/while-on';\nimport { ContentTabsService } from './content-tabs.service';\nimport { PaneMoveService } from '../../pane/drag/pane-move.service';\nimport { PaneTreeService } from '../../pane/tree/pane-tree.service';\nimport { PopoutService } from '../../../popout/popout.service';\nimport { menuContextString } from '../../../menu/menu-context';\nimport { PaneRef } from '../../pane/tree/pane-address';\nimport { MenuPlacement, registerMenuCommand } from '../../../menu/context-menu-entry';\n\nconst TAB_CLOSE_COMMAND_ID = 'shell.tab.close';\nconst TAB_CLOSE_ALL_COMMAND_ID = 'shell.tab.closeAll';\nconst TAB_CLOSE_OTHERS_COMMAND_ID = 'shell.tab.closeOthers';\nconst TAB_CLOSE_RIGHT_COMMAND_ID = 'shell.tab.closeRight';\nconst TAB_OPEN_IN_WINDOW_COMMAND_ID = 'shell.tab.openInWindow';\nconst TAB_SPLIT_DOWN_COMMAND_ID = 'shell.tab.splitDown';\nconst TAB_SPLIT_RIGHT_COMMAND_ID = 'shell.tab.splitRight';\nconst TAB_TOGGLE_PIN_COMMAND_ID = 'shell.tab.togglePin';\n\nexport const TAB_CONTEXT_MENU = 'content/tab/context';\n\nexport interface TabMenuDeps {\n  readonly tabs: ContentTabsService;\n  readonly paneMove: PaneMoveService;\n  readonly paneTree: PaneTreeService;\n  readonly popout: PopoutService;\n  readonly features: FeatureSwitches;\n  readonly injector: Injector;\n}\n\ninterface TabMenuEntry {\n  readonly command: Command;\n  readonly placement: MenuPlacement;\n}\n\ninterface TabMenuGroup {\n  readonly on: Signal<boolean>;\n  readonly entries: readonly TabMenuEntry[];\n}\n\nexport function registerTabContextMenu(\n  registry: ContributionRegistry,\n  deps: TabMenuDeps,\n): void {\n  const { tabs, paneMove, paneTree, popout, features } = deps;\n  const content = features.content;\n  const groups: readonly TabMenuGroup[] = [\n    {\n      on: content.close,\n      entries: [\n        tabEntry(\n          {\n            id: TAB_CLOSE_COMMAND_ID,\n            title: 'content.tabMenu.close',\n            run: (c) =>\n              tabs.close(menuContextString(c, 'tabId'), paneOf(c, paneTree)),\n          },\n          { group: '1_close', order: 0, when: { closable: true } },\n        ),\n        tabEntry(\n          {\n            id: TAB_CLOSE_OTHERS_COMMAND_ID,\n            title: 'content.tabMenu.closeOthers',\n            run: (c) =>\n              tabs.closeOthers(\n                menuContextString(c, 'tabId'),\n                paneOf(c, paneTree),\n              ),\n          },\n          { group: '1_close', order: 1 },\n        ),\n        tabEntry(\n          {\n            id: TAB_CLOSE_RIGHT_COMMAND_ID,\n            title: 'content.tabMenu.closeRight',\n            run: (c) =>\n              tabs.closeToRight(\n                menuContextString(c, 'tabId'),\n                paneOf(c, paneTree),\n              ),\n          },\n          { group: '1_close', order: 2 },\n        ),\n        tabEntry(\n          {\n            id: TAB_CLOSE_ALL_COMMAND_ID,\n            title: 'content.tabMenu.closeAll',\n            run: (c) => tabs.closeAll(paneOf(c, paneTree)),\n          },\n          { group: '1_close', order: 3 },\n        ),\n      ],\n    },\n    {\n      on: content.pin,\n      entries: [\n        tabEntry(\n          {\n            id: TAB_TOGGLE_PIN_COMMAND_ID,\n            title: 'content.tabMenu.pinned',\n            run: (c) => togglePin(c, deps),\n          },\n          {\n            group: '2_pin',\n            order: 0,\n            when: { closable: true },\n            checkedWhen: { pinned: true },\n          },\n        ),\n      ],\n    },\n    {\n      on: features.windows.popout,\n      entries: [\n        tabEntry(\n          {\n            id: TAB_OPEN_IN_WINDOW_COMMAND_ID,\n            title: 'content.tabMenu.openInNewWindow',\n            icon: 'popout',\n            run: (c) => popout.open(menuContextString(c, 'tabId')),\n          },\n          { group: '3_window', order: 0 },\n        ),\n      ],\n    },\n    {\n      on: content.splitRight,\n      entries: [\n        tabEntry(\n          {\n            id: TAB_SPLIT_RIGHT_COMMAND_ID,\n            title: 'content.split.splitRight',\n            icon: 'splitPanes',\n            run: (c) =>\n              paneMove.splitTabOut(\n                menuContextString(c, 'tabId'),\n                'row',\n                paneOf(c, paneTree),\n              ),\n          },\n          { group: '0_split', order: 0, when: { closable: true, sole: false } },\n        ),\n      ],\n    },\n    {\n      on: content.splitDown,\n      entries: [\n        tabEntry(\n          {\n            id: TAB_SPLIT_DOWN_COMMAND_ID,\n            title: 'content.split.splitDown',\n            icon: 'splitPanesDown',\n            run: (c) =>\n              paneMove.splitTabOut(\n                menuContextString(c, 'tabId'),\n                'column',\n                paneOf(c, paneTree),\n              ),\n          },\n          { group: '0_split', order: 1, when: { closable: true, sole: false } },\n        ),\n      ],\n    },\n  ];\n  for (const group of groups) {\n    whileOn(deps.injector, group.on, () => register(registry, group));\n  }\n}\n\nfunction tabEntry(command: Command, placement: MenuPlacement): TabMenuEntry {\n  return { command, placement };\n}\n\nfunction register(\n  registry: ContributionRegistry,\n  group: TabMenuGroup,\n): Disposable {\n  return disposeTogether(\n    group.entries.map(({ command, placement }) =>\n      registerMenuCommand(registry, TAB_CONTEXT_MENU, command, placement),\n    ),\n  );\n}\n\nfunction togglePin(context: MenuContext | undefined, deps: TabMenuDeps): void {\n  const tabId = menuContextString(context, 'tabId');\n  const pinned = Boolean(context?.['pinned']);\n  const pane = paneOf(context, deps.paneTree);\n  if (pane === undefined) {\n    if (pinned) {\n      deps.tabs.unpin(tabId);\n    } else {\n      deps.tabs.pin(tabId);\n    }\n    return;\n  }\n  if (pinned) {\n    deps.paneTree.unpinTab(pane.dock, pane.paneId, tabId);\n  } else {\n    deps.paneTree.pinTab(pane.dock, pane.paneId, tabId);\n  }\n}\n\nfunction paneOf(\n  context: MenuContext | undefined,\n  paneTree: PaneTreeService,\n): PaneRef | undefined {\n  if (context?.['primary'] === true) {\n    return undefined;\n  }\n  return context?.['primary'] === false\n    ? namedPane(context)\n    : holdingPane(context, paneTree);\n}\n\nfunction namedPane(context: MenuContext): PaneRef | undefined {\n  const dock = context['group'];\n  const paneId = context['paneId'];\n  return typeof dock === 'string' && typeof paneId === 'string'\n    ? { dock, paneId }\n    : undefined;\n}\n\nfunction holdingPane(\n  context: MenuContext | undefined,\n  paneTree: PaneTreeService,\n): PaneRef | undefined {\n  const tabId = context?.['tabId'];\n  const holder = typeof tabId === 'string' ? paneTree.sourceOf(tabId) : null;\n  return holder === null || paneTree.carriesAddress(holder)\n    ? undefined\n    : holder;\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  inject,\n} from '@angular/core';\nimport { SurfaceActions } from './actions/surface-actions';\nimport { ContentTabsService } from './tabs/content-tabs.service';\nimport { PaneTargetPicker } from './pane-target-picker';\nimport { TAB_CONTEXT_MENU } from './tabs/tab-context-menu';\nimport { StripTab, VIEW_CONTEXT_MENU } from '../pane/chrome/strip-tab';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport {\n  CONTENT_DOCK,\n  isViewPanePath,\n  PaneRef,\n} from '../pane/tree/pane-address';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { PaneChromeService } from '../pane/chrome/pane-chrome.service';\nimport { PaneActions } from '../pane/pane-actions.service';\nimport { escalationStep } from '../pane/chrome/tab-escalation';\nimport {\n  escalationSwitches,\n  offersMinimize,\n  offersSplitDown,\n  offersSplitRight,\n  tabsDraggable,\n  tabsReorderable,\n} from '../pane/chrome/pane-affordances';\nimport { PaneTabStrip } from '../pane/chrome/pane-tab-strip';\nimport { PaneToolbar } from '../pane/chrome/pane-toolbar';\n\n@Component({\n  selector: 'lw-address-pane-header',\n  imports: [PaneTabStrip, PaneToolbar, SurfaceActions],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './address-pane-header.html',\n  host: { class: 'contents' },\n})\nexport class AddressPaneHeader {\n  private readonly picker = inject(PaneTargetPicker);\n  protected readonly tabs = inject(ContentTabsService);\n  protected readonly tabContextMenu = TAB_CONTEXT_MENU;\n  protected readonly viewContextMenu = VIEW_CONTEXT_MENU;\n  protected readonly contentDock = CONTENT_DOCK;\n  private readonly chrome = inject(PaneChromeService);\n  private readonly actions = inject(PaneActions);\n  private readonly paneTree = inject(PaneTreeService);\n  protected readonly features = inject(FeatureSwitches).content;\n\n  private readonly urlPaneId = computed(() =>\n    this.paneTree.primaryId(CONTENT_DOCK),\n  );\n\n  protected readonly addressPane = computed<PaneRef>(() => ({\n    dock: CONTENT_DOCK,\n    paneId: this.urlPaneId(),\n  }));\n\n  protected readonly maximized = computed(() =>\n    this.chrome.isMaximized(CONTENT_DOCK, this.urlPaneId()),\n  );\n\n  private readonly isSplit = computed(() =>\n    this.paneTree.isSplit(CONTENT_DOCK),\n  );\n  protected readonly activeId = computed(\n    () => this.tabs.activeViewPath() ?? this.tabs.activeTabRoot(),\n  );\n  private readonly splittable = computed(() =>\n    this.actions.duplicable(this.activeId()),\n  );\n\n  protected readonly canSplitRight = computed(\n    () => offersSplitRight(this.features) && this.splittable(),\n  );\n  protected readonly canSplitDown = computed(\n    () => offersSplitDown(this.features) && this.splittable(),\n  );\n\n  protected readonly canMinimize = computed(() =>\n    offersMinimize(this.features, {\n      split: this.isSplit(),\n      maximized: this.maximized(),\n    }),\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.features.maximize() ||\n        this.canClose()),\n  );\n\n  protected readonly tabsReorderable = computed(() =>\n    tabsReorderable(this.features, true),\n  );\n\n  protected readonly tabsDraggable = computed(() =>\n    tabsDraggable(this.features, true),\n  );\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 select(tab: StripTab): void {\n    if (isViewPanePath(tab.path)) {\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    const step = escalationStep(tab, escalationSwitches(this.features));\n    switch (step) {\n      case 'keep': {\n        this.tabs.keep(tab.path);\n        break;\n      }\n      case 'pin': {\n        this.tabs.pin(tab.path);\n        break;\n      }\n      case 'unpin': {\n        this.tabs.unpin(tab.path);\n        break;\n      }\n    }\n  }\n\n  protected onReorder(ids: string[]): void {\n    this.tabs.reorder(ids);\n  }\n\n  protected toggleMaximize(): void {\n    if (this.maximized()) {\n      this.actions.restore(CONTENT_DOCK, this.urlPaneId());\n      return;\n    }\n    this.actions.maximize(CONTENT_DOCK, this.urlPaneId());\n  }\n\n  protected minimize(): void {\n    this.actions.minimize(CONTENT_DOCK, this.urlPaneId());\n  }\n\n  protected closePrimary(): void {\n    this.actions.close(CONTENT_DOCK, this.urlPaneId());\n  }\n\n  protected split(orientation: 'row' | 'column'): void {\n    this.actions.split(CONTENT_DOCK, this.urlPaneId(), orientation);\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","@if (tabs.showStrip()) {\n  <lw-pane-tab-strip\n    [tabs]=\"stripTabs()\"\n    [activeId]=\"activeId()\"\n    [source]=\"addressPane()\"\n    [urlDriven]=\"true\"\n    [reorderable]=\"tabsReorderable()\"\n    [draggable]=\"tabsDraggable()\"\n    [acceptsTabs]=\"features.moveTabs()\"\n    [contextMenuSlot]=\"tabContextMenu\"\n    [viewContextMenuSlot]=\"viewContextMenu\"\n    [contextGroup]=\"contentDock\"\n    [overflow]=\"true\"\n    [canAddTab]=\"features.newTab()\"\n    [paneActions]=\"urlToolbar\"\n    panelId=\"lw-main-content\"\n    [surfaceActions]=\"true\"\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    (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]=\"features.maximize()\"\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@if (!tabs.showStrip()) {\n  <div\n    class=\"absolute top-1.5 right-2 z-30 hidden items-center gap-0.5 rounded-md bg-surface-raised/85 px-0.5 ring-1 ring-border has-[button]:flex\"\n  >\n    <lw-surface-actions [path]=\"activeId()\" [region]=\"contentDock\" inStrip />\n    @if (showFloating()) {\n      <lw-pane-toolbar\n        [canNewTab]=\"canNewTabFloating()\"\n        [canSplitRight]=\"canSplitRightFloating()\"\n        [canSplitDown]=\"canSplitDownFloating()\"\n        [canMinimize]=\"canMinimize()\"\n        [canMaximize]=\"features.maximize()\"\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}\n","import {\n  Service,\n  computed,\n  effect,\n  inject,\n  signal,\n  untracked,\n} from '@angular/core';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { CONTENT_DOCK, isViewPanePath } from '../pane/tree/pane-address';\nimport { PaneLeaf, activeTab, leafPath } from '../pane/tree/pane-node';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { ContentTabsService } from './tabs/content-tabs.service';\nimport { CurrentAddress } from './current-address';\nimport { matchRoute, tabRootOf } from './content-path';\nimport { opensATab } from './tabs/content-tab-projection';\n\n@Service()\nexport class AddressPaneBody {\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly tabs = inject(ContentTabsService);\n  private readonly address = inject(CurrentAddress);\n\n  private readonly settling = signal(false);\n  private lastPrimary = untracked(() => this.paneTree.primaryId(CONTENT_DOCK));\n  private lastPath = untracked(() => this.address.snapshot().path);\n\n  readonly showsSurface = computed(\n    () => this.settling() || this.address.showsContent(),\n  );\n\n  constructor() {\n    effect(() => {\n      const primary = this.paneTree.primaryId(CONTENT_DOCK);\n      const path = this.address.snapshot().path;\n      untracked(() => {\n        if (path !== this.lastPath) {\n          this.settling.set(false);\n        } else if (primary !== this.lastPrimary) {\n          this.settling.set(true);\n        }\n        this.lastPrimary = primary;\n        this.lastPath = path;\n      });\n    });\n  }\n\n  pathFor(leaf: PaneLeaf): string {\n    const view = this.tabs.activeViewPath();\n    if (view !== null) {\n      return view;\n    }\n    const routes = this.registry.contentRoutes();\n    const url = this.address.snapshot().path;\n    const root = tabRootOf(routes, url);\n    const held = leaf.tabs.some(\n      (tab) =>\n        !isViewPanePath(tab.path) && tabRootOf(routes, tab.path) === root,\n    );\n    const untabbed = !opensATab(matchRoute(routes, url), root);\n    if (held || (!this.settling() && untabbed)) {\n      return url;\n    }\n    return leafPath(leaf) ?? '';\n  }\n\n  instanceFor(leaf: PaneLeaf): string | undefined {\n    return this.tabs.activeViewPath() === null\n      ? activeTab(leaf)?.instance\n      : this.tabs.activeViewInstance();\n  }\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * What the workbench recognised about workspaces that cannot work as their declaration describes.\n * A product reads {@link ids} to answer for itself, which is what makes silencing the workbench's\n * own notice a choice rather than a blindfold.\n */\nexport interface UnusableWorkspaces {\n  /** The workspaces that declare content of their own and whose stored arrangement leaves them none. */\n  ids(): ReadonlySet<string>;\n  /** Whether the workbench itself says so, here and now, for the workspace the user is in. */\n  announced(): boolean;\n}\n\nconst NOT_COMPOSED: UnusableWorkspaces = {\n  ids: () => new Set(),\n  announced: () => false,\n};\n\nexport const UNUSABLE_WORKSPACES = new InjectionToken<UnusableWorkspaces>(\n  'lw.unusable-workspaces',\n  { providedIn: 'root', factory: () => NOT_COMPOSED },\n);\n","export const OPEN_SETTINGS_COMMAND_ID = 'shell.openSettings';\n\nexport const RAIL_CUSTOMIZE_COMMAND_ID = 'shell.rail.customize';\n\nexport const VIEWS_CUSTOMIZE_COMMAND_ID = 'shell.views.customize';\n\nexport const APP_RESET_COMMAND_ID = 'shell.app.reset';\n\nexport const WORKSPACE_MANAGE_COMMAND_ID = 'shell.workspace.manage';\n\nexport const WORKSPACE_RESET_COMMAND_ID = 'shell.workspace.reset';\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { CommandService } from '../../commands/command.service';\nimport { UNUSABLE_WORKSPACES } from './unusable-workspaces';\nimport { WORKSPACE_RESET_COMMAND_ID } from '../../commands/host-command-ids';\n\n@Component({\n  selector: 'lw-unusable-workspace-notice',\n  imports: [TranslocoPipe],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './unusable-workspace-notice.html',\n})\nexport class UnusableWorkspaceNotice {\n  private readonly workspaces = inject(UNUSABLE_WORKSPACES);\n  private readonly commands = inject(CommandService);\n\n  protected shown(): boolean {\n    return this.workspaces.announced();\n  }\n\n  protected reset(): void {\n    this.commands.execute(WORKSPACE_RESET_COMMAND_ID);\n  }\n}\n","@if (shown()) {\n  <div\n    class=\"absolute inset-0 z-20 flex flex-col items-center justify-center gap-3 bg-surface-raised p-6 text-center\"\n    data-testid=\"workspace-unusable-notice\"\n  >\n    <lw-icon name=\"warning\" size=\"1.5rem\" class=\"text-negative\" />\n    <p class=\"text-sm font-medium text-content\">\n      {{ 'workspace.unusableTitle' | transloco }}\n    </p>\n    <p class=\"max-w-prose text-sm text-content-faint\">\n      {{ 'workspace.unusableBody' | transloco }}\n    </p>\n    <button\n      type=\"button\"\n      class=\"lw-btn lw-btn--primary\"\n      (click)=\"reset()\"\n      data-testid=\"workspace-unusable-reset\"\n    >\n      {{ 'workspace.unusableAction' | transloco }}\n    </button>\n  </div>\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","export const THEME_STORAGE_KEY = 'lw.shell.theme';\n\nexport const LANGUAGE_STORAGE_KEY = 'lw.shell.lang';\n\nexport const FONT_SCALE_STORAGE_KEY = 'lw.shell.font-scale';\n","import { InjectionToken } from '@angular/core';\nimport { LANGUAGE_STORAGE_KEY } from '../persistence/device-level-keys';\n\n/** One language the workbench serves: its canonical code and its name, written in that language. */\nexport interface ServedLanguage {\n  readonly code: string;\n  readonly name: string;\n}\n\nexport const SHIPPED_LANGUAGES: readonly string[] = ['en', 'de'];\n\nexport const SERVED_LANGUAGES = new InjectionToken<readonly string[]>(\n  'SERVED_LANGUAGES',\n  { providedIn: 'root', factory: () => SHIPPED_LANGUAGES },\n);\n\nexport const FALLBACK_LANGUAGE = 'en';\n\nfunction canonicalOrNull(code: string): string | null {\n  try {\n    return Intl.getCanonicalLocales(code)[0] ?? null;\n  } catch {\n    return null;\n  }\n}\n\nexport function resolveServedLanguages(\n  declared: readonly string[] | undefined,\n): readonly string[] {\n  if (declared === undefined) {\n    return SHIPPED_LANGUAGES;\n  }\n  if (declared.length === 0) {\n    throw new Error(\n      'provideShell({ languages }) needs at least one language; omit it to serve the shipped ones.',\n    );\n  }\n  const canonical = declared.map((code) => {\n    const resolved = canonicalOrNull(code);\n    if (resolved === null) {\n      throw new Error(\n        `provideShell({ languages }): \"${code}\" is not a language code.`,\n      );\n    }\n    return resolved;\n  });\n  return [...new Set(canonical)];\n}\n\nexport function servedLanguage(\n  value: string | null | undefined,\n  served: readonly string[],\n): string | undefined {\n  if (value == null) {\n    return undefined;\n  }\n  const canonical = canonicalOrNull(value);\n  return canonical !== null && served.includes(canonical)\n    ? canonical\n    : undefined;\n}\n\nexport function languageName(code: string): string {\n  try {\n    const name = new Intl.DisplayNames([code], { type: 'language' }).of(code);\n    if (!name || name === code) {\n      return code;\n    }\n    return name.charAt(0).toLocaleUpperCase(code) + name.slice(1);\n  } catch {\n    return code;\n  }\n}\n\nfunction storedLanguage(): string | null {\n  try {\n    return localStorage.getItem(LANGUAGE_STORAGE_KEY);\n  } catch {\n    return null;\n  }\n}\n\nfunction matchPreference(\n  preference: string,\n  served: readonly string[],\n): string | undefined {\n  const exact = servedLanguage(preference, served);\n  if (exact !== undefined) {\n    return exact;\n  }\n  const canonical = canonicalOrNull(preference);\n  const base = canonical?.split('-', 1)[0];\n  return base === undefined || base === canonical\n    ? undefined\n    : servedLanguage(base, served);\n}\n\nexport function detectInitialLanguage(served: readonly string[]): string {\n  const stored = servedLanguage(storedLanguage(), served);\n  if (stored !== undefined) {\n    return stored;\n  }\n  for (const preference of navigator.languages ?? [navigator.language]) {\n    const match = matchPreference(preference, served);\n    if (match !== undefined) {\n      return match;\n    }\n  }\n  return served.includes(FALLBACK_LANGUAGE)\n    ? FALLBACK_LANGUAGE\n    : (served[0] ?? FALLBACK_LANGUAGE);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, isDevMode, Service, signal } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SETTINGS_STORE } from '../persistence/settings-store';\nimport { hydrateAsync } from '../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../persistence/cross-tab/state-sync.service';\nimport { LANGUAGE_STORAGE_KEY } from '../persistence/device-level-keys';\nimport {\n  detectInitialLanguage,\n  languageName,\n  SERVED_LANGUAGES,\n  ServedLanguage,\n  servedLanguage,\n} from './served-languages';\n\n/**\n * The workbench's language, for a product's own language control. It is the same mechanism the\n * shipped switcher uses, so a control a distribution registers in place of `shell.language`, in any\n * bar or as a settings row, changes the language exactly as the switcher does: re-rendered at once,\n * declared on `<html lang>`, remembered through the settings port and followed by the application's\n * other windows and isolated surfaces.\n *\n * The served set is what the distribution declared with `provideShell({ languages })`, or English and\n * German when it declared nothing.\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  /** The codes of the served languages, in the order the distribution declared them. */\n  readonly supported = inject(SERVED_LANGUAGES);\n\n  /**\n   * The served languages with the name of each in its own language (\"Deutsch\", \"Français\"), the same\n   * names the shipped switcher shows. A code the platform cannot name is shown as the code.\n   */\n  readonly languages: readonly ServedLanguage[] = this.supported.map(\n    (code) => ({\n      code,\n      name: languageName(code),\n    }),\n  );\n\n  private readonly active = signal<string>(\n    detectInitialLanguage(this.supported),\n  );\n\n  /** The active language code, reactive. */\n  readonly lang = this.active.asReadonly();\n\n  constructor() {\n    this.document.documentElement.lang = this.lang();\n    this.applyStored(this.store.peek?.(LANGUAGE_STORAGE_KEY));\n    hydrateAsync(this.store, LANGUAGE_STORAGE_KEY, (raw) =>\n      this.applyStored(raw),\n    );\n    this.sync.register('settings', LANGUAGE_STORAGE_KEY, (raw) =>\n      this.applyStored(raw),\n    );\n  }\n\n  /**\n   * Makes `lang` the active language and remembers it. A code the workbench does not serve changes\n   * nothing, and the developer is told in development, rather than silently doing nothing.\n   */\n  setLang(lang: string): void {\n    const served = servedLanguage(lang, this.supported);\n    if (served === undefined) {\n      if (isDevMode()) {\n        console.warn(\n          `LocaleService.setLang(\"${lang}\") changed nothing: the workbench serves ${this.supported.join(', ')}.`,\n        );\n      }\n      return;\n    }\n    this.applyLanguage(served);\n    void this.store.set(LANGUAGE_STORAGE_KEY, served);\n  }\n\n  private applyStored(raw: string | null | undefined): void {\n    const lang = servedLanguage(raw, this.supported);\n    if (lang !== undefined) {\n      this.applyLanguage(lang);\n    }\n  }\n\n  private applyLanguage(lang: string): void {\n    this.active.set(lang);\n    this.transloco.setActiveLang(lang);\n    this.document.documentElement.lang = lang;\n  }\n}\n","import {\n  inject,\n  isDevMode,\n  Service,\n  signal,\n  WritableSignal,\n} from '@angular/core';\nimport { PluginState, StateHandle } from '@loomweaver/plugin-sdk';\nimport { HeldWrites } from '../persistence/held-writes/held-writes';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport {\n  hydrateAsync,\n  readStoredValue,\n} from '../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../persistence/cross-tab/state-sync.service';\nimport { parseStored } from '../persistence/stored-values/parse-stored';\n\nconst STORAGE_PREFIX = 'lw.plugin-state:';\nconst INDEX_PREFIX = 'lw.plugin-state-keys:';\nconst MAX_VALUE_CHARACTERS = 64 * 1024;\nconst MAX_KEYS = 64;\n\nfunction serialise(value: unknown): string | undefined {\n  try {\n    return JSON.stringify(value);\n  } catch {\n    return undefined;\n  }\n}\n\nfunction parseKeys(raw: string | undefined): string[] {\n  const parsed = parseStored(raw);\n  return Array.isArray(parsed)\n    ? parsed.filter((key): key is string => typeof key === 'string')\n    : [];\n}\n\ntype Listener = (value: unknown, loaded: boolean) => void;\n\ninterface Entry {\n  readonly storageKey: string;\n  readonly pluginId: string;\n  readonly value: WritableSignal<unknown>;\n  readonly loaded: WritableSignal<boolean>;\n  readonly listeners: Set<Listener>;\n  watchers: number;\n}\n\n@Service()\nexport class PluginStateService {\n  private readonly store = inject(WORKING_STATE_STORE);\n  private readonly sync = inject(StateSyncService);\n  private readonly heldWrites = inject(HeldWrites);\n  private readonly entries = new Map<string, Entry>();\n  private readonly keysByPlugin = new Map<string, Set<string>>();\n\n  private readonly indexReads = new Map<string, Promise<void>>();\n\n  private readonly removedBeforeRead = 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(parseStored(raw));\n      entry.loaded.set(true);\n      this.announce(entry);\n    });\n    this.sync.onNamespaceAdopted(() => this.rereadEntries());\n  }\n\n  forPlugin(pluginId: string): PluginState {\n    return {\n      watch: <T>(key: string) => this.watch<T>(pluginId, key),\n    };\n  }\n\n  removePlugin(pluginId: string): void {\n    const snapshot = [...this.entries];\n    for (const [storageKey, entry] of snapshot) {\n      if (entry.pluginId !== pluginId) {\n        continue;\n      }\n\n      this.cancelPending(entry);\n      entry.value.set(undefined);\n      this.entries.delete(storageKey);\n    }\n    const known = [...(this.keysByPlugin.get(pluginId) ?? [])];\n    this.keysByPlugin.delete(pluginId);\n    this.indexReads.delete(pluginId);\n    this.removedBeforeRead.delete(pluginId);\n    void readStoredValue(this.store, INDEX_PREFIX + pluginId).then((raw) => {\n      for (const key of new Set([...known, ...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 async rereadEntries(): Promise<void> {\n    for (const [storageKey, entry] of this.entries) {\n      const raw = await readStoredValue(this.store, storageKey);\n      this.cancelPending(entry);\n      entry.value.set(parseStored(raw));\n      entry.loaded.set(true);\n      this.announce(entry);\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 own = new Set<Listener>();\n    const release = () => {\n      if (!live) {\n        return;\n      }\n      live = false;\n      for (const listener of own) {\n        entry.listeners.delete(listener);\n      }\n      entry.watchers -= 1;\n      if (entry.watchers !== 0) {\n        return;\n      }\n\n      this.flush(entry);\n      this.entries.delete(entry.storageKey);\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      onChange: (listener) => {\n        if (!live) {\n          return;\n        }\n        const told = listener as Listener;\n        own.add(told);\n        entry.listeners.add(told);\n        if (entry.loaded()) {\n          told(entry.value(), true);\n        }\n      },\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>(parseStored(this.store.peek?.(storageKey)));\n    const loaded = signal(this.store.peek !== undefined);\n    const entry: Entry = {\n      storageKey,\n      pluginId,\n      value,\n      loaded,\n      listeners: new Set(),\n      watchers: 0,\n    };\n    this.entries.set(storageKey, entry);\n    hydrateAsync(\n      this.store,\n      storageKey,\n      (raw) => value.set(parseStored(raw)),\n      () => {\n        loaded.set(true);\n        this.announce(entry);\n      },\n    );\n    return entry;\n  }\n\n  private write(entry: Entry, key: string, next: unknown): void {\n    const serialised = serialise(next);\n    if (serialised === undefined) {\n      console.error(\n        `Plugin \"${entry.pluginId}\": state key \"${key}\" got a value with no JSON form and the ` +\n          `write was refused. Clear the key to remove it.`,\n      );\n      return;\n    }\n    if (!this.admits(entry.pluginId, key, serialised)) {\n      return;\n    }\n    this.index(entry.pluginId, key);\n    entry.value.set(next);\n    this.heldWrites.hold(entry.storageKey, serialised, (held) => {\n      void this.store.set(entry.storageKey, held);\n    });\n    this.announce(entry);\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    this.forgetKey(entry.pluginId, key);\n    this.persistIndex(entry.pluginId);\n    this.announce(entry);\n  }\n\n  private announce(entry: Entry): void {\n    const value = entry.value();\n    const loaded = entry.loaded();\n    for (const listener of entry.listeners) {\n      listener(value, loaded);\n    }\n  }\n\n  private flush(entry: Entry): void {\n    this.heldWrites.flush(entry.storageKey);\n  }\n\n  private cancelPending(entry: Entry): void {\n    this.heldWrites.cancel(entry.storageKey);\n  }\n\n  private admits(pluginId: string, key: string, serialised: string): boolean {\n    const characters = serialised.length;\n    if (characters > MAX_VALUE_CHARACTERS) {\n      console.error(\n        `Plugin \"${pluginId}\": state key \"${key}\" is ${characters} characters long, over the ` +\n          `${MAX_VALUE_CHARACTERS}-character limit for one value. The write was refused. Keep large ` +\n          `payloads out of the store and put a pointer to them in it instead.`,\n      );\n      return false;\n    }\n    const keys = this.knownKeys(pluginId);\n    const isNew = !keys.has(key);\n    if (isNew && 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() && characters > MAX_VALUE_CHARACTERS / 2) {\n      console.warn(\n        `Plugin \"${pluginId}\": state key \"${key}\" is ${characters} characters long, past half the ` +\n          `per-value limit.`,\n      );\n    }\n    if (isDevMode() && isNew && 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    return true;\n  }\n\n  private index(pluginId: string, key: string): void {\n    const keys = this.knownKeys(pluginId);\n    if (keys.has(key)) {\n      return;\n    }\n    keys.add(key);\n    this.persistIndex(pluginId);\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(parseKeys(this.store.peek?.(INDEX_PREFIX + pluginId)));\n    const removed = new Set<string>();\n    this.keysByPlugin.set(pluginId, keys);\n    this.removedBeforeRead.set(pluginId, removed);\n    this.indexReads.set(\n      pluginId,\n      readStoredValue(this.store, INDEX_PREFIX + pluginId).then((raw) => {\n        for (const key of parseKeys(raw)) {\n          if (!removed.has(key)) {\n            keys.add(key);\n          }\n        }\n        this.removedBeforeRead.delete(pluginId);\n      }),\n    );\n    return keys;\n  }\n\n  private forgetKey(pluginId: string, key: string): void {\n    this.knownKeys(pluginId).delete(key);\n    this.removedBeforeRead.get(pluginId)?.add(key);\n  }\n\n  private persistIndex(pluginId: string): void {\n    const keys = this.keysByPlugin.get(pluginId);\n    void (this.indexReads.get(pluginId) ?? Promise.resolve()).then(() => {\n      if (!keys || this.keysByPlugin.get(pluginId) !== keys) {\n        return;\n      }\n      void this.store.set(INDEX_PREFIX + pluginId, JSON.stringify([...keys]));\n    });\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 {\n  computed,\n  effect,\n  inject,\n  Service,\n  signal,\n  Signal,\n} from '@angular/core';\nimport { persistedSetting } from '../persistence/stored-values/persisted-setting';\nimport { THEME_STORAGE_KEY } from '../persistence/device-level-keys';\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 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 * 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 systemDark = this.watchSystemPreference();\n\n  private readonly stored = persistedSetting<ThemeMode>(THEME_STORAGE_KEY, {\n    parse: sanitizeMode,\n    serialize: (mode) => mode,\n  });\n\n  /** The user's choice, including `system`. Use {@link resolvedTheme} to know what is rendered. */\n  readonly mode = this.stored.value;\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    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.stored.set(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-unsaved',\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-scroll-thumb',\n  '--lw-scroll-track',\n  '--lw-font-sans',\n  '--lw-font-mono',\n] as const;\n\nconst known = new Set<string>(LW_TOKENS);\n\nexport function isKnownToken(name: string): boolean {\n  return known.has(name);\n}\n","import { isKnownToken } from './theme-tokens';\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 (isKnownToken(name) && !owners.has(name)) {\n        owners.set(name, registration);\n      }\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.append(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  removeThemeRegistration,\n} from './plugin-theme-layer';\nimport { isKnownToken } from './theme-tokens';\n\n@Service()\nexport class ThemeRegistry {\n  readonly revision = 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.revision.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 } from '@angular/core';\nimport { persistedSetting } from '../persistence/stored-values/persisted-setting';\nimport { FONT_SCALE_STORAGE_KEY } from '../persistence/device-level-keys';\n\nexport type FontScale = 'sm' | 'md' | 'lg' | 'xl';\n\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\n  private readonly stored = persistedSetting<FontScale>(\n    FONT_SCALE_STORAGE_KEY,\n    {\n      parse: sanitizeScale,\n      serialize: (scale) => scale,\n    },\n  );\n\n  readonly scale = this.stored.value;\n\n  constructor() {\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.stored.set(scale);\n  }\n}\n","import { InjectionToken, Provider, inject, 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\nconst CAPABILITY_GRANT_DECLARATIONS = new InjectionToken<readonly CapabilityGrants[]>(\n  'CAPABILITY_GRANT_DECLARATIONS',\n);\n\n/**\n * The active capability grants, composed from every {@link provideCapabilityGrants} declaration\n * in the injector. Defaults to **empty** (default-deny — no plugin can do anything until granted).\n * A product feeds per-tenant grants from its own backend by providing this token itself.\n */\nexport const CAPABILITY_GRANTS = new InjectionToken<CapabilityGrants>(\n  'CAPABILITY_GRANTS',\n  {\n    providedIn: 'root',\n    factory: () =>\n      composeGrants(inject(CAPABILITY_GRANT_DECLARATIONS, { optional: true }) ?? []),\n  },\n);\n\n/**\n * A distribution declares which plugin gets which capabilities. The composition root is the\n * authoritative grant source, and a plugin it does not name gets nothing, first-party or not. A\n * product backend can replace it by providing `CAPABILITY_GRANTS`.\n *\n * Several calls add up: each declaration contributes what it lists, and a plugin named in more\n * than one holds the union. That is what lets a generator append one call per plugin it composes\n * in, and a single call naming every plugin means exactly what it always meant.\n */\nexport function provideCapabilityGrants(grants: CapabilityGrants): Provider {\n  return { provide: CAPABILITY_GRANT_DECLARATIONS, useValue: grants, multi: true };\n}\n\nfunction composeGrants(declarations: readonly CapabilityGrants[]): CapabilityGrants {\n  const composed = new Map<string, Set<Capability>>();\n  for (const declaration of declarations) {\n    for (const [pluginId, capabilities] of Object.entries(declaration)) {\n      const set = composed.get(pluginId) ?? new Set<Capability>();\n      for (const capability of capabilities) {\n        set.add(capability);\n      }\n      composed.set(pluginId, set);\n    }\n  }\n  return Object.fromEntries([...composed].map(([pluginId, set]) => [pluginId, [...set]]));\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 */\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","import { computed, inject, Service, signal } from '@angular/core';\nimport { CAPABILITIES, Capability } from '@loomweaver/plugin-sdk';\nimport { persistedSetting } from '../persistence/stored-values/persisted-setting';\nimport { CAPABILITY_GRANTS, effectiveCapabilities } from './provide-capability-grants';\nimport {\n  ID_SET_CODEC,\n  parseIdSet,\n  toggledIdSet,\n} from '../persistence/stored-values/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 grants (from the composition root, or from a\n * product backend that provides `CAPABILITY_GRANTS`) form each plugin's **base** set\n * (grant ∩ declaration). On top of that the user can **revoke** a granted capability at runtime; the\n * decision is user-local and persisted through the {@link SETTINGS_STORE}, exactly like the rest of\n * the chrome state. Every `ctx` call consults {@link isGranted}, so a revocation takes effect on the\n * plugin's next call without a reload, and the user's choices in the Permissions settings can never\n * reach wider than the distribution allowed.\n */\n@Service()\nexport class CapabilityGrantService {\n  private readonly grants = inject(CAPABILITY_GRANTS);\n\n  private readonly revocations = persistedSetting(STORAGE_KEY, {\n    ...ID_SET_CODEC,\n    parse: parseRevocations,\n  });\n\n  private readonly revoked = this.revocations.value;\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      .toSorted((a, b) => a.pluginId.localeCompare(b.pluginId));\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    this.revocations.update((revoked) =>\n      toggledIdSet(revoked, revocationKey(pluginId, capability), !granted),\n    );\n  }\n}\n","/**\n * How much the browser holds a sandboxed 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 function exceedsLevel(\n  asked: PluginIsolationLevel,\n  maxLevel: PluginIsolationLevel,\n): boolean {\n  return asked === 'embedded' && maxLevel === 'isolated';\n}\n","import { Service, signal } from '@angular/core';\nimport {\n  DEFAULT_ISOLATION_LEVEL,\n  PluginIsolationLevel,\n  PluginRung,\n} from '../foundation/plugin-isolation-level';\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","export function withinDeadline<T>(\n  work: Promise<T>,\n  timeoutMs: number,\n): Promise<T | undefined> {\n  let timer: ReturnType<typeof setTimeout>;\n  const deadline = new Promise<undefined>((resolve) => {\n    timer = setTimeout(() => resolve(undefined), timeoutMs);\n  });\n  return Promise.race([work.catch(() => undefined), deadline]).finally(() =>\n    clearTimeout(timer),\n  );\n}\n","import type { LwSurfaceCapture } from '../surface-kit/surface-kit.frame';\n\nconst MAX_IMAGE_LENGTH = 32 * 1024 * 1024;\n\nconst MAX_EDGE = 16_384;\n\nconst DATA_IMAGE = /^data:image\\/(png|jpeg|webp);base64,[A-Za-z0-9+/=]+$/;\n\nfunction isEdge(value: unknown): value is number {\n  return (\n    typeof value === 'number' &&\n    Number.isSafeInteger(value) &&\n    value > 0 &&\n    value <= MAX_EDGE\n  );\n}\n\nexport function readSurfaceCapture(\n  answer: unknown,\n): LwSurfaceCapture | undefined {\n  if (typeof answer !== 'object' || answer === null) {\n    return undefined;\n  }\n  const { image, width, height } = answer as Record<string, unknown>;\n  if (typeof image !== 'string' || image.length > MAX_IMAGE_LENGTH) {\n    return undefined;\n  }\n  if (!DATA_IMAGE.test(image)) {\n    return undefined;\n  }\n  if (!isEdge(width) || !isEdge(height)) {\n    return undefined;\n  }\n  return { image, width, height };\n}\n","import type {\n  LwSurfaceCapture,\n  LwSurfaceCaptureRequest,\n} from '../surface-kit/surface-kit.frame';\nimport { withinDeadline } from './deadline';\nimport { PictureEncoding } from './picture-form';\nimport { readSurfaceCapture } from './surface-answer';\n\nexport const SURFACE_CAPTURE_TIMEOUT_MS = 4000;\n\nexport const DECODE_TIMEOUT_MS = 2000;\n\nexport interface DrawRequest extends PictureEncoding {\n  readonly scale: number;\n}\n\nexport type SurfaceDrawHook = (\n  request: LwSurfaceCaptureRequest,\n) => Promise<unknown>;\n\nexport function askSurfaceToDraw(\n  hook: SurfaceDrawHook | undefined,\n  request: DrawRequest,\n  withheldLabel: string,\n): Promise<LwSurfaceCapture | undefined> {\n  if (typeof hook !== 'function') {\n    return Promise.resolve(undefined);\n  }\n  return withinDeadline(\n    Promise.resolve()\n      .then(() => hook({ ...request, withheldLabel }))\n      .then(readSurfaceCapture),\n    SURFACE_CAPTURE_TIMEOUT_MS,\n  );\n}\n\nexport function decodeCapture(\n  capture: LwSurfaceCapture | undefined,\n  view: Window,\n): Promise<CanvasImageSource | undefined> {\n  if (!capture) {\n    return Promise.resolve(undefined);\n  }\n  const decoded = new Promise<CanvasImageSource | undefined>((resolve) => {\n    const image = view.document.createElement('img');\n    image.addEventListener('load', () => resolve(image));\n    image.addEventListener('error', () => resolve(undefined));\n    image.src = capture.image;\n  });\n  return withinDeadline(decoded, DECODE_TIMEOUT_MS).then(\n    (result) => result ?? undefined,\n  );\n}\n","import { DOCUMENT, inject, Service } from '@angular/core';\nimport type { LwSurfaceCapture } from '../surface-kit/surface-kit.frame';\nimport { DrawRequest } from './ask-surface';\n\nexport interface CapturableSurface {\n  readonly element: Element;\n  captureSelf(request: DrawRequest): Promise<LwSurfaceCapture | undefined>;\n}\n\n@Service()\nexport class SurfaceCaptureRegistry {\n  private readonly document = inject(DOCUMENT);\n\n  private readonly mounted = new Set<CapturableSurface>();\n\n  register(surface: CapturableSurface): () => void {\n    this.mounted.add(surface);\n    return () => {\n      this.mounted.delete(surface);\n    };\n  }\n\n  visible(): readonly CapturableSurface[] {\n    const view = this.document.defaultView;\n    if (!view) {\n      return [];\n    }\n    return [...this.mounted].filter(\n      (surface) =>\n        surface.element.isConnected &&\n        surface.element.ownerDocument === this.document &&\n        isOnScreen(surface.element, view),\n    );\n  }\n}\n\nfunction isOnScreen(element: Element, view: Window): boolean {\n  const rect = element.getBoundingClientRect();\n  return (\n    rect.width > 0 &&\n    rect.height > 0 &&\n    rect.bottom > 0 &&\n    rect.right > 0 &&\n    rect.top < view.innerHeight &&\n    rect.left < view.innerWidth\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  heroEllipsisHorizontal,\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  heroViewColumns,\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  sidebarLeftOpen:\n    '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path fill=\"currentColor\" fill-opacity=\".28\" stroke=\"none\" d=\"M3.75 3H9v18H3.75a.75.75 0 0 1-.75-.75V3.75A.75.75 0 0 1 3.75 3Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3h16.5a.75.75 0 0 1 .75.75v16.5a.75.75 0 0 1-.75.75H3.75a.75.75 0 0 1-.75-.75V3.75A.75.75 0 0 1 3.75 3ZM9 3v18\"/></svg>',\n\n  sidebarLeftClosed:\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=\"M3.75 3h16.5a.75.75 0 0 1 .75.75v16.5a.75.75 0 0 1-.75.75H3.75a.75.75 0 0 1-.75-.75V3.75A.75.75 0 0 1 3.75 3ZM9 3v18\"/></svg>',\n\n  sidebarRightOpen:\n    '<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"><path fill=\"currentColor\" fill-opacity=\".28\" stroke=\"none\" d=\"M15 3h5.25a.75.75 0 0 1 .75.75v16.5a.75.75 0 0 1-.75.75H15V3Z\"/><path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3h16.5a.75.75 0 0 1 .75.75v16.5a.75.75 0 0 1-.75.75H3.75a.75.75 0 0 1-.75-.75V3.75A.75.75 0 0 1 3.75 3ZM15 3v18\"/></svg>',\n\n  sidebarRightClosed:\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=\"M3.75 3h16.5a.75.75 0 0 1 .75.75v16.5a.75.75 0 0 1-.75.75H3.75a.75.75 0 0 1-.75-.75V3.75A.75.75 0 0 1 3.75 3ZM15 3v18\"/></svg>',\n  workspaces: heroRectangleGroup,\n\n  menu: heroBars3,\n  more: heroEllipsisHorizontal,\n  document: heroDocument,\n  openWork: heroViewColumns,\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 { Methods } from 'penpal';\nimport { distributionIcons } from '../../../elements/icon/icon-registry';\nimport { LW_TOKENS } from '../../../theme/theme-tokens';\nimport { isAtOrBelow, normalizePath } from '../content-path';\nimport type {\n  LwSlotView,\n  LwSurfaceCaptureRequest,\n} from '../../../surface-kit/surface-kit.frame';\n\nexport interface 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\nexport type SurfaceRemote = Methods & {\n  render(state: SurfaceState): Promise<void>;\n  beforeClose(): Promise<boolean> | boolean;\n  stateChanged(key: string, value: unknown, loaded: boolean): void;\n  slotChanged(subscription: string, view: LwSlotView): void;\n  capture(request: LwSurfaceCaptureRequest): Promise<unknown>;\n};\n\nexport function resolvedLook(\n  document: Document,\n): Pick<SurfaceState, 'tokens' | 'rootFontSize' | 'icons'> {\n  const styles = getComputedStyle(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\nexport function confinedTarget(tabRoot: string, path: string): string {\n  const target = normalizePath(path);\n  if (!isAtOrBelow(tabRoot, target)) {\n    throw new Error(\n      `Surface navigation is confined to its own tab root \"${tabRoot}\" — got \"${target}\". ` +\n        `Use the plugin (logic) channel's ctx.navigateContent for anything else ('navigation' grant).`,\n    );\n  }\n  return target;\n}\n","export type WireRecord = Readonly<Record<string, unknown>>;\n\nexport function wireRecord(value: unknown): WireRecord {\n  return (value ?? {}) as WireRecord;\n}\n\nexport function isWireObject(value: unknown): value is WireRecord {\n  return typeof value === 'object' && value !== null;\n}\n\nexport function optionalText(value: unknown): string | undefined {\n  return typeof value === 'string' ? value : undefined;\n}\n\nexport function optionalNumber(value: unknown): number | undefined {\n  return typeof value === 'number' ? value : undefined;\n}\n\nexport function onlyTrue(value: unknown): true | undefined {\n  return value === true ? true : undefined;\n}\n\nexport function textList(value: unknown): string[] | undefined {\n  return Array.isArray(value)\n    ? value.filter((item): item is string => typeof item === 'string')\n    : undefined;\n}\n\nexport function requiredText(value: unknown, refusal: string): string {\n  if (typeof value !== 'string' || value.length === 0) {\n    throw new Error(refusal);\n  }\n  return value;\n}\n\nexport function textArgument(\n  value: unknown,\n  call: string,\n  name: string,\n): string {\n  if (typeof value !== 'string') {\n    throw new TypeError(\n      `Sandbox plugin: ${call} takes '${name}' as a string, got ${typeof value}.`,\n    );\n  }\n  return value;\n}\n","import { effect, Injector } from '@angular/core';\nimport { PluginState, StateHandle } from '@loomweaver/plugin-sdk';\nimport { textArgument } from './frame/rpc/wire-fields';\n\ninterface WatchedKey {\n  readonly handle: StateHandle;\n  readonly stop: () => void;\n}\n\nexport type StatePush = (key: string, value: unknown, loaded: boolean) => void;\n\nexport class PluginStateBridge {\n  private readonly watched = new Map<string, WatchedKey>();\n\n  constructor(\n    private readonly state: PluginState | undefined,\n    private readonly injector: Injector,\n    private readonly push: StatePush,\n  ) {}\n\n  watch(raw: unknown): void {\n    const key = textArgument(raw, 'stateWatch', 'key');\n    if (this.state === undefined || this.watched.has(key)) {\n      return;\n    }\n    const handle = this.state.watch(key);\n    const ref = effect(\n      () => {\n        const value = handle.value();\n        const loaded = handle.loaded();\n        queueMicrotask(() => this.push(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  set(raw: unknown, value: unknown): void {\n    this.watched.get(textArgument(raw, 'stateSet', 'key'))?.handle.set(value);\n  }\n\n  clear(raw: unknown): void {\n    this.watched.get(textArgument(raw, 'stateClear', 'key'))?.handle.clear();\n  }\n\n  unwatch(raw: unknown): void {\n    const key = textArgument(raw, 'stateUnwatch', 'key');\n    this.watched.get(key)?.stop();\n    this.watched.delete(key);\n  }\n\n  replay(): void {\n    for (const [key, entry] of this.watched) {\n      this.push(key, entry.handle.value(), entry.handle.loaded());\n    }\n  }\n\n  stopAll(): void {\n    for (const entry of this.watched.values()) {\n      entry.stop();\n    }\n    this.watched.clear();\n  }\n}\n","import { effect, Injector } from '@angular/core';\nimport { MenuContext, MenuHeader } from '@loomweaver/plugin-sdk';\nimport { Wording } from '../../../i18n/wording';\nimport { ResolvedEntry } from '../../../menu/menu-resolution';\nimport { MenuAnswer, MenuService } from '../../../menu/menu.service';\nimport type {\n  LwSlotHeader,\n  LwSlotView,\n} from '../../../surface-kit/surface-kit.frame';\nimport { ToolbarEntry } from '../../toolbar/toolbar-entries';\nimport {\n  MORE_KEY,\n  ToolbarSlots,\n  ToolbarSlotView,\n} from '../../toolbar/toolbar-slots.service';\n\nexport type SlotPush = (subscription: string, view: LwSlotView) => void;\n\ninterface MenuOpening {\n  readonly menu: string;\n  readonly context: MenuContext;\n  readonly header?: MenuHeader;\n}\n\ninterface Subscription {\n  readonly stop: () => void;\n  readonly run: (key: string) => void;\n  readonly opening: (key: string) => MenuOpening | undefined;\n  last?: LwSlotView;\n}\n\nexport function frameSlotView(view: ToolbarSlotView): LwSlotView {\n  return {\n    label: view.label,\n    moreLabel: view.moreLabel,\n    entries: view.entries.map((entry) => ({\n      key: entry.key,\n      label: entry.label,\n      group: entry.group,\n      order: entry.order,\n      icon: entry.icon,\n      shortcut: entry.shortcut,\n      pressed: entry.pressed,\n      disabled: entry.disabled,\n      opensMenu: entry.opensMenu,\n      variant: entry.variant,\n    })),\n  };\n}\n\nexport class SlotBridge {\n  private readonly subscriptions = new Map<string, Subscription>();\n\n  private readonly menus: MenuService;\n\n  private readonly wording: Wording;\n\n  private counter = 0;\n\n  constructor(\n    private readonly slots: ToolbarSlots,\n    private readonly injector: Injector,\n    private readonly push: SlotPush,\n  ) {\n    this.menus = injector.get(MenuService);\n    this.wording = injector.get(Wording);\n  }\n\n  watch(slot: string, context: MenuContext): string {\n    let resolved: readonly ResolvedEntry<ToolbarEntry>[] = [];\n    const find = (key: string) =>\n      resolved.find((candidate) => candidate.item.id === key);\n    return this.subscribe(\n      () => {\n        const view = this.slots.view(slot, context);\n        resolved = view.resolved;\n        return frameSlotView(view);\n      },\n      (key) => {\n        const entry = find(key);\n        if (entry) {\n          this.slots.run(entry, context);\n        }\n      },\n      (key) => {\n        const entry = find(key);\n        return entry?.opensMenu === undefined || entry.disabled\n          ? undefined\n          : {\n              menu: entry.opensMenu,\n              context: this.slots.contextFor(entry.item, context),\n              header: entry.item.menuHeader,\n            };\n      },\n    );\n  }\n\n  open(subscription: string, key: string): string | undefined {\n    const opening = this.subscriptions.get(subscription)?.opening(key);\n    if (!opening) {\n      return undefined;\n    }\n    let answer: MenuAnswer = { entries: [] };\n    return this.subscribe(\n      () => {\n        answer = this.menus.answer(\n          [opening.menu],\n          opening.context,\n          opening.header,\n        );\n        return this.menuView(answer, opening.header);\n      },\n      (chosen) => this.menus.choose(answer, chosen, opening.context),\n      () => undefined,\n    );\n  }\n\n  unwatch(subscription: string): void {\n    this.subscriptions.get(subscription)?.stop();\n    this.subscriptions.delete(subscription);\n  }\n\n  activate(subscription: string, key: string): void {\n    this.subscriptions.get(subscription)?.run(key);\n  }\n\n  replay(): void {\n    for (const [id, entry] of this.subscriptions) {\n      if (entry.last) {\n        this.push(id, entry.last);\n      }\n    }\n  }\n\n  stopAll(): void {\n    for (const entry of this.subscriptions.values()) {\n      entry.stop();\n    }\n    this.subscriptions.clear();\n  }\n\n  private subscribe(\n    view: () => LwSlotView,\n    run: (key: string) => void,\n    opening: (key: string) => MenuOpening | undefined,\n  ): string {\n    this.counter += 1;\n    const id = `slot-${this.counter}`;\n    const entry: Subscription = { run, opening, stop: () => ref.destroy() };\n    this.subscriptions.set(id, entry);\n    const ref = effect(\n      () => {\n        const framed = view();\n        entry.last = framed;\n        queueMicrotask(() => {\n          if (this.subscriptions.get(id) === entry) {\n            this.push(id, framed);\n          }\n        });\n      },\n      { injector: this.injector },\n    );\n    return id;\n  }\n\n  private menuView(answer: MenuAnswer, header?: MenuHeader): LwSlotView {\n    const translate = (key: string) => this.wording.translate(key);\n    return {\n      label: header ? translate(header.title) : '',\n      moreLabel: translate(MORE_KEY),\n      header: header && this.headerView(header, answer),\n      entries: answer.entries.map((entry) => ({\n        key: entry.key,\n        label: translate(entry.title),\n        group: entry.group,\n        order: entry.order,\n        icon: entry.icon,\n        shortcut: entry.shortcut,\n        pressed: entry.checkbox ? entry.checked : undefined,\n        disabled: entry.disabled,\n      })),\n    };\n  }\n\n  private headerView(header: MenuHeader, answer: MenuAnswer): LwSlotHeader {\n    const translate = (key: string) => this.wording.translate(key);\n    return {\n      title: translate(header.title),\n      detail: header.detail && translate(header.detail),\n      icon: header.icon,\n      initials: header.initials,\n      image: header.image,\n      leadsTo: answer.leadsTo && translate(answer.leadsTo.title),\n    };\n  }\n}\n","import { Data } from '@angular/router';\nimport { ContainerSpec } from '@loomweaver/plugin-sdk';\n\nexport interface SurfaceRouteData {\n  readonly iframe?: string;\n  readonly container?: ContainerSpec;\n  readonly pluginId?: string;\n  readonly rest?: boolean;\n  readonly sub?: string;\n  readonly urlDriven?: boolean;\n  readonly docked?: boolean;\n  readonly instanceId?: string;\n}\n\nexport function surfaceRouteData(data: Data): SurfaceRouteData {\n  return data;\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n  Component,\n  DestroyRef,\n  ElementRef,\n  afterNextRender,\n  isDevMode,\n  computed,\n  effect,\n  inject,\n  Injector,\n  linkedSignal,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { ActivatedRoute } from '@angular/router';\nimport { map } from 'rxjs';\nimport { CurrentAddress } from '../current-address';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { DirtySurface } from '@loomweaver/plugin-sdk';\nimport { Connection, WindowMessenger, connect } from 'penpal';\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 { AuthContext } from '../../../auth/auth-context';\nimport { CapabilityGrantService } from '../../../permissions/capability-grant.service';\nimport { PluginIsolationLevelService } from '../../../plugin-isolation/plugin-isolation-level.service';\nimport { ContentTabsService } from '../tabs/content-tabs.service';\nimport { normalizePath, restBelow, suffixOf } from '../content-path';\nimport type {\n  LwSlotView,\n  LwSurfaceCapture,\n} from '../../../surface-kit/surface-kit.frame';\nimport { askSurfaceToDraw, DrawRequest } from '../../../capture/ask-surface';\nimport { SurfaceCaptureRegistry } from '../../../capture/surface-capture-registry';\nimport {\n  confinedTarget,\n  resolvedLook,\n  SurfaceRemote,\n  SurfaceState,\n} from './iframe-surface-protocol';\nimport { PluginStateBridge } from '../../../plugin/plugin-state-bridge';\nimport { SlotBridge } from './slot-bridge';\nimport { ToolbarSlots } from '../../toolbar/toolbar-slots.service';\nimport { requiredMenuContext } from '../../../foundation/wire/menu-context-of';\nimport { surfaceRouteData } from './surface-route-data';\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\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 captureRegistry = inject(SurfaceCaptureRegistry);\n\n  private readonly transloco = inject(TranslocoService);\n\n  private readonly injector = inject(Injector);\n\n  private readonly frame =\n    viewChild.required<ElementRef<HTMLIFrameElement>>('frame');\n\n  private readonly host: Element = inject(ElementRef).nativeElement;\n\n  private readonly data = surfaceRouteData(this.route.snapshot.data);\n\n  protected readonly src: SafeResourceUrl = inject(\n    DomSanitizer,\n  ).bypassSecurityTrustResourceUrl(this.data.iframe as string);\n\n  private readonly pluginId = this.data.pluginId;\n\n  private readonly stateBridge = new PluginStateBridge(\n    this.pluginId === undefined\n      ? undefined\n      : this.pluginState.forPlugin(this.pluginId),\n    this.injector,\n    (key, value, loaded) => this.pushState(key, value, loaded),\n  );\n\n  private readonly slotBridge = new SlotBridge(\n    inject(ToolbarSlots),\n    this.injector,\n    (subscription, view) => this.pushSlot(subscription, view),\n  );\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 routeData = toSignal(\n    this.route.data.pipe(map(surfaceRouteData)),\n    { initialValue: this.data },\n  );\n\n  private readonly hostMounted = computed(() => !this.routeData().urlDriven);\n\n  private readonly docked = this.data.docked === true;\n\n  private readonly instanceId = this.data.instanceId;\n\n  private readonly routeParams = this.route.snapshot.params as Record<\n    string,\n    string\n  >;\n\n  private readonly ownsRest = this.data.rest === true;\n\n  private readonly hostSub = linkedSignal(() => this.routeData().sub ?? '');\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 = inject(CurrentAddress).url;\n\n  private readonly subPath = 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;\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    const unregister = this.captureRegistry.register({\n      element: this.host,\n      captureSelf: (request) => this.surfaceCapture(request),\n    });\n\n    afterNextRender(() => {\n      this.connect();\n      this.watchVisibility();\n    });\n\n    effect(() => {\n      const snapshot = this.reactiveState();\n      this.themes.revision();\n      this.fontScale.scale();\n      queueMicrotask(() =>\n        this.push({ ...snapshot, ...resolvedLook(this.document) }),\n      );\n    });\n    inject(DestroyRef).onDestroy(() => {\n      unregister();\n      this.stateBridge.stopAll();\n      this.slotBridge.stopAll();\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  surfaceCapture(request: DrawRequest): Promise<LwSurfaceCapture | undefined> {\n    return askSurfaceToDraw(\n      this.remote?.capture,\n      request,\n      this.transloco.translate('capture.areaWithheld'),\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),\n        stateWatch: (key: unknown) => this.stateBridge.watch(key),\n        stateSet: (key: unknown, value: unknown) =>\n          this.stateBridge.set(key, value),\n        stateClear: (key: unknown) => this.stateBridge.clear(key),\n        stateUnwatch: (key: unknown) => this.stateBridge.unwatch(key),\n        slotWatch: (slot: string, context: unknown) =>\n          this.slotBridge.watch(\n            slot,\n            requiredMenuContext(\n              context,\n              'Surface: slotWatch takes a context of named values, not anything else.',\n            ),\n          ),\n        slotUnwatch: (subscription: string) =>\n          this.slotBridge.unwatch(subscription),\n        slotActivate: (subscription: string, key: string) =>\n          this.slotBridge.activate(subscription, key),\n        slotOpen: (subscription: string, key: string) =>\n          this.slotBridge.open(subscription, key),\n      },\n    });\n    this.connection.promise\n      .then((remote) => {\n        this.remote = remote;\n        this.push({ ...this.reactiveState(), ...resolvedLook(this.document) });\n        this.stateBridge.replay();\n        this.slotBridge.replay();\n      })\n      .catch(() => undefined);\n  }\n\n  private pushSlot(subscription: string, view: LwSlotView): void {\n    try {\n      this.remote?.slotChanged(subscription, view);\n    } catch {\n      this.remote = undefined;\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.at(-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.subPath(),\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        session: {\n          authenticated: this.auth.authenticated(),\n          roles: this.auth.roles(),\n        },\n      }),\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 \"${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 target = confinedTarget(this.tabRoot, path);\n    if (this.hostMounted()) {\n      this.hostSub.set(restBelow(this.tabRoot, path));\n      return;\n    }\n    this.tabs.navigateTo(target + suffixOf(path));\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 {\n  Data,\n  Params,\n  Route,\n  UrlSegment,\n  convertToParamMap,\n} from '@angular/router';\n\nexport interface RouteSnapshotFields {\n  readonly url: UrlSegment[];\n  readonly params: Params;\n  readonly queryParams: Params;\n  readonly fragment: string | null;\n  readonly data: Data;\n  readonly routeConfig: Route | null;\n}\n\nexport function routeSnapshot(\n  fields: RouteSnapshotFields,\n): Record<string, unknown> {\n  return {\n    url: fields.url,\n    params: fields.params,\n    paramMap: convertToParamMap(fields.params),\n    queryParams: fields.queryParams,\n    queryParamMap: convertToParamMap(fields.queryParams),\n    fragment: fields.fragment,\n    data: fields.data,\n    outlet: 'primary',\n    component: null,\n    routeConfig: fields.routeConfig,\n    title: undefined,\n    parent: null,\n    firstChild: null,\n    children: [],\n  };\n}\n","import { ActivatedRoute, UrlSegment, convertToParamMap } from '@angular/router';\nimport { of } from 'rxjs';\nimport { RegisteredView } from '../../../contributions/contribution-registry';\nimport { routeSnapshot } from './route-snapshot';\nimport { SurfaceRouteData } from './surface-route-data';\n\ninterface SyntheticRouteInput {\n  readonly url: UrlSegment[];\n  readonly params: Record<string, string>;\n  readonly data: SurfaceRouteData;\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 = routeSnapshot({\n    url,\n    params,\n    queryParams: {},\n    fragment: null,\n    data,\n    routeConfig: null,\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 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","import {\n  ActivatedRoute,\n  ActivatedRouteSnapshot,\n  Data,\n  ParamMap,\n  Params,\n  Route,\n  UrlSegment,\n  convertToParamMap,\n} from '@angular/router';\nimport { BehaviorSubject, Observable, distinctUntilChanged, map } from 'rxjs';\nimport { matchRoute, paramsOfPattern, segmentsOf } from '../content-path';\nimport { RegisteredContentRoute } from '../../../contributions/contribution-registry';\nimport { routeSnapshot } from './route-snapshot';\nimport { SurfaceRouteData } from './surface-route-data';\n\nexport interface SurfaceAddress {\n  readonly path: string;\n  readonly carriesAddress: boolean;\n  readonly queryParams: Params;\n  readonly fragment: string | null;\n}\n\nexport interface LiveSurfaceRoute {\n  readonly route: ActivatedRoute;\n  update(address: SurfaceAddress): void;\n}\n\ninterface RouteState {\n  readonly routeConfig: Route | null;\n  readonly url: UrlSegment[];\n  readonly params: Params;\n  readonly queryParams: Params;\n  readonly fragment: string | null;\n  readonly data: SurfaceRouteData;\n  readonly subUrl: UrlSegment[];\n  readonly subParams: Params;\n}\n\nconst same = (a: unknown, b: unknown): boolean =>\n  JSON.stringify(a) === JSON.stringify(b);\n\nfunction toSegments(paths: readonly string[]): UrlSegment[] {\n  return paths.map((path) => new UrlSegment(path, {}));\n}\n\nfunction stateOf(\n  route: RegisteredContentRoute,\n  instanceId: string | undefined,\n  address: SurfaceAddress,\n): RouteState {\n  const pattern = segmentsOf(route.path);\n  const all = segmentsOf(address.path);\n  const sub = all.slice(pattern.length);\n  return {\n    routeConfig: address.carriesAddress ? { path: route.path } : null,\n    url: toSegments(all.slice(0, pattern.length)),\n    params: paramsOfPattern(route.path, address.path),\n    queryParams: address.queryParams,\n    fragment: address.fragment,\n    subUrl: toSegments(sub),\n    subParams: subParamsOf(route, sub.join('/')),\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.length > 0 && { sub: sub.join('/') }),\n      ...(address.carriesAddress && { urlDriven: true }),\n      ...(instanceId && { instanceId }),\n    },\n  };\n}\n\nfunction subParamsOf(route: RegisteredContentRoute, sub: string): Params {\n  const declared = matchRoute(\n    (route.subRoutes ?? []).map((path) => ({ path })),\n    sub,\n  );\n  return declared ? paramsOfPattern(declared.path, sub) : {};\n}\n\nfunction snapshotOf(\n  state: RouteState,\n  child: Record<string, unknown> | null,\n): ActivatedRouteSnapshot {\n  const snapshot = routeSnapshot({\n    url: state.url,\n    params: state.params,\n    queryParams: state.queryParams,\n    fragment: state.fragment,\n    data: state.data,\n    routeConfig: state.routeConfig,\n  });\n  snapshot['firstChild'] = child;\n  snapshot['children'] = child ? [child] : [];\n  snapshot['pathFromRoot'] = [snapshot];\n  snapshot['root'] = snapshot;\n  if (child) {\n    child['parent'] = snapshot;\n    child['root'] = snapshot;\n    child['pathFromRoot'] = [snapshot, child];\n  }\n  return snapshot as unknown as ActivatedRouteSnapshot;\n}\n\nfunction childSnapshotOf(state: RouteState): Record<string, unknown> | null {\n  if (state.subUrl.length === 0) {\n    return null;\n  }\n  return routeSnapshot({\n    url: state.subUrl,\n    params: state.subParams,\n    queryParams: state.queryParams,\n    fragment: state.fragment,\n    data: { sub: true },\n    routeConfig: null,\n  });\n}\n\nfunction select<T>(state: Observable<RouteState>, pick: (s: RouteState) => T) {\n  return state.pipe(map(pick), distinctUntilChanged<T>(same));\n}\n\nexport function liveSurfaceRoute(\n  route: RegisteredContentRoute,\n  initial: SurfaceAddress,\n  instanceId?: string,\n): LiveSurfaceRoute {\n  const state$ = new BehaviorSubject(stateOf(route, instanceId, initial));\n  const child$ = select(state$, (s) => s.subUrl);\n  const queryParams$ = select(state$, (s) => s.queryParams);\n  const fragment$ = select(state$, (s) => s.fragment);\n  const snapshot = (): ActivatedRouteSnapshot => {\n    const state = state$.value;\n    return snapshotOf(state, childSnapshotOf(state));\n  };\n  const params$ = select(state$, (s) => s.params);\n  const live: Record<string, unknown> = {\n    url: select(state$, (s) => s.url),\n    params: params$,\n    paramMap: params$.pipe(map((p): ParamMap => convertToParamMap(p))),\n    queryParams: queryParams$,\n    queryParamMap: queryParams$.pipe(map((p) => convertToParamMap(p))),\n    fragment: fragment$,\n    data: select(state$, (s) => s.data),\n    title: new BehaviorSubject<string | undefined>(undefined),\n    outlet: 'primary',\n    component: null,\n    parent: null,\n    children: [],\n  };\n  const subParams$ = select(state$, (s) => s.subParams);\n  const childRoute: Record<string, unknown> = {\n    url: child$,\n    params: subParams$,\n    paramMap: subParams$.pipe(map((p) => convertToParamMap(p))),\n    queryParams: queryParams$,\n    queryParamMap: queryParams$.pipe(map((p) => convertToParamMap(p))),\n    fragment: fragment$,\n    data: new BehaviorSubject<Data>({ sub: true }),\n    outlet: 'primary',\n    component: null,\n    routeConfig: null,\n    parent: live,\n    firstChild: null,\n    children: [],\n  };\n  Object.defineProperties(childRoute, {\n    snapshot: { get: () => snapshot().firstChild },\n  });\n  Object.defineProperties(live, {\n    snapshot: { get: snapshot },\n    routeConfig: { get: () => state$.value.routeConfig },\n    firstChild: {\n      get: () => (state$.value.subUrl.length > 0 ? childRoute : null),\n    },\n    root: { get: () => live },\n    pathFromRoot: { get: () => [live] },\n  });\n  return {\n    route: live as unknown as ActivatedRoute,\n    update(address) {\n      const next = stateOf(route, instanceId, address);\n      if (!same(next, state$.value)) {\n        state$.next(next);\n      }\n    },\n  };\n}\n","import { EnvironmentInjector, Injector } from '@angular/core';\nimport { ActivatedRoute, ChildrenOutletContexts } from '@angular/router';\nimport {\n  RegisteredContentRoute,\n  RegisteredView,\n} from '../../../contributions/contribution-registry';\nimport { syntheticDockedRoute } from './synthetic-route';\nimport {\n  LiveSurfaceRoute,\n  SurfaceAddress,\n  liveSurfaceRoute,\n} from './live-surface-route';\n\nexport interface SurfaceMount {\n  readonly injector: Injector;\n  readonly live: LiveSurfaceRoute;\n}\n\nexport interface SurfaceMounts {\n  mountFor(\n    route: RegisteredContentRoute,\n    key: string,\n    address: SurfaceAddress,\n  ): SurfaceMount;\n  releaseUnless(kept: (key: string) => boolean): void;\n}\n\nexport function surfaceMounts(\n  parent: Injector,\n  environmentInjector: EnvironmentInjector,\n): SurfaceMounts {\n  const cache = new Map<RegisteredContentRoute, Map<string, SurfaceMount>>();\n  return {\n    mountFor: (route, key, address) => {\n      let byKey = cache.get(route);\n      if (!byKey) {\n        byKey = new Map();\n        cache.set(route, byKey);\n      }\n      const cached = byKey.get(key);\n      if (cached) {\n        return cached;\n      }\n      const mount = newMount(route, key, address, parent, environmentInjector);\n      byKey.set(key, mount);\n      return mount;\n    },\n    releaseUnless: (kept) => {\n      for (const byKey of cache.values()) {\n        for (const key of byKey.keys()) {\n          if (!kept(key)) {\n            byKey.delete(key);\n          }\n        }\n      }\n    },\n  };\n}\n\nfunction newMount(\n  route: RegisteredContentRoute,\n  key: string,\n  address: SurfaceAddress,\n  parent: Injector,\n  environmentInjector: EnvironmentInjector,\n): SurfaceMount {\n  const live = liveSurfaceRoute(route, address, key);\n  return {\n    live,\n    injector: routeInjector(parent, environmentInjector, live.route),\n  };\n}\n\nfunction routeInjector(\n  parent: Injector,\n  environmentInjector: EnvironmentInjector,\n  route: ActivatedRoute,\n): Injector {\n  return Injector.create({\n    parent,\n    providers: [\n      { provide: ActivatedRoute, useValue: route },\n      {\n        provide: ChildrenOutletContexts,\n        useValue: new ChildrenOutletContexts(environmentInjector),\n      },\n    ],\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 = routeInjector(\n      parent,\n      environmentInjector,\n      syntheticDockedRoute(view, instanceId, params),\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 { placeBefore } from './atomic-move';\nimport { RetainedSlot } from './retained-view-model';\nimport { RetainedViewStash } from './retained-view-stash';\nimport { SurfaceRetentionMode } from './retention-policy';\nimport { SURFACE_HOLD_STATE } from './surface-hold';\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  private repairQueued = false;\n\n  private waiting = false;\n\n  constructor() {\n    effect(() => {\n      this.stash.version();\n      untracked(() => this.reconcile());\n    });\n  }\n\n  ngOnChanges(): void {\n    this.sync();\n  }\n\n  ngOnDestroy(): void {\n    this.letGo();\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.letGo();\n    }\n    this.waiting = false;\n    if (component === null || injector === null) {\n      return;\n    }\n    const hold = injector.get(SURFACE_HOLD_STATE, null);\n    if (this.stash.heldElsewhere(key, hold)) {\n      this.waiting = true;\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          hold,\n        };\n      },\n      { parent: this.anchor.parentNode, hold },\n    );\n    if (!slot.attached && !slot.held()) {\n      placeBefore(this.anchor, 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 letGo(): void {\n    const mounted = this.mounted;\n    this.mounted = null;\n    if (!mounted) {\n      return;\n    }\n    if (mounted.mode === 'move') {\n      mounted.slot.detach(mounted.retain);\n      return;\n    }\n    if (mounted.mode === 'in-place') {\n      mounted.slot.hideInPlace(mounted.retain);\n      return;\n    }\n    mounted.slot.discard();\n  }\n\n  private reconcile(): void {\n    const mounted = this.mounted;\n    if (!mounted) {\n      if (this.waiting) {\n        this.sync();\n      }\n      return;\n    }\n    if (mounted.slot.stale()) {\n      this.letGo();\n      this.sync();\n      return;\n    }\n    if (this.misplaced(mounted.slot)) {\n      this.queueRepair();\n    }\n  }\n\n  private queueRepair(): void {\n    if (this.repairQueued) {\n      return;\n    }\n    this.repairQueued = true;\n    setTimeout(() => {\n      this.repairQueued = false;\n      const mounted = this.mounted;\n      if (mounted && !mounted.slot.stale() && this.misplaced(mounted.slot)) {\n        placeBefore(this.anchor, mounted.slot.rootNodes);\n      }\n    }, 0);\n  }\n\n  private misplaced(slot: RetainedSlot): boolean {\n    return !slot.held() && this.displaced(slot.rootNodes);\n  }\n\n  private displaced(nodes: readonly Node[]): boolean {\n    const parent = this.anchor.parentNode;\n    return (\n      parent !== null && nodes.some((node) => node.parentNode !== parent)\n    );\n  }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport type PaddingDefault = 'none' | 'inset';\n\nexport const SURFACE_PADDING = new InjectionToken<PaddingDefault>(\n  'lw.surface-padding',\n  {\n    providedIn: 'root',\n    factory: () => 'none',\n  },\n);\n\nexport function effectivePadding(\n  declared: boolean | undefined,\n  fallback: PaddingDefault,\n): boolean {\n  return declared ?? fallback === 'inset';\n}\n","import { InjectionToken } from '@angular/core';\nimport { ContentRoute, View } from '@loomweaver/plugin-sdk';\nimport { matchRoute } from '../../content/content-path';\nimport { isViewPanePath } from '../tree/pane-address';\nimport { surfaceForPanePath } from '../pane-surface';\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 function effectiveRetain(\n  declared: 'always' | 'never' | undefined,\n  fallback: RetentionDefault,\n): boolean {\n  return declared === undefined ? fallback === 'retain' : declared === 'always';\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 (isViewPanePath(path)) {\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 ? 'move' : 'in-place';\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","import {\n  Component,\n  EnvironmentInjector,\n  Injector,\n  Type,\n  computed,\n  effect,\n  inject,\n  untracked,\n  input,\n  output,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { ActivatedRoute } from '@angular/router';\nimport { CurrentAddress } from '../current-address';\nimport { SurfaceAddress } from './live-surface-route';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { CONTAINER_HANDLE, ContentRoute } from '@loomweaver/plugin-sdk';\nimport { View } from '../../../views/view';\nimport {\n  ContributionRegistry,\n  RegisteredContentRoute,\n  RegisteredView,\n} from '../../../contributions/contribution-registry';\nimport { AuthContext } from '../../../auth/auth-context';\nimport { ViewMountService } from '../../../views/view-mount.service';\nimport { ViewInstanceSwitcher } from '../../../views/view-instance-switcher';\nimport { ComponentLoader } from '../../pane/component-loader.service';\nimport { PopoutWindow } from '../../../popout/popout-window';\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 './synthetic-route';\nimport {\n  dockedSurfaceInjectorFactory,\n  surfaceMounts,\n} from './surface-injector';\nimport {\n  containerChildForPath,\n  surfaceForPanePath,\n} from '../../pane/pane-surface';\nimport { matchRoute, paramsOfPattern, tabRootOf } from '../content-path';\nimport { RetainedComponent } from '../../pane/retention/retained-component';\nimport { RetainedViewStash } from '../../pane/retention/retained-view-stash';\nimport {\n  effectivePadding,\n  SURFACE_PADDING,\n} from '../../../foundation/surface-padding';\nimport {\n  retainSurfacePath,\n  SURFACE_RETENTION,\n  surfaceRetentionMode,\n} from '../../pane/retention/retention-policy';\nimport {\n  surfaceRetentionKey,\n  viewRetentionKey,\n} from '../../pane/retention/retention-keys';\n\n@Component({\n  selector: 'lw-surface-body',\n  imports: [\n    AuthRequiredView,\n    NgTemplateOutlet,\n    RetainedComponent,\n    RouteUnavailableView,\n    TranslocoPipe,\n    ViewInstanceSwitcher,\n  ],\n  templateUrl: './surface-body.html',\n  host: { '[class]': 'hostClass()' },\n})\nexport class SurfaceBody {\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 carriesAddress = input(false);\n\n  readonly instanceReleased = output<void>();\n\n  private readonly registry = inject(ContributionRegistry);\n  private readonly padding = inject(SURFACE_PADDING);\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  private readonly currentAddress = inject(CurrentAddress);\n  private readonly stash = inject(RetainedViewStash);\n  private shownLast: string | null = null;\n  private shownBefore: string | null = null;\n\n  private readonly paramInjectors = new Map<string, Injector>();\n  private readonly mounts = surfaceMounts(\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 surfacePath = computed(() => {\n    const path = this.path();\n    const routes = this.registry.contentRoutes();\n    return !this.containerCtx && matchRoute(routes, path)?.container\n      ? tabRootOf(routes, path)\n      : path;\n  });\n\n  private readonly declared = computed(\n    () =>\n      surfaceForPanePath(\n        this.registry.contentRoutes(),\n        this.registry.views(),\n        this.surfacePath(),\n      ) ?? null,\n  );\n\n  private readonly declaredView = computed(() => {\n    const declared = this.declared();\n    return declared === null || ('path' in declared) ? null : declared;\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(() =>\n    effectivePadding(this.declared()?.padded, this.padding),\n  );\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        ? '@container/surface block h-full min-h-0 overflow-auto p-3 text-content'\n        : '@container/surface block h-full min-h-0 overflow-auto text-content';\n    }\n    return this.padded()\n      ? '@container/surface block h-full overflow-auto bg-surface-raised p-6 text-content'\n      : '@container/surface block h-full overflow-auto bg-surface-raised text-content';\n  });\n\n  protected readonly unavailableKey = inject(PopoutWindow).active\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;\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  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(\n      this.retentionScope(),\n      tabRootOf(this.registry.contentRoutes(), this.path()),\n    ),\n  );\n\n  private readonly address = computed<SurfaceAddress>(() =>\n    this.carriesAddress()\n      ? { ...this.currentAddress.snapshot(), carriesAddress: true }\n      : {\n          path: this.path(),\n          carriesAddress: false,\n          queryParams: {},\n          fragment: null,\n        },\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      ? null\n      : {\n          component: IframeSurface,\n          injector: this.mountFor(route).injector,\n        };\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.mountFor(route).injector,\n        }\n      : null;\n  });\n\n  protected readonly loading = computed(() => {\n    const route = this.activeRoute();\n    return (\n      route !== null &&\n      route.container === undefined &&\n      route.loadComponent !== undefined &&\n      this.surface() === null\n    );\n  });\n\n  constructor() {\n    effect(() => {\n      const route = this.activeRoute();\n      const address = this.address();\n      if (route) {\n        this.mountFor(route).live.update(address);\n      }\n    });\n    effect(() => {\n      const shown = this.surfaceKey();\n      this.stash.version();\n      untracked(() => this.releaseMountsLetGo(shown));\n    });\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 mountFor(route: RegisteredContentRoute) {\n    return this.mounts.mountFor(\n      route,\n      this.surfaceKey(),\n      untracked(this.address),\n    );\n  }\n\n  private releaseMountsLetGo(shown: string): void {\n    if (shown !== this.shownLast) {\n      this.shownBefore = this.shownLast;\n      this.shownLast = shown;\n    }\n    const held = new Set(this.stash.keyedInstances().map((entry) => entry.key));\n    this.mounts.releaseUnless(\n      (key) => key === shown || key === this.shownBefore || held.has(key),\n    );\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() && !loading()) {\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","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  readonly surfaceActions: boolean;\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  surfaceActions: true,\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  surfaceActions: false,\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  surfaceActions: true,\n};\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  inject,\n  input,\n} from '@angular/core';\nimport { CONTENT_DOCK, PaneRef, VIEW_PANE_PREFIX } from './tree/pane-address';\nimport { PaneLeaf, activeTab, leafPath } from './tree/pane-node';\nimport { CONTAINER_CONTEXT } from './container/container-context';\nimport { isContentSideDock } from './container/container-children';\nimport { PaneTreeService } from './tree/pane-tree.service';\nimport { PaneContainersService } from './container/pane-containers.service';\nimport { PaneChromeService } from './chrome/pane-chrome.service';\nimport { PaneActions } from './pane-actions.service';\nimport { PaneTabStrip } from './chrome/pane-tab-strip';\nimport {\n  StripTab,\n  VIEW_CONTEXT_MENU,\n  panelIdIn,\n  tabIdIn,\n} from './chrome/strip-tab';\nimport { stripIdOf } from './drag/pane-move.service';\nimport { PaneToolbar } from './chrome/pane-toolbar';\nimport { escalationStep } from './chrome/tab-escalation';\nimport {\n  escalationSwitches,\n  offersMinimize,\n  offersSplitDown,\n  offersSplitRight,\n  tabsDraggable,\n  tabsReorderable,\n} from './chrome/pane-affordances';\nimport { toStripTab } from './chrome/tab-label';\nimport { paneRetentionScope } from './retention/retention-keys';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { RouterOutlet } from '@angular/router';\nimport { AddressPaneHeader } from '../content/address-pane-header';\nimport { AddressPaneBody } from '../content/address-pane-body';\nimport { UnusableWorkspaceNotice } from '../../workspace/usability/unusable-workspace-notice';\nimport { SurfaceBody } from '../content/surface/surface-body';\nimport { isHomePath } from '../content/content-path';\nimport { PaneTargetPicker } from '../content/pane-target-picker';\nimport { ContentTabsService } from '../content/tabs/content-tabs.service';\nimport { TAB_CONTEXT_MENU } from '../content/tabs/tab-context-menu';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { CONTENT_PANE_OPTIONS, PaneViewOptions } from './pane-view-options';\n\nconst MAIN_CONTENT_ID = 'lw-main-content';\n\n@Component({\n  selector: 'lw-pane-view',\n  imports: [\n    AddressPaneHeader,\n    SurfaceBody,\n    PaneTabStrip,\n    PaneToolbar,\n    RouterOutlet,\n    TranslocoPipe,\n    UnusableWorkspaceNotice,\n  ],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  host: {\n    class: 'relative flex min-h-0 min-w-0 flex-1 flex-col',\n    '[attr.data-address-pane]': 'carriesAddress() || null',\n  },\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(FeatureSwitches).content;\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly actions = inject(PaneActions);\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 addressPaneBody = inject(AddressPaneBody);\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 && offersSplitRight(this.features),\n  );\n\n  protected readonly canSplitDown = computed(\n    () => this.options().split && offersSplitDown(this.features),\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      offersMinimize(this.features, {\n        split: this.paneTree.isSplit(this.dock()),\n        maximized: this.maximized(),\n      }),\n  );\n\n  protected readonly viewContextMenu = computed(() =>\n    this.containerCtx ? '' : VIEW_CONTEXT_MENU,\n  );\n\n  protected readonly tabContextMenu = computed(() =>\n    this.containerCtx || this.dock() !== CONTENT_DOCK ? '' : TAB_CONTEXT_MENU,\n  );\n\n  protected readonly pane = computed<PaneRef>(() => ({\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 carriesAddress = computed(() =>\n    this.paneTree.carriesAddress(this.pane()),\n  );\n\n  private readonly stripId = computed(() => stripIdOf(this.pane()));\n\n  protected readonly panelId = computed(() =>\n    this.carriesAddress() ? MAIN_CONTENT_ID : panelIdIn(this.stripId()),\n  );\n\n  private readonly labellingTab = computed(() => {\n    if (this.carriesAddress()) {\n      const active = this.tabs.activeViewPath() ?? this.tabs.activeTabRoot();\n      const drawn =\n        this.tabs.showStrip() &&\n        this.tabs.tabs().some((tab) => tab.path === active);\n      return drawn ? active : null;\n    }\n    const active = this.activeTabId();\n    return this.stripTabs().some((tab) => tab.path === active) ? active : null;\n  });\n\n  protected readonly panelLabelledBy = computed(() => {\n    const path = this.labellingTab();\n    return path === null ? null : tabIdIn(this.stripId(), path);\n  });\n\n  protected readonly bodyPath = computed(() =>\n    this.carriesAddress()\n      ? this.addressPaneBody.pathFor(this.leaf())\n      : this.path(),\n  );\n\n  protected readonly bodyInstance = computed(() =>\n    this.carriesAddress()\n      ? this.addressPaneBody.instanceFor(this.leaf())\n      : this.instanceId(),\n  );\n\n  protected readonly showsSurface = computed(\n    () => !this.carriesAddress() || this.addressPaneBody.showsSurface(),\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(() => isContentSideDock(this.dock()));\n\n  protected readonly tabsReorderable = computed(() =>\n    tabsReorderable(this.features, this.contentSide()),\n  );\n\n  protected readonly acceptsTabs = computed(\n    () => !this.contentSide() || this.features.moveTabs(),\n  );\n\n  protected readonly tabsDraggable = computed(() =>\n    tabsDraggable(this.features, this.contentSide()),\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    () => this.options().pointer && this.isPrimary(),\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 (!this.contentSide()) {\n      return;\n    }\n    const step = escalationStep(tab, escalationSwitches(this.features));\n    switch (step) {\n      case 'keep': {\n        this.paneTree.keepTab(this.dock(), this.leaf().id, tab.path);\n        break;\n      }\n      case 'pin': {\n        this.paneTree.pinTab(this.dock(), this.leaf().id, tab.path);\n        break;\n      }\n      case 'unpin': {\n        this.paneTree.unpinTab(this.dock(), this.leaf().id, tab.path);\n        break;\n      }\n    }\n  }\n\n  protected onCloseTab(tab: StripTab): void {\n    this.tabs.close(tab.path, this.pane());\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.actions.split(this.dock(), this.leaf().id, orientation);\n  }\n\n  protected closePane(): void {\n    this.actions.close(this.dock(), this.leaf().id);\n  }\n\n  protected toggleMaximize(): void {\n    if (this.maximized()) {\n      this.actions.restore(this.dock(), this.leaf().id);\n      return;\n    }\n    this.actions.maximize(this.dock(), this.leaf().id);\n  }\n\n  protected minimize(): void {\n    this.actions.minimize(this.dock(), this.leaf().id);\n  }\n\n  protected focusPane(): void {\n    this.actions.focus(this.dock(), this.leaf().id);\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","@if (carriesAddress()) {\n  <lw-address-pane-header />\n} @else {\n  <lw-pane-tab-strip\n    class=\"shrink-0\"\n    [variant]=\"options().variant\"\n    [tabs]=\"stripTabs()\"\n    [activeId]=\"activeTabId()\"\n    [urlDriven]=\"pointed()\"\n    [source]=\"pane()\"\n    [reorderable]=\"tabsReorderable()\"\n    [draggable]=\"tabsDraggable()\"\n    [acceptsTabs]=\"acceptsTabs()\"\n    [canAddTab]=\"canAddTab()\"\n    [contextMenuSlot]=\"tabContextMenu()\"\n    [viewContextMenuSlot]=\"viewContextMenu()\"\n    [contextGroup]=\"dock()\"\n    [paneActions]=\"paneActions\"\n    [panelId]=\"panelId()\"\n    [surfaceActions]=\"options().surfaceActions\"\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}\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\n  class=\"relative flex min-h-0 min-w-0 flex-1 flex-col outline-none\"\n  [attr.id]=\"panelId()\"\n  [attr.role]=\"panelLabelledBy() ? 'tabpanel' : null\"\n  [attr.aria-labelledby]=\"panelLabelledBy()\"\n  [attr.tabindex]=\"carriesAddress() ? -1 : null\"\n  (pointerdown)=\"onBodyPointerDown()\"\n>\n  @if (carriesAddress()) {\n    <router-outlet />\n    <lw-unusable-workspace-notice />\n  }\n  @if (awaitingContent()) {\n    <output\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    >\n      {{ 'content.split.awaiting' | transloco }}\n    </output>\n  } @else if (showsSurface()) {\n    <lw-surface-body\n      class=\"min-h-0 min-w-0 flex-1\"\n      [path]=\"bodyPath()\"\n      [instanceId]=\"bodyInstance()\"\n      [variant]=\"options().body\"\n      [retentionScope]=\"retentionScope()\"\n      [carriesAddress]=\"carriesAddress()\"\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 { FeatureSwitches } from '../../../features/feature-switches.service';\nimport { PaneDragService } from './pane-drag.service';\nimport { isContentSideDock } from '../container/container-children';\nimport { isViewPanePath } from '../tree/pane-address';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { findLeaf } from '../tree/pane-queries';\nimport {\n  PaneDropEdge,\n  PaneMoveService,\n  stripSourceOf,\n} from './pane-move.service';\n\nconst ZONE_ORDER: readonly PaneDropEdge[] = ['left', 'right', 'top', 'bottom'];\n\nconst ZONE_PLACEMENT: Record<PaneDropEdge, string> = {\n  left: 'col-start-1 row-span-3 row-start-1',\n  right: 'col-start-3 row-span-3 row-start-1',\n  top: 'col-start-2 row-start-1',\n  bottom: 'col-start-2 row-start-3',\n};\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(FeatureSwitches).content;\n  private readonly sidebar = inject(FeatureSwitches).sidebar;\n\n  private readonly contentSide = computed(() => isContentSideDock(this.dock()));\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 shownEdges = computed(() =>\n    ZONE_ORDER.filter((edge) => this.edges().includes(edge)),\n  );\n\n  protected readonly placement = ZONE_PLACEMENT;\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 disposers = this.zoneIds().map((id) => this.drag.registerZone(id));\n      onCleanup(() => {\n        for (const dispose of disposers) {\n          dispose();\n        }\n      });\n    });\n  }\n\n  protected readonly enterPredicate = (drag: CdkDrag<string>): boolean => {\n    if (this.contentSide()) {\n      return true;\n    }\n    if (!isViewPanePath(String(drag.data ?? ''))) {\n      return this.sidebar.acceptTabs();\n    }\n    return this.fills() ? this.sidebar.moveViews() : this.sidebar.stackViews();\n  };\n\n  protected zoneId(edge: PaneDropEdge | 'fill'): string {\n    return `pane-zone:${this.dock()}:${this.paneId()}:${edge}`;\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  private zoneIds(): string[] {\n    if (!this.fills()) {\n      return this.edges().map((edge) => this.zoneId(edge));\n    }\n    return this.accepts() ? [this.zoneId('fill')] : [];\n  }\n}\n","@if (fills()) {\n  @if (accepts()) {\n    <div\n      class=\"lw-pane-drop-zone col-span-3 col-start-1 row-span-3 row-start-1\"\n      cdkDropList\n      [cdkDropListEnterPredicate]=\"enterPredicate\"\n      [id]=\"zoneId('fill')\"\n      (cdkDropListDropped)=\"onFill($event)\"\n    >\n      <div class=\"lw-pane-drop-preview lw-pane-drop-preview--fill\"></div>\n    </div>\n  }\n} @else {\n  @for (edge of shownEdges(); track edge) {\n    <div\n      [class]=\"'lw-pane-drop-zone ' + placement[edge]\"\n      cdkDropList\n      [cdkDropListEnterPredicate]=\"enterPredicate\"\n      [id]=\"zoneId(edge)\"\n      (cdkDropListDropped)=\"onDrop(edge, $event)\"\n    >\n      <div [class]=\"'lw-pane-drop-preview lw-pane-drop-preview--' + edge\"></div>\n    </div>\n  }\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  inject,\n  input,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PaneLeaf, activeTab } from '../tree/pane-node';\nimport { PaneChromeService } from './pane-chrome.service';\nimport { overlayTabTitle, PaneLabel, paneLabelOf } from './tab-label';\nimport { nameShowing } from '../../../foundation/name-showing';\nimport { ContributionRegistry } from '../../../contributions/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<PaneLabel>(() => {\n    const tab = activeTab(this.leaf());\n    const base = paneLabelOf(this.registry, tab?.path ?? '');\n    return tab ? overlayTabTitle(tab, base) : base;\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 nameOf(title: string, purpose: string): string {\n    return nameShowing(\n      [title, this.tabCount() > 1 ? `+${this.extraTabs()}` : undefined],\n      purpose,\n    );\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]=\"nameOf(label().literalTitle ? label().title : (label().title | transloco), restoreKey() | transloco: { count: tabCount() })\"\n  data-testid=\"pane-minimized-strip\"\n>\n  <lw-icon [name]=\"label().icon ?? 'document'\" size=\"0.875rem\" />\n  @if (vertical()) {\n  <span class=\"min-h-0 truncate text-xs\" style=\"writing-mode: vertical-rl\"\n    >{{ label().literalTitle ? label().title : (label().title | transloco)\n    }}</span\n  >\n  } @else {\n  <span class=\"min-w-0 truncate text-xs\"\n    >{{ label().literalTitle ? label().title : (label().title | transloco)\n    }}</span\n  >\n  } @if (tabCount() > 1) { &ngsp;<span\n    class=\"lw-badge lw-badge--brand shrink-0 px-1.5 py-0 text-xs\"\n    aria-hidden=\"true\"\n    >+{{ extraTabs() }}</span\n  >\n  }\n  <lw-tooltip\n    [text]=\"restoreKey() | transloco: { count: tabCount() }\"\n    [position]=\"vertical() ? 'right' : 'bottom'\"\n  />\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;\nconst DRAG_ENDS = ['pointerup', 'pointercancel', 'lostpointercapture'] as const;\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 element = this.host.nativeElement;\n    element.setPointerCapture(event.pointerId);\n    event.preventDefault();\n    const move = (e: PointerEvent) =>\n      this.ratioStream.emit(this.fraction(e, rect));\n    const end = () => {\n      element.removeEventListener('pointermove', move);\n      for (const type of DRAG_ENDS) {\n        element.removeEventListener(type, end);\n      }\n      if (element.hasPointerCapture(event.pointerId)) {\n        element.releasePointerCapture(event.pointerId);\n      }\n      this.ratioCommit.emit();\n    };\n    element.addEventListener('pointermove', move);\n    for (const type of DRAG_ENDS) {\n      element.addEventListener(type, end);\n    }\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 '../../../contributions/contribution-registry';\nimport { RetainedSlot } from './retained-view-model';\nimport { RetainedViewStash } from './retained-view-stash';\nimport { placeBefore } 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    placeBefore(this.anchor, 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.detach(false);\n      return;\n    }\n    mounted.slot.discard();\n  }\n}\n","import {\n  Component,\n  TemplateRef,\n  computed,\n  forwardRef,\n  inject,\n  input,\n  signal,\n} 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 { primaryRetentionKey } from './retention/retention-keys';\n\nconst MINIMIZED_ROW_BASIS = '0 0 2.25rem';\n\nconst MINIMIZED_COLUMN_BASIS = '0 0 2rem';\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    primaryRetentionKey(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(split: PaneSplit, side: 'first' | 'second'): string {\n    const first = side === 'first';\n    const minimized = first ? this.firstMinimized() : this.secondMinimized();\n    if (minimized) {\n      return split.orientation === 'row'\n        ? MINIMIZED_ROW_BASIS\n        : MINIMIZED_COLUMN_BASIS;\n    }\n    const siblingMinimized = first\n      ? this.secondMinimized()\n      : this.firstMinimized();\n    const ratio = first ? split.ratio : 1 - split.ratio;\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(s, 'first')\" />\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(s, 'second')\" />\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 { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport {\n  hydrateAsync,\n  readStoredValue,\n} from '../../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../../persistence/cross-tab/state-sync.service';\nimport { parseRecord } from '../../persistence/stored-values/persisted-record';\nimport { SHELL_LAYOUT, ShellLayout } from '../../layout/layout';\nimport { panelRegions } from '../../layout/layout-queries';\nimport {\n  clampToPanelWidths,\n  PanelWidths,\n  resolvePanelWidths,\n  WORKBENCH_PANEL_WIDTHS,\n} from '../../layout/panel-widths';\n\nconst STORAGE_KEY = 'lw.shell.panel-sizes';\n\nfunction isFiniteNumber(value: unknown): value is number {\n  return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction parseWidths(\n  raw: string | undefined,\n): Readonly<Record<string, number>> {\n  return parseRecord(raw, isFiniteNumber);\n}\n\nfunction panelWidthsByRegion(\n  layout: ShellLayout,\n): ReadonlyMap<string, PanelWidths> {\n  return new Map(\n    panelRegions(layout).map((region) => [\n      region.id,\n      resolvePanelWidths(region),\n    ]),\n  );\n}\n\n@Service()\nexport class PanelSizeService {\n  private readonly store = inject(WORKING_STATE_STORE);\n  private readonly sync = inject(StateSyncService);\n  private readonly declared = panelWidthsByRegion(inject(SHELL_LAYOUT));\n\n  private readonly widths = signal<Readonly<Record<string, number>>>(\n    parseWidths(this.store.peek?.(STORAGE_KEY)),\n  );\n  private readonly resizing = signal(false);\n\n  constructor() {\n    const apply = (raw: string | undefined) =>\n      this.widths.set(parseWidths(raw));\n    hydrateAsync(this.store, STORAGE_KEY, apply);\n    this.sync.onNamespaceAdopted(async () =>\n      apply(await readStoredValue(this.store, STORAGE_KEY)),\n    );\n  }\n\n  width(regionId: string): number {\n    const widths = this.widthsOf(regionId);\n    const stored = this.widths()[regionId];\n    return stored === undefined\n      ? widths.start\n      : clampToPanelWidths(stored, widths);\n  }\n\n  minWidth(regionId: string): number {\n    return this.widthsOf(regionId).min;\n  }\n\n  maxWidth(regionId: string): number {\n    return this.widthsOf(regionId).max;\n  }\n\n  isResizing(): boolean {\n    return this.resizing();\n  }\n\n  beginResize(): void {\n    this.resizing.set(true);\n  }\n\n  endResize(): void {\n    this.resizing.set(false);\n    this.commit();\n  }\n\n  setWidth(regionId: string, px: number): void {\n    const clamped = clampToPanelWidths(px, this.widthsOf(regionId));\n    this.widths.update((state) => ({ ...state, [regionId]: clamped }));\n  }\n\n  commit(): void {\n    void this.store.set(STORAGE_KEY, JSON.stringify(this.widths()));\n  }\n\n  reset(): void {\n    this.widths.set({});\n    void this.store.delete(STORAGE_KEY);\n  }\n\n  private widthsOf(regionId: string): PanelWidths {\n    return this.declared.get(regionId) ?? WORKBENCH_PANEL_WIDTHS;\n  }\n}\n","import { Component, computed, DestroyRef, 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  private readonly size = inject(PanelSizeService);\n  protected readonly width = computed(() => this.size.width(this.regionId()));\n  protected readonly minWidth = computed(() =>\n    this.size.minWidth(this.regionId()),\n  );\n  protected readonly maxWidth = computed(() =>\n    this.size.maxWidth(this.regionId()),\n  );\n\n  private dragging = false;\n  private startX = 0;\n  private startWidth = 0;\n\n  constructor() {\n    inject(DestroyRef).onDestroy(() => this.endDrag());\n  }\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    (event.target as HTMLElement).releasePointerCapture(event.pointerId);\n    this.endDrag();\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      }\n      case 'ArrowLeft': {\n        next = this.width() - step;\n        break;\n      }\n      case 'Home': {\n        next = this.minWidth();\n        break;\n      }\n      case 'End': {\n        next = this.maxWidth();\n        break;\n      }\n      default: {\n        return;\n      }\n    }\n    event.preventDefault();\n    this.size.setWidth(this.regionId(), next);\n    this.size.commit();\n  }\n\n  private endDrag(): void {\n    if (!this.dragging) {\n      return;\n    }\n    this.dragging = false;\n    this.size.endResize();\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]=\"minWidth()\"\n  [attr.aria-valuemax]=\"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 {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  EnvironmentInjector,\n  Injector,\n  Type,\n  computed,\n  effect,\n  inject,\n  input,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { View } from '@loomweaver/plugin-sdk';\nimport { LayoutRegion, SHELL_LAYOUT } from '../../layout/layout';\nimport { ViewMountService } from '../../views/view-mount.service';\nimport { ComponentLoader } from '../pane/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 { panelIdIn, tabIdIn } from '../pane/chrome/strip-tab';\nimport { stripIdOf } from '../pane/drag/pane-move.service';\nimport { PaneTreeView } from '../pane/pane-tree-view';\nimport { SurfaceActions } from '../content/actions/surface-actions';\nimport {\n  isViewPanePath,\n  viewForPanePath,\n  viewPanePath,\n} from '../pane/tree/pane-address';\nimport { PANEL_PANE_OPTIONS } from '../pane/pane-view-options';\nimport { RetainedComponent } from '../pane/retention/retained-component';\nimport {\n  retainSurfacePath,\n  SURFACE_RETENTION,\n} from '../pane/retention/retention-policy';\nimport {\n  paneRetentionScope,\n  viewRetentionKey,\n} from '../pane/retention/retention-keys';\nimport { SurfaceBody } from '../content/surface/surface-body';\nimport { IframeSurface } from '../content/surface/iframe-surface';\nimport { dockedSurfaceInjectorFactory } from '../content/surface/surface-injector';\nimport {\n  ContributionRegistry,\n  RegisteredView,\n} from '../../contributions/contribution-registry';\nimport { ViewportService } from '../../layout/viewport.service';\nimport {\n  SURFACE_PADDING,\n  effectivePadding,\n} from '../../foundation/surface-padding';\nimport { ShellBar } from '../bar/shell-bar';\nimport { PanelState } from './panel-state';\nimport { PanelSizeService } from './panel-size.service';\nimport { overlayWidthStyle } from '../../layout/panel-widths';\nimport { PanelSplitter } from './panel-splitter';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport { regionsAt } from '../../layout/layout-queries';\n\n@Component({\n  selector: 'lw-shell-panel',\n  imports: [\n    TranslocoPipe,\n    ShellBar,\n    PanelSplitter,\n    PaneTreeView,\n    SurfaceBody,\n    RetainedComponent,\n    ViewInstanceSwitcher,\n    SurfaceActions,\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 panels = inject(PanelState);\n\n  protected readonly viewport = inject(ViewportService);\n  private readonly padding = inject(SURFACE_PADDING);\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(FeatureSwitches).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 widthStyle = computed(() => {\n    const region = this.region();\n    if (this.viewport.compact()) {\n      return overlayWidthStyle(region.type === 'panel' ? region : {});\n    }\n    return `${this.collapsed() ? 0 : this.size.width(region.id)}px`;\n  });\n\n  protected readonly splitterDock = computed<'left' | 'right' | null>(() => {\n    if (\n      !this.features.resize() ||\n      this.viewport.compact() ||\n      this.collapsed()\n    ) {\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  private readonly stripId = computed(() =>\n    stripIdOf({\n      dock: this.region().id,\n      paneId: this.paneTree.primaryId(this.region().id),\n    }),\n  );\n\n  protected readonly panelId = computed(() => panelIdIn(this.stripId()));\n\n  protected readonly panelLabelledBy = computed(() => {\n    const path = this.activePath();\n    const drawn = this.panelGroup\n      .tabs(this.region().id)\n      .some((tab) => tab.path === path);\n    return path !== undefined && drawn ? tabIdIn(this.stripId(), path) : null;\n  });\n\n  protected readonly activeView = computed(() => {\n    const path = this.activePath();\n    return path === undefined\n      ? undefined\n      : viewForPanePath(this.registry.views(), path);\n  });\n\n  protected readonly padded = computed(() =>\n    effectivePadding(this.activeView()?.padded, this.padding),\n  );\n\n  protected readonly activeContentPath = computed(() => {\n    const path = this.activePath();\n    return path === undefined || isViewPanePath(path) ? undefined : path;\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  private readonly shownInstance = computed(() =>\n    this.panelGroup.activeInstance(this.region().id),\n  );\n\n  protected readonly footers = computed(() =>\n    regionsAt(this.layout, this.region().dock, 'bar'),\n  );\n\n  constructor() {\n    effect(() => this.panelGroup.seed(this.region().id));\n  }\n\n  protected viewInjector(view: View): Injector {\n    const shown = this.shownInstance();\n    return shown\n      ? this.viewMount.injectorForInstance(shown)\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    return this.dockedInjectorFor(\n      view,\n      this.shownInstance() ?? this.viewMount.instanceIdFor(view),\n    );\n  }\n\n  protected viewKeyFor(view: View): string {\n    return viewRetentionKey(\n      this.primaryScope(),\n      viewPanePath(view.id),\n      this.shownInstance(),\n    );\n  }\n\n  protected viewRetains(view: View): boolean {\n    return retainSurfacePath(\n      this.registry.contentRoutes(),\n      this.registry.views(),\n      viewPanePath(view.id),\n      this.retention,\n    );\n  }\n\n  protected releaseCarriedInstance(): void {\n    this.panelGroup.clearActiveInstance(this.region().id);\n  }\n}\n","<div\n  class=\"relative flex h-full shrink-0 flex-col overflow-hidden border-border bg-surface transition-[width] duration-300 ease-out\"\n  [style.width]=\"widthStyle()\"\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        <lw-surface-actions [path]=\"activePath()\" [region]=\"region().id\" />\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\n          class=\"@container/surface flex min-h-0 min-w-0 flex-1 flex-col overflow-auto text-content\"\n          [class.p-3]=\"padded()\"\n          [attr.id]=\"panelId()\"\n          [attr.role]=\"panelLabelledBy() ? 'tabpanel' : null\"\n          [attr.aria-labelledby]=\"panelLabelledBy()\"\n        >\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-surface-body\n          class=\"min-h-0 min-w-0 flex-1\"\n          [attr.id]=\"panelId()\"\n          [attr.role]=\"panelLabelledBy() ? 'tabpanel' : null\"\n          [attr.aria-labelledby]=\"panelLabelledBy()\"\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</div>\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { regionById } from '../../layout/layout-queries';\n\nexport interface MoveWording {\n  readonly announce: string;\n  readonly subject: string;\n  readonly targetLeft: string;\n  readonly targetRight: string;\n}\n\nexport interface MovedEntry {\n  readonly id: string;\n  readonly title?: string;\n  readonly literalTitle?: boolean;\n}\n\n@Service()\nexport class MoveAnnouncer {\n  private readonly layout = inject(SHELL_LAYOUT);\n  private readonly announcer = inject(LiveAnnouncer);\n  private readonly transloco = inject(TranslocoService);\n\n  announce(\n    wording: MoveWording,\n    moved: MovedEntry,\n    targetRegion: string,\n  ): void {\n    void this.announcer.announce(\n      this.transloco.translate(wording.announce, {\n        [wording.subject]: this.nameOf(moved),\n        target: this.targetLabel(wording, targetRegion),\n      }),\n    );\n  }\n\n  private nameOf(moved: MovedEntry): string {\n    if (!moved.title) {\n      return moved.id;\n    }\n    return moved.literalTitle\n      ? moved.title\n      : this.transloco.translate(moved.title);\n  }\n\n  private targetLabel(wording: MoveWording, regionId: string): string {\n    const side = regionById(this.layout, regionId)?.dock;\n    if (side === 'left') {\n      return this.transloco.translate(wording.targetLeft);\n    }\n    if (side === 'right') {\n      return this.transloco.translate(wording.targetRight);\n    }\n    return regionId;\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { PaneRef, viewPanePath } from '../pane/tree/pane-address';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { PaneMoveService } from '../pane/drag/pane-move.service';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { PanelState } from './panel-state';\nimport { regionOnOtherSide } from '../../layout/layout-queries';\nimport { MoveAnnouncer, MoveWording } from '../reorder/move-announcer';\n\nconst VIEW_MOVE_WORDING: MoveWording = {\n  announce: 'panel.viewMove.announce',\n  subject: 'view',\n  targetLeft: 'panel.viewMove.targetLeft',\n  targetRight: 'panel.viewMove.targetRight',\n};\n\nexport interface MovedTab {\n  readonly path: string;\n  readonly title: string;\n  readonly literalTitle: boolean;\n}\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(MoveAnnouncer);\n\n  move(viewId: string, targetRegion: string, index?: number): void {\n    const path = viewPanePath(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 view = this.registry.views().find((one) => one.id === viewId);\n    this.announcer.announce(\n      VIEW_MOVE_WORDING,\n      { id: viewId, title: view?.title },\n      targetRegion,\n    );\n  }\n\n  moveTab(source: PaneRef, tab: MovedTab, targetRegion: string): void {\n    this.paneMove.moveToStrip(source, tab.path, {\n      dock: targetRegion,\n      paneId: this.paneTree.primaryId(targetRegion),\n    });\n    this.panels.expand(targetRegion);\n    this.announcer.announce(\n      VIEW_MOVE_WORDING,\n      { id: tab.path, title: tab.title, literalTitle: tab.literalTitle },\n      targetRegion,\n    );\n  }\n\n  otherPanel(fromRegion: string): string | undefined {\n    return regionOnOtherSide(this.layout, 'panel', fromRegion)?.id;\n  }\n}\n","import { Disposable } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { registerMenuCommand } from '../../menu/context-menu-entry';\nimport { ViewMoveService } from './view-move.service';\nimport { ViewVisibilityService } from './view-visibility.service';\nimport { CONTENT_DOCK, viewPanePath } 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';\nimport { VIEW_CONTEXT_MENU } from '../pane/chrome/strip-tab';\nimport { menuEntryId } from '../../menu/menu-entry-id';\nimport { VIEWS_CUSTOMIZE_COMMAND_ID } from '../../commands/host-command-ids';\n\nconst VIEW_HIDE_COMMAND_ID = 'shell.view.hide';\nconst VIEW_MOVE_TO_OTHER_SIDEBAR_COMMAND_ID = 'shell.view.moveToOtherSidebar';\nconst VIEW_OPEN_IN_CONTENT_COMMAND_ID = 'shell.view.openInContent';\nconst VIEW_OPEN_IN_WINDOW_COMMAND_ID = 'shell.view.openInWindow';\nconst VIEW_RESET_STATE_COMMAND_ID = 'shell.view.resetState';\nconst VIEW_STACK_BELOW_COMMAND_ID = 'shell.view.stackBelow';\n\nexport const PANEL_STRIP_CONTEXT_MENU = 'panel/strip/context';\n\nexport function registerViewCustomizeMenu(\n  registry: ContributionRegistry,\n): Disposable {\n  return registry.addMenuItem({\n    id: menuEntryId(VIEWS_CUSTOMIZE_COMMAND_ID),\n    menu: PANEL_STRIP_CONTEXT_MENU,\n    command: VIEWS_CUSTOMIZE_COMMAND_ID,\n    group: '9_customize',\n    order: 0,\n  });\n}\n\nexport function registerViewMoveMenu(\n  registry: ContributionRegistry,\n  moves: ViewMoveService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    VIEW_CONTEXT_MENU,\n    {\n      id: VIEW_MOVE_TO_OTHER_SIDEBAR_COMMAND_ID,\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    {\n      group: '1_move',\n      order: 0,\n      when: { inContent: false },\n    },\n  );\n}\n\nexport function registerViewStackMenu(\n  registry: ContributionRegistry,\n  paneTree: PaneTreeService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    VIEW_CONTEXT_MENU,\n    {\n      id: VIEW_STACK_BELOW_COMMAND_ID,\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          return;\n        }\n\n        paneTree.setActiveTab(\n          region,\n          paneTree.primaryId(region),\n          viewPanePath(viewId),\n        );\n        paneTree.stackView(region, viewId);\n      },\n    },\n    {\n      group: '2_stack',\n      order: 0,\n    },\n  );\n}\n\nexport function registerViewResetMenu(\n  registry: ContributionRegistry,\n  viewStates: ViewStateService,\n  viewInstances: ViewInstanceService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    VIEW_CONTEXT_MENU,\n    {\n      id: VIEW_RESET_STATE_COMMAND_ID,\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    {\n      group: '3_state',\n      order: 0,\n    },\n  );\n}\n\nexport function registerViewOpenInContentMenu(\n  registry: ContributionRegistry,\n  paneTree: PaneTreeService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    VIEW_CONTEXT_MENU,\n    {\n      id: VIEW_OPEN_IN_CONTENT_COMMAND_ID,\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            viewPanePath(viewId),\n          );\n        }\n      },\n    },\n    {\n      group: '2_stack',\n      order: 1,\n      when: { inContent: false },\n    },\n  );\n}\n\nexport function registerViewHideMenu(\n  registry: ContributionRegistry,\n  visibility: ViewVisibilityService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    VIEW_CONTEXT_MENU,\n    {\n      id: VIEW_HIDE_COMMAND_ID,\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    {\n      group: '5_visibility',\n      order: 0,\n    },\n  );\n}\n\nexport function registerViewPopoutMenu(\n  registry: ContributionRegistry,\n  popout: PopoutService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    VIEW_CONTEXT_MENU,\n    {\n      id: VIEW_OPEN_IN_WINDOW_COMMAND_ID,\n      title: 'panel.viewMenu.openInNewWindow',\n      icon: 'popout',\n      run: (context) => {\n        const viewId = menuContextString(context, 'viewId');\n        if (viewId) {\n          popout.open(viewPanePath(viewId));\n        }\n      },\n    },\n    {\n      group: '4_window',\n      order: 0,\n    },\n  );\n}\n","export function sideForMoveChord(\n  event: KeyboardEvent,\n): 'left' | 'right' | null {\n  if (!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","import { afterNextRender, DOCUMENT, Injector } from '@angular/core';\n\nexport function focusMovedEntry(selector: string, injector: Injector): void {\n  const document = injector.get(DOCUMENT);\n  afterNextRender(\n    { read: () => document.querySelector<HTMLElement>(selector)?.focus() },\n    { injector },\n  );\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  inject,\n  Injector,\n  input,\n} 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 { ViewMoveService } from './view-move.service';\nimport { PANEL_STRIP_CONTEXT_MENU } from './view-context-menu';\nimport {\n  StripTab,\n  VIEW_CONTEXT_MENU,\n  panelIdIn,\n} from '../pane/chrome/strip-tab';\nimport {\n  isViewPanePath,\n  PaneRef,\n  viewIdOfPanePath,\n} from '../pane/tree/pane-address';\nimport { stripIdOf } from '../pane/drag/pane-move.service';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { PaneTabStrip } from '../pane/chrome/pane-tab-strip';\nimport { MenuTriggerDirective } from '../../menu/menu-trigger.directive';\nimport { toStripTab } from '../pane/chrome/tab-label';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport { regionOnSide } from '../../layout/layout-queries';\nimport { sideForMoveChord } from '../reorder/move-chord';\nimport { focusMovedEntry } from '../reorder/focus-moved-entry';\n\nexport type SidebarHeaderContext = 'edge' | 'drawer' | 'floating';\n\n@Component({\n  selector: 'lw-shell-sidebar-header',\n  imports: [TranslocoPipe, PaneTabStrip, MenuTriggerDirective],\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 viewMove = inject(ViewMoveService);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly layout = inject(SHELL_LAYOUT);\n  private readonly features = inject(FeatureSwitches).sidebar;\n  private readonly injector = inject(Injector);\n\n  protected readonly viewContextMenu = VIEW_CONTEXT_MENU;\n\n  protected readonly stripMenu = computed(() =>\n    this.features.curate() ? [PANEL_STRIP_CONTEXT_MENU] : [],\n  );\n\n  protected readonly viewsReorderable = computed(() =>\n    this.features.reorderViews(),\n  );\n\n  protected readonly viewsDraggable = computed(\n    () => this.features.reorderViews() || this.features.moveViews(),\n  );\n\n  protected readonly canCollapse = computed(\n    () => this.viewport.compact() || this.features.collapse(),\n  );\n\n  protected readonly source = computed<PaneRef>(() => ({\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 panelId = computed(() => panelIdIn(this.stripId()));\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' ? 'sidebarRightOpen' : 'sidebarLeftOpen',\n  );\n  protected readonly expandIcon = computed<LoomIconName>(() =>\n    this.region().dock === 'right' ? 'sidebarRightClosed' : 'sidebarLeftClosed',\n  );\n\n  protected readonly acceptsTab = (path: string): boolean =>\n    isViewPanePath(path)\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 closeOrCollapse(): 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 side = this.features.moveViews() ? sideForMoveChord(event) : null;\n    if (side === 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.panelOn(side);\n    if (!path || !target) {\n      return;\n    }\n    event.preventDefault();\n    this.moveToPanel(path, target.id);\n    focusMovedEntry(\n      `#${CSS.escape(`panel-views-${target.id}`)} [data-tab-path=\"${CSS.escape(path)}\"]`,\n      this.injector,\n    );\n  }\n\n  private moveToPanel(path: string, targetRegion: string): void {\n    const viewId = viewIdOfPanePath(path);\n    const tab = this.stripTabs().find((one) => one.path === path);\n    if (viewId !== null) {\n      this.viewMove.move(viewId, targetRegion);\n    } else if (tab) {\n      this.viewMove.moveTab(this.source(), tab, targetRegion);\n    }\n  }\n\n  private panelOn(side: 'left' | 'right'): LayoutRegion | undefined {\n    return regionOnSide(this.layout, 'panel', side, this.region().id);\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    [panelId]=\"panelId()\"\n    (selectTab)=\"select($event)\"\n    (reorderTabs)=\"onReorder($event)\"\n    (keydown)=\"onStripKeydown($event)\"\n    [lwMenu]=\"stripMenu()\"\n  />\n  <ng-template #trailing>\n    @if (canCollapse()) {\n    <button\n      type=\"button\"\n      (click)=\"closeOrCollapse()\"\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 { Disposable, MenuContext } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { registerMenuCommand } from '../../menu/context-menu-entry';\nimport { menuContextString } from '../../menu/menu-context';\nimport { RailItemsService } from './rail-items.service';\nimport { RailMoveService } from './rail-move.service';\nimport { menuEntryId } from '../../menu/menu-entry-id';\nimport { RAIL_CUSTOMIZE_COMMAND_ID } from '../../commands/host-command-ids';\n\nconst RAIL_HIDE_ITEM_COMMAND_ID = 'shell.rail.hideItem';\nconst RAIL_MOVE_TO_OTHER_RAIL_COMMAND_ID = 'shell.rail.moveToOtherRail';\n\nexport const RAIL_ITEM_CONTEXT_MENU = 'rail/item/context';\n\nexport const RAIL_CONTEXT_MENU = 'rail/context';\n\nexport function railMenuContext(id: string, region: string): MenuContext {\n  return { targetKind: 'rail-item', id, region };\n}\n\nexport function registerRailCustomizeMenu(\n  registry: ContributionRegistry,\n): Disposable {\n  return registry.addMenuItem({\n    id: menuEntryId(RAIL_CUSTOMIZE_COMMAND_ID),\n    menu: RAIL_CONTEXT_MENU,\n    command: RAIL_CUSTOMIZE_COMMAND_ID,\n    group: '9_customize',\n    order: 0,\n  });\n}\n\nexport function registerRailHideMenu(\n  registry: ContributionRegistry,\n  railItems: RailItemsService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    RAIL_ITEM_CONTEXT_MENU,\n    {\n      id: RAIL_HIDE_ITEM_COMMAND_ID,\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    {\n      group: '5_visibility',\n      order: 0,\n    },\n  );\n}\n\nexport function registerRailMoveMenu(\n  registry: ContributionRegistry,\n  moves: RailMoveService,\n): Disposable {\n  return registerMenuCommand(\n    registry,\n    RAIL_ITEM_CONTEXT_MENU,\n    {\n      id: RAIL_MOVE_TO_OTHER_RAIL_COMMAND_ID,\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    {\n      group: '1_move',\n      order: 0,\n    },\n  );\n}\n","import { Service } from '@angular/core';\nimport { persistedSetting } from '../../persistence/stored-values/persisted-setting';\nimport { recordOf } from '../../persistence/stored-values/persisted-record';\nimport { parseStored } from '../../persistence/stored-values/parse-stored';\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 isString(value: unknown): value is string {\n  return typeof value === 'string';\n}\n\nfunction parse(raw: string | undefined): RailItemsState {\n  const parsed = parseStored(raw);\n  if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n    return EMPTY;\n  }\n  const state = parsed as Record<string, unknown>;\n  return {\n    hidden: Array.isArray(state['hidden'])\n      ? state['hidden'].filter(isString)\n      : [],\n    placed: recordOf(state['placed'], isString),\n  };\n}\n\n@Service()\nexport class RailItemsService {\n  private readonly stored = persistedSetting(STORAGE_KEY, {\n    parse,\n    serialize: (state) => JSON.stringify(state),\n  });\n\n  private readonly state = this.stored.value;\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 Object.hasOwn(this.state().placed, itemId);\n    }\n    return !this.state().hidden.includes(itemId);\n  }\n\n  place(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  reset(): void {\n    this.stored.clear();\n  }\n\n  private commit(next: RailItemsState): void {\n    this.stored.set(next);\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { RailItemsService } from './rail-items.service';\nimport { regionOnOtherSide, regionOnSide } from '../../layout/layout-queries';\nimport { MoveAnnouncer, MoveWording } from '../reorder/move-announcer';\n\nconst RAIL_MOVE_WORDING: MoveWording = {\n  announce: 'rail.move.announce',\n  subject: 'item',\n  targetLeft: 'rail.move.targetLeft',\n  targetRight: 'rail.move.targetRight',\n};\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(MoveAnnouncer);\n\n  move(itemId: string, targetRegion: string): void {\n    this.items.place(itemId, targetRegion);\n    const item = this.registry.railItems().find((one) => one.id === itemId);\n    this.announcer.announce(\n      RAIL_MOVE_WORDING,\n      { id: itemId, title: item?.title },\n      targetRegion,\n    );\n  }\n\n  otherRail(fromRegion: string): string | undefined {\n    return regionOnOtherSide(this.layout, 'rail', fromRegion)?.id;\n  }\n\n  railOn(side: 'left' | 'right', fromRegion: string): string | undefined {\n    return regionOnSide(this.layout, 'rail', side, fromRegion)?.id;\n  }\n}\n","import { HIDDEN_VIEWS_KEY } from '../../regions/panel/hidden-views.service';\nimport { PANE_TREES_KEY } from '../../regions/pane/tree/pane-tree-storage';\n\nexport const WORKSPACE_STATE_KEYS = [HIDDEN_VIEWS_KEY, PANE_TREES_KEY] as const;\n\nexport type WorkspaceStateKey = (typeof WORKSPACE_STATE_KEYS)[number];\n\nexport interface StateChannel {\n  readonly hydrate: (raw: string | undefined) => void;\n  readonly serialize: () => string;\n}\n\nexport type StateChannels = Readonly<Record<WorkspaceStateKey, StateChannel>>;\n\nexport function stateChannels(\n  hiddenViews: StateChannel,\n  paneTree: StateChannel,\n): StateChannels {\n  return {\n    [HIDDEN_VIEWS_KEY]: {\n      hydrate: (raw) => hiddenViews.hydrate(raw),\n      serialize: () => hiddenViews.serialize(),\n    },\n    [PANE_TREES_KEY]: {\n      hydrate: (raw) => paneTree.hydrate(raw),\n      serialize: () => paneTree.serialize(),\n    },\n  };\n}\n","import { HIDDEN_VIEWS_KEY } from '../../regions/panel/hidden-views.service';\nimport { PANE_TREES_KEY } from '../../regions/pane/tree/pane-tree-storage';\nimport {\n  CONTENT_DOCK,\n  VIEW_PANE_PREFIX,\n} from '../../regions/pane/tree/pane-address';\nimport { normalizeNode } from '../../regions/pane/tree/stored-pane-tree';\nimport { contentTree } from './declared-content';\nimport { WorkspaceDefinition } from './workspace-definition';\n\nexport interface PanelDeclarations {\n  readonly panelRegions: readonly string[];\n  readonly declaredPaths: (region: string) => readonly string[];\n}\n\nexport function definitionBaseline(\n  definition: WorkspaceDefinition,\n  panels: PanelDeclarations,\n): Readonly<Record<string, string>> {\n  const hiddenViews = baselineHiddenViews(definition, panels);\n  const trees = baselineTrees(definition);\n  return {\n    ...(hiddenViews !== undefined && { [HIDDEN_VIEWS_KEY]: hiddenViews }),\n    ...(trees !== undefined && { [PANE_TREES_KEY]: trees }),\n  };\n}\n\nexport function baselineTrees(\n  definition: WorkspaceDefinition,\n): string | undefined {\n  if (definition.content === undefined) {\n    return undefined;\n  }\n  const { node } = contentTree(definition, []);\n  const tree = node === null ? null : normalizeNode(node);\n  return tree === null ? undefined : JSON.stringify({ [CONTENT_DOCK]: tree });\n}\n\nexport function baselineHiddenViews(\n  definition: WorkspaceDefinition,\n  panels: PanelDeclarations,\n): string | undefined {\n  const sidebars = definition.sidebars;\n  if (sidebars === undefined) {\n    return undefined;\n  }\n  const listed = panels.panelRegions.filter((region) =>\n    Object.hasOwn(sidebars, region),\n  );\n  const hidden = listed\n    .flatMap((region) =>\n      panels\n        .declaredPaths(region)\n        .map((path) => path.slice(VIEW_PANE_PREFIX.length))\n        .filter((id) => !sidebars[region].includes(id)),\n    )\n    .toSorted((a, b) => a.localeCompare(b));\n  return hidden.length === 0 ? undefined : JSON.stringify(hidden);\n}\n","import {\n  PaneNode,\n  PaneTab,\n  tabWithout,\n} from '../../regions/pane/tree/pane-node';\nimport { normalizeDockEntry } from '../../regions/pane/tree/stored-pane-tree';\nimport {\n  PRIMARY_PANE,\n  VIEW_PANE_PREFIX,\n} from '../../regions/pane/tree/pane-address';\nimport { parseIdSet } from '../../persistence/stored-values/persisted-id-set';\nimport { HIDDEN_VIEWS_KEY } from '../../regions/panel/hidden-views.service';\nimport { PANE_TREES_KEY } from '../../regions/pane/tree/pane-tree-storage';\nimport {\n  StateChannels,\n  WORKSPACE_STATE_KEYS,\n  WorkspaceStateKey,\n} from './state-channels';\n\ntype ReadState = (key: WorkspaceStateKey) => string | undefined;\n\ntype DeclaredPaths = (dock: string) => readonly string[];\n\nfunction stateDiffers(\n  stored: ReadState,\n  baseline: ReadState,\n  declaredPaths: DeclaredPaths,\n): boolean {\n  if (WORKSPACE_STATE_KEYS.every((key) => stored(key) == null)) {\n    return false;\n  }\n  return (\n    canonicalState(stored, declaredPaths) !==\n    canonicalState(baseline, declaredPaths)\n  );\n}\n\nfunction canonicalState(read: ReadState, declaredPaths: DeclaredPaths): string {\n  const hidden = parseIdSet(read(HIDDEN_VIEWS_KEY));\n  return JSON.stringify([\n    JSON.stringify([...hidden].toSorted((a, b) => a.localeCompare(b))),\n    canonicalTrees(read(PANE_TREES_KEY), hidden, declaredPaths),\n  ]);\n}\n\nfunction canonicalTrees(\n  raw: string | undefined,\n  hidden: ReadonlySet<string>,\n  declaredPaths: DeclaredPaths,\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    const docks = Object.keys(parsed ?? {}).toSorted((a, b) =>\n      a.localeCompare(b),\n    );\n    for (const dock of docks) {\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, declaredPaths))) {\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  declaredPaths: DeclaredPaths,\n): string[] {\n  return declaredPaths(dock).filter(\n    (path) => !hidden.has(path.slice(VIEW_PANE_PREFIX.length)),\n  );\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', 'badge'] 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((tab) => comparableTab(tab)) };\n  }\n  return {\n    ...node,\n    first: comparableNode(node.first),\n    second: comparableNode(node.second),\n  };\n}\n\nexport interface ChangedReading {\n  readonly activeId: string;\n  readonly activeDiffers: boolean;\n  readonly canReadBack: boolean;\n  readonly candidates: readonly {\n    id: string;\n    baseline: Readonly<Record<string, string>>;\n  }[];\n  readonly storedDiffers: (candidate: {\n    id: string;\n    baseline: Readonly<Record<string, string>>;\n  }) => boolean;\n}\n\nexport function changedWorkspaceIds(reading: ChangedReading): Set<string> {\n  const ids = new Set<string>();\n  if (reading.activeDiffers) {\n    ids.add(reading.activeId);\n  }\n  if (!reading.canReadBack) {\n    return ids;\n  }\n  for (const candidate of reading.candidates) {\n    if (candidate.id !== reading.activeId && reading.storedDiffers(candidate)) {\n      ids.add(candidate.id);\n    }\n  }\n  return ids;\n}\n\nexport function storedStateDiffers(\n  peek: ((key: string) => string | undefined) | undefined,\n  scopedKey: (key: string, id: string) => string,\n  workspace: { id: string; baseline: Readonly<Record<string, string>> },\n  declaredPaths: DeclaredPaths,\n): boolean {\n  return stateDiffers(\n    (key) => peek?.(scopedKey(key, workspace.id)),\n    (key) => workspace.baseline[key],\n    declaredPaths,\n  );\n}\n\nexport function activeStateDiffers(\n  channels: StateChannels,\n  baseline: Readonly<Record<string, string>>,\n  declaredPaths: DeclaredPaths,\n): boolean {\n  return stateDiffers(\n    (key) => channels[key].serialize(),\n    (key) => baseline[key],\n    declaredPaths,\n  );\n}\n","import { computed, Signal } from '@angular/core';\nimport { KeyValueStore } from '../../persistence/key-value-store';\nimport { workspaceScopedKey } from '../active-workspace.service';\nimport {\n  BUILT_IN_WORKSPACE_ID,\n  offersBuiltInWorkspace,\n} from '../declaration/composed-definitions';\nimport {\n  PanelDeclarations,\n  definitionBaseline,\n} from '../declaration/definition-baseline';\nimport { WorkspaceDefinition } from '../declaration/workspace-definition';\nimport {\n  activeStateDiffers,\n  changedWorkspaceIds,\n  storedStateDiffers,\n} from './workspace-changes';\nimport { StateChannels } from './state-channels';\nimport { Workspace } from '../catalog/saved-workspaces';\n\nexport interface UnsavedReading {\n  readonly channels: StateChannels;\n  readonly panels: PanelDeclarations;\n  readonly activeId: () => string;\n  readonly baselineOf: (id: string) => Readonly<Record<string, string>>;\n  readonly workspaces: () => readonly Workspace[];\n  readonly definitions: readonly WorkspaceDefinition[];\n  readonly workingStateStore: KeyValueStore;\n}\n\nexport function unsavedWorkspaces(reading: UnsavedReading): {\n  readonly hasChanges: Signal<boolean>;\n  readonly changedIds: Signal<Set<string>>;\n} {\n  const declaredPaths = reading.panels.declaredPaths;\n  const hasChanges = computed(() =>\n    activeStateDiffers(\n      reading.channels,\n      reading.baselineOf(reading.activeId()),\n      declaredPaths,\n    ),\n  );\n  const changedIds = computed(() =>\n    changedWorkspaceIds({\n      activeId: reading.activeId(),\n      activeDiffers: hasChanges(),\n      canReadBack: reading.workingStateStore.peek !== undefined,\n      candidates: changeCandidates(\n        reading.definitions,\n        reading.workspaces(),\n        reading.panels,\n      ),\n      storedDiffers: (candidate) =>\n        storedStateDiffers(\n          reading.workingStateStore.peek?.bind(reading.workingStateStore),\n          workspaceScopedKey,\n          candidate,\n          declaredPaths,\n        ),\n    }),\n  );\n  return { hasChanges, changedIds };\n}\n\nfunction changeCandidates(\n  definitions: readonly WorkspaceDefinition[],\n  saved: readonly Workspace[],\n  panels: PanelDeclarations,\n): readonly { id: string; baseline: Readonly<Record<string, string>> }[] {\n  const builtIn = offersBuiltInWorkspace(definitions)\n    ? [{ id: BUILT_IN_WORKSPACE_ID, baseline: {} }]\n    : [];\n  return [\n    ...builtIn,\n    ...definitions.map((definition) => ({\n      id: definition.id,\n      baseline: definitionBaseline(definition, panels),\n    })),\n    ...saved,\n  ];\n}\n","import { KeyValueStore } from '../../persistence/key-value-store';\nimport { readStoredValue } from '../../persistence/stored-values/hydrate';\nimport { workspaceScopedKey } from '../active-workspace.service';\n\nexport async function readWorkspaceState(\n  store: KeyValueStore,\n  scopedKey: (key: string) => string,\n  keys: readonly string[],\n): Promise<Record<string, string>> {\n  const state: Record<string, string> = {};\n  for (const key of keys) {\n    const raw = await readStoredValue(store, scopedKey(key));\n    if (raw != null) {\n      state[key] = raw;\n    }\n  }\n  return state;\n}\n\nexport function writeWorkspaceState(\n  store: KeyValueStore,\n  id: string,\n  state: Readonly<Record<string, string>>,\n  keys: readonly string[],\n): void {\n  for (const key of keys) {\n    const scoped = workspaceScopedKey(key, id);\n    const value = state[key];\n    if (value === undefined) {\n      void store.delete(scoped);\n    } else {\n      void store.set(scoped, value);\n    }\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { Route, Routes } from '@angular/router';\n\nexport const DISTRIBUTION_ROUTES = new InjectionToken<Routes>(\n  'lw.distribution-routes',\n);\n\nexport function isCatchAll(route: Route): boolean {\n  return (route.path ?? '').startsWith('**');\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 { PRODUCT_IDENTITY } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { SurfaceActions } from '../regions/content/actions/surface-actions';\nimport { SurfaceBody } from '../regions/content/surface/surface-body';\nimport { paneLabelOf, resolveTitle } from '../regions/pane/chrome/tab-label';\nimport { Wording } from '../i18n/wording';\nimport { popoutTargetFromUrl } from './popout-path';\n\n@Component({\n  selector: 'lw-popout-view',\n  imports: [SurfaceBody, SurfaceActions],\n  templateUrl: './popout-view.html',\n  host: { class: 'flex h-full min-h-0 flex-col' },\n})\nexport class PopoutView {\n  private readonly router = inject(Router);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly wording = inject(Wording);\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  constructor() {\n    effect(() => {\n      const label = paneLabelOf(this.registry, this.target());\n      const title = resolveTitle(label, (key) => this.wording.translate(key));\n      this.document.title = `${title} — ${this.product.name}`;\n    });\n  }\n}\n","<div\n  class=\"hidden shrink-0 items-center justify-end border-b border-border bg-surface px-2 py-1 has-[button]:flex\"\n  data-testid=\"popout-actions\"\n>\n  <lw-surface-actions [path]=\"target()\" region=\"popout\" />\n</div>\n<div class=\"min-h-0 flex-1\">\n  <lw-surface-body\n    [path]=\"target()\"\n    variant=\"content\"\n    data-testid=\"popout-surface\"\n  />\n</div>\n","import { Location } from '@angular/common';\nimport {\n  effect,\n  inject,\n  Injector,\n  isDevMode,\n  Service,\n  untracked,\n} from '@angular/core';\nimport { NavigationEnd, Router, Routes } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { ContentRoute } from '@loomweaver/plugin-sdk';\nimport {\n  ContributionRegistry,\n  RegisteredContentRoute,\n} from '../../../contributions/contribution-registry';\nimport { AuthContext } from '../../../auth/auth-context';\nimport { BootAddress } from './boot-address';\nimport { DISTRIBUTION_ROUTES, isCatchAll } from './distribution-routes';\nimport { buildContentRoutes, routePlaceholder } from './content-route-table';\nimport { matchRoute, normalizePath, segmentsOf } from '../content-path';\nimport { POPOUT_PREFIX } from '../../../popout/popout-path';\nimport { PopoutView } from '../../../popout/popout-view';\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 auth = inject(AuthContext);\n  private readonly owned =\n    inject(DISTRIBUTION_ROUTES, { optional: true }) ?? [];\n  private readonly ownedFirst = this.owned.filter(\n    (route) => !isCatchAll(route),\n  );\n  private readonly ownedLast = this.owned.filter((route) => isCatchAll(route));\n  private readonly reportedTwice = new Set<string>();\n  private started = false;\n  private lastRoutes: readonly ContentRoute[] = [];\n  private lastOmitted: readonly ContentRoute[] = [];\n\n  private pendingDeepLink: string | null = null;\n  private heldAddress: string | null = null;\n  private parkedOnPlaceholder = false;\n  private userNavigated = false;\n  private landings = 0;\n  private heldAt = 0;\n\n  here(): string {\n    return normalizePath(this.router.url);\n  }\n\n  ownsTheOpeningAddress(): boolean {\n    return this.ownedFirst.some(\n      (route) => normalizePath(route.path ?? '') === '',\n    );\n  }\n\n  hold(address: string): void {\n    this.heldAddress = normalizePath(address) === '' ? null : address;\n    this.heldAt = this.landings;\n  }\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.followNavigation();\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    this.followRegistry();\n    this.rematchOnSessionChange();\n  }\n\n  private followNavigation(): void {\n    this.location.subscribe(() => {\n      this.userNavigated = true;\n    });\n    this.router.events\n      .pipe(\n        filter(\n          (event): event is NavigationEnd => event instanceof NavigationEnd,\n        ),\n      )\n      .subscribe((event) => this.landed(event.urlAfterRedirects));\n  }\n\n  private followRegistry(): void {\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        const wasParked = this.parkedOnPlaceholder;\n        this.applyConfig(routes, omitted);\n\n        this.retryDeepLink(wasParked);\n        this.retryHeld();\n      },\n      { injector: this.injector },\n    );\n  }\n\n  private rematchOnSessionChange(): void {\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    const pending = this.pendingPlaceholder(routes);\n    this.parkedOnPlaceholder = pending.length > 0;\n    this.reportAddressesDeclaredTwice(routes);\n    this.router.resetConfig([\n      { path: `${POPOUT_PREFIX}/**`, component: PopoutView },\n      ...this.ownedFirst,\n      ...buildContentRoutes(routes, omitted),\n      ...pending,\n      ...this.ownedLast,\n    ]);\n  }\n\n  private reportAddressesDeclaredTwice(\n    routes: readonly RegisteredContentRoute[],\n  ): void {\n    if (!isDevMode()) {\n      return;\n    }\n    for (const route of this.ownedFirst) {\n      const path = normalizePath(route.path ?? '');\n      const contributed = routes.some(\n        (candidate) => normalizePath(candidate.path) === path,\n      );\n      if (!contributed || this.reportedTwice.has(path)) {\n        continue;\n      }\n      this.reportedTwice.add(path);\n      const named = path === '' ? 'The address naming no content' : `\"${path}\"`;\n      console.warn(\n        `${named} is declared by the distribution and by a plugin — ` +\n          `the distribution's route is what it resolves to.`,\n      );\n    }\n  }\n\n  private pendingPlaceholder(\n    routes: readonly RegisteredContentRoute[],\n  ): Routes {\n    const target = this.pendingDeepLink;\n    if (target === null) {\n      return [];\n    }\n    const path = normalizePath(target);\n    const matched = matchRoute(routes, path);\n    if (path === '' || segmentsOf(matched?.path ?? '').length > 0) {\n      return [];\n    }\n    return [routePlaceholder(path)];\n  }\n\n  private landed(url: string): void {\n    this.landings += 1;\n    this.releaseHeld(url);\n    this.noteUserChoice(url);\n  }\n\n  private noteUserChoice(url: string): void {\n    if (this.landings <= 1 || this.pendingDeepLink === null) {\n      return;\n    }\n    if (normalizePath(url) !== normalizePath(this.pendingDeepLink)) {\n      this.userNavigated = true;\n    }\n  }\n\n  private releaseHeld(landed: string): void {\n    if (\n      this.heldAddress !== null &&\n      normalizePath(landed) !== normalizePath(this.heldAddress)\n    ) {\n      this.heldAddress = null;\n    }\n  }\n\n  private retryHeld(): void {\n    const target = this.heldAddress;\n    if (!target) {\n      return;\n    }\n    if (normalizePath(this.router.url) === normalizePath(target)) {\n      this.heldAddress = null;\n      return;\n    }\n    if (this.landings > this.heldAt) {\n      this.heldAddress = null;\n      return;\n    }\n    if (matchRoute(this.lastRoutes, target) === undefined) {\n      return;\n    }\n    this.heldAddress = null;\n    void this.router\n      .navigateByUrl(target, { onSameUrlNavigation: 'reload' })\n      .catch(() => undefined);\n  }\n\n  private retryDeepLink(wasParked: boolean): void {\n    const target = this.pendingDeepLink;\n    if (!target) {\n      return;\n    }\n    const here = normalizePath(this.router.url);\n    if ((here === normalizePath(target) && !wasParked) || 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, { onSameUrlNavigation: 'reload' })\n      .then((ok) => {\n        if (ok) {\n          this.pendingDeepLink = null;\n        }\n      })\n      .catch(() => {\n        this.pendingDeepLink = null;\n      });\n  }\n}\n","import { effect, inject, Service, untracked } from '@angular/core';\nimport { AuthContext } from '../../auth/auth-context';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport {\n  matchRoute,\n  normalizePath,\n  tabRootOf,\n} from '../../regions/content/content-path';\nimport { ContentRouter } from '../../regions/content/routing/content-router';\nimport { CONTENT_DOCK } from '../../regions/pane/tree/pane-address';\nimport { leavesOf } from '../../regions/pane/tree/pane-queries';\nimport { PaneTreeService } from '../../regions/pane/tree/pane-tree.service';\nimport { ActiveWorkspaceService } from '../active-workspace.service';\n\n@Service()\nexport class WithheldVisits {\n  private readonly active = inject(ActiveWorkspaceService);\n  private readonly auth = inject(AuthContext);\n  private readonly contentRouter = inject(ContentRouter);\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly waiting = new Map<string, Set<string>>();\n\n  constructor() {\n    effect(() => {\n      this.auth.state();\n      untracked(() => this.releaseWhatQualifies());\n    });\n  }\n\n  note(path: string): void {\n    const root = this.rootOf(path);\n    if (this.holdsContentAt(root)) {\n      return;\n    }\n    const here = this.active.id();\n    this.waiting.set(here, new Set([...this.waitingHere(), root]));\n  }\n\n  leave(path: string): void {\n    this.releaseWhatQualifies(this.rootOf(path));\n  }\n\n  arrived(): void {\n    this.releaseWhatQualifies();\n  }\n\n  forget(): void {\n    this.waiting.clear();\n  }\n\n  private releaseWhatQualifies(settling?: string): void {\n    const shown = this.rootOf(this.contentRouter.here());\n    const waiting = this.waitingHere();\n    for (const root of waiting) {\n      if (root !== settling && (root === shown || !this.qualifies(root))) {\n        continue;\n      }\n      this.removeContentAt(root);\n      waiting.delete(root);\n    }\n  }\n\n  private waitingHere(): Set<string> {\n    return this.waiting.get(this.active.id()) ?? new Set();\n  }\n\n  private qualifies(root: string): boolean {\n    return this.auth.meets(\n      matchRoute(this.registry.contentRoutes(), root)?.access,\n    );\n  }\n\n  private holdsContentAt(root: string): boolean {\n    return leavesOf(this.paneTree.tree(CONTENT_DOCK)).some((leaf) =>\n      leaf.tabs.some((tab) => this.rootOf(tab.path) === root),\n    );\n  }\n\n  private removeContentAt(root: string): void {\n    for (const leaf of leavesOf(this.paneTree.tree(CONTENT_DOCK))) {\n      for (const tab of leaf.tabs) {\n        if (this.rootOf(tab.path) === root) {\n          this.paneTree.removeTab(CONTENT_DOCK, leaf.id, tab.path);\n        }\n      }\n    }\n  }\n\n  private rootOf(path: string): string {\n    return tabRootOf(this.registry.contentRoutes(), normalizePath(path));\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { normalizePath } from '../../regions/content/content-path';\nimport { ContentRouter } from '../../regions/content/routing/content-router';\nimport { NavigationOptions } from '../../regions/content/tabs/content-tab-projection';\nimport { TabNavigationService } from '../../regions/content/tabs/tab-navigation.service';\nimport { ActiveWorkspaceService } from '../active-workspace.service';\nimport { settlementDestination } from '../catalog/workspace-lookup';\nimport { WorkspaceCatalog } from '../catalog/workspace-catalog';\nimport { claimFor } from '../workspace-claims';\nimport { WithheldVisits } from './withheld-visits';\n\n@Service()\nexport class AddressSettlement {\n  private readonly active = inject(ActiveWorkspaceService);\n  private readonly catalog = inject(WorkspaceCatalog);\n  private readonly contentRouter = inject(ContentRouter);\n  private readonly tabNavigation = inject(TabNavigationService);\n  private readonly withheld = inject(WithheldVisits);\n\n  private chosen: string | null = null;\n\n  choose(path: string, options: NavigationOptions = {}): void {\n    this.chosen = normalizePath(path);\n    this.contentRouter.hold(path);\n    this.tabNavigation.navigateTo(path, options);\n  }\n\n  wouldSettle(path: string): boolean {\n    return (\n      this.chosen !== normalizePath(path) &&\n      this.settlementDestination(path) !== null\n    );\n  }\n\n  takeDestination(path: string): string | null {\n    const chosen = this.chosen;\n    this.chosen = null;\n    if (chosen !== null && chosen === normalizePath(path)) {\n      return null;\n    }\n    return this.settlementDestination(path);\n  }\n\n  settlementDestination(path: string): string | null {\n    return settlementDestination(\n      path,\n      this.active.id(),\n      this.catalog.definitions,\n      this.catalog.saved(),\n    );\n  }\n\n  withhold(path: string): void {\n    if (this.settlementDestination(path) !== null) {\n      this.withheld.note(path);\n    }\n  }\n\n  leaveWithheld(path: string): void {\n    this.withheld.leave(path);\n  }\n\n  forgetWithheld(): void {\n    this.withheld.forget();\n  }\n\n  arrivedInWorkspace(): void {\n    this.withheld.arrived();\n  }\n\n  destinationFor(path: string): string | null {\n    return claimFor(this.catalog.activeClaims(), path)?.workspaceId ?? null;\n  }\n}\n","import { inject, isDevMode, Service } from '@angular/core';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { SHELL_LAYOUT } from '../layout/layout';\nimport { regionIdsOfType } from '../layout/layout-queries';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { activeContentPath } from '../regions/pane/tree/active-content-path';\nimport { PaneTreeService } from '../regions/pane/tree/pane-tree.service';\nimport { HiddenViewsService } from '../regions/panel/hidden-views.service';\nimport { PanelGroupService } from '../regions/panel/panel-group.service';\nimport { ActiveWorkspaceService } from './active-workspace.service';\nimport {\n  WORKSPACE_STATE_KEYS,\n  stateChannels,\n} from './working-state/state-channels';\nimport { readWorkspaceState } from './working-state/working-state-io';\nimport { WorkspaceCatalog } from './catalog/workspace-catalog';\nimport { warnDeclarationGaps } from './declaration/definition-audit';\nimport {\n  PanelDeclarations,\n  definitionBaseline,\n} from './declaration/definition-baseline';\nimport { AddressSettlement } from './settlement/address-settlement';\n\n@Service()\nexport class WorkspaceSwitcher {\n  private readonly active = inject(ActiveWorkspaceService);\n  private readonly catalog = inject(WorkspaceCatalog);\n  private readonly settlement = inject(AddressSettlement);\n  private readonly workingStateStore = inject(WORKING_STATE_STORE);\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly panelGroups = inject(PanelGroupService);\n  private readonly registry = inject(ContributionRegistry);\n\n  readonly channels = stateChannels(inject(HiddenViewsService), this.paneTree);\n\n  readonly panels: PanelDeclarations = {\n    panelRegions: regionIdsOfType(inject(SHELL_LAYOUT), 'panel'),\n    declaredPaths: (region) => this.panelGroups.declaredPaths(region),\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.catalog.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    await this.enter(id);\n    if (options.keepAddress !== true) {\n      this.chooseCurrentAddress();\n    }\n  }\n\n  async enter(id: string): Promise<void> {\n    this.active.set(id);\n    await this.hydrateActive();\n    this.settlement.arrivedInWorkspace();\n    this.warnDeclarationGaps(id);\n  }\n\n  apply(state: Readonly<Record<string, string>>): void {\n    for (const key of WORKSPACE_STATE_KEYS) {\n      this.channels[key].hydrate(state[key]);\n    }\n  }\n\n  baselineOf(id: string): Readonly<Record<string, string>> {\n    const saved = this.catalog.saved().find((workspace) => workspace.id === id);\n    if (saved) {\n      return saved.baseline;\n    }\n    const definition = this.catalog.definitionOf(id);\n    return definition ? definitionBaseline(definition, this.panels) : {};\n  }\n\n  currentState(): Promise<Record<string, string>> {\n    return readWorkspaceState(\n      this.workingStateStore,\n      (key) => this.active.scopedKey(key),\n      WORKSPACE_STATE_KEYS,\n    );\n  }\n\n  chooseCurrentAddress(): void {\n    this.settlement.choose(activeContentPath(this.paneTree));\n  }\n\n  warnDeclarationGaps(id: string): void {\n    const definition = this.catalog.definitionOf(id);\n    if (!isDevMode() || definition === undefined) {\n      return;\n    }\n    warnDeclarationGaps(definition, {\n      routes: this.registry.contentRoutes(),\n      declaredPaths: this.panels.declaredPaths,\n    });\n  }\n\n  private async hydrateActive(): Promise<void> {\n    const baseline = this.baselineOf(this.active.id());\n    const stored = await this.currentState();\n    for (const key of WORKSPACE_STATE_KEYS) {\n      this.channels[key].hydrate(stored[key] ?? baseline[key]);\n    }\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { StateSyncService } from '../../persistence/cross-tab/state-sync.service';\nimport { isHomePath } from '../../regions/content/content-path';\nimport { BootAddress } from '../../regions/content/routing/boot-address';\nimport { ContentRouter } from '../../regions/content/routing/content-router';\nimport { ContentTabState } from '../../regions/content/tabs/content-tab-state';\nimport { TabNavigationService } from '../../regions/content/tabs/tab-navigation.service';\nimport { activeContentPath } from '../../regions/pane/tree/active-content-path';\nimport { PANE_TREES_KEY } from '../../regions/pane/tree/pane-tree-storage';\nimport { PaneTreeService } from '../../regions/pane/tree/pane-tree.service';\nimport { ActiveWorkspaceService } from '../active-workspace.service';\nimport { WORKSPACE_STATE_KEYS } from '../working-state/state-channels';\nimport { WorkspaceCatalog } from '../catalog/workspace-catalog';\nimport { WorkspaceDefinition } from '../declaration/workspace-definition';\nimport { AddressSettlement } from '../settlement/address-settlement';\nimport { WorkspaceSwitcher } from '../workspace-switcher';\n\nexport function declaredStart(\n  definitions: readonly WorkspaceDefinition[],\n): WorkspaceDefinition | undefined {\n  return definitions.find((definition) => definition.initial);\n}\n\nexport function atTheOpeningAddress(boot: string, here: string): boolean {\n  return isHomePath(boot) && isHomePath(here);\n}\n\n@Service()\nexport class WorkbenchOpening {\n  private readonly active = inject(ActiveWorkspaceService);\n  private readonly catalog = inject(WorkspaceCatalog);\n  private readonly switcher = inject(WorkspaceSwitcher);\n  private readonly settlement = inject(AddressSettlement);\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly tabState = inject(ContentTabState);\n  private readonly tabNavigation = inject(TabNavigationService);\n  private readonly bootAddress = inject(BootAddress);\n  private readonly contentRouter = inject(ContentRouter);\n  private readonly sync = inject(StateSyncService);\n\n  start(): void {\n    this.sync.onNamespaceAdopted(() => this.rereadForAdoptedNamespace());\n    void this.active.ready.then(() => this.openWorkbench());\n  }\n\n  private async openWorkbench(): Promise<void> {\n    const adopted = this.active.takeAdoption();\n    if (adopted !== null) {\n      this.switcher.apply(this.switcher.baselineOf(adopted));\n      this.switcher.warnDeclarationGaps(adopted);\n      this.tabNavigation.keepAddress(this.tabState.activePath());\n    }\n    await this.startWhereTheDistributionSays(adopted !== null);\n  }\n\n  private async startWhereTheDistributionSays(adopted: boolean): Promise<void> {\n    const declared = declaredStart(this.catalog.definitions);\n    if (declared?.content === undefined || !this.atTheOpeningAddress()) {\n      return;\n    }\n    if (!adopted) {\n      if (this.active.wasChosen()) {\n        return;\n      }\n      await this.paneTree.arrangementSettled;\n      if (!this.atTheOpeningAddress() || this.active.wasChosen()) {\n        return;\n      }\n      await this.switcher.enter(declared.id);\n    }\n    const path = activeContentPath(this.paneTree);\n    if (path === '' || !this.atTheOpeningAddress()) {\n      return;\n    }\n    this.settlement.choose(path, { replace: true });\n  }\n\n  private atTheOpeningAddress(): boolean {\n    return (\n      atTheOpeningAddress(this.bootAddress.path, this.contentRouter.here()) &&\n      !this.contentRouter.ownsTheOpeningAddress()\n    );\n  }\n\n  private async rereadForAdoptedNamespace(): Promise<void> {\n    await this.active.reread();\n    const stored = await this.switcher.currentState();\n    const found = WORKSPACE_STATE_KEYS.filter(\n      (key) => stored[key] !== undefined,\n    );\n    if (found.includes(PANE_TREES_KEY)) {\n      this.settlement.forgetWithheld();\n    }\n    for (const key of found) {\n      this.switcher.channels[key].hydrate(stored[key]);\n    }\n    const shown = this.tabState.activePath();\n    const destination = this.settlement.settlementDestination(shown);\n    if (destination !== null) {\n      this.settlement.leaveWithheld(shown);\n      await this.switcher.switchTo(destination, { keepAddress: true });\n    }\n    if (found.length > 0 || destination !== null) {\n      this.tabNavigation.keepAddress(shown);\n    }\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { SurfaceCloseGuard } from '../regions/pane/unsaved-work/surface-close-guard';\nimport { RetainedViewStash } from '../regions/pane/retention/retained-view-stash';\nimport { UnsavedWork } from '../regions/pane/unsaved-work/unsaved-work';\n\n@Service()\nexport class WorkspaceDiscardConfirmation {\n  private readonly closeGuard = inject(SurfaceCloseGuard);\n  private readonly unsavedWork = inject(UnsavedWork);\n  private readonly stash = inject(RetainedViewStash);\n\n  confirmDiscardAll(): Promise<boolean> {\n    return this.closeGuard.confirmDiscard(\n      this.unsavedWork.instancesEverywhere(),\n    );\n  }\n\n  confirmDiscardParked(workspaceId: string): Promise<boolean> {\n    return this.closeGuard.confirmDiscard(\n      this.stash.parkedInstancesOf(workspaceId),\n    );\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.at(-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 index = 1; index < letters.length; index++) {\n    yield (letters[0] + letters[index]).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    const candidate = firstFree(candidatesFor(workspace.name), taken);\n    if (candidate === undefined) {\n      continue;\n    }\n\n    taken.add(candidate);\n    assigned.set(workspace.id, candidate);\n  }\n  return assigned;\n}\n\nfunction firstFree(\n  candidates: Iterable<string>,\n  taken: ReadonlySet<string>,\n): string | undefined {\n  for (const candidate of candidates) {\n    if (!taken.has(candidate)) {\n      return candidate;\n    }\n  }\n  return undefined;\n}\n","import { computed, inject, Service } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../persistence/working-state-store';\nimport { TabNavigationService } from '../regions/content/tabs/tab-navigation.service';\nimport { RetainedViewStash } from '../regions/pane/retention/retained-view-stash';\nimport {\n  ActiveWorkspaceService,\n  workspaceScopedKey,\n} from './active-workspace.service';\nimport { WORKSPACE_STATE_KEYS } from './working-state/state-channels';\nimport { unsavedWorkspaces } from './working-state/unsaved-workspaces';\nimport { writeWorkspaceState } from './working-state/working-state-io';\nimport { WorkspaceCatalog } from './catalog/workspace-catalog';\nimport { BUILT_IN_WORKSPACE_ID } from './declaration/composed-definitions';\nimport { WorkbenchOpening } from './opening/workbench-opening';\nimport { AddressSettlement } from './settlement/address-settlement';\nimport { type WorkspaceClaim } from './workspace-claims';\nimport { WorkspaceDiscardConfirmation } from './workspace-discard-confirmation';\nimport { assignWorkspaceInitials } from './workspace-initials';\nimport { WorkspaceSwitcher } from './workspace-switcher';\n\n@Service()\nexport class WorkspaceService {\n  private readonly catalog = inject(WorkspaceCatalog);\n  private readonly switcher = inject(WorkspaceSwitcher);\n  private readonly settlement = inject(AddressSettlement);\n  private readonly active = inject(ActiveWorkspaceService);\n  private readonly stash = inject(RetainedViewStash);\n  private readonly discard = inject(WorkspaceDiscardConfirmation);\n  private readonly tabNavigation = inject(TabNavigationService);\n  private readonly workingStateStore = inject(WORKING_STATE_STORE);\n\n  readonly definitions = this.catalog.definitions;\n  readonly workspaces = this.catalog.saved;\n  readonly activeId = this.active.id;\n\n  readonly initials = computed(() =>\n    assignWorkspaceInitials(this.workspaces()),\n  );\n\n  private readonly unsaved = unsavedWorkspaces({\n    channels: this.switcher.channels,\n    panels: this.switcher.panels,\n    activeId: () => this.active.id(),\n    baselineOf: (id) => this.switcher.baselineOf(id),\n    workspaces: () => this.workspaces(),\n    definitions: this.definitions,\n    workingStateStore: this.workingStateStore,\n  });\n\n  readonly hasChanges = this.unsaved.hasChanges;\n  readonly changedIds = this.unsaved.changedIds;\n\n  constructor() {\n    inject(WorkbenchOpening).start();\n  }\n\n  async saveCurrent(name: string): Promise<void> {\n    const baseline = await this.switcher.currentState();\n    const id = crypto.randomUUID();\n    const origin = this.originOf(this.active.id());\n    this.catalog.commit([\n      ...this.workspaces(),\n      { id, name, baseline, ...(origin !== null && { origin }) },\n    ]);\n    this.active.set(id);\n    this.switcher.apply(baseline);\n  }\n\n  async saveBaseline(): Promise<void> {\n    const id = this.active.id();\n    if (this.catalog.isBuiltInOrDeclared(id)) {\n      return;\n    }\n    const baseline = await this.switcher.currentState();\n    this.catalog.commit(\n      this.workspaces().map((workspace) =>\n        workspace.id === id ? { ...workspace, baseline } : workspace,\n      ),\n    );\n  }\n\n  wouldSettle(path: string): boolean {\n    return this.settlement.wouldSettle(path);\n  }\n\n  async settle(path: string): Promise<void> {\n    const destination = this.settlement.takeDestination(path);\n    if (destination === null) {\n      return;\n    }\n\n    this.settlement.leaveWithheld(path);\n    await this.switchTo(destination, { keepAddress: true });\n    this.tabNavigation.keepAddress(path);\n  }\n\n  withhold(path: string): void {\n    this.settlement.withhold(path);\n  }\n\n  switchTo(id: string, options: { keepAddress?: boolean } = {}): Promise<void> {\n    return this.switcher.switchTo(id, options);\n  }\n\n  async reset(id: string = this.active.id()): Promise<boolean> {\n    if (!this.catalog.exists(id)) {\n      return false;\n    }\n    if (id === this.active.id() && !(await this.discard.confirmDiscardAll())) {\n      return false;\n    }\n    this.resetNow(id);\n    return true;\n  }\n\n  async resetAll(): Promise<boolean> {\n    if (!(await this.discard.confirmDiscardAll())) {\n      return false;\n    }\n    for (const workspace of this.catalog.everyOrigin()) {\n      this.resetNow(workspace.id);\n    }\n    if (this.catalog.offersBuiltIn) {\n      this.resetNow(BUILT_IN_WORKSPACE_ID);\n    }\n    return true;\n  }\n\n  rename(id: string, name: string): void {\n    if (this.catalog.definitionOf(id) !== undefined) {\n      return;\n    }\n    this.catalog.commit(\n      this.workspaces().map((workspace) =>\n        workspace.id === id ? { ...workspace, name } : workspace,\n      ),\n    );\n  }\n\n  async remove(id: string): Promise<boolean> {\n    if (this.catalog.isBuiltInOrDeclared(id) || !(await this.discard.confirmDiscardParked(id))) {\n      return false;\n    }\n    this.catalog.commit(\n      this.workspaces().filter((workspace) => workspace.id !== id),\n    );\n    this.stash.evictWorkspace(id);\n    for (const key of WORKSPACE_STATE_KEYS) {\n      void this.workingStateStore.delete(workspaceScopedKey(key, id));\n    }\n    if (id === this.active.id()) {\n      void this.switchTo(this.catalog.startingId);\n    }\n    return true;\n  }\n\n  originOf(id: string): string | null {\n    return this.catalog.originOf(id);\n  }\n\n  claimsOfWorkspace(id: string): readonly WorkspaceClaim[] {\n    return this.catalog.claimsOfWorkspace(id);\n  }\n\n  destinationFor(path: string): string | null {\n    return this.settlement.destinationFor(path);\n  }\n\n  private resetNow(id: string): void {\n    if (id !== this.active.id()) {\n      this.stash.evictWorkspace(id);\n      writeWorkspaceState(\n        this.workingStateStore,\n        id,\n        this.switcher.baselineOf(id),\n        WORKSPACE_STATE_KEYS,\n      );\n      return;\n    }\n    this.stash.endHolds(id);\n    this.switcher.apply(this.switcher.baselineOf(id));\n    this.switcher.warnDeclarationGaps(id);\n    this.switcher.chooseCurrentAddress();\n  }\n}\n","import { Service } from '@angular/core';\nimport { persistedSetting } from '../../persistence/stored-values/persisted-setting';\nimport {\n  FlagRecord,\n  isTrue,\n  parseRecord,\n  toggledFlag,\n} from '../../persistence/stored-values/persisted-record';\n\nconst STORAGE_KEY = 'lw.shell.rail-labels';\n\n@Service()\nexport class RailLabelsService {\n  private readonly stored = persistedSetting<FlagRecord>(STORAGE_KEY, {\n    parse: (raw) => parseRecord(raw, isTrue),\n    serialize: (labels) => JSON.stringify(labels),\n  });\n\n  isLabelled(railId: string): boolean {\n    return this.stored.value()[railId] === true;\n  }\n\n  setLabelled(railId: string, labelled: boolean): void {\n    this.stored.set(toggledFlag(this.stored.value(), railId, labelled));\n  }\n}\n","import {\n  afterEveryRender,\n  DestroyRef,\n  Directive,\n  ElementRef,\n  inject,\n  signal,\n} from '@angular/core';\n\n@Directive()\nexport class RailLabelFit {\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly shortenedIds = signal<ReadonlySet<string>>(new Set());\n\n  constructor() {\n    afterEveryRender(() => this.measure());\n    this.observeResize();\n  }\n\n  isShortened(itemId: string): boolean {\n    return this.shortenedIds().has(itemId);\n  }\n\n  private measure(): void {\n    const shortened = shortenedLabelIds(this.host.nativeElement);\n    if (!sameIds(shortened, this.shortenedIds())) {\n      this.shortenedIds.set(shortened);\n    }\n  }\n\n  private observeResize(): void {\n    if (typeof ResizeObserver === 'undefined') {\n      return;\n    }\n    const observer = new ResizeObserver(() => this.measure());\n    observer.observe(this.host.nativeElement);\n    this.destroyRef.onDestroy(() => observer.disconnect());\n  }\n}\n\nexport function shortenedLabelIds(root: HTMLElement): ReadonlySet<string> {\n  const shortened = new Set<string>();\n  for (const label of root.querySelectorAll<HTMLElement>('[data-rail-label]')) {\n    const id = label.dataset['railLabel'];\n    if (id && label.scrollHeight - label.clientHeight > 1) {\n      shortened.add(id);\n    }\n  }\n  return shortened;\n}\n\nexport function sameIds(\n  a: ReadonlySet<string>,\n  b: ReadonlySet<string>,\n): boolean {\n  return a.size === b.size && [...a].every((id) => b.has(id));\n}\n","import {\n  afterNextRender,\n  effect,\n  inject,\n  Injector,\n  isDevMode,\n  Service,\n} from '@angular/core';\nimport { Disposable } from '@loomweaver/plugin-sdk';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { RailItem } from '../../foundation/rail-item';\nimport { WorkspaceService } from '../../workspace/workspace.service';\nimport { ActiveWorkspaceService } from '../../workspace/active-workspace.service';\nimport { RailItemsService, workspaceRailItemId } from './rail-items.service';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport { regionIdsOfType } from '../../layout/layout-queries';\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 activeWorkspace = inject(ActiveWorkspaceService);\n  private readonly railItems = inject(RailItemsService);\n  private readonly injector = inject(Injector);\n  private readonly rails = regionIdsOfType(inject(SHELL_LAYOUT), 'rail');\n  private readonly features = inject(FeatureSwitches).workspaces;\n\n  private readonly registered = new Map<string, Registration>();\n\n  start(): void {\n    if (this.rails.length === 0) {\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  isCurrent(item: RailItem): boolean {\n    if (item.workspace === undefined) {\n      return false;\n    }\n    const active = this.activeWorkspace.id();\n    return item.workspace === active || this.isStandIn(item.workspace, active);\n  }\n\n  private isStandIn(workspace: string, active: string): boolean {\n    return (\n      this.workspaces.originOf(active) === workspace &&\n      !this.hasOwnEntry(active)\n    );\n  }\n\n  private hasOwnEntry(workspaceId: string): boolean {\n    return (\n      this.features.savedInRail() &&\n      this.railItems.isVisible(workspaceRailItemId(workspaceId))\n    );\n  }\n\n  private reportUnoffered(): void {\n    if (!this.features.enabled()) {\n      return;\n    }\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        continue;\n      }\n\n      registration.disposable.dispose();\n      this.registered.delete(id);\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    if (!this.features.enabled()) {\n      return new Map<string, RailItem>();\n    }\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()\n      ? this.workspaces.workspaces()\n      : [];\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 { RailItem } from '../../foundation/rail-item';\n\nexport type RailBand = 'top' | 'bottom';\n\nexport interface RailEntries {\n  readonly top: readonly RailItem[];\n  readonly bottom: readonly RailItem[];\n}\n\nexport function bandOf(item: RailItem): RailBand {\n  return item.anchor ?? 'top';\n}\n\nexport function railEntries(\n  shown: readonly RailItem[],\n  inUserOrder: (band: readonly RailItem[]) => readonly RailItem[],\n): RailEntries {\n  const declared = shown.toSorted((a, b) => (a.order ?? 0) - (b.order ?? 0));\n  const inBand = (band: RailBand) =>\n    inUserOrder(declared.filter((item) => bandOf(item) === band));\n  return { top: inBand('top'), bottom: inBand('bottom') };\n}\n","import { LayoutRegion, ShellLayout } from '../../layout/layout';\nimport { regionsOfType } from '../../layout/layout-queries';\n\nexport function railNameKey(rail: LayoutRegion, layout: ShellLayout): string {\n  if (regionsOfType(layout, 'rail').length < 2) {\n    return 'rail.label';\n  }\n  return rail.dock === 'right' ? 'rail.labelRight' : 'rail.labelLeft';\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  inject,\n  Injector,\n  input,\n  signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport {\n  CdkDrag,\n  CdkDragDrop,\n  CdkDropList,\n  moveItemInArray,\n} from '@angular/cdk/drag-drop';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport { LayoutRegion, SHELL_LAYOUT } from '../../layout/layout';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { CommandService } from '../../commands/command.service';\nimport { RailItem } from '../../foundation/rail-item';\nimport { MenuTriggerDirective } from '../../menu/menu-trigger.directive';\nimport {\n  activateChromeItem,\n  menuOnContext,\n} from '../../menu/chrome-item-menu';\nimport { MenuContext } from '@loomweaver/plugin-sdk';\nimport { SlotResolution } from '../../menu/slot-resolution.service';\nimport { MenuSide } from '../../elements/menu/lw-menu.element';\nimport {\n  RAIL_CONTEXT_MENU,\n  RAIL_ITEM_CONTEXT_MENU,\n  railMenuContext,\n} 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 { FeatureSwitches } from '../../features/feature-switches.service';\nimport { WorkspaceService } from '../../workspace/workspace.service';\nimport { RailLabelsService } from './rail-labels.service';\nimport { RailLabelFit } from './rail-label-fit';\nimport { RailWorkspaceEntries } from './rail-workspace-entries';\nimport { bandOf, railEntries } from './rail-entries';\nimport { railNameKey } from './rail-name';\nimport { sideForMoveChord } from '../reorder/move-chord';\nimport { focusMovedEntry } from '../reorder/focus-moved-entry';\nimport { nameShowing } from '../../foundation/name-showing';\n\n@Component({\n  selector: 'lw-shell-rail',\n  imports: [\n    NgTemplateOutlet,\n    TranslocoPipe,\n    Reorderable,\n    CdkDropList,\n    CdkDrag,\n    CdkScrollable,\n    MenuTriggerDirective,\n  ],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './shell-rail.html',\n  hostDirectives: [RailLabelFit],\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 slots = inject(SlotResolution);\n  private readonly userOrder = inject(UserOrderService);\n  private readonly features = inject(FeatureSwitches).rail;\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  private readonly workspaceEntries = inject(RailWorkspaceEntries);\n  private readonly railLabels = inject(RailLabelsService);\n  protected readonly labelFit = inject(RailLabelFit);\n  private readonly injector = inject(Injector);\n\n  protected readonly railMenu = computed(() =>\n    this.features.curate() ? [RAIL_CONTEXT_MENU] : [],\n  );\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    railNameKey(this.region(), this.layout),\n  );\n  protected readonly menuSide = computed<MenuSide>(() =>\n    this.region().dock === 'right' ? 'left' : 'right',\n  );\n  protected readonly reorderable = computed(() => this.features.reorder());\n  protected readonly isLabelled = computed(() =>\n    this.railLabels.isLabelled(this.region().id),\n  );\n\n  protected readonly draggable = computed(\n    () => this.features.reorder() || this.features.moveItems(),\n  );\n\n  private readonly resolved = computed(\n    () =>\n      new Map(\n        this.slots\n          .resolve(\n            this.registry.railItems().filter((item) => this.isPlacedHere(item)),\n            (item) => this.menuContextOf(item),\n          )\n          .map((entry) => [entry.item.id, entry]),\n      ),\n  );\n\n  protected readonly entries = computed(() =>\n    railEntries(\n      [...this.resolved().values()].map((entry) => entry.item),\n      (band) =>\n        this.userOrder.applyOrder(this.containerId(), band, (item) => item.id),\n    ),\n  );\n\n  private readonly items = computed(() => {\n    const { top, bottom } = this.entries();\n    return [...top, ...bottom];\n  });\n\n  private readonly brokenPictures = signal<ReadonlySet<string>>(new Set());\n\n  protected readonly enterPredicate = (\n    _drag: CdkDrag<string>,\n    list: CdkDropList,\n  ): boolean =>\n    list.id === this.dropListId()\n      ? this.reorderable()\n      : this.features.moveItems();\n\n  protected pictureOf(item: RailItem): string | undefined {\n    return this.brokenPictures().has(item.id) ? undefined : item.image;\n  }\n\n  protected nameOf(item: RailItem, title: string): string {\n    return nameShowing([this.pictureOf(item) ? undefined : item.initials], title);\n  }\n\n  protected onPictureError(item: RailItem): void {\n    this.brokenPictures.update((broken) => new Set(broken).add(item.id));\n  }\n\n  protected isDisabled(item: RailItem): boolean {\n    return this.resolved().get(item.id)?.disabled ?? false;\n  }\n\n  protected menusFor(item: RailItem): readonly string[] {\n    const own = menuOnContext(item);\n    return own ? [RAIL_ITEM_CONTEXT_MENU, own] : [RAIL_ITEM_CONTEXT_MENU];\n  }\n\n  protected activateMenuFor(item: RailItem): string | undefined {\n    return this.resolved().get(item.id)?.opensMenu;\n  }\n\n  protected menuContextOf(item: RailItem): MenuContext {\n    return railMenuContext(item.id, this.region().id);\n  }\n\n  protected onFocus(event: FocusEvent): void {\n    (event.target as HTMLElement | null)?.scrollIntoView({ block: 'nearest' });\n  }\n\n  protected onKeydown(event: KeyboardEvent): void {\n    const side = this.features.moveItems() ? sideForMoveChord(event) : null;\n    if (side === 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(side, this.region().id);\n    if (!itemId || !target) {\n      return;\n    }\n    event.preventDefault();\n    this.railMove.move(itemId, target);\n    focusMovedEntry(`[data-rail-item=\"${CSS.escape(itemId)}\"]`, this.injector);\n  }\n\n  protected isCurrent(item: RailItem): boolean {\n    return this.workspaceEntries.isCurrent(item);\n  }\n\n  protected run(item: RailItem): void {\n    activateChromeItem(item, this.resolved().get(item.id), () => {\n      if (item.workspace === undefined) {\n        this.commands.trigger(item);\n      } else {\n        void this.workspaces.switchTo(item.workspace);\n      }\n    });\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 !!dragged && !!target && bandOf(dragged) === bandOf(target);\n  };\n\n  private isPlacedHere(item: RailItem): boolean {\n    return (\n      this.railItems.regionOf(item.id, item.rail) === this.region().id &&\n      this.railItems.isVisible(item.id)\n    );\n  }\n}\n","<nav\n  class=\"flex h-full shrink-0 flex-col items-center gap-1 bg-surface py-2\"\n  [class]=\"isLabelled() ? 'w-18' : 'w-10'\"\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  [lwMenu]=\"railMenu()\"\n>\n  <div\n    cdkScrollable\n    data-testid=\"rail-scroll\"\n    class=\"flex min-h-0 w-full flex-1 flex-col items-center gap-1 overflow-x-hidden overflow-y-auto\"\n  >\n    @for (item of entries().top; track item.id) {\n      <ng-container [ngTemplateOutlet]=\"entry\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n    }\n  </div>\n\n  @if (entries().bottom.length > 0) {\n    <div\n      data-testid=\"rail-anchored\"\n      class=\"flex w-full shrink-0 flex-col items-center gap-1\"\n    >\n      @for (item of entries().bottom; track item.id) {\n        <ng-container [ngTemplateOutlet]=\"entry\" [ngTemplateOutletContext]=\"{ $implicit: item }\" />\n      }\n    </div>\n  }\n\n  <ng-template #entry let-item>\n    <button\n      type=\"button\"\n      cdkDrag\n      [cdkDragData]=\"item.id\"\n      [cdkDragDisabled]=\"!draggable()\"\n      [disabled]=\"isDisabled(item)\"\n      (click)=\"run(item)\"\n      (keydown)=\"onKeydown($event)\"\n      (focus)=\"onFocus($event)\"\n      [lwMenu]=\"menusFor(item)\"\n      [lwMenuOnActivate]=\"activateMenuFor(item)\"\n      [lwMenuHeader]=\"item.menuHeader\"\n      [lwMenuSide]=\"menuSide()\"\n      [lwMenuContext]=\"menuContextOf(item)\"\n      [attr.aria-label]=\"nameOf(item, item.title | transloco)\"\n      [attr.aria-current]=\"isCurrent(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.text-content]=\"isCurrent(item)\"\n      [class.bg-surface-overlay]=\"isCurrent(item)\"\n      [class]=\"isLabelled() ? 'w-16 flex-col gap-1 px-1 py-1.5' : 'h-9 w-9'\"\n      class=\"relative flex shrink-0 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 (isCurrent(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 (pictureOf(item); as picture) {\n        <img\n          [src]=\"picture\"\n          alt=\"\"\n          aria-hidden=\"true\"\n          data-testid=\"rail-picture\"\n          class=\"lw-chrome-picture h-6 w-6\"\n          (error)=\"onPictureError(item)\"\n        />\n      } @else if (item.initials) {\n        <span\n          aria-hidden=\"true\"\n          data-testid=\"rail-initials\"\n          class=\"lw-rail-initials lw-chrome-mark h-6 w-6\"\n          >{{ item.initials }}</span\n        >\n      } @else {\n        <lw-icon [name]=\"item.icon\" [attr.size]=\"isLabelled() ? '1.25rem' : '1rem'\" />\n      }\n      @if (isLabelled()) {\n        &ngsp;<span\n          data-testid=\"rail-label\"\n          [attr.data-rail-label]=\"item.id\"\n          class=\"line-clamp-2 w-full text-center text-[0.625rem] leading-tight break-words\"\n          >{{ item.title | transloco }}</span\n        >\n      }\n      @if (!isLabelled() || labelFit.isShortened(item.id)) {\n        <lw-tooltip [text]=\"item.title | transloco\" [position]=\"menuSide()\" />\n      }\n    </button>\n  </ng-template>\n</nav>\n","import { Component, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { SHELL_LAYOUT, LayoutRegion } from './layout/layout';\nimport { regionsAt } from './layout/layout-queries';\nimport { ViewportService } from './layout/viewport.service';\nimport { PanelState } from './regions/panel/panel-state';\nimport { ShellPanel } from './regions/panel/shell-panel';\nimport { ShellSidebarHeader } from './regions/panel/shell-sidebar-header';\nimport { ShellRail } from './regions/rail/shell-rail';\n\n@Component({\n  selector: 'lw-shell-edge',\n  imports: [ShellRail, ShellPanel, ShellSidebarHeader, TranslocoPipe],\n  templateUrl: './shell-edge.html',\n  host: {\n    class: 'flex flex-col overflow-hidden border-border',\n    '[class.border-r]': \"side() === 'left' && hasBody()\",\n    '[class.border-l]': \"side() === 'right' && hasBody()\",\n  },\n})\nexport class ShellEdge {\n  readonly side = input.required<'left' | 'right'>();\n\n  private readonly layout = inject(SHELL_LAYOUT);\n  private readonly panelState = inject(PanelState);\n  protected readonly viewport = inject(ViewportService);\n\n  protected readonly rails = computed(() =>\n    regionsAt(this.layout, this.side(), 'rail'),\n  );\n  protected readonly panels = computed(() =>\n    regionsAt(this.layout, this.side(), 'panel'),\n  );\n\n  private readonly anyPanelOpen = computed(() =>\n    this.panels().some((panel) => !this.panelState.isCollapsed(panel.id)),\n  );\n\n  protected readonly panelNameKey = computed(() =>\n    this.side() === 'left' ? 'landmark.leftPanel' : 'landmark.rightPanel',\n  );\n\n  protected readonly hasBody = computed(\n    () =>\n      this.viewport.compact() || this.rails().length > 0 || this.anyPanelOpen(),\n  );\n\n  protected readonly railDivider = computed(\n    () => this.rails().length > 0 && this.anyPanelOpen(),\n  );\n\n  protected panelCollapsed(panel: LayoutRegion): boolean {\n    return !this.viewport.compact() && this.panelState.isCollapsed(panel.id);\n  }\n}\n","@if (viewport.compact()) {\n  @for (panel of panels(); track panel.id) {\n    <lw-shell-sidebar-header [region]=\"panel\" />\n  }\n}\n<div class=\"flex flex-1 overflow-hidden\">\n  @if (side() === 'left') {\n    @for (region of rails(); track region.id) {\n      <lw-shell-rail [region]=\"region\" />\n    }\n  }\n  @if (!viewport.compact() && panels().length) {\n    <aside\n      class=\"flex flex-col overflow-hidden border-border\"\n      [class.border-l]=\"side() === 'left' && railDivider()\"\n      [class.border-r]=\"side() === 'right' && railDivider()\"\n      [attr.aria-label]=\"panelNameKey() | transloco\"\n    >\n      @for (panel of panels(); 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 panels(); track region.id) {\n          <lw-shell-panel [region]=\"region\" />\n        }\n      </div>\n    </aside>\n  }\n  @if (side() === 'right') {\n    @for (region of rails(); track region.id) {\n      <lw-shell-rail [region]=\"region\" />\n    }\n  }\n</div>\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  effect,\n  inject,\n  untracked,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\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: [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 paneTree = 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.paneTree.tree(CONTENT_DOCK);\n    const paneId = this.maximizedPaneId();\n    return paneId === null ? full : (findLeaf(full, paneId) ?? full);\n  });\n\n  constructor() {\n    const document_ = inject(DOCUMENT);\n    const onKeydown = (event: KeyboardEvent) => {\n      if (event.key === 'Escape' && !event.defaultPrevented) {\n        this.chrome.endMaximize();\n      }\n    };\n    effect((onCleanup) => {\n      if (!this.maximized()) {\n        return;\n      }\n      document_.addEventListener('keydown', onKeydown);\n      onCleanup(() => document_.removeEventListener('keydown', onKeydown));\n    });\n    effect(() => {\n      if (!this.paneTree.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()\" />\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 from a plugin that imports only the SDK: it writes\n * `<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()\">Save</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","export interface FeedbackColors {\n  readonly text: string;\n  readonly tint: string;\n  readonly edge: string;\n}\n\nexport const FEEDBACK_COLORS = {\n  info: { text: 'text-info', tint: 'bg-info/10', edge: 'border-info/40' },\n  success: {\n    text: 'text-positive',\n    tint: 'bg-positive/10',\n    edge: 'border-positive/40',\n  },\n  warning: {\n    text: 'text-caution',\n    tint: 'bg-caution/10',\n    edge: 'border-caution/40',\n  },\n  negative: {\n    text: 'text-negative',\n    tint: 'bg-negative/10',\n    edge: 'border-negative/40',\n  },\n} as const satisfies Record<string, FeedbackColors>;\n","import { InjectionToken } from '@angular/core';\n\n/** Where the workbench shows its toasts: the edge of the window, then the side along it. */\nexport type ToastPosition =\n  | 'top-left'\n  | 'top-center'\n  | 'top-right'\n  | 'bottom-left'\n  | 'bottom-center'\n  | 'bottom-right';\n\nexport const TOAST_POSITION = new InjectionToken<ToastPosition>(\n  'lw.toast-position',\n  { providedIn: 'root', factory: () => 'bottom-right' },\n);\n\nexport const DRAW_TOASTS = new InjectionToken<boolean>('lw.draw-toasts', {\n  providedIn: 'root',\n  factory: () => true,\n});\n","import { ToastPosition } from './toast-options';\n\ninterface ToastPlacement {\n  readonly region: string;\n  readonly entering: string;\n  readonly isNewestFirst: boolean;\n}\n\nconst FROM_ABOVE = 'starting:-translate-y-2';\nconst FROM_BELOW = 'starting:translate-y-2';\n\nconst PLACEMENTS: Record<ToastPosition, ToastPlacement> = {\n  'top-left': {\n    region: 'top-0 md:items-start',\n    entering: FROM_ABOVE,\n    isNewestFirst: true,\n  },\n  'top-center': { region: 'top-0', entering: FROM_ABOVE, isNewestFirst: true },\n  'top-right': {\n    region: 'top-0 md:items-end',\n    entering: FROM_ABOVE,\n    isNewestFirst: true,\n  },\n  'bottom-left': {\n    region: 'bottom-0 md:items-start',\n    entering: FROM_BELOW,\n    isNewestFirst: false,\n  },\n  'bottom-center': {\n    region: 'bottom-0',\n    entering: FROM_BELOW,\n    isNewestFirst: false,\n  },\n  'bottom-right': {\n    region: 'bottom-0 md:items-end',\n    entering: FROM_BELOW,\n    isNewestFirst: false,\n  },\n};\n\nexport function toastPlacement(position: ToastPosition): ToastPlacement {\n  return PLACEMENTS[position];\n}\n\nexport function knownToastPosition(position: ToastPosition): ToastPosition {\n  if (!Object.hasOwn(PLACEMENTS, position)) {\n    throw new Error(\n      `provideShell: toastPosition '${String(position)}' is not one of ` +\n        `${Object.keys(PLACEMENTS).join(', ')}.`,\n    );\n  }\n  return position;\n}\n","import {\n  afterNextRender,\n  Component,\n  computed,\n  CUSTOM_ELEMENTS_SCHEMA,\n  effect,\n  ElementRef,\n  inject,\n  Injector,\n  signal,\n  untracked,\n  viewChild,\n  viewChildren,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LwButton } from '../elements/button/lw-button';\nimport {\n  Notification,\n  NotificationKind,\n  NotificationService,\n} from './notification.service';\nimport { FEEDBACK_COLORS, FeedbackColors } from './feedback-colors';\nimport { TOAST_POSITION } from './toast-options';\nimport { toastPlacement } from './toast-placement';\n\nconst COLORS: Record<NotificationKind, FeedbackColors> = {\n  info: FEEDBACK_COLORS.info,\n  success: FEEDBACK_COLORS.success,\n  warning: FEEDBACK_COLORS.warning,\n  error: FEEDBACK_COLORS.negative,\n};\n\n/**\n * Renders the notifications to show as toasts at the edge the distribution chose\n * (`provideShell({ toastPosition })`, bottom right by default). Mounted once by the shell root, so\n * every distribution gets it for free. Each toast shows its kind by colour and by icon, its\n * message, how often it was raised, an optional action button and a dismiss control. Once the\n * pointer moves on a toast, and while keyboard focus is in one, no toast leaves by itself; that\n * attention ends when the pointer or the focus leaves, and when the toast itself is gone.\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  private readonly injector = inject(Injector);\n  private readonly region = viewChild<ElementRef<HTMLElement>>('region');\n  private readonly dismissButtons =\n    viewChildren<ElementRef<HTMLElement>>('dismissButton');\n  private readonly placement = toastPlacement(inject(TOAST_POSITION));\n  private readonly toastUnderPointer = signal<string | undefined>(undefined);\n  private readonly toastWithFocus = signal<string | undefined>(undefined);\n  private readonly isAttended = computed(() => {\n    const attended = new Set([this.toastUnderPointer(), this.toastWithFocus()]);\n    return this.service.notifications().some((toast) => attended.has(toast.id));\n  });\n  protected readonly regionPlacement = this.placement.region;\n  protected readonly enteringFrom = this.placement.entering;\n  protected readonly notifications = computed(() =>\n    this.placement.isNewestFirst\n      ? this.service.notifications().toReversed()\n      : this.service.notifications(),\n  );\n\n  constructor() {\n    effect(() => this.forgetWhatLeft(this.service.notifications()));\n    effect(() => {\n      if (!this.isAttended()) {\n        this.service.release();\n      }\n    });\n  }\n\n  protected iconFor(toast: Notification): string {\n    return toast.icon ?? toast.kind;\n  }\n\n  protected textOf(kind: NotificationKind): string {\n    return COLORS[kind].text;\n  }\n\n  protected edgeOf(kind: NotificationKind): string {\n    return COLORS[kind].edge;\n  }\n\n  protected tintOf(kind: NotificationKind): string {\n    return COLORS[kind].tint;\n  }\n\n  protected roleFor(kind: NotificationKind): 'alert' | 'status' {\n    return kind === 'error' || kind === 'warning' ? 'alert' : 'status';\n  }\n\n  protected runAction(toast: Notification, click: MouseEvent): void {\n    this.handFocusToNeighbour(click);\n    toast.action?.run();\n    this.service.dismiss(toast.id);\n  }\n\n  protected dismiss(id: string, click: MouseEvent): void {\n    this.handFocusToNeighbour(click);\n    this.service.dismiss(id);\n  }\n\n  protected pointerMoved(event: Event): void {\n    this.toastUnderPointer.set(toastIdAt(event.target));\n    this.holdWhileAttended();\n  }\n\n  protected pointerLeft(): void {\n    this.toastUnderPointer.set(undefined);\n  }\n\n  protected focusEntered(event: FocusEvent): void {\n    this.toastWithFocus.set(toastIdAt(event.target));\n    this.holdWhileAttended();\n  }\n\n  protected focusLeft(event: FocusEvent): void {\n    if (!this.isInRegion(event.relatedTarget)) {\n      this.toastWithFocus.set(undefined);\n    }\n  }\n\n  private forgetWhatLeft(shown: readonly Notification[]): void {\n    for (const remembered of [this.toastUnderPointer, this.toastWithFocus]) {\n      if (shown.every((toast) => toast.id !== untracked(remembered))) {\n        remembered.set(undefined);\n      }\n    }\n  }\n\n  private holdWhileAttended(): void {\n    if (this.isAttended()) {\n      this.service.hold();\n    }\n  }\n\n  private handFocusToNeighbour(click: MouseEvent): void {\n    if (!wasByKeyboard(click)) {\n      return;\n    }\n    const neighbour = this.dismissButtonBeside(\n      click.currentTarget as HTMLElement,\n    );\n    neighbour?.focus();\n    afterNextRender(() => neighbour?.focus(), { injector: this.injector });\n  }\n\n  private dismissButtonBeside(control: HTMLElement): HTMLElement | undefined {\n    const toast = control.closest('[role]');\n    const buttons = this.dismissButtons().map((button) => button.nativeElement);\n    const own = buttons.findIndex((button) => toast?.contains(button));\n    return buttons[own + 1] ?? buttons[own - 1];\n  }\n\n  private isInRegion(target: EventTarget | null): boolean {\n    const region = this.region()?.nativeElement;\n    return (\n      region !== undefined && target instanceof Node && region.contains(target)\n    );\n  }\n}\n\nfunction toastIdAt(target: EventTarget | null): string | undefined {\n  return target instanceof Element\n    ? target.closest<HTMLElement>('[data-toast-id]')?.dataset['toastId']\n    : undefined;\n}\n\nfunction wasByKeyboard(click: MouseEvent): boolean {\n  return click.detail === 0;\n}\n","@if (notifications().length) {\n  <section\n    #region\n    class=\"pointer-events-none fixed inset-x-0 z-[60] flex flex-col items-center gap-2 p-4\"\n    [class]=\"regionPlacement\"\n    [attr.aria-label]=\"'notification.region' | transloco\"\n    (pointermove)=\"pointerMoved($event)\"\n    (pointerleave)=\"pointerLeft()\"\n    (focusin)=\"focusEntered($event)\"\n    (focusout)=\"focusLeft($event)\"\n  >\n    @for (toast of notifications(); track toast.id) {\n      <div\n        [attr.role]=\"roleFor(toast.kind)\"\n        class=\"pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg border bg-surface-raised shadow-lg transition duration-200 ease-out starting:opacity-0\"\n        [class]=\"[enteringFrom, edgeOf(toast.kind)]\"\n        [attr.data-toast-id]=\"toast.id\"\n        animate.leave=\"opacity-0\"\n      >\n        <div class=\"flex items-start gap-3 p-3\" [class]=\"tintOf(toast.kind)\">\n          <lw-icon\n            [name]=\"iconFor(toast)\"\n            size=\"1.25rem\"\n            class=\"mt-0.5 shrink-0\"\n            [class]=\"textOf(toast.kind)\"\n          />\n          <div class=\"flex min-w-0 flex-1 flex-col gap-2\">\n            <p class=\"text-sm text-content\">\n              {{ toast.message | transloco }}\n              @if (toast.count > 1) {\n                <span\n                  aria-hidden=\"true\"\n                  class=\"ms-1 text-xs font-medium text-content-muted\"\n                  >×{{ toast.count }}</span\n                >\n                <span class=\"sr-only\">{{\n                  'notification.repeated' | transloco: { count: toast.count }\n                }}</span>\n              }\n            </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, $event)\"\n              >\n                {{ action.label | transloco }}\n              </button>\n            }\n          </div>\n          <button\n            #dismissButton\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, $event)\"\n          >\n            <lw-icon name=\"close\" size=\"1rem\" />\n          </button>\n        </div>\n      </div>\n    }\n  </section>\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface DialogCloseGuard {\n  mustAsk(candidates: readonly unknown[]): boolean;\n  confirmClose(candidates: readonly unknown[]): Promise<boolean>;\n}\n\nconst NOT_COMPOSED: DialogCloseGuard = {\n  mustAsk: () => false,\n  confirmClose: () => Promise.resolve(true),\n};\n\nexport const DIALOG_CLOSE_GUARD = new InjectionToken<DialogCloseGuard>(\n  'lw.dialog-close-guard',\n  { providedIn: 'root', factory: () => NOT_COMPOSED },\n);\n","import { DOCUMENT, NgComponentOutlet } from '@angular/common';\nimport {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  DestroyRef,\n  ElementRef,\n  afterRenderEffect,\n  effect,\n  inject,\n  viewChildren,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LwButton } from '../elements/button/lw-button';\nimport { DIALOG_CLOSE_GUARD } from './dialog-close-guard';\nimport {\n  DialogButtonView,\n  DialogInstance,\n  DialogService,\n  DialogSize,\n  DialogTone,\n} from './dialog.service';\nimport {\n  FEEDBACK_COLORS,\n  FeedbackColors,\n} from '../notifications/feedback-colors';\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\nfunction circle(colors: FeedbackColors): string {\n  return `${colors.tint} ${colors.text}`;\n}\n\nconst TONE_CIRCLE: Record<DialogTone, string> = {\n  default: 'bg-brand/10 text-brand',\n  info: circle(FEEDBACK_COLORS.info),\n  success: circle(FEEDBACK_COLORS.success),\n  warning: circle(FEEDBACK_COLORS.warning),\n  danger: circle(FEEDBACK_COLORS.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 (an Escape something inside\n * already handled is left alone), focus into the newest dialog, and a lightweight focus trap.\n * `DialogService` returns the focus to the opener once the closed dialog has left the page.\n */\n@Component({\n  selector: 'lw-dialog-outlet',\n  imports: [NgComponentOutlet, TranslocoPipe, LwButton],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './dialog-outlet.html',\n  host: {\n    '(document:keydown.escape)': 'onEscape($event)',\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 closeGuard = inject(DIALOG_CLOSE_GUARD);\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  private readonly bodies = viewChildren(NgComponentOutlet);\n\n  private readonly asking = new Map<string, Promise<boolean>>();\n\n  constructor() {\n    inject(DestroyRef).onDestroy(\n      this.service.connectDismissal((dialog) => this.requestDismiss(dialog)),\n    );\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.at(-1)?.nativeElement;\n      if (!top || top.contains(this.document.activeElement)) {\n        return;\n      }\n      (top.querySelector<HTMLElement>('[data-lw-autofocus]') ?? top).focus();\n    });\n  }\n\n  protected onEscape(event: Event): void {\n    if (event.defaultPrevented) {\n      return;\n    }\n    const top = this.top();\n    if (!top) {\n      return;\n    }\n    event.preventDefault();\n    if (this.canBeDismissed(top)) {\n      void this.requestDismiss(top);\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.at(-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 onScrim(dialog: DialogInstance): void {\n    if (dialog.dismiss === 'any') {\n      void this.requestDismiss(dialog);\n    }\n  }\n\n  protected onCloseControl(dialog: DialogInstance): void {\n    if (this.canBeDismissed(dialog)) {\n      void this.requestDismiss(dialog);\n    }\n  }\n\n  protected canBeDismissed(dialog: DialogInstance): boolean {\n    return dialog.dismiss !== 'none';\n  }\n\n  protected onButton(dialog: DialogInstance, button: DialogButtonView): void {\n    if (button.role === 'custom') {\n      this.onCustomButton(dialog, button);\n      return;\n    }\n    dialog.ref.close(\n      button.role === 'cancel' ? undefined : confirmedResult(dialog),\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 (\n      !dialog.promptValue ||\n      validationError(dialog, dialog.promptValue()) !== null\n    ) {\n      return;\n    }\n    dialog.ref.close(confirmedResult(dialog));\n  }\n\n  protected confirmBlocked(\n    dialog: DialogInstance,\n    button: DialogButtonView,\n  ): boolean {\n    return (\n      button.role === 'confirm' &&\n      validationError(dialog, dialog.promptValue?.() ?? '') !== null\n    );\n  }\n\n  protected fieldLabel(dialog: DialogInstance): string | null {\n    if (dialog.requireLabel) {\n      return `${dialog.id}-label`;\n    }\n    return dialog.message ? `${dialog.id}-question` : null;\n  }\n\n  protected guardError(dialog: DialogInstance): string | null {\n    const value = dialog.promptValue?.() ?? '';\n    return value.length === 0 ? null : validationError(dialog, 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 onCustomButton(\n    dialog: DialogInstance,\n    button: DialogButtonView,\n  ): void {\n    if (button.value === undefined) {\n      void this.requestDismiss(dialog);\n    } else {\n      dialog.ref.close(button.value);\n    }\n  }\n\n  private requestDismiss(dialog: DialogInstance): Promise<boolean> {\n    const pending = this.asking.get(dialog.id);\n    if (pending) {\n      return pending;\n    }\n    const body = this.bodyOf(dialog);\n    const candidates = body ? [body] : [];\n    if (!this.closeGuard.mustAsk(candidates)) {\n      dialog.ref.close();\n      return Promise.resolve(true);\n    }\n    const asked = this.closeGuard\n      .confirmClose(candidates)\n      .then((approved) => {\n        if (approved) {\n          dialog.ref.close();\n        }\n        return approved;\n      })\n      .finally(() => this.asking.delete(dialog.id));\n    this.asking.set(dialog.id, asked);\n    return asked;\n  }\n\n  private bodyOf(dialog: DialogInstance): unknown {\n    const index = this.dialogs()\n      .filter((open) => open.component)\n      .indexOf(dialog);\n    return index === -1 ? undefined : this.bodies()[index]?.componentInstance;\n  }\n\n  private topPanel(): HTMLElement | undefined {\n    const panels = this.panels();\n    return panels.at(-1)?.nativeElement;\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.at(-1);\n  }\n}\n\nfunction confirmedResult(dialog: DialogInstance): unknown {\n  if (dialog.kind === 'confirm') {\n    return true;\n  }\n  return dialog.kind === 'prompt' ? dialog.promptValue?.() : undefined;\n}\n\nfunction validationError(dialog: DialogInstance, value: string): string | null {\n  return dialog.requireValidate ? dialog.requireValidate(value) : null;\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.dismiss !== 'any'\"\n      [attr.aria-label]=\"'dialog.close' | transloco\"\n      (click)=\"onScrim(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        [attr.aria-labelledby]=\"!d.title && d.message ? d.id + '-question' : 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' && canBeDismissed(d))) {\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' && canBeDismissed(d)) {\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)=\"onCloseControl(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\"></lw-spinner>\n                @if (d.progressMessage) {\n                  <span>{{ d.progressMessage() | transloco }}</span>\n                }\n              </div>\n            } @else {\n              @if (d.message) {\n                <lw-markdown [attr.id]=\"d.id + '-question'\" [source]=\"d.message | transloco\" />\n              }\n              @if (d.requireLabel) {\n                <lw-markdown [attr.id]=\"d.id + '-label'\" [source]=\"d.requireLabel | transloco\" />\n              }\n              @if (d.promptValue) {\n                @let reason = guardError(d);\n                <input\n                  type=\"text\"\n                  class=\"lw-field\"\n                  [class.lw-field--invalid]=\"reason\"\n                  [attr.aria-labelledby]=\"fieldLabel(d)\"\n                  [attr.aria-describedby]=\"reason ? d.id + '-reason' : null\"\n                  [attr.aria-invalid]=\"reason ? 'true' : null\"\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 (reason) {\n                  <p [attr.id]=\"d.id + '-reason'\" class=\"text-xs text-negative\">{{ reason | 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 { DialogService } from '../dialog/dialog.service';\nimport { ServedBase } from '../foundation/served-base';\nimport { popoutUrlFor } from './popout-path';\nimport { PopoutWindow } from './popout-window';\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/…` address under the application's base and renders\n * exactly one surface — no rail, no sidebars, no pane tree — so the main window stays the only\n * writer of the layout keys. The mode is read from the location once at startup: a pop-out never\n * becomes a main window, and the shell needs 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 = inject(PopoutWindow).active;\n\n  private readonly document = inject(DOCUMENT);\n  private readonly dialogs = inject(DialogService);\n  private readonly base = inject(ServedBase);\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      void this.offerToOpenAgain(paneTarget);\n    }\n  }\n\n  private async offerToOpenAgain(paneTarget: string): Promise<void> {\n    const retry = await this.dialogs.confirm({\n      title: 'popout.blocked.title',\n      message: 'popout.blocked.message',\n      confirmLabel: 'popout.blocked.open',\n    });\n    if (retry) {\n      this.tryOpen(paneTarget);\n    }\n  }\n\n  private tryOpen(paneTarget: string): boolean {\n    const opened = this.document.defaultView?.open(\n      this.base.under(popoutUrlFor(paneTarget)),\n      '_blank',\n    );\n    return opened != null;\n  }\n}\n","import { Component, computed, inject } from '@angular/core';\nimport { DOCUMENT, NgTemplateOutlet } from '@angular/common';\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 { ShellEdge } from './shell-edge';\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 { DRAW_TOASTS } from './notifications/toast-options';\nimport { DialogOutlet } from './dialog/dialog-outlet';\nimport { ViewportService } from './layout/viewport.service';\nimport { PanelState } from './regions/panel/panel-state';\nimport { PopoutService } from './popout/popout.service';\nimport { hasContentRegion, regionsAt } from './layout/layout-queries';\n\n/** Layout host: renders the declared regions into the border topology. */\n@Component({\n  selector: 'lw-shell',\n  imports: [\n    ShellBar,\n    ShellEdge,\n    ShellPanel,\n    ShellSidebarHeader,\n    NgTemplateOutlet,\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  private readonly document = inject(DOCUMENT);\n  protected readonly viewport = inject(ViewportService);\n  protected readonly drawsToasts = inject(DRAW_TOASTS);\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 = hasContentRegion(this.layout);\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 hasTopRow = computed(\n    () =>\n      this.topBars.length > 0 ||\n      this.leftFloating().length > 0 ||\n      this.rightFloating().length > 0,\n  );\n  protected readonly needsHeaderSpacer = computed(\n    () =>\n      this.topBars.length === 0 &&\n      (this.leftFloating().length > 0 || this.rightFloating().length > 0),\n  );\n\n  protected skipToContent(event: Event): void {\n    event.preventDefault();\n    this.document\n      .querySelector<HTMLElement>('#lw-main-content')\n      ?.focus({ preventScroll: true });\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 regionsAt(dock: DockPosition, type: RegionType): LayoutRegion[] {\n    return regionsAt(this.layout, dock, type);\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  </div>\n} @else {\n  <div class=\"flex h-screen flex-col\">\n    @if (hasContent) {\n      <a\n        href=\"#lw-main-content\"\n        (click)=\"skipToContent($event)\"\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      @if (leftRails.length || leftPanels.length) {\n        <lw-shell-edge side=\"left\" />\n      }\n\n      <div class=\"flex min-w-0 flex-1 flex-col overflow-hidden\">\n        <div\n          class=\"flex\"\n          [attr.role]=\"hasTopRow() ? 'banner' : null\"\n          [attr.aria-label]=\"hasTopRow() ? ('landmark.topBar' | transloco) : null\"\n        >\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 (needsHeaderSpacer()) {\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            <main class=\"flex min-w-0 flex-1\" [attr.aria-label]=\"'landmark.content' | transloco\">\n              <lw-content-grid class=\"min-w-0 flex-1\" />\n            </main>\n          }\n        </div>\n      </div>\n\n      @if (rightRails.length || rightPanels.length) {\n        <lw-shell-edge side=\"right\" />\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          <ng-container\n            *ngTemplateOutlet=\"drawer; context: { $implicit: panel, side: 'left' }\"\n          />\n        }\n        @for (panel of rightPanels; track panel.id) {\n          <ng-container\n            *ngTemplateOutlet=\"drawer; context: { $implicit: panel, side: 'right' }\"\n          />\n        }\n      }\n    </div>\n\n    @if (bottomBars.length) {\n      <footer [attr.aria-label]=\"'landmark.statusBar' | transloco\">\n        @for (region of bottomBars; track region.id) {\n          <lw-shell-bar [region]=\"region\" />\n        }\n      </footer>\n    }\n  </div>\n}\n@if (drawsToasts) {\n  <lw-toasts />\n}\n<lw-dialog-outlet />\n\n<ng-template #drawer let-panel let-side=\"side\">\n  <aside\n    class=\"absolute inset-y-0 z-50 flex flex-col overflow-hidden shadow-xl transition duration-300 ease-out will-change-transform\"\n    [class.left-0]=\"side === 'left'\"\n    [class.right-0]=\"side === 'right'\"\n    [class.-translate-x-full]=\"side === 'left' && !isOverlayOpen(panel.id)\"\n    [class.translate-x-full]=\"side === 'right' && !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    [attr.aria-label]=\"(side === 'left' ? 'landmark.leftPanel' : 'landmark.rightPanel') | transloco\"\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  </aside>\n</ng-template>\n","import { computed, Service, signal } from '@angular/core';\nimport { Disposable } from '../contributions/contribution-registry';\nimport { upsertById } from '../foundation/identified';\nimport { SettingRow, 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  private readonly replacements = signal<ReadonlyMap<string, SettingRow>>(\n    new Map(),\n  );\n\n  readonly requestedSection = this.requested.asReadonly();\n\n  readonly registered = this.sections.asReadonly();\n\n  readonly replacedRowIds = computed(() => [...this.replacements().keys()]);\n\n  readonly all = computed(() => {\n    const omitted = this.omitted();\n    const replacements = this.replacements();\n    return this.sections()\n      .map((section) => visibleSection(section, omitted, replacements))\n      .filter((section): section is SettingsSection => section !== null)\n      .toSorted((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  replaceRow(row: SettingRow): Disposable {\n    this.replacements.update((current) => new Map(current).set(row.id, row));\n    return {\n      dispose: () =>\n        this.replacements.update((current) => {\n          if (current.get(row.id) !== row) {\n            return current;\n          }\n          const next = new Map(current);\n          next.delete(row.id);\n          return next;\n        }),\n    };\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  replacements: ReadonlyMap<string, SettingRow>,\n): SettingsSection | null {\n  if (omitted.has(section.id)) {\n    return null;\n  }\n  const rows = section.rows\n    .filter((row) => !omitted.has(row.id))\n    .map((row) => replacements.get(row.id) ?? row);\n  const unchanged =\n    rows.length === section.rows.length &&\n    rows.every((row, index) => row === section.rows[index]);\n  if (unchanged) {\n    return section;\n  }\n  return rows.length === 0 ? null : { ...section, rows };\n}\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  inject,\n  input,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LwButton } from '../elements/button/lw-button';\n\n@Component({\n  selector: 'lw-wide-dialog-frame',\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  imports: [TranslocoPipe, LwButton],\n  templateUrl: './wide-dialog-frame.html',\n  host: {\n    class: 'flex w-full flex-col overflow-hidden',\n    '[class]': \"ref.maximized() ? 'h-full' : 'h-[80vh] max-h-[85vh]'\",\n  },\n})\nexport class WideDialogFrame {\n  readonly title = input.required<string>();\n\n  protected readonly ref = inject(DialogRef);\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\">{{ title() | transloco }}</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 [name]=\"ref.maximized() ? 'restore' : 'maximize'\" size=\"1rem\" />\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)=\"ref.close()\"\n    >\n      <lw-icon name=\"close\" size=\"1rem\" />\n    </button>\n  </span>\n</header>\n<ng-content />\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, input } from '@angular/core';\n\n/**\n * One settings row: an optional leading `icon`, the label (+ optional description) on the left, the\n * control projected on the right. A pure layout primitive: the host slots the matching control\n * (a toggle, a text field, a select, a slider, a button or a component of its own) via content\n * projection. The icon is named from the icon registry like every other `icon` field and is\n * decoration only: the label is what names the row.\n */\n@Component({\n  selector: 'lw-setting-row',\n  host: { class: 'block' },\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './lw-setting-row.html',\n})\nexport class LwSettingRow {\n  readonly label = input('');\n  readonly description = input('');\n  readonly icon = input('');\n}\n","<div class=\"flex items-center justify-between gap-4 px-4 py-3\">\n  <div class=\"flex min-w-0 items-center gap-3\">\n    @if (icon()) {\n      <lw-icon\n        aria-hidden=\"true\"\n        class=\"shrink-0 text-content-muted\"\n        [attr.name]=\"icon()\"\n        size=\"1.125rem\"\n      />\n    }\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>\n  <div class=\"shrink-0\">\n    <ng-content />\n  </div>\n</div>\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport { 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 { SlotResolution } from '../menu/slot-resolution.service';\nimport { WideDialogFrame } from '../dialog/wide-dialog-frame';\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: [\n    NgComponentOutlet,\n    TranslocoPipe,\n    LwButton,\n    LwSettingRow,\n    WideDialogFrame,\n  ],\n  templateUrl: './settings-dialog.html',\n})\nexport class SettingsDialog {\n  private readonly registry = inject(SettingsRegistry);\n\n  private readonly commands = inject(CommandService);\n\n  private readonly slots = inject(SlotResolution);\n\n  private readonly ref = inject(DialogRef);\n\n  protected readonly sections = computed<readonly SettingsSection[]>(() =>\n    this.registry\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((section) => section.id === this.activeId()) ??\n      this.sections()[0],\n  );\n\n  protected readonly groups = computed<readonly SettingsGroup[]>(() => {\n    const byKey = new Map<string, SettingsSection[]>();\n    for (const section of this.sections()) {\n      const key = section.group ?? '';\n      byKey.set(key, [...(byKey.get(key) ?? []), section]);\n    }\n    return [...byKey].map(([key, sections]) => ({\n      key,\n      label: sections[0].group,\n      sections,\n    }));\n  });\n\n  constructor() {\n    effect(() => {\n      const requested = this.registry.requestedSection();\n      if (!requested) {\n        return;\n      }\n      this.activeId.set(requested);\n      this.registry.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' ||\n      this.slots.resolve([row.control], () => ({})).length > 0\n    );\n  }\n}\n","<lw-wide-dialog-frame [title]=\"'settings.title'\">\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                [icon]=\"row.icon ?? ''\"\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</lw-wide-dialog-frame>\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport { inject, Service } from '@angular/core';\nimport { Disposable } from '../contributions/contribution-registry';\nimport { SettingsDialog } from './settings-dialog';\nimport { SettingsRegistry } from './settings-registry';\nimport { DialogService } from '../dialog/dialog.service';\nimport { SettingRow, SettingsSection } from './settings-model';\n\n/**\n * Where settings sections are contributed and the settings dialog is opened. The shell and plugins\n * register sections, and the dialog draws every section that is not omitted, with a replaced row in\n * place of the one it replaces. Storage is not centralised: each row carries its own value accessors,\n * so whoever contributes a section persists its values, the shell in the shell and a plugin in the\n * plugin or against its product's backend. The host never stores data it does not own.\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  /**\n   * The section a caller last asked {@link open} to show, until the settings dialog has switched to\n   * it. The dialog reads this itself; nothing outside the dialog needs it.\n   */\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  /** The row ids a distribution replaced with {@link replaceRow}, for the composition report. */\n  readonly replacedRowIds = this.registry.replacedRowIds;\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   * Replaces a single row by its id, in place: the section it sits in, the other rows and their order\n   * stay as they were contributed. A **lasting** instruction like {@link omit}, so a section\n   * contributed later, or contributed again, carries the replacement too; an omit of the same id wins.\n   * Dispose it to give the contributed row back.\n   *\n   * This is how a distribution shows a control of its own in place of a built-in row, for example its\n   * own language control as `shell.language` in General, while a different control stands in a bar.\n   * A plugin contributes whole sections of its own and does not replace rows it did not write.\n   */\n  replaceRow(row: SettingRow): Disposable {\n    return this.registry.replaceRow(row);\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    });\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  /** Clears {@link requestedSection} once it has been shown; the dialog does this itself. */\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 { inject, InjectionToken, Provider } from '@angular/core';\n\nconst TRANSLATION_NAMESPACE_DECLARATIONS = new InjectionToken<\n  readonly (readonly string[])[]\n>('TRANSLATION_NAMESPACE_DECLARATIONS');\n\n/**\n * Extra translation namespaces a distribution composes on top of the host base, in the order they\n * were first declared. Each is served at `i18n/<name>/<lang>.json` under the application's base\n * and nested under its key, so its strings live at `name.*` and can never collide with a host key.\n * Used for a plugin's own strings (`demo`) and for distribution branding (`product`).\n *\n * Read it; declare through {@link provideTranslationNamespaces}. Providing this token directly\n * replaces every declaration made that way.\n */\nexport const TRANSLATION_NAMESPACES = new InjectionToken<readonly string[]>(\n  'TRANSLATION_NAMESPACES',\n  {\n    providedIn: 'root',\n    factory: () =>\n      distinct(\n        (\n          inject(TRANSLATION_NAMESPACE_DECLARATIONS, { optional: true }) ?? []\n        ).flat(),\n      ),\n  },\n);\n\n/**\n * A distribution declares which namespaced translation bundles to load — the plugins it bundles\n * (e.g. `'reports'`) and its own branding (`'product'`). The bare platform registers none;\n * its host keys are the whole story.\n *\n * Calls accumulate: a second call further down the composition root adds its names to the first\n * rather than replacing it, and a name declared twice is loaded once.\n */\nexport function provideTranslationNamespaces(\n  ...namespaces: string[]\n): Provider {\n  return {\n    provide: TRANSLATION_NAMESPACE_DECLARATIONS,\n    useValue: namespaces,\n    multi: true,\n  };\n}\n\nfunction distinct(names: readonly string[]): readonly string[] {\n  return [...new Set(names)];\n}\n","import { InjectionToken, Provider } from '@angular/core';\nimport { ServedBase } from '../foundation/served-base';\nimport { withoutTrailingSlashes } from '../foundation/wire/path-text';\n\n/**\n * Directory the distribution serves its overlay bundles from, without a trailing slash: relative to\n * the application's base, or from the origin's root when it starts with `/` or names a scheme.\n */\nexport const TRANSLATION_OVERRIDES = new InjectionToken<string>(\n  'TRANSLATION_OVERRIDES',\n);\n\nexport const DEFAULT_OVERRIDES_PATH = 'i18n/overrides';\n\nconst FROM_THE_ORIGIN = /^(\\/|[a-z][a-z\\d+.-]*:)/i;\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 plugin'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 directory, `i18n/overrides` under the\n * application's base, is same-origin, so its server can already vary the bytes per tenant. Omit it\n * and nothing changes. A relative `basePath` resolves under the application's base as the default\n * does; one that starts with `/` or names a scheme is used as named.\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 = withoutTrailingSlashes(basePath);\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\nexport function overlayDirectory(named: string, base: ServedBase): string {\n  return FROM_THE_ORIGIN.test(named) ? named : base.under(named);\n}\n","import { Translation } from '@jsverse/transloco';\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\nexport function leafKeys(translation: Translation, prefix = ''): string[] {\n  return Object.entries(translation).flatMap(([key, value]) => {\n    const path = prefix ? `${prefix}.${key}` : key;\n    return isGroup(value) ? leafKeys(value, path) : [path];\n  });\n}\n\nexport function hasKey(translation: Translation, path: string): boolean {\n  let node: unknown = translation;\n  for (const segment of path.split('.')) {\n    if (!isGroup(node) || !Object.hasOwn(node, segment)) {\n      return false;\n    }\n    node = node[segment];\n  }\n  return true;\n}\n","import { HttpClient } from '@angular/common/http';\nimport { inject, isDevMode, Service } from '@angular/core';\nimport { Translation, TranslocoLoader } from '@jsverse/transloco';\nimport { catchError, forkJoin, map, Observable, of } from 'rxjs';\nimport { ServedBase } from '../foundation/served-base';\nimport { FALLBACK_LANGUAGE, SHIPPED_LANGUAGES } from './served-languages';\nimport { TRANSLATION_NAMESPACES } from './translation-namespaces';\nimport {\n  overlayDirectory,\n  TRANSLATION_OVERRIDES,\n} from './translation-overrides';\nimport {\n  hasKey,\n  leafKeys,\n  mergeTranslation,\n  unknownOverrideKeys,\n} from './translation-tree';\n\nconst MISSING_OVERLAY: Translation = {};\n\nconst MISSING_HOST: Translation = {};\n\n@Service()\nexport class TranslocoHttpLoader implements TranslocoLoader {\n  private readonly http = inject(HttpClient);\n  private readonly namespaces = inject(TRANSLATION_NAMESPACES);\n  private readonly base = inject(ServedBase);\n  private readonly overrides = this.overlaysFrom(\n    inject(TRANSLATION_OVERRIDES, { optional: true }) ?? null,\n  );\n  private readonly reported = new Set<string>();\n\n  getTranslation(lang: string): ReturnType<TranslocoLoader['getTranslation']> {\n    const host$ = this.hostStrings$(lang);\n    if (this.namespaces.length === 0 && !this.overrides) {\n      return host$;\n    }\n    return forkJoin({\n      host: host$,\n      namespaced: this.namespaced$(lang),\n      overlay: this.overrides$(lang),\n    }).pipe(\n      map(({ host, namespaced, overlay }) =>\n        this.applyOverrides({ ...host, ...namespaced }, overlay, lang),\n      ),\n    );\n  }\n\n  private namespaced$(lang: string): Observable<Translation> {\n    if (this.namespaces.length === 0) {\n      return of<Translation>({});\n    }\n    return forkJoin(\n      Object.fromEntries(\n        this.namespaces.map((name) => [name, this.namespace$(name, lang)]),\n      ),\n    );\n  }\n\n  private namespace$(name: string, lang: string): Observable<Translation> {\n    return this.http.get<Translation>(this.bundle(`${name}/${lang}`)).pipe(\n      catchError((error: unknown) => {\n        this.warn(\n          `Translation namespace \"${name}\" failed to load for \"${lang}\".`,\n          error,\n        );\n        return of<Translation>({});\n      }),\n    );\n  }\n\n  private hostStrings$(lang: string): Observable<Translation> {\n    const supplied$ = this.http.get<Translation>(this.bundle(lang));\n    if (SHIPPED_LANGUAGES.includes(lang)) {\n      return supplied$;\n    }\n    return forkJoin([\n      supplied$.pipe(catchError(() => of<Translation>(MISSING_HOST))),\n      this.http.get<Translation>(this.bundle(FALLBACK_LANGUAGE)),\n    ]).pipe(\n      map(([supplied, fallback]) =>\n        this.overFallback(lang, supplied, fallback),\n      ),\n    );\n  }\n\n  private overFallback(\n    lang: string,\n    supplied: Translation,\n    fallback: Translation,\n  ): Translation {\n    if (supplied === MISSING_HOST) {\n      this.reportOnce(\n        lang,\n        `No workbench strings for \"${lang}\" at ${this.bundle(lang)}, so the workbench is shown in ` +\n          `English while it is active.`,\n      );\n      return fallback;\n    }\n    const missing = leafKeys(fallback).filter(\n      (path) => !hasKey(supplied, path),\n    );\n    if (missing.length > 0) {\n      this.reportOnce(\n        lang,\n        `Workbench strings for \"${lang}\" lack ${missing.length} key(s), shown in English instead: ` +\n          `${missing.join(', ')}.`,\n      );\n    }\n    return mergeTranslation(fallback, supplied);\n  }\n\n  private reportOnce(lang: string, message: string): void {\n    if (this.reported.has(lang)) {\n      return;\n    }\n    this.reported.add(lang);\n    this.warn(message);\n  }\n\n  private overrides$(lang: string): Observable<Translation> {\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 bundle(name: string): string {\n    return this.base.under(`i18n/${name}.json`);\n  }\n\n  private overlaysFrom(named: string | null): string | null {\n    return named === null ? null : overlayDirectory(named, this.base);\n  }\n\n  private warn(message: string, cause?: unknown): void {\n    if (!isDevMode()) {\n      return;\n    }\n    if (cause === undefined) {\n      console.warn(message);\n    } else {\n      console.warn(message, cause);\n    }\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, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PRODUCT_IDENTITY } from '@loomweaver/plugin-sdk';\nimport { ViewportService } from '../../layout/viewport.service';\n\n/**\n * The product's identity as the workbench's own frame draws it: the mark, the name in the brand\n * colour and the tagline. Embeddable anywhere a distribution wants the same block — an about dialog\n * is the usual place — so that a product does not keep a copy of it. Reads the identity supplied\n * through `provideProductIdentity`.\n *\n * `compact` pins the narrow form, in which the mark stands for the product alone; left unset the\n * form follows the width of the frame, exactly as it does in the top bar.\n */\n@Component({\n  selector: 'lw-shell-brand',\n  imports: [TranslocoPipe],\n  templateUrl: './shell-brand.html',\n})\nexport class ShellBrand {\n  readonly compact = input<boolean | undefined>(undefined);\n\n  protected readonly product = inject(PRODUCT_IDENTITY);\n\n  private readonly viewport = inject(ViewportService);\n\n  protected readonly narrow = computed(\n    () => this.compact() ?? this.viewport.compact(),\n  );\n}\n","<div class=\"flex min-w-0 items-center gap-2\">\n  <img\n    class=\"block h-7 w-7 shrink-0\"\n    [src]=\"product.logoUrl\"\n    [alt]=\"narrow() ? product.name : ''\"\n    width=\"28\"\n    height=\"28\"\n  />\n  @if (!narrow()) {\n  <span\n    class=\"truncate text-[1.1rem] font-semibold tracking-tight text-brand-text\"\n    >{{ product.name }}</span\n  >\n  <span class=\"hidden truncate text-sm text-content-muted sm:inline\"\n    >{{ product.tagline | transloco }}</span\n  >\n  }\n</div>\n","import { CUSTOM_ELEMENTS_SCHEMA, Component, inject } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { LocaleService } from './locale.service';\nimport { ViewportService } from '../layout/viewport.service';\n\nconst FLAGS: Readonly<Partial<Record<string, string>>> = {\n  en: '🇬🇧',\n  de: '🇩🇪',\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  protected readonly compact = inject(ViewportService).compact;\n\n  protected readonly langs = this.locale.languages.map(({ code, name }) => ({\n    value: code,\n    label: name,\n    flag: FLAGS[code] ?? code.toUpperCase(),\n  }));\n\n  protected onSelect(event: Event): void {\n    const value = (event as CustomEvent<{ value: string }>).detail.value;\n    this.locale.setLang(value);\n  }\n}\n","<lw-select\n  [attr.label]=\"'language.label' | transloco\"\n  [attr.value]=\"lang()\"\n  [attr.compact]=\"compact() ? '' : null\"\n  (lw-select-change)=\"onSelect($event)\"\n>\n  @for (language of langs; track language.value) {\n  <lw-option [attr.value]=\"language.value\" [attr.icon]=\"language.flag\"\n    >{{ language.label }}</lw-option\n  >\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.20.0';\n","const PRERELEASE_IDENTIFIER = /^[0-9A-Za-z-]+$/;\n\nexport function isPreviewVersion(version: string): boolean {\n  const withoutBuildMetadata = version.split('+', 1)[0];\n  const marker = withoutBuildMetadata.indexOf('-');\n  if (marker === -1) {\n    return false;\n  }\n  return withoutBuildMetadata\n    .slice(marker + 1)\n    .split('.')\n    .every((identifier) => PRERELEASE_IDENTIFIER.test(identifier));\n}\n","import { computed, Service, signal } from '@angular/core';\nimport { APP_VERSION } from './app-version';\nimport { isPreviewVersion } from './preview-version';\n\n/**\n * The version the workbench shows: the released version of `@loomweaver/shell` until the\n * distribution points it at its own build with `version.set(…)`, which every reader follows.\n *\n * Distributions and plugins render it through `<lw-version>` or `ctx.host.version`, never\n * hardcoded.\n */\n@Service()\nexport class VersionService {\n  /** The version shown, e.g. `0.1.0`; set it to point at your own build. */\n  readonly version = signal<string>(APP_VERSION);\n\n  /**\n   * Whether {@link version} is a preview of a line that has not been released — `0.8.0-preview.3`\n   * rather than `0.7.9`. Ask this instead of taking the version apart yourself.\n   *\n   * **Announcing it is yours.** The workbench marks a preview nowhere on its own: how loudly a\n   * product tells its users that it is running something unfinished is the product's judgement.\n   * A distribution that wants it visible draws it, from this.\n   */\n  readonly isPreview = computed(() => isPreviewVersion(this.version()));\n}\n","import { Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport { VersionService } from './version.service';\n\n/**\n * Displays the version the workbench shows, 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 { InjectionToken } from '@angular/core';\n\nexport const ANNOUNCE_UPDATES = new InjectionToken<boolean>(\n  'lw.announce-updates',\n  { providedIn: 'root', factory: () => true },\n);\n","import { NotificationInput } from '@loomweaver/plugin-sdk';\nimport { STAYS } from '../notifications/notification-lifetime';\n\nexport type UpdateNotice =\n  'waiting' | 'current' | 'unreachable' | 'failed' | 'broken';\n\nconst NOTICES: Record<\n  UpdateNotice,\n  (activate: () => void) => NotificationInput\n> = {\n  waiting: (activate) => ({\n    id: 'shell.update',\n    kind: 'info',\n    message: 'update.available',\n    timeoutMs: STAYS,\n    action: { label: 'update.reload', run: activate },\n  }),\n  current: () => ({\n    id: 'shell.update.none',\n    kind: 'success',\n    message: 'update.upToDate',\n    timeoutMs: 4000,\n  }),\n  unreachable: () => ({\n    id: 'shell.update.unavailable',\n    kind: 'info',\n    message: 'update.checkUnavailable',\n    timeoutMs: 6000,\n  }),\n  failed: (activate) => ({\n    id: 'shell.update.failed',\n    kind: 'warning',\n    message: 'update.failed',\n    timeoutMs: STAYS,\n    action: { label: 'update.reload', run: activate },\n  }),\n  broken: (activate) => ({\n    id: 'shell.update.broken',\n    kind: 'warning',\n    message: 'update.broken',\n    timeoutMs: STAYS,\n    action: { label: 'update.repair', run: activate },\n  }),\n};\n\nexport function updateNotice(\n  notice: UpdateNotice,\n  activate: () => void,\n): NotificationInput {\n  return NOTICES[notice](activate);\n}\n","const WORKER_SCRIPT = 'ngsw-worker.js';\n\nexport async function dropShellWorker(\n  view: Window | null,\n  scope: string,\n): Promise<void> {\n  const container = view?.navigator?.serviceWorker;\n  await bestEffort(async () => {\n    const registrations = (await container?.getRegistrations()) ?? [];\n    await Promise.all(\n      registrations\n        .filter((registration) => isShellWorker(registration, scope))\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(`ngsw:${scope}:`))\n        .map(async (key) => storage?.delete(key)),\n    );\n  });\n}\n\nasync function bestEffort(work: () => Promise<unknown>): Promise<void> {\n  try {\n    await work();\n  } catch {\n    return;\n  }\n}\n\nfunction isShellWorker(\n  registration: ServiceWorkerRegistration,\n  scope: string,\n): boolean {\n  const worker =\n    registration.active ?? registration.waiting ?? registration.installing;\n  return (\n    (worker?.scriptURL.includes(WORKER_SCRIPT) ?? false) &&\n    new URL(registration.scope).pathname === scope\n  );\n}\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, inject, Service, signal } from '@angular/core';\nimport { SwUpdate, VersionEvent } from '@angular/service-worker';\nimport { ServedBase } from '../foundation/served-base';\nimport { NotificationService } from '../notifications/notification.service';\nimport { ANNOUNCE_UPDATES } from './announce-updates';\nimport { UpdateNotice, updateNotice } from './update-notices';\nimport { dropShellWorker } from './worker-repair';\n\n/**\n * What a check for a new version found. `waiting` means one is downloaded and ready to apply,\n * `current` that this is the newest version, `unreachable` that the question could not be answered,\n * `failed` that an installation went wrong, and `unavailable` that the application has no offline\n * machinery to check with (dev, or a build that ships no service worker).\n */\nexport type UpdateOutcome =\n  'waiting' | 'current' | 'unreachable' | 'failed' | 'unavailable';\n\n/** The last check the workbench made, whether a caller asked for it or the workbench made it itself. */\nexport interface UpdateCheck {\n  readonly outcome: UpdateOutcome;\n  /** When it happened, as `Date.now()`. */\n  readonly at: number;\n  /** `true` where the workbench checked by itself, `false` where a caller asked. */\n  readonly automatic: boolean;\n}\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\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 isAnnouncing = inject(ANNOUNCE_UPDATES);\n\n  private readonly document = inject(DOCUMENT);\n\n  private readonly base = inject(ServedBase);\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 lastCheckAt = 0;\n\n  private readonly checked = signal<UpdateCheck | null>(null);\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  /**\n   * The last check the workbench made, or `null` before the first one. Set by\n   * {@link checkForUpdate} and by the workbench's own background checks alike, so a distribution can\n   * draw what happened — including a check nobody asked for — instead of learning of it through the\n   * toast. Reading it never triggers a check.\n   */\n  readonly lastCheck = this.checked.asReadonly();\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  /**\n   * Checks for a new version and reports what it found, noting when already up to date. The outcome\n   * is also recorded in {@link lastCheck}. Where the distribution announces updates itself\n   * (`provideShell({ announceUpdates: false })`) the workbench shows nothing and the caller draws\n   * the answer.\n   */\n  async checkForUpdate(): Promise<UpdateOutcome> {\n    if (!this.swUpdate?.isEnabled) {\n      return this.record('unavailable', false);\n    }\n    if (this.available()) {\n      this.announce('waiting');\n      return this.record('waiting', false);\n    }\n\n    if (!(await this.ensureControlled())) {\n      this.announce('unreachable');\n      return this.record('unreachable', false);\n    }\n\n    this.lastCheckAt = Date.now();\n    const found = await this.checkWithin(this.swUpdate, CHECK_TIMEOUT_MS);\n\n    if (found === 'unreachable') {\n      this.announce('unreachable');\n      return this.record('unreachable', false);\n    }\n    if (found) {\n      return this.record('waiting', false);\n    }\n    if (this.failed()) {\n      this.announceFailure();\n      return this.record('failed', false);\n    }\n    this.announce('current');\n    return this.record('current', false);\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 of the application's base are touched; anything else the product registered,\n   * and any other distribution served on the same origin, is left alone.\n   */\n  async activateUpdate(): Promise<void> {\n    if (this.broken()) {\n      await dropShellWorker(this.document.defaultView, this.base.path);\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 async checkWithin(\n    swUpdate: SwUpdate,\n    ms: number,\n  ): Promise<boolean | 'unreachable'> {\n    let timer: ReturnType<typeof setTimeout> | undefined;\n    const deadline = new Promise<'unreachable'>((resolve) => {\n      timer = setTimeout(() => resolve('unreachable'), ms);\n    });\n    const found = await Promise.race([\n      swUpdate.checkForUpdate().catch(() => 'unreachable' as const),\n      deadline,\n    ]);\n    clearTimeout(timer);\n    return found;\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 onVersionEvent(event: VersionEvent): void {\n    if (event.type === 'VERSION_READY') {\n      this.onUpdateReady();\n    } else 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.announce('waiting');\n  }\n\n  private onUpdateFailed(): void {\n    this.failed.set(true);\n    this.announceFailure();\n  }\n\n  private onWorkerBroken(): void {\n    this.failed.set(true);\n    this.broken.set(true);\n    this.announceFailure();\n  }\n\n  private announceFailure(): void {\n    this.announce(this.broken() ? 'broken' : 'failed');\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.lastCheckAt < SILENT_CHECK_GAP_MS) {\n      return;\n    }\n    this.lastCheckAt = now;\n    const found = await this.swUpdate\n      .checkForUpdate()\n      .catch(() => 'unreachable' as const);\n    if (found === 'unreachable') {\n      this.record('unreachable', true);\n      return;\n    }\n    this.record(found ? 'waiting' : 'current', true);\n  }\n\n  private record(outcome: UpdateOutcome, automatic: boolean): UpdateOutcome {\n    this.checked.set({ outcome, at: Date.now(), automatic });\n    return outcome;\n  }\n\n  private announce(notice: UpdateNotice): void {\n    if (!this.isAnnouncing) {\n      return;\n    }\n    this.notifications.show(\n      updateNotice(notice, () => void this.activateUpdate()),\n    );\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 items 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 { inject, Injector, isDevMode, Service } from '@angular/core';\nimport { CapabilityError } from '@loomweaver/plugin-sdk';\nimport { CommandService } from '../commands/command.service';\nimport { NotificationService } from '../notifications/notification.service';\nimport { CapabilityGrantService } from './capability-grant.service';\nimport { OPEN_SETTINGS_COMMAND_ID } from '../commands/host-command-ids';\n\n@Service()\nexport class CapabilityRefusalReporter {\n  private readonly notifications = inject(NotificationService);\n  private readonly grants = inject(CapabilityGrantService);\n  private readonly injector = inject(Injector);\n\n  report(error: unknown): boolean {\n    if (!(error instanceof CapabilityError)) {\n      return false;\n    }\n    if (this.grants.isBaseGranted(error.pluginId, error.capability)) {\n      this.reportRevocation();\n    } else {\n      this.reportMissingGrant(error);\n    }\n    return true;\n  }\n\n  private reportRevocation(): void {\n    this.notifications.show({\n      id: 'permission-blocked',\n      kind: 'warning',\n      message: 'permission.blocked',\n      action: {\n        label: 'permission.openSettings',\n        run: () =>\n          this.injector.get(CommandService).execute(OPEN_SETTINGS_COMMAND_ID),\n      },\n    });\n  }\n\n  private reportMissingGrant(error: CapabilityError): void {\n    if (isDevMode()) {\n      console.error(error.message);\n    }\n    this.notifications.show({\n      id: 'permission-blocked',\n      kind: 'warning',\n      message: 'permission.unavailable',\n    });\n  }\n}\n","import { ErrorHandler, inject, Injectable } from '@angular/core';\nimport { CapabilityRefusalReporter } from './capability-refusal';\n\n@Injectable()\nexport class CapabilityRefusalErrorHandler 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 { CONTENT_DOCK } from '../../regions/pane/tree/pane-address';\nimport { parseDocks } from '../../regions/pane/tree/pane-tree-storage';\nimport { collectTabs } from '../../regions/pane/tree/pane-queries';\nimport { WorkspaceDefinition } from '../declaration/workspace-definition';\nimport { declaredTabPaths } from '../declaration/declared-content';\nimport { type WorkspaceOrigin } from '../catalog/workspace-catalog';\n\nexport interface UsabilityReading {\n  readonly workspaces: readonly WorkspaceOrigin[];\n  readonly activeId: string;\n  readonly activeHasContent: boolean;\n  readonly definitionOf: (id: string) => WorkspaceDefinition | undefined;\n  readonly storedTrees: (id: string) => string | undefined;\n}\n\nexport function unusableWorkspaceIds(\n  reading: UsabilityReading,\n): ReadonlySet<string> {\n  const ids = new Set<string>();\n  for (const { id, origin } of reading.workspaces) {\n    if (!declaresContent(reading, origin)) {\n      continue;\n    }\n    if (!hasContent(reading, id)) {\n      ids.add(id);\n    }\n  }\n  return ids;\n}\n\nfunction declaresContent(\n  reading: UsabilityReading,\n  origin: string | null,\n): boolean {\n  if (origin === null) {\n    return false;\n  }\n  const definition = reading.definitionOf(origin);\n  return definition !== undefined && declaredTabPaths(definition).length > 0;\n}\n\nfunction hasContent(reading: UsabilityReading, id: string): boolean {\n  if (id === reading.activeId) {\n    return reading.activeHasContent;\n  }\n  const raw = reading.storedTrees(id);\n  if (raw === undefined) {\n    return true;\n  }\n  const entry = parseDocks(raw)[CONTENT_DOCK];\n  return entry !== undefined && collectTabs(entry.node).length > 0;\n}\n","import { computed, inject, Service } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { PaneTreeService } from '../../regions/pane/tree/pane-tree.service';\nimport { UnusableWorkspaces } from './unusable-workspaces';\nimport {\n  ActiveWorkspaceService,\n  workspaceScopedKey,\n} from '../active-workspace.service';\nimport { CONTENT_DOCK } from '../../regions/pane/tree/pane-address';\nimport { collectTabs } from '../../regions/pane/tree/pane-queries';\nimport { ANNOUNCE_UNUSABLE_WORKSPACES } from '../declaration/provide-workspaces';\nimport { PANE_TREES_KEY } from '../../regions/pane/tree/pane-tree-storage';\nimport { unusableWorkspaceIds } from './workspace-usability';\nimport { WorkspaceCatalog } from '../catalog/workspace-catalog';\n\n@Service()\nexport class UnusableWorkspacesService implements UnusableWorkspaces {\n  private readonly catalog = inject(WorkspaceCatalog);\n  private readonly active = inject(ActiveWorkspaceService);\n  private readonly workingStateStore = inject(WORKING_STATE_STORE);\n  private readonly paneTree = inject(PaneTreeService);\n\n  readonly announcesUnusable = inject(ANNOUNCE_UNUSABLE_WORKSPACES);\n\n  private readonly unusable = computed(() =>\n    unusableWorkspaceIds({\n      workspaces: this.catalog.everyOrigin(),\n      activeId: this.active.id(),\n      activeHasContent:\n        collectTabs(this.paneTree.tree(CONTENT_DOCK)).length > 0,\n      definitionOf: (id) => this.catalog.definitionOf(id),\n      storedTrees: (id) =>\n        this.workingStateStore.peek?.(workspaceScopedKey(PANE_TREES_KEY, id)),\n    }),\n  );\n\n  ids(): ReadonlySet<string> {\n    return this.unusable();\n  }\n\n  announced(): boolean {\n    return this.announcesUnusable && this.unusable().has(this.active.id());\n  }\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 argumentProblem(\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 declaredArguments = declared ?? [];\n  const supplied: Record<string, unknown> = args ?? {};\n  const known = new Set(declaredArguments.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 declaredArguments) {\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 '../contributions/contribution-registry';\nimport { CommandService } from './command.service';\nimport {\n  argumentProblem,\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\ninterface Caller {\n  readonly id: string;\n  readonly mayAutomate: boolean;\n}\n\nfunction isOwnCommand(\n  entry: RegisteredCommand | undefined,\n  caller: Caller,\n): boolean {\n  return entry?.ownerId !== undefined && entry.ownerId === caller.id;\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 chainDepth = 0;\n\n  invocable(callerId: string, granted: boolean): readonly InvocableCommand[] {\n    const caller: Caller = { id: callerId, mayAutomate: granted };\n    return this.registry\n      .registeredCommands()\n      .filter(\n        (entry) =>\n          entry.command.callable === true && this.reachable(entry, caller),\n      )\n      .map((entry) => this.describe(entry.command))\n      .toSorted((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 caller: Caller = { id: callerId, mayAutomate: granted };\n    const entry = this.registry\n      .registeredCommands()\n      .find((candidate) => candidate.command.id === id);\n    if (entry === undefined || !this.reachable(entry, caller)) {\n      this.reportRefusal(caller, entry);\n      return UNAVAILABLE;\n    }\n    const command = entry.command;\n    const problem = argumentProblem(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.chainDepth >= 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    const running = this.startInChain(command, args);\n    try {\n      return this.answerOf(command, await running);\n    } catch (error) {\n      return { outcome: 'failed', message: messageOf(error) };\n    }\n  }\n\n  private startInChain(\n    command: Command,\n    args: CommandArguments | undefined,\n  ): Promise<unknown> {\n    this.chainDepth += 1;\n    try {\n      return this.commands.run(command, undefined, args);\n    } finally {\n      this.chainDepth -= 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(entry: RegisteredCommand, caller: Caller): boolean {\n    const opened = caller.mayAutomate && entry.command.callable === true;\n    if (!isOwnCommand(entry, caller) && !opened) {\n      return false;\n    }\n    return this.commands.available(entry.command);\n  }\n\n  private reportRefusal(\n    caller: Caller,\n    entry: RegisteredCommand | undefined,\n  ): void {\n    if (caller.mayAutomate || isOwnCommand(entry, caller)) {\n      return;\n    }\n    this.errors.handleError(\n      new CapabilityError(\n        'automation',\n        caller.id,\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      agentConsent: command.agentConsent,\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 {\n  computed,\n  DestroyRef,\n  effect,\n  inject,\n  Injector,\n  Service,\n  Signal,\n} from '@angular/core';\nimport { Command } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { CommandService } from '../command.service';\nimport {\n  chordClaims,\n  eventSignature,\n  isEditableTarget,\n  isMacPlatform,\n} from './chord';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\n\ninterface ChordBindings {\n  readonly map: ReadonlyMap<string, string>;\n  readonly warnings: readonly string[];\n}\n\nfunction bindChords(\n  commands: readonly Command[],\n  isMac: boolean,\n): ChordBindings {\n  const { bySignature, unparsable } = chordClaims(commands, isMac);\n  const map = new Map<string, string>();\n  const warnings = unparsable.map(\n    (command) =>\n      `Command \"${command.id}\" has an unparsable shortcut \"${command.shortcut}\".`,\n  );\n  for (const [signature, claimants] of bySignature) {\n    map.set(signature, (claimants.at(-1) as Command).id);\n    for (const [index, command] of claimants.entries()) {\n      if (index > 0) {\n        warnings.push(\n          `Shortcut \"${command.shortcut}\" is bound to both \"${claimants[index - 1].id}\" and \"${command.id}\".`,\n        );\n      }\n    }\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 path a click takes.\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(FeatureSwitches).commands.shortcuts;\n  private readonly isMac = isMacPlatform();\n  private started = false;\n\n  private readonly build = computed(() =>\n    bindChords(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. A chord is ignored while shortcuts are off. */\n  start(): void {\n    if (this.started) {\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    if (!this.enabled()) {\n      return;\n    }\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 { DestroyRef, inject } from '@angular/core';\nimport { Wording } from '../../i18n/wording';\nimport { wordChordKeysWith } from './key-words';\n\nexport function wordChordKeys(): void {\n  const wording = inject(Wording);\n  wordChordKeysWith((key) => {\n    const name = `keys.${key}`;\n    const word = wording.translate(name);\n    return word === name || word === '' ? undefined : word;\n  });\n  inject(DestroyRef).onDestroy(() => wordChordKeysWith(undefined));\n}\n","import { inject, Service } from '@angular/core';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { viewPanePath } from '../pane/tree/pane-address';\nimport { tabHolderOf } from '../pane/tree/pane-queries';\nimport { isContainerDock } from '../pane/container/container-children';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { RetainedViewStash } from '../pane/retention/retained-view-stash';\nimport {\n  pathOfRetentionKey,\n  scopeOfRetentionKey,\n} from '../pane/retention/retention-keys';\nimport { SurfaceCloseGuard } from '../pane/unsaved-work/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  hide(viewId: string): void {\n    this.closeGuard.guarded(this.openInstancesOf(viewId), () => {\n      this.hiddenViews.hide(viewId);\n      this.removeTabs(viewPanePath(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 = viewPanePath(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  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 openInstancesOf(viewId: string): unknown[] {\n    const path = viewPanePath(viewId);\n    return this.stash\n      .keyedInstances()\n      .filter(\n        (entry) =>\n          !isContainerDock(scopeOfRetentionKey(entry.key)) &&\n          pathOfRetentionKey(entry.key) === 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 { inject, InjectionToken, Service } from '@angular/core';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { SurfaceCloseGuard } from '../pane/unsaved-work/surface-close-guard';\nimport { UnsavedWork } from '../pane/unsaved-work/unsaved-work';\nimport { PanelSizeService } from '../panel/panel-size.service';\nimport { PanelState } from '../panel/panel-state';\nimport { RailItemsService } from '../rail/rail-items.service';\nimport { UserOrderService } from '../reorder/user-order.service';\nimport { ViewInstanceService } from '../../views/view-instance.service';\n\n/**\n * Resets every workspace after asking about unsaved work once, and answers whether it was allowed.\n * Provided by the composition root, so the application reset includes the workspaces.\n */\nexport const APP_RESET_WORKSPACES = new InjectionToken<() => Promise<boolean>>(\n  'lw.app-reset-workspaces',\n);\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  private readonly closeGuard = inject(SurfaceCloseGuard);\n  private readonly unsavedWork = inject(UnsavedWork);\n  private readonly resetWorkspaces = inject(APP_RESET_WORKSPACES, {\n    optional: true,\n  });\n\n  async reset(options: { workspaces?: boolean } = {}): Promise<boolean> {\n    const allowed =\n      options.workspaces && this.resetWorkspaces\n        ? await this.resetWorkspaces()\n        : await this.closeGuard.confirmDiscard(\n            this.unsavedWork.instancesEverywhere(),\n          );\n    if (!allowed) {\n      return false;\n    }\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    return true;\n  }\n}\n","declare const PANE_HANDLE: unique symbol;\n\n/**\n * Names one pane of the content area for as long as that pane exists. Handed out by `PaneService`\n * and accepted back by it; opaque, so a distribution keeps it without learning how the workbench\n * identifies panes. A handle of a pane that has since been closed names nothing: every action given\n * it does nothing.\n */\nexport type PaneHandle = string & { readonly [PANE_HANDLE]: true };\n\nexport function paneHandle(paneId: string): PaneHandle {\n  return paneId as PaneHandle;\n}\n","import { computed, inject, Service, Signal } from '@angular/core';\nimport { PaneChromeService } from './chrome/pane-chrome.service';\nimport { PaneActions } from './pane-actions.service';\nimport { PaneHandle, paneHandle } from './pane-handle';\nimport { CONTENT_DOCK } from './tree/pane-address';\nimport { leafPath } from './tree/pane-node';\nimport { findLeaf, leavesOf } from './tree/pane-queries';\nimport { PaneTreeService } from './tree/pane-tree.service';\n\n/** What the workbench knows about one pane of the content area, as facts rather than as the tree. */\nexport interface PaneFacts {\n  /** Names the pane; stable while it exists. */\n  readonly handle: PaneHandle;\n  /** The path of the item the pane is showing, or `null` for an empty pane. */\n  readonly showing: string | null;\n  /** How many items the pane holds. */\n  readonly itemCount: number;\n  /** Whether this is the pane whose content the address bar reflects. */\n  readonly carriesAddress: boolean;\n  /** Whether the pane currently fills the whole content area. */\n  readonly maximized: boolean;\n  /** Whether the pane is collapsed into its strip. */\n  readonly minimized: boolean;\n}\n\n/**\n * The arrangement side of the content area for a distribution: what the pane controls do, reachable\n * from your own code, plus the arrangement as facts. Content stays with `ContentTabsService` (open,\n * navigate, pin, close a tab); this service is about the panes those tabs sit in.\n *\n * ```ts\n * const panes = inject(PaneService);\n * panes.isSplit();                 // Signal<boolean>\n * panes.panes();                   // PaneFacts[] in layout order\n * panes.splitRight();              // duplicates what the address pane shows, like the toolbar\n * panes.closePane(handle);         // asks about unsaved work exactly as the × would\n * ```\n *\n * Every action is the same code the control runs, with the same guards. Without a handle an action\n * means the pane that carries the address. A handle of a pane that is gone does nothing. The\n * capability switches do not reach this service: what a distribution switched off for its users it\n * can still do from here.\n */\n@Service()\nexport class PaneService {\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly chrome = inject(PaneChromeService);\n  private readonly actions = inject(PaneActions);\n\n  /** Every pane of the content area, in layout order. */\n  readonly panes: Signal<readonly PaneFacts[]> = computed(() =>\n    leavesOf(this.paneTree.tree(CONTENT_DOCK)).map((leaf) => ({\n      handle: paneHandle(leaf.id),\n      showing: leafPath(leaf) ?? null,\n      itemCount: leaf.tabs.length,\n      carriesAddress: this.paneTree.carriesAddress({\n        dock: CONTENT_DOCK,\n        paneId: leaf.id,\n      }),\n      maximized: this.chrome.isMaximized(CONTENT_DOCK, leaf.id),\n      minimized: this.chrome.isMinimized(CONTENT_DOCK, leaf.id),\n    })),\n  );\n\n  /** The pane that carries the address; the default target of every action. */\n  readonly activePane: Signal<PaneHandle> = computed(() =>\n    paneHandle(this.paneTree.primaryId(CONTENT_DOCK)),\n  );\n\n  /** Whether the content area holds more than one pane. */\n  readonly isSplit: Signal<boolean> = computed(() =>\n    this.paneTree.isSplit(CONTENT_DOCK),\n  );\n\n  /** The pane that fills the area, or `null` when none does. */\n  readonly maximized: Signal<PaneHandle | null> = computed(() => {\n    const paneId = this.chrome.maximizedPaneIn(CONTENT_DOCK);\n    return paneId === null ? null : paneHandle(paneId);\n  });\n\n  /** The panes collapsed into their strip. */\n  readonly minimized: Signal<readonly PaneHandle[]> = computed(() =>\n    this.panes()\n      .filter((pane) => pane.minimized)\n      .map((pane) => pane.handle),\n  );\n\n  /** Splits the pane to the right, duplicating what it shows. Nothing to duplicate, nothing happens. */\n  splitRight(pane: PaneHandle = this.activePane()): void {\n    this.actions.split(CONTENT_DOCK, pane, 'row');\n  }\n\n  /** Splits the pane downwards, duplicating what it shows. Nothing to duplicate, nothing happens. */\n  splitDown(pane: PaneHandle = this.activePane()): void {\n    this.actions.split(CONTENT_DOCK, pane, 'column');\n  }\n\n  /**\n   * Closes the pane, asking about unsaved work first. Closing the pane that carries the address\n   * promotes a neighbour; closing the only pane is a no-op. Pinned tabs and tabs declared\n   * unclosable are not closed with it: they join the pane that takes its space, and with closing\n   * switched off every tab does.\n   */\n  closePane(pane: PaneHandle = this.activePane()): void {\n    this.actions.close(CONTENT_DOCK, pane);\n  }\n\n  /**\n   * Collapses the area back to the address pane, asking first if another pane holds unsaved work.\n   * Pinned tabs and tabs declared unclosable in the other panes join the address pane.\n   */\n  unsplit(): void {\n    this.actions.unsplit(CONTENT_DOCK);\n  }\n\n  /** Makes the pane fill the content area. */\n  maximize(pane: PaneHandle = this.activePane()): void {\n    this.actions.maximize(CONTENT_DOCK, pane);\n  }\n\n  /** Collapses the pane into its strip. */\n  minimize(pane: PaneHandle = this.activePane()): void {\n    this.actions.minimize(CONTENT_DOCK, pane);\n  }\n\n  /** Without a handle: ends the maximised state. With one: brings that pane back from either state. */\n  restore(pane?: PaneHandle): void {\n    this.actions.restore(CONTENT_DOCK, pane);\n  }\n\n  /** Moves the address to the pane, showing what that pane shows. */\n  focus(pane: PaneHandle): void {\n    this.actions.focus(CONTENT_DOCK, pane);\n  }\n\n  /** Moves an open item into the pane, as dropping it on the pane's strip would. */\n  moveTab(path: string, pane: PaneHandle): void {\n    this.actions.moveTab(path, CONTENT_DOCK, pane);\n  }\n\n  /** Whether the handle still names a pane. */\n  exists(pane: PaneHandle): boolean {\n    return findLeaf(this.paneTree.tree(CONTENT_DOCK), pane) !== null;\n  }\n}\n","import { Service } from '@angular/core';\n\n@Service()\nexport class ActivationSettled {\n  private readonly pending = new Set<Promise<void>>();\n\n  track(work: Promise<unknown>): void {\n    const settled: Promise<void> = work\n      .then(\n        () => undefined,\n        () => undefined,\n      )\n      .finally(() => this.pending.delete(settled));\n    this.pending.add(settled);\n  }\n\n  isPending(): boolean {\n    return this.pending.size > 0;\n  }\n\n  async settled(): Promise<void> {\n    while (this.isPending()) {\n      await Promise.all(this.pending);\n    }\n  }\n}\n","import { InjectionToken, Provider } from '@angular/core';\n\n/** Plugin ids a distribution declared its application cannot run without. */\nexport type RequiredPlugins = readonly string[];\n\n/**\n * The plugins this distribution declared not optional. Defaults to **none** — every plugin is the\n * user's to switch off until a distribution says otherwise.\n */\nexport const REQUIRED_PLUGINS = new InjectionToken<RequiredPlugins>(\n  'REQUIRED_PLUGINS',\n  { providedIn: 'root', factory: () => [] },\n);\n\n/**\n * A distribution declares which of the plugins it composes its application cannot run without. Such\n * a plugin is listed in the permissions settings with what it holds, and **without a switch to turn\n * it off**; it stays active whatever the user chose before.\n *\n * This is the distribution's statement and not the plugin's, and deliberately so: everything a plugin\n * declares about itself is a request the distribution grants, so a manifest field here would be the\n * one exemption a plugin could award itself.\n *\n * It withholds the plugin's own switch and nothing else. The capabilities such a plugin was granted\n * stay revocable, because needing a plugin says nothing about needing everything it asked for — which\n * is what distinguishes this from a plugin the operator deployed, where both are withheld.\n *\n * Naming a plugin this distribution does not compose, neither a trusted one it provides nor a\n * sandboxed one it declares, is a composition mistake rather than a failure: it is reported in\n * development, however the distribution composes its plugins, and otherwise ignored, the same way a\n * capability granted to a plugin that never declared it is. A plugin the store installs arrives later\n * and is the user's to switch off in any case, so it does not count.\n *\n * @example\n * provideRequiredPlugins('sign-in')\n */\nexport function provideRequiredPlugins(...pluginIds: string[]): Provider {\n  return { provide: REQUIRED_PLUGINS, useValue: pluginIds };\n}\n","import { InjectionToken } from '@angular/core';\nimport type { Plugin } from '@loomweaver/plugin-sdk';\n\nexport type {\n  Plugin,\n  PluginManifest,\n  PluginContext,\n  PluginUi,\n  UiMenuItem,\n  PluginHost,\n  PluginSession,\n} from '@loomweaver/plugin-sdk';\n\n/** Multi-provider token: each entry is one trusted plugin to activate. */\nexport const PLUGIN = new InjectionToken<readonly Plugin[]>('PLUGIN');\n","import { InjectionToken } from '@angular/core';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport { PluginIsolationLevel } from '../../foundation/plugin-isolation-level';\n\n/**\n * A **sandboxed** plugin a distribution registers: its code is not a {@link Plugin} object running\n * in the page but a URL to an isolated document, loaded into an `<iframe sandbox>` and given `ctx`\n * over RPC. Contrast {@link providePlugins}, which registers trusted plugins.\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 workbench\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","import { Command, MenuItem, SettingsSection } from '@loomweaver/plugin-sdk';\nimport { chordClaims } from '../commands/keyboard/chord';\nimport { RegionType, ShellLayout } from '../layout/layout';\nimport { regionById } from '../layout/layout-queries';\nimport { menuEntryId } from '../menu/menu-entry-id';\nimport { RegisteredMenuItem } from '../contributions/contribution-registry';\nimport { ROUTE_OMIT_PREFIX } from '../contributions/route-omit';\nimport { SETTING_OMIT_PREFIX } from '../settings-dialog/setting-omit';\n\nexport interface Placement {\n  readonly id: string;\n  readonly region: string;\n  readonly expected: RegionType;\n}\n\nexport interface OmitTargets {\n  readonly settingIds: ReadonlySet<string>;\n  readonly routeIds: ReadonlySet<string>;\n  readonly registeredIds: ReadonlySet<string>;\n}\n\nexport interface CommandReference {\n  readonly command: string | undefined;\n  readonly what: string;\n}\n\nexport function misplacedContributions(\n  layout: ShellLayout,\n  placements: readonly Placement[],\n): string[] {\n  return placements.flatMap((placement) => {\n    const problem = misplacement(layout, placement);\n    return problem === undefined ? [] : [problem];\n  });\n}\n\nexport function uncomposedRequirements(\n  required: readonly string[],\n  composed: ReadonlySet<string>,\n): string[] {\n  const missing = required.filter((id) => !composed.has(id));\n  return missing.length === 0\n    ? []\n    : [\n        `Composition: provideRequiredPlugins names ${missing.join(', ')}, which this ` +\n          'distribution does not compose, so the declaration is ignored.',\n      ];\n}\n\nexport function unmatchedOmits(\n  omitted: Iterable<string>,\n  targets: OmitTargets,\n): string[] {\n  return [...omitted]\n    .filter((id) => !omitMatches(id, targets))\n    .map(\n      (id) =>\n        `Composition: omit '${id}' matched nothing, so it hides nothing.${omitHint(id, targets)}`,\n    );\n}\n\nexport function unmatchedRowReplacements(\n  sections: readonly SettingsSection[],\n  replacedRowIds: readonly string[],\n): string[] {\n  const rowIds = new Set(\n    sections.flatMap((section) => section.rows.map((row) => row.id)),\n  );\n  return replacedRowIds\n    .filter((id) => !rowIds.has(id))\n    .map(\n      (id) =>\n        `Composition: row replacement '${id}' matched no row, so it replaces nothing.`,\n    );\n}\n\nexport function danglingCommands(\n  registered: ReadonlySet<string>,\n  references: readonly CommandReference[],\n): string[] {\n  return references\n    .filter(({ command }) => command !== undefined && !registered.has(command))\n    .map(\n      ({ command, what }) =>\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\nexport function undeclaredSlots(\n  entries: readonly RegisteredMenuItem[],\n  declared: ReadonlySet<string>,\n): string[] {\n  return entries\n    .filter(({ item }) => !declared.has(item.menu))\n    .map(\n      ({ item, ownerId }) =>\n        `Composition: ${menuLabel(item)}${ownerOf(ownerId)} is contributed to slot ` +\n        `'${item.menu}', which nothing declares: no menu the workbench draws, no control naming ` +\n        `it as its menu, no registered toolbar. It is never shown.`,\n    );\n}\n\nexport function contestedShortcuts(\n  commands: readonly Command[],\n  isMac: boolean,\n): string[] {\n  return [...chordClaims(commands, isMac).bySignature.values()]\n    .filter((claimants) => claimants.length > 1)\n    .map((claimants) => contestedShortcut(claimants));\n}\n\nexport function settingIds(\n  sections: readonly SettingsSection[],\n): 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\nexport function menuLabel(item: MenuItem): string {\n  return item.id === undefined\n    ? `menu entry in '${item.menu}'`\n    : `menu entry \"${item.id}\"`;\n}\n\nfunction ownerOf(ownerId: string | undefined): string {\n  return ownerId === undefined ? '' : ` from plugin \"${ownerId}\"`;\n}\n\nfunction misplacement(\n  layout: ShellLayout,\n  { id, region: regionId, expected }: Placement,\n): string | undefined {\n  const region = regionById(layout, regionId);\n  if (region?.type === expected) {\n    return undefined;\n  }\n  const detail = region\n    ? `a '${region.type}' region`\n    : 'a region this layout does not declare';\n  const alternatives = 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  return (\n    `Composition: \"${id}\" 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\nfunction omitMatches(id: string, targets: OmitTargets): boolean {\n  if (id.startsWith(SETTING_OMIT_PREFIX)) {\n    return targets.settingIds.has(id.slice(SETTING_OMIT_PREFIX.length));\n  }\n  if (id.startsWith(ROUTE_OMIT_PREFIX)) {\n    return targets.routeIds.has(id.slice(ROUTE_OMIT_PREFIX.length));\n  }\n  return targets.registeredIds.has(id);\n}\n\nfunction omitHint(id: string, targets: OmitTargets): string {\n  if (id.includes(':')) {\n    return '';\n  }\n  if (targets.settingIds.has(id)) {\n    return ` A settings section or row carries that id — did you mean '${SETTING_OMIT_PREFIX}${id}'?`;\n  }\n  if (targets.routeIds.has(id)) {\n    return ` A routable surface carries that id — did you mean '${ROUTE_OMIT_PREFIX}${id}'?`;\n  }\n  if (targets.registeredIds.has(menuEntryId(id))) {\n    return ` A menu entry carries that id — did you mean '${menuEntryId(id)}'?`;\n  }\n  return '';\n}\n\nfunction contestedShortcut(contesting: readonly Command[]): string {\n  const holder = contesting.at(-1) as Command;\n  const named = contesting.map((command) => `'${command.id}'`).join(', ');\n  return (\n    `Composition: the shortcut '${holder.shortcut}' is claimed by ${named}. It runs ` +\n    `'${holder.id}', the last to register it, so a control still offering that shortcut for any ` +\n    `of the others promises something it no longer does.`\n  );\n}\n","import { TAB_CONTEXT_MENU } from '../regions/content/tabs/tab-context-menu';\nimport { VIEW_CONTEXT_MENU } from '../regions/pane/chrome/strip-tab';\nimport { PANEL_STRIP_CONTEXT_MENU } from '../regions/panel/view-context-menu';\nimport {\n  RAIL_CONTEXT_MENU,\n  RAIL_ITEM_CONTEXT_MENU,\n} from '../regions/rail/rail-context-menu';\n\nexport const WORKBENCH_MENU_SLOTS: readonly string[] = [\n  TAB_CONTEXT_MENU,\n  VIEW_CONTEXT_MENU,\n  PANEL_STRIP_CONTEXT_MENU,\n  RAIL_CONTEXT_MENU,\n  RAIL_ITEM_CONTEXT_MENU,\n];\n\nexport interface SlotDeclarer {\n  readonly menu?: string;\n}\n\nexport function declaredSlots(\n  controls: readonly SlotDeclarer[],\n): ReadonlySet<string> {\n  const slots = new Set(WORKBENCH_MENU_SLOTS);\n  for (const control of controls) {\n    if (control.menu) {\n      slots.add(control.menu);\n    }\n  }\n  return slots;\n}\n","import { inject, Service } from '@angular/core';\nimport { ViewAction } from '@loomweaver/plugin-sdk';\nimport { ActivationSettled } from '../plugin/activation-settled';\nimport { BAR_ITEM } from '../foundation/bar-item';\nimport { RAIL_ITEM } from '../foundation/rail-item';\nimport { VIEW } from '../views/view';\nimport { isMacPlatform } from '../commands/keyboard/chord';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { SHELL_LAYOUT } from '../layout/layout';\nimport { SettingsService } from '../settings-dialog/settings.service';\nimport {\n  DEFAULT_SHELL_FEATURES,\n  SHELL_FEATURES,\n} from '../foundation/shell-features';\nimport { VersionService } from '../version/version.service';\nimport { REQUIRED_PLUGINS } from '../foundation/required-plugins';\nimport { PLUGIN } from '../plugin/plugin';\nimport { FRAME_PLUGIN } from '../plugin/frame/frame-plugin';\nimport {\n  CommandReference,\n  contestedShortcuts,\n  danglingCommands,\n  menuLabel,\n  misplacedContributions,\n  OmitTargets,\n  Placement,\n  settingIds,\n  uncomposedRequirements,\n  undeclaredSlots,\n  unmatchedOmits,\n  unmatchedRowReplacements,\n} from './composition-checks';\nimport { declaredSlots } from './declared-slots';\nimport { isBarButton } from '../regions/bar/bar-context';\nimport {\n  surfaceActionsSlot,\n  ToolbarRegistry,\n} from '../contributions/toolbar-registry';\n\nconst SLOT_REPORT_QUIET_MS = 1000;\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  private readonly versions = inject(VersionService);\n  private readonly required = inject(REQUIRED_PLUGINS);\n  private readonly plugins = inject(PLUGIN, { optional: true }) ?? [];\n  private readonly framePlugins =\n    inject(FRAME_PLUGIN, { optional: true }) ?? [];\n  private readonly activation = inject(ActivationSettled);\n  private readonly toolbars = inject(ToolbarRegistry);\n\n  checkStaticContributions(): void {\n    for (const problem of this.staticProblems()) {\n      console.warn(problem);\n    }\n  }\n\n  async reportUndeclaredSlotsOnceSettled(): Promise<void> {\n    do {\n      await this.activation.settled();\n      await new Promise((resolve) =>\n        setTimeout(resolve, SLOT_REPORT_QUIET_MS),\n      );\n    } while (this.activation.isPending());\n    for (const problem of this.undeclaredSlotProblems()) {\n      console.warn(problem);\n    }\n  }\n\n  print(): void {\n    const lines = [\n      `Version: ${this.versions.version()}${this.versions.isPreview() ? ' (preview)' : ''}`,\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.registryProblems()];\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    return [\n      ...misplacedContributions(this.layout, this.placements()),\n      ...uncomposedRequirements(this.required, this.composedPluginIds()),\n    ];\n  }\n\n  private registryProblems(): string[] {\n    return [\n      ...unmatchedOmits(this.registry.omitted(), this.omitTargets()),\n      ...unmatchedRowReplacements(\n        this.settings.registered(),\n        this.settings.replacedRowIds(),\n      ),\n      ...danglingCommands(\n        new Set(this.registry.commands().map((command) => command.id)),\n        this.commandReferences(),\n      ),\n      ...contestedShortcuts(this.registry.commands(), isMacPlatform()),\n      ...this.undeclaredSlotProblems(),\n    ];\n  }\n\n  private undeclaredSlotProblems(): string[] {\n    return undeclaredSlots(\n      this.registry.registeredMenuItems(),\n      declaredSlots([\n        ...this.registry.railItems(),\n        ...this.registry.barItems().filter((item) => isBarButton(item)),\n        ...this.surfaceActions().map(({ action }) => action),\n        ...this.toolbars\n          .toolbars()\n          .map((entry) => ({ menu: entry.toolbar.slot })),\n        ...this.surfaceIds().map((id) => ({ menu: surfaceActionsSlot(id) })),\n        ...this.registry.menuItems().map((item) => ({ menu: item.submenu })),\n      ]),\n    );\n  }\n\n  private placements(): Placement[] {\n    return [\n      ...this.barItems.map((item) => ({\n        id: item.id,\n        region: item.bar,\n        expected: 'bar' as const,\n      })),\n      ...this.railItems.map((item) => ({\n        id: item.id,\n        region: item.rail,\n        expected: 'rail' as const,\n      })),\n      ...this.views.map((view) => ({\n        id: view.id,\n        region: view.region,\n        expected: 'panel' as const,\n      })),\n    ];\n  }\n\n  private composedPluginIds(): ReadonlySet<string> {\n    return new Set([\n      ...this.plugins.map((plugin) => plugin.manifest.id),\n      ...this.framePlugins.map((plugin) => plugin.id),\n    ]);\n  }\n\n  private omitTargets(): OmitTargets {\n    return {\n      settingIds: settingIds(this.settings.registered()),\n      routeIds: this.routeIds(),\n      registeredIds: this.registry.registeredIds(),\n    };\n  }\n\n  private commandReferences(): CommandReference[] {\n    return [\n      ...this.registry.menuItems().map((item) => ({\n        command: item.command,\n        what: menuLabel(item),\n      })),\n      ...this.registry\n        .barItems()\n        .flatMap((item) =>\n          'command' in item\n            ? [{ command: item.command, what: `bar item \"${item.id}\"` }]\n            : [],\n        ),\n      ...this.registry.railItems().map((item) => ({\n        command: item.command,\n        what: `rail item \"${item.id}\"`,\n      })),\n      ...this.surfaceActions().map(({ surface, action }) => ({\n        command: action.command,\n        what: `action \"${action.id}\" of surface \"${surface}\"`,\n      })),\n      ...this.settings\n        .registered()\n        .flatMap((section) =>\n          section.rows.flatMap((row) =>\n            row.control.kind === 'button'\n              ? [\n                  {\n                    command: row.control.command,\n                    what: `settings row \"${row.id}\"`,\n                  },\n                ]\n              : [],\n          ),\n        ),\n    ];\n  }\n\n  private surfaceActions(): { surface: string; action: ViewAction }[] {\n    const seen = new Set<string>();\n    return [...this.registry.views(), ...this.registry.contentRoutes()].flatMap(\n      (surface) => {\n        const id = surface.id ?? '';\n        if (seen.has(id) && id !== '') {\n          return [];\n        }\n        seen.add(id);\n        return (surface.actions ?? []).map((action) => ({ surface: id, action }));\n      },\n    );\n  }\n\n  private surfaceIds(): string[] {\n    return [...this.registry.views(), ...this.registry.contentRoutes()].flatMap(\n      (surface) => (surface.id === undefined ? [] : [surface.id]),\n    );\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 (globalThis.window === undefined) {\n    return;\n  }\n  const host = globalThis 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","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 { CAPABILITIES, Capability } from '@loomweaver/plugin-sdk';\nimport { PluginIsolationLevel } from '../../foundation/plugin-isolation-level';\nimport { SettingCodec } from '../../persistence/stored-values/persisted-setting';\nimport { parseStored } from '../../persistence/stored-values/parse-stored';\n\n/**\n * A community plugin the user installed from the distribution's catalog. Plain data — the same\n * shape the {@link FramePluginRuntime} 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\nconst PLUGIN_IDENTITY = /^[a-z0-9][a-z0-9.-]*$/;\n\nconst WORKBENCH_NAMESPACE = 'shell';\n\nexport function isPluginIdentity(id: string): boolean {\n  return (\n    PLUGIN_IDENTITY.test(id) &&\n    id !== WORKBENCH_NAMESPACE &&\n    !id.startsWith(`${WORKBENCH_NAMESPACE}.`)\n  );\n}\n\nexport function isSameOriginUrl(url: string): boolean {\n  try {\n    const parsed = new URL(url, document.baseURI);\n    return (\n      (parsed.protocol === 'http:' || parsed.protocol === 'https:') &&\n      parsed.origin === location.origin\n    );\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\nexport function nonEmptyText(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' || !isPluginIdentity(entry['id'])) {\n    return undefined;\n  }\n  if (\n    typeof entry['entryUrl'] !== 'string' ||\n    !isSameOriginUrl(entry['entryUrl'])\n  ) {\n    return undefined;\n  }\n  const iconUrl = nonEmptyText(entry['iconUrl']);\n  return {\n    id: entry['id'],\n    name: nonEmptyText(entry['name']) ?? entry['id'],\n    entryUrl: entry['entryUrl'],\n    capabilities: parseCapabilities(entry['capabilities']),\n    version: nonEmptyText(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\nexport function 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.every((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  const parsed = parseStored(raw);\n  return Array.isArray(parsed)\n    ? dedupeById(parsed.map((entry) => parseInstalledPlugin(entry)))\n    : [];\n}\n\nexport const INSTALLED_LIST_CODEC: SettingCodec<readonly InstalledPlugin[]> = {\n  parse: parseInstalledList,\n  serialize: (list) => JSON.stringify(list),\n};\n","import { Service } from '@angular/core';\nimport { persistedSetting } from '../../persistence/stored-values/persisted-setting';\nimport { INSTALLED_LIST_CODEC, InstalledPlugin } from './installed-plugin';\nimport { PluginCatalogEntry } from '../catalog/catalog-entry';\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 stored = persistedSetting(STORAGE_KEY, INSTALLED_LIST_CODEC);\n\n  readonly deployed = this.stored.value;\n\n  adopt(entries: readonly PluginCatalogEntry[]): void {\n    this.stored.set(\n      entries\n        .filter((entry) => entry.deployed === true)\n        .map((entry) => withoutCatalogMetadata(entry)),\n    );\n  }\n\n  isDeployed(id: string): boolean {\n    return this.deployed().some((entry) => entry.id === id);\n  }\n}\n","import { computed, inject, Service, signal } from '@angular/core';\nimport { persistedSetting } from '../../persistence/stored-values/persisted-setting';\nimport { ID_SET_CODEC, toggledIdSet } from '../../persistence/stored-values/persisted-id-set';\nimport { REQUIRED_PLUGINS } from '../../foundation/required-plugins';\nimport { PluginDeploymentService } from '../../plugin-store/lifecycle/plugin-deployment.service';\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 required = new Set(inject(REQUIRED_PLUGINS));\n\n  private readonly deployment = inject(PluginDeploymentService);\n\n  private readonly storedDisabled = persistedSetting(STORAGE_KEY, ID_SET_CODEC);\n\n  private readonly names = signal<ReadonlyMap<string, string>>(new Map());\n\n  /**\n   * The disabled plugin ids (reactive) — a runtime reconciles activation against this. A plugin the\n   * distribution declared its application cannot run without never appears here, and neither does\n   * one the operator deploys, whatever is stored, so the runtimes, the store and the permissions\n   * surface read one answer rather than several.\n   */\n  readonly disabled = computed<ReadonlySet<string>>(() => {\n    const stored = this.storedDisabled.value();\n    const alwaysOn = (id: string) =>\n      this.required.has(id) || this.deployment.isDeployed(id);\n    return new Set([...stored].filter((id) => !alwaysOn(id)));\n  });\n\n  /** Every known plugin with its enabled state, for the permissions settings surface. */\n  readonly plugins = computed<readonly PluginInfo[]>(() => {\n    const disabled = this.disabled();\n    return [...this.names().entries()]\n      .map(([id, name]) => ({ id, name, enabled: !disabled.has(id) }))\n      .toSorted((a, b) => a.name.localeCompare(b.name));\n  });\n\n  /** Whether the distribution declared it cannot run without this plugin. */\n  isRequired(id: string): boolean {\n    return this.required.has(id);\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.disabled().has(id);\n  }\n\n  /**\n   * Turns a whole plugin on or off (persisted). The runtimes react by loading/unloading it. Turning\n   * off a plugin the distribution declared it cannot run without does nothing: the surface offers no\n   * switch for one, and this is the same answer read from anywhere else.\n   */\n  setEnabled(id: string, enabled: boolean): void {\n    if (!enabled && this.required.has(id)) {\n      return;\n    }\n    this.storedDisabled.update((disabled) => toggledIdSet(disabled, id, !enabled));\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { UnsavedWork } from '../../regions/pane/unsaved-work/unsaved-work';\nimport { SurfaceCloseGuard } from '../../regions/pane/unsaved-work/surface-close-guard';\nimport { PluginEnablementService } from './plugin-enablement.service';\n\n@Service()\nexport class PluginDisableGuard {\n  private readonly unsavedWork = inject(UnsavedWork);\n  private readonly closeGuard = inject(SurfaceCloseGuard);\n  private readonly enablement = inject(PluginEnablementService);\n\n  requestEnabled(id: string, enabled: boolean): Promise<boolean> {\n    const candidates = enabled ? [] : this.unsavedWork.instancesOfPlugin(id);\n    if (enabled || !this.closeGuard.anyDirty(candidates)) {\n      this.enablement.setEnabled(id, enabled);\n      return Promise.resolve(true);\n    }\n    return this.closeGuard.confirmDiscard(candidates).then((ok) => {\n      if (ok) {\n        this.enablement.setEnabled(id, false);\n      }\n      return ok;\n    });\n  }\n\n  toggleFrom(id: string, event: Event): void {\n    const toggle = event.target as HTMLInputElement;\n    void this.requestEnabled(id, toggle.checked).then((changed) => {\n      if (!changed) {\n        toggle.checked = true;\n      }\n    });\n  }\n\n  confirmRemoval(id: string): Promise<boolean> {\n    return this.closeGuard.confirmDiscard(\n      this.unsavedWork.instancesOfPlugin(id),\n    );\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 '../../permissions/capability-grant.service';\nimport { PluginEnablementService } from './plugin-enablement.service';\nimport { PluginDisableGuard } from './plugin-disable-guard';\nimport { PluginDeploymentService } from '../../plugin-store/lifecycle/plugin-deployment.service';\nimport { PluginRung } from '../../foundation/plugin-isolation-level';\nimport { PluginIsolationLevelService } from '../../plugin-isolation/plugin-isolation-level.service';\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\ninterface PluginRow {\n  readonly id: string;\n  readonly name: string;\n  readonly enabled: boolean;\n  readonly deployed: boolean;\n  readonly required: boolean;\n  readonly rungNote: string;\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    this.rows().filter((row) => this.canBePermitted(row)),\n  );\n\n  private readonly rows = computed<readonly PluginRow[]>(() => {\n    const caps = this.grants.permissions();\n    return this.enablement.plugins().map((plugin) => {\n      const deployed = this.deployment.isDeployed(plugin.id);\n      const required = this.enablement.isRequired(plugin.id);\n      return {\n        ...plugin,\n        deployed,\n        required,\n        rungNote: RUNG_NOTES[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.toggleFrom(id, event);\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  private canBePermitted(row: PluginRow): boolean {\n    return row.capabilities.length > 0 || !(row.deployed || row.required);\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.deployed && !plugin.required) {\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.deployed) {\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        } @else if (plugin.required) {\n          <p\n            class=\"text-xs text-content-muted\"\n            [attr.data-testid]=\"'perm-required-' + plugin.id\"\n          >\n            {{ 'settings.permissionsRequired' | 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.deployed) {\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 { inject } from '@angular/core';\nimport { SettingsService } from './settings-dialog/settings.service';\nimport { SettingRow } from './settings-dialog/settings-model';\nimport { SHELL_LAYOUT } from './layout/layout';\nimport { RailLabelsService } from './regions/rail/rail-labels.service';\nimport { railNameKey } from './regions/rail/rail-name';\nimport { ThemeToggle } from './theme/theme-toggle';\nimport { TextSizeToggle } from './text-size/text-size-toggle';\nimport { LanguageSwitcher } from './i18n/language-switcher';\nimport { PermissionsSettings } from './plugin/enablement/permissions-settings';\nimport { regionsOfType } from './layout/layout-queries';\nimport { APP_RESET_COMMAND_ID } from './commands/host-command-ids';\n\nfunction railLabelRows(): SettingRow[] {\n  const layout = inject(SHELL_LAYOUT);\n  const labels = inject(RailLabelsService);\n  return regionsOfType(layout, 'rail').map((region) => ({\n    id: `shell.railLabels.${region.id}`,\n    label: railNameKey(region, layout),\n    description: 'railLabels.desc',\n    control: {\n      kind: 'toggle',\n      value: () => labels.isLabelled(region.id),\n      set: (labelled: boolean) => labels.setLabelled(region.id, labelled),\n    },\n  }));\n}\n\nexport function registerDefaultSettings(): void {\n  const settings = inject(SettingsService);\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      ...railLabelRows(),\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: APP_RESET_COMMAND_ID,\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","import { Disposable } from '@loomweaver/plugin-sdk';\nimport { OPEN_SETTINGS_COMMAND_ID } from '../commands/host-command-ids';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { SettingsService } from './settings.service';\n\nexport function registerOpenSettingsCommand(\n  registry: ContributionRegistry,\n  settings: SettingsService,\n): Disposable {\n  return registry.addCommand({\n    id: OPEN_SETTINGS_COMMAND_ID,\n    title: 'settings.title',\n    icon: 'settings',\n    popout: true,\n    run: () => {\n      settings.open();\n    },\n  });\n}\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  inject,\n  signal,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { DialogService } from '../dialog/dialog.service';\nimport { BUILT_IN_WORKSPACE_ID } from './declaration/composed-definitions';\nimport { WorkspaceCatalog } from './catalog/workspace-catalog';\nimport { WorkspaceService } from './workspace.service';\nimport { UnusableWorkspacesService } from './usability/unusable-workspaces.service';\nimport { CommandService } from '../commands/command.service';\nimport { WORKSPACE_RESET_COMMAND_ID } from '../commands/host-command-ids';\n\n@Component({\n  selector: 'lw-workspace-dialog',\n  imports: [TranslocoPipe, NgTemplateOutlet],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './workspace-dialog.html',\n})\nexport class WorkspaceDialog {\n  private readonly workspaceService = inject(WorkspaceService);\n  private readonly catalog = inject(WorkspaceCatalog);\n  private readonly unusableWorkspaces = inject(UnusableWorkspacesService);\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.workspaceService.workspaces;\n  protected readonly initials = this.workspaceService.initials;\n  protected readonly definitions = this.workspaceService.definitions;\n  protected readonly activeId = this.workspaceService.activeId;\n  protected readonly hasChanges = this.workspaceService.hasChanges;\n  protected readonly builtInId = BUILT_IN_WORKSPACE_ID;\n  protected readonly offersBuiltIn = this.catalog.offersBuiltIn;\n  protected readonly name = signal('');\n\n  protected readonly tab = signal<'mine' | 'provided'>(\n    this.definitions.some(\n      (definition) => definition.id === this.workspaceService.activeId(),\n    )\n      ? 'provided'\n      : 'mine',\n  );\n\n  protected originName(id: string): string | null {\n    const origin = this.catalog.originOf(id);\n    const definition =\n      origin === null ? undefined : this.catalog.definitionOf(origin);\n    return definition ? this.transloco.translate(definition.title) : null;\n  }\n\n  protected changed(id: string): boolean {\n    return this.workspaceService.changedIds().has(id);\n  }\n\n  protected unusable(id: string): boolean {\n    return this.unusableWorkspaces.ids().has(id);\n  }\n\n  protected resetTestId(id: string): string {\n    return this.activeId() === id ? 'workspace-reset' : `workspace-reset-${id}`;\n  }\n\n  protected resettable(id: string): boolean {\n    return this.changed(id) || this.unusable(id);\n  }\n\n  protected async save(): Promise<void> {\n    const name = this.name().trim();\n    if (!name) {\n      return;\n    }\n    await this.workspaceService.saveCurrent(name);\n    this.name.set('');\n  }\n\n  protected async applyChanges(): Promise<void> {\n    const confirmed = await this.dialogs.confirm({\n      title: this.transloco.translate('workspace.saveBaseline'),\n      message: this.transloco.translate('workspace.applyConfirm'),\n    });\n    if (confirmed) {\n      await this.workspaceService.saveBaseline();\n    }\n  }\n\n  protected switchTo(id: string): void {\n    void this.workspaceService.switchTo(id);\n    this.ref.close();\n  }\n\n  protected async rename(id: string, current: string): Promise<void> {\n    const name = await this.dialogs.prompt({\n      title: this.transloco.translate('workspace.rename'),\n      message: '',\n      initial: current,\n      placeholder: this.transloco.translate('workspace.namePlaceholder'),\n    });\n    const trimmed = name?.trim();\n    if (trimmed) {\n      this.workspaceService.rename(id, trimmed);\n    }\n  }\n\n  protected resetLayout(id: string): void {\n    this.ref.close();\n    this.commands.execute(WORKSPACE_RESET_COMMAND_ID, { workspace: id });\n  }\n\n  protected async remove(id: string, name: string): Promise<void> {\n    const confirmed = await this.dialogs.confirm({\n      title: this.transloco.translate('workspace.delete'),\n      message: this.transloco.translate('workspace.deleteConfirm', { name }),\n      tone: 'danger',\n    });\n    if (confirmed) {\n      await this.workspaceService.remove(id);\n    }\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 + (offersBuiltIn ? 1 : 0) }})\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' && offersBuiltIn) {\n      <li class=\"flex items-center gap-1.5\">\n        <div\n          class=\"flex min-w-0 flex-1 items-center gap-1 rounded-md border p-1.5\"\n          [class.border-brand]=\"activeId() === builtInId\"\n          [class.border-border]=\"activeId() !== builtInId\"\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() === builtInId ? 'true' : null\"\n            (click)=\"switchTo(builtInId)\"\n            data-testid=\"workspace-default\"\n          >\n            <span class=\"truncate\">{{ 'workspace.default' | transloco }}</span>\n            <ng-container\n              [ngTemplateOutlet]=\"markers\"\n              [ngTemplateOutletContext]=\"{ $implicit: builtInId }\"\n            />\n          </button>\n        </div>\n        <ng-container\n          [ngTemplateOutlet]=\"resetButton\"\n          [ngTemplateOutletContext]=\"{ $implicit: builtInId }\"\n        />\n      </li>\n    }\n    @if (tab() === 'provided') {\n      @for (definition of definitions; track definition.id) {\n        <li class=\"flex items-center gap-1.5\">\n          <div\n            class=\"flex min-w-0 flex-1 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              <ng-container\n                [ngTemplateOutlet]=\"markers\"\n                [ngTemplateOutletContext]=\"{ $implicit: definition.id }\"\n              />\n            </button>\n          </div>\n          <ng-container\n            [ngTemplateOutlet]=\"resetButton\"\n            [ngTemplateOutletContext]=\"{ $implicit: definition.id }\"\n          />\n        </li>\n      }\n    }\n    @if (tab() === 'mine') {\n      @for (workspace of workspaces(); track workspace.id) {\n        <li class=\"flex items-center gap-1.5\">\n          <div\n            class=\"flex min-w-0 flex-1 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              <ng-container\n                [ngTemplateOutlet]=\"markers\"\n                [ngTemplateOutletContext]=\"{ $implicit: workspace.id }\"\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            }\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          </div>\n          <ng-container\n            [ngTemplateOutlet]=\"resetButton\"\n            [ngTemplateOutletContext]=\"{ $implicit: workspace.id }\"\n          />\n        </li>\n      }\n    }\n  </ul>\n</div>\n\n<ng-template #markers let-id>\n  @if (changed(id)) {\n    <span\n      aria-hidden=\"true\"\n      class=\"inline-block h-1.5 w-1.5 shrink-0 rounded-full bg-brand align-middle\"\n      data-testid=\"workspace-changed\"\n    ></span>\n  }\n  @if (unusable(id)) {\n    <lw-icon\n      name=\"warning\"\n      size=\"0.9rem\"\n      class=\"shrink-0 text-negative\"\n      data-testid=\"workspace-unusable\"\n    />\n    <lw-tooltip [text]=\"'workspace.unusableMark' | transloco\" position=\"bottom\" />\n  }\n</ng-template>\n\n<ng-template #resetButton let-id>\n  <button\n    type=\"button\"\n    class=\"lw-btn lw-btn--danger lw-btn--sm lw-btn--icon shrink-0\"\n    [disabled]=\"!resettable(id)\"\n    (click)=\"resetLayout(id)\"\n    [attr.aria-label]=\"'workspace.reset' | transloco\"\n    [attr.data-testid]=\"resetTestId(id)\"\n  >\n    <lw-icon name=\"undo\" size=\"1rem\" />\n    <lw-tooltip [text]=\"'workspace.resetHint' | transloco\" position=\"bottom\" />\n  </button>\n</ng-template>\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Disposable } from '@loomweaver/plugin-sdk';\nimport {\n  WORKSPACE_MANAGE_COMMAND_ID,\n  WORKSPACE_RESET_COMMAND_ID,\n} from '../commands/host-command-ids';\nimport { DialogService } from '../dialog/dialog.service';\nimport { menuContextString } from '../menu/menu-context';\nimport { ContributionRegistry } from '../contributions/contribution-registry';\nimport { disposeTogether } from '../contributions/dispose-together';\nimport { WorkspaceDialog } from './workspace-dialog';\nimport { WorkspaceService } from './workspace.service';\n\nexport interface WorkspaceCommandDeps {\n  readonly dialogs: DialogService;\n  readonly transloco: TranslocoService;\n  readonly workspace: WorkspaceService;\n}\n\nexport function registerWorkspaceCommands(\n  registry: ContributionRegistry,\n  { dialogs, transloco, workspace }: WorkspaceCommandDeps,\n): Disposable {\n  return disposeTogether([\n    registry.addCommand({\n      id: WORKSPACE_MANAGE_COMMAND_ID,\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: WORKSPACE_RESET_COMMAND_ID,\n      title: 'workspace.reset',\n      icon: 'undo',\n      run: (context) => {\n        const named = menuContextString(context, 'workspace');\n        void dialogs\n          .confirm({\n            title: transloco.translate('workspace.reset'),\n            message: transloco.translate('workspace.resetConfirm'),\n          })\n          .then((ok) => {\n            if (ok) {\n              void workspace.reset(named === '' ? undefined : named);\n            }\n          });\n      },\n    }),\n  ]);\n}\n","export function fuzzyScore(query: string, label: string): number | null {\n  const needle = query.toLowerCase();\n  if (!needle) {\n    return 0;\n  }\n  const haystack = label.toLowerCase();\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\nexport function matching<T extends { label: string }>(\n  query: string,\n  rows: readonly T[],\n): readonly T[] {\n  return rows.filter((row) => fuzzyScore(query, row.label) !== null);\n}\n\nexport function ranked<T extends { label: string }>(\n  query: string,\n  rows: readonly T[],\n): readonly T[] {\n  return rows\n    .map((row) => ({ row, score: fuzzyScore(query, row.label) }))\n    .filter(\n      (scored): scored is { row: T; score: number } => scored.score !== null,\n    )\n    .toSorted((a, b) => b.score - a.score)\n    .map((scored) => scored.row);\n}\n","import { ResolvedEntry } from '../../menu/menu-resolution';\nimport { matching, ranked } from './palette-fuzzy';\n\nexport interface CommandRow {\n  readonly kind: 'command';\n  readonly id: string;\n  readonly label: string;\n  readonly icon?: string;\n  readonly shortcut?: string;\n}\n\nexport interface CommandSections {\n  readonly recent: readonly CommandRow[];\n  readonly others: readonly CommandRow[];\n}\n\nexport function commandRows(\n  entries: readonly ResolvedEntry[],\n  translate: (key: string) => string,\n): readonly CommandRow[] {\n  return entries.flatMap((entry) =>\n    entry.command === undefined\n      ? []\n      : [\n          {\n            kind: 'command' as const,\n            id: entry.command.id,\n            label: translate(entry.command.title),\n            icon: entry.icon,\n            shortcut: entry.shortcut,\n          },\n        ],\n  );\n}\n\nexport function commandSections(\n  rows: readonly CommandRow[],\n  recentIds: readonly string[],\n  query: string,\n): CommandSections {\n  const byId = new Map(rows.map((row) => [row.id, row]));\n  const recent = recentIds\n    .map((id) => byId.get(id))\n    .filter((row): row is CommandRow => row !== undefined);\n  const recentSet = new Set(recent.map((row) => row.id));\n  const others = rows.filter((row) => !recentSet.has(row.id));\n  if (!query) {\n    return { recent, others };\n  }\n  return { recent: matching(query, recent), others: ranked(query, others) };\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.replaceAll('_', '-'), {\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 { QuickOpenTarget } from '../../regions/content/tabs/quick-open-target';\nimport { ranked } from './palette-fuzzy';\nimport { formatRelativeTime } from './relative-time';\n\nexport interface TabRow {\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\nexport function tabRows(\n  targets: readonly QuickOpenTarget[],\n  translate: (key: string) => string,\n  locale: string,\n  now: number,\n): readonly TabRow[] {\n  return targets.map((tab) => ({\n    kind: 'tab',\n    id: tab.path,\n    label: tab.literalTitle ? tab.title : 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        ? undefined\n        : formatRelativeTime(locale, tab.lastActive, now),\n  }));\n}\n\nexport function tabResults(\n  rows: readonly TabRow[],\n  query: string,\n): readonly TabRow[] {\n  if (!query) {\n    return rows.toSorted((a, b) => (b.lastActive ?? 0) - (a.lastActive ?? 0));\n  }\n  return ranked(query, rows);\n}\n","import { inject, Service, signal } from '@angular/core';\nimport { WORKING_STATE_STORE } from '../../persistence/working-state-store';\nimport { hydrateAsync } from '../../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../../persistence/cross-tab/state-sync.service';\nimport { parseStored } from '../../persistence/stored-values/parse-stored';\n\nconst STORAGE_KEY = 'lw.shell.command-mru';\nconst LIMIT = 8;\n\nfunction parseRecentIds(raw: string | undefined): readonly string[] {\n  const parsed = parseStored(raw);\n  if (!Array.isArray(parsed)) {\n    return [];\n  }\n  const ids = parsed.filter((entry): entry is string => typeof entry === 'string');\n  return [...new Set(ids)].slice(0, LIMIT);\n}\n\n@Service()\nexport class RecentCommandsService {\n  private readonly store = inject(WORKING_STATE_STORE);\n  private readonly sync = inject(StateSyncService);\n\n  private readonly state = signal<readonly string[]>(\n    parseRecentIds(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(parseRecentIds(raw)),\n    );\n    this.sync.register('working-state', STORAGE_KEY, (raw) =>\n      this.state.set(parseRecentIds(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 {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  ElementRef,\n  computed,\n  inject,\n  signal,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Command, DialogRef } from '@loomweaver/plugin-sdk';\nimport { CommandService } from '../command.service';\nimport { CommandRow, commandRows, commandSections } from './command-rows';\nimport { TabRow, tabResults, tabRows } from './tab-rows';\nimport { RecentCommandsService } from './recent-commands.service';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport { ContentTabsService } from '../../regions/content/tabs/content-tabs.service';\nimport { MenuService } from '../../menu/menu.service';\nimport { SlotResolution } from '../../menu/slot-resolution.service';\nimport { MENU_ANCHOR_GAP } from '../../elements/menu/lw-menu.element';\nimport { TAB_CONTEXT_MENU } from '../../regions/content/tabs/tab-context-menu';\nimport { Wording } from '../../i18n/wording';\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\ntype PaletteRow = CommandRow | TabRow;\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 recentCommands = inject(RecentCommandsService);\n  private readonly contentTabs = inject(ContentTabsService);\n  private readonly menu = inject(MenuService);\n  private readonly slots = inject(SlotResolution);\n  private readonly element = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly recentlyUsed = inject(FeatureSwitches).commands.recentlyUsed;\n  private readonly wording = inject(Wording);\n\n  protected readonly mode: PaletteMode =\n    (this.ref.data as PaletteData | undefined)?.mode === 'tabs'\n      ? 'tabs'\n      : 'commands';\n  protected readonly title =\n    this.mode === 'tabs' ? 'palette.quickOpenTitle' : 'palette.title';\n  protected readonly query = signal('');\n  private readonly rawIndex = signal(0);\n\n  private readonly commandSections = computed(() =>\n    commandSections(\n      commandRows(\n        this.slots.resolve(\n          this.commands\n            .commands()\n            .filter((command) => this.offered(command))\n            .map((command) => ({ command: command.id })),\n          () => ({}),\n        ),\n        (key) => this.wording.translate(key),\n      ),\n      this.recentlyUsed() ? this.recentCommands.ids() : [],\n      this.query().trim(),\n    ),\n  );\n\n  private readonly tabResults = computed(() =>\n    tabResults(\n      tabRows(\n        this.contentTabs.quickOpenTargets(),\n        (key) => this.wording.translate(key),\n        this.wording.activeLang(),\n        Date.now(),\n      ),\n      this.query().trim(),\n    ),\n  );\n\n  protected readonly recentCount = computed(() =>\n    this.mode === 'tabs' ? 0 : this.commandSections().recent.length,\n  );\n\n  protected readonly results = computed<readonly PaletteRow[]>(() => {\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(row: PaletteRow): string | undefined {\n    return row.kind === 'command' ? row.shortcut : undefined;\n  }\n\n  protected timeOf(row: PaletteRow): string | undefined {\n    return row.kind === 'tab' ? row.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 row = this.results()[this.activeIndex()];\n    if (row) {\n      this.select(row);\n    }\n  }\n\n  protected select(row: PaletteRow): void {\n    if (row.kind === 'command') {\n      if (this.recentlyUsed()) {\n        this.recentCommands.record(row.id);\n      }\n      this.ref.close();\n      this.commands.execute(row.id);\n      return;\n    }\n    this.ref.close();\n    this.contentTabs.revealContentTab(row.navPath);\n  }\n\n  protected openTabActions(event: Event): void {\n    if (this.mode !== 'tabs') {\n      return;\n    }\n    const row = this.results()[this.activeIndex()];\n    if (row?.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: row.navPath,\n        closable: row.closable,\n        pinned: row.pinned,\n      },\n      at,\n    );\n  }\n\n  private offered(command: Command): boolean {\n    return command.id !== PALETTE_COMMAND_ID && !command.paletteHidden;\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]=\"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 (row of results(); track row.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(row)\"\n        (mouseenter)=\"setActive(i)\"\n      >\n        @if (row.icon; as icon) {\n          <lw-icon [name]=\"icon\" size=\"1rem\" class=\"text-content-muted\" />\n        }\n        <span class=\"flex-1 truncate\">{{ row.label }}</span>\n        @if (timeOf(row); as time) {\n          <span class=\"shrink-0 text-xs text-content-faint\">{{ time }}</span>\n        }\n        @if (shortcutOf(row); 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 { Disposable } from '@loomweaver/plugin-sdk';\nimport { DialogService } from '../../dialog/dialog.service';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport {\n  CommandPalette,\n  PALETTE_COMMAND_ID,\n  QUICK_OPEN_COMMAND_ID,\n} from './command-palette';\n\nfunction openPalette(\n  dialogs: DialogService,\n  title: string,\n  data?: { readonly mode: 'tabs' },\n): void {\n  dialogs.open(CommandPalette, {\n    bare: true,\n    size: 'lg',\n    align: 'top',\n    title,\n    ...(data && { data }),\n  });\n}\n\nexport function registerPaletteCommand(\n  registry: ContributionRegistry,\n  dialogs: DialogService,\n): Disposable {\n  return registry.addCommand({\n    id: PALETTE_COMMAND_ID,\n    title: 'palette.title',\n    icon: 'search',\n    shortcut: 'mod+k',\n    popout: true,\n    run: () => openPalette(dialogs, 'palette.title'),\n  });\n}\n\nexport function registerQuickOpenCommand(\n  registry: ContributionRegistry,\n  dialogs: DialogService,\n): Disposable {\n  return registry.addCommand({\n    id: QUICK_OPEN_COMMAND_ID,\n    title: 'palette.quickOpenTitle',\n    icon: 'openWork',\n    shortcut: 'mod+p',\n    run: () => openPalette(dialogs, 'palette.quickOpenTitle', { mode: 'tabs' }),\n  });\n}\n","import { Disposable } from '@loomweaver/plugin-sdk';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { PaneService } from './pane.service';\n\nconst CONTENT_SPLIT_RIGHT_COMMAND_ID = 'shell.content.splitRight';\n\nexport function registerSplitCommand(\n  registry: ContributionRegistry,\n  panes: PaneService,\n): Disposable {\n  return registry.addCommand({\n    id: CONTENT_SPLIT_RIGHT_COMMAND_ID,\n    title: 'content.split.open',\n    icon: 'splitPanes',\n    shortcut: 'mod+\\\\',\n    run: () => {\n      if (panes.isSplit()) {\n        panes.unsplit();\n        return;\n      }\n      panes.splitRight();\n    },\n  });\n}\n","import { LayoutRegion } from '../../layout/layout';\n\nexport const HIDDEN = 'hidden';\n\nexport interface CurationRow {\n  readonly id: string;\n  readonly label: string;\n  readonly icon?: string;\n  readonly initials?: string;\n  readonly place: string;\n}\n\nexport interface CurationSource {\n  regions(): LayoutRegion[];\n  rows(): CurationRow[];\n  place(row: CurationRow, place: string): void;\n}\n","import { inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { LayoutRegion, SHELL_LAYOUT } from '../../layout/layout';\nimport { regionsOfType } from '../../layout/layout-queries';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { SlotResolution } from '../../menu/slot-resolution.service';\nimport { WorkspaceService } from '../../workspace/workspace.service';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport {\n  RailItemsService,\n  workspaceRailItemId,\n} from '../rail/rail-items.service';\nimport { RailMoveService } from '../rail/rail-move.service';\nimport { CurationRow, CurationSource, HIDDEN } from './curation-source';\nimport { railMenuContext } from '../rail/rail-context-menu';\n\n@Service()\nexport class RailCuration implements CurationSource {\n  private readonly layout = inject(SHELL_LAYOUT);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly slots = inject(SlotResolution);\n  private readonly transloco = inject(TranslocoService);\n  private readonly railItems = inject(RailItemsService);\n  private readonly railMove = inject(RailMoveService);\n  private readonly workspaces = inject(WorkspaceService);\n  private readonly savedInRail = inject(FeatureSwitches).workspaces.savedInRail;\n\n  regions(): LayoutRegion[] {\n    return regionsOfType(this.layout, 'rail');\n  }\n\n  rows(): CurationRow[] {\n    const fallback = this.regions()[0]?.id ?? '';\n    const registered = this.slots\n      .resolve(this.registry.railItems(), (item) =>\n        railMenuContext(item.id, this.railItems.regionOf(item.id, item.rail ?? fallback)),\n      )\n      .map((entry) => entry.item)\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.placeOf(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.savedInRail() ? this.workspaces.workspaces() : [])\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.placeOf(workspaceRailItemId(workspace.id), fallback),\n      }));\n    return [...registered, ...saved];\n  }\n\n  place(row: CurationRow, place: string): void {\n    if (place === HIDDEN) {\n      this.railItems.hide(row.id);\n    } else {\n      this.railMove.move(row.id, place);\n    }\n  }\n\n  private placeOf(itemId: string, declaredRail: string): string {\n    return this.railItems.isVisible(itemId)\n      ? this.railItems.regionOf(itemId, declaredRail)\n      : HIDDEN;\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { LayoutRegion, SHELL_LAYOUT } from '../../layout/layout';\nimport { regionsOfType } from '../../layout/layout-queries';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { AuthContext } from '../../auth/auth-context';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { viewPanePath } from '../pane/tree/pane-address';\nimport { ViewVisibilityService } from '../panel/view-visibility.service';\nimport { CurationRow, CurationSource, HIDDEN } from './curation-source';\n\n@Service()\nexport class ViewCuration implements CurationSource {\n  private readonly layout = inject(SHELL_LAYOUT);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly auth = inject(AuthContext);\n  private readonly transloco = inject(TranslocoService);\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly visibility = inject(ViewVisibilityService);\n\n  regions(): LayoutRegion[] {\n    return regionsOfType(this.layout, 'panel');\n  }\n\n  rows(): 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  place(row: CurationRow, place: string): void {\n    if (place === HIDDEN) {\n      this.visibility.hide(row.id);\n    } else {\n      this.visibility.reveal(row.id, place);\n    }\n  }\n\n  private holderOf(viewId: string): string | null {\n    return this.paneTree.sourceOf(viewPanePath(viewId))?.dock ?? null;\n  }\n}\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  inject,\n  signal,\n} from '@angular/core';\nimport { TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { CurationRow, CurationSource, HIDDEN } from './curation-source';\nimport { RailCuration } from './rail-curation';\nimport { ViewCuration } from './view-curation';\n\nexport type CurationKind = 'rail' | 'views';\n\nexport interface CurationDialogData {\n  readonly kind: CurationKind;\n}\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 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 transloco = inject(TranslocoService);\n\n  protected readonly query = signal('');\n\n  private readonly kind =\n    (this.ref.data as CurationDialogData | undefined)?.kind ?? 'rail';\n\n  private readonly source = inject<CurationSource>(\n    this.kind === 'rail' ? RailCuration : ViewCuration,\n  );\n\n  protected readonly chrome = CURATION_CHROME[this.kind];\n\n  protected readonly places = computed<CurationPlace[]>(() => {\n    const regions = this.source.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.source.rows();\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      this.source.place(row, place);\n    }\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 { Disposable } from '@loomweaver/plugin-sdk';\nimport {\n  RAIL_CUSTOMIZE_COMMAND_ID,\n  VIEWS_CUSTOMIZE_COMMAND_ID,\n} from '../../commands/host-command-ids';\nimport { DialogService } from '../../dialog/dialog.service';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport {\n  CURATION_CHROME,\n  CurationDialog,\n  CurationKind,\n} from './curation-dialog';\n\nfunction openCuration(dialogs: DialogService, kind: CurationKind): void {\n  dialogs.open(CurationDialog, {\n    bare: true,\n    size: 'lg',\n    align: 'top',\n    title: CURATION_CHROME[kind].title,\n    data: { kind },\n  });\n}\n\nexport function registerRailCurationCommand(\n  registry: ContributionRegistry,\n  dialogs: DialogService,\n): Disposable {\n  return registry.addCommand({\n    id: RAIL_CUSTOMIZE_COMMAND_ID,\n    title: CURATION_CHROME.rail.title,\n    icon: CURATION_CHROME.rail.icon,\n    run: () => openCuration(dialogs, 'rail'),\n  });\n}\n\nexport function registerViewsCurationCommand(\n  registry: ContributionRegistry,\n  dialogs: DialogService,\n): Disposable {\n  return registry.addCommand({\n    id: VIEWS_CUSTOMIZE_COMMAND_ID,\n    title: CURATION_CHROME.views.title,\n    icon: CURATION_CHROME.views.icon,\n    run: () => openCuration(dialogs, 'views'),\n  });\n}\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport { Component, CUSTOM_ELEMENTS_SCHEMA, inject, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nexport interface AppResetChoice {\n  readonly workspaces: boolean;\n}\n\n@Component({\n  selector: 'lw-app-reset-dialog',\n  imports: [TranslocoPipe],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './app-reset-dialog.html',\n})\nexport class AppResetDialog {\n  private readonly ref = inject<DialogRef<AppResetChoice>>(DialogRef);\n\n  protected readonly offersWorkspaces =\n    (this.ref.data as { workspaces?: boolean } | undefined)?.workspaces === true;\n\n  protected readonly workspaces = signal(false);\n\n  protected cancel(): void {\n    this.ref.close();\n  }\n\n  protected confirm(): void {\n    this.ref.close({ workspaces: this.workspaces() });\n  }\n\n  protected toggleWorkspaces(event: Event): void {\n    this.workspaces.set((event.target as HTMLInputElement).checked);\n  }\n}\n","<div class=\"flex flex-col gap-4\">\n  <p class=\"text-sm whitespace-pre-line text-content\">\n    {{ 'appReset.confirm' | transloco }}\n  </p>\n\n  @if (offersWorkspaces) {\n    <label class=\"flex items-start gap-2 text-sm\">\n      <input\n        type=\"checkbox\"\n        class=\"lw-checkbox mt-0.5\"\n        [checked]=\"workspaces()\"\n        (change)=\"toggleWorkspaces($event)\"\n        data-testid=\"app-reset-workspaces\"\n      />\n      <span class=\"flex flex-col gap-0.5\">\n        <span>{{ 'appReset.includeWorkspaces' | transloco }}</span>\n        <span class=\"text-xs text-content-faint\">\n          {{ 'appReset.includeWorkspacesHint' | transloco }}\n        </span>\n      </span>\n    </label>\n  }\n\n  <div class=\"flex justify-end gap-2\">\n    <button type=\"button\" class=\"lw-btn\" (click)=\"cancel()\">\n      {{ 'dialog.cancel' | transloco }}\n    </button>\n    <button\n      type=\"button\"\n      class=\"lw-btn lw-btn--primary\"\n      (click)=\"confirm()\"\n      data-testid=\"app-reset-confirm\"\n    >\n      {{ 'appReset.title' | transloco }}\n    </button>\n  </div>\n</div>\n","import { TranslocoService } from '@jsverse/transloco';\nimport { Disposable } from '@loomweaver/plugin-sdk';\nimport { APP_RESET_COMMAND_ID } from '../../commands/host-command-ids';\nimport { DialogService } from '../../dialog/dialog.service';\nimport { FeatureSwitches } from '../../features/feature-switches.service';\nimport { AppResetChoice, AppResetDialog } from './app-reset-dialog';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { AppResetService } from './app-reset.service';\n\nexport interface AppResetCommandDeps {\n  readonly dialogs: DialogService;\n  readonly transloco: TranslocoService;\n  readonly features: FeatureSwitches;\n  readonly appReset: AppResetService;\n}\n\nexport function registerAppResetCommand(\n  registry: ContributionRegistry,\n  { dialogs, transloco, features, appReset }: AppResetCommandDeps,\n): Disposable {\n  return registry.addCommand({\n    id: APP_RESET_COMMAND_ID,\n    title: 'appReset.title',\n    icon: 'undo',\n    run: () => {\n      const ref = dialogs.open<AppResetChoice>(AppResetDialog, {\n        size: 'md',\n        title: transloco.translate('appReset.title'),\n        icon: 'undo',\n        data: { workspaces: features.workspaces.enabled() },\n      });\n      void ref.closed.then(async (choice) => {\n        if (choice === undefined) {\n          return;\n        }\n        await appReset.reset({ workspaces: choice.workspaces });\n      });\n    },\n  });\n}\n","import { Injector } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { ContributionRegistry } from './contributions/contribution-registry';\nimport { DialogService } from './dialog/dialog.service';\nimport { SettingsService } from './settings-dialog/settings.service';\nimport { registerOpenSettingsCommand } from './settings-dialog/settings-command';\nimport { WorkspaceService } from './workspace/workspace.service';\nimport { registerWorkspaceCommands } from './workspace/workspace-commands';\nimport {\n  registerPaletteCommand,\n  registerQuickOpenCommand,\n} from './commands/palette/palette-commands';\nimport { PaneService } from './regions/pane/pane.service';\nimport { registerSplitCommand } from './regions/pane/split-command';\nimport { PopoutService } from './popout/popout.service';\nimport { FeatureSwitches } from './features/feature-switches.service';\nimport { whileOn } from './features/while-on';\nimport {\n  registerRailCurationCommand,\n  registerViewsCurationCommand,\n} from './regions/curation/curation-commands';\nimport { AppResetService } from './regions/reset/app-reset.service';\nimport { registerAppResetCommand } from './regions/reset/app-reset-command';\nimport { ShellLayout } from './layout/layout';\nimport { hasRegionOfType } from './layout/layout-queries';\n\nexport interface HostCommandDeps {\n  readonly dialogs: DialogService;\n  readonly panes: PaneService;\n  readonly workspace: WorkspaceService;\n  readonly transloco: TranslocoService;\n  readonly settings: SettingsService;\n  readonly popout: PopoutService;\n  readonly appReset: AppResetService;\n  readonly features: FeatureSwitches;\n  readonly injector: Injector;\n}\n\nexport function registerHostCommands(\n  registry: ContributionRegistry,\n  layout: ShellLayout,\n  deps: HostCommandDeps,\n): void {\n  const { dialogs, features, injector } = deps;\n  registerPaletteCommand(registry, dialogs);\n  registerOpenSettingsCommand(registry, deps.settings);\n  if (deps.popout.active) {\n    return;\n  }\n  registerQuickOpenCommand(registry, dialogs);\n  if (hasRegionOfType(layout, 'rail')) {\n    whileOn(injector, features.rail.curate, () =>\n      registerRailCurationCommand(registry, dialogs),\n    );\n  }\n  if (hasRegionOfType(layout, 'panel')) {\n    whileOn(injector, features.sidebar.curate, () =>\n      registerViewsCurationCommand(registry, dialogs),\n    );\n  }\n  registerAppResetCommand(registry, deps);\n  whileOn(injector, features.content.splitRight, () =>\n    registerSplitCommand(registry, deps.panes),\n  );\n  whileOn(injector, features.workspaces.enabled, () =>\n    registerWorkspaceCommands(registry, deps),\n  );\n}\n","import { Injector } from '@angular/core';\nimport { ContributionRegistry } from './contributions/contribution-registry';\nimport { ViewStateService } from './views/view-state.service';\nimport { ViewInstanceService } from './views/view-instance.service';\nimport { ContentTabsService } from './regions/content/tabs/content-tabs.service';\nimport { registerTabContextMenu } from './regions/content/tabs/tab-context-menu';\nimport { PaneTreeService } from './regions/pane/tree/pane-tree.service';\nimport { PaneMoveService } from './regions/pane/drag/pane-move.service';\nimport {\n  registerViewMoveMenu,\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  registerRailHideMenu,\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 { FeatureSwitches } from './features/feature-switches.service';\nimport { whileOn } from './features/while-on';\nimport { ShellLayout } from './layout/layout';\nimport {\n  hasContentRegion,\n  hasRegionOfType,\n  sideCount,\n} from './layout/layout-queries';\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: FeatureSwitches;\n  readonly injector: Injector;\n}\n\nexport function registerBuiltInMenus(\n  registry: ContributionRegistry,\n  layout: ShellLayout,\n  deps: BuiltInMenuDeps,\n): void {\n  if (deps.popout.active) {\n    return;\n  }\n  registerTabContextMenu(registry, deps);\n  registerRailMenus(registry, layout, deps);\n  registerViewMenus(registry, layout, deps);\n}\n\nfunction registerRailMenus(\n  registry: ContributionRegistry,\n  layout: ShellLayout,\n  deps: BuiltInMenuDeps,\n): void {\n  const rail = deps.features.rail;\n  const hasRail = hasRegionOfType(layout, 'rail');\n  if (hasRail) {\n    whileOn(deps.injector, rail.hideItems, () =>\n      registerRailHideMenu(registry, deps.railItems),\n    );\n  }\n  if (sideCount(layout, 'rail') >= 2) {\n    whileOn(deps.injector, rail.moveItems, () =>\n      registerRailMoveMenu(registry, deps.railMove),\n    );\n  }\n  if (hasRail) {\n    whileOn(deps.injector, rail.curate, () =>\n      registerRailCustomizeMenu(registry),\n    );\n  }\n}\n\nfunction registerViewMenus(\n  registry: ContributionRegistry,\n  layout: ShellLayout,\n  deps: BuiltInMenuDeps,\n): void {\n  const sidebar = deps.features.sidebar;\n  whileOn(deps.injector, sidebar.resetViewState, () =>\n    registerViewResetMenu(registry, deps.viewStates, deps.viewInstances),\n  );\n  whileOn(deps.injector, deps.features.windows.popout, () =>\n    registerViewPopoutMenu(registry, deps.popout),\n  );\n  if (sideCount(layout, 'panel') >= 2) {\n    whileOn(deps.injector, sidebar.moveViews, () =>\n      registerViewMoveMenu(registry, deps.viewMove),\n    );\n  }\n  if (!hasRegionOfType(layout, 'panel')) {\n    return;\n  }\n  whileOn(deps.injector, sidebar.curate, () =>\n    registerViewCustomizeMenu(registry),\n  );\n  whileOn(deps.injector, sidebar.hideViews, () =>\n    registerViewHideMenu(registry, deps.viewVisibility),\n  );\n  whileOn(deps.injector, sidebar.stackViews, () =>\n    registerViewStackMenu(registry, deps.paneTree),\n  );\n  if (hasContentRegion(layout)) {\n    whileOn(deps.injector, sidebar.openViewInContent, () =>\n      registerViewOpenInContentMenu(registry, deps.paneTree),\n    );\n  }\n}\n","import { LwButtonSize, LwButtonVariant } from '@loomweaver/plugin-sdk';\nimport {\n  clickOnEnterOrSpace,\n  defineElementOnce,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\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 plugin's\n * own markup or a sandboxed surface, neither of which can import the directive. 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()\">Save</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  private readonly onKeydown = clickOnEnterOrSpace(this, () => this.disabled);\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 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  defineElementOnce(LW_BUTTON_TAG, LwButtonElement);\n}\n","import {\n  defineElementOnce,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\nimport { resolveIcon } from './icon-registry';\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 plugin's markup 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    this.refresh();\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  defineElementOnce(LW_ICON_TAG, LwIconElement);\n}\n","import DOMPurify from 'dompurify';\nimport { marked } from 'marked';\nimport {\n  defineElementOnce,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\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 where sanitising happens, as in the icon\n * registry). Reusable anywhere rich text is needed (dialog bodies, About, plugin content), and usable\n * in a plugin's markup by tag, without importing `@loomweaver/shell`.\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  defineElementOnce(LW_MARKDOWN_TAG, LwMarkdownElement);\n}\n","export function addressIsUnder(\n  shown: string | undefined,\n  named: string,\n): boolean {\n  if (shown === undefined) {\n    return false;\n  }\n  if (named === '') {\n    return true;\n  }\n  return shown === named || shown.startsWith(`${named}/`);\n}\n","import { LW_ICON_TAG } from '../icon/lw-icon.element';\n\nconst MANAGED = 'data-lw-nav-part';\n\nexport function managedPart(\n  host: HTMLElement,\n  part: string,\n  tag: string,\n): HTMLElement {\n  const existing = [...host.children].find(\n    (child) => child.getAttribute(MANAGED) === part,\n  );\n  if (existing instanceof HTMLElement && existing.localName === tag) {\n    return existing;\n  }\n  existing?.remove();\n  const created = document.createElement(tag);\n  created.setAttribute(MANAGED, part);\n  return created;\n}\n\nexport function dropManagedPart(host: HTMLElement, part: string): void {\n  managedPartIn(host, part)?.remove();\n}\n\nexport function managedPartIn(\n  host: HTMLElement,\n  part: string,\n): Element | undefined {\n  return [...host.children].find((child) => child.getAttribute(MANAGED) === part);\n}\n\nexport function setGlyph(host: HTMLElement, part: string, icon: string): void {\n  const glyph = managedPart(host, part, LW_ICON_TAG);\n  glyph.setAttribute('name', icon);\n  glyph.setAttribute('size', '1rem');\n  glyph.classList.add('lw-nav-glyph');\n  if (glyph.parentElement !== host) {\n    host.prepend(glyph);\n  }\n}\n","import {\n  clickOnEnterOrSpace,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\nimport {\n  dropManagedPart,\n  managedPart,\n  managedPartIn,\n  setGlyph,\n} from './nav-tree-parts';\n\n/** The custom-element tag. */\nexport const LW_NAV_ITEM_TAG = 'lw-nav-item';\n\n/**\n * `<lw-nav-item path=\"sales/quotes\" label=\"Quotes\" icon=\"quotes\">7</lw-nav-item>` — one destination\n * in a {@link LwNavTreeElement}, on its own or inside a {@link LwNavGroupElement}.\n *\n * The element **is** the row, so anything you put inside it stays on screen after the label: a\n * count, a dot, an amount. The workbench draws the glyph and the label and leaves your content\n * where you wrote it.\n *\n * `label` is displayed as given. The element translates nothing, so a consumer that changes\n * language supplies the changed text. `path` is the address the item stands for; the tree marks the\n * item the address it was told about lies at or under, so an item never decides that for itself.\n */\nexport class LwNavItemElement extends HTMLElement {\n  static readonly observedAttributes = ['path', 'label', 'icon'];\n\n  private readonly onKeydown = clickOnEnterOrSpace(this);\n\n  get path(): string {\n    return this.getAttribute('path') ?? '';\n  }\n\n  set path(value: string | null) {\n    reflectAttribute(this, 'path', value);\n  }\n\n  get label(): string {\n    return this.getAttribute('label') ?? '';\n  }\n\n  set label(value: string | null) {\n    reflectAttribute(this, 'label', value);\n  }\n\n  get icon(): string | null {\n    return this.getAttribute('icon');\n  }\n\n  set icon(value: string | null) {\n    reflectAttribute(this, 'icon', value);\n  }\n\n  connectedCallback(): void {\n    upgradeElementProperty(this, 'path');\n    upgradeElementProperty(this, 'label');\n    upgradeElementProperty(this, 'icon');\n    this.setAttribute('role', 'button');\n    this.classList.add('lw-nav-item');\n    this.tabIndex = 0;\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 render(): void {\n    const icon = this.icon;\n    if (icon) {\n      setGlyph(this, 'glyph', icon);\n    } else {\n      dropManagedPart(this, 'glyph');\n    }\n\n    const label = managedPart(this, 'label', 'span');\n    label.className = 'lw-nav-item-label';\n    label.textContent = this.label;\n    if (label.parentElement !== this) {\n      this.insertBefore(label, this.glyphEnd());\n    }\n  }\n\n  private glyphEnd(): ChildNode | null {\n    const glyph = managedPartIn(this, 'glyph');\n    return glyph ? glyph.nextSibling : this.firstChild;\n  }\n}\n","const shut = new Map<string, boolean>();\n\nexport function foldedShut(key: string, startsShut: boolean): boolean {\n  return shut.get(key) ?? startsShut;\n}\n\nexport function rememberFold(key: string, isShut: boolean): void {\n  shut.set(key, isShut);\n}\n\n/**\n * Forgets every fold a {@link LwNavGroupElement} is holding for this session.\n *\n * The memory is process-wide by design, so that a tree drawn again after leaving the screen finds\n * what the user left. That is also what makes one test leak into the next, which is what this is\n * for: call it between cases.\n */\nexport function forgetLwNavFolds(): void {\n  shut.clear();\n}\n","import { reflectAttribute, upgradeElementProperty } from '../custom-elements';\nimport { LW_ICON_TAG } from '../icon/lw-icon.element';\nimport { LW_NAV_ITEM_TAG } from './lw-nav-item.element';\nimport { foldedShut, rememberFold } from './nav-fold-state';\nimport { dropManagedPart, managedPart } from './nav-tree-parts';\n\n/** The custom-element tag. */\nexport const LW_NAV_GROUP_TAG = 'lw-nav-group';\n\n/**\n * `<lw-nav-group label=\"Customers\" key=\"sales/customers\">` — a named group of\n * {@link LwNavItemElement} children inside a {@link LwNavTreeElement}.\n *\n * A group you declare is always drawn as a group, including one holding a single item: the shape\n * follows what you wrote rather than a rule of thumb, so a sidebar does not change shape as its\n * contents change.\n *\n * It starts open unless `collapsed` says otherwise, and what the user folds is kept for as long as\n * the session lasts, under `key` — including the tree being taken off screen and drawn again. Give\n * `key` a value that outlives a language change and is unique across the trees a product draws;\n * without one the label is used, which is fine until the label is translated. Nothing is stored\n * beyond the session, so a reload starts from what you declared.\n *\n * A group holding no destinations is still drawn, because you declared it, but it offers no fold:\n * a control that opens nothing is a promise the group cannot keep.\n */\nexport class LwNavGroupElement extends HTMLElement {\n  static readonly observedAttributes = ['label', 'key', 'collapsed'];\n\n  private observer?: MutationObserver;\n\n  private drawnItems = -1;\n\n  get label(): string {\n    return this.getAttribute('label') ?? '';\n  }\n\n  set label(value: string | null) {\n    reflectAttribute(this, 'label', value);\n  }\n\n  get key(): string {\n    return this.getAttribute('key') ?? this.label;\n  }\n\n  set key(value: string | null) {\n    reflectAttribute(this, 'key', value);\n  }\n\n  get collapsed(): boolean {\n    return this.hasAttribute('collapsed');\n  }\n\n  set collapsed(value: boolean) {\n    this.toggleAttribute('collapsed', value);\n  }\n\n  get open(): boolean {\n    return this.itemCount() === 0 || !foldedShut(this.key, this.collapsed);\n  }\n\n  connectedCallback(): void {\n    upgradeElementProperty(this, 'label');\n    upgradeElementProperty(this, 'key');\n    upgradeElementProperty(this, 'collapsed');\n    this.classList.add('lw-nav-group');\n    this.observer = new MutationObserver(() => this.onChildren());\n    this.observer.observe(this, { childList: true });\n    this.render();\n  }\n\n  disconnectedCallback(): void {\n    this.observer?.disconnect();\n    this.observer = undefined;\n  }\n\n  attributeChangedCallback(): void {\n    if (this.isConnected) {\n      this.render();\n    }\n  }\n\n  toggle(): void {\n    if (this.itemCount() === 0) {\n      return;\n    }\n    const shuttingNow = this.open;\n    rememberFold(this.key, shuttingNow);\n    this.render();\n  }\n\n  private onChildren(): void {\n    if (this.itemCount() !== this.drawnItems) {\n      this.render();\n    }\n  }\n\n  private itemCount(): number {\n    return [...this.children].filter(\n      (child) => child.localName === LW_NAV_ITEM_TAG,\n    ).length;\n  }\n\n  private render(): void {\n    const items = this.itemCount();\n    this.drawnItems = items;\n    const heading = this.renderHeading(items);\n    this.renderChevron(heading, items);\n    this.renderLabel(heading);\n    this.dataset['open'] = String(this.open);\n  }\n\n  private renderHeading(items: number): HTMLElement {\n    const heading = managedPart(this, 'heading', 'button');\n    heading.className = 'lw-nav-group-heading';\n    heading.setAttribute('type', 'button');\n    heading.toggleAttribute('disabled', items === 0);\n    if (items === 0) {\n      heading.removeAttribute('aria-expanded');\n    } else {\n      heading.setAttribute('aria-expanded', String(this.open));\n    }\n    if (heading.parentElement !== this) {\n      heading.addEventListener('click', () => this.toggle());\n      this.prepend(heading);\n    }\n    return heading;\n  }\n\n  private renderChevron(heading: HTMLElement, items: number): void {\n    if (items === 0) {\n      dropManagedPart(heading, 'chevron');\n      return;\n    }\n    const chevron = managedPart(heading, 'chevron', LW_ICON_TAG);\n    chevron.setAttribute('name', 'chevronDown');\n    chevron.setAttribute('size', '0.875rem');\n    chevron.className = 'lw-nav-chevron';\n    if (chevron.parentElement !== heading) {\n      heading.prepend(chevron);\n    }\n  }\n\n  private renderLabel(heading: HTMLElement): void {\n    const label = managedPart(heading, 'label', 'span');\n    label.className = 'lw-nav-group-label';\n    label.textContent = this.label;\n    if (label.parentElement !== heading) {\n      heading.append(label);\n    }\n  }\n}\n","import { addressIsUnder } from '../../addressing/address-is-under';\nimport {\n  defineElementOnce,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\nimport { LW_NAV_GROUP_TAG, LwNavGroupElement } from './lw-nav-group.element';\nimport { LW_NAV_ITEM_TAG, LwNavItemElement } from './lw-nav-item.element';\n\n/** The custom-element tag. */\nexport const LW_NAV_TREE_TAG = 'lw-nav-tree';\n\n/** The event a tree fires when the user chooses a destination. Its detail carries `{ path }`. */\nexport const LW_NAV_SELECT = 'lw-nav-select';\n\n/**\n * `<lw-nav-tree current=\"sales/quotes/q-0006\">` — the workbench's sidebar navigation, declared as\n * markup: {@link LwNavGroupElement} and {@link LwNavItemElement} children, in the order you want\n * them drawn.\n *\n *     <lw-nav-tree current=\"sales/quotes/q-0006\">\n *       <lw-nav-group label=\"Customers\" key=\"sales/customers\">\n *         <lw-nav-item path=\"sales/customers\" label=\"Customer list\" icon=\"customerList\"></lw-nav-item>\n *       </lw-nav-group>\n *       <lw-nav-item path=\"sales/quotes\" label=\"Quotes\" icon=\"quotes\"></lw-nav-item>\n *     </lw-nav-tree>\n *\n * Tell it the address being shown through `current`, and it marks the item that address lies at or\n * under, applying the segment rule the workbench applies when a plugin asks the same question: an\n * address is under `sales/quotes` when it is that address or continues past a `/`, so\n * `sales/quotesomething` is not. Where several items match, the longest one is marked, and never\n * more than one.\n *\n * It navigates nothing. Choosing a destination fires {@link LW_NAV_SELECT} carrying the item's\n * `path`, and what that means is yours to decide.\n */\nexport class LwNavTreeElement extends HTMLElement {\n  static readonly observedAttributes = ['current'];\n\n  private observer?: MutationObserver;\n\n  get current(): string | null {\n    return this.getAttribute('current');\n  }\n\n  set current(value: string | null) {\n    reflectAttribute(this, 'current', value);\n  }\n\n  connectedCallback(): void {\n    upgradeElementProperty(this, 'current');\n    this.setAttribute('role', 'navigation');\n    this.classList.add('lw-nav-tree');\n    this.addEventListener('click', this.onClick);\n    this.observer = new MutationObserver(() => this.mark());\n    this.observer.observe(this, {\n      childList: true,\n      subtree: true,\n      attributeFilter: ['path'],\n    });\n    this.mark();\n  }\n\n  disconnectedCallback(): void {\n    this.removeEventListener('click', this.onClick);\n    this.observer?.disconnect();\n    this.observer = undefined;\n  }\n\n  attributeChangedCallback(): void {\n    if (this.isConnected) {\n      this.mark();\n    }\n  }\n\n  private readonly onClick = (event: Event) => {\n    const item = (\n      event.target as HTMLElement | null\n    )?.closest<LwNavItemElement>(LW_NAV_ITEM_TAG);\n    if (!item || !this.owns(item)) {\n      return;\n    }\n    this.dispatchEvent(\n      new CustomEvent(LW_NAV_SELECT, {\n        detail: { path: pathOf(item) },\n        bubbles: true,\n      }),\n    );\n  };\n\n  private mark(): void {\n    const items = this.items();\n    const shown = this.current ?? undefined;\n    const marked = longestMatch(\n      items.map((item) => pathOf(item)),\n      (path) => addressIsUnder(shown, path),\n    );\n\n    for (const item of items) {\n      if (marked !== null && pathOf(item) === marked) {\n        item.setAttribute('aria-current', 'page');\n      } else {\n        item.removeAttribute('aria-current');\n      }\n    }\n  }\n\n  private items(): LwNavItemElement[] {\n    return [...this.querySelectorAll<LwNavItemElement>(LW_NAV_ITEM_TAG)].filter(\n      (item) => this.owns(item),\n    );\n  }\n\n  private owns(item: LwNavItemElement): boolean {\n    return item.closest(LW_NAV_TREE_TAG) === this;\n  }\n}\n\nfunction pathOf(item: Element): string {\n  return item.getAttribute('path') ?? '';\n}\n\nfunction longestMatch(\n  candidates: readonly string[],\n  matches: (candidate: string) => boolean,\n): string | null {\n  let best: string | null = null;\n  for (const candidate of candidates) {\n    if (\n      matches(candidate) &&\n      (best === null || candidate.length > best.length)\n    ) {\n      best = candidate;\n    }\n  }\n  return best;\n}\n\n/** Registers `<lw-nav-tree>`, `<lw-nav-group>` and `<lw-nav-item>` once (idempotent). */\nexport function defineLwNavTree(): void {\n  defineElementOnce(LW_NAV_ITEM_TAG, LwNavItemElement);\n  defineElementOnce(LW_NAV_GROUP_TAG, LwNavGroupElement);\n  defineElementOnce(LW_NAV_TREE_TAG, LwNavTreeElement);\n}\n","import { defineElementOnce, numberAttribute } from '../custom-elements';\nexport 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 render(): void {\n    const max = Math.max(numberAttribute(this, 'max', 100), 1);\n    const value = Math.min(Math.max(numberAttribute(this, '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\n/** Registers `<lw-progress-ring>` once (idempotent), called from {@link provideShell} at bootstrap. */\nexport function defineLwProgressRing(): void {\n  defineElementOnce(LW_PROGRESS_RING_TAG, LwProgressRingElement);\n}\n","import { reflectAttribute, upgradeElementProperty } from '../custom-elements';\n\nexport const LW_OPTION_TAG = 'lw-option';\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","import { hasIcon } from '../icon/icon-registry';\nimport { LW_ICON_TAG } from '../icon/lw-icon.element';\nimport { LW_OPTION_TAG } from './lw-option.element';\n\nexport interface Choice {\n  readonly value: string;\n  readonly label: string;\n  readonly icon: string | null;\n  readonly disabled: boolean;\n}\n\nexport interface TriggerParts {\n  readonly trigger: HTMLButtonElement;\n  readonly labelPart: HTMLSpanElement;\n  readonly valueSlot: HTMLSpanElement;\n}\n\nexport interface TriggerOptions {\n  readonly anchorName: string;\n  readonly listboxId: string;\n  readonly labelId: string;\n  readonly onToggle: () => void;\n  readonly onKeydown: (event: KeyboardEvent) => void;\n}\n\nexport interface ListboxOptions {\n  readonly anchorName: string;\n  readonly listboxId: string;\n}\n\nexport interface OptionRowOptions {\n  readonly choice: Choice;\n  readonly id: string;\n  readonly selected: boolean;\n  readonly onPick: () => void;\n  readonly onHover: () => void;\n}\n\nexport function readChoices(host: HTMLElement): Choice[] {\n  return [...host.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\nexport function createTrigger(options: TriggerOptions): TriggerParts {\n  const trigger = document.createElement('button');\n  trigger.type = 'button';\n  trigger.className = 'lw-select-trigger';\n  trigger.setAttribute('role', 'combobox');\n  trigger.setAttribute('aria-haspopup', 'listbox');\n  trigger.setAttribute('aria-expanded', 'false');\n  trigger.setAttribute('aria-controls', options.listboxId);\n  trigger.style.setProperty('anchor-name', options.anchorName);\n  trigger.addEventListener('click', options.onToggle);\n  trigger.addEventListener('keydown', options.onKeydown);\n\n  const labelPart = createHiddenText('');\n  labelPart.id = options.labelId;\n  labelPart.hidden = true;\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  return { trigger, labelPart, valueSlot };\n}\n\nexport function createListbox(options: ListboxOptions): HTMLDivElement {\n  const listbox = document.createElement('div');\n  listbox.id = options.listboxId;\n  listbox.className = 'lw-select-listbox';\n  listbox.setAttribute('role', 'listbox');\n  listbox.hidden = true;\n  listbox.style.setProperty('position-anchor', options.anchorName);\n  listbox.addEventListener('mousedown', (event) => event.preventDefault());\n  return listbox;\n}\n\nexport function fillValueSlot(\n  slot: HTMLSpanElement,\n  text: string,\n  icon: string | null,\n  iconOnly: boolean,\n): void {\n  slot.textContent = '';\n  if (icon) {\n    slot.append(createGlyph(icon));\n  }\n  if (icon && iconOnly) {\n    slot.append(createHiddenText(text));\n  } else {\n    slot.append(document.createTextNode(text));\n  }\n}\n\nexport function createOptionRow(options: OptionRowOptions): HTMLDivElement {\n  const choice = options.choice;\n  const row = document.createElement('div');\n  row.className = 'lw-select-option';\n  row.setAttribute('role', 'option');\n  row.id = options.id;\n  row.dataset['value'] = choice.value;\n  row.setAttribute('aria-selected', String(options.selected));\n  if (choice.disabled) {\n    row.setAttribute('aria-disabled', 'true');\n  }\n  if (choice.icon) {\n    row.append(createGlyph(choice.icon));\n  }\n  row.append(document.createTextNode(choice.label));\n  row.addEventListener('click', () => {\n    if (!choice.disabled) {\n      options.onPick();\n    }\n  });\n  row.addEventListener('pointermove', options.onHover);\n  return row;\n}\n\nfunction createHiddenText(text: string): HTMLSpanElement {\n  const hidden = document.createElement('span');\n  hidden.className = 'lw-select-hidden';\n  hidden.textContent = text;\n  return hidden;\n}\n\nfunction createGlyph(icon: string): HTMLSpanElement {\n  const glyph = document.createElement('span');\n  glyph.className = 'lw-select-glyph';\n  glyph.setAttribute('aria-hidden', 'true');\n  if (hasIcon(icon)) {\n    const drawn = document.createElement(LW_ICON_TAG);\n    drawn.setAttribute('name', icon);\n    drawn.setAttribute('size', '1rem');\n    glyph.append(drawn);\n  } else {\n    glyph.textContent = icon;\n  }\n  return glyph;\n}\n","export const FORWARDED_STATE = ['aria-invalid', 'aria-describedby'] as const;\n\nexport interface NamedParts {\n  readonly trigger: HTMLButtonElement;\n  readonly labelPart: HTMLSpanElement;\n  readonly listbox?: HTMLDivElement;\n}\n\nexport function syncAccessibleName(host: HTMLElement, parts: NamedParts): void {\n  const { trigger, labelPart, listbox } = parts;\n  const ownLabel = host.getAttribute('aria-labelledby');\n  const label = host.getAttribute('label') ?? host.getAttribute('aria-label');\n  labelPart.textContent = ownLabel === null ? (label ?? '') : '';\n  const labelIds = ownLabel ?? (label === null ? null : labelPart.id);\n  trigger.removeAttribute('aria-label');\n  setOrRemove(trigger, 'aria-labelledby', labelIds);\n  if (!listbox) {\n    return;\n  }\n\n  setOrRemove(listbox, 'aria-labelledby', ownLabel);\n  setOrRemove(listbox, 'aria-label', ownLabel === null ? label : null);\n}\n\nexport function forwardState(host: HTMLElement, trigger: HTMLElement): void {\n  for (const name of FORWARDED_STATE) {\n    setOrRemove(trigger, name, host.getAttribute(name));\n  }\n  setOrRemove(\n    trigger,\n    'aria-required',\n    host.hasAttribute('required') ? 'true' : null,\n  );\n}\n\nfunction setOrRemove(\n  element: HTMLElement,\n  name: string,\n  value: string | null,\n): void {\n  if (value === null) {\n    element.removeAttribute(name);\n  } else {\n    element.setAttribute(name, value);\n  }\n}\n","import { rovingStep } from '../roving-focus';\nimport { Choice } from './lw-select-parts';\n\nconst TYPEAHEAD_RESET_MS = 500;\n\nexport class Typeahead {\n  private typed = '';\n\n  private timer?: ReturnType<typeof setTimeout>;\n\n  match(choices: readonly Choice[], char: string): number | undefined {\n    this.typed += char.toLowerCase();\n    this.clear();\n    this.timer = setTimeout(() => (this.typed = ''), TYPEAHEAD_RESET_MS);\n    const match = choices.findIndex(\n      (choice) =>\n        !choice.disabled && choice.label.toLowerCase().startsWith(this.typed),\n    );\n    return match === -1 ? undefined : match;\n  }\n\n  clear(): void {\n    if (this.timer !== undefined) {\n      clearTimeout(this.timer);\n    }\n  }\n}\n\nexport function isPrintable(event: KeyboardEvent): boolean {\n  return (\n    event.key.length === 1 &&\n    event.key !== ' ' &&\n    !event.ctrlKey &&\n    !event.metaKey &&\n    !event.altKey\n  );\n}\n\nexport function selectedIndex(\n  choices: readonly Choice[],\n  value: string | null,\n): number {\n  const selected = choices.findIndex((choice) => choice.value === value);\n  return selected === -1 ? (enabledIndices(choices)[0] ?? 0) : selected;\n}\n\nexport function stepOverEnabled(\n  choices: readonly Choice[],\n  key: string,\n  active: number,\n): number | undefined {\n  const enabled = enabledIndices(choices);\n  const next = rovingStep(\n    key,\n    enabled.indexOf(active),\n    enabled.length,\n    'vertical',\n  );\n  return next === undefined ? undefined : enabled[next];\n}\n\nexport function openingIndex(\n  event: KeyboardEvent,\n  choices: readonly Choice[],\n  value: string | null,\n  typeahead: Typeahead,\n): number | undefined {\n  switch (event.key) {\n    case 'ArrowDown':\n    case 'ArrowUp':\n    case 'Enter':\n    case ' ': {\n      return selectedIndex(choices, value);\n    }\n    case 'Home': {\n      return enabledIndices(choices)[0];\n    }\n    case 'End': {\n      return enabledIndices(choices).at(-1);\n    }\n    default: {\n      return isPrintable(event)\n        ? (typeahead.match(choices, event.key) ?? selectedIndex(choices, value))\n        : undefined;\n    }\n  }\n}\n\nfunction enabledIndices(choices: readonly Choice[]): number[] {\n  return choices.flatMap((choice, index) => (choice.disabled ? [] : [index]));\n}\n","import {\n  defineElementOnce,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\nimport { LW_OPTION_TAG, LwOptionElement } from './lw-option.element';\nimport {\n  Choice,\n  createListbox,\n  createOptionRow,\n  createTrigger,\n  fillValueSlot,\n  readChoices,\n} from './lw-select-parts';\nimport {\n  FORWARDED_STATE,\n  forwardState,\n  syncAccessibleName,\n} from './lw-select-name';\nimport {\n  isPrintable,\n  openingIndex,\n  selectedIndex,\n  stepOverEnabled,\n  Typeahead,\n} from './lw-select-keys';\n\nexport const LW_SELECT_TAG = 'lw-select';\n\nexport const LW_SELECT_CHANGE = 'lw-select-change';\n\nlet nextSelectId = 0;\n\nexport class LwSelectElement extends HTMLElement {\n  static readonly observedAttributes = [\n    'value',\n    'label',\n    'placeholder',\n    'disabled',\n    'compact',\n    'required',\n    'aria-label',\n    'aria-labelledby',\n    ...FORWARDED_STATE,\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 isOpen = false;\n\n  private activeIndex = 0;\n\n  private readonly typeahead = new Typeahead();\n\n  private trigger?: HTMLButtonElement;\n\n  private labelPart?: HTMLSpanElement;\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  get compact(): boolean {\n    return this.hasAttribute('compact');\n  }\n\n  set compact(value: boolean) {\n    this.toggleAttribute('compact', value);\n  }\n\n  get required(): boolean {\n    return this.hasAttribute('required');\n  }\n\n  set required(value: boolean) {\n    this.toggleAttribute('required', value);\n  }\n\n  connectedCallback(): void {\n    upgradeElementProperty(this, 'value');\n    upgradeElementProperty(this, 'required');\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    this.typeahead.clear();\n  }\n\n  attributeChangedCallback(name: string): void {\n    if (!this.trigger) {\n      return;\n    }\n\n    this.syncTrigger();\n    if (name === 'disabled' && this.hasAttribute('disabled')) {\n      this.dismiss();\n    }\n  }\n\n  private readonly onOutsidePointer = (event: PointerEvent) => {\n    if (!this.contains(event.target as Node)) {\n      this.dismiss();\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 withoutObserving(change: () => void): void {\n    this.observer?.disconnect();\n    try {\n      change();\n    } finally {\n      this.observe();\n    }\n  }\n\n  private choices(): Choice[] {\n    return readChoices(this);\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, labelPart, valueSlot } = createTrigger({\n      anchorName: this.anchorName,\n      listboxId: this.listboxId,\n      labelId: `lw-select-label-${this.selectId}`,\n      onToggle: () => this.toggle(),\n      onKeydown: (event) => this.onTriggerKeydown(event),\n    });\n    const listbox = createListbox({\n      anchorName: this.anchorName,\n      listboxId: this.listboxId,\n    });\n\n    this.append(labelPart, trigger, listbox);\n    this.trigger = trigger;\n    this.labelPart = labelPart;\n    this.valueSlot = valueSlot;\n    this.listbox = listbox;\n  }\n\n  private syncTrigger(): void {\n    const trigger = this.trigger;\n    const labelPart = this.labelPart;\n    const valueSlot = this.valueSlot;\n    if (!trigger || !labelPart || !valueSlot) {\n      return;\n    }\n    const selected = this.selectedChoice();\n    const text = selected?.label ?? this.getAttribute('placeholder') ?? '';\n    const iconOnly = this.compact && selected?.icon != null;\n    this.withoutObserving(() => {\n      trigger.disabled = this.hasAttribute('disabled');\n      syncAccessibleName(this, {\n        trigger,\n        labelPart,\n        listbox: this.listbox,\n      });\n      forwardState(this, trigger);\n      fillValueSlot(valueSlot, text, selected?.icon ?? null, iconOnly);\n    });\n  }\n\n  private toggle(): void {\n    if (this.isOpen) {\n      this.close();\n    } else {\n      this.openListbox();\n    }\n  }\n\n  private openListbox(start = selectedIndex(this.choices(), this.value)): void {\n    const listbox = this.listbox;\n    const trigger = this.trigger;\n    if (this.isOpen || this.hasAttribute('disabled') || !listbox || !trigger) {\n      return;\n    }\n    this.renderOptions();\n    this.isOpen = true;\n    this.withoutObserving(() => {\n      listbox.hidden = false;\n      trigger.setAttribute('aria-expanded', 'true');\n    });\n    this.setActive(start);\n\n    document.addEventListener('pointerdown', this.onOutsidePointer, {\n      capture: true,\n    });\n  }\n\n  private close(): void {\n    if (this.collapse()) {\n      this.trigger?.focus();\n    }\n  }\n\n  private dismiss(): void {\n    this.collapse();\n  }\n\n  private collapse(): boolean {\n    const listbox = this.listbox;\n    const trigger = this.trigger;\n    if (!this.isOpen || !listbox || !trigger) {\n      return false;\n    }\n    this.isOpen = false;\n    this.withoutObserving(() => {\n      listbox.hidden = true;\n      listbox.replaceChildren();\n      trigger.setAttribute('aria-expanded', 'false');\n      trigger.removeAttribute('aria-activedescendant');\n    });\n    document.removeEventListener('pointerdown', this.onOutsidePointer, true);\n    return true;\n  }\n\n  private renderOptions(): void {\n    const listbox = this.listbox;\n    if (!listbox) {\n      return;\n    }\n    const rows = this.choices().map((choice, index) =>\n      createOptionRow({\n        choice,\n        id: `${this.listboxId}-opt-${index}`,\n        selected: choice.value === this.value,\n        onPick: () => this.commit(choice.value),\n        onHover: () => this.setActive(index),\n      }),\n    );\n    this.withoutObserving(() => listbox.replaceChildren(...rows));\n  }\n\n  private setActive(index: number): void {\n    const trigger = this.trigger;\n    if (!this.listbox || !trigger) {\n      return;\n    }\n    const rows = [...this.listbox.children] as HTMLElement[];\n    if (rows.length === 0) {\n      return;\n    }\n    this.activeIndex = Math.max(0, Math.min(index, rows.length - 1));\n    const active = rows[this.activeIndex];\n    this.withoutObserving(() => {\n      for (const [rowIndex, row] of rows.entries()) {\n        row.classList.toggle('is-active', rowIndex === this.activeIndex);\n      }\n      trigger.setAttribute('aria-activedescendant', active.id);\n    });\n    active.scrollIntoView?.({ block: 'nearest' });\n  }\n\n  private onTriggerKeydown(event: KeyboardEvent): void {\n    if (this.isOpen) {\n      this.onOpenKeydown(event);\n    } else {\n      this.onClosedKeydown(event);\n    }\n  }\n\n  private onClosedKeydown(event: KeyboardEvent): void {\n    const start = openingIndex(\n      event,\n      this.choices(),\n      this.value,\n      this.typeahead,\n    );\n    if (start === undefined) {\n      return;\n    }\n    event.preventDefault();\n    this.openListbox(start);\n  }\n\n  private onOpenKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Tab') {\n      this.dismiss();\n      return;\n    }\n    if (this.handleOpenKey(event)) {\n      event.preventDefault();\n    }\n  }\n\n  private handleOpenKey(event: KeyboardEvent): boolean {\n    if (event.key === 'ArrowUp' && event.altKey) {\n      this.commitActive();\n      return true;\n    }\n    const step = stepOverEnabled(this.choices(), event.key, this.activeIndex);\n    if (step !== undefined) {\n      this.setActive(step);\n      return true;\n    }\n    switch (event.key) {\n      case 'Enter':\n      case ' ': {\n        this.commitActive();\n        return true;\n      }\n      case 'Escape': {\n        this.close();\n        return true;\n      }\n      default: {\n        return this.typeIfPrintable(event);\n      }\n    }\n  }\n\n  private typeIfPrintable(event: KeyboardEvent): boolean {\n    if (!isPrintable(event)) {\n      return false;\n    }\n    const match = this.typeahead.match(this.choices(), event.key);\n    if (match !== undefined) {\n      this.setActive(match);\n    }\n    return true;\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\n/** Registers `<lw-select>` and `<lw-option>` once (idempotent), called from {@link provideShell} at bootstrap. */\nexport function defineLwSelect(): void {\n  defineElementOnce(LW_OPTION_TAG, LwOptionElement);\n  defineElementOnce(LW_SELECT_TAG, LwSelectElement);\n}\n","import {\n  defineElementOnce,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\n\n/** The custom-element tag. */\nexport const LW_SPINNER_TAG = 'lw-spinner';\n\nconst DEFAULT_SIZE = '1.5rem';\n\n/**\n * `<lw-spinner size=\"1rem\" label=\"…\">` — the busy indicator as a framework-agnostic custom element:\n * a plain `HTMLElement`, **light DOM**, drawing one `.lw-spinner-ring`. The element is brand-coloured\n * unless you give it a text colour; the ring class itself takes the colour around it, so a ring you\n * draw by hand with that class keeps yours. Usable in a plugin's markup by tag, without importing\n * `@loomweaver/shell`, and in an isolated surface.\n *\n * `size` is a CSS length (width = height, default `1.5rem`); a bare number is invalid and the\n * browser discards it. `label` is the accessible name announced with `role=\"status\"` — pass a\n * translated string, or leave it out where the surrounding text already says what is running.\n * Both are attributes and properties alike. For a known amount of progress use\n * `<lw-progress-ring>` instead.\n */\nexport class LwSpinnerElement extends HTMLElement {\n  static readonly observedAttributes = ['size', 'label'];\n\n  private ring?: HTMLElement;\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  get label(): string {\n    return this.getAttribute('label') ?? '';\n  }\n  set label(value: string | null) {\n    reflectAttribute(this, 'label', value);\n  }\n\n  connectedCallback(): void {\n    upgradeElementProperty(this, 'size');\n    upgradeElementProperty(this, 'label');\n    if (!this.ring) {\n      this.ring = document.createElement('span');\n      this.ring.className = 'lw-spinner-ring';\n      this.ring.setAttribute('role', 'status');\n      this.append(this.ring);\n    }\n    this.render(this.ring);\n  }\n\n  attributeChangedCallback(): void {\n    if (this.ring) {\n      this.render(this.ring);\n    }\n  }\n\n  private render(ring: HTMLElement): void {\n    ring.style.width = this.size;\n    ring.style.height = this.size;\n    reflectAttribute(ring, 'aria-label', this.label || null);\n  }\n}\n\n/** Registers `<lw-spinner>` once (idempotent), called from {@link provideShell} at bootstrap. */\nexport function defineLwSpinner(): void {\n  defineElementOnce(LW_SPINNER_TAG, LwSpinnerElement);\n}\n","import { clampIntoViewport, VIEWPORT_MARGIN } from '../viewport-fit';\nimport {\n  defineElementOnce,\n  numberAttribute,\n  reflectAttribute,\n  upgradeElementProperty,\n} from '../custom-elements';\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;\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 a plugin that imports only the SDK uses it\n * by tag (`<lw-tooltip text=\"…\" position=\"bottom\">`), and a sandboxed surface gets it from the frame\n * kit.\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. 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`, and is a class contract of its own: on an element a\n * product places itself it carries the look without the placement. Place the element as the last child\n * 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 readonly onEscape = (event: KeyboardEvent) => {\n    if (event.key !== 'Escape') {\n      return;\n    }\n    this.hide();\n    event.preventDefault();\n    event.stopPropagation();\n  };\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 delay = numberAttribute(this, 'delay-ms', DEFAULT_DELAY_MS);\n    return delay >= 0 ? delay : 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    document.addEventListener('keydown', this.onEscape, { capture: true });\n    this.placeBubble(bubble);\n  }\n\n  private placeBubble(bubble: HTMLElement): void {\n    const bubbleRect = bubble.getBoundingClientRect();\n    const placement = this.pointer\n      ? cursorPlacement(bubbleRect, this.pointer)\n      : this.trigger &&\n        triggerPlacement(\n          bubbleRect,\n          this.trigger.getBoundingClientRect(),\n          this.position,\n        );\n    if (!placement) {\n      return;\n    }\n    const left = clampIntoViewport(\n      placement.left,\n      bubbleRect.width,\n      window.innerWidth,\n    );\n    const top = clampIntoViewport(\n      placement.top,\n      bubbleRect.height,\n      window.innerHeight,\n    );\n    bubble.style.left = `${Math.round(left)}px`;\n    bubble.style.top = `${Math.round(top)}px`;\n  }\n\n  private hide(): void {\n    this.clearTimer();\n    document.removeEventListener('keydown', this.onEscape, { capture: true });\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      return;\n    }\n\n    clearTimeout(this.showTimer);\n    this.showTimer = undefined;\n  }\n}\n\ninterface Placement {\n  readonly left: number;\n  readonly top: number;\n}\n\nfunction cursorPlacement(\n  bubbleRect: DOMRect,\n  pointer: { readonly x: number; readonly y: number },\n): Placement {\n  const below = pointer.y + CURSOR_BELOW_Y;\n  const fitsBelow =\n    below + bubbleRect.height + VIEWPORT_MARGIN <= window.innerHeight;\n  return {\n    left: pointer.x + CURSOR_OFFSET_X,\n    top: fitsBelow ? below : pointer.y - bubbleRect.height - CURSOR_ABOVE_GAP,\n  };\n}\n\nfunction triggerPlacement(\n  bubbleRect: DOMRect,\n  triggerRect: DOMRect,\n  position: TooltipPosition,\n): Placement {\n  const centeredLeft =\n    triggerRect.left + triggerRect.width / 2 - bubbleRect.width / 2;\n  const centeredTop =\n    triggerRect.top + triggerRect.height / 2 - bubbleRect.height / 2;\n  switch (position) {\n    case 'bottom': {\n      return { left: centeredLeft, top: triggerRect.bottom + TOOLTIP_GAP };\n    }\n    case 'left': {\n      return {\n        left: triggerRect.left - bubbleRect.width - TOOLTIP_GAP,\n        top: centeredTop,\n      };\n    }\n    case 'right': {\n      return { left: triggerRect.right + TOOLTIP_GAP, top: centeredTop };\n    }\n    default: {\n      return {\n        left: centeredLeft,\n        top: triggerRect.top - bubbleRect.height - TOOLTIP_GAP,\n      };\n    }\n  }\n}\n\n/** Registers `<lw-tooltip>` once (idempotent) — called from {@link provideShell} at bootstrap. */\nexport function defineLwTooltip(): void {\n  defineElementOnce(LW_TOOLTIP_TAG, LwTooltipElement);\n}\n","import { defineLwButton } from './button/lw-button.element';\nimport { defineLwIcon } from './icon/lw-icon.element';\nimport { defineLwMarkdown } from './markdown/lw-markdown.element';\nimport { defineLwMenu } from './menu/lw-menu.element';\nimport { defineLwNavTree } from './nav-tree/lw-nav-tree.element';\nimport { defineLwProgressRing } from './progress/lw-progress-ring.element';\nimport { defineLwSelect } from './select/lw-select.element';\nimport { defineLwSpinner } from './spinner/lw-spinner.element';\nimport { defineLwTooltip } from './tooltip/lw-tooltip.element';\nimport { defineLwToolbar } from './toolbar/lw-toolbar.element';\n\nexport const LW_ELEMENT_DEFINITIONS: readonly (() => void)[] = [\n  defineLwIcon,\n  defineLwTooltip,\n  defineLwSelect,\n  defineLwNavTree,\n  defineLwMenu,\n  defineLwMarkdown,\n  defineLwButton,\n  defineLwProgressRing,\n  defineLwSpinner,\n  defineLwToolbar,\n];\n\nexport function defineLwElements(): void {\n  for (const define of LW_ELEMENT_DEFINITIONS) {\n    define();\n  }\n}\n","import {\n  EnvironmentProviders,\n  ErrorHandler,\n  inject,\n  InjectionToken,\n  Injector,\n  isDevMode,\n  provideBrowserGlobalErrorListeners,\n  provideEnvironmentInitializer,\n  Provider,\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 {\n  detectInitialLanguage,\n  FALLBACK_LANGUAGE,\n  resolveServedLanguages,\n  SERVED_LANGUAGES,\n} from './i18n/served-languages';\nimport { SettingsService } from './settings-dialog/settings.service';\nimport { settingOmitIds } from './settings-dialog/setting-omit';\nimport { ShellMissingTranslationHandler } from './i18n/missing-translation-handler';\nimport { TranslocoHttpLoader } from './i18n/transloco-loader';\nimport { LocaleService } from './i18n/locale.service';\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 './views/view';\nimport { ContributionRegistry } from './contributions/contribution-registry';\nimport { CapabilityRefusalErrorHandler } from './permissions/refusal-error-handler';\nimport { COMMAND_INVOKER } from './foundation/command-invoker';\nimport { DIALOG_CLOSE_GUARD } from './dialog/dialog-close-guard';\nimport { SurfaceCloseGuard } from './regions/pane/unsaved-work/surface-close-guard';\nimport { WORKSPACE_SETTLEMENT } from './regions/content/routing/workspace-settlement';\nimport { UNUSABLE_WORKSPACES } from './workspace/usability/unusable-workspaces';\nimport { UnusableWorkspacesService } from './workspace/usability/unusable-workspaces.service';\nimport { CommandInvocationService } from './commands/command-invocation.service';\nimport { KeybindingService } from './commands/keyboard/keybinding.service';\nimport { wordChordKeys } from './commands/keyboard/chord-wording';\nimport { DialogService } from './dialog/dialog.service';\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 { 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 {\n  APP_RESET_WORKSPACES,\n  AppResetService,\n} from './regions/reset/app-reset.service';\nimport { SHELL_LAYOUT } from './layout/layout';\nimport { SURFACE_RETENTION } from './regions/pane/retention/retention-policy';\nimport { FeatureSwitches } from './features/feature-switches.service';\nimport { PaneService } from './regions/pane/pane.service';\nimport { SURFACE_PADDING } from './foundation/surface-padding';\nimport { ANNOUNCE_UPDATES } from './update/announce-updates';\nimport { DRAW_TOASTS, TOAST_POSITION } from './notifications/toast-options';\nimport { knownToastPosition } from './notifications/toast-placement';\nimport { ToolbarHost } from './regions/toolbar/toolbar-host.service';\nimport {\n  CompositionReport,\n  installCompositionReport,\n} from './diagnostics/composition-report';\nimport { registerDefaultSettings } from './default-settings';\nimport { registerHostCommands } from './host-commands';\nimport { registerBuiltInMenus } from './built-in-menus';\nimport { ThemeService } from './theme/theme.service';\nimport { FontScaleService } from './text-size/font-scale.service';\nimport { ShellOptions } from './shell-options';\nimport { defineLwElements } from './elements/lw-elements';\n\ninterface ProvidedContributions {\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\nfunction valueIfSet<T>(\n  token: InjectionToken<T>,\n  value: T | undefined,\n): Provider[] {\n  return value === undefined ? [] : [{ provide: token, useValue: value }];\n}\n\nfunction angularRuntime(): (Provider | EnvironmentProviders)[] {\n  return [\n    provideZonelessChangeDetection(),\n    provideBrowserGlobalErrorListeners(),\n    { provide: ErrorHandler, useClass: CapabilityRefusalErrorHandler },\n    provideHttpClient(),\n  ];\n}\n\nfunction portBindings(): Provider[] {\n  return [\n    { provide: COMMAND_INVOKER, useExisting: CommandInvocationService },\n    { provide: DIALOG_CLOSE_GUARD, useExisting: SurfaceCloseGuard },\n    { provide: WORKSPACE_SETTLEMENT, useExisting: WorkspaceService },\n    { provide: UNUSABLE_WORKSPACES, useExisting: UnusableWorkspacesService },\n    {\n      provide: APP_RESET_WORKSPACES,\n      useFactory: () => {\n        const workspaces = inject(WorkspaceService);\n        return () => workspaces.resetAll();\n      },\n    },\n  ];\n}\n\nfunction optionProviders(\n  options: ShellOptions,\n  served: readonly string[],\n): (Provider | EnvironmentProviders)[] {\n  return [\n    { provide: SERVED_LANGUAGES, useValue: served },\n    ...valueIfSet(SURFACE_RETENTION, options.retention),\n    ...valueIfSet(SURFACE_PADDING, options.padding),\n    ...valueIfSet(ANNOUNCE_UPDATES, options.announceUpdates),\n    ...valueIfSet(\n      TOAST_POSITION,\n      options.toastPosition === undefined\n        ? undefined\n        : knownToastPosition(options.toastPosition),\n    ),\n    ...valueIfSet(DRAW_TOASTS, options.drawToasts),\n    ...(options.serviceWorker === false\n      ? []\n      : [\n          provideServiceWorker('ngsw-worker.js', {\n            enabled: !isDevMode(),\n            registrationStrategy: 'registerWhenStable:30000',\n          }),\n        ]),\n  ];\n}\n\nfunction workbenchElements(): EnvironmentProviders {\n  return provideEnvironmentInitializer(() => defineLwElements());\n}\n\nfunction applyThemeAndTextSize(): void {\n  inject(ThemeService);\n  inject(FontScaleService);\n}\n\nfunction registerWorkbenchContributions(options: ShellOptions): void {\n  const registry = inject(ContributionRegistry);\n  registerHostCommands(registry, inject(SHELL_LAYOUT), {\n    dialogs: inject(DialogService),\n    panes: inject(PaneService),\n    workspace: inject(WorkspaceService),\n    transloco: inject(TranslocoService),\n    settings: inject(SettingsService),\n    popout: inject(PopoutService),\n    appReset: inject(AppResetService),\n    features: inject(FeatureSwitches),\n    injector: inject(Injector),\n  });\n  registerBuiltInMenus(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(FeatureSwitches),\n    injector: inject(Injector),\n  });\n  registerProvidedContributions(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\nfunction registerProvidedContributions(\n  registry: ContributionRegistry,\n  provided: ProvidedContributions,\n): void {\n  for (const view of provided.views) {\n    registry.addView(view);\n  }\n  for (const item of provided.barItems) {\n    registry.addBarItem(item);\n  }\n  for (const item of provided.railItems) {\n    registry.addRailItem(item);\n  }\n  registry.omit(provided.omit);\n}\n\nfunction reportCompositionInDevelopment(): void {\n  if (!isDevMode()) {\n    return;\n  }\n  const report = inject(CompositionReport);\n  report.checkStaticContributions();\n  void report.reportUndeclaredSlotsOnceSettled();\n  installCompositionReport(report);\n}\n\nfunction registerSettings(options: ShellOptions): void {\n  inject(SettingsService).omit(settingOmitIds(options.omit ?? []));\n  registerDefaultSettings();\n}\n\nfunction startupRegistrations(\n  options: ShellOptions,\n): (Provider | EnvironmentProviders)[] {\n  return [\n    ...provideBarItems(...DEFAULT_BAR_ITEMS),\n    provideEnvironmentInitializer(applyThemeAndTextSize),\n    provideEnvironmentInitializer(() =>\n      registerWorkbenchContributions(options),\n    ),\n    provideEnvironmentInitializer(reportCompositionInDevelopment),\n    provideEnvironmentInitializer(() => inject(ToolbarHost)),\n    provideEnvironmentInitializer(() => inject(KeybindingService).start()),\n    provideEnvironmentInitializer(wordChordKeys),\n    provideEnvironmentInitializer(() => inject(LocaleService)),\n    provideEnvironmentInitializer(() => inject(RailWorkspaceEntries).start()),\n    provideEnvironmentInitializer(() => registerSettings(options)),\n  ];\n}\n\nfunction translation(\n  served: readonly string[],\n): (Provider | EnvironmentProviders)[] {\n  return [\n    provideTransloco({\n      config: {\n        availableLangs: [...served],\n        defaultLang: detectInitialLanguage(served),\n        fallbackLang: FALLBACK_LANGUAGE,\n        reRenderOnLangChange: true,\n        prodMode: !isDevMode(),\n      },\n      loader: TranslocoHttpLoader,\n    }),\n    provideTranslocoMissingHandler(ShellMissingTranslationHandler),\n  ];\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  const served = resolveServedLanguages(options.languages);\n  return [\n    ...angularRuntime(),\n    ...portBindings(),\n    ...optionProviders(options, served),\n    workbenchElements(),\n    ...startupRegistrations(options),\n    ...translation(served),\n  ];\n}\n","const SMALLEST_SCALE = 0.05;\n\nconst LARGEST_SCALE = 4;\n\nexport function captureScale(preferred: number): number {\n  if (!Number.isFinite(preferred) || preferred <= 0) {\n    return 1;\n  }\n  return Math.min(LARGEST_SCALE, Math.max(SMALLEST_SCALE, preferred));\n}\n\nconst ABSENT_FILL = '#6b7280';\n\nconst ABSENT_STRIPE = 'rgba(255, 255, 255, 0.14)';\n\nconst ABSENT_TEXT = '#ffffff';\n\nconst STRIPE_STEP = 14;\n\nexport function drawAbsent(\n  context: CanvasRenderingContext2D,\n  left: number,\n  top: number,\n  width: number,\n  height: number,\n  label: string,\n): void {\n  context.save();\n  context.beginPath();\n  context.rect(left, top, width, height);\n  context.clip();\n\n  context.fillStyle = ABSENT_FILL;\n  context.fillRect(left, top, width, height);\n\n  context.strokeStyle = ABSENT_STRIPE;\n  context.lineWidth = 6;\n  context.beginPath();\n  for (let offset = -height; offset < width; offset += STRIPE_STEP * 2) {\n    context.moveTo(left + offset, top + height);\n    context.lineTo(left + offset + height, top);\n  }\n  context.stroke();\n\n  context.fillStyle = ABSENT_TEXT;\n  context.textAlign = 'center';\n  context.textBaseline = 'middle';\n  context.font = `600 ${Math.max(11, Math.min(16, height / 14))}px system-ui, sans-serif`;\n  context.fillText(label, left + width / 2, top + height / 2, width - 16);\n  context.restore();\n}\n","import { drawAbsent } from '../surface-kit/picture-primitives';\n\nexport interface PlacedSurface {\n  readonly left: number;\n  readonly top: number;\n  readonly width: number;\n  readonly height: number;\n  readonly image: CanvasImageSource | undefined;\n}\n\nexport interface AbsentSurfaceLabels {\n  readonly absent: string;\n}\n\nexport function placeSurface(\n  context: CanvasRenderingContext2D,\n  placed: PlacedSurface,\n  scale: number,\n  labels: AbsentSurfaceLabels,\n): void {\n  const left = placed.left * scale;\n  const top = placed.top * scale;\n  const width = placed.width * scale;\n  const height = placed.height * scale;\n\n  if (!placed.image) {\n    drawAbsent(context, left, top, width, height, labels.absent);\n    return;\n  }\n  context.drawImage(placed.image, left, top, width, height);\n}\n","import { captureScale } from '../surface-kit/picture-primitives';\n\n/**\n * How large a picture of the workbench is drawn.\n *\n * `'screen'` draws at the density of the screen it is drawn on, which is what a request that says\n * nothing gets. `'plain'` draws one picture pixel per CSS pixel, which is the smaller picture a\n * fault report usually wants. `withinWidth` names a greatest width in picture pixels: the picture is\n * drawn no wider than that, keeping the proportions of what was pictured, and a width wider than the\n * workbench never enlarges it.\n */\nexport type WorkbenchPictureSize =\n  | 'screen'\n  | 'plain'\n  | { readonly withinWidth: number };\n\nexport function scaleForSize(\n  size: WorkbenchPictureSize | undefined,\n  screenDensity: number,\n  cssWidth: number,\n): number {\n  const screen = captureScale(screenDensity);\n  if (size === undefined || size === 'screen') {\n    return screen;\n  }\n  if (size === 'plain') {\n    return captureScale(1);\n  }\n  return captureScale(Math.min(screen, size.withinWidth / cssWidth));\n}\n","/** A compressed form a picture may be carried in. */\nexport type WorkbenchCompression = 'jpeg' | 'webp';\n\n/**\n * The form a picture of the workbench is carried in.\n *\n * `'lossless'` is what a request that says nothing gets, because compression is unkind to the small\n * text a fault report is usually read for. A compressed form is for carrying: name how strongly with\n * `quality`, between 0 and 1, where the default is already well below what a browser would choose on\n * its own.\n */\nexport type WorkbenchPictureForm =\n  | 'lossless'\n  | { readonly compressed: WorkbenchCompression; readonly quality?: number };\n\n/** What a picture turned out to be carried in, read back from the drawing rather than assumed. */\nexport type WorkbenchCarriedForm = 'lossless' | WorkbenchCompression;\n\nexport interface PictureEncoding {\n  readonly mediaType: string;\n  readonly quality: number | undefined;\n}\n\nconst LOSSLESS_MEDIA_TYPE = 'image/png';\n\nconst MEDIA_TYPES: Readonly<Record<WorkbenchCompression, string>> = {\n  jpeg: 'image/jpeg',\n  webp: 'image/webp',\n};\n\nconst DEFAULT_QUALITY = 0.8;\n\nconst CARRIED: Readonly<Record<string, WorkbenchCarriedForm>> = {\n  'image/png': 'lossless',\n  'image/jpeg': 'jpeg',\n  'image/webp': 'webp',\n};\n\nexport function pictureEncoding(\n  form: WorkbenchPictureForm | undefined,\n): PictureEncoding {\n  if (form === undefined || form === 'lossless') {\n    return { mediaType: LOSSLESS_MEDIA_TYPE, quality: undefined };\n  }\n  return {\n    mediaType: MEDIA_TYPES[form.compressed] ?? LOSSLESS_MEDIA_TYPE,\n    quality: quality(form.quality),\n  };\n}\n\nexport function carriedForm(image: string): WorkbenchCarriedForm {\n  const end = image.indexOf(';');\n  const mediaType = end > 5 ? image.slice(5, end) : '';\n  return CARRIED[mediaType] ?? 'lossless';\n}\n\nfunction quality(asked: number | undefined): number {\n  if (asked === undefined || !Number.isFinite(asked)) {\n    return DEFAULT_QUALITY;\n  }\n  return Math.min(1, Math.max(0, asked));\n}\n","import { DOCUMENT, inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport {\n  CapturableSurface,\n  SurfaceCaptureRegistry,\n} from './surface-capture-registry';\nimport { placeSurface } from './picture-assembly';\nimport { scaleForSize, WorkbenchPictureSize } from './picture-size';\nimport {\n  carriedForm,\n  pictureEncoding,\n  WorkbenchCarriedForm,\n  WorkbenchPictureForm,\n} from './picture-form';\nimport { decodeCapture, DrawRequest } from './ask-surface';\n\n/** What a caller may ask for about the picture before it is drawn. */\nexport interface WorkbenchPictureRequest {\n  /** How large to draw it. The density of the screen when absent. */\n  readonly size?: WorkbenchPictureSize;\n  /** What form to carry it in. Losslessly when absent. */\n  readonly form?: WorkbenchPictureForm;\n}\n\n/** A drawing of the workbench, made without asking the browser for permission. */\nexport interface WorkbenchPicture {\n  /** The drawing, as a `data:` URL, ready to show, annotate or attach to a report. */\n  readonly image: string;\n  readonly width: number;\n  readonly height: number;\n  /**\n   * The form the picture is carried in, read back from the drawing rather than taken from the\n   * request: a browser that cannot produce the form asked for substitutes one silently.\n   */\n  readonly form: WorkbenchCarriedForm;\n  /**\n   * How many surfaces are on the picture as a statement that their content is absent rather than as\n   * their content — a surface that failed to draw, or one that withheld itself.\n   */\n  readonly surfacesAbsent: number;\n}\n\ninterface Placement {\n  readonly surface: CapturableSurface;\n  readonly rect: DOMRect;\n}\n\ninterface Renderer {\n  toCanvas(\n    target: Element,\n    options: { readonly scale: number },\n  ): Promise<HTMLCanvasElement>;\n}\n\n/**\n * Draws the workbench as the user is seeing it, plugin surfaces included.\n *\n * The browser will not photograph the screen without a permission prompt and a surface picker, so\n * the picture is rendered from the document instead. That stops at an isolated surface, whose\n * content nothing outside it may read, so each one is asked to draw itself and its answer is placed\n * where it sits. A surface that cannot answer is drawn as a statement that its content is absent,\n * never as a blank — a blank in a picture attached to a fault report reads as evidence.\n *\n * What the user cannot see is not in the picture: content scrolled out of sight within a region\n * stays out, and a surface opened in its own window is not part of it.\n *\n * This is a distribution's to call. A plugin is offered no path to it, because a picture holds what\n * every other surface on screen is showing.\n */\n@Service()\nexport class WorkbenchCaptureService {\n  private readonly document = inject(DOCUMENT);\n\n  private readonly surfaces = inject(SurfaceCaptureRegistry);\n\n  private readonly transloco = inject(TranslocoService);\n\n  private renderer?: Promise<Renderer>;\n\n  async capture(request?: WorkbenchPictureRequest): Promise<WorkbenchPicture> {\n    const view = this.window();\n    const renderer = await this.load();\n    const root = this.document.body;\n    const scale = scaleForSize(\n      request?.size,\n      view.devicePixelRatio,\n      root.getBoundingClientRect().width,\n    );\n\n    const drawRequest = { scale, ...pictureEncoding(request?.form) };\n\n    const placements = this.placements();\n    const [images, canvas] = await Promise.all([\n      this.drawSurfaces(placements, drawRequest, view),\n      renderer.toCanvas(root, { scale }),\n    ]);\n\n    return this.assemble(canvas, root, placements, images, drawRequest);\n  }\n\n  private window(): Window {\n    const view = this.document.defaultView;\n    if (!view) {\n      throw new Error('the workbench has no window to draw');\n    }\n    return view;\n  }\n\n  private placements(): readonly Placement[] {\n    return this.surfaces\n      .visible()\n      .map((surface) => ({ surface, rect: surface.element.getBoundingClientRect() }));\n  }\n\n  private async drawSurfaces(\n    placements: readonly Placement[],\n    drawRequest: DrawRequest,\n    view: Window,\n  ): Promise<readonly (CanvasImageSource | undefined)[]> {\n    const captures = await Promise.all(\n      placements.map((placement) => placement.surface.captureSelf(drawRequest)),\n    );\n    return Promise.all(\n      captures.map((capture) => decodeCapture(capture, view)),\n    );\n  }\n\n  private assemble(\n    canvas: HTMLCanvasElement,\n    root: Element,\n    placements: readonly Placement[],\n    images: readonly (CanvasImageSource | undefined)[],\n    drawRequest: DrawRequest,\n  ): WorkbenchPicture {\n    const context = canvas.getContext('2d');\n    if (!context) {\n      throw new Error('the workbench drawing has no surface to place onto');\n    }\n    const origin = root.getBoundingClientRect();\n    const labels = { absent: this.transloco.translate('capture.surfaceAbsent') };\n\n    for (const [index, placement] of placements.entries()) {\n      placeSurface(\n        context,\n        {\n          left: placement.rect.left - origin.left,\n          top: placement.rect.top - origin.top,\n          width: placement.rect.width,\n          height: placement.rect.height,\n          image: images[index],\n        },\n        drawRequest.scale,\n        labels,\n      );\n    }\n\n    const image = canvas.toDataURL(drawRequest.mediaType, drawRequest.quality);\n    return {\n      image,\n      width: canvas.width,\n      height: canvas.height,\n      form: carriedForm(image),\n      surfacesAbsent: images.filter((surfaceImage) => !surfaceImage).length,\n    };\n  }\n\n  private load(): Promise<Renderer> {\n    this.renderer ??= import('@zumer/snapdom').then(\n      (module) => module.snapdom as Renderer,\n    );\n    return this.renderer;\n  }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Command } from '@loomweaver/plugin-sdk';\nimport { BAR_CONTEXT } from '../../../regions/bar/bar-context';\nimport { CommandService } from '../../command.service';\nimport { ariaKeyShortcuts } from '../../keyboard/chord';\nimport { nameWithHint } from '../../../foundation/name-showing';\n\n@Component({\n  selector: 'lw-search-entry',\n  imports: [TranslocoPipe],\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './search-entry.html',\n})\nexport class SearchEntry {\n  readonly commandId = input.required<string>();\n\n  private readonly commands = inject(CommandService);\n\n  protected readonly compact = inject(BAR_CONTEXT, { optional: true })?.dock === 'bottom';\n\n  protected readonly command = computed<Command | undefined>(() => {\n    const id = this.commandId();\n    const command = this.commands.commands().find((entry) => entry.id === id);\n    return command && this.commands.available(command) ? command : undefined;\n  });\n\n  protected readonly testId = computed(() => entryTestId(this.commandId()));\n\n  protected readonly shortcut = computed<string | undefined>(() =>\n    this.commands.shortcutOf(this.command()),\n  );\n\n  protected readonly keyShortcuts = computed<string | undefined>(() =>\n    ariaKeyShortcuts(this.commands.chordOf(this.command())),\n  );\n\n  protected nameOf(title: string): string {\n    return nameWithHint(title, this.shortcut());\n  }\n\n  protected open(): void {\n    this.commands.execute(this.commandId());\n  }\n}\n\nfunction entryTestId(commandId: string): string {\n  const name = commandId\n    .replace(/^shell\\./, '')\n    .replaceAll(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n  return `${name}-entry`;\n}\n","@if (command(); as entry) {\n  <button\n    type=\"button\"\n    (click)=\"open()\"\n    [attr.data-testid]=\"testId()\"\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]=\"nameOf(entry.title | transloco)\"\n    [attr.aria-keyshortcuts]=\"keyShortcuts()\"\n  >\n    <span\n      [class]=\"compact ? 'relative flex items-center gap-1' : 'lw-segmented-item w-auto gap-2 px-1.5'\"\n    >\n      @if (entry.icon; as icon) {\n        <lw-icon [name]=\"icon\" size=\"1rem\" />\n      }\n      @if (shortcut(); as chord) {\n        <kbd class=\"text-[0.6875rem] leading-tight text-content-faint\">{{ chord }}</kbd>\n      }\n      <lw-tooltip\n        [text]=\"entry.title | transloco\"\n        [position]=\"compact ? 'top' : 'bottom'\"\n      />\n    </span>\n  </button>\n}\n","import { Component } from '@angular/core';\nimport { PALETTE_COMMAND_ID } from '../command-palette';\nimport { SearchEntry } from './search-entry';\n\n@Component({\n  selector: 'lw-command-palette-entry',\n  imports: [SearchEntry],\n  template: '<lw-search-entry [commandId]=\"commandId\" />',\n})\nexport class CommandPaletteEntry {\n  protected readonly commandId = PALETTE_COMMAND_ID;\n}\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. 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 — 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 *\n * The badge never outlives what it opens: omitting `shell.commandPalette`, or a session that may not\n * run it, takes the badge with it rather than leaving a control that does nothing. Switching\n * shortcuts off is the exception — the badge stays and still opens the palette, it simply names no\n * chord. Independent of {@link provideQuickOpenEntry}, which places the entry to the search over\n * open work.\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 { Component } from '@angular/core';\nimport { QUICK_OPEN_COMMAND_ID } from '../command-palette';\nimport { SearchEntry } from './search-entry';\n\n@Component({\n  selector: 'lw-quick-open-entry',\n  imports: [SearchEntry],\n  template: '<lw-search-entry [commandId]=\"commandId\" />',\n})\nexport class QuickOpenEntry {\n  protected readonly commandId = QUICK_OPEN_COMMAND_ID;\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { BarSlot } from '@loomweaver/plugin-sdk';\nimport { provideBarItems } from '../../../foundation/bar-item';\nimport { QuickOpenEntry } from './quick-open-entry';\n\n/** Where the built quick-open entry goes. Defaults: status bar, start slot, order 5. */\nexport interface QuickOpenEntryOptions {\n  /**\n   * Target Bar region id. Default `'status-bar'` — apart from the command-palette entry, so that the\n   * two badges are not read as a pair of duplicates. The badge adapts to the bar it lands in: a top\n   * bar is a fixed band, so there it pins the shared bar-control height; a bottom bar takes the\n   * height of its tallest item, so there it renders like a plain bar item rather than growing the\n   * bar and costing the content area.\n   */\n  readonly bar?: string;\n  /** Which Bar slot the entry renders in. Default `'start'`. */\n  readonly slot?: BarSlot;\n  /** Lower renders first within the slot. Default `5`. */\n  readonly order?: number;\n}\n\n/**\n * Places a built quick-open entry in a Bar — a badge-styled affordance (icon + the OS-correct\n * shortcut) that opens `shell.quickOpen`, the search over open work. Opt-in: omit it for a search\n * that opens only by shortcut. Uses the `shell.quickOpenEntry` bar-item id, so\n * `provideShell({ omit: ['shell.quickOpenEntry'] })` removes it.\n *\n * The badge never outlives what it opens: omitting `shell.quickOpen`, or a session that may not run\n * it, takes the badge with it rather than leaving a control that does nothing. A pop-out window is\n * the same case — it offers no search over open work, so the badge is absent there. Switching\n * shortcuts off is the exception: the badge stays and still opens the search, it simply names no\n * chord. Independent of {@link provideCommandPaletteEntry}, so a product may place either, both or\n * neither.\n */\nexport function provideQuickOpenEntry(\n  options: QuickOpenEntryOptions = {},\n): EnvironmentProviders {\n  return makeEnvironmentProviders(\n    provideBarItems({\n      id: 'shell.quickOpenEntry',\n      bar: options.bar ?? 'status-bar',\n      slot: options.slot ?? 'start',\n      order: options.order ?? 5,\n      component: QuickOpenEntry,\n    }),\n  );\n}\n","import {\n  EnvironmentProviders,\n  makeEnvironmentProviders,\n  provideEnvironmentInitializer,\n} from '@angular/core';\nimport { setDistributionIcon } from './icon-registry';\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 *plugin* 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","export class BootLatchedIdentity {\n  private latched: string | null = null;\n  private servedAnonymously = false;\n  private adoption = false;\n  private readonly watchers = new Set<() => void>();\n\n  constructor(private readonly read: () => string | null | undefined) {}\n\n  latch(): void {\n    if (this.latched !== null) {\n      return;\n    }\n    const id = this.read();\n    if (!id) {\n      this.servedAnonymously = true;\n      return;\n    }\n    this.latched = id;\n    this.adopt();\n  }\n\n  current(): string | null {\n    return this.latched;\n  }\n\n  adopting(): boolean {\n    return this.adoption;\n  }\n\n  settle(): void {\n    this.adoption = false;\n  }\n\n  watchAdoption(watcher: () => void): void {\n    this.watchers.add(watcher);\n  }\n\n  private adopt(): void {\n    if (!this.servedAnonymously || this.watchers.size === 0) {\n      return;\n    }\n    this.adoption = true;\n    for (const watcher of this.watchers) {\n      watcher();\n    }\n  }\n}\n","import { KeyValueStore } from '../key-value-store';\nimport { peekThrough } from '../peek-through';\nimport { BootLatchedIdentity } from './boot-latched-identity';\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  private readonly withheld = new Map<string, 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    this.peek = peekThrough(inner, (key) => this.scoped(key));\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    const scoped = this.scoped(key);\n    if (this.held(key)) {\n      this.withheld.set(scoped, value);\n      return Promise.resolve();\n    }\n    return this.inner.set(scoped, value);\n  }\n\n  delete(key: string): Promise<void> {\n    const scoped = this.scoped(key);\n    if (this.held(key)) {\n      this.withheld.delete(scoped);\n      return Promise.resolve();\n    }\n    return this.inner.delete(scoped);\n  }\n\n  async writeWhereTheNamespaceIsEmpty(): Promise<void> {\n    const pending = [...this.withheld];\n    this.withheld.clear();\n    for (const [scoped, value] of pending) {\n      if ((await this.inner.get(scoped)) === undefined) {\n        await this.inner.set(scoped, value);\n      }\n    }\n  }\n\n  async writeWhatArrivedDuringAdoption(): Promise<void> {\n    const arrived = [...this.withheld];\n    this.withheld.clear();\n    for (const [scoped, value] of arrived) {\n      await this.inner.set(scoped, value);\n    }\n  }\n\n  private held(key: string): boolean {\n    return !this.deviceKeys.has(key) && this.latch.adopting();\n  }\n\n  private scoped(key: string): string {\n    if (this.deviceKeys.has(key)) {\n      return key;\n    }\n    this.latch.latch();\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 {\n  EnvironmentProviders,\n  effect,\n  inject,\n  Provider,\n  provideEnvironmentInitializer,\n  untracked,\n} 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/cross-tab-sync-store';\nimport { AuthContext } from '../../auth/auth-context';\nimport { StateSyncService } from '../cross-tab/state-sync.service';\nimport { BootLatchedIdentity } from './boot-latched-identity';\nimport { IdentityScopedStore } from './identity-scoped-store';\nimport {\n  FONT_SCALE_STORAGE_KEY,\n  LANGUAGE_STORAGE_KEY,\n  THEME_STORAGE_KEY,\n} from '../device-level-keys';\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  THEME_STORAGE_KEY,\n  LANGUAGE_STORAGE_KEY,\n  FONT_SCALE_STORAGE_KEY,\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). Where it cannot be, nothing stored for that user is lost: from the moment an\n   * anonymous session adopts a namespace, writes are held, everything already read is read again\n   * from the adopted namespace, and what was built while nobody was known is kept only where the\n   * adopted namespace answers with nothing. What remains is the flash before the session lands.\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 | EnvironmentProviders)[] {\n  const latch = new BootLatchedIdentity(options.identity);\n  const deviceKeys = new Set(options.deviceKeys ?? DEVICE_LEVEL_KEYS);\n  const scoped = (inner: KeyValueStore | undefined): IdentityScopedStore =>\n    new IdentityScopedStore(\n      inner ?? new LocalStorageStore(),\n      latch,\n      deviceKeys,\n    );\n  const settings = scoped(options.settingsStore);\n  const workingState = scoped(options.workingStateStore);\n  return [\n    {\n      provide: SETTINGS_STORE,\n      useFactory: () => withCrossTabSync(settings),\n    },\n    {\n      provide: WORKING_STATE_STORE,\n      useFactory: () => withCrossTabSync(workingState),\n    },\n    provideEnvironmentInitializer(() => {\n      const sync = inject(StateSyncService);\n      const auth = inject(AuthContext);\n      latch.watchAdoption(() => {\n        void sync\n          .namespaceAdopted()\n          .catch(() => undefined)\n          .then(() =>\n            Promise.all([\n              settings.writeWhereTheNamespaceIsEmpty(),\n              workingState.writeWhereTheNamespaceIsEmpty(),\n            ]),\n          )\n          .catch(() => undefined)\n          .finally(() => {\n            latch.settle();\n            void Promise.all([\n              settings.writeWhatArrivedDuringAdoption(),\n              workingState.writeWhatArrivedDuringAdoption(),\n            ]).catch(() => undefined);\n          });\n      });\n      effect(() => {\n        auth.state();\n        untracked(() => latch.latch());\n      });\n    }),\n  ];\n}\n","import { isDevMode, Service } from '@angular/core';\nimport { Disposable } from '@loomweaver/plugin-sdk';\nimport {\n  hasIcon,\n  removeIcon,\n  sanitizeIconSvg,\n  setIcon,\n} from './icon-registry';\n\n@Service()\nexport class PluginIconContributions {\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: () => { for (const name of added) removeIcon(name) } };\n  }\n\n  private warn(message: string): void {\n    if (isDevMode()) {\n      console.warn(message);\n    }\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { CONTENT_DOCK, viewPanePath } from '../pane/tree/pane-address';\nimport { findLeafWithTab } from '../pane/tree/pane-queries';\nimport { CONTAINER_DOCK_PREFIX } from '../pane/container/container-children';\nimport { PaneTreeService } from '../pane/tree/pane-tree.service';\nimport { ContentTabsService } from '../content/tabs/content-tabs.service';\nimport { PanelState } from '../panel/panel-state';\nimport { PanelGroupService } from '../panel/panel-group.service';\nimport { ViewportService } from '../../layout/viewport.service';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { regionIdsOfType } from '../../layout/layout-queries';\n\ninterface Placement {\n  readonly dock: string;\n  readonly paneId: string;\n}\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  private readonly panelGroup = inject(PanelGroupService);\n  private readonly viewport = inject(ViewportService);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly panelRegions = regionIdsOfType(\n    inject(SHELL_LAYOUT),\n    'panel',\n  );\n\n  reveal(surfaceId: string): void {\n    const path = viewPanePath(surfaceId);\n    const placement =\n      this.placementOf(path) ?? this.placementAfterSeeding(surfaceId, path);\n    if (placement) {\n      this.activate(placement, path);\n    }\n  }\n\n  private placementOf(path: string): Placement | undefined {\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        return { dock, paneId: leaf.id };\n      }\n    }\n    return undefined;\n  }\n\n  private placementAfterSeeding(\n    surfaceId: string,\n    path: string,\n  ): Placement | undefined {\n    const region = this.registry\n      .views()\n      .find((view) => view.id === surfaceId)?.region;\n    if (\n      region === undefined ||\n      !this.panelRegions.includes(region) ||\n      !this.panelGroup.seededPaths(region).includes(path)\n    ) {\n      return undefined;\n    }\n    this.panelGroup.seed(region);\n    return this.placementOf(path);\n  }\n\n  private activate({ dock, paneId }: Placement, 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      return;\n    }\n    this.panels.expand(dock);\n    if (this.viewport.compact()) {\n      this.panels.openOverlay(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 '../../views/view';\nimport { containerLayout } from '../../regions/pane/container/container-layout';\nimport { CONTAINER_CHILD_REGION } from '../../contributions/surface-normalize';\n\nexport function warnUndescribedCallable(\n  pluginId: string,\n  command: Command,\n): 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 warnIgnoredRetention(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}\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() || (view.region === CONTAINER_CHILD_REGION)) {\n    return;\n  }\n  const region = regions.find((r) => r.id === view.region);\n  if (region?.type === 'panel') {\n    return;\n  }\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\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 { inject } from '@angular/core';\nimport { AuthContext } from '../../auth/auth-context';\nimport { DialogService } from '../../dialog/dialog.service';\nimport { MenuService } from '../../menu/menu.service';\nimport { NotificationBoard } from '../../notifications/notification-board';\nimport { SettingsService } from '../../settings-dialog/settings.service';\nimport { UpdateService } from '../../update/update.service';\nimport { VersionService } from '../../version/version.service';\nimport { PluginHost, PluginSession, PluginUi, UiMenuItem } from '../plugin';\nimport { MenuListEntry } from '../../menu/menu.service';\n\nexport function pluginUi(pluginId: string, requireUi: () => void): PluginUi {\n  const dialogs = inject(DialogService);\n  const notifications = inject(NotificationBoard);\n  const settings = inject(SettingsService);\n  const menu = inject(MenuService);\n  return {\n    confirm: (options) => {\n      requireUi();\n      return dialogs.confirm(options);\n    },\n    alert: (options) => {\n      requireUi();\n      return dialogs.alert(options);\n    },\n    prompt: (options) => {\n      requireUi();\n      return dialogs.prompt(options);\n    },\n    open: (component, options) => {\n      requireUi();\n      return dialogs.open(component, options);\n    },\n    progress: (options) => {\n      requireUi();\n      return dialogs.progress(options);\n    },\n    withProgress: (options, work) => {\n      requireUi();\n      return dialogs.withProgress(options, work);\n    },\n    toast: (input) => {\n      requireUi();\n      return notifications.show(input, pluginId);\n    },\n    openSettings: () => {\n      requireUi();\n      return settings.open();\n    },\n    openMenu: (items, at) => {\n      requireUi();\n      const runs = new Map<string, () => void>();\n      menu.openList(listEntries(items, '', runs), at, (key) =>\n        runs.get(key)?.(),\n      );\n    },\n  };\n}\n\nexport function pluginHost(): PluginHost {\n  const version = inject(VersionService);\n  const update = inject(UpdateService);\n  return {\n    version: version.version,\n    isPreview: version.isPreview,\n    updateAvailable: update.updateAvailable,\n    updatesEnabled: update.enabled,\n    checkForUpdate: () => update.checkForUpdate().then(() => undefined),\n    activateUpdate: () => update.activateUpdate(),\n  };\n}\n\nexport function pluginSession(): PluginSession {\n  const auth = inject(AuthContext);\n  return {\n    authenticated: auth.authenticated,\n    roles: auth.roles,\n    hasRole: (role) => auth.hasRole(role),\n  };\n}\n\nfunction listEntries(\n  items: readonly UiMenuItem[],\n  prefix: string,\n  runs: Map<string, () => void>,\n): MenuListEntry[] {\n  return items.map((item, index) => {\n    const key = `${prefix}${index}`;\n    if (item.items !== undefined) {\n      return {\n        key,\n        label: item.label,\n        icon: item.icon,\n        children: listEntries(item.items, `${key}.`, runs),\n      };\n    }\n    runs.set(key, item.run);\n    return {\n      key,\n      label: item.label,\n      icon: item.icon,\n      chord: item.shortcut,\n    };\n  });\n}\n","import { Surface } from '@loomweaver/plugin-sdk';\nimport { RegisteredContentRoute } from '../../contributions/contribution-registry';\nimport { segmentsOf } from '../../regions/content/content-path';\nimport { collidingParam } from '../../regions/content/tabs/tab-address';\n\nexport function followConflictMessage(\n  pluginId: string,\n  surface: Surface,\n  routes: readonly RegisteredContentRoute[],\n): string | null {\n  const routable = surface.routable;\n  if (routable?.follows !== true) {\n    return null;\n  }\n  for (const other of routes) {\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 \"${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\nexport function broadPrefixReason(surface: Surface): string | undefined {\n  const routable = surface.routable;\n  if (routable?.rest !== true || segmentsOf(routable.path).length >= 2) {\n    return undefined;\n  }\n  return (\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","import { inject } from '@angular/core';\nimport {\n  ContributionRegistry,\n  Disposable,\n} from '../../contributions/contribution-registry';\nimport { ToolbarRegistry } from '../../contributions/toolbar-registry';\nimport { BarItem } from '../../foundation/bar-item';\nimport { RailItem } from '../../foundation/rail-item';\nimport { SHELL_LAYOUT } 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  ContentTabLabel,\n  OpenTabInput,\n  PluginState,\n  StateHandle,\n  Surface,\n  TabBadge,\n  Toolbar,\n  ToolbarCell,\n  ViewAction,\n} from '@loomweaver/plugin-sdk';\nimport {\n  entryToContentRoute,\n  entryToView,\n  isRoutableSurface,\n  surfaceToEntry,\n} from '../../contributions/surface-normalize';\nimport { LeftOutChildren } from '../../regions/pane/container/left-out-children';\nimport { normalizePath } from '../../regions/content/content-path';\nimport { ContentTabsService } from '../../regions/content/tabs/content-tabs.service';\nimport { SettingsService } from '../../settings-dialog/settings.service';\nimport { SettingsSection } from '../../settings-dialog/settings-model';\nimport { PluginIconContributions } from '../../elements/icon/plugin-icon-contributions';\nimport { ThemeRegistry } from '../../theme/theme-registry';\nimport { SurfaceRevealService } from '../../regions/reveal/surface-reveal.service';\nimport { PluginStateService } from '../plugin-state.service';\nimport { COMMAND_INVOKER } from '../../foundation/command-invoker';\nimport {\n  warnUndescribedCallable,\n  warnUnlessPanelRegion,\n  warnUnlessRegionType,\n  warnIgnoredRetention,\n  warnUnusableContainerLayout,\n} from './host-context-warnings';\nimport { addressIsUnder } from '../../addressing/address-is-under';\nimport { pathOwnedBy, surfaceOwnedBy } from './plugin-surface-ownership';\nimport { pluginHost, pluginSession, pluginUi } from './plugin-facades';\nimport { broadPrefixReason, followConflictMessage } from './surface-admission';\n\nexport class HostPluginContext implements PluginContext {\n  private readonly registry = inject(ContributionRegistry);\n\n  private readonly toolbars = inject(ToolbarRegistry);\n\n  private readonly settings = inject(SettingsService);\n\n  private readonly tabs = inject(ContentTabsService);\n\n  private readonly regions = inject(SHELL_LAYOUT).regions;\n\n  private readonly icons = inject(PluginIconContributions);\n\n  private readonly themes = inject(ThemeRegistry);\n\n  private readonly reveal = inject(SurfaceRevealService);\n\n  private readonly invocation = inject(COMMAND_INVOKER);\n\n  private readonly leftOut = inject(LeftOutChildren);\n\n  private readonly hostFacts: PluginHost = pluginHost();\n\n  private readonly sessionFacts: PluginSession = pluginSession();\n\n  private readonly disposables: Disposable[] = [];\n\n  readonly ui: PluginUi;\n\n  readonly state: PluginState;\n\n  constructor(\n    private readonly pluginId: string,\n    private readonly isGranted: (capability: Capability) => boolean,\n  ) {\n    this.ui = pluginUi(pluginId, () => this.require('ui'));\n    const store = inject(PluginStateService).forPlugin(pluginId);\n    this.state = {\n      watch: <T>(key: string) => this.trackHandle(store.watch<T>(key)),\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  isShowingUnder(path: string): boolean {\n    this.require('navigation');\n    return addressIsUnder(this.tabs.activeContent()?.path, path);\n  }\n\n  hasUnsavedWork(path: string): boolean {\n    const owns = pathOwnedBy(this.registry, this.pluginId);\n    return owns(normalizePath(path)) && this.tabs.hasUnsavedWork(path);\n  }\n\n  get invocableCommands(): () => readonly InvocableCommand[] {\n    return () =>\n      this.invocation.invocable(this.pluginId, this.isGranted('automation'));\n  }\n\n  invokeCommand(id: string, args?: CommandArguments): 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  updateSurfaceBadge(id: string, badge: TabBadge | null): void {\n    this.require('contributions');\n    this.registry.updateSurfaceBadge(id, badge, this.pluginId);\n  }\n\n  setChildShown(childSurfaceId: string, shown: boolean): void {\n    this.require('contributions');\n    this.leftOut.setShownBy(this.pluginId, childSurfaceId, shown);\n  }\n\n  retitleSurface(id: string, title: string): void {\n    this.require('contributions');\n    if (surfaceOwnedBy(this.registry, this.pluginId, id)) {\n      this.registry.retitleSurface(id, title);\n    }\n  }\n\n  updateSurfaceAction(id: string, action: ViewAction): void {\n    this.require('contributions');\n    if (surfaceOwnedBy(this.registry, this.pluginId, id)) {\n      this.registry.updateSurfaceAction(id, action);\n    }\n  }\n\n  registerSurface(surface: Surface): Disposable {\n    this.require('contributions');\n    const broad = broadPrefixReason(surface);\n    if (broad !== undefined) {\n      this.require('navigation', broad);\n    }\n    warnIgnoredRetention(this.pluginId, surface);\n    warnUnusableContainerLayout(this.pluginId, surface);\n\n    const entry = surfaceToEntry(surface);\n    if (isRoutableSurface(surface)) {\n      const collision = followConflictMessage(\n        this.pluginId,\n        surface,\n        this.registry.contentRoutes(),\n      );\n      if (collision) {\n        console.error(collision);\n        return { dispose: () => undefined };\n      }\n      return this.trackWithBadge(\n        surface,\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.trackWithBadge(\n      surface,\n      this.registry.addView(view, this.pluginId),\n    );\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(\n      this.pluginId,\n      this.regions,\n      item.id,\n      item.rail,\n      'rail',\n    );\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, this.pluginId));\n  }\n\n  registerToolbar(toolbar: Toolbar): Disposable {\n    this.require('contributions');\n    return this.track(this.toolbars.addToolbar(toolbar, this.pluginId));\n  }\n\n  registerToolbarCell(cell: ToolbarCell): Disposable {\n    this.require('contributions');\n    return this.track(this.toolbars.addCell(cell));\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  updateContentTab(path: string, label: ContentTabLabel): void {\n    this.require('contributions');\n    this.tabs.update(path, label, this.pluginId);\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 trackWithBadge(surface: Surface, registered: Disposable): Disposable {\n    this.registry.updateSurfaceBadge(\n      surface.id,\n      surface.badge ?? null,\n      this.pluginId,\n    );\n    return this.track(registered);\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 {\n  inject,\n  Injector,\n  runInInjectionContext,\n  Service,\n} from '@angular/core';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport { HostPluginContext } from './host-plugin-context';\n\n@Service()\nexport class HostContextFactory {\n  private readonly injector = inject(Injector);\n\n  create(\n    pluginId: string,\n    isGranted: (capability: Capability) => boolean,\n  ): HostPluginContext {\n    return runInInjectionContext(\n      this.injector,\n      () => new HostPluginContext(pluginId, isGranted),\n    );\n  }\n}\n","import { inject, Service } from '@angular/core';\nimport { persistedSetting } from '../../persistence/stored-values/persisted-setting';\nimport { PluginStateService } from '../../plugin/plugin-state.service';\nimport { PluginDeploymentService } from './plugin-deployment.service';\nimport {\n  INSTALLED_LIST_CODEC,\n  InstalledPlugin,\n  isSameOriginUrl,\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 settings store backend, and nothing here\n * changes. The {@link FramePluginRuntime} reconciles activation against {@link installed} reactively,\n * so an 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.\n */\n@Service()\nexport class PluginInstallService {\n  private readonly pluginState = inject(PluginStateService);\n  private readonly deployment = inject(PluginDeploymentService);\n\n  private readonly stored = persistedSetting(STORAGE_KEY, INSTALLED_LIST_CODEC);\n\n  private composedIds: ReadonlySet<string> = new Set();\n\n  /** The installed plugins (reactive) — the sandbox runtime reconciles against this. */\n  readonly installed = this.stored.value;\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.installed().some((entry) => entry.id === id);\n  }\n\n  /** The installed entry for an id, or `undefined` — the baseline an update is compared against. */\n  byId(id: string): InstalledPlugin | undefined {\n    return this.installed().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, deployed by the operator nor already installed. Persisted; the runtime\n   * spawns the plugin live.\n   */\n  install(plugin: InstalledPlugin): void {\n    const entry = this.validEntry(plugin);\n    if (this.deployment.isDeployed(plugin.id)) {\n      throw new Error(\n        `Plugin \"${plugin.id}\" is provided by the operator, so it cannot be installed as the ` +\n          `user's own.`,\n      );\n    }\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.stored.update((installed) => [...installed, 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.stored.update((installed) =>\n      installed.map((current) => (current.id === entry.id ? entry : current)),\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.stored.update((installed) => installed.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","import { InjectionToken } from '@angular/core';\nimport {\n  DEFAULT_ISOLATION_LEVEL,\n  PluginIsolationLevel,\n} from '../../foundation/plugin-isolation-level';\n\nexport const CATALOG_MAX_ISOLATION_LEVEL =\n  new InjectionToken<PluginIsolationLevel>('lw.catalog-max-isolation-level', {\n    providedIn: 'root',\n    factory: () => DEFAULT_ISOLATION_LEVEL,\n  });\n","import { Capability } from '@loomweaver/plugin-sdk';\nimport {\n  DEFAULT_ISOLATION_LEVEL,\n  PluginIsolationLevel,\n  exceedsLevel,\n} from '../../foundation/plugin-isolation-level';\nimport { InstalledPlugin } from '../../plugin-store/lifecycle/installed-plugin';\nimport { FramePlugin } from './frame-plugin';\n\nexport interface RunnableFramePlugin extends FramePlugin {\n  readonly granted?: readonly Capability[];\n  readonly version?: string;\n}\n\nexport function levelOf(plugin: RunnableFramePlugin): PluginIsolationLevel {\n  return plugin.level ?? DEFAULT_ISOLATION_LEVEL;\n}\n\nexport function signatureOf(plugin: RunnableFramePlugin): string {\n  const sorted = (values: readonly string[] | undefined): string =>\n    [...(values ?? [])].toSorted((a, b) => a.localeCompare(b)).join(',');\n  return `${plugin.entryUrl}|${sorted(plugin.capabilities)}|${sorted(plugin.granted)}|${plugin.version ?? ''}|${levelOf(plugin)}`;\n}\n\nexport interface RefusedFramePlugin {\n  readonly id: string;\n  readonly asked: PluginIsolationLevel;\n}\n\nexport interface FramePluginSelection {\n  readonly runnable: readonly RunnableFramePlugin[];\n  readonly refused: readonly RefusedFramePlugin[];\n}\n\nexport function runnablePlugins(\n  composed: readonly FramePlugin[],\n  installed: readonly InstalledPlugin[],\n  deployed: readonly InstalledPlugin[],\n  catalogMaxLevel: PluginIsolationLevel,\n): FramePluginSelection {\n  const claimed = new Set(composed.map((plugin) => plugin.id));\n  const fromCatalog: RunnableFramePlugin[] = [];\n  const refused: RefusedFramePlugin[] = [];\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, catalogMaxLevel)) {\n      refused.push({ id: plugin.id, asked });\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    });\n  }\n  return { runnable: [...composed, ...fromCatalog], refused };\n}\n","import { signal } from '@angular/core';\nimport {\n  FrameSettingRow,\n  FrameSettingsSection,\n  SettingControl,\n  SettingsSection,\n} from '@loomweaver/plugin-sdk';\nimport { KeyValueStore } from '../../persistence/key-value-store';\nimport { hydrateAsync } from '../../persistence/stored-values/hydrate';\nimport { StateSyncService } from '../../persistence/cross-tab/state-sync.service';\nimport { PluginInstallService } from '../../plugin-store/lifecycle/plugin-install.service';\nimport { parseStored } from '../../persistence/stored-values/parse-stored';\n\nexport type FrameSettingValue = boolean | string | number;\nexport type FrameSettingValues = Readonly<Record<string, FrameSettingValue>>;\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  const parsed = parseStored(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(parsed as Record<string, unknown>)) {\n    if (Object.hasOwn(defaults, key) && typeof value === typeof defaults[key]) {\n      merged[key] = value as FrameSettingValue;\n    }\n  }\n  return merged;\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 const INSTALLED_PLUGINS_SETTINGS_GROUP = 'settings.group.community';\n\nexport function frameSettingsGroup(\n  installs: PluginInstallService,\n  pluginId: string,\n): string {\n  return installs.isInstalled(pluginId)\n    ? INSTALLED_PLUGINS_SETTINGS_GROUP\n    : 'settings.group.plugins';\n}\n\nexport function buildFrameSection(deps: FrameSectionDeps): 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    }\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    }\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    }\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}\n","import {\n  AccessRequirement,\n  ContentTabLabel,\n  LwButtonVariant,\n  MenuHeader,\n  MenuItem,\n  NotificationInput,\n  NotificationKind,\n  OpenTabInput,\n  Toolbar,\n} from '@loomweaver/plugin-sdk';\nimport { tabBadgeOf } from '../../../contributions/tab-badge';\nimport { isButtonVariant } from '../../../elements/button/lw-button-classes';\nimport { menuContextOf } from '../../../foundation/wire/menu-context-of';\nimport {\n  isWireObject,\n  onlyTrue,\n  optionalNumber,\n  optionalText,\n  requiredText,\n  wireRecord,\n} from './wire-fields';\n\nconst NOTIFICATION_KINDS = new Set<NotificationKind>([\n  'info',\n  'success',\n  'warning',\n  'error',\n]);\n\nexport function sanitizeRpcTabInput(input: OpenTabInput): OpenTabInput {\n  const raw = wireRecord(input);\n  const path = requiredText(\n    raw['path'],\n    'Sandbox plugin: openContentTab requires a non-empty string path.',\n  );\n  return {\n    path,\n    title: optionalText(raw['title']) ?? path,\n    titleIsLiteral: onlyTrue(raw['titleIsLiteral']),\n    icon: optionalText(raw['icon']),\n    preview: onlyTrue(raw['preview']),\n    badge: raw['badge'] === null ? null : tabBadgeOf(raw['badge']),\n  };\n}\n\nexport function sanitizeRpcTabLabel(label: ContentTabLabel): ContentTabLabel {\n  const raw = wireRecord(label);\n  const badge = raw['badge'] === null ? null : tabBadgeOf(raw['badge']);\n  return {\n    ...(typeof raw['title'] === 'string' && {\n      title: raw['title'],\n      titleIsLiteral: raw['titleIsLiteral'] === true,\n    }),\n    ...(typeof raw['icon'] === 'string' && { icon: raw['icon'] }),\n    ...(badge !== undefined && { badge }),\n  };\n}\n\nexport function sanitizeRpcToastInput(\n  input: NotificationInput,\n): NotificationInput {\n  const raw = wireRecord(input);\n  const timeoutMs = optionalNumber(raw['timeoutMs']);\n  return {\n    message: requiredText(\n      raw['message'],\n      'Sandbox plugin: toast requires a non-empty string message.',\n    ),\n    kind: isNotificationKind(raw['kind']) ? raw['kind'] : undefined,\n    icon: optionalText(raw['icon']),\n    timeoutMs: Number.isFinite(timeoutMs) ? timeoutMs : undefined,\n    id: optionalText(raw['id']),\n  };\n}\n\nexport function sanitizeRpcMenuItem(item: MenuItem): MenuItem {\n  const raw = wireRecord(item);\n  return {\n    id: optionalText(raw['id']),\n    menu: requiredText(\n      raw['menu'],\n      'Sandbox plugin: registerMenuItem requires a non-empty string menu slot.',\n    ),\n    command: optionalText(raw['command']),\n    title: optionalText(raw['title']),\n    icon: optionalText(raw['icon']),\n    access: sanitizeAccess(raw['access']),\n    group: optionalText(raw['group']),\n    order: optionalNumber(raw['order']),\n    when: menuContextOf(raw['when']),\n    checkedWhen: menuContextOf(raw['checkedWhen']),\n    submenu: optionalText(raw['submenu']),\n    menuHeader: sanitizeMenuHeader(raw['menuHeader']),\n    variant: sanitizeVariant(raw['variant']),\n  };\n}\n\nfunction sanitizeVariant(value: unknown): LwButtonVariant | undefined {\n  if (value === undefined || isButtonVariant(value)) {\n    return value;\n  }\n  console.warn(\n    \"Sandbox plugin: registerMenuItem takes 'variant' as one of primary, default, success, \" +\n      'danger, warning, info or ghost; the entry is kept without it.',\n  );\n  return undefined;\n}\n\nconst ACCESS_REFUSAL =\n  \"Sandbox plugin: registerMenuItem takes 'access' as { authenticated?: boolean, \" +\n  \"anyRole?: string[], allRoles?: string[], mode?: 'hide' | 'disable' }.\";\n\nfunction roleList(value: unknown): readonly string[] | undefined {\n  if (value === undefined) {\n    return undefined;\n  }\n  if (!Array.isArray(value) || value.some((role) => typeof role !== 'string')) {\n    throw new TypeError(ACCESS_REFUSAL);\n  }\n  return value as string[];\n}\n\nfunction sanitizeAccess(value: unknown): AccessRequirement | undefined {\n  if (value === undefined) {\n    return undefined;\n  }\n  if (!isWireObject(value)) {\n    throw new TypeError(ACCESS_REFUSAL);\n  }\n  const { authenticated, mode } = value;\n  if (authenticated !== undefined && typeof authenticated !== 'boolean') {\n    throw new TypeError(ACCESS_REFUSAL);\n  }\n  if (mode !== undefined && mode !== 'hide' && mode !== 'disable') {\n    throw new TypeError(ACCESS_REFUSAL);\n  }\n  return {\n    authenticated,\n    anyRole: roleList(value['anyRole']),\n    allRoles: roleList(value['allRoles']),\n    mode,\n  };\n}\n\nexport function sanitizeRpcToolbar(toolbar: Toolbar): Toolbar {\n  const raw = wireRecord(toolbar);\n  return {\n    slot: requiredText(\n      raw['slot'],\n      'Sandbox plugin: registerToolbar requires a non-empty string slot.',\n    ),\n    title: requiredText(\n      raw['title'],\n      'Sandbox plugin: registerToolbar requires a non-empty string title.',\n    ),\n  };\n}\n\nfunction sanitizeMenuHeader(value: unknown): MenuHeader | undefined {\n  if (!isWireObject(value) || typeof value['title'] !== 'string') {\n    return undefined;\n  }\n  return {\n    title: value['title'],\n    detail: optionalText(value['detail']),\n    icon: optionalText(value['icon']),\n    image: optionalText(value['image']),\n    initials: optionalText(value['initials']),\n    command: optionalText(value['command']),\n  };\n}\n\nfunction isNotificationKind(value: unknown): value is NotificationKind {\n  return NOTIFICATION_KINDS.has(value as NotificationKind);\n}\n\n","import {\n  FrameSettingControl,\n  FrameSettingRow,\n  FrameSettingsSection,\n  SelectOption,\n} from '@loomweaver/plugin-sdk';\nimport {\n  WireRecord,\n  isWireObject,\n  optionalNumber,\n  optionalText,\n  requiredText,\n  wireRecord,\n} from './wire-fields';\n\nconst INPUT_TYPES = ['text', 'date', 'email', 'number', 'password'] as const;\n\nexport function sanitizeRpcSettingsSection(\n  pluginId: string,\n  section: FrameSettingsSection,\n): FrameSettingsSection {\n  const raw = wireRecord(section);\n  const id = requiredText(\n    raw['id'],\n    `Sandbox plugin \"${pluginId}\": registerSettingsSection requires a non-empty 'id'.`,\n  );\n  const title = requiredText(\n    raw['title'],\n    `Sandbox plugin \"${pluginId}\": registerSettingsSection requires a non-empty 'title'.`,\n  );\n  const rows = raw['rows'];\n  if (!Array.isArray(rows) || rows.length === 0) {\n    throw new Error(\n      `Sandbox plugin \"${pluginId}\": registerSettingsSection requires at least one row.`,\n    );\n  }\n  return {\n    id,\n    title,\n    order: optionalNumber(raw['order']),\n    rows: rows.map((row) => sanitizeRow(pluginId, row)),\n  };\n}\n\nfunction sanitizeRow(pluginId: string, value: unknown): FrameSettingRow {\n  const row = wireRecord(value);\n  return {\n    id: requiredText(\n      row['id'],\n      `Sandbox plugin \"${pluginId}\": every settings row needs a non-empty 'id'.`,\n    ),\n    label: requiredText(\n      row['label'],\n      `Sandbox plugin \"${pluginId}\": every settings row needs a non-empty 'label'.`,\n    ),\n    description: optionalText(row['description']),\n    control: sanitizeControl(pluginId, row['control']),\n  };\n}\n\nfunction sanitizeControl(\n  pluginId: string,\n  value: unknown,\n): FrameSettingControl {\n  const control = wireRecord(value);\n  const kind = control['kind'];\n  const initial = control['value'];\n  if (kind === 'toggle' && typeof initial === 'boolean') {\n    return { kind, value: initial };\n  }\n  if (kind === 'text' && typeof initial === 'string') {\n    return textControl(initial, control);\n  }\n  if (kind === 'select' && typeof initial === 'string') {\n    return selectControl(pluginId, initial, control);\n  }\n  if (kind === 'slider' && typeof initial === 'number') {\n    return sliderControl(initial, 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 textControl(value: string, control: WireRecord): FrameSettingControl {\n  return {\n    kind: 'text',\n    value,\n    inputType: INPUT_TYPES.find((type) => type === control['inputType']),\n    placeholder: optionalText(control['placeholder']),\n  };\n}\n\nfunction selectControl(\n  pluginId: string,\n  value: string,\n  control: WireRecord,\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 sliderControl(\n  value: number,\n  control: WireRecord,\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 sanitizeOptions(value: unknown): readonly SelectOption[] {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n  return value\n    .filter(\n      (option): option is SelectOption =>\n        isWireObject(option) &&\n        typeof option['value'] === 'string' &&\n        typeof option['label'] === 'string',\n    )\n    .map((option) => ({ value: option.value, label: option.label }));\n}\n","import {\n  ContainerArea,\n  ContainerSpec,\n  ContainerTabEntry,\n  Surface,\n  SurfacePresentation,\n} from '@loomweaver/plugin-sdk';\nimport { assertPlaceable } from '../../../contributions/surface-normalize';\nimport { tabBadgeOf } from '../../../contributions/tab-badge';\nimport {\n  WireRecord,\n  isWireObject,\n  onlyTrue,\n  optionalNumber,\n  optionalText,\n  requiredText,\n  textList,\n  wireRecord,\n} from './wire-fields';\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 = wireRecord(surface);\n  const { id, title } = surfaceIdentity(pluginId, raw);\n  assertCarriableSurface(pluginId, raw);\n  const container = sanitizeRpcContainer(raw['container']);\n  const iframe =\n    container === undefined\n      ? rpcIframeUrl(pluginId, raw['iframe'], permitted)\n      : undefined;\n  const routable = sanitizeRpcRoutable(raw['routable']);\n  const docks = textList(raw['docks']);\n  assertPlaceable(\n    { id, routable, container, docks },\n    `Sandbox plugin \"${pluginId}\": surface \"${id}\"`,\n  );\n\n  const shared: Omit<Surface, keyof SurfacePresentation> = {\n    id,\n    title,\n    icon: optionalText(raw['icon']),\n    badge: tabBadgeOf(raw['badge']),\n    order: optionalNumber(raw['order']),\n    instanceable: onlyTrue(raw['instanceable']),\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: typeof raw['padded'] === 'boolean' ? raw['padded'] : undefined,\n    routable,\n    docks,\n  };\n  return container === undefined\n    ? { ...shared, iframe: iframe as string }\n    : { ...shared, container };\n}\n\nfunction surfaceIdentity(\n  pluginId: string,\n  raw: WireRecord,\n): { id: string; title: string } {\n  return {\n    id: requiredText(\n      raw['id'],\n      `Sandbox plugin \"${pluginId}\": registerSurface requires a non-empty 'id'.`,\n    ),\n    title: requiredText(\n      raw['title'],\n      `Sandbox plugin \"${pluginId}\": registerSurface requires a non-empty 'title'.`,\n    ),\n  };\n}\n\nfunction assertCarriableSurface(pluginId: string, raw: WireRecord): void {\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}\n\nfunction rpcIframeUrl(\n  pluginId: string,\n  value: unknown,\n  permitted: readonly string[] | undefined,\n): string {\n  if (typeof value !== 'string') {\n    throw new TypeError(\n      `Sandbox plugin \"${pluginId}\": registerSurface needs an { iframe } URL or a { container } spec.`,\n    );\n  }\n  const origin = surfaceOrigin(value);\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 \"${value}\".`,\n    );\n  }\n  return value;\n}\n\nfunction sanitizeRpcRoutable(value: unknown): Surface['routable'] | undefined {\n  if (!isWireObject(value)) {\n    return undefined;\n  }\n  const path = value['path'];\n  if (typeof path !== 'string' || path.length === 0) {\n    return undefined;\n  }\n  return {\n    path,\n    chromeless: onlyTrue(value['chromeless']),\n    title: optionalText(value['title']),\n    titleIsLiteral: onlyTrue(value['titleIsLiteral']),\n    icon: optionalText(value['icon']),\n    subRoutes: textList(value['subRoutes']),\n    rest: onlyTrue(value['rest']),\n    follows: onlyTrue(value['follows']),\n  };\n}\n\nfunction sanitizeRpcContainer(value: unknown): ContainerSpec | undefined {\n  if (!isWireObject(value)) {\n    return undefined;\n  }\n  return {\n    children: textList(value['children']) ?? [],\n    initial: sanitizeRpcInitial(value['initial']),\n  };\n}\n\nfunction sanitizeRpcInitial(value: unknown): ContainerSpec['initial'] {\n  return textList(value) ?? sanitizeRpcArea(value, 1);\n}\n\nfunction sanitizeRpcArea(\n  value: unknown,\n  depth: number,\n): ContainerArea | undefined {\n  if (depth > MAX_RPC_AREA_DEPTH || !isWireObject(value)) {\n    return undefined;\n  }\n  const size = typeof value['size'] === 'number' ? { size: value['size'] } : {};\n  if (Array.isArray(value['tabs'])) {\n    return {\n      ...size,\n      tabs: value['tabs'].flatMap((tab) => sanitizeRpcContainerTab(tab)),\n    };\n  }\n  for (const kind of ['rows', 'columns'] as const) {\n    const declared = value[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 (!isWireObject(value) || typeof value['surface'] !== 'string') {\n    return [];\n  }\n  return [\n    {\n      surface: value['surface'],\n      ...(value['closable'] === false && { closable: false }),\n      ...(value['active'] === true && { active: true }),\n    },\n  ];\n}\n\nconst FETCHED_PROTOCOLS: ReadonlySet<string> = new Set(['http:', 'https:']);\n\nfunction surfaceOrigin(iframe: string): string | null {\n  try {\n    const url = new URL(iframe, document.baseURI);\n    return FETCHED_PROTOCOLS.has(url.protocol) ? url.origin : null;\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","import { CommandOutcome } from '@loomweaver/plugin-sdk';\nimport { tabBadgeOf } from '../../../contributions/tab-badge';\nimport { asCommandArguments } from '../../../foundation/command-arguments';\nimport { KeyValueStore } from '../../../persistence/key-value-store';\nimport { StateSyncService } from '../../../persistence/cross-tab/state-sync.service';\nimport { PluginInstallService } from '../../../plugin-store/lifecycle/plugin-install.service';\nimport { HostPluginContext } from '../../context/host-plugin-context';\nimport {\n  buildFrameSection,\n  frameSettingsGroup,\n} from '../frame-settings-section';\nimport { FrameSession } from '../frame-session';\nimport { FrameRpc } from './frame-rpc-contract';\nimport {\n  sanitizeRpcMenuItem,\n  sanitizeRpcTabInput,\n  sanitizeRpcTabLabel,\n  sanitizeRpcToastInput,\n  sanitizeRpcToolbar,\n} from './sanitize-inputs';\nimport { sanitizeRpcSettingsSection } from './sanitize-settings';\nimport { sanitizeRpcSurface } from './sanitize-surface';\nimport { textArgument } from './wire-fields';\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 interface FrameRpcDeps {\n  readonly pluginId: string;\n  readonly ctx: HostPluginContext;\n  readonly origins: readonly string[] | undefined;\n  readonly session: FrameSession;\n  readonly install: PluginInstallService;\n  readonly store: KeyValueStore;\n  readonly sync: StateSyncService;\n  readonly reportRefusal: (error: unknown) => void;\n}\n\nexport function frameRpcMethods(deps: FrameRpcDeps): FrameRpc {\n  const { pluginId, ctx, origins, session } = deps;\n  return reportingRefusals(\n    {\n      registerSurface: (surface) => {\n        ctx.registerSurface(sanitizeRpcSurface(pluginId, surface, origins));\n      },\n      registerMenuItem: (item) => {\n        ctx.registerMenuItem(sanitizeRpcMenuItem(item));\n      },\n      registerToolbar: (toolbar) => {\n        ctx.registerToolbar(sanitizeRpcToolbar(toolbar));\n      },\n      registerSettingsSection: (section) => {\n        const built = buildFrameSection({\n          pluginId,\n          wire: sanitizeRpcSettingsSection(pluginId, section),\n          group: frameSettingsGroup(deps.install, pluginId),\n          store: deps.store,\n          sync: deps.sync,\n          notify: (sectionId, values) =>\n            session.notify((remote) =>\n              remote.settingsChanged(sectionId, values),\n            ),\n        });\n        session.addCleanup(built.disposeSync);\n        ctx.registerSettingsSection(built.section);\n      },\n      retitleSurface: (id, title) =>\n        ctx.retitleSurface(\n          textArgument(id, 'retitleSurface', 'id'),\n          textArgument(title, 'retitleSurface', 'title'),\n        ),\n      updateSurfaceBadge: (id, badge) =>\n        ctx.updateSurfaceBadge(\n          textArgument(id, 'updateSurfaceBadge', 'id'),\n          tabBadgeOf(badge) ?? null,\n        ),\n      setChildShown: (childSurfaceId, shown) =>\n        ctx.setChildShown(\n          textArgument(childSurfaceId, 'setChildShown', 'childSurfaceId'),\n          shown === true,\n        ),\n      navigateContent: (path) =>\n        ctx.navigateContent(textArgument(path, 'navigateContent', 'path')),\n      openContentTab: (input) => {\n        const sanitized = sanitizeRpcTabInput(input);\n        ctx.openContentTab({\n          ...sanitized,\n          onClose: () =>\n            session.notify((remote) => remote.contentTabClosed(sanitized.path)),\n        });\n      },\n      keepContentTab: (path) =>\n        ctx.keepContentTab(textArgument(path, 'keepContentTab', 'path')),\n      pinContentTab: (path) =>\n        ctx.pinContentTab(textArgument(path, 'pinContentTab', 'path')),\n      unpinContentTab: (path) =>\n        ctx.unpinContentTab(textArgument(path, 'unpinContentTab', 'path')),\n      closeContentTab: (path) =>\n        ctx.closeContentTab(textArgument(path, 'closeContentTab', 'path')),\n      updateContentTab: (path, label) =>\n        ctx.updateContentTab(\n          textArgument(path, 'updateContentTab', 'path'),\n          sanitizeRpcTabLabel(label),\n        ),\n      revealSurface: (id) =>\n        ctx.revealSurface(textArgument(id, 'revealSurface', 'id')),\n      invokeCommand: (id, args) =>\n        invokeRpcCommand(ctx, textArgument(id, 'invokeCommand', 'id'), args),\n      invocableCommands: () => ctx.invocableCommands(),\n      toast: (input) => ctx.ui.toast(sanitizeRpcToastInput(input)),\n      stateWatch: (key) => session.state.watch(key),\n      stateSet: (key, value) => session.state.set(key, value),\n      stateClear: (key) => session.state.clear(key),\n      stateUnwatch: (key) => session.state.unwatch(key),\n    },\n    deps.reportRefusal,\n  );\n}\n\nfunction invokeRpcCommand(\n  ctx: Pick<HostPluginContext, 'invokeCommand'>,\n  id: string,\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(id, carried);\n}\n\nfunction reportingRefusals(\n  methods: FrameRpc,\n  report: (error: unknown) => void,\n): 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        report(error);\n        throw error;\n      }\n    },\n  ]);\n  return Object.fromEntries(reported) as FrameRpc;\n}\n","import { Injector } from '@angular/core';\nimport { PluginState } from '@loomweaver/plugin-sdk';\nimport { PluginStateBridge } from '../plugin-state-bridge';\nimport { FrameRemote } from './rpc/frame-rpc-contract';\n\nexport class FrameSession {\n  readonly state: PluginStateBridge;\n\n  private readonly cleanups: (() => void)[] = [];\n\n  private remote: Promise<FrameRemote> | undefined;\n\n  constructor(state: PluginState, injector: Injector) {\n    this.state = new PluginStateBridge(state, injector, (key, value, loaded) =>\n      this.notify((remote) => remote.stateChanged(key, value, loaded)),\n    );\n  }\n\n  attach(remote: Promise<FrameRemote>): void {\n    this.remote = remote;\n  }\n\n  notify(send: (remote: FrameRemote) => void): void {\n    void this.remote?.then(send).catch(() => undefined);\n  }\n\n  addCleanup(cleanup: () => void): void {\n    this.cleanups.push(cleanup);\n  }\n\n  end(): void {\n    this.remote = undefined;\n    this.state.stopAll();\n    for (const cleanup of this.cleanups.splice(0)) {\n      cleanup();\n    }\n  }\n}\n","import {\n  EnvironmentInjector,\n  EnvironmentProviders,\n  Provider,\n  Service,\n  effect,\n  inject,\n  provideEnvironmentInitializer,\n  untracked,\n} from '@angular/core';\nimport { Connection, WindowMessenger, connect } from 'penpal';\nimport { ActivationSettled } from '../activation-settled';\nimport { SETTINGS_STORE } from '../../persistence/settings-store';\nimport {\n  NotificationBoard,\n  RaiserLimits,\n} from '../../notifications/notification-board';\nimport { StateSyncService } from '../../persistence/cross-tab/state-sync.service';\nimport { HostPluginContext } from '../context/host-plugin-context';\nimport { HostContextFactory } from '../context/host-context-factory';\nimport { CapabilityGrantService } from '../../permissions/capability-grant.service';\nimport { PluginEnablementService } from '../enablement/plugin-enablement.service';\nimport { InstalledPlugin } from '../../plugin-store/lifecycle/installed-plugin';\nimport { PluginInstallService } from '../../plugin-store/lifecycle/plugin-install.service';\nimport { CapabilityRefusalReporter } from '../../permissions/capability-refusal';\nimport { PluginIsolationLevel } from '../../foundation/plugin-isolation-level';\nimport { CATALOG_MAX_ISOLATION_LEVEL } from '../../plugin-store/catalog/catalog-level-cap';\nimport { PluginIsolationLevelService } from '../../plugin-isolation/plugin-isolation-level.service';\nimport { PluginDeploymentService } from '../../plugin-store/lifecycle/plugin-deployment.service';\nimport { FRAME_PLUGIN, FramePlugin } from './frame-plugin';\nimport {\n  RefusedFramePlugin,\n  RunnableFramePlugin,\n  levelOf,\n  runnablePlugins,\n  signatureOf,\n} from './runnable-frame-plugins';\nimport { frameRpcMethods } from './rpc/frame-rpc-methods';\nimport { FrameRemote } from './rpc/frame-rpc-contract';\nimport { FrameSession } from './frame-session';\n\nconst ISOLATED_NOTIFICATION_LIMITS: RaiserLimits = {\n  atOnce: 3,\n  lifetimeMs: 15_000,\n};\n\ninterface FrameInstance {\n  readonly ctx: HostPluginContext;\n  readonly session: FrameSession;\n  readonly connection: Connection<FrameRemote>;\n  readonly frame: HTMLIFrameElement;\n  readonly signature: string;\n}\n\n/**\n * Runs each sandboxed plugin in its own hidden iframe, isolated or embedded by its level, and serves\n * its `ctx` over **Penpal** RPC. Every call is answered by the same default-deny capability broker\n * the trusted runtime uses, so a grant means the same at either level: the isolation and the\n * transport change, the broker does not. Data-shaped calls such as `registerSurface({ iframe })` or\n * `toast` cross the boundary as validated copies; a component surface 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 activates\n * a plugin live, uninstalling deactivates it, and a catalog that stops carrying a deployed entry\n * deactivates 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 catalogMaxLevel = 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  private readonly notifications = inject(NotificationBoard);\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 settlement = inject(ActivationSettled);\n\n  private readonly instances = new Map<string, FrameInstance>();\n\n  private readonly reportedRefusals = new Set<string>();\n\n  private readonly listed = new Set<string>();\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.session.end();\n    instance.ctx.disposeAll();\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, refused } = runnablePlugins(\n      this.plugins,\n      installed,\n      deployed,\n      this.catalogMaxLevel,\n    );\n    this.reportRefused(refused);\n    for (const plugin of runnable) {\n      this.enablement.register(plugin.id, plugin.name ?? plugin.id);\n      this.listed.add(plugin.id);\n      const enabled = !disabled.has(plugin.id);\n      const running = this.instances.get(plugin.id);\n      if (enabled && !running) {\n        this.activate(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.activate(plugin);\n      }\n    }\n    this.deactivateUnlisted(runnable);\n  }\n\n  private deactivateUnlisted(runnable: readonly RunnableFramePlugin[]): void {\n    const known = new Set(runnable.map((plugin) => plugin.id));\n    for (const id of this.listed) {\n      if (known.has(id)) {\n        continue;\n      }\n      this.deactivate(id);\n      this.enablement.unregister(id);\n      this.listed.delete(id);\n    }\n  }\n\n  private reportRefused(refused: readonly RefusedFramePlugin[]): void {\n    for (const { id, asked } of refused) {\n      const refusal = `${id}|${asked}`;\n      if (this.reportedRefusals.has(refusal)) {\n        continue;\n      }\n      this.reportedRefusals.add(refusal);\n      console.error(\n        `Plugin \"${id}\" asks to run ${asked}, which this catalog may not confer ` +\n          `(it confers at most ${this.catalogMaxLevel}). It is not started.`,\n      );\n    }\n  }\n\n  private activate(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 session = new FrameSession(ctx.state, this.injector);\n    session.addCleanup(\n      this.notifications.limit(plugin.id, ISOLATED_NOTIFICATION_LIMITS),\n    );\n    const frame = this.createFrame(plugin.entryUrl, levelOf(plugin));\n    const connection = this.connect(plugin, ctx, session, frame);\n    this.settlement.track(connection.promise);\n    session.attach(connection.promise);\n    this.instances.set(plugin.id, {\n      ctx,\n      session,\n      connection,\n      frame,\n      signature: signatureOf(plugin),\n    });\n\n    connection.promise.catch((error: unknown) => {\n      if (!this.instances.has(plugin.id)) {\n        return;\n      }\n\n      console.error(`Sandbox plugin \"${plugin.id}\" failed to connect`, error);\n      this.deactivate(plugin.id);\n    });\n  }\n\n  private connect(\n    plugin: RunnableFramePlugin,\n    ctx: HostPluginContext,\n    session: FrameSession,\n    frame: HTMLIFrameElement,\n  ): Connection<FrameRemote> {\n    return connect<FrameRemote>({\n      messenger: new WindowMessenger({\n        remoteWindow: frame.contentWindow as Window,\n        allowedOrigins: ['*'],\n      }),\n      methods: frameRpcMethods({\n        pluginId: plugin.id,\n        ctx,\n        origins: plugin.origins,\n        session,\n        install: this.install,\n        store: this.store,\n        sync: this.sync,\n        reportRefusal: (error) => this.refusals.report(error),\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.append(frame);\n    return frame;\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 {\n  effect,\n  EnvironmentInjector,\n  EnvironmentProviders,\n  inject,\n  provideEnvironmentInitializer,\n  Provider,\n  Service,\n  untracked,\n} from '@angular/core';\nimport { HostPluginContext } from './context/host-plugin-context';\nimport { HostContextFactory } from './context/host-context-factory';\nimport { Plugin, PLUGIN } from './plugin';\nimport { CapabilityGrantService } from '../permissions/capability-grant.service';\nimport { PluginEnablementService } from './enablement/plugin-enablement.service';\nimport { ActivationSettled } from './activation-settled';\n\ninterface TeardownFailure {\n  readonly id: string;\n  readonly error: unknown;\n}\n\n/**\n * Activates the registered trusted plugins, which run in the page. Sandboxed plugins run in the\n * {@link FramePluginRuntime}.\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 settlement = inject(ActivationSettled);\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   * Deactivates a plugin: undoes every contribution it made (via its context's tracked\n   * disposables) and runs its optional `deactivate` hook. Idempotent: an unknown or inactive\n   * id is a no-op. The counterpart to {@link activateAll}.\n   */\n  deactivate(id: string): void {\n    const failure = this.tearDown(id);\n    if (failure) {\n      this.reportTeardownFailure(failure);\n    }\n  }\n\n  /**\n   * Deactivates every active plugin (e.g. on teardown). A teardown that throws does not stop the\n   * others from deactivating; failures are reported once the last plugin is gone.\n   */\n  deactivateAll(): void {\n    const failures: TeardownFailure[] = [];\n    for (const id of this.active.keys()) {\n      const failure = this.tearDown(id);\n      if (failure) {\n        failures.push(failure);\n      }\n    }\n    for (const failure of failures) {\n      this.reportTeardownFailure(failure);\n    }\n  }\n\n  private tearDown(id: string): TeardownFailure | null {\n    const ctx = this.active.get(id);\n    if (!ctx) {\n      return null;\n    }\n    ctx.disposeAll();\n    try {\n      this.plugins.find((plugin) => plugin.manifest.id === id)?.deactivate?.();\n      return null;\n    } catch (error) {\n      return { id, error };\n    } finally {\n      this.active.delete(id);\n      this.grants.unregister(id);\n    }\n  }\n\n  private reportTeardownFailure({ id, error }: TeardownFailure): void {\n    console.error(\n      `Plugin \"${id}\" teardown failed; it was deactivated anyway`,\n      error,\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        this.settlement.track(result);\n        result.then(\n          () => (activating = false),\n          (error: unknown) => this.onActivationError(id, ctx, error),\n        );\n      } else {\n        activating = false;\n      }\n    } catch (error) {\n      this.onActivationError(id, ctx, error);\n    }\n  }\n\n  private onActivationError(\n    id: string,\n    ctx: HostPluginContext,\n    error: unknown,\n  ): void {\n    if (this.active.get(id) !== ctx) {\n      console.error(\n        `Plugin \"${id}\" activation failed, but that activation was superseded; the current one is untouched`,\n        error,\n      );\n      return;\n    }\n    ctx.disposeAll();\n    this.active.delete(id);\n    this.grants.unregister(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 {\n  InstalledPlugin,\n  dedupeById,\n  isSameOriginUrl,\n  nonEmptyText,\n  parseInstalledPlugin,\n} from '../lifecycle/installed-plugin';\n\n/**\n * One entry of the distribution's plugin catalog: an {@link InstalledPlugin} plus the\n * display metadata the store dialog shows: a list of name, author, downloads, last update and\n * description, and a detail pane rendering the plugin's README **in-app**, never an embedded\n * 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\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 = nonEmptyText(entry['readmeUrl']);\n  return {\n    ...base,\n    description: nonEmptyText(entry['description']),\n    icon: nonEmptyText(entry['icon']),\n    category: nonEmptyText(entry['category']),\n    author: nonEmptyText(entry['author']),\n    downloads:\n      typeof entry['downloads'] === 'number' && entry['downloads'] >= 0\n        ? entry['downloads']\n        : undefined,\n    updated: nonEmptyText(entry['updated']),\n    repository: httpUrl(entry['repository']),\n    readmeUrl: readmeUrl && isSameOriginUrl(readmeUrl) ? readmeUrl : undefined,\n    deployed: entry['deployed'] === true ? true : undefined,\n  };\n}\n\nexport function parseCatalogList(raw: unknown): readonly PluginCatalogEntry[] {\n  if (!Array.isArray(raw)) {\n    return [];\n  }\n  return dedupeById(raw.map((entry) => parseCatalogEntry(entry)));\n}\n","import { InjectionToken } from '@angular/core';\nimport { isSameOriginUrl } from '../lifecycle/installed-plugin';\nimport { PluginCatalogEntry, parseCatalogList } from './catalog-entry';\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 port — 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","export 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 { computed, inject, Service, signal } from '@angular/core';\nimport { PLUGIN_CATALOG } from './plugin-catalog';\nimport { PluginCatalogEntry } from './catalog-entry';\n\ntype CatalogState =\n  | { readonly status: 'loading' }\n  | { readonly status: 'failed' }\n  | {\n      readonly status: 'loaded';\n      readonly entries: readonly PluginCatalogEntry[];\n    };\n\n@Service()\nexport class PluginCatalogEntries {\n  private readonly catalog = inject(PLUGIN_CATALOG, { optional: true });\n  private readonly state = signal<CatalogState>(\n    this.catalog ? { status: 'loading' } : { status: 'loaded', entries: [] },\n  );\n\n  readonly entries = computed(() => {\n    const state = this.state();\n    return state.status === 'loaded' ? state.entries : undefined;\n  });\n\n  readonly failed = computed(() => this.state().status === 'failed');\n\n  private requested = false;\n\n  ensureLoaded(): void {\n    if (!this.requested) {\n      this.load().catch(() => undefined);\n    }\n  }\n\n  async load(): Promise<readonly PluginCatalogEntry[]> {\n    if (!this.catalog) {\n      return [];\n    }\n    this.requested = true;\n    this.state.set({ status: 'loading' });\n    try {\n      const entries = await this.catalog.load();\n      this.state.set({ status: 'loaded', entries });\n      return entries;\n    } catch (error) {\n      this.state.set({ status: 'failed' });\n      throw error;\n    }\n  }\n}\n","import {\n  DEFAULT_ISOLATION_LEVEL,\n  exceedsLevel,\n} from '../../foundation/plugin-isolation-level';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport { InstalledPlugin } from './installed-plugin';\nimport { PluginCatalogEntry } from '../catalog/catalog-entry';\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 raisedLevel(\n  entry: PluginCatalogEntry,\n  installed: InstalledPlugin,\n): boolean {\n  return exceedsLevel(\n    entry.level ?? DEFAULT_ISOLATION_LEVEL,\n    installed.level ?? DEFAULT_ISOLATION_LEVEL,\n  );\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 { inject, Service } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Capability } from '@loomweaver/plugin-sdk';\nimport { DialogService } from '../../dialog/dialog.service';\nimport { PluginDisableGuard } from '../../plugin/enablement/plugin-disable-guard';\nimport { PluginCatalogEntry } from '../catalog/catalog-entry';\nimport { PluginInstallService } from './plugin-install.service';\nimport { addedCapabilities, raisedLevel } from './plugin-update';\nimport { DEFAULT_ISOLATION_LEVEL } from '../../foundation/plugin-isolation-level';\n\n@Service()\nexport class PluginStoreConsent {\n  private readonly dialogs = inject(DialogService);\n  private readonly transloco = inject(TranslocoService);\n  private readonly installs = inject(PluginInstallService);\n  private readonly disableGuard = inject(PluginDisableGuard);\n\n  async confirmInstall(entry: PluginCatalogEntry): Promise<void> {\n    const accepted = await this.dialogs.confirm({\n      title: this.transloco.translate('settings.storeInstallTitle', {\n        name: entry.name,\n      }),\n      message: this.installMessage(entry),\n      confirmLabel: this.transloco.translate('settings.storeInstall'),\n      icon: entry.icon ?? 'plugin',\n    });\n    if (!accepted) {\n      return;\n    }\n    this.installs.install(entry);\n  }\n\n  async confirmUpdate(entry: PluginCatalogEntry): Promise<void> {\n    const installed = this.installs.byId(entry.id);\n    if (!installed) {\n      return;\n    }\n    const added = addedCapabilities(entry, installed);\n    const raised = raisedLevel(entry, installed);\n    if (added.length > 0 || raised) {\n      const accepted = await this.dialogs.confirm({\n        title: this.transloco.translate('settings.storeUpdateTitle', {\n          name: entry.name,\n        }),\n        message: this.updateMessage(entry, added, raised),\n        confirmLabel: this.transloco.translate('settings.storeUpdate'),\n        icon: entry.icon ?? 'plugin',\n      });\n      if (!accepted) {\n        return;\n      }\n    }\n    if (!(await this.disableGuard.confirmRemoval(entry.id))) {\n      return;\n    }\n    this.installs.update(entry);\n  }\n\n  async confirmUninstall(id: string, name: string): Promise<void> {\n    const accepted = await this.dialogs.confirm({\n      title: this.transloco.translate('settings.storeUninstallTitle', { name }),\n      message: this.transloco.translate('settings.storeUninstallConfirm', {\n        name,\n      }),\n      confirmLabel: this.transloco.translate('settings.storeUninstall'),\n      tone: 'danger',\n    });\n    if (!accepted || !(await this.disableGuard.confirmRemoval(id))) {\n      return;\n    }\n    this.installs.uninstall(id);\n  }\n\n  private installMessage(entry: PluginCatalogEntry): string {\n    const paragraphs: string[] = [];\n    if (entry.description) {\n      paragraphs.push(entry.description, '');\n    }\n    paragraphs.push(this.levelLine(entry), '');\n    const capabilities = entry.capabilities ?? [];\n    if (capabilities.length === 0) {\n      paragraphs.push(\n        this.transloco.translate('settings.storeConsentNone', {\n          name: entry.name,\n        }),\n      );\n      return paragraphs.join('\\n');\n    }\n    paragraphs.push(\n      this.transloco.translate('settings.storeConsent', { name: entry.name }),\n      '',\n      ...this.permissionLines(capabilities),\n    );\n    return paragraphs.join('\\n');\n  }\n\n  private updateMessage(\n    entry: PluginCatalogEntry,\n    added: readonly Capability[],\n    raised: boolean,\n  ): string {\n    return [\n      this.transloco.translate('settings.storeUpdateConsent', {\n        name: entry.name,\n        version: entry.version ?? '',\n      }),\n      '',\n      ...(raised ? [this.levelLine(entry), ''] : []),\n      ...this.permissionLines(added),\n    ].join('\\n');\n  }\n\n  private levelLine(entry: PluginCatalogEntry): string {\n    return this.transloco.translate(\n      `settings.pluginLevel.${entry.level ?? DEFAULT_ISOLATION_LEVEL}`,\n    );\n  }\n\n  private permissionLines(capabilities: readonly Capability[]): string[] {\n    return capabilities.map((cap) => {\n      const label = this.transloco.translate(`settings.capability.${cap}`);\n      const description = this.transloco.translate(\n        `settings.capabilityDesc.${cap}`,\n      );\n      return `- **${label}** — ${description}`;\n    });\n  }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, input } from '@angular/core';\n\n@Component({\n  selector: 'lw-plugin-icon',\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  templateUrl: './plugin-icon.html',\n  host: { class: 'flex shrink-0' },\n})\nexport class PluginIcon {\n  readonly src = input<string | undefined>(undefined);\n}\n","@if (src(); as url) {\n  <img class=\"size-8 rounded-md\" [src]=\"url\" alt=\"\" />\n} @else {\n  <span\n    class=\"flex size-8 items-center justify-center rounded-md bg-surface-overlay text-content-muted\"\n  >\n    <lw-icon name=\"plugin\" size=\"1rem\" />\n  </span>\n}\n","import {\n  Component,\n  CUSTOM_ELEMENTS_SCHEMA,\n  computed,\n  inject,\n  input,\n  OnInit,\n  output,\n} from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { SettingsService } from '../settings-dialog/settings.service';\nimport { PluginCatalogEntry } from './catalog/catalog-entry';\nimport { PluginDisableGuard } from '../plugin/enablement/plugin-disable-guard';\nimport { PluginEnablementService } from '../plugin/enablement/plugin-enablement.service';\nimport { PluginInstallService } from './lifecycle/plugin-install.service';\nimport { PluginDeploymentService } from './lifecycle/plugin-deployment.service';\nimport { matchesQuery } from './catalog/catalog-search';\nimport { PluginCatalogEntries } from './catalog/plugin-catalog-entries';\nimport { PluginStoreConsent } from './lifecycle/plugin-store-consent';\nimport { LwButton } from '../elements/button/lw-button';\nimport { PluginIcon } from './plugin-icon';\nimport { availableUpdate } from './lifecycle/plugin-update';\nimport { frameSettingsGroup } from '../plugin/frame/frame-settings-section';\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 deployed: 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, LwButton, PluginIcon],\n  templateUrl: './installed-plugin-list.html',\n})\nexport class InstalledPluginList implements OnInit {\n  private readonly catalog = inject(PluginCatalogEntries);\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 consent = inject(PluginStoreConsent);\n\n  readonly query = input('');\n\n  readonly settingsOpened = output<void>();\n\n  protected readonly rows = computed<readonly InstalledRow[]>(() => {\n    const catalog = new Map(\n      (this.catalog.entries() ?? []).map((entry) => [entry.id, entry]),\n    );\n    const sections = this.settings.all();\n    const deployed = this.deployment.deployed();\n    const deployedIds = new Set(deployed.map((plugin) => plugin.id));\n    return [\n      ...deployed,\n      ...this.installs\n        .installed()\n        .filter((plugin) => !deployedIds.has(plugin.id)),\n    ]\n      .map((plugin) => {\n        const entry = catalog.get(plugin.id);\n        const isDeployed = deployedIds.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: this.enablement.isEnabled(plugin.id),\n          deployed: isDeployed,\n          settingsSectionId: sections.find(\n            (section) =>\n              section.group === frameSettingsGroup(this.installs, plugin.id) &&\n              section.id.startsWith(`${plugin.id}.`),\n          )?.id,\n          update: isDeployed ? 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    this.catalog.ensureLoaded();\n  }\n\n  protected togglePlugin(id: string, event: Event): void {\n    this.disableGuard.toggleFrom(id, event);\n  }\n\n  protected update(entry: PluginCatalogEntry): void {\n    void this.consent.confirmUpdate(entry);\n  }\n\n  protected uninstall(row: InstalledRow): void {\n    void this.consent.confirmUninstall(row.id, row.name);\n  }\n\n  protected openPluginSettings(sectionId: string): void {\n    this.settingsOpened.emit();\n    this.settings.open(sectionId);\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        <lw-plugin-icon [src]=\"row.iconUrl\" />\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.deployed) {\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.deployed) {\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              type=\"button\"\n              lwButton\n              variant=\"primary\"\n              size=\"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.deployed) {\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","import { inject, Pipe, PipeTransform } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\n\nconst 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\n@Pipe({ name: 'catalogCount', pure: false })\nexport class CatalogCountPipe implements PipeTransform {\n  private readonly transloco = inject(TranslocoService);\n\n  transform(count: number): string {\n    return formatCount(this.transloco.getActiveLang(), count);\n  }\n}\n\n@Pipe({ name: 'relativeDate', pure: false })\nexport class RelativeDatePipe implements PipeTransform {\n  private readonly transloco = inject(TranslocoService);\n\n  transform(iso: string): string {\n    return formatUpdated(this.transloco.getActiveLang(), iso);\n  }\n}\n","import { Component, CUSTOM_ELEMENTS_SCHEMA, input, output } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { PluginCatalogEntry } from './catalog/catalog-entry';\nimport { CatalogCountPipe, RelativeDatePipe } from './catalog-figures';\nimport { PluginIcon } from './plugin-icon';\n\n@Component({\n  selector: 'lw-plugin-store-card',\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  imports: [TranslocoPipe, CatalogCountPipe, RelativeDatePipe, PluginIcon],\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 provided = input(false);\n  readonly hasUpdate = input(false);\n  readonly picked = output<void>();\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    <lw-plugin-icon class=\"mt-0.5\" [src]=\"entry.iconUrl\" />\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 (provided()) {\n          <span\n            class=\"lw-badge\"\n            [attr.data-testid]=\"'store-provided-badge-' + entry.id\"\n            >{{ 'settings.storeProvidedBadge' | transloco }}</span\n          >\n        } @else 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: entry.downloads | catalogCount }\n          }}\n        }\n        @if (entry.downloads !== undefined && entry.updated) {\n          ·\n        }\n        @if (entry.updated) {\n          {{\n            'settings.storeUpdated' | transloco: { date: entry.updated | relativeDate }\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 } from '@jsverse/transloco';\nimport { PluginCatalogEntry } from './catalog/catalog-entry';\nimport { PluginInstallService } from './lifecycle/plugin-install.service';\nimport { PluginDeploymentService } from './lifecycle/plugin-deployment.service';\nimport { CatalogCountPipe, RelativeDatePipe } from './catalog-figures';\nimport { LwButton } from '../elements/button/lw-button';\nimport { availableUpdate } from './lifecycle/plugin-update';\n\n@Component({\n  selector: 'lw-plugin-store-detail',\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  imports: [TranslocoPipe, CatalogCountPipe, RelativeDatePipe, LwButton],\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  protected readonly deployment = inject(PluginDeploymentService);\n\n  protected readonly readme = signal<string | undefined>(undefined);\n\n  protected readonly update = computed(() =>\n    availableUpdate(this.installs.byId(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  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: entry.downloads | catalogCount }\n              }}\n            }\n            @if (entry.updated) {\n              ·\n              {{\n                'settings.storeUpdated'\n                  | transloco: { date: entry.updated | relativeDate }\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 (deployment.isDeployed(entry.id)) {\n          <span\n            class=\"lw-badge\"\n            [attr.data-testid]=\"'store-provided-' + entry.id\"\n            >{{ 'settings.storeProvidedBadge' | transloco }}</span\n          >\n        } @else if (installs.isInstalled(entry.id)) {\n          @if (update(); as pending) {\n            <button\n              type=\"button\"\n              lwButton\n              variant=\"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            type=\"button\"\n            lwButton\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            type=\"button\"\n            lwButton\n            variant=\"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 (deployment.isDeployed(entry.id)) {\n      <p class=\"text-sm text-content-muted\">\n        {{ 'settings.storeProvidedHint' | transloco }}\n      </p>\n    }\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 { DialogRef } from '@loomweaver/plugin-sdk';\nimport { Component, CUSTOM_ELEMENTS_SCHEMA, computed, inject, OnInit, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { WideDialogFrame } from '../dialog/wide-dialog-frame';\nimport { LwButton } from '../elements/button/lw-button';\nimport { PluginCatalogEntry } from './catalog/catalog-entry';\nimport { PluginInstallService } from './lifecycle/plugin-install.service';\nimport { PluginDeploymentService } from './lifecycle/plugin-deployment.service';\nimport { InstalledPluginList } from './installed-plugin-list';\nimport { PluginStoreCard } from './plugin-store-card';\nimport { PluginStoreDetail } from './plugin-store-detail';\nimport { matchesQuery } from './catalog/catalog-search';\nimport { PluginCatalogEntries } from './catalog/plugin-catalog-entries';\nimport { PluginStoreConsent } from './lifecycle/plugin-store-consent';\nimport { availableUpdate } from './lifecycle/plugin-update';\n\nexport const DEFAULT_STORE_TITLE = 'settings.pluginStore';\n\nexport interface PluginStoreDialogData {\n  readonly title: string;\n}\n\n@Component({\n  selector: 'lw-plugin-store-dialog',\n  schemas: [CUSTOM_ELEMENTS_SCHEMA],\n  imports: [\n    WideDialogFrame,\n    TranslocoPipe,\n    LwButton,\n    InstalledPluginList,\n    PluginStoreCard,\n    PluginStoreDetail,\n  ],\n  templateUrl: './plugin-store-dialog.html',\n})\nexport class PluginStoreDialog implements OnInit {\n  private readonly ref = inject(DialogRef);\n  protected readonly title =\n    (this.ref.data as PluginStoreDialogData | undefined)?.title ??\n    DEFAULT_STORE_TITLE;\n  protected readonly installs = inject(PluginInstallService);\n  protected readonly deployment = inject(PluginDeploymentService);\n\n  private readonly catalog = inject(PluginCatalogEntries);\n\n  private readonly consent = inject(PluginStoreConsent);\n\n  protected readonly entries = this.catalog.entries;\n  protected readonly failed = this.catalog.failed;\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.toSorted(\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    this.catalog.load().catch(() => undefined);\n  }\n\n  protected requestInstall(entry: PluginCatalogEntry): void {\n    void this.consent.confirmInstall(entry);\n  }\n\n  protected hasUpdate(entry: PluginCatalogEntry): boolean {\n    return availableUpdate(this.installs.byId(entry.id), entry) !== undefined;\n  }\n\n  protected requestUpdate(entry: PluginCatalogEntry): void {\n    void this.consent.confirmUpdate(entry);\n  }\n\n  protected requestUninstall(entry: PluginCatalogEntry): void {\n    void this.consent.confirmUninstall(entry.id, entry.name);\n  }\n\n  protected onQuery(event: Event): void {\n    this.query.set((event.target as HTMLInputElement).value);\n  }\n\n  protected close(): void {\n    this.ref.close();\n  }\n}\n","<lw-wide-dialog-frame [title]=\"title\">\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)=\"onQuery($event)\"\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        data-testid=\"store-list\"\n        [class.max-sm:hidden]=\"selected() !== undefined\"\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                  [provided]=\"deployment.isDeployed(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\n        class=\"min-h-0 flex-1 overflow-y-auto p-5\"\n        data-testid=\"store-detail-pane\"\n        [class.max-sm:hidden]=\"selected() === undefined\"\n      >\n        @if (selected(); as entry) {\n          <button\n            type=\"button\"\n            lwButton\n            variant=\"ghost\"\n            size=\"sm\"\n            class=\"mb-3 sm:hidden\"\n            data-testid=\"store-back\"\n            (click)=\"selectedId.set(undefined)\"\n          >\n            {{ 'settings.storeBackToList' | transloco }}\n          </button>\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</lw-wide-dialog-frame>\n","import { DialogRef } from '@loomweaver/plugin-sdk';\nimport { inject, Service, signal } from '@angular/core';\nimport { DialogService } from '../dialog/dialog.service';\nimport {\n  DEFAULT_STORE_TITLE,\n  PluginStoreDialog,\n  PluginStoreDialogData,\n} from './plugin-store-dialog';\n\n@Service()\nexport class PluginStoreService {\n  private readonly dialogs = inject(DialogService);\n  private readonly storeTitle = signal(DEFAULT_STORE_TITLE);\n\n  readonly title = this.storeTitle.asReadonly();\n\n  configure(title: string): void {\n    this.storeTitle.set(title);\n  }\n\n  open(): DialogRef {\n    const data: PluginStoreDialogData = { title: this.storeTitle() };\n    return this.dialogs.open(PluginStoreDialog, {\n      title: data.title,\n      data,\n      bare: true,\n      size: 'xl',\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';\nimport { LwButton } from '../elements/button/lw-button';\n\n@Component({\n  selector: 'lw-plugin-store-settings',\n  imports: [TranslocoPipe, InstalledPluginList, LwButton],\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  protected onQuery(event: Event): void {\n    this.query.set((event.target as HTMLInputElement).value);\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)=\"onQuery($event)\"\n  />\n  <button\n    type=\"button\"\n    lwButton\n    variant=\"primary\"\n    class=\"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-dialog/settings.service';\nimport { PluginStoreSettings } from '../plugin-store-settings';\nimport { ContributionRegistry } from '../../contributions/contribution-registry';\nimport { PluginStoreService } from '../plugin-store.service';\nimport { DEFAULT_STORE_TITLE } from '../plugin-store-dialog';\nimport { FramePluginRuntime } from '../../plugin/frame/frame-plugin-runtime';\nimport {\n  PLUGIN_CATALOG,\n  PluginCatalog,\n  urlPluginCatalog,\n} from './plugin-catalog';\nimport { PluginDeploymentService } from '../lifecycle/plugin-deployment.service';\nimport { PluginCatalogEntries } from './plugin-catalog-entries';\nimport { PluginIsolationLevel } from '../../foundation/plugin-isolation-level';\nimport { CATALOG_MAX_ISOLATION_LEVEL } from './catalog-level-cap';\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 frame 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** (a\n * searchable list and an in-app detail pane with the plugin's 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 ?? DEFAULT_STORE_TITLE;\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(PluginCatalogEntries)\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 { Service } from '@angular/core';\nimport {\n  ActivatedRouteSnapshot,\n  DetachedRouteHandle,\n  RouteReuseStrategy,\n} from '@angular/router';\nimport { isContentRoute } from './content-route-table';\n\n@Service()\nexport class ContentReuseStrategy implements RouteReuseStrategy {\n  shouldReuseRoute(\n    future: ActivatedRouteSnapshot,\n    current: ActivatedRouteSnapshot,\n  ): boolean {\n    if (!isContentRoute(future) || !isContentRoute(current)) {\n      return future.routeConfig === current.routeConfig;\n    }\n    return (\n      future.routeConfig === current.routeConfig && sameParams(future, current)\n    );\n  }\n\n  shouldDetach(): boolean {\n    return false;\n  }\n\n  store(): void {\n    return;\n  }\n\n  shouldAttach(): boolean {\n    return false;\n  }\n\n  retrieve(): DetachedRouteHandle | null {\n    return null;\n  }\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","import { effect, inject, Injector, Service, untracked } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { PopoutWindow } from '../../../popout/popout-window';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { normalizePath, tabRootOf } from '../../content/content-path';\nimport { collectTabPaths } from '../tree/pane-queries';\nimport { PaneChromeService } from '../chrome/pane-chrome.service';\nimport { containerPathOfDock, 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 = inject(PopoutWindow).active;\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        untracked(() => {\n          const routes = this.registry.contentRoutes();\n          const open = new Set(\n            Object.entries(trees)\n              .filter(([dock]) => !isContainerDock(dock))\n              .flatMap(([, tree]) => collectTabPaths(tree))\n              .map((path) => tabRootOf(routes, path)),\n          );\n          const active = tabRootOf(routes, normalizePath(this.router.url));\n          for (const dock of containerDocks) {\n            const contentPath = containerPathOfDock(dock);\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 { inject, Service } from '@angular/core';\nimport { ContentRoute, View } from '@loomweaver/plugin-sdk';\nimport { NotificationService } from '../../../notifications/notification.service';\nimport { saveOnHidePath } from '../retention/retention-policy';\nimport { dirtySurfaceOf } from './dirty-surface';\n\n@Service()\nexport class SaveOnHide {\n  private readonly notifications = inject(NotificationService);\n  private saved = new Set<unknown>();\n\n  forgetAllBut(parked: ReadonlySet<unknown>): void {\n    this.saved = new Set(\n      [...this.saved].filter((instance) => parked.has(instance)),\n    );\n  }\n\n  saveOnce(\n    instance: unknown,\n    path: string,\n    routes: readonly ContentRoute[],\n    views: readonly View[],\n  ): void {\n    if (this.saved.has(instance) || !saveOnHidePath(routes, views, path)) {\n      return;\n    }\n    const save = dirtySurfaceOf(instance)?.surfaceSave;\n    if (!save) {\n      return;\n    }\n    this.saved.add(instance);\n    new Promise((resolve) => resolve(promisedBy(save.call(instance)))).catch(\n      (error: unknown) => {\n        console.error('saveOn:hide failed — the surface stays dirty', error);\n        this.notifications.show({\n          message: 'retention.saveFailed',\n          kind: 'error',\n        });\n      },\n    );\n  }\n}\n\nfunction promisedBy(result: unknown): PromiseLike<unknown> {\n  if (\n    typeof (result as PromiseLike<unknown> | undefined)?.then !== 'function'\n  ) {\n    throw new TypeError('surfaceSave returned no promise');\n  }\n  return result as PromiseLike<unknown>;\n}\n","import { effect, inject, Injector, Service, untracked } from '@angular/core';\nimport { ContentRoute, View } from '@loomweaver/plugin-sdk';\nimport { PopoutWindow } from '../../../popout/popout-window';\nimport { ActiveWorkspaceService } from '../../../workspace/active-workspace.service';\nimport { ContributionRegistry } from '../../../contributions/contribution-registry';\nimport { tabRootOf } from '../../content/content-path';\nimport { PaneNode } from '../tree/pane-node';\nimport { leavesOf } from '../tree/pane-queries';\nimport { PaneTreeService } from '../tree/pane-tree.service';\nimport { RetainedViewStash } from './retained-view-stash';\nimport { resolvableSurfacePath } from './retention-policy';\nimport { instanceDirty } from '../unsaved-work/dirty-surface';\nimport { SaveOnHide } from '../unsaved-work/save-on-hide';\nimport {\n  isPrimaryRetentionKey,\n  paneRetentionScope,\n  pathOfRetentionKey,\n  scopeOfRetentionKey,\n} from './retention-keys';\n\ninterface ParkedInstance {\n  readonly key: string;\n  readonly instance?: unknown;\n  readonly retains: boolean;\n  readonly held: boolean;\n  readonly path: string;\n  readonly dirty: boolean;\n  readonly tabLive: boolean;\n  readonly parkedElsewhere: boolean;\n}\n\n@Service()\nexport class ParkedViewSweep {\n  private readonly paneTree = inject(PaneTreeService);\n  private readonly registry = inject(ContributionRegistry);\n  private readonly stash = inject(RetainedViewStash);\n  private readonly saveOnHide = inject(SaveOnHide);\n  private readonly injector = inject(Injector);\n  private readonly workspace = inject(ActiveWorkspaceService);\n  private readonly popout = inject(PopoutWindow).active;\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        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 = this.parkedStash(open, routes, views, active);\n        untracked(() => this.sweep(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      key: entry.key,\n      instance: entry.instance,\n      retains: entry.retains,\n      held: entry.held,\n      path: pathOfRetentionKey(entry.key),\n      dirty: instanceDirty(entry.instance),\n      tabLive:\n        stashKeyLive(entry.key, open, routes, views) ||\n        (entry.held &&\n          openAnywhere(pathOfRetentionKey(entry.key), open, routes)),\n      parkedElsewhere: entry.workspace !== active,\n    }));\n  }\n\n  private sweep(\n    parked: readonly ParkedInstance[],\n    routes: readonly ContentRoute[],\n    views: readonly View[],\n  ): void {\n    this.saveOnHide.forgetAllBut(\n      new Set(parked.map((entry) => entry.instance)),\n    );\n    for (const entry of parked) {\n      if (!entry.tabLive && !entry.parkedElsewhere) {\n        this.stash.evictParked(entry.key);\n        continue;\n      }\n      if (entry.dirty) {\n        this.saveOnHide.saveOnce(entry.instance, entry.path, routes, views);\n        continue;\n      }\n      if (!entry.retains && !entry.held) {\n        this.stash.evictParked(entry.key);\n      }\n    }\n  }\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 (isPrimaryRetentionKey(key)) {\n    return true;\n  }\n  const path = pathOfRetentionKey(key);\n  if (!tabOpen(open.get(scopeOfRetentionKey(key)), routes, path)) {\n    return false;\n  }\n  return resolvableSurfacePath(routes, views, path);\n}\n\nfunction openAnywhere(\n  path: string,\n  open: Map<string, Set<string>>,\n  routes: readonly ContentRoute[],\n): boolean {\n  return [...open.values()].some((paths) => tabOpen(paths, routes, 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    for (const leaf of leavesOf(tree)) {\n      const scope = paneRetentionScope(dock, leaf.id);\n      const paths = open.get(scope) ?? new Set<string>();\n      for (const tab of leaf.tabs) {\n        paths.add(tab.path);\n      }\n      open.set(scope, paths);\n    }\n  }\n  return open;\n}\n","import {\n  EnvironmentProviders,\n  inject,\n  provideAppInitializer,\n} from '@angular/core';\nimport { ContainerDockGc } from './container/container-dock-gc';\nimport { ParkedViewSweep } from './retention/parked-view-sweep';\nimport { RetentionUnloadGuard } from './unsaved-work/retention-unload-guard';\n\nexport function providePaneHousekeeping(): EnvironmentProviders {\n  return provideAppInitializer(() => {\n    inject(ContainerDockGc).start();\n    inject(ParkedViewSweep).start();\n    inject(RetentionUnloadGuard).start();\n  });\n}\n","import { Component, computed, effect, inject, untracked } from '@angular/core';\nimport {\n  ActivatedRoute,\n  Router,\n  RouterOutlet,\n} from '@angular/router';\nimport { CurrentAddress } from '../../content/current-address';\nimport {\n  CONTAINER_HANDLE,\n  ContainerSpec,\n  ContainerTabLabel,\n} from '@loomweaver/plugin-sdk';\nimport { CONTAINER_CONTEXT, ContainerContext } from './container-context';\nimport { containerChildPath, containerDockFor } from './container-children';\nimport { LeftOutChildren, shownTree } from './left-out-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, leafWith } from '../tree/pane-node';\nimport { findLeaf, leavesOf } from '../tree/pane-queries';\nimport {\n  isAtOrBelow,\n  normalizePath,\n  restBelow,\n} from '../../content/content-path';\nimport { surfaceRouteData } from '../../content/surface/surface-route-data';\n\ninterface ContainerIdentity {\n  readonly containerPath: string;\n  readonly dock: string;\n  readonly spec: ContainerSpec | undefined;\n}\n\nfunction containerIdentityOf(route: ActivatedRoute): ContainerIdentity {\n  const containerPath = route.snapshot.url\n    .map((segment) => segment.path)\n    .join('/');\n  return {\n    containerPath,\n    dock: containerDockFor(containerPath),\n    spec: surfaceRouteData(route.snapshot.data).container,\n  };\n}\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 { dock, spec } = containerIdentityOf(route);\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  private readonly leftOut = inject(LeftOutChildren);\n\n  private readonly identity = containerIdentityOf(this.route);\n\n  protected readonly paneOptions = CONTAINER_PANE_OPTIONS;\n  protected readonly dock = this.identity.dock;\n  protected readonly tree = computed(\n    () =>\n      shownTree(this.paneTree.tree(this.dock), (path) =>\n        this.leftOut.hides(path),\n      ) ?? leafWith(this.paneTree.primaryId(this.dock), [], undefined),\n  );\n\n  private readonly containerPath = this.identity.containerPath;\n  private readonly spec = this.identity.spec;\n\n  private readonly currentUrl = inject(CurrentAddress).url;\n\n  private readonly urlSegment = computed(() => {\n    const url = normalizePath(this.currentUrl());\n    return isAtOrBelow(this.containerPath, url)\n      ? restBelow(this.containerPath, url)\n      : null;\n  });\n\n  private readonly focusedSegment = computed(() => {\n    const tree = this.tree();\n    const leaf =\n      findLeaf(tree, this.paneTree.primaryId(this.dock)) ?? leavesOf(tree)[0];\n    const path = leaf ? activeTab(leaf)?.path : undefined;\n    return path === undefined\n      ? ''\n      : restBelow(this.containerPath, normalizePath(path));\n  });\n\n  private readonly arranged = computed(() => this.paneTree.hasDock(this.dock));\n\n  constructor() {\n    this.containers.ensureContainer(this.dock, this.spec);\n    this.followUrl();\n    this.leadUrl();\n  }\n\n  private followUrl(): void {\n    effect(() => {\n      if (!this.arranged()) {\n        untracked(() => this.containers.ensureContainer(this.dock, this.spec));\n      }\n      const segment = this.urlSegment();\n      if (\n        !segment ||\n        segment === untracked(() => this.focusedSegment()) ||\n        this.leftOut.hides(containerChildPath(this.containerPath, segment))\n      ) {\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 {\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 { DISTRIBUTION_ROUTES } from './distribution-routes';\nimport { ContentReuseStrategy } from './content-reuse-strategy';\nimport { providePaneHousekeeping } from '../../pane/pane-housekeeping';\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 pieces that make plugin-contributed content routes work as one\n * foolproof unit, so a distribution author cannot forget the initial-navigation flag. The router holds\n * the address, its guards and its history; the panes draw the content, so a surface stays where it\n * is drawn when the address moves between panes:\n *\n * - `withDisabledInitialNavigation()` — the router does not navigate until the plugin routes exist.\n * - a route reuse strategy that never carries a content route across a change of its values.\n * - an app-initializer that, after plugins activate, mirrors the registered content routes into the\n *   router and then performs the deferred initial navigation.\n *\n * Pass `extraRoutes` for any non-content routes the distribution owns — a redirect for the address\n * that names no content, a legal page, a sign-in page. They stay reachable for the life of the\n * application: the shell rebuilds the route table whenever the contributed routes change and puts\n * them back each time, before the contributed ones, so a distribution can correct an address a\n * plugin also declares (the developer is told in development). A catch-all among them is placed\n * last, so a page for addresses that name nothing cannot swallow the plugins' own. A route the\n * distribution owns opens no content tab.\n */\nexport function provideShellRouter(\n  extraRoutes: Routes = [],\n): (Provider | EnvironmentProviders)[] {\n  return [\n    provideRouter([...extraRoutes], withDisabledInitialNavigation()),\n    { provide: DISTRIBUTION_ROUTES, useValue: extraRoutes },\n\n    { provide: RouteReuseStrategy, useExisting: ContentReuseStrategy },\n    { provide: CONTAINER_PANE_HOST, useValue: ContainerPaneHost },\n    provideAppInitializer(() => inject(ContentRouter).start()),\n    providePaneHousekeeping(),\n  ];\n}\n","import { computed, inject, Service, Signal } from '@angular/core';\nimport { SHELL_LAYOUT } from '../../layout/layout';\nimport { HiddenViewsService } from './hidden-views.service';\nimport { PanelSizeService } from './panel-size.service';\nimport { PanelState } from './panel-state';\nimport { ViewVisibilityService } from './view-visibility.service';\nimport { regionIdsOfType } from '../../layout/layout-queries';\n\n/** What the workbench knows about one declared sidebar, as facts. */\nexport interface SidebarFacts {\n  /** The region id the distribution declared for this panel. */\n  readonly regionId: string;\n  /** Whether the panel is collapsed. */\n  readonly collapsed: boolean;\n  /** The panel's width in pixels, as the user or the distribution last set it. */\n  readonly width: number;\n}\n\n/**\n * The sidebars for a distribution: what the sidebar header, the splitter and the view menu do,\n * reachable from your own code by the ids you declared, plus the sidebars as facts.\n *\n * ```ts\n * const sidebars = inject(SidebarService);\n * sidebars.regions();                   // SidebarFacts[] for every declared panel\n * sidebars.isCollapsed('primary');      // reactive where it is read\n * sidebars.collapse('primary');         // as from the header\n * sidebars.setWidth('primary', 320);    // clamped to the usable range and remembered\n * sidebars.hideView('outline');         // asks about unsaved work like the view menu\n * ```\n *\n * Every action is the same code the control runs. A region id that no declared panel carries\n * does nothing. The capability switches do not reach this service: what a distribution has\n * switched off for its users, it can still do from here.\n */\n@Service()\nexport class SidebarService {\n  private readonly panels = inject(PanelState);\n  private readonly sizes = inject(PanelSizeService);\n  private readonly visibility = inject(ViewVisibilityService);\n  private readonly hidden = inject(HiddenViewsService);\n  private readonly panelRegions = regionIdsOfType(\n    inject(SHELL_LAYOUT),\n    'panel',\n  );\n\n  /** Every declared sidebar, in layout order. */\n  readonly regions: Signal<readonly SidebarFacts[]> = computed(() =>\n    this.panelRegions.map((regionId) => ({\n      regionId,\n      collapsed: this.panels.isCollapsed(regionId),\n      width: this.sizes.width(regionId),\n    })),\n  );\n\n  /** The ids of the views the user or the distribution hid. */\n  readonly hiddenViews: Signal<readonly string[]> = computed(() => [\n    ...this.hidden.hidden(),\n  ]);\n\n  /** Whether the panel is collapsed; reactive where it is read. */\n  isCollapsed(regionId: string): boolean {\n    return this.panels.isCollapsed(regionId);\n  }\n\n  /** The panel's width in pixels; reactive where it is read. */\n  width(regionId: string): number {\n    return this.sizes.width(regionId);\n  }\n\n  /** Collapses the panel, as its header would. */\n  collapse(regionId: string): void {\n    if (this.declared(regionId) && !this.panels.isCollapsed(regionId)) {\n      this.panels.toggle(regionId);\n    }\n  }\n\n  /** Expands the panel, as its header would. */\n  expand(regionId: string): void {\n    if (this.declared(regionId)) {\n      this.panels.expand(regionId);\n    }\n  }\n\n  /** Collapses an expanded panel and expands a collapsed one. */\n  toggle(regionId: string): void {\n    if (this.declared(regionId)) {\n      this.panels.toggle(regionId);\n    }\n  }\n\n  /** Sets the panel's width, brought into the usable range and remembered like a released drag. */\n  setWidth(regionId: string, px: number): void {\n    if (!this.declared(regionId)) {\n      return;\n    }\n    this.sizes.setWidth(regionId, px);\n    this.sizes.commit();\n  }\n\n  /** Hides a view from the sidebars, asking about unsaved work exactly as the view menu does. */\n  hideView(viewId: string): void {\n    this.visibility.hide(viewId);\n  }\n\n  /** Shows a hidden view again, in the sidebar it was declared for or in the one named. */\n  showView(viewId: string, regionId?: string): void {\n    if (regionId !== undefined && !this.declared(regionId)) {\n      return;\n    }\n    this.visibility.reveal(viewId, regionId);\n  }\n\n  private declared(regionId: string): boolean {\n    return this.panelRegions.includes(regionId);\n  }\n}\n"],"mappings":"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"}