# StatusPageManager

> Admin for the public status page - title, address and custom domain, which services show and in what order (staged until Save), and posting incidents that appear on the page.

Source: https://docs.nasaqui.com/components/status-page-manager

## Install

```bash
npx shadcn@latest add https://docs.nasaqui.com/r/status-page-manager.json
```

Decide what the public status page shows. Set the page title, the address (a slug) and an optional custom domain; switch a service off to hide it and use the arrows to reorder. Changes are staged: Save and Discard appear when something differs from the saved settings. Post incident opens a dialog with a title, a message, impact, status and the services affected, and lists the incidents below. It has no backend: `onSave` and `onPostIncident` talk to the server and you pass the new `settings` back.

## When to use

- The settings side of a status page product.

## When not to use

- Monitors and their checks: use `UptimeMonitors`.
- The public page itself: use `StatusPage`.

## Import

```tsx
import { StatusPageManager } from "@fadymondy/nasaq/web";
// inside this monorepo: "@nasaq/web"
```

## Quick start

```tsx
import { StatusPageManager, type StatusPageSettings } from "@fadymondy/nasaq/web";

declare const settings: StatusPageSettings;
declare const api: { save(s: StatusPageSettings): Promise<void> };

export const Manager = () => <StatusPageManager settings={settings} onSave={(next) => api.save(next)} />;
```

## Anatomy

```
StatusPageManager            data-slot="status-page-manager"
├─ header                    title, View public page, Post incident
├─ settings                  title, slug, custom domain
├─ services                  list: Switch (show), name, Move up, Move down
├─ Save bar                  Discard, Save changes
├─ incidents                 IncidentList
└─ incident Dialog           title, message, impact, status, affected services
```

## API

**StatusPageManager**: every `Card` prop except `children`, plus:

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `settings` | `StatusPageSettings` | required | `{ title, slug, domain?, services: { id, name, visible }[] }`, services in display order. |
| `incidents` | `readonly Incident[]` | `[]` | Shown under the form. |
| `publicUrl` | `string` | | Shows a View public page link. |
| `onSave` | `(next) => Promise<void \| { error? }>` | required | Save the staged settings. |
| `onPostIncident` | `(input: IncidentInput) => Promise<void \| { error? }>` | | Shows Post incident. `{ title, body, impact, status, serviceIds }`. |
| `labels` | `Partial<StatusPageManagerLabels>` | | Override any string. |

**Helpers** (pure, tested): `isValidStatusSlug`, `moveItem(list, index, delta)`.

## Examples

**Validate a slug**

```tsx
import { isValidStatusSlug } from "@fadymondy/nasaq/web";

isValidStatusSlug("acme-status"); // true
isValidStatusSlug("Acme Status"); // false
```

## Accessibility

- Each switch and arrow has a name that includes the service. Invalid fields are described by their message.
- The incident dialog traps focus and returns it. Saved and error messages are alerts.

## RTL & i18n

- English and Arabic strings follow the Nasaq locale. The slug and domain fields stay left to right; the arrow icon mirrors.

## Styling & tokens

- Built on `Card`, `Switch`, `Dialog`, `Select`, `IncidentList` and `--nq-*` tokens. Target `[data-slot="status-page-manager"]`.

## Do / Don't

- Do make posting an incident one step: it is used in an emergency.
- Do keep hidden services out of the public page (hidden means hidden).
- Don't save an invalid slug: the form blocks it, so should the server.
- Don't reuse the admin names on the public page without a check.

## Related

