{
  "name": "Window",
  "category": "Overlay",
  "subcategory": null,
  "description": "Non-modal draggable and resizable floating panel with minimize and maximize support.",
  "thumbnail": "/preview-cards/window.png",
  "hasDocsPage": true,
  "nugetPackage": "Lumeo",
  "files": [
    "UI/Window/Window.razor"
  ],
  "dependencies": [],
  "packageDependencies": [
    "Blazicons.Lucide"
  ],
  "cssVars": [
    "--color-border",
    "--color-card",
    "--color-foreground",
    "--color-muted",
    "--color-muted-foreground",
    "--radius"
  ],
  "api": {
    "name": "Window",
    "category": "Overlay",
    "subcategory": null,
    "description": "Non-modal draggable and resizable floating panel with minimize and maximize support.",
    "nugetPackage": "Lumeo",
    "files": [
      "UI/Window/Window.razor"
    ],
    "namespace": "Lumeo",
    "inheritsFrom": null,
    "implements": [
      "IAsyncDisposable"
    ],
    "parameters": [
      {
        "name": "Open",
        "type": "bool",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "OpenChanged",
        "type": "EventCallback<bool>",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "Title",
        "type": "string",
        "default": "\"\"",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "TitleContent",
        "type": "RenderFragment?",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "ChildContent",
        "type": "RenderFragment?",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "FooterContent",
        "type": "RenderFragment?",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "Width",
        "type": "string",
        "default": "\"480px\"",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "Height",
        "type": "string",
        "default": "\"360px\"",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "Resizable",
        "type": "bool",
        "default": "true",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "Draggable",
        "type": "bool",
        "default": "true",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "ShowClose",
        "type": "bool",
        "default": "true",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "ShowMinimize",
        "type": "bool",
        "default": "true",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "ShowMaximize",
        "type": "bool",
        "default": "true",
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "InitialX",
        "type": "string?",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "InitialY",
        "type": "string?",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "Class",
        "type": "string?",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": false
      },
      {
        "name": "AdditionalAttributes",
        "type": "Dictionary<string, object>?",
        "default": null,
        "description": null,
        "isCascading": false,
        "captureUnmatched": true
      }
    ],
    "events": [
      {
        "name": "OpenChanged",
        "type": "EventCallback<bool>",
        "description": null
      }
    ],
    "enums": [],
    "records": [],
    "cssVars": [
      "--color-border",
      "--color-card",
      "--color-foreground",
      "--color-muted",
      "--color-muted-foreground",
      "--radius"
    ],
    "examples": [
      {
        "title": "Basic Window",
        "code": "<Window @bind-Open=\"_open\" Title=\"My Window\" Width=\"360px\" Height=\"200px\">\n    <p class=\"text-sm text-muted-foreground\">Drag the title bar to move. Drag the bottom-right corner to resize.</p>\n</Window>\n\n<Button @onclick=\"@(() => _open = true)\">Open Window</Button>\n\n@code { private bool _open; }"
      },
      {
        "title": "Window with Footer",
        "code": "<Window @bind-Open=\"_open\" Title=\"Save Document\">\n    <p class=\"text-sm text-muted-foreground\">You have unsaved changes.</p>\n    <FooterContent>\n        <div class=\"flex gap-2 justify-end\">\n            <Button Variant=\"Button.ButtonVariant.Outline\" @onclick=\"@(() => _open = false)\">Discard</Button>\n            <Button @onclick=\"@(() => _open = false)\">Save</Button>\n        </div>\n    </FooterContent>\n</Window>"
      },
      {
        "title": "Non-Resizable Window",
        "code": "<Window @bind-Open=\"_open\" Title=\"Fixed Panel\" Resizable=\"false\">\n    <p class=\"text-sm text-muted-foreground\">This window has a fixed size.</p>\n</Window>"
      }
    ],
    "subComponents": {},
    "parseFailed": false,
    "parseError": null
  },
  "$schema": "https://lumeo.nativ.sh/registry-component-schema.json",
  "key": "window",
  "docsUrl": "https://lumeo.nativ.sh/components/window",
  "sourceUrl": [
    {
      "file": "UI/Window/Window.razor",
      "url": "https://github.com/Brain2k-0005/Lumeo/tree/master/src/Lumeo/UI/Window/Window.razor"
    }
  ],
  "source": [
    {
      "path": "UI/Window/Window.razor",
      "content": "@namespace Lumeo\n@implements IAsyncDisposable\n@inject ComponentInteropService Interop\n@inject Lumeo.Services.Localization.ILumeoLocalizer L\n\n@if (Open && !_minimized && !_maximized)\n{\n    <div id=\"@_windowId\"\n         class=\"@CssClass\"\n         style=\"@StyleString\"\n         role=\"dialog\"\n         aria-modal=\"false\"\n         aria-labelledby=\"@_titleId\"\n         @attributes=\"AdditionalAttributes\">\n        @* Title bar *@\n        <div id=\"@_titleBarId\"\n             class=\"flex items-center gap-2 px-4 py-2 border-b border-border/40 bg-card rounded-t-lg cursor-default select-none\"\n             @onpointerdown=\"HandleTitleBarPointerDown\"\n             @onpointermove=\"HandlePointerMove\"\n             @onpointerup=\"HandlePointerUp\"\n             @onpointercancel=\"HandlePointerUp\">\n            <span id=\"@_titleId\" class=\"flex-1 text-sm font-medium text-foreground truncate\">\n                @if (TitleContent is not null)\n                {\n                    @TitleContent\n                }\n                else\n                {\n                    @Title\n                }\n            </span>\n            <div class=\"flex items-center gap-1\">\n                @if (ShowMinimize)\n                {\n                    <button type=\"button\"\n                            class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                            @onclick=\"ToggleMinimize\"\n                            aria-label=\"@L[\"Window.Minimize\"]\">\n                        <Blazicon Svg=\"Lucide.Minus\" class=\"h-3 w-3\" />\n                    </button>\n                }\n                @if (ShowMaximize)\n                {\n                    <button type=\"button\"\n                            class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                            @onclick=\"ToggleMaximize\"\n                            aria-label=\"@L[\"Window.Maximize\"]\">\n                        <Blazicon Svg=\"Lucide.Square\" class=\"h-3 w-3\" />\n                    </button>\n                }\n                @if (ShowClose)\n                {\n                    <button type=\"button\"\n                            class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                            @onclick=\"Close\"\n                            aria-label=\"@L[\"Window.Close\"]\">\n                        <Blazicon Svg=\"Lucide.X\" class=\"h-3 w-3\" />\n                    </button>\n                }\n            </div>\n        </div>\n\n        @* Body *@\n        <div class=\"overflow-auto p-4 flex-1\">\n            @ChildContent\n        </div>\n\n        @* Footer *@\n        @if (FooterContent is not null)\n        {\n            <div class=\"px-4 py-3 border-t border-border/40 bg-card rounded-b-lg\">\n                @FooterContent\n            </div>\n        }\n\n        @* Resize handle *@\n        @if (Resizable)\n        {\n            @* Touch hit target is 44×44 per WCAG 2.5.5; on desktop (sm and up)\n               the handle compresses to a 16×16 corner so it doesn't intrude on\n               the window's content area. Inner SVG stays a fixed 16×16 visual\n               regardless of hit-area size so the chevron glyph doesn't scale. *@\n            <div class=\"absolute bottom-0 right-0 flex items-end justify-end w-11 h-11 sm:w-4 sm:h-4 cursor-se-resize opacity-40 hover:opacity-80\"\n                 @onpointerdown=\"HandleResizePointerDown\"\n                 @onpointermove=\"HandlePointerMove\"\n                 @onpointerup=\"HandlePointerUp\"\n                 @onpointercancel=\"HandlePointerUp\">\n                <svg viewBox=\"0 0 10 10\" class=\"w-4 h-4 text-muted-foreground fill-current\">\n                    <path d=\"M0 10L10 0M4 10L10 4M8 10L10 8\" stroke=\"currentColor\" stroke-width=\"1\" fill=\"none\"/>\n                </svg>\n            </div>\n        }\n    </div>\n}\nelse if (Open && _minimized)\n{\n    @* Minimized title bar only *@\n    <div id=\"@_windowId\"\n         class=\"fixed z-40 flex items-center gap-2 px-4 py-2 bg-card border border-border/40 rounded-lg shadow-md\"\n         style=\"@MinimizedStyleString\"\n         @attributes=\"AdditionalAttributes\">\n        <span class=\"flex-1 text-sm font-medium text-foreground truncate max-w-[200px]\">@Title</span>\n        <button type=\"button\"\n                class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                @onclick=\"ToggleMinimize\"\n                aria-label=\"@L[\"Window.Restore\"]\">\n            <Blazicon Svg=\"Lucide.Square\" class=\"h-3 w-3\" />\n        </button>\n        @if (ShowClose)\n        {\n            <button type=\"button\"\n                    class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                    @onclick=\"Close\"\n                    aria-label=\"@L[\"Window.Close\"]\">\n                <Blazicon Svg=\"Lucide.X\" class=\"h-3 w-3\" />\n            </button>\n        }\n    </div>\n}\nelse if (Open && _maximized)\n{\n    @* Maximized — fills most of viewport *@\n    <div id=\"@_windowId\"\n         class=\"fixed inset-4 z-40 flex flex-col bg-card border border-border/40 rounded-lg shadow-xl overflow-hidden\"\n         role=\"dialog\"\n         aria-modal=\"false\"\n         aria-labelledby=\"@_titleId\"\n         @attributes=\"AdditionalAttributes\">\n        <div class=\"flex items-center gap-2 px-4 py-2 border-b border-border/40 bg-card select-none\">\n            <span id=\"@_titleId\" class=\"flex-1 text-sm font-medium text-foreground truncate\">@Title</span>\n            <div class=\"flex items-center gap-1\">\n                @if (ShowMinimize)\n                {\n                    <button type=\"button\"\n                            class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                            @onclick=\"ToggleMinimize\"\n                            aria-label=\"@L[\"Window.Minimize\"]\">\n                        <Blazicon Svg=\"Lucide.Minus\" class=\"h-3 w-3\" />\n                    </button>\n                }\n                <button type=\"button\"\n                        class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                        @onclick=\"ToggleMaximize\"\n                        aria-label=\"@L[\"Window.Restore\"]\">\n                    <Blazicon Svg=\"Lucide.Minimize2\" class=\"h-3 w-3\" />\n                </button>\n                @if (ShowClose)\n                {\n                    <button type=\"button\"\n                            class=\"flex h-11 w-11 sm:h-7 sm:w-7 items-center justify-center rounded-sm text-muted-foreground hover:text-foreground hover:bg-muted/50 transition-colors\"\n                            @onclick=\"Close\"\n                            aria-label=\"@L[\"Window.Close\"]\">\n                        <Blazicon Svg=\"Lucide.X\" class=\"h-3 w-3\" />\n                    </button>\n                }\n            </div>\n        </div>\n        <div class=\"overflow-auto p-4 flex-1\">\n            @ChildContent\n        </div>\n        @if (FooterContent is not null)\n        {\n            <div class=\"px-4 py-3 border-t border-border/40 bg-card\">\n                @FooterContent\n            </div>\n        }\n    </div>\n}\n\n@code {\n    [Parameter] public bool Open { get; set; }\n    [Parameter] public EventCallback<bool> OpenChanged { get; set; }\n    [Parameter] public string Title { get; set; } = \"\";\n    [Parameter] public RenderFragment? TitleContent { get; set; }\n    [Parameter] public RenderFragment? ChildContent { get; set; }\n    [Parameter] public RenderFragment? FooterContent { get; set; }\n    [Parameter] public string Width { get; set; } = \"480px\";\n    [Parameter] public string Height { get; set; } = \"360px\";\n    [Parameter] public bool Resizable { get; set; } = true;\n    [Parameter] public bool Draggable { get; set; } = true;\n    [Parameter] public bool ShowClose { get; set; } = true;\n    [Parameter] public bool ShowMinimize { get; set; } = true;\n    [Parameter] public bool ShowMaximize { get; set; } = true;\n    [Parameter] public string? InitialX { get; set; }\n    [Parameter] public string? InitialY { get; set; }\n    [Parameter] public string? Class { get; set; }\n    [Parameter(CaptureUnmatchedValues = true)] public Dictionary<string, object>? AdditionalAttributes { get; set; }\n\n    private readonly string _windowId = $\"window-{Guid.NewGuid():N}\";\n    private readonly string _titleBarId = $\"window-titlebar-{Guid.NewGuid():N}\";\n    private readonly string _titleId = $\"window-title-{Guid.NewGuid():N}\";\n\n    private bool _minimized;\n    private bool _maximized;\n\n    // Drag state (pointer-events-based; viewport dimensions fetched via JS once per drag start)\n    private bool _isDragging;\n    private bool _isResizing;\n    private double _posX;\n    private double _posY;\n    private double _width;\n    private double _height;\n    private double _dragStartX;\n    private double _dragStartY;\n    private double _dragStartPosX;\n    private double _dragStartPosY;\n    private bool _initialized;\n\n    // Viewport bounds captured at drag-start (and on first render) so the clamp\n    // reflects the size at the moment the user grabbed the window rather than\n    // a potentially stale value from a previous drag or resize event.\n    private double _viewportWidth;\n    private double _viewportHeight;\n\n    protected override void OnParametersSet()\n    {\n        if (!_initialized && Open)\n        {\n            _posX = InitialX is not null ? ParsePx(InitialX) : 80;\n            _posY = InitialY is not null ? ParsePx(InitialY) : 80;\n            _width = ParsePx(Width);\n            _height = ParsePx(Height);\n            _initialized = true;\n        }\n    }\n\n    protected override async Task OnAfterRenderAsync(bool firstRender)\n    {\n        if (firstRender && Open)\n        {\n            // Fetch viewport once on first render so a consumer-provided\n            // InitialX/InitialY that exceeds the viewport (e.g. 9999px) is\n            // clamped before the user ever touches the window.\n            await FetchAndClampToViewportAsync();\n            StateHasChanged();\n        }\n    }\n\n    private async Task FetchAndClampToViewportAsync()\n    {\n        try\n        {\n            var vp = await Interop.GetViewportSize();\n            // bUnit's JS layer returns null for unhandled invocations; real\n            // browsers always return a populated ViewportSize. Guard so tests\n            // (and any future SSR/prerender path) don't NRE.\n            if (vp is null) return;\n            _viewportWidth = vp.Width;\n            _viewportHeight = vp.Height;\n            ClampPosition();\n        }\n        catch (Microsoft.JSInterop.JSDisconnectedException) { }\n        catch (Microsoft.JSInterop.JSException) { }\n        catch (ObjectDisposedException) { }\n    }\n\n    // Keeps at least MIN_VISIBLE px of the window inside the viewport on all\n    // four edges.  The title bar (≈40px) is specifically kept inside the bottom\n    // edge so it never slides off and becomes unreachable.\n    private const double MinVisible = 50;\n    private const double TitleBarHeight = 40;\n\n    private void ClampPosition()\n    {\n        if (_viewportWidth <= 0 || _viewportHeight <= 0) return;\n\n        // Horizontal: allow the window to go almost completely off the left\n        // edge (so only MIN_VISIBLE of it remains visible on the right), but\n        // never let the right side go past the right viewport edge minus MIN_VISIBLE.\n        _posX = Math.Clamp(_posX, MinVisible - _width, _viewportWidth - MinVisible);\n\n        // Vertical: never let the title bar go above 0 or below the bottom\n        // of the viewport (so the close/restore buttons are always reachable).\n        _posY = Math.Clamp(_posY, 0, _viewportHeight - TitleBarHeight);\n    }\n\n    private static double ParsePx(string value)\n    {\n        if (string.IsNullOrEmpty(value)) return 0;\n        if (value.EndsWith(\"px\", StringComparison.OrdinalIgnoreCase) &&\n            double.TryParse(value[..^2], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var d))\n            return d;\n        if (double.TryParse(value, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out var d2))\n            return d2;\n        return 0;\n    }\n\n    private string StyleString =>\n        $\"left:{_posX.ToString(System.Globalization.CultureInfo.InvariantCulture)}px;\" +\n        $\"top:{_posY.ToString(System.Globalization.CultureInfo.InvariantCulture)}px;\" +\n        $\"width:{_width.ToString(System.Globalization.CultureInfo.InvariantCulture)}px;\" +\n        $\"height:{_height.ToString(System.Globalization.CultureInfo.InvariantCulture)}px;\";\n\n    private string MinimizedStyleString =>\n        $\"left:{_posX.ToString(System.Globalization.CultureInfo.InvariantCulture)}px;\" +\n        $\"bottom:16px;\";\n\n    private string CssClass =>\n        $\"fixed z-40 flex flex-col bg-card border border-border/40 rounded-lg shadow-xl overflow-hidden {Class}\".Trim();\n\n    private async Task HandleTitleBarPointerDown(PointerEventArgs e)\n    {\n        if (!Draggable) return;\n        _isDragging = true;\n        _isResizing = false;\n        _dragStartX = e.ClientX;\n        _dragStartY = e.ClientY;\n        _dragStartPosX = _posX;\n        _dragStartPosY = _posY;\n        // Fetch current viewport size at drag-start so the clamp in HandlePointerMove\n        // always reflects the live viewport (handles viewport resize between drags).\n        await FetchAndClampToViewportAsync();\n    }\n\n    private void HandleResizePointerDown(PointerEventArgs e)\n    {\n        if (!Resizable) return;\n        _isResizing = true;\n        _isDragging = false;\n        _dragStartX = e.ClientX;\n        _dragStartY = e.ClientY;\n        _dragStartPosX = _width;\n        _dragStartPosY = _height;\n    }\n\n    private void HandlePointerMove(PointerEventArgs e)\n    {\n        if (_isDragging)\n        {\n            var dx = e.ClientX - _dragStartX;\n            var dy = e.ClientY - _dragStartY;\n\n            // rc.44 hotfix: clamp ONLY when viewport dimensions are known.\n            // Without this guard, `Math.Clamp(value, 0, -40)` throws when the\n            // viewport fetch hasn't completed yet (or returned null in tests/SSR).\n            // Mirror the ClampPosition() guard so drag-during-init doesn't crash.\n            //\n            // Clamp meaning when valid:\n            //   X: allow almost-fully-left (right edge stays visible) but not past right edge.\n            //   Y: never above 0 (title bar stays in viewport top) and never below\n            //      (viewport height − title bar height) so the controls are always reachable.\n            if (_viewportWidth > 0 && _viewportHeight > TitleBarHeight)\n            {\n                _posX = Math.Clamp(_dragStartPosX + dx, MinVisible - _width, _viewportWidth - MinVisible);\n                _posY = Math.Clamp(_dragStartPosY + dy, 0, _viewportHeight - TitleBarHeight);\n            }\n            else\n            {\n                // Pre-viewport-fetch fallback: lower-bound only (matches pre-rc.44 behavior).\n                _posX = Math.Max(0, _dragStartPosX + dx);\n                _posY = Math.Max(0, _dragStartPosY + dy);\n            }\n            StateHasChanged();\n        }\n        else if (_isResizing)\n        {\n            var dx = e.ClientX - _dragStartX;\n            var dy = e.ClientY - _dragStartY;\n            _width = Math.Max(200, _dragStartPosX + dx);\n            _height = Math.Max(120, _dragStartPosY + dy);\n            StateHasChanged();\n        }\n    }\n\n    private void HandlePointerUp(PointerEventArgs e)\n    {\n        _isDragging = false;\n        _isResizing = false;\n    }\n\n    private void ToggleMinimize()\n    {\n        _minimized = !_minimized;\n        if (_minimized) _maximized = false;\n    }\n\n    private void ToggleMaximize()\n    {\n        _maximized = !_maximized;\n        if (_maximized) _minimized = false;\n    }\n\n    private async Task Close()\n    {\n        Open = false;\n        await OpenChanged.InvokeAsync(false);\n    }\n\n    public ValueTask DisposeAsync() => ValueTask.CompletedTask;\n}\n"
    }
  ],
  "slots": [
    {
      "name": "TitleContent",
      "owner": "Window",
      "type": "RenderFragment?",
      "description": null
    },
    {
      "name": "ChildContent",
      "owner": "Window",
      "type": "RenderFragment?",
      "description": null
    },
    {
      "name": "FooterContent",
      "owner": "Window",
      "type": "RenderFragment?",
      "description": null
    }
  ],
  "serviceDependencies": [
    {
      "service": "ComponentInteropService",
      "namespace": ""
    },
    {
      "service": "ILumeoLocalizer",
      "namespace": "Lumeo.Services.Localization"
    }
  ],
  "cascadingDependencies": [],
  "relatedComponents": [],
  "keyboardInteractions": [],
  "tests": [
    "tests/Lumeo.Tests/Components/Window/WindowTests.cs",
    "tests/Lumeo.Tests/Contract/ComponentContractTests.cs"
  ],
  "mdSummary": "# Window\n\nNon-modal draggable and resizable floating panel with minimize and maximize support.\n\n**Package:** `Lumeo` · **Category:** Overlay\n**Docs:** https://lumeo.nativ.sh/components/window\n\n## Parameters\n| Owner | Name | Type | Default | Description |\n|---|---|---|---|---|\n| Window | Open | `bool` | `` |  |\n| Window | OpenChanged | `EventCallback<bool>` | `` |  |\n| Window | Title | `string` | `\"\"` |  |\n| Window | TitleContent | `RenderFragment?` | `` |  |\n| Window | ChildContent | `RenderFragment?` | `` |  |\n| Window | FooterContent | `RenderFragment?` | `` |  |\n| Window | Width | `string` | `\"480px\"` |  |\n| Window | Height | `string` | `\"360px\"` |  |\n| Window | Resizable | `bool` | `true` |  |\n| Window | Draggable | `bool` | `true` |  |\n| Window | ShowClose | `bool` | `true` |  |\n| Window | ShowMinimize | `bool` | `true` |  |\n| Window | ShowMaximize | `bool` | `true` |  |\n| Window | InitialX | `string?` | `` |  |\n| Window | InitialY | `string?` | `` |  |\n| Window | Class | `string?` | `` |  |\n| Window | AdditionalAttributes | `Dictionary<string, object>?` | `` |  |\n\n## Slots\n- `TitleContent` (Window) — RenderFragment slot\n- `ChildContent` (Window) — RenderFragment slot\n- `FooterContent` (Window) — RenderFragment slot\n\n## Events\n- `OpenChanged` (`EventCallback<bool>`)\n\n## Sub-components\n- (none)\n\n## Cascading values it expects\n- (none)\n\n## Services it injects\n- `ComponentInteropService` ()\n- `ILumeoLocalizer` (Lumeo.Services.Localization)\n\n## Keyboard\n—\n\n## Example\n```razor\n<Window />\n```\n\n## CSS variables\n`--color-border`, `--color-card`, `--color-foreground`, `--color-muted`, `--color-muted-foreground`, `--radius`\n\n## Files\n- `UI/Window/Window.razor`\n"
}