ngwr 11.1.0 → 11.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/circular-text/styles/_index.scss +11 -0
- package/command-palette/styles/_index.scss +12 -0
- package/fesm2022/ngwr-action-sheet-testing.mjs +313 -0
- package/fesm2022/ngwr-action-sheet-testing.mjs.map +1 -0
- package/fesm2022/ngwr-bar-chart-testing.mjs +89 -0
- package/fesm2022/ngwr-bar-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-blur-text-testing.mjs +203 -0
- package/fesm2022/ngwr-blur-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-blur-text.mjs +15 -1
- package/fesm2022/ngwr-blur-text.mjs.map +1 -1
- package/fesm2022/ngwr-border-glow-testing.mjs +325 -0
- package/fesm2022/ngwr-border-glow-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs +95 -0
- package/fesm2022/ngwr-calendar-heatmap-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar-testing.mjs +368 -0
- package/fesm2022/ngwr-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-calendar.mjs +43 -3
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-cascader.mjs +12 -0
- package/fesm2022/ngwr-cascader.mjs.map +1 -1
- package/fesm2022/ngwr-checkbox.mjs +8 -0
- package/fesm2022/ngwr-checkbox.mjs.map +1 -1
- package/fesm2022/ngwr-circular-text-testing.mjs +230 -0
- package/fesm2022/ngwr-circular-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-circular-text.mjs +2 -2
- package/fesm2022/ngwr-circular-text.mjs.map +1 -1
- package/fesm2022/ngwr-color-picker-testing.mjs +432 -0
- package/fesm2022/ngwr-color-picker-testing.mjs.map +1 -0
- package/fesm2022/ngwr-color-picker.mjs +29 -3
- package/fesm2022/ngwr-color-picker.mjs.map +1 -1
- package/fesm2022/ngwr-context-menu.mjs +25 -5
- package/fesm2022/ngwr-context-menu.mjs.map +1 -1
- package/fesm2022/ngwr-date-picker-testing.mjs +10 -79
- package/fesm2022/ngwr-date-picker-testing.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text-testing.mjs +261 -0
- package/fesm2022/ngwr-decrypt-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-decrypt-text.mjs +6 -1
- package/fesm2022/ngwr-decrypt-text.mjs.map +1 -1
- package/fesm2022/ngwr-donut-chart-testing.mjs +93 -0
- package/fesm2022/ngwr-donut-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-drawer.mjs +36 -7
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +32 -2
- package/fesm2022/ngwr-dropdown.mjs.map +1 -1
- package/fesm2022/ngwr-event-calendar-testing.mjs +446 -0
- package/fesm2022/ngwr-event-calendar-testing.mjs.map +1 -0
- package/fesm2022/ngwr-event-calendar.mjs +43 -18
- package/fesm2022/ngwr-event-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-falling-text-testing.mjs +218 -0
- package/fesm2022/ngwr-falling-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-fuzzy-text-testing.mjs +134 -0
- package/fesm2022/ngwr-fuzzy-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gauge-testing.mjs +86 -0
- package/fesm2022/ngwr-gauge-testing.mjs.map +1 -0
- package/fesm2022/ngwr-glitch-text-testing.mjs +181 -0
- package/fesm2022/ngwr-glitch-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-gradient-text-testing.mjs +223 -0
- package/fesm2022/ngwr-gradient-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-i18n-en.mjs +14 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +14 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-image-cropper-testing.mjs +156 -0
- package/fesm2022/ngwr-image-cropper-testing.mjs.map +1 -0
- package/fesm2022/ngwr-image-cropper.mjs +10 -3
- package/fesm2022/ngwr-image-cropper.mjs.map +1 -1
- package/fesm2022/ngwr-input-number.mjs +73 -6
- package/fesm2022/ngwr-input-number.mjs.map +1 -1
- package/fesm2022/ngwr-knob-testing.mjs +220 -0
- package/fesm2022/ngwr-knob-testing.mjs.map +1 -0
- package/fesm2022/ngwr-lightbox-testing.mjs +223 -0
- package/fesm2022/ngwr-lightbox-testing.mjs.map +1 -0
- package/fesm2022/ngwr-lightbox.mjs +9 -2
- package/fesm2022/ngwr-lightbox.mjs.map +1 -1
- package/fesm2022/ngwr-line-chart-testing.mjs +119 -0
- package/fesm2022/ngwr-line-chart-testing.mjs.map +1 -0
- package/fesm2022/ngwr-marquee-testing.mjs +336 -0
- package/fesm2022/ngwr-marquee-testing.mjs.map +1 -0
- package/fesm2022/ngwr-meter-group-testing.mjs +80 -0
- package/fesm2022/ngwr-meter-group-testing.mjs.map +1 -0
- package/fesm2022/ngwr-overlay.mjs +28 -1
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-popover.mjs +14 -0
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-rotating-text-testing.mjs +220 -0
- package/fesm2022/ngwr-rotating-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-rotating-text.mjs +2 -2
- package/fesm2022/ngwr-rotating-text.mjs.map +1 -1
- package/fesm2022/ngwr-select.mjs +70 -11
- package/fesm2022/ngwr-select.mjs.map +1 -1
- package/fesm2022/ngwr-shiny-text-testing.mjs +237 -0
- package/fesm2022/ngwr-shiny-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-slider.mjs +44 -6
- package/fesm2022/ngwr-slider.mjs.map +1 -1
- package/fesm2022/ngwr-sparkline-testing.mjs +76 -0
- package/fesm2022/ngwr-sparkline-testing.mjs.map +1 -0
- package/fesm2022/ngwr-speed-dial-testing.mjs +279 -0
- package/fesm2022/ngwr-speed-dial-testing.mjs.map +1 -0
- package/fesm2022/ngwr-splash-cursor-testing.mjs +89 -0
- package/fesm2022/ngwr-splash-cursor-testing.mjs.map +1 -0
- package/fesm2022/ngwr-split-text-testing.mjs +224 -0
- package/fesm2022/ngwr-split-text-testing.mjs.map +1 -0
- package/fesm2022/ngwr-split-text.mjs +15 -1
- package/fesm2022/ngwr-split-text.mjs.map +1 -1
- package/fesm2022/ngwr-splitter-testing.mjs +245 -0
- package/fesm2022/ngwr-splitter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-spotlight-card-testing.mjs +368 -0
- package/fesm2022/ngwr-spotlight-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-star-border-testing.mjs +172 -0
- package/fesm2022/ngwr-star-border-testing.mjs.map +1 -0
- package/fesm2022/ngwr-table.mjs +13 -3
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +15 -1
- package/fesm2022/ngwr-tabs.mjs.map +1 -1
- package/fesm2022/ngwr-tilt-card-testing.mjs +190 -0
- package/fesm2022/ngwr-tilt-card-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tilt-card.mjs +19 -1
- package/fesm2022/ngwr-tilt-card.mjs.map +1 -1
- package/fesm2022/ngwr-toast.mjs +36 -7
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-tour-testing.mjs +173 -0
- package/fesm2022/ngwr-tour-testing.mjs.map +1 -0
- package/fesm2022/ngwr-tour.mjs +2 -2
- package/fesm2022/ngwr-tour.mjs.map +1 -1
- package/fesm2022/ngwr-tree.mjs +10 -3
- package/fesm2022/ngwr-tree.mjs.map +1 -1
- package/fesm2022/ngwr-typewriter-testing.mjs +228 -0
- package/fesm2022/ngwr-typewriter-testing.mjs.map +1 -0
- package/fesm2022/ngwr-version.mjs +1 -1
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-waves-testing.mjs +128 -0
- package/fesm2022/ngwr-waves-testing.mjs.map +1 -0
- package/fesm2022/ngwr-window-testing.mjs +361 -0
- package/fesm2022/ngwr-window-testing.mjs.map +1 -0
- package/fesm2022/ngwr-window.mjs +84 -10
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/i18n/en.json +16 -2
- package/i18n/ru.json +16 -2
- package/llms-full.txt +147 -0
- package/llms.txt +27 -8
- package/mcp/providers.js +29 -0
- package/mcp/tools.js +1 -29
- package/package.json +145 -1
- package/skills/ngwr/SKILL.md +115 -0
- package/skills/ngwr/references/catalog.md +212 -0
- package/skills/ngwr/references/setup.md +73 -0
- package/types/ngwr-action-sheet-testing.d.ts +260 -0
- package/types/ngwr-bar-chart-testing.d.ts +77 -0
- package/types/ngwr-blur-text-testing.d.ts +180 -0
- package/types/ngwr-blur-text.d.ts +12 -0
- package/types/ngwr-border-glow-testing.d.ts +219 -0
- package/types/ngwr-calendar-heatmap-testing.d.ts +79 -0
- package/types/ngwr-calendar-testing.d.ts +277 -0
- package/types/ngwr-calendar.d.ts +10 -0
- package/types/ngwr-checkbox.d.ts +13 -0
- package/types/ngwr-circular-text-testing.d.ts +196 -0
- package/types/ngwr-color-picker-testing.d.ts +291 -0
- package/types/ngwr-color-picker.d.ts +13 -1
- package/types/ngwr-context-menu.d.ts +15 -1
- package/types/ngwr-date-picker-testing.d.ts +6 -66
- package/types/ngwr-decrypt-text-testing.d.ts +222 -0
- package/types/ngwr-donut-chart-testing.d.ts +79 -0
- package/types/ngwr-drawer.d.ts +12 -0
- package/types/ngwr-dropdown.d.ts +9 -0
- package/types/ngwr-event-calendar-testing.d.ts +301 -0
- package/types/ngwr-event-calendar.d.ts +9 -6
- package/types/ngwr-falling-text-testing.d.ts +186 -0
- package/types/ngwr-fuzzy-text-testing.d.ts +130 -0
- package/types/ngwr-gauge-testing.d.ts +71 -0
- package/types/ngwr-glitch-text-testing.d.ts +172 -0
- package/types/ngwr-gradient-text-testing.d.ts +173 -0
- package/types/ngwr-image-cropper-testing.d.ts +134 -0
- package/types/ngwr-image-cropper.d.ts +1 -0
- package/types/ngwr-input-number.d.ts +33 -1
- package/types/ngwr-knob-testing.d.ts +150 -0
- package/types/ngwr-lightbox-testing.d.ts +154 -0
- package/types/ngwr-lightbox.d.ts +6 -0
- package/types/ngwr-line-chart-testing.d.ts +93 -0
- package/types/ngwr-marquee-testing.d.ts +280 -0
- package/types/ngwr-meter-group-testing.d.ts +67 -0
- package/types/ngwr-overlay.d.ts +19 -1
- package/types/ngwr-rotating-text-testing.d.ts +191 -0
- package/types/ngwr-select.d.ts +32 -0
- package/types/ngwr-shiny-text-testing.d.ts +165 -0
- package/types/ngwr-slider.d.ts +15 -0
- package/types/ngwr-sparkline-testing.d.ts +69 -0
- package/types/ngwr-speed-dial-testing.d.ts +195 -0
- package/types/ngwr-splash-cursor-testing.d.ts +95 -0
- package/types/ngwr-split-text-testing.d.ts +209 -0
- package/types/ngwr-split-text.d.ts +12 -0
- package/types/ngwr-splitter-testing.d.ts +174 -0
- package/types/ngwr-spotlight-card-testing.d.ts +303 -0
- package/types/ngwr-star-border-testing.d.ts +135 -0
- package/types/ngwr-table.d.ts +10 -1
- package/types/ngwr-tilt-card-testing.d.ts +158 -0
- package/types/ngwr-tilt-card.d.ts +2 -0
- package/types/ngwr-toast.d.ts +14 -5
- package/types/ngwr-tour-testing.d.ts +143 -0
- package/types/ngwr-tree.d.ts +7 -0
- package/types/ngwr-typewriter-testing.d.ts +201 -0
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-waves-testing.d.ts +121 -0
- package/types/ngwr-window-testing.d.ts +263 -0
- package/types/ngwr-window.d.ts +27 -10
- package/window/styles/_index.scss +44 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngwr-window.mjs","sources":["../../../projects/lib/window/tokens.ts","../../../projects/lib/window/storage-key.ts","../../../projects/lib/window/window.ts","../../../projects/lib/window/window.html","../../../projects/lib/window/window-container.ts","../../../projects/lib/window/window-container.html","../../../projects/lib/window/window-ref.ts","../../../projects/lib/window/services/window-manager.ts","../../../projects/lib/window/window-taskbar.ts","../../../projects/lib/window/window-taskbar.html","../../../projects/lib/window/public-api.ts","../../../projects/lib/window/ngwr-window.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { WrWindowRef } from './window-ref';\n\n/** Resolves to the active `WrWindowRef` inside a programmatically-opened window's content tree. */\nexport const WR_WINDOW_REF = new InjectionToken<WrWindowRef<unknown, unknown>>('WR_WINDOW_REF');\n\n/** Resolves to the `data` passed in `WrWindowConfig.data`. */\nexport const WR_WINDOW_DATA = new InjectionToken<unknown>('WR_WINDOW_DATA');\n","import type { WrWindowStorageConfig } from './interfaces';\n\n/** Namespaced localStorage key for a persisted window / workspace. */\nexport function storageKey(cfg: WrWindowStorageConfig): string {\n const prefix = cfg.prefix ? `${cfg.prefix}:` : '';\n return `wr:window:${prefix}${cfg.key}`;\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\n\nimport { clamp, randomId } from 'ngwr/utils';\n\nimport type {\n WrWindowChromeSize,\n WrWindowOs,\n WrWindowResolvedOs,\n WrWindowSize,\n WrWindowSnap,\n WrWindowSnapTarget,\n WrWindowState,\n} from './interfaces';\nimport { WrWindowManager } from './services/window-manager';\n\n/**\n * Best-effort OS detection — runs once at module load. Looks at the\n * new `navigator.userAgentData.platform` first (Chromium, no UA\n * sniffing required), falls back to `navigator.platform` /\n * `navigator.userAgent`. SSR-safe — returns `'windows'` when there's\n * no `window`.\n */\nfunction detectOs(): WrWindowResolvedOs {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'windows';\n\n const uaData = (navigator as unknown as { userAgentData?: { platform?: string } }).userAgentData;\n // First non-empty source — `??` alone would keep an empty platform\n // string and skip the user-agent fallback.\n const candidates = [uaData?.platform, navigator.platform, navigator.userAgent];\n const platform = (candidates.find(v => !!v) ?? '').toLowerCase();\n if (\n platform.includes('mac') ||\n platform.includes('darwin') ||\n platform.includes('iphone') ||\n platform.includes('ipad')\n ) {\n return 'macos';\n }\n if (platform.includes('linux') || platform.includes('x11') || platform.includes('cros')) return 'linux';\n return 'windows';\n}\n\nconst DETECTED_OS = detectOs();\n\nconst SIZE_PRESETS: Readonly<Record<WrWindowSize, { width: number; height: number }>> = {\n sm: { width: 320, height: 200 },\n md: { width: 480, height: 320 },\n lg: { width: 720, height: 480 },\n};\n\ninterface Edges {\n readonly t?: boolean;\n readonly r?: boolean;\n readonly b?: boolean;\n readonly l?: boolean;\n}\n\nconst MIN_ON_VIEWPORT = 24; // keep at least this many px of the window inside the viewport\n\nfunction viewportWidth(): number {\n return typeof window === 'undefined' ? 1024 : window.innerWidth;\n}\n\nfunction viewportHeight(): number {\n return typeof window === 'undefined' ? 768 : window.innerHeight;\n}\n\n/**\n * Internal rendering primitive for a single floating window.\n *\n * Not part of the public API — windows are opened through\n * `WrWindowManager.open(Component, config)`, which portals this\n * component for each call. Inputs map 1:1 to `WrWindowConfig`\n * fields so the container can wire them up declaratively.\n *\n * @internal\n */\n@Component({\n selector: 'wr-window',\n templateUrl: './window.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'dialog',\n '[class]': 'classes()',\n '[style.left.px]': 'x()',\n '[style.top.px]': 'y()',\n '[style.width.px]': 'width()',\n '[style.height.px]': 'height()',\n '[style.z-index]': 'z()',\n '[attr.aria-hidden]': '!open()',\n '[attr.aria-labelledby]': 'titleId',\n '(pointerdown)': 'focusWindow()',\n },\n})\nexport class WrWindow {\n /** Two-way bindable visibility. `false` removes the window from the layer. */\n readonly open = model<boolean>(true);\n\n /** Two-way bindable state. */\n readonly state = model<WrWindowState>('normal');\n\n /** Header title. */\n readonly title = input<string>('');\n\n /** Auto-generated id for the title element, referenced by `aria-labelledby`. */\n protected readonly titleId = randomId('wr-window-title');\n\n /** Initial position. `null` = auto-cascade from the manager. */\n readonly initialX = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 0)),\n });\n readonly initialY = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 0)),\n });\n\n /**\n * Size preset — seeds initial width / height when `[initialWidth]` /\n * `[initialHeight]` are not provided. `null` keeps the explicit\n * pixel inputs in charge. @default 'md'\n */\n readonly size = input<WrWindowSize | null>('md');\n\n /** Initial / forced size in pixels. Wins over `[size]` when set. */\n readonly initialWidth = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 480)),\n });\n readonly initialHeight = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 320)),\n });\n\n /**\n * OS chrome style. `'auto'` reads `navigator.userAgentData.platform`\n * / `navigator.platform` and picks the matching preset (SSR-safe;\n * unknown platforms fall back to `windows`).\n * @default 'auto'\n */\n readonly os = input<WrWindowOs>('auto');\n\n /** Resolved OS — `auto` → detected platform. */\n readonly resolvedOs = computed<WrWindowResolvedOs>(() => {\n const o = this.os();\n return o === 'auto' ? DETECTED_OS : o;\n });\n\n /** Title-bar density. @default 'normal' */\n readonly chromeSize = input<WrWindowChromeSize>('normal');\n\n /**\n * Enter / leave animations. Set to `false` to disable the open-fade\n * and the minimize / maximize transitions. Honoured automatically\n * when `prefers-reduced-motion: reduce`. @default true\n */\n readonly animations = input(true, { transform: coerceBooleanProperty });\n\n readonly minWidth = input<number>(220, { transform: (v: unknown): number => coerceNumberProperty(v, 220) });\n readonly minHeight = input<number>(140, { transform: (v: unknown): number => coerceNumberProperty(v, 140) });\n readonly maxWidth = input<number>(Number.POSITIVE_INFINITY, {\n transform: (v: unknown): number => (v == null ? Number.POSITIVE_INFINITY : coerceNumberProperty(v, Infinity)),\n });\n readonly maxHeight = input<number>(Number.POSITIVE_INFINITY, {\n transform: (v: unknown): number => (v == null ? Number.POSITIVE_INFINITY : coerceNumberProperty(v, Infinity)),\n });\n\n readonly movable = input(true, { transform: coerceBooleanProperty });\n readonly resizable = input(true, { transform: coerceBooleanProperty });\n readonly keepInViewport = input(true, { transform: coerceBooleanProperty });\n\n /** Drag-to-edge snap behaviour. @default 'none' */\n readonly snap = input<WrWindowSnap>('none');\n\n /**\n * CSS selector inside the projected body that restricts the move\n * grab — pointer-downs outside this selector won't start a drag.\n * Use to keep interactive body content (sliders, inputs) from\n * hijacking the title-bar drag. `null` (default) means the whole\n * title bar is grabbable.\n */\n readonly dragHandle = input<string | null>(null);\n\n readonly showMinimize = input(true, { transform: coerceBooleanProperty });\n readonly showMaximize = input(true, { transform: coerceBooleanProperty });\n readonly showClose = input(true, { transform: coerceBooleanProperty });\n\n /** Fires when the window closes — from the header button or from `close()`. */\n readonly closed = output<void>();\n\n /**\n * Fires while the header is DRAGGED, once per pointer move. Programmatic moves\n * (`moveTo`, `center`, the initial cascade) are silent: the caller already knows\n * where it put the window, and echoing those back would double-count for a\n * consumer persisting the position.\n */\n readonly moved = output<{ readonly x: number; readonly y: number }>();\n\n /** Fires while an edge is DRAGGED, and once when a snap target is applied. */\n readonly resized = output<{ readonly width: number; readonly height: number }>();\n\n private readonly manager = inject(WrWindowManager);\n\n // Position / size signals are the source of truth at runtime.\n // Inputs (x/y/initialWidth/initialHeight) seed them in afterNextRender.\n /** Live X (top-left). @internal */ readonly x_ = signal(0);\n /** Live Y (top-left). @internal */ readonly y_ = signal(0);\n /** Live width. @internal */ readonly width_ = signal(0);\n /** Live height. @internal */ readonly height_ = signal(0);\n\n // Saved geometry to restore from `maximized`.\n private restoreGeometry: { x: number; y: number; width: number; height: number } | null = null;\n\n /** Stack z-index — pulled from the manager on focus. @internal */\n readonly z = signal(this.manager.bringToFront());\n\n protected readonly classes = computed(() => {\n const parts = [\n 'wr-window',\n `wr-window--${this.state()}`,\n `wr-window--os-${this.resolvedOs()}`,\n `wr-window--chrome-${this.chromeSize()}`,\n ];\n if (!this.open()) parts.push('wr-window--closed');\n if (this.resizable() && this.state() === 'normal') parts.push('wr-window--resizable');\n if (!this.animations()) parts.push('wr-window--no-anim');\n return parts.join(' ');\n });\n\n // Effective geometry exposed to the host bindings AND to programmatic\n // consumers (`WrWindowRef`). When maximized we ignore the live\n // x_/y_/width_/height_ and fill the viewport instead.\n readonly x = computed(() => (this.state() === 'maximized' ? 0 : this.x_()));\n readonly y = computed(() => (this.state() === 'maximized' ? 0 : this.y_()));\n readonly width = computed(() => (this.state() === 'maximized' ? viewportWidth() : this.width_()));\n readonly height = computed(() =>\n this.state() === 'maximized'\n ? viewportHeight()\n : this.state() === 'minimized'\n ? this.minimizedHeight()\n : this.height_()\n );\n\n protected readonly minimizedHeight = signal(40); // header-only height\n\n /**\n * Visible during drag when a snap target is engaged — drives the\n * SCSS hint rendered by `WrWindowContainer` (NOT here — `.wr-window`\n * has `overflow: hidden` which clips position-fixed descendants\n * during the open animation while a transform is applied).\n */\n readonly snapTarget = signal<WrWindowSnapTarget | null>(null);\n\n constructor() {\n afterNextRender(() => this.seedInitialGeometry());\n\n // Re-clamp into viewport when window or viewport changes.\n effect(() => {\n if (this.state() !== 'normal') return;\n this.clampToViewport();\n });\n }\n\n // Public API\n\n close(): void {\n this.open.set(false);\n this.closed.emit();\n }\n\n minimize(): void {\n this.state.set(this.state() === 'minimized' ? 'normal' : 'minimized');\n }\n\n maximize(): void {\n if (this.state() === 'maximized') {\n this.restore();\n } else {\n this.restoreGeometry = { x: this.x_(), y: this.y_(), width: this.width_(), height: this.height_() };\n this.state.set('maximized');\n }\n }\n\n /** Force back to `normal` from minimized / maximized. */\n restore(): void {\n if (this.state() === 'maximized' && this.restoreGeometry) {\n this.x_.set(this.restoreGeometry.x);\n this.y_.set(this.restoreGeometry.y);\n this.width_.set(this.restoreGeometry.width);\n this.height_.set(this.restoreGeometry.height);\n this.restoreGeometry = null;\n }\n this.state.set('normal');\n }\n\n /** Programmatic move — clamped to the viewport when `keepInViewport`. */\n moveTo(x: number, y: number): void {\n this.x_.set(x);\n this.y_.set(y);\n this.clampToViewport();\n }\n\n /** Programmatic resize — clamped to min/max bounds. */\n resizeTo(width: number, height: number): void {\n this.width_.set(clamp(width, this.minWidth(), this.maxWidth()));\n this.height_.set(clamp(height, this.minHeight(), this.maxHeight()));\n this.clampToViewport();\n }\n\n /** Re-position centered against the current viewport. */\n center(): void {\n const w = this.width_();\n const h = this.height_();\n this.x_.set(Math.max(0, (viewportWidth() - w) / 2));\n this.y_.set(Math.max(0, (viewportHeight() - h) / 2));\n }\n\n /** Bring this window to the top of the stack. */\n focus(): void {\n this.z.set(this.manager.bringToFront());\n }\n\n // Host handlers\n\n /** @internal — alias kept for the host `(pointerdown)` binding. */\n protected focusWindow(): void {\n this.focus();\n }\n\n protected startMove(event: PointerEvent): void {\n if (!this.movable() || this.state() !== 'normal') return;\n const targetEl = event.target as HTMLElement;\n if (targetEl.closest('.wr-window__chrome-action')) return;\n const handle = this.dragHandle();\n if (handle && !targetEl.closest(handle)) return;\n event.preventDefault();\n const target = event.currentTarget as HTMLElement;\n target.setPointerCapture(event.pointerId);\n\n const startX = this.x_();\n const startY = this.y_();\n const originX = event.clientX;\n const originY = event.clientY;\n\n const move = (e: PointerEvent): void => {\n this.x_.set(startX + (e.clientX - originX));\n this.y_.set(startY + (e.clientY - originY));\n this.clampToViewport();\n this.snapTarget.set(this.detectSnapTarget(e.clientX, e.clientY));\n };\n const up = (e: PointerEvent): void => {\n target.releasePointerCapture(e.pointerId);\n target.removeEventListener('pointermove', move);\n target.removeEventListener('pointerup', up);\n const snap = this.snapTarget();\n this.snapTarget.set(null);\n if (snap) {\n this.applySnap(snap);\n }\n this.moved.emit({ x: this.x_(), y: this.y_() });\n };\n\n target.addEventListener('pointermove', move);\n target.addEventListener('pointerup', up);\n }\n\n /** Map a cursor position to a snap target, honouring `[snap]`. */\n private detectSnapTarget(clientX: number, clientY: number): WrWindowSnapTarget | null {\n const mode = this.snap();\n if (mode === 'none') return null;\n const HOT = 12;\n const vw = viewportWidth();\n const vh = viewportHeight();\n const nearLeft = clientX <= HOT;\n const nearRight = clientX >= vw - HOT;\n const nearTop = clientY <= HOT;\n const nearBottom = clientY >= vh - HOT;\n if (mode === 'all') {\n if (nearTop && nearLeft) return 'top-left';\n if (nearTop && nearRight) return 'top-right';\n if (nearBottom && nearLeft) return 'bottom-left';\n if (nearBottom && nearRight) return 'bottom-right';\n }\n if (nearTop) return 'top'; // top edge → maximise\n if (nearLeft) return 'left';\n if (nearRight) return 'right';\n return null;\n }\n\n /** Move + resize the window into the requested snap region. */\n private applySnap(target: WrWindowSnapTarget): void {\n const vw = viewportWidth();\n const vh = viewportHeight();\n const halfW = Math.floor(vw / 2);\n const halfH = Math.floor(vh / 2);\n switch (target) {\n case 'top':\n // Maximise — share state so the chrome reflects it.\n this.restoreGeometry = { x: this.x_(), y: this.y_(), width: this.width_(), height: this.height_() };\n this.state.set('maximized');\n return;\n case 'left':\n this.x_.set(0);\n this.y_.set(0);\n this.width_.set(halfW);\n this.height_.set(vh);\n break;\n case 'right':\n this.x_.set(halfW);\n this.y_.set(0);\n this.width_.set(vw - halfW);\n this.height_.set(vh);\n break;\n case 'top-left':\n this.x_.set(0);\n this.y_.set(0);\n this.width_.set(halfW);\n this.height_.set(halfH);\n break;\n case 'top-right':\n this.x_.set(halfW);\n this.y_.set(0);\n this.width_.set(vw - halfW);\n this.height_.set(halfH);\n break;\n case 'bottom-left':\n this.x_.set(0);\n this.y_.set(halfH);\n this.width_.set(halfW);\n this.height_.set(vh - halfH);\n break;\n case 'bottom-right':\n this.x_.set(halfW);\n this.y_.set(halfH);\n this.width_.set(vw - halfW);\n this.height_.set(vh - halfH);\n break;\n }\n this.resized.emit({ width: this.width_(), height: this.height_() });\n }\n\n protected startResize(event: PointerEvent, edges: Edges): void {\n if (!this.resizable() || this.state() !== 'normal') return;\n event.preventDefault();\n event.stopPropagation();\n const target = event.currentTarget as HTMLElement;\n target.setPointerCapture(event.pointerId);\n\n const startX = this.x_();\n const startY = this.y_();\n const startW = this.width_();\n const startH = this.height_();\n const originX = event.clientX;\n const originY = event.clientY;\n\n const move = (e: PointerEvent): void => {\n const dx = e.clientX - originX;\n const dy = e.clientY - originY;\n\n let nextX = startX;\n let nextY = startY;\n let nextW = startW;\n let nextH = startH;\n\n if (edges.r) nextW = startW + dx;\n if (edges.b) nextH = startH + dy;\n if (edges.l) {\n nextW = startW - dx;\n nextX = startX + dx;\n }\n if (edges.t) {\n nextH = startH - dy;\n nextY = startY + dy;\n }\n\n // Enforce min/max — when shrinking from left/top we have to fix the position too.\n const clampedW = clamp(nextW, this.minWidth(), this.maxWidth());\n const clampedH = clamp(nextH, this.minHeight(), this.maxHeight());\n if (edges.l) nextX += nextW - clampedW;\n if (edges.t) nextY += nextH - clampedH;\n\n this.x_.set(nextX);\n this.y_.set(nextY);\n this.width_.set(clampedW);\n this.height_.set(clampedH);\n this.clampToViewport();\n };\n const up = (e: PointerEvent): void => {\n target.releasePointerCapture(e.pointerId);\n target.removeEventListener('pointermove', move);\n target.removeEventListener('pointerup', up);\n this.resized.emit({ width: this.width_(), height: this.height_() });\n };\n\n target.addEventListener('pointermove', move);\n target.addEventListener('pointerup', up);\n }\n\n // Bound resize handlers for the template — avoids inline object literals\n // re-creating on every change-detection tick.\n protected resizeTL = (e: PointerEvent): void => this.startResize(e, { t: true, l: true });\n protected resizeT = (e: PointerEvent): void => this.startResize(e, { t: true });\n protected resizeTR = (e: PointerEvent): void => this.startResize(e, { t: true, r: true });\n protected resizeR = (e: PointerEvent): void => this.startResize(e, { r: true });\n protected resizeBR = (e: PointerEvent): void => this.startResize(e, { b: true, r: true });\n protected resizeB = (e: PointerEvent): void => this.startResize(e, { b: true });\n protected resizeBL = (e: PointerEvent): void => this.startResize(e, { b: true, l: true });\n protected resizeL = (e: PointerEvent): void => this.startResize(e, { l: true });\n\n // Internals\n\n private seedInitialGeometry(): void {\n const sizePreset = this.size();\n const preset = sizePreset ? SIZE_PRESETS[sizePreset] : SIZE_PRESETS.md;\n const explicitW = this.initialWidth();\n const explicitH = this.initialHeight();\n const w = clamp(explicitW ?? preset.width, this.minWidth(), this.maxWidth());\n const h = clamp(explicitH ?? preset.height, this.minHeight(), this.maxHeight());\n this.width_.set(w);\n this.height_.set(h);\n\n const xIn = this.initialX();\n const yIn = this.initialY();\n if (xIn != null && yIn != null) {\n this.x_.set(xIn);\n this.y_.set(yIn);\n } else {\n const cascade = this.manager.nextStartOffset();\n this.x_.set(xIn ?? cascade.x);\n this.y_.set(yIn ?? cascade.y);\n }\n\n this.clampToViewport();\n }\n\n private clampToViewport(): void {\n if (!this.keepInViewport()) return;\n const vw = viewportWidth();\n const vh = viewportHeight();\n const w = this.width_();\n this.x_.set(clamp(this.x_(), MIN_ON_VIEWPORT - w, vw - MIN_ON_VIEWPORT));\n this.y_.set(clamp(this.y_(), 0, vh - MIN_ON_VIEWPORT));\n }\n}\n","<div class=\"wr-window__chrome\" (pointerdown)=\"startMove($event)\" (dblclick)=\"showMaximize() && maximize()\">\n <div class=\"wr-window__title\" [attr.id]=\"titleId\">{{ title() }}</div>\n <div class=\"wr-window__title-extra\">\n <ng-content select=\"[wrWindowTitleExtra]\" />\n </div>\n\n <div class=\"wr-window__chrome-actions\">\n @if (resolvedOs() === 'macos') {\n <!-- macOS-style traffic-light cluster: close → minimize → maximize.\n Glyphs (×, −, +) appear on cluster hover. -->\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--close\"\n aria-label=\"Close\"\n (click)=\"close()\"\n >\n <svg class=\"wr-window__chrome-action-glyph\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path\n d=\"M2.2 2.2 L7.8 7.8 M7.8 2.2 L2.2 7.8\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n }\n @if (showMinimize()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--minimize\"\n [attr.aria-label]=\"state() === 'minimized' ? 'Restore' : 'Minimize'\"\n (click)=\"minimize()\"\n >\n <svg class=\"wr-window__chrome-action-glyph\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <line x1=\"2\" y1=\"5\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n </button>\n }\n @if (showMaximize()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--maximize\"\n [attr.aria-label]=\"state() === 'maximized' ? 'Restore down' : 'Maximize'\"\n (click)=\"maximize()\"\n >\n <svg class=\"wr-window__chrome-action-glyph\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n @if (state() === 'maximized') {\n <path\n d=\"M3 1 L1 1 L1 3 M7 1 L9 1 L9 3 M1 7 L1 9 L3 9 M9 7 L9 9 L7 9\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n fill=\"none\"\n />\n } @else {\n <path d=\"M2 5 L8 5 M5 2 L5 8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n }\n </svg>\n </button>\n }\n } @else {\n <!-- Windows / Linux glyph buttons -->\n @if (resolvedOs() !== 'linux' && showMinimize()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--minimize\"\n [attr.aria-label]=\"state() === 'minimized' ? 'Restore' : 'Minimize'\"\n (click)=\"minimize()\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <line x1=\"1\" y1=\"8\" x2=\"9\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n }\n\n @if (resolvedOs() !== 'linux' && showMaximize()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--maximize\"\n [attr.aria-label]=\"state() === 'maximized' ? 'Restore down' : 'Maximize'\"\n (click)=\"maximize()\"\n >\n @if (state() === 'maximized') {\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2.5\" width=\"6\" height=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <rect x=\"3\" y=\"1\" width=\"6\" height=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n </svg>\n } @else {\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n </svg>\n }\n </button>\n }\n\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--close\"\n aria-label=\"Close\"\n (click)=\"close()\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M1 1 L9 9 M9 1 L1 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n }\n }\n </div>\n</div>\n\n<div class=\"wr-window__body\">\n <ng-content />\n</div>\n\n<div class=\"wr-window__status-bar\">\n <ng-content select=\"[wrWindowStatusBar]\" />\n</div>\n\n@if (resizable() && state() === 'normal') {\n <span class=\"wr-window__handle wr-window__handle--t\" (pointerdown)=\"resizeT($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--r\" (pointerdown)=\"resizeR($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--b\" (pointerdown)=\"resizeB($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--l\" (pointerdown)=\"resizeL($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--tl\" (pointerdown)=\"resizeTL($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--tr\" (pointerdown)=\"resizeTR($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--bl\" (pointerdown)=\"resizeBL($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--br\" (pointerdown)=\"resizeBR($event)\"></span>\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type ComponentType } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Injector,\n ViewContainerRef,\n ViewEncapsulation,\n afterNextRender,\n effect,\n inject,\n runInInjectionContext,\n viewChild,\n} from '@angular/core';\n\nimport { WrStorage } from 'ngwr/storage';\n\nimport type { WrWindowConfig } from './interfaces';\nimport { storageKey } from './storage-key';\nimport { WrWindow } from './window';\nimport type { WrWindowRef } from './window-ref';\n\ninterface PersistedGeometry {\n readonly x?: number;\n readonly y?: number;\n readonly width?: number;\n readonly height?: number;\n}\n\n/** Coalesce live position/size writes — drag/resize fires every move. */\nconst PERSIST_DEBOUNCE_MS = 200;\n\n/**\n * Internal host attached by `WrWindowManager.open()`. Reads the config,\n * configures a `<wr-window>`, projects the consumer's component into\n * its body, and wires the resulting instance back to the `WrWindowRef`\n * so consumers can drive everything imperatively.\n *\n * @internal\n */\n@Component({\n selector: 'wr-window-container',\n templateUrl: './window-container.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [WrWindow],\n})\nexport class WrWindowContainer<C> {\n /** Set by the manager before view init. */\n config!: WrWindowConfig;\n /** Set by the manager before view init. */\n ref!: WrWindowRef<C, unknown>;\n /** Set by the manager before view init. */\n componentType!: ComponentType<C>;\n /** Custom injector with `WR_WINDOW_REF` / `WR_WINDOW_DATA` populated. */\n childInjector!: Injector;\n\n private readonly hostInjector = inject(Injector);\n private readonly storage = inject(WrStorage);\n private readonly destroyRef = inject(DestroyRef);\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly contentVcr = viewChild.required('content', { read: ViewContainerRef });\n private readonly wrWindow = viewChild.required(WrWindow);\n\n constructor() {\n afterNextRender(() => this.attach());\n this.destroyRef.onDestroy(() => {\n if (this.persistTimer !== null) clearTimeout(this.persistTimer);\n });\n }\n\n private attach(): void {\n // 1. Create the consumer's component inside the body slot.\n const componentRef = this.contentVcr().createComponent(this.componentType, {\n injector: this.childInjector,\n });\n this.ref.componentRef = componentRef;\n\n // 2. Bridge imperative actions to the underlying <wr-window>.\n const w = this.wrWindow();\n this.ref._doMinimize = () => w.minimize();\n this.ref._doMaximize = () => w.maximize();\n this.ref._doRestore = () => w.restore();\n this.ref._doFocus = () => w.focus();\n this.ref._doMoveTo = (x, y) => w.moveTo(x, y);\n this.ref._doResizeTo = (width, height) => w.resizeTo(width, height);\n this.ref._doCenter = () => w.center();\n this.ref._doSetTitle = title => this.ref._title.set(title);\n\n // 3. Sync the live geometry/state into the ref's signals so\n // consumers can read them reactively without poking at <wr-window>.\n // Angular 22 always allows signal writes inside effects — the\n // `allowSignalWrites` option was deprecated in this version.\n runInInjectionContext(this.hostInjector, () => {\n effect(() => this.ref._state.set(w.state()));\n effect(() => this.ref._x.set(w.x()));\n effect(() => this.ref._y.set(w.y()));\n effect(() => this.ref._width.set(w.width()));\n effect(() => this.ref._height.set(w.height()));\n // Alongside the effective values, not instead of them: `saveLayout` needs\n // the geometry a maximized or minimized window would go back to.\n effect(() => this.ref._rawX.set(w.x_()));\n effect(() => this.ref._rawY.set(w.y_()));\n effect(() => this.ref._rawWidth.set(w.width_()));\n effect(() => this.ref._rawHeight.set(w.height_()));\n effect(() => this.ref._z.set(w.z()));\n\n // The z-index has to land on the OVERLAY HOST, not only on `.wr-window`.\n // Each window sits in its own CDK global wrapper, and that wrapper is\n // `position: fixed` with a numeric `z-index` — which makes it a stacking\n // context. A z-index written INSIDE it therefore only orders things\n // against its own siblings, never against another window: the wrappers\n // all carry the same z and stack by DOM order, so the most recently\n // opened window painted on top for good. `bringToFront()` raised the\n // number and nothing moved — measured in Chromium, `elementFromPoint` in\n // the overlap kept returning the newer window after the older one's title\n // bar was clicked.\n effect(() => {\n const host = this.ref._overlayRef?.hostElement;\n if (host) host.style.zIndex = String(w.z());\n });\n });\n\n // 4. Seed the title signal from config.\n this.ref._title.set(this.config.title ?? '');\n\n // 5. Storage — hydrate from disk + auto-save on geometry change.\n if (this.config.storage) {\n this.hydrateFromStorage(w);\n this.installAutosave(w);\n }\n\n // 6. Apply any state the manager pinned for restore — bridges are\n // now wired so `ref.minimize()` / `maximize()` actually fire.\n const pending = this.ref.pendingStateOnMount;\n if (pending) {\n this.ref.pendingStateOnMount = null;\n if (pending === 'minimized') this.ref.minimize();\n else if (pending === 'maximized') this.ref.maximize();\n }\n }\n\n /** Apply persisted geometry on top of config defaults, before the user sees the window. */\n private hydrateFromStorage(w: WrWindow): void {\n const cfg = this.config.storage;\n if (!cfg) return;\n const saved = this.storage.get<PersistedGeometry>(storageKey(cfg));\n if (!saved) return;\n const persist = cfg.persist ?? 'all';\n if (persist !== 'size') {\n if (typeof saved.x === 'number') w.x_.set(saved.x);\n if (typeof saved.y === 'number') w.y_.set(saved.y);\n }\n if (persist !== 'position') {\n if (typeof saved.width === 'number') w.width_.set(saved.width);\n if (typeof saved.height === 'number') w.height_.set(saved.height);\n }\n }\n\n /** Persist geometry whenever it changes, debounced. */\n private installAutosave(w: WrWindow): void {\n const cfg = this.config.storage;\n if (!cfg) return;\n const persist = cfg.persist ?? 'all';\n const key = storageKey(cfg);\n\n runInInjectionContext(this.hostInjector, () => {\n effect(() => {\n // Read every signal we want to watch; ignore minimized/maximized\n // overlay values — we only persist the user's chosen geometry.\n const x = w.x_();\n const y = w.y_();\n const width = w.width_();\n const height = w.height_();\n\n if (this.persistTimer !== null) clearTimeout(this.persistTimer);\n this.persistTimer = setTimeout(() => {\n this.persistTimer = null;\n const payload: PersistedGeometry = {};\n if (persist !== 'size') {\n (payload as { x?: number; y?: number }).x = x;\n (payload as { x?: number; y?: number }).y = y;\n }\n if (persist !== 'position') {\n (payload as { width?: number; height?: number }).width = width;\n (payload as { width?: number; height?: number }).height = height;\n }\n this.storage.set(key, payload);\n }, PERSIST_DEBOUNCE_MS);\n });\n });\n }\n}\n","<wr-window\n [open]=\"true\"\n [title]=\"ref.title()\"\n [os]=\"config.os ?? 'auto'\"\n [size]=\"config.size ?? 'md'\"\n [chromeSize]=\"config.chromeSize ?? 'normal'\"\n [animations]=\"config.animations ?? true\"\n [initialX]=\"config.x ?? null\"\n [initialY]=\"config.y ?? null\"\n [initialWidth]=\"config.width ?? null\"\n [initialHeight]=\"config.height ?? null\"\n [minWidth]=\"config.minWidth ?? 220\"\n [minHeight]=\"config.minHeight ?? 140\"\n [maxWidth]=\"config.maxWidth ?? 1000000\"\n [maxHeight]=\"config.maxHeight ?? 1000000\"\n [movable]=\"config.movable ?? true\"\n [resizable]=\"config.resizable ?? true\"\n [keepInViewport]=\"config.keepInViewport ?? true\"\n [snap]=\"config.snap ?? 'none'\"\n [dragHandle]=\"config.dragHandle ?? null\"\n [showMinimize]=\"config.showMinimize ?? true\"\n [showMaximize]=\"config.showMaximize ?? true\"\n [showClose]=\"config.showClose ?? true\"\n (closed)=\"ref.close()\"\n #window\n>\n <ng-container #content />\n</wr-window>\n\n@if (window.snapTarget(); as target) {\n <div class=\"wr-window__snap-hint\" [attr.data-target]=\"target\" aria-hidden=\"true\"></div>\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { OverlayRef } from '@angular/cdk/overlay';\nimport { type ComponentRef, type Signal, type WritableSignal, signal } from '@angular/core';\n\nimport { ReplaySubject, Subject } from 'rxjs';\n\nimport type { WrWindowState, WrWindowBeforeCloseHook } from './interfaces';\n\n/**\n * Handle returned by `WrWindowManager.open()`.\n *\n * Wraps the underlying overlay, exposes signals for the live geometry,\n * and gives the consumer programmatic control over the window\n * (focus, move, resize, minimize, maximize, close).\n *\n * @example\n * ```ts\n * const ref = manager.open(EditorComponent, {\n * title: 'Untitled.md',\n * storage: { key: 'editor', prefix: 'app' },\n * });\n *\n * ref.beforeClose(async () => {\n * if (!isDirty) return true;\n * return await confirmDiscard();\n * });\n *\n * const saved = await ref.afterClosed(); // resolves with whatever the\n * // component passed to ref.close(value)\n * ```\n */\nexport class WrWindowRef<C, R = unknown> {\n /** Stable id — used by the taskbar, workspace save, and DI. */\n readonly id: string;\n\n /** @internal — emits the close result once and completes. */\n /**\n * A `ReplaySubject`, not a plain `Subject`, so the result survives a late\n * subscriber — the same reasoning `WrDialogRef` already carries. A caller\n * that holds the ref and awaits `afterClosed()` after any intervening\n * `await` subscribes to an already-completed stream, and a plain Subject\n * hands it nothing but `complete`: the promise resolved `undefined` and a\n * saved result was indistinguishable from a dismissal.\n */\n readonly _closed = new ReplaySubject<R | undefined>(1);\n\n /** @internal — emits whenever the visual state changes. */\n readonly _stateChanged = new Subject<WrWindowState>();\n\n /** @internal — set by the container right after attach. */\n componentRef: ComponentRef<C> | null = null;\n\n /** @internal — whether this window opts into the taskbar list. */\n taskbarVisible = true;\n\n /**\n * @internal — non-`normal` state to apply right after the container\n * wires its bridges (so `restoreLayout` can land a window straight\n * into `minimized` / `maximized` even though it just opened).\n */\n pendingStateOnMount: WrWindowState | null = null;\n\n // Live geometry signals (writable internally, exposed read-only)\n /** @internal */ readonly _state: WritableSignal<WrWindowState> = signal('normal');\n /** @internal */ readonly _x = signal(0);\n /** @internal */ readonly _y = signal(0);\n /** @internal */ readonly _width = signal(0);\n /** @internal */ readonly _height = signal(0);\n /** @internal */ readonly _z = signal(0);\n\n /**\n * The geometry the USER chose, as opposed to the one the current state\n * imposes. `_x` and friends mirror the window's EFFECTIVE values — a\n * maximized window reports the viewport, a minimized one reports its\n * collapsed header height — which is right for anything drawing the window\n * and wrong for anything persisting it.\n *\n * @internal\n */\n readonly _rawX = signal(0);\n /** @internal */ readonly _rawY = signal(0);\n /** @internal */ readonly _rawWidth = signal(0);\n /** @internal */ readonly _rawHeight = signal(0);\n /** @internal */ readonly _title: WritableSignal<string> = signal('');\n\n /** Window state. */\n readonly state: Signal<WrWindowState> = this._state.asReadonly();\n /** Live X. */\n readonly x: Signal<number> = this._x.asReadonly();\n /** Live Y. */\n readonly y: Signal<number> = this._y.asReadonly();\n /** Live width. */\n readonly width: Signal<number> = this._width.asReadonly();\n /** Live height. */\n readonly height: Signal<number> = this._height.asReadonly();\n /** Stack z-index. */\n readonly z: Signal<number> = this._z.asReadonly();\n /** Live title. */\n readonly title: Signal<string> = this._title.asReadonly();\n\n // Hooks\n private _beforeCloseHook: WrWindowBeforeCloseHook<R> | null = null;\n\n // Imperative bridges — wired by the manager / container after attach\n /** @internal */ _doClose: ((result: R | undefined) => void) | null = null;\n /** @internal */ _doMinimize: (() => void) | null = null;\n /** @internal */ _doMaximize: (() => void) | null = null;\n /** @internal */ _doRestore: (() => void) | null = null;\n /** @internal */ _doFocus: (() => void) | null = null;\n /** @internal */ _doMoveTo: ((x: number, y: number) => void) | null = null;\n /** @internal */ _doResizeTo: ((w: number, h: number) => void) | null = null;\n /** @internal */ _doCenter: (() => void) | null = null;\n /** @internal */ _doSetTitle: ((title: string) => void) | null = null;\n\n constructor(\n id: string,\n public readonly _overlayRef: OverlayRef\n ) {\n this.id = id;\n }\n\n /** Resolved instance of the projected component. */\n get componentInstance(): C {\n if (!this.componentRef) {\n throw new Error('WrWindowRef: component not yet attached');\n }\n return this.componentRef.instance;\n }\n\n // Lifecycle\n\n /**\n * Close the window, optionally returning a result. If a `beforeClose`\n * hook is registered it is consulted first — a falsy resolution\n * cancels the close.\n */\n async close(result?: R): Promise<void> {\n if (this._beforeCloseHook) {\n const ok = await this._beforeCloseHook(result);\n if (!ok) return;\n }\n this._doClose?.(result);\n }\n\n /** Toggle the minimized state. */\n minimize(): void {\n this._doMinimize?.();\n }\n\n /** Toggle the maximized state. */\n maximize(): void {\n this._doMaximize?.();\n }\n\n /** Force-restore from minimized / maximized to `normal`. */\n restore(): void {\n this._doRestore?.();\n }\n\n /** Bring this window to the top of the stack. */\n focus(): void {\n this._doFocus?.();\n }\n\n // Programmatic geometry\n\n moveTo(x: number, y: number): void {\n this._doMoveTo?.(x, y);\n }\n\n resizeTo(width: number, height: number): void {\n this._doResizeTo?.(width, height);\n }\n\n /** Re-position the window so it sits centered in the current viewport. */\n center(): void {\n this._doCenter?.();\n }\n\n setTitle(title: string): void {\n this._doSetTitle?.(title);\n }\n\n // Hooks\n\n /**\n * Register a guard that runs before `close()`. Return `false` (or a\n * Promise resolving to false) to veto. Only one hook per ref —\n * subsequent calls replace the previous.\n */\n beforeClose(hook: WrWindowBeforeCloseHook<R>): void {\n this._beforeCloseHook = hook;\n }\n\n /** Resolves with the result passed to `close()` (or `undefined`). */\n afterClosed(): Promise<R | undefined> {\n return new Promise(resolve => {\n this._closed.subscribe({\n next: value => resolve(value),\n complete: () => resolve(undefined),\n });\n });\n }\n\n /** Escape hatch — the underlying CDK overlay ref. */\n get overlayRef(): OverlayRef {\n return this._overlayRef;\n }\n}\n\nexport type { WrWindowBeforeCloseHook } from './interfaces';\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal, type ComponentType } from '@angular/cdk/portal';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n EnvironmentInjector,\n Injector,\n PLATFORM_ID,\n Service,\n type Signal,\n computed,\n inject,\n signal,\n} from '@angular/core';\n\nimport { WR_OVERLAY } from 'ngwr/overlay';\nimport { WrStorage } from 'ngwr/storage';\nimport { randomId } from 'ngwr/utils';\n\nimport type { WrWindowConfig, WrWindowState, WrWindowStorageConfig } from '../interfaces';\nimport { storageKey } from '../storage-key';\nimport { WR_WINDOW_DATA, WR_WINDOW_REF } from '../tokens';\nimport { WrWindowContainer } from '../window-container';\nimport { WrWindowRef } from '../window-ref';\n\ninterface RestoreSnapshot {\n readonly id: string;\n readonly state: WrWindowState;\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n readonly title: string;\n}\n\n/**\n * Owns the open `<wr-window>` stack, hands out z-indexes, cascades the\n * default spawn position, and opens programmatic windows that wrap a\n * consumer component.\n *\n * Inject the singleton and call `open(component, config)` for a\n * dialog-style flow:\n *\n * ```ts\n * const manager = inject(WrWindowManager);\n *\n * const ref = manager.open(EditorComponent, {\n * title: 'Untitled.md',\n * size: 'lg',\n * storage: { key: 'editor', prefix: 'my-app' },\n * });\n *\n * const saved = await ref.afterClosed();\n * ```\n *\n * Declarative `<wr-window [(open)]=\"...\">` instances also register with\n * the manager on focus, so both styles share the same stack ordering.\n */\n@Service()\nexport class WrWindowManager {\n private readonly overlay = inject(WR_OVERLAY);\n private readonly parentInjector = inject(EnvironmentInjector);\n private readonly storage = inject(WrStorage);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly baseZ = 1000;\n private topZ = this.baseZ;\n private openCount = 0;\n\n /** All open windows opened via `open()` — declarative `<wr-window>` is not tracked here. */\n private readonly _windows = signal<readonly WrWindowRef<unknown, unknown>[]>([]);\n\n /**\n * Filled by `restoreLayout` right before it invokes the consumer's\n * opener callback. The next `open()` call with a matching `config.id`\n * pops the entry and uses it as the initial geometry (so the seed\n * lands at the saved coords instead of the cascade default) and\n * applies any non-`normal` state after the bridges are wired.\n */\n private readonly pendingRestores = new Map<string, RestoreSnapshot>();\n\n /** All currently-open programmatic windows. */\n readonly windows: Signal<readonly WrWindowRef<unknown, unknown>[]> = this._windows.asReadonly();\n\n /** Programmatic windows that are minimized AND opted into the taskbar. */\n readonly minimized = computed(() => this._windows().filter(w => w.taskbarVisible && w.state() === 'minimized'));\n\n /** Reserve the next z-index. Strictly increasing across the app's lifetime. */\n bringToFront(): number {\n this.topZ += 1;\n return this.topZ;\n }\n\n /** Cascade offset for new windows, so two opens don't perfectly overlap. */\n nextStartOffset(): { readonly x: number; readonly y: number } {\n const offset = (this.openCount % 10) * 30;\n this.openCount += 1;\n return { x: 50 + offset, y: 50 + offset };\n }\n\n /**\n * Open a window with `component` rendered as its body. Returns a ref\n * the caller can use to drive the window programmatically and await\n * its result.\n *\n * **Singleton by id** — if `config.id` is set and a window with that\n * id is already open, the existing ref is restored (if minimized),\n * brought to the front, and returned. No duplicate window is\n * created. Use this to coalesce repeated open() calls (e.g. a\n * \"Settings\" menu item that should always re-focus the same window).\n */\n open<C, R = unknown, D = unknown>(component: ComponentType<C>, config: WrWindowConfig<D> = {}): WrWindowRef<C, R> {\n if (config.id) {\n const existing = this.findById(config.id);\n if (existing) {\n existing.restore();\n existing.focus();\n return existing as WrWindowRef<C, R>;\n }\n }\n\n // Honour a pending restore — `restoreLayout` populates this Map\n // right before invoking the consumer's opener so the new window\n // seeds at the saved geometry instead of the cascade default.\n const pending = config.id ? this.pendingRestores.get(config.id) : undefined;\n if (pending) {\n this.pendingRestores.delete(config.id!);\n config = {\n ...config,\n x: pending.x,\n y: pending.y,\n width: pending.width,\n height: pending.height,\n title: pending.title || config.title,\n };\n }\n\n // Each window gets its own CDK overlay pane positioned `static` —\n // <wr-window> itself uses `position: fixed`, so the pane is only a\n // mount point. Windows are never modal — reach for `WrDialog` when\n // you need a backdrop + focus trap + scroll block.\n const overlayRef: OverlayRef = this.overlay.create({\n positionStrategy: this.overlay.position().global(),\n panelClass: 'wr-window-overlay',\n hasBackdrop: false,\n // OUT of the top layer, deliberately. The CDK puts overlay hosts there by\n // default (`popover=\"manual\"`), and the top layer orders strictly by\n // ENTRY: whatever opened last paints on top and no z-index can change it.\n // That is right for a menu or a modal and exactly wrong for a window\n // manager, whose whole job is letting the user decide which window is in\n // front. It also fixes the ordering against modals: a dialog stays in the\n // top layer, so it now sits above every window instead of below whichever\n // window happened to open after it.\n usePopover: false,\n });\n\n const id = config.id ?? randomId('wr-window');\n const ref = new WrWindowRef<C, R>(id, overlayRef);\n ref.taskbarVisible = config.taskbar !== false;\n\n // Provide WR_WINDOW_REF + WR_WINDOW_DATA inside the projected\n // component's subtree so it can `inject(WR_WINDOW_REF)` etc.\n const childInjector = Injector.create({\n parent: this.parentInjector,\n providers: [\n { provide: WR_WINDOW_REF, useValue: ref },\n { provide: WR_WINDOW_DATA, useValue: config.data ?? null },\n ],\n });\n\n const portal = new ComponentPortal<WrWindowContainer<C>>(WrWindowContainer);\n const containerRef = overlayRef.attach(portal);\n const container = containerRef.instance;\n container.config = config;\n container.ref = ref as WrWindowRef<C, unknown>;\n container.componentType = component;\n container.childInjector = childInjector;\n\n if (this.isBrowser) {\n overlayRef.overlayElement.setAttribute('role', 'dialog');\n }\n\n if (config.closeOnEscape !== false) {\n overlayRef.keydownEvents().subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n void ref.close();\n }\n });\n }\n\n // Wire close → disposal + completion of the result subject. The\n // ref's `close()` already runs the beforeClose hook before reaching\n // this bridge.\n ref._doClose = result => {\n overlayRef.dispose();\n ref._closed.next(result);\n ref._closed.complete();\n this._windows.update(list => list.filter(r => r !== (ref as unknown as WrWindowRef<unknown, unknown>)));\n };\n\n this._windows.update(list => [...list, ref as unknown as WrWindowRef<unknown, unknown>]);\n\n // If the pending restore had a non-`normal` state, hand it to the\n // container so it can apply it right after wiring the bridges.\n // queueMicrotask would fire before afterNextRender — the bridges\n // wouldn't be set yet and ref.minimize() / maximize() would no-op.\n if (pending && pending.state !== 'normal') {\n ref.pendingStateOnMount = pending.state;\n }\n\n return ref;\n }\n\n /** Close every programmatically-opened window. */\n closeAll(): void {\n for (const ref of [...this._windows()]) {\n void ref.close();\n }\n }\n\n /** Look up an open window by its `config.id`. Returns `null` when no match. */\n findById(id: string): WrWindowRef<unknown, unknown> | null {\n return this._windows().find(r => r.id === id) ?? null;\n }\n\n /**\n * Drop the persisted geometry for a window so the next open uses the\n * config defaults again. Matches `WrWindowConfig.storage` exactly.\n */\n clearPersistedPosition(cfg: WrWindowStorageConfig): void {\n this.storage.remove(storageKey(cfg));\n }\n\n // Workspace save/restore\n //\n // A workspace is a snapshot of every open window's id + state +\n // geometry. Reopening is the consumer's job (component identities\n // aren't serialisable), so `restoreLayout` returns the captured\n // snapshots and a helper that re-applies geometry once the windows\n // have been opened again.\n\n /** Snapshot of one window — what `saveLayout` writes / `restoreLayout` returns. */\n private layoutKey(name: string): string {\n return `wr:window-layout:${name}`;\n }\n\n /**\n * Persist the geometry + state of every open programmatic window\n * under `name`. Pair with `restoreLayout(name)` after re-opening the\n * matching components.\n */\n saveLayout(name: string): void {\n // The RAW geometry, not the live one. `ref.x()` / `ref.width()` report what\n // is on screen — a maximized window measures the viewport, a minimized one\n // measures its collapsed header — so saving those threw away the size the\n // user actually chose. Restoring then re-maximized over viewport-sized\n // \"restore\" geometry, and \"Restore down\" left the window filling the screen\n // with no way back; a minimized window came back from the taskbar as a stub\n // clamped to `minHeight`. The window knows the real numbers all along.\n const snapshot = this._windows().map(ref => ({\n id: ref.id,\n state: ref.state(),\n x: ref._rawX(),\n y: ref._rawY(),\n width: ref._rawWidth(),\n height: ref._rawHeight(),\n title: ref.title(),\n }));\n this.storage.set(this.layoutKey(name), snapshot);\n }\n\n /** Read a saved workspace. Returns `null` when no snapshot is found. */\n readLayout(name: string): readonly RestoreSnapshot[] | null {\n return this.storage.get(this.layoutKey(name));\n }\n\n /**\n * Apply a saved workspace.\n *\n * Each saved entry is matched to a currently-open window by `id`. For\n * matches, the geometry / state / title is re-applied immediately.\n * For misses, the optional `open` callback is invoked so the consumer\n * can re-open the right component for that id — the freshly-opened\n * window then seeds straight to the saved geometry (no cascade flicker)\n * and the saved state lands once the bridges are wired.\n *\n * ```ts\n * manager.restoreLayout('default', (id, snap) => {\n * if (id.startsWith('editor:')) {\n * manager.open(EditorComponent, { id, title: snap.title, data: ... });\n * }\n * });\n * ```\n */\n restoreLayout(name: string, open?: (id: string, snapshot: { readonly title: string }) => void): void {\n const snapshot = this.readLayout(name);\n if (!snapshot) return;\n\n for (const snap of snapshot) {\n const existing = this.findById(snap.id);\n if (existing) {\n this.applyRestore(existing, snap);\n continue;\n }\n if (!open) continue;\n // Stash the geometry so the next `open()` call with this id\n // consumes it as the seed instead of cascading.\n this.pendingRestores.set(snap.id, snap);\n open(snap.id, { title: snap.title });\n // Belt + braces: if the opener didn't actually open a window (or\n // opened with a different id), drop the stale pending entry so it\n // doesn't ambush a future open.\n if (!this.findById(snap.id)) this.pendingRestores.delete(snap.id);\n }\n }\n\n private applyRestore(ref: WrWindowRef<unknown, unknown>, snap: RestoreSnapshot): void {\n // Force back to a known 'normal' baseline before applying state —\n // ref.minimize() / maximize() are toggles, so this prevents a\n // saved 'minimized' from un-minimizing an already-minimized window.\n ref.restore();\n if (snap.title) ref.setTitle(snap.title);\n ref.moveTo(snap.x, snap.y);\n ref.resizeTo(snap.width, snap.height);\n if (snap.state === 'minimized') ref.minimize();\n else if (snap.state === 'maximized') ref.maximize();\n }\n\n /** Drop a saved workspace. */\n clearLayout(name: string): void {\n this.storage.remove(this.layoutKey(name));\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input } from '@angular/core';\n\nimport { WrWindowManager } from './services/window-manager';\nimport type { WrWindowRef } from './window-ref';\n\n/**\n * OS-style window taskbar. Drop one anywhere in the app — typically\n * fixed to the bottom of the viewport — and it lists every window\n * `WrWindowManager.open()` has handed out that's currently\n * `minimized`. Clicking a tab restores the window; clicking the close\n * glyph dismisses it without restoring.\n *\n * Windows opted out via `config.taskbar = false` never show up here.\n *\n * @example\n * ```html\n * <wr-window-taskbar />\n * <wr-window-taskbar position=\"top\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/window\n */\n@Component({\n selector: 'wr-window-taskbar',\n templateUrl: './window-taskbar.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()', role: 'toolbar', 'aria-label': 'Minimized windows' },\n})\nexport class WrWindowTaskbar {\n /** Edge the taskbar pins itself to. @default 'bottom' */\n readonly position = input<'top' | 'bottom'>('bottom');\n\n private readonly manager = inject(WrWindowManager);\n\n /** @internal — minimized windows that haven't opted out via `taskbar: false`. */\n protected readonly items = computed(() => this.manager.minimized());\n\n protected readonly classes = computed(() => `wr-window-taskbar wr-window-taskbar--${this.position()}`);\n\n protected restore(ref: WrWindowRef<unknown, unknown>): void {\n ref.restore();\n ref.focus();\n }\n\n protected close(ref: WrWindowRef<unknown, unknown>, event: Event): void {\n event.stopPropagation();\n void ref.close();\n }\n}\n","@if (items().length > 0) {\n <div class=\"wr-window-taskbar__rail\">\n @for (ref of items(); track ref.id) {\n <button\n type=\"button\"\n class=\"wr-window-taskbar__tab\"\n [attr.aria-label]=\"`Restore ${ref.title() || 'Untitled'}`\"\n (click)=\"restore(ref)\"\n >\n <span class=\"wr-window-taskbar__tab-title\">{{ ref.title() || 'Untitled' }}</span>\n <span\n class=\"wr-window-taskbar__tab-close\"\n role=\"button\"\n tabindex=\"0\"\n aria-label=\"Close window\"\n (click)=\"close(ref, $event)\"\n (keydown.enter)=\"close(ref, $event)\"\n >\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M1 1 L9 9 M9 1 L1 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </span>\n </button>\n }\n </div>\n}\n","// `WrWindow` itself is NOT exported. Windows are opened through\n// `WrWindowManager.open(Component, config)` — one canonical path keeps\n// the API surface small and predictable.\nexport { WR_WINDOW_DATA, WR_WINDOW_REF } from './tokens';\nexport { WrWindowManager } from './services/window-manager';\nexport { type WrWindowBeforeCloseHook, WrWindowRef } from './window-ref';\nexport { WrWindowTaskbar } from './window-taskbar';\nexport type {\n WrWindowChromeSize,\n WrWindowConfig,\n WrWindowOs,\n WrWindowPersistMode,\n WrWindowSize,\n WrWindowSnap,\n WrWindowState,\n WrWindowStorageConfig,\n} from './interfaces';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngwr-window.mjs","sources":["../../../projects/lib/window/tokens.ts","../../../projects/lib/window/storage-key.ts","../../../projects/lib/window/window.ts","../../../projects/lib/window/window.html","../../../projects/lib/window/window-container.ts","../../../projects/lib/window/window-container.html","../../../projects/lib/window/window-ref.ts","../../../projects/lib/window/services/window-manager.ts","../../../projects/lib/window/window-taskbar.ts","../../../projects/lib/window/window-taskbar.html","../../../projects/lib/window/public-api.ts","../../../projects/lib/window/ngwr-window.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { InjectionToken } from '@angular/core';\n\nimport type { WrWindowRef } from './window-ref';\n\n/** Resolves to the active `WrWindowRef` inside a programmatically-opened window's content tree. */\nexport const WR_WINDOW_REF = new InjectionToken<WrWindowRef<unknown, unknown>>('WR_WINDOW_REF');\n\n/** Resolves to the `data` passed in `WrWindowConfig.data`. */\nexport const WR_WINDOW_DATA = new InjectionToken<unknown>('WR_WINDOW_DATA');\n","import type { WrWindowStorageConfig } from './interfaces';\n\n/** Namespaced localStorage key for a persisted window / workspace. */\nexport function storageKey(cfg: WrWindowStorageConfig): string {\n const prefix = cfg.prefix ? `${cfg.prefix}:` : '';\n return `wr:window:${prefix}${cfg.key}`;\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type BooleanInput, coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport {\n Component,\n ViewEncapsulation,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\n\nimport { useI18nText } from 'ngwr/i18n';\nimport { clamp, randomId } from 'ngwr/utils';\n\nimport type {\n WrWindowChromeSize,\n WrWindowOs,\n WrWindowResolvedOs,\n WrWindowSize,\n WrWindowSnap,\n WrWindowSnapTarget,\n WrWindowState,\n} from './interfaces';\nimport { WrWindowManager } from './services/window-manager';\n\n/**\n * Stands in for the consumer input `useI18nText` expects. The chrome buttons take no\n * label input — they are icon-only OS affordances — but their names still have to\n * come from the catalog rather than from the template, which is where they used to\n * live as English literals.\n */\nconst NO_OVERRIDE = signal<string | null>(null).asReadonly();\n\n/**\n * Best-effort OS detection — runs once at module load. Looks at the\n * new `navigator.userAgentData.platform` first (Chromium, no UA\n * sniffing required), falls back to `navigator.platform` /\n * `navigator.userAgent`. SSR-safe — returns `'windows'` when there's\n * no `window`.\n */\nfunction detectOs(): WrWindowResolvedOs {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') return 'windows';\n\n const uaData = (navigator as unknown as { userAgentData?: { platform?: string } }).userAgentData;\n // First non-empty source — `??` alone would keep an empty platform\n // string and skip the user-agent fallback.\n const candidates = [uaData?.platform, navigator.platform, navigator.userAgent];\n const platform = (candidates.find(v => !!v) ?? '').toLowerCase();\n if (\n platform.includes('mac') ||\n platform.includes('darwin') ||\n platform.includes('iphone') ||\n platform.includes('ipad')\n ) {\n return 'macos';\n }\n if (platform.includes('linux') || platform.includes('x11') || platform.includes('cros')) return 'linux';\n return 'windows';\n}\n\nconst DETECTED_OS = detectOs();\n\n/**\n * `coerceBooleanProperty` that keeps `null` as `null`.\n *\n * The plain coercion maps `null` and `undefined` to `false`, which is the one\n * thing a tri-state input must not do: \"unset\" has to survive as its own value\n * or the OS default can never be told apart from an explicit `false`. Attribute\n * presence (`<wr-window showMinimize>`, i.e. `''`) still means `true`.\n */\nfunction optionalBoolean(value: BooleanInput | null): boolean | null {\n return value === null || value === undefined ? null : coerceBooleanProperty(value);\n}\n\nconst SIZE_PRESETS: Readonly<Record<WrWindowSize, { width: number; height: number }>> = {\n sm: { width: 320, height: 200 },\n md: { width: 480, height: 320 },\n lg: { width: 720, height: 480 },\n};\n\ninterface Edges {\n readonly t?: boolean;\n readonly r?: boolean;\n readonly b?: boolean;\n readonly l?: boolean;\n}\n\nconst MIN_ON_VIEWPORT = 24; // keep at least this many px of the window inside the viewport\n\nfunction viewportWidth(): number {\n return typeof window === 'undefined' ? 1024 : window.innerWidth;\n}\n\nfunction viewportHeight(): number {\n return typeof window === 'undefined' ? 768 : window.innerHeight;\n}\n\n/**\n * Internal rendering primitive for a single floating window.\n *\n * Not part of the public API — windows are opened through\n * `WrWindowManager.open(Component, config)`, which portals this\n * component for each call. Inputs map 1:1 to `WrWindowConfig`\n * fields so the container can wire them up declaratively.\n *\n * @internal\n */\n@Component({\n selector: 'wr-window',\n templateUrl: './window.html',\n encapsulation: ViewEncapsulation.None,\n host: {\n role: 'dialog',\n '[class]': 'classes()',\n '[style.left.px]': 'x()',\n '[style.top.px]': 'y()',\n '[style.width.px]': 'width()',\n '[style.height.px]': 'height()',\n '[style.z-index]': 'z()',\n '[attr.aria-hidden]': '!open()',\n '[attr.aria-labelledby]': 'titleId',\n '(pointerdown)': 'focusWindow()',\n },\n})\nexport class WrWindow {\n /** Two-way bindable visibility. `false` removes the window from the layer. */\n readonly open = model<boolean>(true);\n\n /** Two-way bindable state. */\n readonly state = model<WrWindowState>('normal');\n\n /** Header title. */\n readonly title = input<string>('');\n\n /** Auto-generated id for the title element, referenced by `aria-labelledby`. */\n protected readonly titleId = randomId('wr-window-title');\n\n // `window.close` had been sitting in both catalogs unread while the template\n // hard-coded the same English beside it; the other four had no key at all, so a\n // Russian app announced four of its five window buttons in English.\n protected readonly closeLabel = useI18nText(NO_OVERRIDE, 'window.close', 'Close');\n private readonly minimizeLabel = useI18nText(NO_OVERRIDE, 'window.minimize', 'Minimize');\n private readonly maximizeLabel = useI18nText(NO_OVERRIDE, 'window.maximize', 'Maximize');\n private readonly restoreLabel = useI18nText(NO_OVERRIDE, 'window.restore', 'Restore');\n private readonly restoreDownLabel = useI18nText(NO_OVERRIDE, 'window.restoreDown', 'Restore down');\n\n /** The minimize button doubles as restore, and says which it is. */\n protected readonly minimizeActionLabel = computed(() =>\n this.state() === 'minimized' ? this.restoreLabel() : this.minimizeLabel()\n );\n\n /** Same for maximize, whose restore has its own wording. */\n protected readonly maximizeActionLabel = computed(() =>\n this.state() === 'maximized' ? this.restoreDownLabel() : this.maximizeLabel()\n );\n\n /** Initial position. `null` = auto-cascade from the manager. */\n readonly initialX = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 0)),\n });\n readonly initialY = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 0)),\n });\n\n /**\n * Size preset — seeds initial width / height when `[initialWidth]` /\n * `[initialHeight]` are not provided. `null` keeps the explicit\n * pixel inputs in charge. @default 'md'\n */\n readonly size = input<WrWindowSize | null>('md');\n\n /** Initial / forced size in pixels. Wins over `[size]` when set. */\n readonly initialWidth = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 480)),\n });\n readonly initialHeight = input<number | null>(null, {\n transform: (v: unknown): number | null => (v == null ? null : coerceNumberProperty(v, 320)),\n });\n\n /**\n * OS chrome style. `'auto'` reads `navigator.userAgentData.platform`\n * / `navigator.platform` and picks the matching preset (SSR-safe;\n * unknown platforms fall back to `windows`).\n * @default 'auto'\n */\n readonly os = input<WrWindowOs>('auto');\n\n /** Resolved OS — `auto` → detected platform. */\n readonly resolvedOs = computed<WrWindowResolvedOs>(() => {\n const o = this.os();\n return o === 'auto' ? DETECTED_OS : o;\n });\n\n /**\n * Whether each control is rendered: the input wins, the chrome decides the\n * default. Linux is close-only unless asked otherwise — see\n * {@link showMinimize} for why that is an input and not a template gate.\n */\n protected readonly minimizeVisible = computed(() => this.showMinimize() ?? this.resolvedOs() !== 'linux');\n protected readonly maximizeVisible = computed(() => this.showMaximize() ?? this.resolvedOs() !== 'linux');\n\n /** Title-bar density. @default 'normal' */\n readonly chromeSize = input<WrWindowChromeSize>('normal');\n\n /**\n * Enter / leave animations. Set to `false` to disable the open-fade\n * and the minimize / maximize transitions. Honoured automatically\n * when `prefers-reduced-motion: reduce`. @default true\n */\n readonly animations = input(true, { transform: coerceBooleanProperty });\n\n readonly minWidth = input<number>(220, { transform: (v: unknown): number => coerceNumberProperty(v, 220) });\n readonly minHeight = input<number>(140, { transform: (v: unknown): number => coerceNumberProperty(v, 140) });\n readonly maxWidth = input<number>(Number.POSITIVE_INFINITY, {\n transform: (v: unknown): number => (v == null ? Number.POSITIVE_INFINITY : coerceNumberProperty(v, Infinity)),\n });\n readonly maxHeight = input<number>(Number.POSITIVE_INFINITY, {\n transform: (v: unknown): number => (v == null ? Number.POSITIVE_INFINITY : coerceNumberProperty(v, Infinity)),\n });\n\n readonly movable = input(true, { transform: coerceBooleanProperty });\n readonly resizable = input(true, { transform: coerceBooleanProperty });\n readonly keepInViewport = input(true, { transform: coerceBooleanProperty });\n\n /** Drag-to-edge snap behaviour. @default 'none' */\n readonly snap = input<WrWindowSnap>('none');\n\n /**\n * CSS selector inside the projected body that restricts the move\n * grab — pointer-downs outside this selector won't start a drag.\n * Use to keep interactive body content (sliders, inputs) from\n * hijacking the title-bar drag. `null` (default) means the whole\n * title bar is grabbable.\n */\n readonly dragHandle = input<string | null>(null);\n\n // Tri-state, and the third state is the point. While this defaulted to `true`,\n // \"not set\" and \"explicitly asked for\" were the same value, so the Linux\n // preset had to gate minimize out of the template unconditionally — and\n // `<wr-window-taskbar>` became unreachable on that chrome: `ref.minimize()`\n // still filed a window into it, but no user could press anything to get it\n // there. `null` restores the distinction the chrome docs always claimed.\n /**\n * Show the minimize control. `null` (the default) follows the chrome: every OS\n * but Linux shows it, and the Linux preset is close-only by convention. Pass\n * `true` to override that — on Linux it is what puts a window within reach of\n * `<wr-window-taskbar>`.\n */\n readonly showMinimize = input<boolean | null, BooleanInput | null>(null, { transform: optionalBoolean });\n\n /** Show the maximize control. `null` (the default) follows the chrome, as with {@link showMinimize}. */\n readonly showMaximize = input<boolean | null, BooleanInput | null>(null, { transform: optionalBoolean });\n\n /** Show the close control. Not per-OS: every chrome closes. */\n readonly showClose = input(true, { transform: coerceBooleanProperty });\n\n /** Fires when the window closes — from the header button or from `close()`. */\n readonly closed = output<void>();\n\n /**\n * Fires while the header is DRAGGED, once per pointer move. Programmatic moves\n * (`moveTo`, `center`, the initial cascade) are silent: the caller already knows\n * where it put the window, and echoing those back would double-count for a\n * consumer persisting the position.\n */\n readonly moved = output<{ readonly x: number; readonly y: number }>();\n\n /** Fires while an edge is DRAGGED, and once when a snap target is applied. */\n readonly resized = output<{ readonly width: number; readonly height: number }>();\n\n private readonly manager = inject(WrWindowManager);\n\n // Position / size signals are the source of truth at runtime.\n // Inputs (x/y/initialWidth/initialHeight) seed them in afterNextRender.\n /** Live X (top-left). @internal */ readonly x_ = signal(0);\n /** Live Y (top-left). @internal */ readonly y_ = signal(0);\n /** Live width. @internal */ readonly width_ = signal(0);\n /** Live height. @internal */ readonly height_ = signal(0);\n\n // Saved geometry to restore from `maximized`.\n private restoreGeometry: { x: number; y: number; width: number; height: number } | null = null;\n\n /** Stack z-index — pulled from the manager on focus. @internal */\n readonly z = signal(this.manager.bringToFront());\n\n protected readonly classes = computed(() => {\n const parts = [\n 'wr-window',\n `wr-window--${this.state()}`,\n `wr-window--os-${this.resolvedOs()}`,\n `wr-window--chrome-${this.chromeSize()}`,\n ];\n if (!this.open()) parts.push('wr-window--closed');\n if (this.resizable() && this.state() === 'normal') parts.push('wr-window--resizable');\n if (!this.animations()) parts.push('wr-window--no-anim');\n return parts.join(' ');\n });\n\n // Effective geometry exposed to the host bindings AND to programmatic\n // consumers (`WrWindowRef`). When maximized we ignore the live\n // x_/y_/width_/height_ and fill the viewport instead.\n readonly x = computed(() => (this.state() === 'maximized' ? 0 : this.x_()));\n readonly y = computed(() => (this.state() === 'maximized' ? 0 : this.y_()));\n readonly width = computed(() => (this.state() === 'maximized' ? viewportWidth() : this.width_()));\n readonly height = computed(() =>\n this.state() === 'maximized'\n ? viewportHeight()\n : this.state() === 'minimized'\n ? this.minimizedHeight()\n : this.height_()\n );\n\n protected readonly minimizedHeight = signal(40); // header-only height\n\n /**\n * Visible during drag when a snap target is engaged — drives the\n * SCSS hint rendered by `WrWindowContainer` (NOT here — `.wr-window`\n * has `overflow: hidden` which clips position-fixed descendants\n * during the open animation while a transform is applied).\n */\n readonly snapTarget = signal<WrWindowSnapTarget | null>(null);\n\n constructor() {\n afterNextRender(() => this.seedInitialGeometry());\n\n // Re-clamp into viewport when window or viewport changes.\n effect(() => {\n if (this.state() !== 'normal') return;\n this.clampToViewport();\n });\n }\n\n // Public API\n\n close(): void {\n this.open.set(false);\n this.closed.emit();\n }\n\n minimize(): void {\n this.state.set(this.state() === 'minimized' ? 'normal' : 'minimized');\n }\n\n maximize(): void {\n if (this.state() === 'maximized') {\n this.restore();\n } else {\n this.restoreGeometry = { x: this.x_(), y: this.y_(), width: this.width_(), height: this.height_() };\n this.state.set('maximized');\n }\n }\n\n /** Force back to `normal` from minimized / maximized. */\n restore(): void {\n if (this.state() === 'maximized' && this.restoreGeometry) {\n this.x_.set(this.restoreGeometry.x);\n this.y_.set(this.restoreGeometry.y);\n this.width_.set(this.restoreGeometry.width);\n this.height_.set(this.restoreGeometry.height);\n this.restoreGeometry = null;\n }\n this.state.set('normal');\n }\n\n /** Programmatic move — clamped to the viewport when `keepInViewport`. */\n moveTo(x: number, y: number): void {\n this.x_.set(x);\n this.y_.set(y);\n this.clampToViewport();\n }\n\n /** Programmatic resize — clamped to min/max bounds. */\n resizeTo(width: number, height: number): void {\n this.width_.set(clamp(width, this.minWidth(), this.maxWidth()));\n this.height_.set(clamp(height, this.minHeight(), this.maxHeight()));\n this.clampToViewport();\n }\n\n /** Re-position centered against the current viewport. */\n center(): void {\n const w = this.width_();\n const h = this.height_();\n this.x_.set(Math.max(0, (viewportWidth() - w) / 2));\n this.y_.set(Math.max(0, (viewportHeight() - h) / 2));\n }\n\n /** Bring this window to the top of the stack. */\n focus(): void {\n this.z.set(this.manager.bringToFront());\n }\n\n // Host handlers\n\n /** @internal — alias kept for the host `(pointerdown)` binding. */\n protected focusWindow(): void {\n this.focus();\n }\n\n protected startMove(event: PointerEvent): void {\n if (!this.movable() || this.state() !== 'normal') return;\n const targetEl = event.target as HTMLElement;\n if (targetEl.closest('.wr-window__chrome-action')) return;\n const handle = this.dragHandle();\n if (handle && !targetEl.closest(handle)) return;\n event.preventDefault();\n const target = event.currentTarget as HTMLElement;\n target.setPointerCapture(event.pointerId);\n\n const startX = this.x_();\n const startY = this.y_();\n const originX = event.clientX;\n const originY = event.clientY;\n\n const move = (e: PointerEvent): void => {\n this.x_.set(startX + (e.clientX - originX));\n this.y_.set(startY + (e.clientY - originY));\n this.clampToViewport();\n this.snapTarget.set(this.detectSnapTarget(e.clientX, e.clientY));\n };\n const up = (e: PointerEvent): void => {\n target.releasePointerCapture(e.pointerId);\n target.removeEventListener('pointermove', move);\n target.removeEventListener('pointerup', up);\n const snap = this.snapTarget();\n this.snapTarget.set(null);\n if (snap) {\n this.applySnap(snap);\n }\n this.moved.emit({ x: this.x_(), y: this.y_() });\n };\n\n target.addEventListener('pointermove', move);\n target.addEventListener('pointerup', up);\n }\n\n /** Map a cursor position to a snap target, honouring `[snap]`. */\n private detectSnapTarget(clientX: number, clientY: number): WrWindowSnapTarget | null {\n const mode = this.snap();\n if (mode === 'none') return null;\n const HOT = 12;\n const vw = viewportWidth();\n const vh = viewportHeight();\n const nearLeft = clientX <= HOT;\n const nearRight = clientX >= vw - HOT;\n const nearTop = clientY <= HOT;\n const nearBottom = clientY >= vh - HOT;\n if (mode === 'all') {\n if (nearTop && nearLeft) return 'top-left';\n if (nearTop && nearRight) return 'top-right';\n if (nearBottom && nearLeft) return 'bottom-left';\n if (nearBottom && nearRight) return 'bottom-right';\n }\n if (nearTop) return 'top'; // top edge → maximise\n if (nearLeft) return 'left';\n if (nearRight) return 'right';\n return null;\n }\n\n /** Move + resize the window into the requested snap region. */\n private applySnap(target: WrWindowSnapTarget): void {\n const vw = viewportWidth();\n const vh = viewportHeight();\n const halfW = Math.floor(vw / 2);\n const halfH = Math.floor(vh / 2);\n switch (target) {\n case 'top':\n // Maximise — share state so the chrome reflects it.\n this.restoreGeometry = { x: this.x_(), y: this.y_(), width: this.width_(), height: this.height_() };\n this.state.set('maximized');\n return;\n case 'left':\n this.x_.set(0);\n this.y_.set(0);\n this.width_.set(halfW);\n this.height_.set(vh);\n break;\n case 'right':\n this.x_.set(halfW);\n this.y_.set(0);\n this.width_.set(vw - halfW);\n this.height_.set(vh);\n break;\n case 'top-left':\n this.x_.set(0);\n this.y_.set(0);\n this.width_.set(halfW);\n this.height_.set(halfH);\n break;\n case 'top-right':\n this.x_.set(halfW);\n this.y_.set(0);\n this.width_.set(vw - halfW);\n this.height_.set(halfH);\n break;\n case 'bottom-left':\n this.x_.set(0);\n this.y_.set(halfH);\n this.width_.set(halfW);\n this.height_.set(vh - halfH);\n break;\n case 'bottom-right':\n this.x_.set(halfW);\n this.y_.set(halfH);\n this.width_.set(vw - halfW);\n this.height_.set(vh - halfH);\n break;\n }\n this.resized.emit({ width: this.width_(), height: this.height_() });\n }\n\n protected startResize(event: PointerEvent, edges: Edges): void {\n if (!this.resizable() || this.state() !== 'normal') return;\n event.preventDefault();\n event.stopPropagation();\n const target = event.currentTarget as HTMLElement;\n target.setPointerCapture(event.pointerId);\n\n const startX = this.x_();\n const startY = this.y_();\n const startW = this.width_();\n const startH = this.height_();\n const originX = event.clientX;\n const originY = event.clientY;\n\n const move = (e: PointerEvent): void => {\n const dx = e.clientX - originX;\n const dy = e.clientY - originY;\n\n let nextX = startX;\n let nextY = startY;\n let nextW = startW;\n let nextH = startH;\n\n if (edges.r) nextW = startW + dx;\n if (edges.b) nextH = startH + dy;\n if (edges.l) {\n nextW = startW - dx;\n nextX = startX + dx;\n }\n if (edges.t) {\n nextH = startH - dy;\n nextY = startY + dy;\n }\n\n // Enforce min/max — when shrinking from left/top we have to fix the position too.\n const clampedW = clamp(nextW, this.minWidth(), this.maxWidth());\n const clampedH = clamp(nextH, this.minHeight(), this.maxHeight());\n if (edges.l) nextX += nextW - clampedW;\n if (edges.t) nextY += nextH - clampedH;\n\n this.x_.set(nextX);\n this.y_.set(nextY);\n this.width_.set(clampedW);\n this.height_.set(clampedH);\n this.clampToViewport();\n };\n const up = (e: PointerEvent): void => {\n target.releasePointerCapture(e.pointerId);\n target.removeEventListener('pointermove', move);\n target.removeEventListener('pointerup', up);\n this.resized.emit({ width: this.width_(), height: this.height_() });\n };\n\n target.addEventListener('pointermove', move);\n target.addEventListener('pointerup', up);\n }\n\n // Bound resize handlers for the template — avoids inline object literals\n // re-creating on every change-detection tick.\n protected resizeTL = (e: PointerEvent): void => this.startResize(e, { t: true, l: true });\n protected resizeT = (e: PointerEvent): void => this.startResize(e, { t: true });\n protected resizeTR = (e: PointerEvent): void => this.startResize(e, { t: true, r: true });\n protected resizeR = (e: PointerEvent): void => this.startResize(e, { r: true });\n protected resizeBR = (e: PointerEvent): void => this.startResize(e, { b: true, r: true });\n protected resizeB = (e: PointerEvent): void => this.startResize(e, { b: true });\n protected resizeBL = (e: PointerEvent): void => this.startResize(e, { b: true, l: true });\n protected resizeL = (e: PointerEvent): void => this.startResize(e, { l: true });\n\n // Internals\n\n private seedInitialGeometry(): void {\n const sizePreset = this.size();\n const preset = sizePreset ? SIZE_PRESETS[sizePreset] : SIZE_PRESETS.md;\n const explicitW = this.initialWidth();\n const explicitH = this.initialHeight();\n const w = clamp(explicitW ?? preset.width, this.minWidth(), this.maxWidth());\n const h = clamp(explicitH ?? preset.height, this.minHeight(), this.maxHeight());\n this.width_.set(w);\n this.height_.set(h);\n\n const xIn = this.initialX();\n const yIn = this.initialY();\n if (xIn != null && yIn != null) {\n this.x_.set(xIn);\n this.y_.set(yIn);\n } else {\n const cascade = this.manager.nextStartOffset();\n this.x_.set(xIn ?? cascade.x);\n this.y_.set(yIn ?? cascade.y);\n }\n\n this.clampToViewport();\n }\n\n private clampToViewport(): void {\n if (!this.keepInViewport()) return;\n const vw = viewportWidth();\n const vh = viewportHeight();\n const w = this.width_();\n this.x_.set(clamp(this.x_(), MIN_ON_VIEWPORT - w, vw - MIN_ON_VIEWPORT));\n this.y_.set(clamp(this.y_(), 0, vh - MIN_ON_VIEWPORT));\n }\n}\n","<!--\n The double-click gate is `!== false`, NOT `maximizeVisible()`, and the\n difference is a window nobody can get out of. The Linux preset hides the\n maximize BUTTON; the gesture is how GNOME maximizes, and it worked on every\n chrome before this input went tri-state. Gating it on button visibility would\n have killed it there — and `maximized` is reachable on Linux with no button at\n all (a snap to the top edge, `ref.maximize()`, a restored layout), after which\n every exit disappears at once: no restore-down button, no minimize button,\n `startMove` refuses while the state is not `normal`, the resize handles are not\n rendered, and the only key the window listens for is Escape, which closes it.\n An explicit `showMaximize: false` still turns the gesture off everywhere.\n-->\n<div class=\"wr-window__chrome\" (pointerdown)=\"startMove($event)\" (dblclick)=\"showMaximize() !== false && maximize()\">\n <div class=\"wr-window__title\" [attr.id]=\"titleId\">{{ title() }}</div>\n <div class=\"wr-window__title-extra\">\n <ng-content select=\"[wrWindowTitleExtra]\" />\n </div>\n\n <div class=\"wr-window__chrome-actions\">\n @if (resolvedOs() === 'macos') {\n <!-- macOS-style traffic-light cluster: close → minimize → maximize.\n Glyphs (×, −, +) appear on cluster hover. -->\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"close()\"\n >\n <svg class=\"wr-window__chrome-action-glyph\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path\n d=\"M2.2 2.2 L7.8 7.8 M7.8 2.2 L2.2 7.8\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n />\n </svg>\n </button>\n }\n @if (minimizeVisible()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--minimize\"\n [attr.aria-label]=\"minimizeActionLabel()\"\n (click)=\"minimize()\"\n >\n <svg class=\"wr-window__chrome-action-glyph\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <line x1=\"2\" y1=\"5\" x2=\"8\" y2=\"5\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n </svg>\n </button>\n }\n @if (maximizeVisible()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--maximize\"\n [attr.aria-label]=\"maximizeActionLabel()\"\n (click)=\"maximize()\"\n >\n <svg class=\"wr-window__chrome-action-glyph\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n @if (state() === 'maximized') {\n <path\n d=\"M3 1 L1 1 L1 3 M7 1 L9 1 L9 3 M1 7 L1 9 L3 9 M9 7 L9 9 L7 9\"\n stroke=\"currentColor\"\n stroke-width=\"1.4\"\n stroke-linecap=\"round\"\n fill=\"none\"\n />\n } @else {\n <path d=\"M2 5 L8 5 M5 2 L5 8\" stroke=\"currentColor\" stroke-width=\"1.4\" stroke-linecap=\"round\" />\n }\n </svg>\n </button>\n }\n } @else {\n <!-- Windows / Linux glyph buttons. Linux hides minimize and maximize by\n DEFAULT, not by rule: `minimizeVisible()` resolves the input first, so\n `[showMinimize]=\"true\"` puts the button back — which is the only way a\n user on Linux can reach `<wr-window-taskbar>` at all. -->\n @if (minimizeVisible()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--minimize\"\n [attr.aria-label]=\"minimizeActionLabel()\"\n (click)=\"minimize()\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <line x1=\"1\" y1=\"8\" x2=\"9\" y2=\"8\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n }\n\n @if (maximizeVisible()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--maximize\"\n [attr.aria-label]=\"maximizeActionLabel()\"\n (click)=\"maximize()\"\n >\n @if (state() === 'maximized') {\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <rect x=\"1.5\" y=\"2.5\" width=\"6\" height=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n <rect x=\"3\" y=\"1\" width=\"6\" height=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n </svg>\n } @else {\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.2\" />\n </svg>\n }\n </button>\n }\n\n @if (showClose()) {\n <button\n type=\"button\"\n class=\"wr-window__chrome-action wr-window__chrome-action--close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"close()\"\n >\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M1 1 L9 9 M9 1 L1 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n }\n }\n </div>\n</div>\n\n<div class=\"wr-window__body\">\n <ng-content />\n</div>\n\n<div class=\"wr-window__status-bar\">\n <ng-content select=\"[wrWindowStatusBar]\" />\n</div>\n\n@if (resizable() && state() === 'normal') {\n <span class=\"wr-window__handle wr-window__handle--t\" (pointerdown)=\"resizeT($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--r\" (pointerdown)=\"resizeR($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--b\" (pointerdown)=\"resizeB($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--l\" (pointerdown)=\"resizeL($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--tl\" (pointerdown)=\"resizeTL($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--tr\" (pointerdown)=\"resizeTR($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--bl\" (pointerdown)=\"resizeBL($event)\"></span>\n <span class=\"wr-window__handle wr-window__handle--br\" (pointerdown)=\"resizeBR($event)\"></span>\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type ComponentType } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Injector,\n ViewContainerRef,\n ViewEncapsulation,\n afterNextRender,\n effect,\n inject,\n runInInjectionContext,\n viewChild,\n} from '@angular/core';\n\nimport { WrStorage } from 'ngwr/storage';\n\nimport type { WrWindowConfig } from './interfaces';\nimport { storageKey } from './storage-key';\nimport { WrWindow } from './window';\nimport type { WrWindowRef } from './window-ref';\n\ninterface PersistedGeometry {\n readonly x?: number;\n readonly y?: number;\n readonly width?: number;\n readonly height?: number;\n}\n\n/** Coalesce live position/size writes — drag/resize fires every move. */\nconst PERSIST_DEBOUNCE_MS = 200;\n\n/**\n * Internal host attached by `WrWindowManager.open()`. Reads the config,\n * configures a `<wr-window>`, projects the consumer's component into\n * its body, and wires the resulting instance back to the `WrWindowRef`\n * so consumers can drive everything imperatively.\n *\n * @internal\n */\n@Component({\n selector: 'wr-window-container',\n templateUrl: './window-container.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [WrWindow],\n})\nexport class WrWindowContainer<C> {\n /** Set by the manager before view init. */\n config!: WrWindowConfig;\n /** Set by the manager before view init. */\n ref!: WrWindowRef<C, unknown>;\n /** Set by the manager before view init. */\n componentType!: ComponentType<C>;\n /** Custom injector with `WR_WINDOW_REF` / `WR_WINDOW_DATA` populated. */\n childInjector!: Injector;\n\n private readonly hostInjector = inject(Injector);\n private readonly storage = inject(WrStorage);\n private readonly destroyRef = inject(DestroyRef);\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n private readonly contentVcr = viewChild.required('content', { read: ViewContainerRef });\n private readonly wrWindow = viewChild.required(WrWindow);\n\n constructor() {\n afterNextRender(() => this.attach());\n this.destroyRef.onDestroy(() => {\n if (this.persistTimer !== null) clearTimeout(this.persistTimer);\n });\n }\n\n private attach(): void {\n // 1. Create the consumer's component inside the body slot.\n const componentRef = this.contentVcr().createComponent(this.componentType, {\n injector: this.childInjector,\n });\n this.ref.componentRef = componentRef;\n\n // 2. Bridge imperative actions to the underlying <wr-window>.\n const w = this.wrWindow();\n this.ref._doMinimize = () => w.minimize();\n this.ref._doMaximize = () => w.maximize();\n this.ref._doRestore = () => w.restore();\n this.ref._doFocus = () => w.focus();\n this.ref._doMoveTo = (x, y) => w.moveTo(x, y);\n this.ref._doResizeTo = (width, height) => w.resizeTo(width, height);\n this.ref._doCenter = () => w.center();\n this.ref._doSetTitle = title => this.ref._title.set(title);\n\n // 3. Sync the live geometry/state into the ref's signals so\n // consumers can read them reactively without poking at <wr-window>.\n // Angular 22 always allows signal writes inside effects — the\n // `allowSignalWrites` option was deprecated in this version.\n runInInjectionContext(this.hostInjector, () => {\n effect(() => this.ref._state.set(w.state()));\n effect(() => this.ref._x.set(w.x()));\n effect(() => this.ref._y.set(w.y()));\n effect(() => this.ref._width.set(w.width()));\n effect(() => this.ref._height.set(w.height()));\n // Alongside the effective values, not instead of them: `saveLayout` needs\n // the geometry a maximized or minimized window would go back to.\n effect(() => this.ref._rawX.set(w.x_()));\n effect(() => this.ref._rawY.set(w.y_()));\n effect(() => this.ref._rawWidth.set(w.width_()));\n effect(() => this.ref._rawHeight.set(w.height_()));\n effect(() => this.ref._z.set(w.z()));\n\n // The z-index has to land on the OVERLAY HOST, not only on `.wr-window`.\n // Each window sits in its own CDK global wrapper, and that wrapper is\n // `position: fixed` with a numeric `z-index` — which makes it a stacking\n // context. A z-index written INSIDE it therefore only orders things\n // against its own siblings, never against another window: the wrappers\n // all carry the same z and stack by DOM order, so the most recently\n // opened window painted on top for good. `bringToFront()` raised the\n // number and nothing moved — measured in Chromium, `elementFromPoint` in\n // the overlap kept returning the newer window after the older one's title\n // bar was clicked.\n effect(() => {\n const host = this.ref._overlayRef?.hostElement;\n if (host) host.style.zIndex = String(w.z());\n });\n });\n\n // 4. Seed the title signal from config.\n this.ref._title.set(this.config.title ?? '');\n\n // 5. Storage — hydrate from disk + auto-save on geometry change.\n if (this.config.storage) {\n this.hydrateFromStorage(w);\n this.installAutosave(w);\n }\n\n // 6. Apply any state the manager pinned for restore — bridges are\n // now wired so `ref.minimize()` / `maximize()` actually fire.\n const pending = this.ref.pendingStateOnMount;\n if (pending) {\n this.ref.pendingStateOnMount = null;\n if (pending === 'minimized') this.ref.minimize();\n else if (pending === 'maximized') this.ref.maximize();\n }\n }\n\n /** Apply persisted geometry on top of config defaults, before the user sees the window. */\n private hydrateFromStorage(w: WrWindow): void {\n const cfg = this.config.storage;\n if (!cfg) return;\n const saved = this.storage.get<PersistedGeometry>(storageKey(cfg));\n if (!saved) return;\n const persist = cfg.persist ?? 'all';\n if (persist !== 'size') {\n if (typeof saved.x === 'number') w.x_.set(saved.x);\n if (typeof saved.y === 'number') w.y_.set(saved.y);\n }\n if (persist !== 'position') {\n if (typeof saved.width === 'number') w.width_.set(saved.width);\n if (typeof saved.height === 'number') w.height_.set(saved.height);\n }\n }\n\n /** Persist geometry whenever it changes, debounced. */\n private installAutosave(w: WrWindow): void {\n const cfg = this.config.storage;\n if (!cfg) return;\n const persist = cfg.persist ?? 'all';\n const key = storageKey(cfg);\n\n runInInjectionContext(this.hostInjector, () => {\n effect(() => {\n // Read every signal we want to watch; ignore minimized/maximized\n // overlay values — we only persist the user's chosen geometry.\n const x = w.x_();\n const y = w.y_();\n const width = w.width_();\n const height = w.height_();\n\n if (this.persistTimer !== null) clearTimeout(this.persistTimer);\n this.persistTimer = setTimeout(() => {\n this.persistTimer = null;\n const payload: PersistedGeometry = {};\n if (persist !== 'size') {\n (payload as { x?: number; y?: number }).x = x;\n (payload as { x?: number; y?: number }).y = y;\n }\n if (persist !== 'position') {\n (payload as { width?: number; height?: number }).width = width;\n (payload as { width?: number; height?: number }).height = height;\n }\n this.storage.set(key, payload);\n }, PERSIST_DEBOUNCE_MS);\n });\n });\n }\n}\n","<wr-window\n [open]=\"true\"\n [title]=\"ref.title()\"\n [os]=\"config.os ?? 'auto'\"\n [size]=\"config.size ?? 'md'\"\n [chromeSize]=\"config.chromeSize ?? 'normal'\"\n [animations]=\"config.animations ?? true\"\n [initialX]=\"config.x ?? null\"\n [initialY]=\"config.y ?? null\"\n [initialWidth]=\"config.width ?? null\"\n [initialHeight]=\"config.height ?? null\"\n [minWidth]=\"config.minWidth ?? 220\"\n [minHeight]=\"config.minHeight ?? 140\"\n [maxWidth]=\"config.maxWidth ?? 1000000\"\n [maxHeight]=\"config.maxHeight ?? 1000000\"\n [movable]=\"config.movable ?? true\"\n [resizable]=\"config.resizable ?? true\"\n [keepInViewport]=\"config.keepInViewport ?? true\"\n [snap]=\"config.snap ?? 'none'\"\n [dragHandle]=\"config.dragHandle ?? null\"\n [showMinimize]=\"config.showMinimize ?? null\"\n [showMaximize]=\"config.showMaximize ?? null\"\n [showClose]=\"config.showClose ?? true\"\n (closed)=\"ref.close()\"\n #window\n>\n <ng-container #content />\n</wr-window>\n\n@if (window.snapTarget(); as target) {\n <div class=\"wr-window__snap-hint\" [attr.data-target]=\"target\" aria-hidden=\"true\"></div>\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { OverlayRef } from '@angular/cdk/overlay';\nimport { type ComponentRef, type Signal, type WritableSignal, signal } from '@angular/core';\n\nimport { ReplaySubject, Subject } from 'rxjs';\n\nimport type { WrWindowState, WrWindowBeforeCloseHook } from './interfaces';\n\n/**\n * Handle returned by `WrWindowManager.open()`.\n *\n * Wraps the underlying overlay, exposes signals for the live geometry,\n * and gives the consumer programmatic control over the window\n * (focus, move, resize, minimize, maximize, close).\n *\n * @example\n * ```ts\n * const ref = manager.open(EditorComponent, {\n * title: 'Untitled.md',\n * storage: { key: 'editor', prefix: 'app' },\n * });\n *\n * ref.beforeClose(async () => {\n * if (!isDirty) return true;\n * return await confirmDiscard();\n * });\n *\n * const saved = await ref.afterClosed(); // resolves with whatever the\n * // component passed to ref.close(value)\n * ```\n */\nexport class WrWindowRef<C, R = unknown> {\n /** Stable id — used by the taskbar, workspace save, and DI. */\n readonly id: string;\n\n /** @internal — emits the close result once and completes. */\n /**\n * A `ReplaySubject`, not a plain `Subject`, so the result survives a late\n * subscriber — the same reasoning `WrDialogRef` already carries. A caller\n * that holds the ref and awaits `afterClosed()` after any intervening\n * `await` subscribes to an already-completed stream, and a plain Subject\n * hands it nothing but `complete`: the promise resolved `undefined` and a\n * saved result was indistinguishable from a dismissal.\n */\n readonly _closed = new ReplaySubject<R | undefined>(1);\n\n /** @internal — emits whenever the visual state changes. */\n readonly _stateChanged = new Subject<WrWindowState>();\n\n /** @internal — set by the container right after attach. */\n componentRef: ComponentRef<C> | null = null;\n\n /** @internal — whether this window opts into the taskbar list. */\n taskbarVisible = true;\n\n /**\n * @internal — non-`normal` state to apply right after the container\n * wires its bridges (so `restoreLayout` can land a window straight\n * into `minimized` / `maximized` even though it just opened).\n */\n pendingStateOnMount: WrWindowState | null = null;\n\n // Live geometry signals (writable internally, exposed read-only)\n /** @internal */ readonly _state: WritableSignal<WrWindowState> = signal('normal');\n /** @internal */ readonly _x = signal(0);\n /** @internal */ readonly _y = signal(0);\n /** @internal */ readonly _width = signal(0);\n /** @internal */ readonly _height = signal(0);\n /** @internal */ readonly _z = signal(0);\n\n /**\n * The geometry the USER chose, as opposed to the one the current state\n * imposes. `_x` and friends mirror the window's EFFECTIVE values — a\n * maximized window reports the viewport, a minimized one reports its\n * collapsed header height — which is right for anything drawing the window\n * and wrong for anything persisting it.\n *\n * @internal\n */\n readonly _rawX = signal(0);\n /** @internal */ readonly _rawY = signal(0);\n /** @internal */ readonly _rawWidth = signal(0);\n /** @internal */ readonly _rawHeight = signal(0);\n /** @internal */ readonly _title: WritableSignal<string> = signal('');\n\n /** Window state. */\n readonly state: Signal<WrWindowState> = this._state.asReadonly();\n /** Live X. */\n readonly x: Signal<number> = this._x.asReadonly();\n /** Live Y. */\n readonly y: Signal<number> = this._y.asReadonly();\n /** Live width. */\n readonly width: Signal<number> = this._width.asReadonly();\n /** Live height. */\n readonly height: Signal<number> = this._height.asReadonly();\n /** Stack z-index. */\n readonly z: Signal<number> = this._z.asReadonly();\n /** Live title. */\n readonly title: Signal<string> = this._title.asReadonly();\n\n // Hooks\n private _beforeCloseHook: WrWindowBeforeCloseHook<R> | null = null;\n\n // Imperative bridges — wired by the manager / container after attach\n /** @internal */ _doClose: ((result: R | undefined) => void) | null = null;\n /** @internal */ _doMinimize: (() => void) | null = null;\n /** @internal */ _doMaximize: (() => void) | null = null;\n /** @internal */ _doRestore: (() => void) | null = null;\n /** @internal */ _doFocus: (() => void) | null = null;\n /** @internal */ _doMoveTo: ((x: number, y: number) => void) | null = null;\n /** @internal */ _doResizeTo: ((w: number, h: number) => void) | null = null;\n /** @internal */ _doCenter: (() => void) | null = null;\n /** @internal */ _doSetTitle: ((title: string) => void) | null = null;\n\n constructor(\n id: string,\n public readonly _overlayRef: OverlayRef\n ) {\n this.id = id;\n }\n\n /** Resolved instance of the projected component. */\n get componentInstance(): C {\n if (!this.componentRef) {\n throw new Error('WrWindowRef: component not yet attached');\n }\n return this.componentRef.instance;\n }\n\n // Lifecycle\n\n /**\n * Close the window, optionally returning a result. If a `beforeClose`\n * hook is registered it is consulted first — a falsy resolution\n * cancels the close.\n */\n async close(result?: R): Promise<void> {\n if (this._beforeCloseHook) {\n const ok = await this._beforeCloseHook(result);\n if (!ok) return;\n }\n this._doClose?.(result);\n }\n\n /** Toggle the minimized state. */\n minimize(): void {\n this._doMinimize?.();\n }\n\n /** Toggle the maximized state. */\n maximize(): void {\n this._doMaximize?.();\n }\n\n /** Force-restore from minimized / maximized to `normal`. */\n restore(): void {\n this._doRestore?.();\n }\n\n /** Bring this window to the top of the stack. */\n focus(): void {\n this._doFocus?.();\n }\n\n // Programmatic geometry\n\n moveTo(x: number, y: number): void {\n this._doMoveTo?.(x, y);\n }\n\n resizeTo(width: number, height: number): void {\n this._doResizeTo?.(width, height);\n }\n\n /** Re-position the window so it sits centered in the current viewport. */\n center(): void {\n this._doCenter?.();\n }\n\n setTitle(title: string): void {\n this._doSetTitle?.(title);\n }\n\n // Hooks\n\n /**\n * Register a guard that runs before `close()`. Return `false` (or a\n * Promise resolving to false) to veto. Only one hook per ref —\n * subsequent calls replace the previous.\n */\n beforeClose(hook: WrWindowBeforeCloseHook<R>): void {\n this._beforeCloseHook = hook;\n }\n\n /** Resolves with the result passed to `close()` (or `undefined`). */\n afterClosed(): Promise<R | undefined> {\n return new Promise(resolve => {\n this._closed.subscribe({\n next: value => resolve(value),\n complete: () => resolve(undefined),\n });\n });\n }\n\n /** Escape hatch — the underlying CDK overlay ref. */\n get overlayRef(): OverlayRef {\n return this._overlayRef;\n }\n}\n\nexport type { WrWindowBeforeCloseHook } from './interfaces';\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { type OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal, type ComponentType } from '@angular/cdk/portal';\nimport { isPlatformBrowser } from '@angular/common';\nimport {\n EnvironmentInjector,\n Injector,\n PLATFORM_ID,\n Service,\n type Signal,\n computed,\n inject,\n signal,\n} from '@angular/core';\n\nimport { WR_OVERLAY } from 'ngwr/overlay';\nimport { WrStorage } from 'ngwr/storage';\nimport { randomId } from 'ngwr/utils';\n\nimport type { WrWindowConfig, WrWindowState, WrWindowStorageConfig } from '../interfaces';\nimport { storageKey } from '../storage-key';\nimport { WR_WINDOW_DATA, WR_WINDOW_REF } from '../tokens';\nimport { WrWindowContainer } from '../window-container';\nimport { WrWindowRef } from '../window-ref';\n\ninterface RestoreSnapshot {\n readonly id: string;\n readonly state: WrWindowState;\n readonly x: number;\n readonly y: number;\n readonly width: number;\n readonly height: number;\n readonly title: string;\n}\n\n/**\n * Owns the open `<wr-window>` stack, hands out z-indexes, cascades the\n * default spawn position, and opens programmatic windows that wrap a\n * consumer component.\n *\n * Inject the singleton and call `open(component, config)` for a\n * dialog-style flow:\n *\n * ```ts\n * const manager = inject(WrWindowManager);\n *\n * const ref = manager.open(EditorComponent, {\n * title: 'Untitled.md',\n * size: 'lg',\n * storage: { key: 'editor', prefix: 'my-app' },\n * });\n *\n * const saved = await ref.afterClosed();\n * ```\n *\n * Declarative `<wr-window [(open)]=\"...\">` instances also register with\n * the manager on focus, so both styles share the same stack ordering.\n */\n@Service()\nexport class WrWindowManager {\n private readonly overlay = inject(WR_OVERLAY);\n private readonly parentInjector = inject(EnvironmentInjector);\n private readonly storage = inject(WrStorage);\n private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n private readonly baseZ = 1000;\n private topZ = this.baseZ;\n private openCount = 0;\n\n /** All open windows opened via `open()` — declarative `<wr-window>` is not tracked here. */\n private readonly _windows = signal<readonly WrWindowRef<unknown, unknown>[]>([]);\n\n /**\n * Filled by `restoreLayout` right before it invokes the consumer's\n * opener callback. The next `open()` call with a matching `config.id`\n * pops the entry and uses it as the initial geometry (so the seed\n * lands at the saved coords instead of the cascade default) and\n * applies any non-`normal` state after the bridges are wired.\n */\n private readonly pendingRestores = new Map<string, RestoreSnapshot>();\n\n /** All currently-open programmatic windows. */\n readonly windows: Signal<readonly WrWindowRef<unknown, unknown>[]> = this._windows.asReadonly();\n\n /** Programmatic windows that are minimized AND opted into the taskbar. */\n readonly minimized = computed(() => this._windows().filter(w => w.taskbarVisible && w.state() === 'minimized'));\n\n /** Reserve the next z-index. Strictly increasing across the app's lifetime. */\n bringToFront(): number {\n this.topZ += 1;\n return this.topZ;\n }\n\n /** Cascade offset for new windows, so two opens don't perfectly overlap. */\n nextStartOffset(): { readonly x: number; readonly y: number } {\n const offset = (this.openCount % 10) * 30;\n this.openCount += 1;\n return { x: 50 + offset, y: 50 + offset };\n }\n\n /**\n * Open a window with `component` rendered as its body. Returns a ref\n * the caller can use to drive the window programmatically and await\n * its result.\n *\n * **Singleton by id** — if `config.id` is set and a window with that\n * id is already open, the existing ref is restored (if minimized),\n * brought to the front, and returned. No duplicate window is\n * created. Use this to coalesce repeated open() calls (e.g. a\n * \"Settings\" menu item that should always re-focus the same window).\n */\n open<C, R = unknown, D = unknown>(component: ComponentType<C>, config: WrWindowConfig<D> = {}): WrWindowRef<C, R> {\n if (config.id) {\n const existing = this.findById(config.id);\n if (existing) {\n existing.restore();\n existing.focus();\n return existing as WrWindowRef<C, R>;\n }\n }\n\n // Honour a pending restore — `restoreLayout` populates this Map\n // right before invoking the consumer's opener so the new window\n // seeds at the saved geometry instead of the cascade default.\n const pending = config.id ? this.pendingRestores.get(config.id) : undefined;\n if (pending) {\n this.pendingRestores.delete(config.id!);\n config = {\n ...config,\n x: pending.x,\n y: pending.y,\n width: pending.width,\n height: pending.height,\n title: pending.title || config.title,\n };\n }\n\n // Each window gets its own CDK overlay pane positioned `static` —\n // <wr-window> itself uses `position: fixed`, so the pane is only a\n // mount point. Windows are never modal — reach for `WrDialog` when\n // you need a backdrop + focus trap + scroll block.\n const overlayRef: OverlayRef = this.overlay.create({\n positionStrategy: this.overlay.position().global(),\n panelClass: 'wr-window-overlay',\n hasBackdrop: false,\n // OUT of the top layer, deliberately. The CDK puts overlay hosts there by\n // default (`popover=\"manual\"`), and the top layer orders strictly by\n // ENTRY: whatever opened last paints on top and no z-index can change it.\n // That is right for a menu or a modal and exactly wrong for a window\n // manager, whose whole job is letting the user decide which window is in\n // front. It also fixes the ordering against modals: a dialog stays in the\n // top layer, so it now sits above every window instead of below whichever\n // window happened to open after it.\n usePopover: false,\n });\n\n const id = config.id ?? randomId('wr-window');\n const ref = new WrWindowRef<C, R>(id, overlayRef);\n ref.taskbarVisible = config.taskbar !== false;\n\n // Provide WR_WINDOW_REF + WR_WINDOW_DATA inside the projected\n // component's subtree so it can `inject(WR_WINDOW_REF)` etc.\n const childInjector = Injector.create({\n parent: this.parentInjector,\n providers: [\n { provide: WR_WINDOW_REF, useValue: ref },\n { provide: WR_WINDOW_DATA, useValue: config.data ?? null },\n ],\n });\n\n const portal = new ComponentPortal<WrWindowContainer<C>>(WrWindowContainer);\n const containerRef = overlayRef.attach(portal);\n const container = containerRef.instance;\n container.config = config;\n container.ref = ref as WrWindowRef<C, unknown>;\n container.componentType = component;\n container.childInjector = childInjector;\n\n if (this.isBrowser) {\n overlayRef.overlayElement.setAttribute('role', 'dialog');\n }\n\n if (config.closeOnEscape !== false) {\n overlayRef.keydownEvents().subscribe(event => {\n if (event.key === 'Escape') {\n event.preventDefault();\n void ref.close();\n }\n });\n }\n\n // Wire close → disposal + completion of the result subject. The\n // ref's `close()` already runs the beforeClose hook before reaching\n // this bridge.\n ref._doClose = result => {\n overlayRef.dispose();\n ref._closed.next(result);\n ref._closed.complete();\n this._windows.update(list => list.filter(r => r !== (ref as unknown as WrWindowRef<unknown, unknown>)));\n };\n\n this._windows.update(list => [...list, ref as unknown as WrWindowRef<unknown, unknown>]);\n\n // If the pending restore had a non-`normal` state, hand it to the\n // container so it can apply it right after wiring the bridges.\n // queueMicrotask would fire before afterNextRender — the bridges\n // wouldn't be set yet and ref.minimize() / maximize() would no-op.\n if (pending && pending.state !== 'normal') {\n ref.pendingStateOnMount = pending.state;\n }\n\n return ref;\n }\n\n /** Close every programmatically-opened window. */\n closeAll(): void {\n for (const ref of [...this._windows()]) {\n void ref.close();\n }\n }\n\n /** Look up an open window by its `config.id`. Returns `null` when no match. */\n findById(id: string): WrWindowRef<unknown, unknown> | null {\n return this._windows().find(r => r.id === id) ?? null;\n }\n\n /**\n * Drop the persisted geometry for a window so the next open uses the\n * config defaults again. Matches `WrWindowConfig.storage` exactly.\n */\n clearPersistedPosition(cfg: WrWindowStorageConfig): void {\n this.storage.remove(storageKey(cfg));\n }\n\n // Workspace save/restore\n //\n // A workspace is a snapshot of every open window's id + state +\n // geometry. Reopening is the consumer's job (component identities\n // aren't serialisable), so `restoreLayout` returns the captured\n // snapshots and a helper that re-applies geometry once the windows\n // have been opened again.\n\n /** Snapshot of one window — what `saveLayout` writes / `restoreLayout` returns. */\n private layoutKey(name: string): string {\n return `wr:window-layout:${name}`;\n }\n\n /**\n * Persist the geometry + state of every open programmatic window\n * under `name`. Pair with `restoreLayout(name)` after re-opening the\n * matching components.\n */\n saveLayout(name: string): void {\n // The RAW geometry, not the live one. `ref.x()` / `ref.width()` report what\n // is on screen — a maximized window measures the viewport, a minimized one\n // measures its collapsed header — so saving those threw away the size the\n // user actually chose. Restoring then re-maximized over viewport-sized\n // \"restore\" geometry, and \"Restore down\" left the window filling the screen\n // with no way back; a minimized window came back from the taskbar as a stub\n // clamped to `minHeight`. The window knows the real numbers all along.\n const snapshot = this._windows().map(ref => ({\n id: ref.id,\n state: ref.state(),\n x: ref._rawX(),\n y: ref._rawY(),\n width: ref._rawWidth(),\n height: ref._rawHeight(),\n title: ref.title(),\n }));\n this.storage.set(this.layoutKey(name), snapshot);\n }\n\n /** Read a saved workspace. Returns `null` when no snapshot is found. */\n readLayout(name: string): readonly RestoreSnapshot[] | null {\n return this.storage.get(this.layoutKey(name));\n }\n\n /**\n * Apply a saved workspace.\n *\n * Each saved entry is matched to a currently-open window by `id`. For\n * matches, the geometry / state / title is re-applied immediately.\n * For misses, the optional `open` callback is invoked so the consumer\n * can re-open the right component for that id — the freshly-opened\n * window then seeds straight to the saved geometry (no cascade flicker)\n * and the saved state lands once the bridges are wired.\n *\n * ```ts\n * manager.restoreLayout('default', (id, snap) => {\n * if (id.startsWith('editor:')) {\n * manager.open(EditorComponent, { id, title: snap.title, data: ... });\n * }\n * });\n * ```\n */\n restoreLayout(name: string, open?: (id: string, snapshot: { readonly title: string }) => void): void {\n const snapshot = this.readLayout(name);\n if (!snapshot) return;\n\n for (const snap of snapshot) {\n const existing = this.findById(snap.id);\n if (existing) {\n this.applyRestore(existing, snap);\n continue;\n }\n if (!open) continue;\n // Stash the geometry so the next `open()` call with this id\n // consumes it as the seed instead of cascading.\n this.pendingRestores.set(snap.id, snap);\n open(snap.id, { title: snap.title });\n // Belt + braces: if the opener didn't actually open a window (or\n // opened with a different id), drop the stale pending entry so it\n // doesn't ambush a future open.\n if (!this.findById(snap.id)) this.pendingRestores.delete(snap.id);\n }\n }\n\n private applyRestore(ref: WrWindowRef<unknown, unknown>, snap: RestoreSnapshot): void {\n // Force back to a known 'normal' baseline before applying state —\n // ref.minimize() / maximize() are toggles, so this prevents a\n // saved 'minimized' from un-minimizing an already-minimized window.\n ref.restore();\n if (snap.title) ref.setTitle(snap.title);\n ref.moveTo(snap.x, snap.y);\n ref.resizeTo(snap.width, snap.height);\n if (snap.state === 'minimized') ref.minimize();\n else if (snap.state === 'maximized') ref.maximize();\n }\n\n /** Drop a saved workspace. */\n clearLayout(name: string): void {\n this.storage.remove(this.layoutKey(name));\n }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input, signal } from '@angular/core';\n\nimport { useI18nFormatter, useI18nText } from 'ngwr/i18n';\n\nimport { WrWindowManager } from './services/window-manager';\nimport type { WrWindowRef } from './window-ref';\n\n/**\n * Stands in for the consumer input `useI18nText` expects — the taskbar exposes no\n * label inputs. Read reactively rather than once at construction: the rail is as\n * long-lived as the app, so a catalog that arrives later, or a locale switch, has to\n * reach it.\n */\nconst NO_OVERRIDE = signal<string | null>(null).asReadonly();\n\n/**\n * OS-style window taskbar. Drop one anywhere in the app — typically\n * fixed to the bottom of the viewport — and it lists every window\n * `WrWindowManager.open()` has handed out that's currently\n * `minimized`. Clicking a tab restores the window; clicking the close\n * glyph dismisses it without restoring.\n *\n * Windows opted out via `config.taskbar = false` never show up here.\n *\n * @example\n * ```html\n * <wr-window-taskbar />\n * <wr-window-taskbar position=\"top\" />\n * ```\n *\n * @see https://ngwr.dev/reference/components/window\n */\n@Component({\n selector: 'wr-window-taskbar',\n templateUrl: './window-taskbar.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { '[class]': 'classes()', role: 'toolbar', '[attr.aria-label]': 'railLabel()' },\n})\nexport class WrWindowTaskbar {\n // Four English literals lived in this component's markup, next to a catalog that\n // already carried `window.close`. A `toolbar` with no name and tabs announced in\n // the wrong language are both invisible on screen.\n /** @internal */ protected readonly railLabel = useI18nText(NO_OVERRIDE, 'window.taskbar', 'Minimized windows');\n /** @internal */ protected readonly closeLabel = useI18nText(NO_OVERRIDE, 'window.closeWindow', 'Close window');\n /** @internal */ protected readonly untitled = useI18nText(NO_OVERRIDE, 'window.untitled', 'Untitled');\n /** @internal */ protected readonly restoreLabel = useI18nFormatter('window.restoreWindow', 'Restore {{title}}');\n\n /** Edge the taskbar pins itself to. @default 'bottom' */\n readonly position = input<'top' | 'bottom'>('bottom');\n\n private readonly manager = inject(WrWindowManager);\n\n /** @internal — minimized windows that haven't opted out via `taskbar: false`. */\n protected readonly items = computed(() => this.manager.minimized());\n\n protected readonly classes = computed(() => `wr-window-taskbar wr-window-taskbar--${this.position()}`);\n\n /** A window with no title still needs a name in the rail. */\n protected tabTitle(ref: WrWindowRef<unknown, unknown>): string {\n return ref.title() || this.untitled();\n }\n\n protected restore(ref: WrWindowRef<unknown, unknown>): void {\n ref.restore();\n ref.focus();\n }\n\n protected close(ref: WrWindowRef<unknown, unknown>, event: Event): void {\n event.stopPropagation();\n void ref.close();\n }\n}\n","@if (items().length > 0) {\n <div class=\"wr-window-taskbar__rail\">\n @for (ref of items(); track ref.id) {\n <!--\n Two SIBLING buttons in a plain container, not a close button nested\n inside the tab. The close used to be a `role=\"button\"` span with\n `tabindex=\"0\"` inside the tab's own `<button>` — interactive content\n inside interactive content, which the HTML parser and `nested-interactive`\n both object to. Nothing caught it: a taskbar tab exists only while a\n window is minimized, and the a11y sweep reads prerendered HTML, where the\n rail is not rendered at all.\n -->\n <div class=\"wr-window-taskbar__tab\">\n <button\n type=\"button\"\n class=\"wr-window-taskbar__tab-restore\"\n [attr.aria-label]=\"restoreLabel({ title: tabTitle(ref) })\"\n (click)=\"restore(ref)\"\n >\n <span class=\"wr-window-taskbar__tab-title\">{{ tabTitle(ref) }}</span>\n </button>\n <button\n type=\"button\"\n class=\"wr-window-taskbar__tab-close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"close(ref, $event)\"\n >\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n <path d=\"M1 1 L9 9 M9 1 L1 9\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" />\n </svg>\n </button>\n </div>\n }\n </div>\n}\n","// `WrWindow` itself is NOT exported. Windows are opened through\n// `WrWindowManager.open(Component, config)` — one canonical path keeps\n// the API surface small and predictable.\nexport { WR_WINDOW_DATA, WR_WINDOW_REF } from './tokens';\nexport { WrWindowManager } from './services/window-manager';\nexport { type WrWindowBeforeCloseHook, WrWindowRef } from './window-ref';\nexport { WrWindowTaskbar } from './window-taskbar';\nexport type {\n WrWindowChromeSize,\n WrWindowConfig,\n WrWindowOs,\n WrWindowPersistMode,\n WrWindowSize,\n WrWindowSnap,\n WrWindowState,\n WrWindowStorageConfig,\n} from './interfaces';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["NO_OVERRIDE"],"mappings":"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"}
|
package/i18n/en.json
CHANGED
|
@@ -135,6 +135,7 @@
|
|
|
135
135
|
"cancel": "Cancel"
|
|
136
136
|
},
|
|
137
137
|
"toast": {
|
|
138
|
+
"region": "Notifications",
|
|
138
139
|
"close": "Close",
|
|
139
140
|
"copy": "Copy",
|
|
140
141
|
"copied": "Copied",
|
|
@@ -164,7 +165,12 @@
|
|
|
164
165
|
"prevMonth": "Previous month",
|
|
165
166
|
"nextMonth": "Next month",
|
|
166
167
|
"prevYear": "Previous year",
|
|
167
|
-
"nextYear": "Next year"
|
|
168
|
+
"nextYear": "Next year",
|
|
169
|
+
"prevYears": "Previous 12 years",
|
|
170
|
+
"nextYears": "Next 12 years"
|
|
171
|
+
},
|
|
172
|
+
"imageCropper": {
|
|
173
|
+
"empty": "No image"
|
|
168
174
|
},
|
|
169
175
|
"calendarHeatmap": {
|
|
170
176
|
"label": "Calendar heatmap"
|
|
@@ -200,7 +206,15 @@
|
|
|
200
206
|
"close": "Close preview"
|
|
201
207
|
},
|
|
202
208
|
"window": {
|
|
203
|
-
"close": "Close"
|
|
209
|
+
"close": "Close",
|
|
210
|
+
"minimize": "Minimize",
|
|
211
|
+
"maximize": "Maximize",
|
|
212
|
+
"restore": "Restore",
|
|
213
|
+
"restoreDown": "Restore down",
|
|
214
|
+
"restoreWindow": "Restore {{title}}",
|
|
215
|
+
"closeWindow": "Close window",
|
|
216
|
+
"untitled": "Untitled",
|
|
217
|
+
"taskbar": "Minimized windows"
|
|
204
218
|
},
|
|
205
219
|
"dialog": {
|
|
206
220
|
"close": "Close dialog"
|
package/i18n/ru.json
CHANGED
|
@@ -135,6 +135,7 @@
|
|
|
135
135
|
"cancel": "Отмена"
|
|
136
136
|
},
|
|
137
137
|
"toast": {
|
|
138
|
+
"region": "Уведомления",
|
|
138
139
|
"close": "Закрыть",
|
|
139
140
|
"copy": "Копировать",
|
|
140
141
|
"copied": "Скопировано",
|
|
@@ -164,7 +165,12 @@
|
|
|
164
165
|
"prevMonth": "Предыдущий месяц",
|
|
165
166
|
"nextMonth": "Следующий месяц",
|
|
166
167
|
"prevYear": "Предыдущий год",
|
|
167
|
-
"nextYear": "Следующий год"
|
|
168
|
+
"nextYear": "Следующий год",
|
|
169
|
+
"prevYears": "Предыдущие 12 лет",
|
|
170
|
+
"nextYears": "Следующие 12 лет"
|
|
171
|
+
},
|
|
172
|
+
"imageCropper": {
|
|
173
|
+
"empty": "Нет изображения"
|
|
168
174
|
},
|
|
169
175
|
"calendarHeatmap": {
|
|
170
176
|
"label": "Календарная тепловая карта"
|
|
@@ -200,7 +206,15 @@
|
|
|
200
206
|
"close": "Закрыть превью"
|
|
201
207
|
},
|
|
202
208
|
"window": {
|
|
203
|
-
"close": "Закрыть"
|
|
209
|
+
"close": "Закрыть",
|
|
210
|
+
"minimize": "Свернуть",
|
|
211
|
+
"maximize": "Развернуть",
|
|
212
|
+
"restore": "Восстановить",
|
|
213
|
+
"restoreDown": "Восстановить размер",
|
|
214
|
+
"restoreWindow": "Восстановить {{title}}",
|
|
215
|
+
"closeWindow": "Закрыть окно",
|
|
216
|
+
"untitled": "Без названия",
|
|
217
|
+
"taskbar": "Свёрнутые окна"
|
|
204
218
|
},
|
|
205
219
|
"dialog": {
|
|
206
220
|
"close": "Закрыть диалог"
|