# Detail Layout

> A detail page for one thing (a plugin, a customer, a server). A sub-sidebar of tabs grouped in sections that becomes a tab bar on small screens, a header with icon, name, version, kind, status and recent activity, the active tab's content, and loading and error states.

Source: https://docs.nasaqui.com/components/detail-layout

## Install

```bash
npx shadcn@latest add https://docs.nasaqui.com/r/detail-layout.json
```

The page you land on after picking one item from a list. Its sections run down a second sidebar next to the app's
own menu, grouped under small headings ("General", "Settings"). On small screens the sidebar becomes a scrolling tab
bar. Above the content sits a header: the item's icon on its colour, its name and version, what kind of thing it is,
its status, a short description, and a box with its headline count, a sparkline and when it was last active.

## When to use

- A plugin's, integration's or resource's detail page with several sections.
- Any record with enough settings to need a second level of navigation.

## When not to use

- A page with two or three views of the same data: use `Tabs`.
- A list page: use `PageHeader` and a table or grid.
- The app's main navigation: use `SidebarLayout`.

## Import

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

## Quick start

```tsx
const [tab, setTab] = useState("overview");

<DetailLayout
  tabs={[
    { key: "overview", label: "Overview", icon: "layout-dashboard", section: "General" },
    { key: "logs", label: "Logs", icon: "scroll-text", section: "General", badge: 12 },
    { key: "settings", label: "Settings", icon: "settings", section: "Settings" },
  ]}
  activeTab={tab}
  onTabChange={setTab}
  identity={{ name: "Postgres", version: "2.4.1", kind: "Source", status: { label: "Enabled", tone: "success" }, icon: "database", hue: "blue" }}
  activity={{ count: 128430, countLabel: "records", series, lastActiveAt }}
  actions={<Button>Disable</Button>}
  loading={query.isLoading}
  error={query.isError}
  onRetry={query.refetch}
>
  {tab === "overview" ? <Overview /> : tab === "logs" ? <Logs /> : <Settings />}
</DetailLayout>
```

## Anatomy

- `data-slot="detail-layout"`: a row on wide screens, a column on small ones.
- `detail-sidebar` (from `md`): `nav` with section headings and `detail-tab` buttons.
- `detail-tabbar` (below `md`): the same tabs in one scrolling row.
- `detail-hero`: icon tile, name, version, kind and status badges, description, slug; `detail-activity`; `actions`.
- `detail-content`: the active tab's content.

## API

| Prop | Type | Notes |
| --- | --- | --- |
| `tabs` | `DetailTab[]` | `{ key, label, icon?, section?, badge?, disabled? }`. `icon` is a name, image URL or node. |
| `activeTab`, `onTabChange` | `string`, `(key) => void` | Controlled. Sync with the URL if you like. |
| `identity` | `DetailIdentity` | `{ name, description?, version?, kind?, status?: { label, tone? }, icon?, hue?, slug? }`. Leave it out for no header. |
| `activity` | `DetailActivity` | `{ count?, countLabel?, series?, lastActiveAt? }`. |
| `actions` | `ReactNode` | At the end of the header. |
| `loading` | `boolean` | Header skeleton and a loading state for the content. The tabs stay usable. |
| `error`, `onRetry` | `boolean \| ReactNode`, `() => void` | Replaces header and content with an `ErrorState` and **Try again**. |
| `headingAs` | `ElementType` | The name's element. Default `h1`. |
| `labels` | `Partial<DetailLayoutLabels>` | |

Status tones: `success`, `warning`, `danger`, `info`, `neutral`.

### Helpers

From `detail-layout-logic.ts`, pure: `groupDetailTabs(tabs)` gives `{ section, tabs }[]` in first-appearance order
with unsectioned tabs first; `stepDetailTab(tabs, active, 1 | -1 | "first" | "last")` skips disabled tabs and wraps.

## Accessibility

- The sidebar and the tab bar are `nav`s named "Sections". The active tab has `aria-current="page"` and controls
  the content region.
