ngwr 10.1.0 → 10.2.1
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/alert/styles/_index.scss +7 -3
- package/breadcrumbs/styles/_index.scss +1 -1
- package/dialog/styles/_index.scss +31 -0
- package/fesm2022/ngwr-action-sheet.mjs +3 -3
- package/fesm2022/ngwr-affix.mjs +3 -3
- package/fesm2022/ngwr-alert.mjs +3 -3
- package/fesm2022/ngwr-anchor.mjs +3 -3
- package/fesm2022/ngwr-aurora.mjs +3 -3
- package/fesm2022/ngwr-avatar.mjs +3 -3
- package/fesm2022/ngwr-back-top.mjs +3 -3
- package/fesm2022/ngwr-badge.mjs +6 -6
- package/fesm2022/ngwr-bar-chart.mjs +3 -3
- package/fesm2022/ngwr-blur-text.mjs +3 -3
- package/fesm2022/ngwr-border-glow.mjs +4 -4
- package/fesm2022/ngwr-breadcrumbs.mjs +9 -8
- package/fesm2022/ngwr-breadcrumbs.mjs.map +1 -1
- package/fesm2022/ngwr-burger.mjs +3 -3
- package/fesm2022/ngwr-button.mjs +59 -11
- package/fesm2022/ngwr-button.mjs.map +1 -1
- package/fesm2022/ngwr-calendar-heatmap.mjs +3 -3
- package/fesm2022/ngwr-calendar.mjs +88 -8
- package/fesm2022/ngwr-calendar.mjs.map +1 -1
- package/fesm2022/ngwr-card.mjs +10 -10
- package/fesm2022/ngwr-carousel.mjs +6 -6
- package/fesm2022/ngwr-cascader.mjs +4 -4
- package/fesm2022/ngwr-checkbox.mjs +6 -6
- package/fesm2022/ngwr-circular-text.mjs +4 -4
- package/fesm2022/ngwr-click-spark.mjs +3 -3
- package/fesm2022/ngwr-clipboard.mjs +18 -4
- package/fesm2022/ngwr-clipboard.mjs.map +1 -1
- package/fesm2022/ngwr-collapse.mjs +9 -9
- package/fesm2022/ngwr-color-picker.mjs +6 -6
- package/fesm2022/ngwr-command-palette.mjs +3 -3
- package/fesm2022/ngwr-compare.mjs +3 -3
- package/fesm2022/ngwr-confetti.mjs +3 -3
- package/fesm2022/ngwr-context-menu.mjs +12 -12
- package/fesm2022/ngwr-cookie.mjs +3 -3
- package/fesm2022/ngwr-counter.mjs +6 -6
- package/fesm2022/ngwr-date-adapter-fns.mjs +3 -3
- package/fesm2022/ngwr-date-adapter-luxon.mjs +3 -3
- package/fesm2022/ngwr-date-adapter.mjs +3 -3
- package/fesm2022/ngwr-date-picker.mjs +336 -54
- package/fesm2022/ngwr-date-picker.mjs.map +1 -1
- package/fesm2022/ngwr-decrypt-text.mjs +3 -3
- package/fesm2022/ngwr-density.mjs +6 -6
- package/fesm2022/ngwr-descriptions.mjs +6 -6
- package/fesm2022/ngwr-dialog.mjs +33 -17
- package/fesm2022/ngwr-dialog.mjs.map +1 -1
- package/fesm2022/ngwr-directives.mjs +12 -12
- package/fesm2022/ngwr-divider.mjs +3 -3
- package/fesm2022/ngwr-donut-chart.mjs +3 -3
- package/fesm2022/ngwr-drag-drop.mjs +7 -7
- package/fesm2022/ngwr-drawer.mjs +37 -19
- package/fesm2022/ngwr-drawer.mjs.map +1 -1
- package/fesm2022/ngwr-dropdown.mjs +9 -9
- package/fesm2022/ngwr-empty.mjs +3 -3
- package/fesm2022/ngwr-event-calendar.mjs +6 -6
- package/fesm2022/ngwr-falling-text.mjs +4 -4
- package/fesm2022/ngwr-file-upload.mjs +3 -3
- package/fesm2022/ngwr-form.mjs +9 -9
- package/fesm2022/ngwr-fuzzy-text.mjs +3 -3
- package/fesm2022/ngwr-gauge.mjs +3 -3
- package/fesm2022/ngwr-glitch-text.mjs +4 -4
- package/fesm2022/ngwr-gradient-text.mjs +4 -4
- package/fesm2022/ngwr-hotkey.mjs +31 -10
- package/fesm2022/ngwr-hotkey.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-en.mjs +11 -0
- package/fesm2022/ngwr-i18n-en.mjs.map +1 -1
- package/fesm2022/ngwr-i18n-ru.mjs +11 -0
- package/fesm2022/ngwr-i18n-ru.mjs.map +1 -1
- package/fesm2022/ngwr-i18n.mjs +9 -9
- package/fesm2022/ngwr-icon.mjs +6 -6
- package/fesm2022/ngwr-image-cropper.mjs +3 -3
- package/fesm2022/ngwr-input-number.mjs +3 -3
- package/fesm2022/ngwr-input-otp.mjs +3 -3
- package/fesm2022/ngwr-input.mjs +15 -15
- package/fesm2022/ngwr-keyboard.mjs +3 -3
- package/fesm2022/ngwr-knob.mjs +3 -3
- package/fesm2022/ngwr-layout.mjs +15 -15
- package/fesm2022/ngwr-lightbox.mjs +4 -4
- package/fesm2022/ngwr-line-chart.mjs +3 -3
- package/fesm2022/ngwr-list.mjs +14 -9
- package/fesm2022/ngwr-list.mjs.map +1 -1
- package/fesm2022/ngwr-loading-bar.mjs +71 -31
- package/fesm2022/ngwr-loading-bar.mjs.map +1 -1
- package/fesm2022/ngwr-marquee.mjs +4 -4
- package/fesm2022/ngwr-media.mjs +3 -3
- package/fesm2022/ngwr-mention.mjs +6 -6
- package/fesm2022/ngwr-meta.mjs +6 -6
- package/fesm2022/ngwr-meter-group.mjs +3 -3
- package/fesm2022/ngwr-overlay.mjs +16 -7
- package/fesm2022/ngwr-overlay.mjs.map +1 -1
- package/fesm2022/ngwr-page-header.mjs +3 -3
- package/fesm2022/ngwr-pagination.mjs +13 -9
- package/fesm2022/ngwr-pagination.mjs.map +1 -1
- package/fesm2022/ngwr-pipes.mjs +21 -21
- package/fesm2022/ngwr-platform.mjs +9 -9
- package/fesm2022/ngwr-popconfirm.mjs +6 -6
- package/fesm2022/ngwr-popover.mjs +28 -8
- package/fesm2022/ngwr-popover.mjs.map +1 -1
- package/fesm2022/ngwr-progress.mjs +3 -3
- package/fesm2022/ngwr-pull-to-refresh.mjs +3 -3
- package/fesm2022/ngwr-qr.mjs +3 -3
- package/fesm2022/ngwr-radio.mjs +6 -6
- package/fesm2022/ngwr-rating.mjs +3 -3
- package/fesm2022/ngwr-result.mjs +12 -12
- package/fesm2022/ngwr-rotating-text.mjs +3 -3
- package/fesm2022/ngwr-scroll.mjs +3 -3
- package/fesm2022/ngwr-segmented.mjs +3 -3
- package/fesm2022/ngwr-select.mjs +9 -9
- package/fesm2022/ngwr-shiny-text.mjs +7 -7
- package/fesm2022/ngwr-sidebar.mjs +3 -3
- package/fesm2022/ngwr-skeleton.mjs +3 -3
- package/fesm2022/ngwr-slider.mjs +3 -3
- package/fesm2022/ngwr-sparkline.mjs +3 -3
- package/fesm2022/ngwr-speed-dial.mjs +3 -3
- package/fesm2022/ngwr-spinner.mjs +3 -3
- package/fesm2022/ngwr-splash-cursor.mjs +3 -3
- package/fesm2022/ngwr-split-text.mjs +3 -3
- package/fesm2022/ngwr-splitter.mjs +3 -3
- package/fesm2022/ngwr-spotlight-card.mjs +7 -7
- package/fesm2022/ngwr-squircle.mjs +6 -6
- package/fesm2022/ngwr-star-border.mjs +4 -4
- package/fesm2022/ngwr-statistic.mjs +9 -9
- package/fesm2022/ngwr-stepper.mjs +6 -6
- package/fesm2022/ngwr-storage.mjs +27 -17
- package/fesm2022/ngwr-storage.mjs.map +1 -1
- package/fesm2022/ngwr-switch.mjs +3 -3
- package/fesm2022/ngwr-table.mjs +19 -31
- package/fesm2022/ngwr-table.mjs.map +1 -1
- package/fesm2022/ngwr-tabs.mjs +6 -6
- package/fesm2022/ngwr-textarea.mjs +3 -3
- package/fesm2022/ngwr-theme.mjs +3 -3
- package/fesm2022/ngwr-tilt-card.mjs +7 -7
- package/fesm2022/ngwr-timeline.mjs +6 -6
- package/fesm2022/ngwr-toast.mjs +54 -20
- package/fesm2022/ngwr-toast.mjs.map +1 -1
- package/fesm2022/ngwr-toolbar.mjs +3 -3
- package/fesm2022/ngwr-tour.mjs +6 -6
- package/fesm2022/ngwr-transfer.mjs +3 -3
- package/fesm2022/ngwr-tree.mjs +3 -3
- package/fesm2022/ngwr-typewriter.mjs +4 -4
- package/fesm2022/ngwr-typography.mjs +3 -3
- package/fesm2022/ngwr-version.mjs +1 -1
- package/fesm2022/ngwr-version.mjs.map +1 -1
- package/fesm2022/ngwr-virtual-scroll.mjs +4 -4
- package/fesm2022/ngwr-waves.mjs +4 -4
- package/fesm2022/ngwr-window.mjs +80 -18
- package/fesm2022/ngwr-window.mjs.map +1 -1
- package/i18n/en.json +8 -0
- package/i18n/ru.json +8 -0
- package/package.json +1 -1
- package/sidebar/styles/_index.scss +3 -3
- package/stepper/styles/_index.scss +3 -3
- package/tabs/styles/_index.scss +1 -1
- package/theme/styles/_colors.scss +29 -8
- package/types/ngwr-button.d.ts +32 -0
- package/types/ngwr-calendar.d.ts +27 -1
- package/types/ngwr-clipboard.d.ts +8 -1
- package/types/ngwr-date-picker.d.ts +124 -8
- package/types/ngwr-dialog.d.ts +13 -0
- package/types/ngwr-drawer.d.ts +15 -0
- package/types/ngwr-hotkey.d.ts +2 -0
- package/types/ngwr-list.d.ts +7 -2
- package/types/ngwr-loading-bar.d.ts +4 -7
- package/types/ngwr-pagination.d.ts +6 -1
- package/types/ngwr-popover.d.ts +10 -2
- package/types/ngwr-storage.d.ts +10 -1
- package/types/ngwr-toast.d.ts +19 -4
- package/types/ngwr-version.d.ts +1 -1
- package/types/ngwr-window.d.ts +23 -2
- package/typography/styles/_index.scss +2 -2
|
@@ -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 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/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 { 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 // 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":";;;;;;;;;;AAAA;;;;;AAKG;AAMH;MACa,aAAa,GAAG,IAAI,cAAc,CAAgC,eAAe;AAE9F;MACa,cAAc,GAAG,IAAI,cAAc,CAAU,gBAAgB;;ACb1E;AACM,SAAU,UAAU,CAAC,GAA0B,EAAA;AACnD,IAAA,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAA,EAAG,GAAG,CAAC,MAAM,CAAA,CAAA,CAAG,GAAG,EAAE;AACjD,IAAA,OAAO,aAAa,MAAM,CAAA,EAAG,GAAG,CAAC,GAAG,EAAE;AACxC;;ACNA;;;;;AAKG;AA6BH;;;;;;AAMG;AACH,SAAS,QAAQ,GAAA;IACf,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,SAAS,KAAK,WAAW;AAAE,QAAA,OAAO,SAAS;AAEvF,IAAA,MAAM,MAAM,GAAI,SAAkE,CAAC,aAAa;;;AAGhG,IAAA,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC;IAC9E,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE;AAChE,IAAA,IACE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;AACxB,QAAA,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC3B,QAAA,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC3B,QAAA,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EACzB;AACA,QAAA,OAAO,OAAO;IAChB;AACA,IAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,OAAO;AACvG,IAAA,OAAO,SAAS;AAClB;AAEA,MAAM,WAAW,GAAG,QAAQ,EAAE;AAE9B,MAAM,YAAY,GAAsE;IACtF,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC/B,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC/B,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CAChC;AASD,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,SAAS,aAAa,GAAA;AACpB,IAAA,OAAO,OAAO,MAAM,KAAK,WAAW,GAAG,IAAI,GAAG,MAAM,CAAC,UAAU;AACjE;AAEA,SAAS,cAAc,GAAA;AACrB,IAAA,OAAO,OAAO,MAAM,KAAK,WAAW,GAAG,GAAG,GAAG,MAAM,CAAC,WAAW;AACjE;AAEA;;;;;;;;;AASG;MAkBU,QAAQ,CAAA;;IAEV,IAAI,GAAG,KAAK,CAAU,IAAI;6EAAC;;IAG3B,KAAK,GAAG,KAAK,CAAgB,QAAQ;8EAAC;;IAGtC,KAAK,GAAG,KAAK,CAAS,EAAE;8EAAC;;AAGf,IAAA,OAAO,GAAG,QAAQ,CAAC,iBAAiB,CAAC;;AAG/C,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAC3C,SAAS,EAAE,CAAC,CAAU,MAAqB,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACzF;AACO,IAAA,QAAQ,GAAG,KAAK,CAAgB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAC3C,SAAS,EAAE,CAAC,CAAU,MAAqB,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACzF;AAEF;;;;AAIG;IACM,IAAI,GAAG,KAAK,CAAsB,IAAI;6EAAC;;AAGvC,IAAA,YAAY,GAAG,KAAK,CAAgB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,cAAA,EAAA,8BAAA,EAAA,CAAA,EAC/C,SAAS,EAAE,CAAC,CAAU,MAAqB,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,oBAAoB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAC3F;AACO,IAAA,aAAa,GAAG,KAAK,CAAgB,IAAI,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EAChD,SAAS,EAAE,CAAC,CAAU,MAAqB,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,oBAAoB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAC3F;AAEF;;;;;AAKG;IACM,EAAE,GAAG,KAAK,CAAa,MAAM;2EAAC;;AAG9B,IAAA,UAAU,GAAG,QAAQ,CAAqB,MAAK;AACtD,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;QACnB,OAAO,CAAC,KAAK,MAAM,GAAG,WAAW,GAAG,CAAC;IACvC,CAAC;mFAAC;;IAGO,UAAU,GAAG,KAAK,CAAqB,QAAQ;mFAAC;AAEzD;;;;AAIG;IACM,UAAU,GAAG,KAAK,CAAC,IAAI,kFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;AAE9D,IAAA,QAAQ,GAAG,KAAK,CAAS,GAAG,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,CAAC,CAAU,KAAa,oBAAoB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;AAClG,IAAA,SAAS,GAAG,KAAK,CAAS,GAAG,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,SAAS,EAAE,CAAC,CAAU,KAAa,oBAAoB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;AACnG,IAAA,QAAQ,GAAG,KAAK,CAAS,MAAM,CAAC,iBAAiB,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,UAAA,EAAA,8BAAA,EAAA,CAAA,EACxD,SAAS,EAAE,CAAC,CAAU,MAAc,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAC7G;AACO,IAAA,SAAS,GAAG,KAAK,CAAS,MAAM,CAAC,iBAAiB,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,WAAA,EAAA,8BAAA,EAAA,CAAA,EACzD,SAAS,EAAE,CAAC,CAAU,MAAc,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC,iBAAiB,GAAG,oBAAoB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,GAC7G;IAEO,OAAO,GAAG,KAAK,CAAC,IAAI,+EAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;IAC3D,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;IAC7D,cAAc,GAAG,KAAK,CAAC,IAAI,sFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;;IAGlE,IAAI,GAAG,KAAK,CAAe,MAAM;6EAAC;AAE3C;;;;;;AAMG;IACM,UAAU,GAAG,KAAK,CAAgB,IAAI;mFAAC;IAEvC,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;IAChE,YAAY,GAAG,KAAK,CAAC,IAAI,oFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;IAChE,SAAS,GAAG,KAAK,CAAC,IAAI,iFAAI,SAAS,EAAE,qBAAqB,EAAA,CAAG;IAE7D,MAAM,GAAG,MAAM,EAAQ;IACvB,KAAK,GAAG,MAAM,EAA8C;IAC5D,OAAO,GAAG,MAAM,EAAuD;AAE/D,IAAA,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;;;AAIlD,wCAA6C,EAAE,GAAG,MAAM,CAAC,CAAC;2EAAC;AAC3D,wCAA6C,EAAE,GAAG,MAAM,CAAC,CAAC;2EAAC;AAC3D,iCAAsC,MAAM,GAAG,MAAM,CAAC,CAAC;+EAAC;AACxD,kCAAuC,OAAO,GAAG,MAAM,CAAC,CAAC;gFAAC;;IAGlD,eAAe,GAAmE,IAAI;;IAGrF,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;0EAAC;AAE7B,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;AACzC,QAAA,MAAM,KAAK,GAAG;YACZ,WAAW;AACX,YAAA,CAAA,WAAA,EAAc,IAAI,CAAC,KAAK,EAAE,CAAA,CAAE;AAC5B,YAAA,CAAA,cAAA,EAAiB,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE;AACpC,YAAA,CAAA,kBAAA,EAAqB,IAAI,CAAC,UAAU,EAAE,CAAA,CAAE;SACzC;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;QACjD,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,QAAQ;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC;AACrF,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC;AACxD,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IACxB,CAAC;gFAAC;;;;IAKO,CAAC,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;0EAAC;IAClE,CAAC,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;0EAAC;IAClE,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;8EAAC;IACxF,MAAM,GAAG,QAAQ,CAAC,MACzB,IAAI,CAAC,KAAK,EAAE,KAAK;UACb,cAAc;AAChB,UAAE,IAAI,CAAC,KAAK,EAAE,KAAK;AACjB,cAAE,IAAI,CAAC,eAAe;AACtB,cAAE,IAAI,CAAC,OAAO,EAAE;+EACrB;IAEkB,eAAe,GAAG,MAAM,CAAC,EAAE;AAAC,IAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAA,CAAC;AAEhD;;;;;AAKG;IACM,UAAU,GAAG,MAAM,CAA4B,IAAI;mFAAC;AAE7D,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;;QAGjD,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,QAAQ;gBAAE;YAC/B,IAAI,CAAC,eAAe,EAAE;AACxB,QAAA,CAAC,CAAC;IACJ;;IAIA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;IACvE;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,EAAE;YAChC,IAAI,CAAC,OAAO,EAAE;QAChB;aAAO;AACL,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;AACnG,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;QAC7B;IACF;;IAGA,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW,IAAI,IAAI,CAAC,eAAe,EAAE;YACxD,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;AAC7C,YAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC7B;AACA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC1B;;IAGA,MAAM,CAAC,CAAS,EAAE,CAAS,EAAA;AACzB,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACd,IAAI,CAAC,eAAe,EAAE;IACxB;;IAGA,QAAQ,CAAC,KAAa,EAAE,MAAc,EAAA;QACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,eAAe,EAAE;IACxB;;IAGA,MAAM,GAAA;AACJ,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;AACvB,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE;QACxB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACzC;;;IAKU,WAAW,GAAA;QACnB,IAAI,CAAC,KAAK,EAAE;IACd;AAEU,IAAA,SAAS,CAAC,KAAmB,EAAA;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,QAAQ;YAAE;AAClD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAqB;AAC5C,QAAA,IAAI,QAAQ,CAAC,OAAO,CAAC,2BAA2B,CAAC;YAAE;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE;QAChC,IAAI,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE;QACzC,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;AACjD,QAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;AAEzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE;AACxB,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAC7B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAE7B,QAAA,MAAM,IAAI,GAAG,CAAC,CAAe,KAAU;AACrC,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;AAC3C,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,EAAE;AACtB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;AAClE,QAAA,CAAC;AACD,QAAA,MAAM,EAAE,GAAG,CAAC,CAAe,KAAU;AACnC,YAAA,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,YAAA,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC;AAC/C,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,EAAE,CAAC;AAC3C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB,IAAI,IAAI,EAAE;AACR,gBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YACtB;YACA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC;AACjD,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC;AAC5C,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;IAC1C;;IAGQ,gBAAgB,CAAC,OAAe,EAAE,OAAe,EAAA;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,IAAI,IAAI,KAAK,MAAM;AAAE,YAAA,OAAO,IAAI;QAChC,MAAM,GAAG,GAAG,EAAE;AACd,QAAA,MAAM,EAAE,GAAG,aAAa,EAAE;AAC1B,QAAA,MAAM,EAAE,GAAG,cAAc,EAAE;AAC3B,QAAA,MAAM,QAAQ,GAAG,OAAO,IAAI,GAAG;AAC/B,QAAA,MAAM,SAAS,GAAG,OAAO,IAAI,EAAE,GAAG,GAAG;AACrC,QAAA,MAAM,OAAO,GAAG,OAAO,IAAI,GAAG;AAC9B,QAAA,MAAM,UAAU,GAAG,OAAO,IAAI,EAAE,GAAG,GAAG;AACtC,QAAA,IAAI,IAAI,KAAK,KAAK,EAAE;YAClB,IAAI,OAAO,IAAI,QAAQ;AAAE,gBAAA,OAAO,UAAU;YAC1C,IAAI,OAAO,IAAI,SAAS;AAAE,gBAAA,OAAO,WAAW;YAC5C,IAAI,UAAU,IAAI,QAAQ;AAAE,gBAAA,OAAO,aAAa;YAChD,IAAI,UAAU,IAAI,SAAS;AAAE,gBAAA,OAAO,cAAc;QACpD;AACA,QAAA,IAAI,OAAO;YAAE,OAAO,KAAK,CAAC;AAC1B,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,MAAM;AAC3B,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,OAAO;AAC7B,QAAA,OAAO,IAAI;IACb;;AAGQ,IAAA,SAAS,CAAC,MAA0B,EAAA;AAC1C,QAAA,MAAM,EAAE,GAAG,aAAa,EAAE;AAC1B,QAAA,MAAM,EAAE,GAAG,cAAc,EAAE;QAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QAChC,QAAQ,MAAM;AACZ,YAAA,KAAK,KAAK;;AAER,gBAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;AACnG,gBAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;gBAC3B;AACF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB;AACF,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;AAC3B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB;AACF,YAAA,KAAK,UAAU;AACb,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACvB;AACF,YAAA,KAAK,WAAW;AACd,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;AAC3B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;gBACvB;AACF,YAAA,KAAK,aAAa;AAChB,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACd,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;gBACtB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;gBAC5B;AACF,YAAA,KAAK,cAAc;AACjB,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,gBAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;gBAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,KAAK,CAAC;gBAC5B;;QAEJ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;IACrE;IAEU,WAAW,CAAC,KAAmB,EAAE,KAAY,EAAA;QACrD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,QAAQ;YAAE;QACpD,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B;AACjD,QAAA,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;AAEzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE;AACxB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE;AAC7B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAC7B,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;AAE7B,QAAA,MAAM,IAAI,GAAG,CAAC,CAAe,KAAU;AACrC,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,OAAO;AAC9B,YAAA,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,OAAO;YAE9B,IAAI,KAAK,GAAG,MAAM;YAClB,IAAI,KAAK,GAAG,MAAM;YAClB,IAAI,KAAK,GAAG,MAAM;YAClB,IAAI,KAAK,GAAG,MAAM;YAElB,IAAI,KAAK,CAAC,CAAC;AAAE,gBAAA,KAAK,GAAG,MAAM,GAAG,EAAE;YAChC,IAAI,KAAK,CAAC,CAAC;AAAE,gBAAA,KAAK,GAAG,MAAM,GAAG,EAAE;AAChC,YAAA,IAAI,KAAK,CAAC,CAAC,EAAE;AACX,gBAAA,KAAK,GAAG,MAAM,GAAG,EAAE;AACnB,gBAAA,KAAK,GAAG,MAAM,GAAG,EAAE;YACrB;AACA,YAAA,IAAI,KAAK,CAAC,CAAC,EAAE;AACX,gBAAA,KAAK,GAAG,MAAM,GAAG,EAAE;AACnB,gBAAA,KAAK,GAAG,MAAM,GAAG,EAAE;YACrB;;AAGA,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC/D,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YACjE,IAAI,KAAK,CAAC,CAAC;AAAE,gBAAA,KAAK,IAAI,KAAK,GAAG,QAAQ;YACtC,IAAI,KAAK,CAAC,CAAC;AAAE,gBAAA,KAAK,IAAI,KAAK,GAAG,QAAQ;AAEtC,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC1B,IAAI,CAAC,eAAe,EAAE;AACxB,QAAA,CAAC;AACD,QAAA,MAAM,EAAE,GAAG,CAAC,CAAe,KAAU;AACnC,YAAA,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,YAAA,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC;AAC/C,YAAA,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,EAAE,CAAC;YAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;AACrE,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC;AAC5C,QAAA,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC;IAC1C;;;IAIU,QAAQ,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC/E,IAAA,OAAO,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IACrE,QAAQ,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC/E,IAAA,OAAO,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IACrE,QAAQ,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC/E,IAAA,OAAO,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IACrE,QAAQ,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;AAC/E,IAAA,OAAO,GAAG,CAAC,CAAe,KAAW,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;;IAIvE,mBAAmB,GAAA;AACzB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE;AAC9B,QAAA,MAAM,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,EAAE;AACtE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5E,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAC/E,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAEnB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC3B,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE;AAC9B,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AAChB,YAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;QAClB;aAAO;YACL,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;YAC9C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;QAC/B;QAEA,IAAI,CAAC,eAAe,EAAE;IACxB;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YAAE;AAC5B,QAAA,MAAM,EAAE,GAAG,aAAa,EAAE;AAC1B,QAAA,MAAM,EAAE,GAAG,cAAc,EAAE;AAC3B,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;QACvB,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,GAAG,CAAC,EAAE,EAAE,GAAG,eAAe,CAAC,CAAC;AACxE,QAAA,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,eAAe,CAAC,CAAC;IACxD;uGAlbW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,m7GCjHrB,onLAkIA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDjBa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAjBpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,aAAA,EAEN,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B;AACJ,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,iBAAiB,EAAE,KAAK;AACxB,wBAAA,gBAAgB,EAAE,KAAK;AACvB,wBAAA,kBAAkB,EAAE,SAAS;AAC7B,wBAAA,mBAAmB,EAAE,UAAU;AAC/B,wBAAA,iBAAiB,EAAE,KAAK;AACxB,wBAAA,oBAAoB,EAAE,SAAS;AAC/B,wBAAA,wBAAwB,EAAE,SAAS;AACnC,wBAAA,eAAe,EAAE,eAAe;AACjC,qBAAA,EAAA,QAAA,EAAA,onLAAA,EAAA;;;AE3EH;AACA,MAAM,mBAAmB,GAAG,GAAG;AAE/B;;;;;;;AAOG;MAQU,iBAAiB,CAAA;;AAE5B,IAAA,MAAM;;AAEN,IAAA,GAAG;;AAEH,IAAA,aAAa;;AAEb,IAAA,aAAa;AAEI,IAAA,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC/B,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;AAC3B,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACxC,YAAY,GAAyC,IAAI;IAEhD,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,YAAA,EAAA,8BAAA,EAAA,CAAA,EAAI,IAAI,EAAE,gBAAgB,EAAA,CAAG;AACtE,IAAA,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,QAAQ;iFAAC;AAExD,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AAC7B,YAAA,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;AAAE,gBAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AACjE,QAAA,CAAC,CAAC;IACJ;IAEQ,MAAM,GAAA;;AAEZ,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,EAAE;YACzE,QAAQ,EAAE,IAAI,CAAC,aAAa;AAC7B,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,YAAY;;AAGpC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE;AACzB,QAAA,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE;AACzC,QAAA,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE;AACzC,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE;AACvC,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,KAAK,EAAE;QACnC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;AACnE,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,CAAC,MAAM,EAAE;AACrC,QAAA,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;;;;;AAM1D,QAAA,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAK;AAC5C,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC5C,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpC,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACpC,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC5C,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;;;AAG9C,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxC,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACxC,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAChD,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAClD,YAAA,MAAM,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;;;;;;;;;;;YAYpC,MAAM,CAAC,MAAK;gBACV,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW;AAC9C,gBAAA,IAAI,IAAI;AAAE,oBAAA,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;;AAGF,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;;AAG5C,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC1B,YAAA,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzB;;;AAIA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB;QAC5C,IAAI,OAAO,EAAE;AACX,YAAA,IAAI,CAAC,GAAG,CAAC,mBAAmB,GAAG,IAAI;YACnC,IAAI,OAAO,KAAK,WAAW;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;iBAC3C,IAAI,OAAO,KAAK,WAAW;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;QACvD;IACF;;AAGQ,IAAA,kBAAkB,CAAC,CAAW,EAAA;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;AAC/B,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAoB,UAAU,CAAC,GAAG,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,KAAK;AACpC,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,YAAA,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ;gBAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,YAAA,IAAI,OAAO,KAAK,CAAC,CAAC,KAAK,QAAQ;gBAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACpD;AACA,QAAA,IAAI,OAAO,KAAK,UAAU,EAAE;AAC1B,YAAA,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;gBAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;AAC9D,YAAA,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;gBAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACnE;IACF;;AAGQ,IAAA,eAAe,CAAC,CAAW,EAAA;AACjC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;AAC/B,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,KAAK;AACpC,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC;AAE3B,QAAA,qBAAqB,CAAC,IAAI,CAAC,YAAY,EAAE,MAAK;YAC5C,MAAM,CAAC,MAAK;;;AAGV,gBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE;AAChB,gBAAA,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE;AAChB,gBAAA,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,EAAE;AACxB,gBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE;AAE1B,gBAAA,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI;AAAE,oBAAA,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;AAC/D,gBAAA,IAAI,CAAC,YAAY,GAAG,UAAU,CAAC,MAAK;AAClC,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI;oBACxB,MAAM,OAAO,GAAsB,EAAE;AACrC,oBAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACrB,wBAAA,OAAsC,CAAC,CAAC,GAAG,CAAC;AAC5C,wBAAA,OAAsC,CAAC,CAAC,GAAG,CAAC;oBAC/C;AACA,oBAAA,IAAI,OAAO,KAAK,UAAU,EAAE;AACzB,wBAAA,OAA+C,CAAC,KAAK,GAAG,KAAK;AAC7D,wBAAA,OAA+C,CAAC,MAAM,GAAG,MAAM;oBAClE;oBACA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;gBAChC,CAAC,EAAE,mBAAmB,CAAC;AACzB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;uGAjJW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,iKAewC,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACrC,QAAQ,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtEzD,2nCAgCA,4CDoBY,QAAQ,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,cAAA,EAAA,eAAA,EAAA,IAAA,EAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,aAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAP7B,SAAS;+BACE,qBAAqB,EAAA,eAAA,EAEd,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,QAAQ,CAAC,EAAA,QAAA,EAAA,2nCAAA,EAAA;AAiB8B,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,SAAS,OAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,oFACvC,QAAQ,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEtEzD;;;;;AAKG;AASH;;;;;;;;;;;;;;;;;;;;;;AAsBG;MACU,WAAW,CAAA;AAqFJ,IAAA,WAAA;;AAnFT,IAAA,EAAE;;AAGX;;;;;;;AAOG;AACM,IAAA,OAAO,GAAG,IAAI,aAAa,CAAgB,CAAC,CAAC;;AAG7C,IAAA,aAAa,GAAG,IAAI,OAAO,EAAiB;;IAGrD,YAAY,GAA2B,IAAI;;IAG3C,cAAc,GAAG,IAAI;AAErB;;;;AAIG;IACH,mBAAmB,GAAyB,IAAI;;AAGhD,qBAA0B,MAAM,GAAkC,MAAM,CAAC,QAAQ;+EAAC;AAClF,qBAA0B,EAAE,GAAG,MAAM,CAAC,CAAC;2EAAC;AACxC,qBAA0B,EAAE,GAAG,MAAM,CAAC,CAAC;2EAAC;AACxC,qBAA0B,MAAM,GAAG,MAAM,CAAC,CAAC;+EAAC;AAC5C,qBAA0B,OAAO,GAAG,MAAM,CAAC,CAAC;gFAAC;AAC7C,qBAA0B,EAAE,GAAG,MAAM,CAAC,CAAC;2EAAC;AAExC;;;;;;;;AAQG;IACM,KAAK,GAAG,MAAM,CAAC,CAAC;8EAAC;AAC1B,qBAA0B,KAAK,GAAG,MAAM,CAAC,CAAC;8EAAC;AAC3C,qBAA0B,SAAS,GAAG,MAAM,CAAC,CAAC;kFAAC;AAC/C,qBAA0B,UAAU,GAAG,MAAM,CAAC,CAAC;mFAAC;AAChD,qBAA0B,MAAM,GAA2B,MAAM,CAAC,EAAE;+EAAC;;AAG5D,IAAA,KAAK,GAA0B,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;;AAEvD,IAAA,CAAC,GAAmB,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE;;AAExC,IAAA,CAAC,GAAmB,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE;;AAExC,IAAA,KAAK,GAAmB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;;AAEhD,IAAA,MAAM,GAAmB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;;AAElD,IAAA,CAAC,GAAmB,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE;;AAExC,IAAA,KAAK,GAAmB,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;;IAGjD,gBAAgB,GAAsC,IAAI;;AAGlE,qBAAiB,QAAQ,GAA6C,IAAI;AAC1E,qBAAiB,WAAW,GAAwB,IAAI;AACxD,qBAAiB,WAAW,GAAwB,IAAI;AACxD,qBAAiB,UAAU,GAAwB,IAAI;AACvD,qBAAiB,QAAQ,GAAwB,IAAI;AACrD,qBAAiB,SAAS,GAA4C,IAAI;AAC1E,qBAAiB,WAAW,GAA4C,IAAI;AAC5E,qBAAiB,SAAS,GAAwB,IAAI;AACtD,qBAAiB,WAAW,GAAqC,IAAI;IAErE,WAAA,CACE,EAAU,EACM,WAAuB,EAAA;QAAvB,IAAA,CAAA,WAAW,GAAX,WAAW;AAE3B,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE;IACd;;AAGA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;QAC5D;AACA,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ;IACnC;;AAIA;;;;AAIG;IACH,MAAM,KAAK,CAAC,MAAU,EAAA;AACpB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAC9C,YAAA,IAAI,CAAC,EAAE;gBAAE;QACX;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;IACzB;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,WAAW,IAAI;IACtB;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,WAAW,IAAI;IACtB;;IAGA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,UAAU,IAAI;IACrB;;IAGA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,IAAI;IACnB;;IAIA,MAAM,CAAC,CAAS,EAAE,CAAS,EAAA;QACzB,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,CAAC;IACxB;IAEA,QAAQ,CAAC,KAAa,EAAE,MAAc,EAAA;QACpC,IAAI,CAAC,WAAW,GAAG,KAAK,EAAE,MAAM,CAAC;IACnC;;IAGA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,SAAS,IAAI;IACpB;AAEA,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B;;AAIA;;;;AAIG;AACH,IAAA,WAAW,CAAC,IAAgC,EAAA;AAC1C,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC9B;;IAGA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAG;AAC3B,YAAA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;gBACrB,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;AAC7B,gBAAA,QAAQ,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC;AACnC,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;;AAGA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW;IACzB;AACD;;AC7KD;;;;;;;;;;;;;;;;;;;;;;AAsBG;MAEU,eAAe,CAAA;AACT,IAAA,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAC5B,IAAA,cAAc,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC5C,IAAA,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IAC3B,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAElD,KAAK,GAAG,IAAI;AACrB,IAAA,IAAI,GAAG,IAAI,CAAC,KAAK;IACjB,SAAS,GAAG,CAAC;;IAGJ,QAAQ,GAAG,MAAM,CAA2C,EAAE;iFAAC;AAEhF;;;;;;AAMG;AACc,IAAA,eAAe,GAAG,IAAI,GAAG,EAA2B;;AAG5D,IAAA,OAAO,GAAqD,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;;IAGtF,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,WAAW,CAAC;kFAAC;;IAG/G,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC;QACd,OAAO,IAAI,CAAC,IAAI;IAClB;;IAGA,eAAe,GAAA;QACb,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,IAAI,EAAE;AACzC,QAAA,IAAI,CAAC,SAAS,IAAI,CAAC;AACnB,QAAA,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE;IAC3C;AAEA;;;;;;;;;;AAUG;AACH,IAAA,IAAI,CAA8B,SAA2B,EAAE,MAAA,GAA4B,EAAE,EAAA;AAC3F,QAAA,IAAI,MAAM,CAAC,EAAE,EAAE;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACzC,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,OAAO,EAAE;gBAClB,QAAQ,CAAC,KAAK,EAAE;AAChB,gBAAA,OAAO,QAA6B;YACtC;QACF;;;;QAKA,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS;QAC3E,IAAI,OAAO,EAAE;YACX,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAG,CAAC;AACvC,YAAA,MAAM,GAAG;AACP,gBAAA,GAAG,MAAM;gBACT,CAAC,EAAE,OAAO,CAAC,CAAC;gBACZ,CAAC,EAAE,OAAO,CAAC,CAAC;gBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;AACtB,gBAAA,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;aACrC;QACH;;;;;AAMA,QAAA,MAAM,UAAU,GAAe,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACjD,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE;AAClD,YAAA,UAAU,EAAE,mBAAmB;AAC/B,YAAA,WAAW,EAAE,KAAK;;;;;;;;;AASlB,YAAA,UAAU,EAAE,KAAK;AAClB,SAAA,CAAC;QAEF,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,QAAQ,CAAC,WAAW,CAAC;QAC7C,MAAM,GAAG,GAAG,IAAI,WAAW,CAAO,EAAE,EAAE,UAAU,CAAC;QACjD,GAAG,CAAC,cAAc,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK;;;AAI7C,QAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC;YACpC,MAAM,EAAE,IAAI,CAAC,cAAc;AAC3B,YAAA,SAAS,EAAE;AACT,gBAAA,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACzC,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE;AAC3D,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAuB,iBAAiB,CAAC;QAC3E,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9C,QAAA,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ;AACvC,QAAA,SAAS,CAAC,MAAM,GAAG,MAAM;AACzB,QAAA,SAAS,CAAC,GAAG,GAAG,GAA8B;AAC9C,QAAA,SAAS,CAAC,aAAa,GAAG,SAAS;AACnC,QAAA,SAAS,CAAC,aAAa,GAAG,aAAa;AAEvC,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,UAAU,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC;QAC1D;AAEA,QAAA,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,EAAE;YAClC,UAAU,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,KAAK,IAAG;AAC3C,gBAAA,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,EAAE;oBAC1B,KAAK,CAAC,cAAc,EAAE;AACtB,oBAAA,KAAK,GAAG,CAAC,KAAK,EAAE;gBAClB;AACF,YAAA,CAAC,CAAC;QACJ;;;;AAKA,QAAA,GAAG,CAAC,QAAQ,GAAG,MAAM,IAAG;YACtB,UAAU,CAAC,OAAO,EAAE;AACpB,YAAA,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AACxB,YAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAM,GAAgD,CAAC,CAAC;AACzG,QAAA,CAAC;AAED,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,GAA+C,CAAC,CAAC;;;;;QAMxF,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,EAAE;AACzC,YAAA,GAAG,CAAC,mBAAmB,GAAG,OAAO,CAAC,KAAK;QACzC;AAEA,QAAA,OAAO,GAAG;IACZ;;IAGA,QAAQ,GAAA;QACN,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE;AACtC,YAAA,KAAK,GAAG,CAAC,KAAK,EAAE;QAClB;IACF;;AAGA,IAAA,QAAQ,CAAC,EAAU,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,IAAI;IACvD;AAEA;;;AAGG;AACH,IAAA,sBAAsB,CAAC,GAA0B,EAAA;QAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACtC;;;;;;;;;AAWQ,IAAA,SAAS,CAAC,IAAY,EAAA;QAC5B,OAAO,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAE;IACnC;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAAC,IAAY,EAAA;;;;;;;;AAQrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,KAAK;YAC3C,EAAE,EAAE,GAAG,CAAC,EAAE;AACV,YAAA,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;AAClB,YAAA,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE;AACd,YAAA,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE;AACd,YAAA,KAAK,EAAE,GAAG,CAAC,SAAS,EAAE;AACtB,YAAA,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE;AACxB,YAAA,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE;AACnB,SAAA,CAAC,CAAC;AACH,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAClD;;AAGA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/C;AAEA;;;;;;;;;;;;;;;;;AAiBG;IACH,aAAa,CAAC,IAAY,EAAE,IAAiE,EAAA;QAC3F,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACtC,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,IAAI,QAAQ,EAAE;AACZ,gBAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC;gBACjC;YACF;AACA,YAAA,IAAI,CAAC,IAAI;gBAAE;;;YAGX,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;AACvC,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;;;;YAIpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACnE;IACF;IAEQ,YAAY,CAAC,GAAkC,EAAE,IAAqB,EAAA;;;;QAI5E,GAAG,CAAC,OAAO,EAAE;QACb,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;QACxC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1B,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AACrC,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;YAAE,GAAG,CAAC,QAAQ,EAAE;AACzC,aAAA,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;YAAE,GAAG,CAAC,QAAQ,EAAE;IACrD;;AAGA,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC3C;uGAjRW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,OAAA,EAAA,CAAA;wGAAf,eAAe,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;AChED;;;;;AAKG;AAOH;;;;;;;;;;;;;;;;AAgBG;MAQU,eAAe,CAAA;;IAEjB,QAAQ,GAAG,KAAK,CAAmB,QAAQ;iFAAC;AAEpC,IAAA,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;;IAG/B,KAAK,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;8EAAC;IAEhD,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,qCAAA,EAAwC,IAAI,CAAC,QAAQ,EAAE,CAAA,CAAE;gFAAC;AAE5F,IAAA,OAAO,CAAC,GAAkC,EAAA;QAClD,GAAG,CAAC,OAAO,EAAE;QACb,GAAG,CAAC,KAAK,EAAE;IACb;IAEU,KAAK,CAAC,GAAkC,EAAE,KAAY,EAAA;QAC9D,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,KAAK,GAAG,CAAC,KAAK,EAAE;IAClB;uGAnBW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAf,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAe,gVCpC5B,26BA0BA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FDUa,eAAe,EAAA,UAAA,EAAA,CAAA;kBAP3B,SAAS;+BACE,mBAAmB,EAAA,eAAA,EAEZ,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,IAAA,EAC/B,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,mBAAmB,EAAE,EAAA,QAAA,EAAA,26BAAA,EAAA;;;AElCtF;AACA;AACA;;ACFA;;AAEG;;;;"}
|
package/i18n/en.json
CHANGED
|
@@ -170,6 +170,9 @@
|
|
|
170
170
|
"dialog": {
|
|
171
171
|
"close": "Close dialog"
|
|
172
172
|
},
|
|
173
|
+
"popover": {
|
|
174
|
+
"label": "Popover"
|
|
175
|
+
},
|
|
173
176
|
"mention": {
|
|
174
177
|
"listbox": "Mentions",
|
|
175
178
|
"available": "Matches available: {{count}}",
|
|
@@ -183,6 +186,11 @@
|
|
|
183
186
|
"openTime": "Open time picker",
|
|
184
187
|
"openDateTime": "Open date and time picker",
|
|
185
188
|
"openRange": "Open range calendar",
|
|
189
|
+
"panel": "Choose date",
|
|
190
|
+
"panelTime": "Choose time",
|
|
191
|
+
"panelDateTime": "Choose date and time",
|
|
192
|
+
"panelRange": "Choose date range",
|
|
193
|
+
"panelRangeDateTime": "Choose date and time range",
|
|
186
194
|
"rangeStart": "Range start",
|
|
187
195
|
"rangeEnd": "Range end",
|
|
188
196
|
"startTime": "Start time",
|
package/i18n/ru.json
CHANGED
|
@@ -170,6 +170,9 @@
|
|
|
170
170
|
"dialog": {
|
|
171
171
|
"close": "Закрыть диалог"
|
|
172
172
|
},
|
|
173
|
+
"popover": {
|
|
174
|
+
"label": "Всплывающая панель"
|
|
175
|
+
},
|
|
173
176
|
"mention": {
|
|
174
177
|
"listbox": "Упоминания",
|
|
175
178
|
"available": "Найдено совпадений: {{count}}",
|
|
@@ -183,6 +186,11 @@
|
|
|
183
186
|
"openTime": "Открыть выбор времени",
|
|
184
187
|
"openDateTime": "Открыть выбор даты и времени",
|
|
185
188
|
"openRange": "Открыть календарь периода",
|
|
189
|
+
"panel": "Выбор даты",
|
|
190
|
+
"panelTime": "Выбор времени",
|
|
191
|
+
"panelDateTime": "Выбор даты и времени",
|
|
192
|
+
"panelRange": "Выбор периода",
|
|
193
|
+
"panelRangeDateTime": "Выбор периода и времени",
|
|
186
194
|
"rangeStart": "Начало периода",
|
|
187
195
|
"rangeEnd": "Конец периода",
|
|
188
196
|
"startTime": "Время начала",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ngwr",
|
|
3
|
-
"version": "10.1
|
|
3
|
+
"version": "10.2.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Signals-first Angular UI library: 100+ standalone, zoneless-ready components with native Signal Forms, SSR-safe rendering and CSS-variable theming.",
|
|
6
6
|
"author": "Roman Khegay <rk@garuna.dev> (https://garuna.dev)",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
&--active {
|
|
45
|
-
color: var(--wr-color-primary);
|
|
45
|
+
color: var(--wr-color-primary-ink);
|
|
46
46
|
background: var(--wr-color-primary-soft);
|
|
47
47
|
pointer-events: none;
|
|
48
48
|
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
&:hover {
|
|
168
|
-
color: var(--wr-color-primary);
|
|
168
|
+
color: var(--wr-color-primary-ink);
|
|
169
169
|
background: rgba(var(--wr-color-primary-rgb), 0.06);
|
|
170
170
|
|
|
171
171
|
.wr-sidebar__icon {
|
|
@@ -174,7 +174,7 @@
|
|
|
174
174
|
}
|
|
175
175
|
|
|
176
176
|
&--active {
|
|
177
|
-
color: var(--wr-color-primary);
|
|
177
|
+
color: var(--wr-color-primary-ink);
|
|
178
178
|
background: var(--wr-color-primary-soft);
|
|
179
179
|
pointer-events: none;
|
|
180
180
|
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
|
|
70
70
|
&:hover:not(:disabled) .wr-stepper__indicator {
|
|
71
71
|
border-color: var(--wr-color-primary);
|
|
72
|
-
color: var(--wr-color-primary);
|
|
72
|
+
color: var(--wr-color-primary-ink);
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
|
|
95
95
|
&__header--active &__indicator {
|
|
96
96
|
border-color: var(--wr-color-primary);
|
|
97
|
-
color: var(--wr-color-primary);
|
|
97
|
+
color: var(--wr-color-primary-ink);
|
|
98
98
|
background: var(--wr-color-primary-soft);
|
|
99
99
|
}
|
|
100
100
|
|
|
@@ -114,7 +114,7 @@
|
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
&__header--active &__label {
|
|
117
|
-
color: var(--wr-color-primary);
|
|
117
|
+
color: var(--wr-color-primary-ink);
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
&__optional,
|
package/tabs/styles/_index.scss
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
--wr-tabs-border: var(--wr-color-outline);
|
|
5
5
|
--wr-tabs-color: var(--wr-color-on-surface-muted);
|
|
6
6
|
--wr-tabs-color-hover: var(--wr-color-on-surface);
|
|
7
|
-
--wr-tabs-color-active: var(--wr-color-primary);
|
|
7
|
+
--wr-tabs-color-active: var(--wr-color-primary-ink);
|
|
8
8
|
--wr-tabs-indicator: var(--wr-color-primary);
|
|
9
9
|
--wr-tabs-font-size: var(--wr-control-font-size-md);
|
|
10
10
|
--wr-tabs-line-height: var(--wr-control-line-height-md);
|