- [`status-page`](https://docs.nasaqui.com/components/status-page)
- [`uptime-monitors`](https://docs.nasaqui.com/components/uptime-monitors)
- [`domains-manager`](https://docs.nasaqui.com/components/domains-manager)

## Lab

https://docs.nasaqui.com/?path=/docs/components-monitoring-status-page-manager--docs

## Code

### React

```tsx
import { StatusPageManager, type StatusPageSettings } from "@fadymondy/nasaq/web";

declare const settings: StatusPageSettings;
declare const api: { save(s: StatusPageSettings): Promise<void> };

export const Manager = () => <StatusPageManager settings={settings} onSave={(next) => api.save(next)} />;
```

### shadcn

```tsx
import { StatusPageManager, type StatusPageSettings } from "@/components/ui/status-page-manager";

declare const settings: StatusPageSettings;
declare const api: { save(s: StatusPageSettings): Promise<void> };

export const Manager = () => <StatusPageManager settings={settings} onSave={(next) => api.save(next)} />;
```

### Vue

```vue
<script setup lang="ts">
import { NqStatusPageManager, type Incident, type StatusPageSettings } from "@fadymondy/nasaq/vue";
import { ref } from "vue";

const settings = ref<StatusPageSettings>({
  title: "Nasaq status",
  slug: "nasaq",
  domain: "status.nasaq.dev",
  services: [
    { id: "api", name: "API", visible: true },
    { id: "web", name: "Website", visible: true },
    { id: "db", name: "Database", visible: false },
  ],
});

const incidents: Incident[] = [
  {
    id: "i1",
    title: "Elevated API latency",
    status: "monitoring",
    impact: "minor",
    startedAt: "2026-09-28T10:00:00Z",
    services: ["API"],
    updates: [{ at: "2026-09-28T10:20:00Z", status: "monitoring", body: "A fix is rolled out. We are watching the numbers." }],
  },
];

async function save(next: StatusPageSettings) {
  settings.value = next;
}
</script>

<template>
  <NqStatusPageManager :settings="settings" :incidents="incidents" public-url="https://status.nasaq.dev" :on-save="save" :on-post-incident="async () => {}" />
</template>
```

### Blade

```blade
@php
    $settings = [
        'title' => 'Nasaq status',
        'slug' => 'nasaq',
        'domain' => 'status.nasaq.dev',
        'services' => [
            ['id' => 'api', 'name' => 'API', 'visible' => true],
            ['id' => 'web', 'name' => 'Website', 'visible' => true],
            ['id' => 'db', 'name' => 'Database', 'visible' => false],
        ],
    ];
    $incidents = [[
        'id' => 'i1', 'title' => 'Elevated API latency', 'status' => 'monitoring', 'impact' => 'minor',
        'startedAt' => '2026-09-28T10:00:00Z', 'services' => ['API'],
        'updates' => [['at' => '2026-09-28T10:20:00Z', 'status' => 'monitoring', 'body' => 'A fix is rolled out. We are watching the numbers.']],
    ]];
@endphp
<x-nq::status-page-manager :settings="$settings" :incidents="$incidents" public-url="https://status.nasaq.dev" post-incident />
```

### HTML + Alpine

```html
<div data-slot="status-page-manager" x-data="nqStatusPageManager(JSON.parse('{\u0022incidents\u0022:[{\u0022id\u0022:\u0022i1\u0022,\u0022title\u0022:\u0022Elevated API latency\u0022,\u0022status\u0022:\u0022monitoring\u0022,\u0022impact\u0022:\u0022minor\u0022,\u0022startedAt\u0022:\u00222026-09-28T10:00:00+00:00\u0022,\u0022resolvedAt\u0022:null,\u0022services\u0022:[\u0022API\u0022],\u0022updates\u0022:[{\u0022at\u0022:\u00222026-09-28T10:20:00+00:00\u0022,\u0022status\u0022:\u0022monitoring\u0022,\u0022body\u0022:\u0022A fix is rolled out. We are watching the numbers.\u0022}]}],\u0022locale\u0022:\u0022en\u0022,\u0022settings\u0022:{\u0022title\u0022:\u0022Nasaq status\u0022,\u0022slug\u0022:\u0022nasaq\u0022,\u0022domain\u0022:\u0022status.nasaq.dev\u0022,\u0022services\u0022:[{\u0022id\u0022:\u0022api\u0022,\u0022name\u0022:\u0022API\u0022,\u0022visible\u0022:true},{\u0022id\u0022:\u0022web\u0022,\u0022name\u0022:\u0022Website\u0022,\u0022visible\u0022:true},{\u0022id\u0022:\u0022db\u0022,\u0022name\u0022:\u0022Database\u0022,\u0022visible\u0022:false}]},\u0022labels\u0022:{\u0022genericError\u0022:\u0022Something went wrong. Try again.\u0022,\u0022show\u0022:\u0022Show {name} on the status page\u0022,\u0022up\u0022:\u0022Move {name} up\u0022,\u0022down\u0022:\u0022Move {name} down\u0022,\u0022impact\u0022:{\u0022minor\u0022:\u0022Minor\u0022,\u0022major\u0022:\u0022Major\u0022,\u0022maintenance\u0022:\u0022Maintenance\u0022},\u0022statuses\u0022:{\u0022investigating\u0022:\u0022Investigating\u0022,\u0022identified\u0022:\u0022Identified\u0022,\u0022monitoring\u0022:\u0022Monitoring\u0022,\u0022resolved\u0022:\u0022Resolved\u0022},\u0022units\u0022:{\u0022d\u0022:\u0022d\u0022,\u0022h\u0022:\u0022h\u0022,\u0022m\u0022:\u0022min\u0022}}}'))" x-modelable="incidents"
    class="flex flex-col gap-4 rounded-card border border-border bg-card py-4 text-card-foreground w-full">
    <div data-slot="card-header" class="grid auto-rows-min items-start gap-1 px-4 has-data-[slot=card-action]:grid-cols-[1fr_auto]"><div class="flex flex-wrap items-center justify-between gap-2">
            <h3 data-slot="card-title" class="text-label text-foreground">Status page</h3>
            <div class="flex items-center gap-2">
                                    <a data-slot="button"
     href="https://status.nasaq.dev"                         target="_blank" rel="noreferrer" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover h-control-sm px-2.5">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M15 3h6v6"/>
  <path d="M10 14 21 3"/>
  <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>
</svg>View public page</a>
                                                    <button data-slot="button"
     type="button"                         x-on:click="openIncident()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-[color-mix(in_oklab,var(--nq-action)_88%,var(--nq-fg))] h-control-sm px-2.5">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M11 6a13 13 0 0 0 8.4-2.8A1 1 0 0 1 21 4v12a1 1 0 0 1-1.6.8A13 13 0 0 0 11 14H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2z"/>
  <path d="M6 14a12 12 0 0 0 2.4 7.2 2 2 0 0 0 3.2-2.4A8 8 0 0 1 10 14"/>
  <path d="M8 6v8"/>
</svg>Post incident</button>
                            </div>
        </div>
        <div data-slot="card-description" class="text-body-sm text-muted-foreground">Choose what customers see on your public status page, and post incidents to it.</div></div>
    <div data-slot="card-content" class="px-4 grid gap-6"><template x-if="error">
            <div data-slot="alert" data-tone="danger" role="alert"
     x-data="nqAlert()" x-modelable="open" x-show="open"     x-on:nq:dismiss="error = null" class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-danger/30 bg-nq-danger-soft">
    <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-danger-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m15 9-6 6"/>
  <path d="m9 9 6 6"/>
</svg>    <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
                            <div data-slot="alert-description" class="text-body-sm text-foreground"><span x-text="error"></span></div>
            </div>
            <div data-slot="alert-actions" class="ms-3 flex items-center gap-1">
                            <button data-slot="button"
     type="button"                         aria-label="Dismiss" x-on:click="dismiss()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 hover:bg-nq-hover size-control-sm p-0 text-muted-foreground [&_svg]:size-3.5">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M18 6 6 18"/>
  <path d="m6 6 12 12"/>
</svg></button>
                    </div>
    </div>
        </template>
        <template x-if="saved && !dirty">
            <div data-slot="alert" data-tone="success" role="status"
        class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-success/30 bg-nq-success-soft">
    <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-success-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m9 12 2 2 4-4"/>
</svg>    <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
                            <div data-slot="alert-description" class="text-body-sm text-foreground">Saved.</div>
            </div>
    </div>
        </template>
        <section aria-label="Page settings" class="grid gap-4 sm:grid-cols-2">
            <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     x-model="titleInvalid" class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Page title</label>
                <input data-slot="input" type="text"
                    x-model="draft.title" dir="auto" class="w-full min-w-0 rounded-control border border-input bg-card px-3 text-body text-foreground min-h-[var(--nq-touch-min,0px)] transition-colors duration-150 ease-nq outline-none placeholder:text-muted-foreground focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-invalid:border-nq-danger aria-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px] h-control">
                <div data-slot="field-error" role="alert" x-show="invalid"  style="display: none"  class="text-caption text-nq-danger-text">This field is required.</div>
</div>
            <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     x-model="slugInvalid" class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Address</label>
                <input data-slot="input" type="text"
     dir="ltr"                 x-model="draft.slug" class="w-full min-w-0 rounded-control border border-input bg-card px-3 text-body text-foreground min-h-[var(--nq-touch-min,0px)] transition-colors duration-150 ease-nq outline-none placeholder:text-muted-foreground focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-invalid:border-nq-danger aria-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px] h-control text-start">
                <p data-slot="field-description" x-show="!slugInvalid" class="text-caption text-muted-foreground">Lowercase letters, numbers and dashes.</p>
                <div data-slot="field-error" role="alert" x-show="invalid"  style="display: none"  class="text-caption text-nq-danger-text">Use lowercase letters, numbers and dashes only.</div>
</div>
            <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     class="flex flex-col gap-1.5 sm:col-span-2">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Custom domain</label>
                <input data-slot="input" type="text"
     dir="ltr"                 x-model="draft.domain" placeholder="status.example.com" class="w-full min-w-0 rounded-control border border-input bg-card px-3 text-body text-foreground min-h-[var(--nq-touch-min,0px)] transition-colors duration-150 ease-nq outline-none placeholder:text-muted-foreground focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-invalid:border-nq-danger aria-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px] h-control text-start">
                <p data-slot="field-description" class="text-caption text-muted-foreground">Optional. Point a CNAME at your status host first.</p>
</div>
        </section>
        <section aria-labelledby="spm-services" class="grid gap-2">
            <div>
                <h4 id="spm-services" class="text-label text-foreground">Services on the page</h4>
                <p class="text-body-sm text-muted-foreground">Turn a service off to hide it. Use the arrows to change the order.</p>
            </div>
            <ul class="divide-y divide-border rounded-control border border-border">
                <template x-for="(svc, index) in draft.services" :key="svc.id">
                    <li data-slot="managed-service" class="flex items-center gap-3 px-3 py-2">
                        <button type="button" role="switch" data-slot="switch" x-data="nqSwitch(false)" x-modelable="checked" x-bind="root"
    aria-checked="false"
     data-unchecked                 x-model="svc.visible" x-bind:aria-label="showLabel(svc)" class="relative inline-flex h-5 w-9 shrink-0 items-center rounded-full border border-transparent bg-nq-line-strong p-0.5 outline-none transition-colors duration-150 ease-nq data-checked:bg-primary focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus data-disabled:cursor-not-allowed data-disabled:opacity-50">
    <span data-slot="switch-thumb"  data-unchecked         x-bind:data-checked="checked ? '' : undefined" x-bind:data-unchecked="checked ? undefined : ''"
        class="block size-4 rounded-full bg-background shadow-xs data-checked:bg-primary-foreground transition-[translate] duration-150 ease-nq data-checked:translate-x-3.5 rtl:data-checked:-translate-x-3.5"></span>
    </button>
                        <span class="min-w-0 flex-1 truncate text-body-sm" dir="auto" x-bind:class="svc.visible ? 'text-foreground' : 'text-muted-foreground'" x-text="svc.name"></span>
                        <span data-slot="badge"  style="display: none"     x-show="!svc.visible" class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-border bg-secondary text-foreground">Hidden</span>
                        <button data-slot="button"
     type="button"                         x-bind:aria-label="upLabel(svc)" x-bind:disabled="index === 0" x-on:click="move(index, -1)" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0">
        <svg aria-hidden="true" class="rtl:-scale-x-100" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="m5 12 7-7 7 7"/>
  <path d="M12 19V5"/>
</svg></button>
                        <button data-slot="button"
     type="button"                         x-bind:aria-label="downLabel(svc)" x-bind:disabled="index === draft.services.length - 1" x-on:click="move(index, 1)" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover size-control-sm p-0">
        <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M12 5v14"/>
  <path d="m19 12-7 7-7-7"/>
</svg></button>
                    </li>
                </template>
            </ul>
        </section>
        <div class="flex items-center justify-end gap-2">
            <span class="me-auto text-body-sm text-muted-foreground" x-show="dirty" style="display: none">Unsaved changes</span>
            <button data-slot="button"
     type="button"                         x-bind:disabled="!dirty || saving" x-on:click="discard()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover h-control px-[var(--nq-control-pad)]">
        Discard</button>
            <button data-slot="button"
     type="button"                         x-bind:disabled="!dirty" x-bind:aria-busy="saving ? &#039;true&#039; : null" x-on:click="save()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-[color-mix(in_oklab,var(--nq-action)_88%,var(--nq-fg))] h-control px-[var(--nq-control-pad)]">
        <svg data-slot="spinner" aria-hidden="true" style="display: none;" x-show="saving" class="size-4 animate-spin motion-reduce:animate-none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M21 12a9 9 0 1 1-6.219-8.56"/>
</svg>                Save changes</button>
        </div>
                    <section aria-labelledby="spm-incidents" class="grid gap-3" x-show="! live">
                <h4 id="spm-incidents" class="text-label text-foreground">Incidents</h4>
                <ul data-slot="incident-list" class="grid gap-3">
                                <li data-slot="incident" data-status="monitoring" class="grid gap-2 rounded-control border border-border bg-card p-3">
                <div class="flex flex-wrap items-center gap-2">
                    <h4 class="min-w-0 flex-1 text-label text-foreground" dir="auto">Elevated API latency</h4>
                    <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-warning/40 bg-nq-warning-soft text-nq-warning-text">Minor</span>
                    <span data-slot="badge"     class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3 border-nq-warning/40 bg-nq-warning-soft text-nq-warning-text">Monitoring</span>
                </div>
                <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-body-sm text-muted-foreground">
                    <span>Started <time data-slot="date-time" datetime="2026-09-28T10:00:00+00:00" dir="auto"  title="Sep 28, 2026"     class="tabular-nums [unicode-bidi:isolate]">23 hours ago</time>
</span>
                                                                <span dir="auto">API</span>
                                    </p>
                                    <ol data-slot="timeline" aria-label="Updates" class="m-0 flex list-none flex-col p-0 mt-1"><li data-slot="timeline-item" class="group/timeline grid grid-cols-[2rem_1fr] gap-x-3">
    <div class="flex flex-col items-center">
        <span data-slot="timeline-marker" class="flex size-8 shrink-0 items-center justify-center">
                            <span aria-hidden="true" class="size-2.5 rounded-full border-2 border-nq-line bg-background"></span>
                    </span>
        <span aria-hidden="true" data-slot="timeline-rail" class="my-1 w-px flex-1 bg-border group-last/timeline:hidden"></span>
    </div>
    <div data-slot="timeline-content" class="flex min-w-0 flex-col gap-1 pb-6 pt-1 group-last/timeline:pb-0">
        <div class="flex items-baseline justify-between gap-3">
            <p class="min-w-0 text-body-sm font-medium text-foreground">Monitoring</p>
                            <time data-slot="date-time" datetime="2026-09-28T10:20:00+00:00" dir="auto"  title="Sep 28, 2026"     class="tabular-nums [unicode-bidi:isolate] shrink-0 text-caption text-muted-foreground">22 hours ago</time>
                    </div>
                    <p class="text-body-sm text-muted-foreground">A fix is rolled out. We are watching the numbers.</p>
                    </div>
</li></ol>
                            </li>
            </ul>
            </section>
        <section aria-labelledby="spm-incidents-live" class="grid gap-3" x-show="live && incidents.length > 0" style="display: none">
            <h4 id="spm-incidents-live" class="text-label text-foreground">Incidents</h4>
            <ul data-slot="incident-list" class="grid gap-3">
                <template x-for="i in sortedIncidents" x-bind:key="i.id">
                    <li data-slot="incident" x-bind:data-status="i.status" class="grid gap-2 rounded-control border border-border bg-card p-3">
                        <div class="flex flex-wrap items-center gap-2">
                            <h4 class="min-w-0 flex-1 text-label text-foreground" dir="auto" x-text="i.title"></h4>
                            <span data-slot="badge" class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3" x-bind:class="impactBadge(i.impact)" x-text="impactLabel(i.impact)"></span>
                            <span data-slot="badge" class="inline-flex h-5 shrink-0 items-center gap-1 whitespace-nowrap rounded-[4px] border px-1.5 text-caption font-medium [&_svg]:size-3" x-bind:class="statusBadge(i.status)" x-text="statusLabel(i.status)"></span>
                        </div>
                        <p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-body-sm text-muted-foreground">
                            <span>Started <time data-slot="date-time" dir="auto" class="tabular-nums [unicode-bidi:isolate]" x-bind:datetime="iso(i.startedAt)" x-bind:title="iso(i.startedAt)" x-text="ago(i.startedAt)"></time></span>
                            <template x-if="i.resolvedAt"><span>Lasted <span x-text="lasted(i)"></span></span></template>
                            <template x-if="i.services && i.services.length"><span dir="auto" x-text="i.services.join(', ')"></span></template>
                        </p>
                        <template x-if="i.updates && i.updates.length">
                            <ol data-slot="timeline" x-data="nqTimeline(JSON.parse('{\u0022locale\u0022:\u0022en\u0022}'))" x-effect="sync(updatesOf(i))" aria-label="Updates" class="m-0 flex list-none flex-col p-0 mt-1">        <template x-for="(it, i) in items" x-bind:key="i">
            <li data-slot="timeline-item" data-nq-dynamic class="group/timeline grid grid-cols-[2rem_1fr] gap-x-3">
                <div class="flex flex-col items-center">
                    <span data-slot="timeline-marker" class="flex size-8 shrink-0 items-center justify-center">
                        <template x-if="it.actor">
                            <span data-slot="avatar" x-data="nqAvatar(it.actor.avatar ? 400 : 0)" class="inline-flex shrink-0 select-none items-center justify-center overflow-hidden bg-secondary align-middle font-medium text-secondary-foreground size-8 text-caption rounded-full">
                                <template x-if="it.actor.avatar"><img data-slot="avatar-image" x-bind:src="it.actor.avatar" x-bind:alt="it.actor.name" class="size-full object-cover" style="display: none" x-bind="image"></template>
                                <span data-slot="avatar-fallback" class="flex size-full items-center justify-center" x-bind="fallback" x-text="initials(it.actor.name)"></span>
                            </span>
                        </template>
                        <template x-if="! it.actor"><span aria-hidden="true" class="size-2.5 rounded-full border-2 border-nq-line bg-background"></span></template>
                    </span>
                    <span aria-hidden="true" data-slot="timeline-rail" class="my-1 w-px flex-1 bg-border group-last/timeline:hidden"></span>
                </div>
                <div data-slot="timeline-content" class="flex min-w-0 flex-col gap-1 pb-6 pt-1 group-last/timeline:pb-0">
                    <div class="flex items-baseline justify-between gap-3">
                        <p class="min-w-0 text-body-sm font-medium text-foreground" x-text="it.title"></p>
                        <template x-if="it.time"><time data-slot="date-time" dir="auto" class="shrink-0 text-caption text-muted-foreground tabular-nums [unicode-bidi:isolate]" x-bind:datetime="iso(it.time)" x-bind:title="iso(it.time)" x-text="ago(it.time)"></time></template>
                    </div>
                    <template x-if="it.description"><p class="text-body-sm text-muted-foreground" x-text="it.description"></p></template>
                </div>
            </li>
        </template>
</ol>
                        </template>
                    </li>
                </template>
            </ul>
        </section></div>
            <div data-slot="dialog" x-data="nqDialog(false)" x-modelable="open" x-id="['nq-dialog']" x-model="incOpen" class="contents">
    <template x-teleport="body">
    <div data-slot="dialog-portal">
        <div data-slot="dialog-backdrop" x-nq-presence="open" x-on:click="close()" class="fixed inset-0 z-50 bg-nq-fg/15 dark:bg-nq-bg/60 transition-opacity duration-150 ease-nq data-starting-style:opacity-0 data-ending-style:opacity-0"></div>
        <div data-slot="dialog-content" x-bind="popup" x-nq-presence="open" x-trap.noscroll="open"
            class="fixed inset-0 z-50 m-auto grid h-fit w-[calc(100%-2rem)] max-w-lg gap-4 rounded-floating border border-border bg-popover p-6 text-popover-foreground outline-none max-h-[calc(100dvh-2rem)] overflow-y-auto transition-opacity duration-150 ease-nq data-starting-style:opacity-0 data-ending-style:opacity-0">
            <form novalidate class="grid gap-4" x-on:submit.prevent="post()">
                    <div data-slot="dialog-header" class="flex flex-col gap-1.5 pe-8 text-start"><h2 data-slot="dialog-title" :id="$id('nq-dialog', 'title')" class="text-h3 text-foreground">Post an incident</h2>
                        <p data-slot="dialog-description" :id="$id('nq-dialog', 'description')" class="text-body-sm text-muted-foreground">It appears on the public page right away. Customers see each update you add.</p></div>
                    <template x-if="incError"><div data-slot="alert" data-tone="danger" role="alert"
        class="relative grid grid-cols-[auto_1fr_auto] items-start gap-x-3 rounded-card border p-3 text-start border-nq-danger/30 bg-nq-danger-soft">
    <svg aria-hidden="true" data-slot="alert-icon" class="mt-0.5 size-4 text-nq-danger-text" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <circle cx="12" cy="12" r="10"/>
  <path d="m15 9-6 6"/>
  <path d="m9 9 6 6"/>
</svg>    <div data-slot="alert-body" class="flex min-w-0 flex-col gap-0.5">
                            <div data-slot="alert-description" class="text-body-sm text-foreground"><span x-text="incError"></span></div>
            </div>
    </div>
</template>
                    <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     x-model="incTitleInvalid" class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Title</label>
                        <input data-slot="input" type="text"
                    x-model="incTitle" dir="auto" class="w-full min-w-0 rounded-control border border-input bg-card px-3 text-body text-foreground min-h-[var(--nq-touch-min,0px)] transition-colors duration-150 ease-nq outline-none placeholder:text-muted-foreground focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-invalid:border-nq-danger aria-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px] h-control">
                        <div data-slot="field-error" role="alert" x-show="invalid"  style="display: none"  class="text-caption text-nq-danger-text">This field is required.</div>
</div>
                    <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     x-model="incBodyInvalid" class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">What is happening</label>
                        <textarea data-slot="textarea"
                x-model="incBody" dir="auto" rows="3" class="w-full min-w-0 rounded-control border border-input bg-card px-3 text-body text-foreground transition-colors duration-150 ease-nq outline-none placeholder:text-muted-foreground focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-invalid:border-nq-danger aria-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px] min-h-20 py-2"></textarea>
                        <div data-slot="field-error" role="alert" x-show="invalid"  style="display: none"  class="text-caption text-nq-danger-text">This field is required.</div>
</div>
                    <div class="grid gap-4 sm:grid-cols-2">
                        <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Impact</label>
                            <div data-slot="select" x-data="nqSelect('minor', false)" x-modelable="value" x-id="['nq-select']" x-model="incImpact" class="contents">
    <button data-slot="select-trigger" x-ref="trigger" x-bind="trigger"
        class="flex h-control w-full min-w-0 items-center justify-between gap-2 rounded-control border border-input bg-card px-3 text-body text-foreground min-h-[var(--nq-touch-min,0px)] cursor-default select-none outline-none transition-colors duration-150 ease-nq focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-popup-open:border-nq-focus data-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px]">
    <span data-slot="select-value" x-text="label() ?? ''" :data-placeholder="empty() ? '' : undefined"
    class="min-w-0 flex-1 truncate text-start data-placeholder:text-muted-foreground"></span>
    <span class="flex shrink-0 text-muted-foreground [&_svg]:size-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="m7 15 5 5 5-5"/>
  <path d="m7 9 5-5 5 5"/>
</svg></span>
</button>
                                <template x-teleport="body">
    <div data-slot="select-content" x-ref="popup" x-bind="popup" x-nq-presence="open" x-anchor.bottom-start.offset.4="$refs.trigger"
        class="z-50 min-w-[var(--anchor-width)] max-h-[var(--available-height)] overflow-y-auto rounded-floating border border-border bg-popover p-1.5 text-popover-foreground shadow-floating outline-none transition-opacity duration-150 ease-nq data-starting-style:opacity-0 data-ending-style:opacity-0">
        <div data-slot="select-item" x-bind="item('minor', false)"
    class="relative flex h-nav-row min-h-[var(--nq-touch-min,0px)] cursor-default select-none items-center gap-2.5 rounded-control ps-8 pe-2.5 text-body-sm text-foreground outline-none data-highlighted:bg-nq-selected data-disabled:pointer-events-none data-disabled:opacity-50">
    <span aria-hidden="true" class="absolute start-2.5 inline-flex size-4 items-center justify-center">
        <span x-show="isSelected('minor')" x-cloak class="contents"><svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
    </span>
    <span data-slot="select-item-text" class="min-w-0 flex-1 truncate">Minor</span>
</div>
                                                                            <div data-slot="select-item" x-bind="item('major', false)"
    class="relative flex h-nav-row min-h-[var(--nq-touch-min,0px)] cursor-default select-none items-center gap-2.5 rounded-control ps-8 pe-2.5 text-body-sm text-foreground outline-none data-highlighted:bg-nq-selected data-disabled:pointer-events-none data-disabled:opacity-50">
    <span aria-hidden="true" class="absolute start-2.5 inline-flex size-4 items-center justify-center">
        <span x-show="isSelected('major')" x-cloak class="contents"><svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
    </span>
    <span data-slot="select-item-text" class="min-w-0 flex-1 truncate">Major</span>
</div>
                                                                            <div data-slot="select-item" x-bind="item('maintenance', false)"
    class="relative flex h-nav-row min-h-[var(--nq-touch-min,0px)] cursor-default select-none items-center gap-2.5 rounded-control ps-8 pe-2.5 text-body-sm text-foreground outline-none data-highlighted:bg-nq-selected data-disabled:pointer-events-none data-disabled:opacity-50">
    <span aria-hidden="true" class="absolute start-2.5 inline-flex size-4 items-center justify-center">
        <span x-show="isSelected('maintenance')" x-cloak class="contents"><svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
    </span>
    <span data-slot="select-item-text" class="min-w-0 flex-1 truncate">Maintenance</span>
</div>
    </div>
</template>
    </div>
</div>
                        <div data-slot="field" x-data="nqField(false)" x-modelable="invalid" x-id="['nq-field']"
         data-valid     class="flex flex-col gap-1.5">
    <label data-slot="field-label"  class="text-label text-foreground data-disabled:opacity-50">Status</label>
                            <div data-slot="select" x-data="nqSelect('investigating', false)" x-modelable="value" x-id="['nq-select']" x-model="incStatus" class="contents">
    <button data-slot="select-trigger" x-ref="trigger" x-bind="trigger"
        class="flex h-control w-full min-w-0 items-center justify-between gap-2 rounded-control border border-input bg-card px-3 text-body text-foreground min-h-[var(--nq-touch-min,0px)] cursor-default select-none outline-none transition-colors duration-150 ease-nq focus-visible:border-nq-focus focus-visible:outline-1 focus-visible:outline-nq-focus data-popup-open:border-nq-focus data-invalid:border-nq-danger disabled:cursor-not-allowed disabled:opacity-50 pointer-coarse:text-[16px]">
    <span data-slot="select-value" x-text="label() ?? ''" :data-placeholder="empty() ? '' : undefined"
    class="min-w-0 flex-1 truncate text-start data-placeholder:text-muted-foreground"></span>
    <span class="flex shrink-0 text-muted-foreground [&_svg]:size-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="m7 15 5 5 5-5"/>
  <path d="m7 9 5-5 5 5"/>
</svg></span>
</button>
                                <template x-teleport="body">
    <div data-slot="select-content" x-ref="popup" x-bind="popup" x-nq-presence="open" x-anchor.bottom-start.offset.4="$refs.trigger"
        class="z-50 min-w-[var(--anchor-width)] max-h-[var(--available-height)] overflow-y-auto rounded-floating border border-border bg-popover p-1.5 text-popover-foreground shadow-floating outline-none transition-opacity duration-150 ease-nq data-starting-style:opacity-0 data-ending-style:opacity-0">
        <div data-slot="select-item" x-bind="item('investigating', false)"
    class="relative flex h-nav-row min-h-[var(--nq-touch-min,0px)] cursor-default select-none items-center gap-2.5 rounded-control ps-8 pe-2.5 text-body-sm text-foreground outline-none data-highlighted:bg-nq-selected data-disabled:pointer-events-none data-disabled:opacity-50">
    <span aria-hidden="true" class="absolute start-2.5 inline-flex size-4 items-center justify-center">
        <span x-show="isSelected('investigating')" x-cloak class="contents"><svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
    </span>
    <span data-slot="select-item-text" class="min-w-0 flex-1 truncate">Investigating</span>
</div>
                                                                            <div data-slot="select-item" x-bind="item('identified', false)"
    class="relative flex h-nav-row min-h-[var(--nq-touch-min,0px)] cursor-default select-none items-center gap-2.5 rounded-control ps-8 pe-2.5 text-body-sm text-foreground outline-none data-highlighted:bg-nq-selected data-disabled:pointer-events-none data-disabled:opacity-50">
    <span aria-hidden="true" class="absolute start-2.5 inline-flex size-4 items-center justify-center">
        <span x-show="isSelected('identified')" x-cloak class="contents"><svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
    </span>
    <span data-slot="select-item-text" class="min-w-0 flex-1 truncate">Identified</span>
</div>
                                                                            <div data-slot="select-item" x-bind="item('monitoring', false)"
    class="relative flex h-nav-row min-h-[var(--nq-touch-min,0px)] cursor-default select-none items-center gap-2.5 rounded-control ps-8 pe-2.5 text-body-sm text-foreground outline-none data-highlighted:bg-nq-selected data-disabled:pointer-events-none data-disabled:opacity-50">
    <span aria-hidden="true" class="absolute start-2.5 inline-flex size-4 items-center justify-center">
        <span x-show="isSelected('monitoring')" x-cloak class="contents"><svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
    </span>
    <span data-slot="select-item-text" class="min-w-0 flex-1 truncate">Monitoring</span>
</div>
                                                                            <div data-slot="select-item" x-bind="item('resolved', false)"
    class="relative flex h-nav-row min-h-[var(--nq-touch-min,0px)] cursor-default select-none items-center gap-2.5 rounded-control ps-8 pe-2.5 text-body-sm text-foreground outline-none data-highlighted:bg-nq-selected data-disabled:pointer-events-none data-disabled:opacity-50">
    <span aria-hidden="true" class="absolute start-2.5 inline-flex size-4 items-center justify-center">
        <span x-show="isSelected('resolved')" x-cloak class="contents"><svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M20 6 9 17l-5-5"/>
</svg></span>
    </span>
    <span data-slot="select-item-text" class="min-w-0 flex-1 truncate">Resolved</span>
</div>
    </div>
</template>
    </div>
</div>
                    </div>
                    <fieldset class="grid gap-2">
                        <legend class="mb-1 text-label text-foreground">Affected services</legend>
                                                    <label class="flex items-center gap-2 text-body-sm">
                                <input type="checkbox" value="api" x-model="incIds" class="size-4 accent-[var(--nq-brand)]">
                                <span dir="auto">API</span>
                            </label>
                                                    <label class="flex items-center gap-2 text-body-sm">
                                <input type="checkbox" value="web" x-model="incIds" class="size-4 accent-[var(--nq-brand)]">
                                <span dir="auto">Website</span>
                            </label>
                                                    <label class="flex items-center gap-2 text-body-sm">
                                <input type="checkbox" value="db" x-model="incIds" class="size-4 accent-[var(--nq-brand)]">
                                <span dir="auto">Database</span>
                            </label>
                                            </fieldset>
                    <div data-slot="dialog-footer" class="flex flex-col-reverse gap-2 sm:flex-row sm:justify-end"><button data-slot="button"
     type="button"                         x-on:click="incOpen = false" x-bind:disabled="busy" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 text-foreground hover:bg-nq-hover h-control px-[var(--nq-control-pad)]">
        Cancel</button>
                        <button data-slot="button"
     type="submit"                         x-bind:aria-busy="busy ? &#039;true&#039; : null" x-bind:data-disabled="busy ? &#039;&#039; : null" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border border-transparent font-sans text-label transition-colors duration-150 ease-nq min-h-[var(--nq-touch-min,0px)] outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary text-primary-foreground hover:bg-[color-mix(in_oklab,var(--nq-action)_88%,var(--nq-fg))] h-control px-[var(--nq-control-pad)]">
        <svg data-slot="spinner" aria-hidden="true" style="display: none;" x-show="busy" class="size-4 animate-spin motion-reduce:animate-none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M21 12a9 9 0 1 1-6.219-8.56"/>
</svg>                            Publish</button></div>
                </form>
                            <button type="button" data-slot="dialog-close" x-on:click="close()" aria-label="Close"
                    class="absolute end-3 top-3 inline-flex size-8 items-center justify-center rounded-control text-muted-foreground transition-colors duration-150 hover:bg-nq-hover hover:text-foreground focus-visible:outline-2 focus-visible:outline-nq-focus [&_svg]:size-4"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
  <path d="M18 6 6 18"/>
  <path d="m6 6 12 12"/>
</svg></button>
                    </div>
    </div>
</template>
</div>
    </div>
```