- One tab is in the tab order; arrow keys move between tabs (up and down in the sidebar, left and right in the bar,
  mirrored in Arabic), Home and End jump to the ends. Moving also opens the tab.
- Activity reads as words ("Last active: 5 minutes ago"); the sparkline has a label and the count's full value is in
  its title.
- The loading header is hidden from assistive tech; the content's loading state announces itself.

## RTL & i18n

English and Arabic strings follow the locale. The sidebar sits on the start side, so it moves to the right in
Arabic. Versions, slugs and the count stay left to right.

## Styling & tokens

`bg-card`, `border-border`; the active tab uses `bg-nq-selected`, hovered ones `bg-nq-hover`. The icon tile and
sparkline use the `--nq-tag-*` hue tokens.

## Do / Don't

- Do keep section names short; they are headings, not descriptions.
- Do keep the tabs while loading, so people can pick a section before the data arrives.
- Don't put more than one primary action in `actions`.

## Related

`page-header`, `sidebar-layout`, `tabs`, `plugin-card`, `states`.

## Lab

Layout › Detail Layout: Default, Loading, Load error, Arabic.

## Code

### React

```tsx
const [tab, setTab] = useState("overview");

<DetailLayout
  tabs={[
    { key: "overview", label: "Overview", icon: "layout-dashboard", section: "General" },
    { key: "logs", label: "Logs", icon: "scroll-text", section: "General", badge: 12 },
    { key: "settings", label: "Settings", icon: "settings", section: "Settings" },
  ]}
  activeTab={tab}
  onTabChange={setTab}
  identity={{ name: "Postgres", version: "2.4.1", kind: "Source", status: { label: "Enabled", tone: "success" }, icon: "database", hue: "blue" }}
  activity={{ count: 128430, countLabel: "records", series, lastActiveAt }}
  actions={<Button>Disable</Button>}
  loading={query.isLoading}
  error={query.isError}
  onRetry={query.refetch}
>
  {tab === "overview" ? <Overview /> : tab === "logs" ? <Logs /> : <Settings />}
</DetailLayout>
```

### shadcn

```tsx
const [tab, setTab] = useState("overview");

<DetailLayout
  tabs={[
    { key: "overview", label: "Overview", icon: "layout-dashboard", section: "General" },
    { key: "logs", label: "Logs", icon: "scroll-text", section: "General", badge: 12 },
    { key: "settings", label: "Settings", icon: "settings", section: "Settings" },
  ]}
  activeTab={tab}
  onTabChange={setTab}
  identity={{ name: "Postgres", version: "2.4.1", kind: "Source", status: { label: "Enabled", tone: "success" }, icon: "database", hue: "blue" }}
  activity={{ count: 128430, countLabel: "records", series, lastActiveAt }}
  actions={<Button>Disable</Button>}
  loading={query.isLoading}
  error={query.isError}
  onRetry={query.refetch}
>
  {tab === "overview" ? <Overview /> : tab === "logs" ? <Logs /> : <Settings />}
</DetailLayout>
```

### Vue

```vue
<script setup lang="ts">
import { NqButton, NqDetailLayout, type DetailTab } from "@fadymondy/nasaq/vue";
import { ref } from "vue";

const NOW = Date.parse("2026-09-29T09:00:00");
const tab = ref("overview");
const tabs: DetailTab[] = [
  { key: "overview", label: "Overview", icon: "layout-dashboard", section: "General" },
  { key: "logs", label: "Logs", icon: "scroll-text", section: "General", badge: 12 },
  { key: "settings", label: "Settings", icon: "settings", section: "Settings" },
];
</script>

<template>
  <NqDetailLayout
    v-model:active-tab="tab"
    :tabs="tabs"
    :identity="{ name: 'Postgres', version: '2.4.1', kind: 'Source', status: { label: 'Enabled', tone: 'success' }, icon: 'database', hue: 'blue', description: 'Streams rows from a Postgres database.' }"
    :activity="{ count: 128430, countLabel: 'records', series: [4, 6, 5, 9, 12, 10, 14, 18], lastActiveAt: NOW - 12 * 60_000 }"
  >
    <template #actions><NqButton>Disable</NqButton></template>
    <p v-if="tab === 'overview'">Overview</p>
    <p v-else-if="tab === 'logs'">Logs</p>
    <p v-else>Settings</p>
  </NqDetailLayout>
</template>
```

