{"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  readonly closed = output<void>();\n  readonly moved = output<{ readonly x: number; readonly y: number }>();\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      effect(() => this.ref._z.set(w.z()));\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 { 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  readonly _closed = new Subject<R | undefined>();\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  /** @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    });\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    const snapshot = this._windows().map(ref => ({\n      id: ref.id,\n      state: ref.state(),\n      x: ref.x(),\n      y: ref.y(),\n      width: ref.width(),\n      height: ref.height(),\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/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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"}