### Blade

```blade
@php($now = \Carbon\Carbon::now())
<div class="flex flex-col gap-6">
    <x-nq::detail-layout
        active-tab="overview"
        :tabs="[
            ['key' => 'overview', 'label' => 'Overview', 'icon' => 'layout-dashboard', 'section' => 'General'],
            ['key' => 'logs', 'label' => 'Logs', 'icon' => 'scroll-text', 'section' => 'General', 'badge' => 12],
            ['key' => 'settings', 'label' => 'Settings', 'icon' => 'settings', 'section' => 'Settings'],
            ['key' => 'billing', 'label' => 'Billing', 'section' => 'Settings', 'disabled' => true],
        ]"
        :identity="['name' => 'Postgres', 'version' => '2.4.1', 'kind' => 'Source', 'status' => ['label' => 'Enabled', 'tone' => 'success'], 'icon' => 'database', 'hue' => 'blue', 'description' => 'Streams rows from a Postgres database.', 'slug' => 'postgres']"
        :activity="['count' => 128430, 'countLabel' => 'records', 'series' => [4, 6, 5, 9, 12, 10, 14, 18], 'lastActiveAt' => $now->copy()->subMinutes(12)]">
        <x-slot:actions><x-nq::button>Disable</x-nq::button></x-slot:actions>
        <x-nq::detail-layout.panel key="overview" active>Overview content</x-nq::detail-layout.panel>
        <x-nq::detail-layout.panel key="logs">Logs content</x-nq::detail-layout.panel>
        <x-nq::detail-layout.panel key="settings">Settings content</x-nq::detail-layout.panel>
    </x-nq::detail-layout>
    <x-nq::detail-layout :tabs="[['key' => 'overview', 'label' => 'Overview']]" loading />
    <x-nq::detail-layout :tabs="[['key' => 'overview', 'label' => 'Overview']]" error retry-click="location.reload()" />
</div>
```

### HTML + Alpine

```html
<div class="flex flex-col gap-6">
    <div data-slot="detail-layout" x-data="nqDetailLayout('overview', JSON.parse('[{\u0022key\u0022:\u0022overview\u0022,\u0022section\u0022:\u0022General\u0022},{\u0022key\u0022:\u0022logs\u0022,\u0022section\u0022:\u0022General\u0022},{\u0022key\u0022:\u0022settings\u0022,\u0022section\u0022:\u0022Settings\u0022},{\u0022key\u0022:\u0022billing\u0022,\u0022section\u0022:\u0022Settings\u0022,\u0022disabled\u0022:true}]'))" x-modelable="active"
    class="flex min-h-0 flex-col md:flex-row">
    <aside data-slot="detail-sidebar" class="hidden w-56 shrink-0 border-e border-border bg-card md:block">
        <nav aria-label="Sections" class="flex flex-col gap-4 p-3">
                            <div class="flex flex-col gap-0.5">
                    <p dir="auto" class="px-3 pb-1 text-caption text-muted-foreground">General</p>                                                                    <button type="button" data-slot="detail-tab" x-bind="tab('overview', false)" aria-controls="nq-detail-79c2790e-panel" tabindex="0"
                             data-active="true" aria-current="page"   class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control w-full px-3 text-label bg-nq-selected text-foreground">
                            <svg data-slot="icon" aria-hidden="true" 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">
  <rect width="7" height="9" x="3" y="3" rx="1"/>
  <rect width="7" height="5" x="14" y="3" rx="1"/>
  <rect width="7" height="9" x="14" y="12" rx="1"/>
  <rect width="7" height="5" x="3" y="16" rx="1"/>
</svg>                            <span class="min-w-0 flex-1 truncate">Overview</span>
                                                    </button>
                                                                    <button type="button" data-slot="detail-tab" x-bind="tab('logs', false)" aria-controls="nq-detail-79c2790e-panel" tabindex="-1"
                              class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control w-full px-3 text-label text-muted-foreground hover:bg-nq-hover hover:text-foreground">
                                                        <span class="min-w-0 flex-1 truncate">Logs</span>
                            <span class="text-caption tabular-nums text-muted-foreground">12</span>                        </button>
                                    </div>
                            <div class="flex flex-col gap-0.5">
                    <p dir="auto" class="px-3 pb-1 text-caption text-muted-foreground">Settings</p>                                                                    <button type="button" data-slot="detail-tab" x-bind="tab('settings', false)" aria-controls="nq-detail-79c2790e-panel" tabindex="-1"
                              class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control w-full px-3 text-label text-muted-foreground hover:bg-nq-hover hover:text-foreground">
                            <svg data-slot="icon" aria-hidden="true" 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="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"/>
  <circle cx="12" cy="12" r="3"/>
</svg>                            <span class="min-w-0 flex-1 truncate">Settings</span>
                                                    </button>
                                                                    <button type="button" data-slot="detail-tab" x-bind="tab('billing', false)" aria-controls="nq-detail-79c2790e-panel" tabindex="-1"
                              disabled  class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control w-full px-3 text-label text-muted-foreground hover:bg-nq-hover hover:text-foreground">
                                                        <span class="min-w-0 flex-1 truncate">Billing</span>
                                                    </button>
                                    </div>
                    </nav>
    </aside>
    <div class="flex min-w-0 flex-1 flex-col">
        <nav aria-label="Sections" data-slot="detail-tabbar" class="flex gap-1 overflow-x-auto border-b border-border bg-card px-3 py-2 md:hidden">
                                            <button type="button" data-slot="detail-tab" x-bind="tab('overview', true)" aria-controls="nq-detail-79c2790e-panel" tabindex="0"
                     data-active="true" aria-current="page"   class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control-sm shrink-0 whitespace-nowrap px-3 text-label bg-nq-selected text-foreground">
                    <svg data-slot="icon" aria-hidden="true" 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">
  <rect width="7" height="9" x="3" y="3" rx="1"/>
  <rect width="7" height="5" x="14" y="3" rx="1"/>
  <rect width="7" height="9" x="14" y="12" rx="1"/>
  <rect width="7" height="5" x="3" y="16" rx="1"/>
</svg>                    <span class="min-w-0 flex-1 truncate">Overview</span>
                                    </button>
                                            <button type="button" data-slot="detail-tab" x-bind="tab('logs', true)" aria-controls="nq-detail-79c2790e-panel" tabindex="-1"
                      class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control-sm shrink-0 whitespace-nowrap px-3 text-label text-muted-foreground hover:bg-nq-hover hover:text-foreground">
                                        <span class="min-w-0 flex-1 truncate">Logs</span>
                    <span class="text-caption tabular-nums text-muted-foreground">12</span>                </button>
                                            <button type="button" data-slot="detail-tab" x-bind="tab('settings', true)" aria-controls="nq-detail-79c2790e-panel" tabindex="-1"
                      class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control-sm shrink-0 whitespace-nowrap px-3 text-label text-muted-foreground hover:bg-nq-hover hover:text-foreground">
                    <svg data-slot="icon" aria-hidden="true" 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="M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915"/>
  <circle cx="12" cy="12" r="3"/>
</svg>                    <span class="min-w-0 flex-1 truncate">Settings</span>
                                    </button>
                                            <button type="button" data-slot="detail-tab" x-bind="tab('billing', true)" aria-controls="nq-detail-79c2790e-panel" tabindex="-1"
                      disabled  class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control-sm shrink-0 whitespace-nowrap px-3 text-label text-muted-foreground hover:bg-nq-hover hover:text-foreground">
                                        <span class="min-w-0 flex-1 truncate">Billing</span>
                                    </button>
                    </nav>
                                    <header data-slot="detail-hero" class="flex flex-wrap items-start gap-4 border-b border-border bg-card px-6 py-6">
                    <span aria-hidden="true" class="flex size-16 shrink-0 items-center justify-center rounded-card bg-[var(--tile-soft)] text-[var(--tile-solid)]" style="--tile-solid: var(--nq-tag-blue); --tile-soft: var(--nq-tag-blue-soft)">
                        <svg data-slot="icon" aria-hidden="true" class="size-7" 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">
  <ellipse cx="12" cy="5" rx="9" ry="3"/>
  <path d="M3 5V19A9 3 0 0 0 21 19V5"/>
  <path d="M3 12A9 3 0 0 0 21 12"/>
</svg>                                            </span>
                    <div class="flex min-w-48 flex-1 flex-col gap-1.5">
                        <div class="flex flex-wrap items-baseline gap-x-2 gap-y-1">
                            <h1 dir="auto" class="text-h2 text-foreground">Postgres</h1>
                            <bdi dir="ltr" class="font-mono text-caption text-muted-foreground">2.4.1</bdi>                        </div>
                                                    <div class="flex flex-wrap items-center gap-1.5">
                                <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-border bg-secondary text-foreground">Source</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-success/40 bg-nq-success-soft text-nq-success-text">Enabled</span>
                            </div>
                                                <p dir="auto" class="max-w-prose text-body-sm text-muted-foreground">Streams rows from a Postgres database.</p>                        <bdi dir="ltr" class="w-fit font-mono text-caption text-muted-foreground">postgres</bdi>                    </div>
                                            <div data-slot="detail-activity" class="flex items-end gap-4 rounded-card border border-border bg-background px-4 py-3">
                            <div class="flex flex-col">
                                <span class="text-caption text-muted-foreground">records</span>                                <bdi data-slot="num" data-numeric="" title="128,430" class="tabular-nums text-h3">128.4K</bdi>
                                <span class="text-caption text-muted-foreground">
                                    <span class="sr-only">Last active: </span>
                                    <time data-slot="date-time" datetime="2026-09-29T08:48:00+00:00" dir="auto"  title="Sep 29, 2026"     class="tabular-nums [unicode-bidi:isolate]">12 minutes ago</time>
                                </span>
                            </div>
                            <div data-slot="sparkline"  role="img" aria-label="Postgres activity"  class="shrink-0 h-12 w-32">
    <svg viewBox="0 0 128 32" preserveAspectRatio="none" class="size-full overflow-visible rtl:-scale-x-100" aria-hidden="true" focusable="false">
        <defs>
            <linearGradient id="nq-spark-18adf670" x1="0" y1="0" x2="0" y2="1">
                <stop offset="0%" stop-color="var(--nq-tag-blue)" stop-opacity="0.3" />
                <stop offset="100%" stop-color="var(--nq-tag-blue)" stop-opacity="0" />
            </linearGradient>
        </defs>
        <path d="M2,23.78C7.9,22.74,13.81,20.67,19.71,20.67C25.62,20.67,31.52,22.22,37.43,22.22C43.33,22.22,49.24,17.81,55.14,16C61.05,14.19,66.95,11.33,72.86,11.33C78.76,11.33,84.67,14.44,90.57,14.44C96.48,14.44,102.38,10.3,108.29,8.22C114.19,6.15,120.1,4.07,126,2L126.00,30.00L2.00,30.00Z" fill="url(#nq-spark-18adf670)" stroke="none" />        <path d="M2,23.78C7.9,22.74,13.81,20.67,19.71,20.67C25.62,20.67,31.52,22.22,37.43,22.22C43.33,22.22,49.24,17.81,55.14,16C61.05,14.19,66.95,11.33,72.86,11.33C78.76,11.33,84.67,14.44,90.57,14.44C96.48,14.44,102.38,10.3,108.29,8.22C114.19,6.15,120.1,4.07,126,2" fill="none" stroke="var(--nq-tag-blue)" stroke-width="1.5" vector-effect="non-scaling-stroke" stroke-linejoin="round" stroke-linecap="round" />
    </svg>
</div>
                        </div>
                                        <div class="flex shrink-0 flex-wrap items-center gap-2"><button data-slot="button"
     type="button"                         class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border 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 border-border bg-card text-foreground hover:bg-nq-hover h-control px-[var(--nq-control-pad)]">
        Disable</button></div>                </header>
                        <div id="nq-detail-79c2790e-panel" data-slot="detail-content" class="min-w-0 flex-1 p-6">
                <div data-slot="detail-panel" x-show="active === 'overview'"  >Overview content</div>
        <div data-slot="detail-panel" x-show="active === 'logs'"  style="display: none"  >Logs content</div>
        <div data-slot="detail-panel" x-show="active === 'settings'"  style="display: none"  >Settings content</div>            </div>
            </div>
</div>
    <div data-slot="detail-layout" x-data="nqDetailLayout('overview', JSON.parse('[{\u0022key\u0022:\u0022overview\u0022}]'))" x-modelable="active"
    class="flex min-h-0 flex-col md:flex-row">
    <aside data-slot="detail-sidebar" class="hidden w-56 shrink-0 border-e border-border bg-card md:block">
        <nav aria-label="Sections" class="flex flex-col gap-4 p-3">
                            <div class="flex flex-col gap-0.5">
                                                                                        <button type="button" data-slot="detail-tab" x-bind="tab('overview', false)" aria-controls="nq-detail-7b2f3d43-panel" tabindex="0"
                             data-active="true" aria-current="page"   class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control w-full px-3 text-label bg-nq-selected text-foreground">
                                                        <span class="min-w-0 flex-1 truncate">Overview</span>
                                                    </button>
                                    </div>
                    </nav>
    </aside>
    <div class="flex min-w-0 flex-1 flex-col">
        <nav aria-label="Sections" data-slot="detail-tabbar" class="flex gap-1 overflow-x-auto border-b border-border bg-card px-3 py-2 md:hidden">
                                            <button type="button" data-slot="detail-tab" x-bind="tab('overview', true)" aria-controls="nq-detail-7b2f3d43-panel" tabindex="0"
                     data-active="true" aria-current="page"   class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control-sm shrink-0 whitespace-nowrap px-3 text-label bg-nq-selected text-foreground">
                                        <span class="min-w-0 flex-1 truncate">Overview</span>
                                    </button>
                    </nav>
                                    <div data-slot="detail-hero" aria-hidden="true" class="flex flex-wrap items-center gap-4 border-b border-border bg-card px-6 py-6">
                    <div data-slot="skeleton" aria-hidden="true" class="bg-secondary motion-safe:animate-pulse size-16 rounded-card"></div>
                    <div class="flex min-w-48 flex-1 flex-col gap-2">
                        <div data-slot="skeleton" aria-hidden="true" class="rounded-[4px] bg-secondary motion-safe:animate-pulse h-6 w-56 max-w-full"></div>
                        <div data-slot="skeleton" aria-hidden="true" class="rounded-[4px] bg-secondary motion-safe:animate-pulse h-4 w-80 max-w-full"></div>
                        <div data-slot="skeleton" aria-hidden="true" class="rounded-[4px] bg-secondary motion-safe:animate-pulse h-4 w-32"></div>
                    </div>
                    <div data-slot="skeleton" aria-hidden="true" class="bg-secondary motion-safe:animate-pulse h-16 w-48 rounded-card"></div>
                </div>
                        <div id="nq-detail-7b2f3d43-panel" data-slot="detail-content" class="min-w-0 flex-1 p-6">
                <div data-slot="loading-state" data-shape="rows" role="status" aria-live="polite" class="flex flex-col gap-2">
    <span class="sr-only">Loading</span>                        <div class="flex h-row items-center gap-3 border-b border-border px-1">
                <div data-slot="skeleton" aria-hidden="true" class="bg-secondary motion-safe:animate-pulse size-5 rounded-[4px]"></div>
                <div data-slot="skeleton" aria-hidden="true" style="inline-size: 62%" class="rounded-[4px] bg-secondary motion-safe:animate-pulse h-3"></div>
            </div>
                    <div class="flex h-row items-center gap-3 border-b border-border px-1">
                <div data-slot="skeleton" aria-hidden="true" class="bg-secondary motion-safe:animate-pulse size-5 rounded-[4px]"></div>
                <div data-slot="skeleton" aria-hidden="true" style="inline-size: 44%" class="rounded-[4px] bg-secondary motion-safe:animate-pulse h-3"></div>
            </div>
                    <div class="flex h-row items-center gap-3 border-b border-border px-1">
                <div data-slot="skeleton" aria-hidden="true" class="bg-secondary motion-safe:animate-pulse size-5 rounded-[4px]"></div>
                <div data-slot="skeleton" aria-hidden="true" style="inline-size: 54%" class="rounded-[4px] bg-secondary motion-safe:animate-pulse h-3"></div>
            </div>
                </div>
            </div>
            </div>
</div>
    <div data-slot="detail-layout" x-data="nqDetailLayout('overview', JSON.parse('[{\u0022key\u0022:\u0022overview\u0022}]'))" x-modelable="active"
    class="flex min-h-0 flex-col md:flex-row">
    <aside data-slot="detail-sidebar" class="hidden w-56 shrink-0 border-e border-border bg-card md:block">
        <nav aria-label="Sections" class="flex flex-col gap-4 p-3">
                            <div class="flex flex-col gap-0.5">
                                                                                        <button type="button" data-slot="detail-tab" x-bind="tab('overview', false)" aria-controls="nq-detail-7b2f3d43-panel" tabindex="0"
                             data-active="true" aria-current="page"   class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control w-full px-3 text-label bg-nq-selected text-foreground">
                                                        <span class="min-w-0 flex-1 truncate">Overview</span>
                                                    </button>
                                    </div>
                    </nav>
    </aside>
    <div class="flex min-w-0 flex-1 flex-col">
        <nav aria-label="Sections" data-slot="detail-tabbar" class="flex gap-1 overflow-x-auto border-b border-border bg-card px-3 py-2 md:hidden">
                                            <button type="button" data-slot="detail-tab" x-bind="tab('overview', true)" aria-controls="nq-detail-7b2f3d43-panel" tabindex="0"
                     data-active="true" aria-current="page"   class="flex items-center gap-2 rounded-control text-start outline-none transition-colors duration-150 ease-nq focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-nq-focus disabled:pointer-events-none disabled:opacity-50 [&amp;_svg]:size-4 [&amp;_svg]:shrink-0 h-control-sm shrink-0 whitespace-nowrap px-3 text-label bg-nq-selected text-foreground">
                                        <span class="min-w-0 flex-1 truncate">Overview</span>
                                    </button>
                    </nav>
                    <div data-slot="error-state" role="alert" class="flex flex-col items-center justify-center gap-3 border border-dashed border-border px-6 py-12 text-center rounded-card m-6">
            <span data-slot="state-icon" class="inline-flex size-10 items-center justify-center rounded-control border border-border bg-card [&amp;_svg]:size-5 text-nq-danger-text">
            <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">
  <circle cx="12" cy="12" r="10"/>
  <line x1="12" x2="12" y1="8" y2="12"/>
  <line x1="12" x2="12.01" y1="16" y2="16"/>
</svg>        </span>
        <div class="flex max-w-sm flex-col gap-1">
        <p class="text-label text-foreground">This page could not load</p>
                    <p class="text-body-sm text-muted-foreground">Check your connection and try again.</p>
            </div>
            <div class="mt-1 flex flex-wrap items-center justify-center gap-2"><button data-slot="button"
     type="button"                         x-on:click="location.reload()" class="inline-flex shrink-0 select-none items-center justify-center gap-2 whitespace-nowrap rounded-control border 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 border-border bg-card text-foreground hover:bg-nq-hover h-control px-[var(--nq-control-pad)]">
        <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="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"/>
  <path d="M21 3v5h-5"/>
</svg>Try again</button></div>
    </div>
            </div>
</div>
</div>
```
