AkurAI Build
Menu

Public repository / master

AkurAI-Framework / site/frontend/components.html

Latest change b34c72a614f00efd0c0d58bdc5e3ccc63f07c682 - docs: fix stale info (v0.1.0 status, roadmap, crate table) + file remaining-feature batch ledger (BATCHES.md) by Ólafur Búi Ólafsson

{% include "header" %}
    <main class="container components">
      <header class="page-head">
        <span class="eyebrow">Component library</span>
        <h1>Components</h1>
        <p class="lede">The built-in UI primitives, grouped by category. Everything here is plain
        server-rendered HTML + CSS — native elements first, no framework runtime, no build step.</p>
      </header>
      <nav class="comp-index" aria-label="Component categories">
        <a href="#g-actions">Actions</a>
        <a href="#g-forms">Forms</a>
        <a href="#g-data">Data display</a>
        <a href="#g-feedback">Feedback</a>
        <a href="#g-navigation">Navigation</a>
        <a href="#g-overlays">Overlays</a>
        <a href="#g-utilities">Utilities</a>
      </nav>
      <h2 class="comp-group" id="g-actions">Actions</h2>
      <section class="comp-cat" id="buttons">
        <h2>Buttons</h2>
        <div class="comp-demo">
          <a class="btn btn-primary" href="#buttons">Primary</a>
          <a class="btn btn-secondary" href="#buttons">Secondary</a>
          <a class="btn btn-ghost" href="#buttons">Ghost</a>
          <a class="btn btn-primary btn-sm" href="#buttons">Small</a>
          <button class="btn btn-secondary" disabled>Disabled</button>
        </div>
      </section>
<section class="comp-cat" id="button-group">
  <h2>Button group</h2>
  <div class="comp-demo">
    <div class="btn-group" role="group" aria-label="View switcher">
      <button type="button" class="btn btn-sm is-active" aria-pressed="true">List</button>
      <button type="button" class="btn btn-sm" aria-pressed="false">Grid</button>
      <button type="button" class="btn btn-sm" aria-pressed="false">Board</button>
    </div>
  </div>
</section>

<section class="comp-cat" id="icon-button">
  <h2>Icon button</h2>
  <div class="comp-demo">
    <button type="button" class="btn-icon" aria-label="Search">
      <span aria-hidden="true">&#9906;</span>
    </button>
    <button type="button" class="btn-icon btn-ghost" aria-label="Edit">
      <span aria-hidden="true">&#9998;</span>
    </button>
    <button type="button" class="btn-icon btn-icon-sm" aria-label="Close">
      <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false" fill="none"
           stroke="currentColor" stroke-width="2" stroke-linecap="round">
        <path d="M6 6l12 12M18 6L6 18"/>
      </svg>
    </button>
  </div>
</section>

<section class="comp-cat" id="dropdown-menu">
  <h2>Dropdown menu</h2>
  <div class="comp-demo">
    <details class="dropdown">
      <summary class="btn btn-secondary">
        Options <span class="split-caret" aria-hidden="true">&#9662;</span>
      </summary>
      <div class="menu" role="menu" aria-label="Options">
        <a class="menu-item" role="menuitem" href="#button-group">
          <span class="menu-icon" aria-hidden="true">&#9636;</span>View item
        </a>
        <button type="button" class="menu-item" role="menuitem">
          <span class="menu-icon" aria-hidden="true">&#9998;</span>Rename
        </button>
        <button type="button" class="menu-item" role="menuitem">
          <span class="menu-icon" aria-hidden="true">&#10697;</span>Duplicate
        </button>
        <hr class="menu-separator" role="separator" />
        <button type="button" class="menu-item is-destructive" role="menuitem">
          <span class="menu-icon" aria-hidden="true">&#10005;</span>Delete
        </button>
      </div>
    </details>
  </div>
</section>

<section class="comp-cat" id="split-button">
  <h2>Split button</h2>
  <div class="comp-demo">
    <div class="split-btn">
      <button type="button" class="btn btn-primary">Save</button>
      <details class="dropdown">
        <summary class="btn btn-primary" aria-label="More save options">
          <span class="split-caret" aria-hidden="true">&#9662;</span>
        </summary>
        <div class="menu menu-end" role="menu" aria-label="Save options">
          <button type="button" class="menu-item" role="menuitem">Save and close</button>
          <button type="button" class="menu-item" role="menuitem">Save as draft</button>
          <button type="button" class="menu-item" role="menuitem">Save a copy</button>
        </div>
      </details>
    </div>
  </div>
</section>
      <h2 class="comp-group" id="g-forms">Forms</h2>
      <section class="comp-cat" id="forms">
        <h2>Form controls</h2>
        <div class="comp-demo form-grid">
          <label>Text input<input type="text" placeholder="Ada Lovelace" /></label>
          <label>Email<input type="email" placeholder="ada@example.com" /></label>
          <label>Password<input type="password" placeholder="••••••••" /></label>
          <label>Select<select><option>One</option><option>Two</option></select></label>
          <label class="span-2">Textarea<textarea rows="3" placeholder="Notes…"></textarea></label>
          <fieldset>
            <legend>Radio</legend>
            <label class="inline"><input type="radio" name="r" checked /> A</label>
            <label class="inline"><input type="radio" name="r" /> B</label>
          </fieldset>
          <div class="stack">
            <label class="inline"><input type="checkbox" checked /> Checkbox</label>
            <label>Range<input type="range" min="0" max="100" value="60" /></label>
          </div>
        </div>
      </section>
<!-- ===========================================================================
     Forms extras showcase — category "Forms"
     Blocks: .switch, .input-group, .search, .field, .dropzone
     =========================================================================== -->

<section class="comp-cat" id="switch">
  <h2>Switch / toggle</h2>
  <div class="comp-demo stack">
    <label class="switch">
      <input type="checkbox" class="switch-input" role="switch" />
      <span class="switch-text">Email notifications</span>
    </label>

    <label class="switch">
      <input type="checkbox" class="switch-input" role="switch" checked />
      <span class="switch-text">
        Two-factor authentication
        <small>Require a code at every sign-in</small>
      </span>
    </label>

    <label class="switch">
      <input type="checkbox" class="switch-input" role="switch" disabled />
      <span class="switch-text">Beta features (disabled)</span>
    </label>

    <label class="switch">
      <input type="checkbox" class="switch-input" role="switch" checked disabled />
      <span class="switch-text">Locked on (disabled)</span>
    </label>
  </div>
</section>

<section class="comp-cat" id="input-group">
  <h2>Input group</h2>
  <div class="comp-demo stack">
    <label for="ig-url">Website</label>
    <div class="input-group">
      <span class="input-addon">https://</span>
      <input type="text" id="ig-url" placeholder="your-site" />
      <span class="input-addon">.com</span>
    </div>

    <label for="ig-user">Username</label>
    <div class="input-group">
      <span class="input-addon">@</span>
      <input type="text" id="ig-user" placeholder="username" />
    </div>

    <label for="ig-price">Price</label>
    <div class="input-group">
      <span class="input-addon">ISK</span>
      <input type="text" id="ig-price" placeholder="0" inputmode="numeric" />
      <span class="input-addon">/mo</span>
    </div>
  </div>
</section>

<section class="comp-cat" id="search">
  <h2>Search input</h2>
  <div class="comp-demo stack">
    <label for="search-empty">Search (empty)</label>
    <div class="search">
      <svg class="search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
           stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <circle cx="11" cy="11" r="7"></circle>
        <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
      </svg>
      <input type="search" id="search-empty" placeholder="Search components…" />
      <button type="button" class="search-clear" aria-label="Clear search">&times;</button>
    </div>

    <label for="search-typing">Search (typing)</label>
    <div class="search">
      <svg class="search-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
           stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <circle cx="11" cy="11" r="7"></circle>
        <line x1="21" y1="21" x2="16.65" y2="16.65"></line>
      </svg>
      <input type="search" id="search-typing" value="dropzone" placeholder="Search components…" />
      <button type="button" class="search-clear" aria-label="Clear search">&times;</button>
    </div>
  </div>
</section>

<section class="comp-cat" id="field">
  <h2>Field with validation</h2>
  <div class="comp-demo stack">
    <div class="field">
      <label for="f-name" class="field-required">Full name</label>
      <input type="text" id="f-name" aria-describedby="f-name-hint" />
      <span class="field-hint" id="f-name-hint">As it appears on your ID.</span>
    </div>

    <div class="field is-invalid">
      <label for="f-email" class="field-required">Email</label>
      <input type="email" id="f-email" value="not-an-email"
             aria-invalid="true" aria-describedby="f-email-hint f-email-err" />
      <span class="field-hint" id="f-email-hint">We'll never share it.</span>
      <span class="field-error" id="f-email-err">Enter a valid email address.</span>
    </div>

    <div class="field is-valid">
      <label for="f-handle">Handle</label>
      <input type="text" id="f-handle" value="olibui" aria-describedby="f-handle-hint" />
      <span class="field-hint" id="f-handle-hint">Looks good — that handle is available.</span>
    </div>
  </div>
</section>

<section class="comp-cat" id="dropzone">
  <h2>File dropzone</h2>
  <div class="comp-demo stack">
    <label class="dropzone" for="dz-idle">
      <svg class="dropzone-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
           stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M12 16V4"></path><path d="m6 10 6-6 6 6"></path>
        <path d="M4 20h16"></path>
      </svg>
      <span class="dropzone-title">Drop files here or <b>browse</b></span>
      <span class="dropzone-hint">PNG, JPG or PDF up to 10 MB</span>
      <input type="file" id="dz-idle" class="dropzone-input"
             accept="image/png,image/jpeg,application/pdf" multiple />
    </label>

    <label class="dropzone is-dragover" for="dz-drag">
      <svg class="dropzone-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
           stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
        <path d="M12 16V4"></path><path d="m6 10 6-6 6 6"></path>
        <path d="M4 20h16"></path>
      </svg>
      <span class="dropzone-title">Release to upload</span>
      <span class="dropzone-hint">Drag-over state (preview)</span>
      <input type="file" id="dz-drag" class="dropzone-input" />
    </label>
  </div>
</section>
      <h2 class="comp-group" id="g-data">Data display</h2>
      <section class="comp-cat" id="cards">
        <h2>Cards</h2>
        <div class="comp-demo grid-3">
          {% for c in cards %}
          <div class="card">
            <h3>{{ c.title }}</h3>
            <p class="muted">{{ c.body }}</p>
          </div>
          {% endfor %}
        </div>
      </section>
      <section class="comp-cat" id="table">
        <h2>Data table</h2>
        <div class="comp-demo">
          <table class="table">
            <thead><tr>{% for col in table.columns %}<th>{{ col }}</th>{% endfor %}</tr></thead>
            <tbody>{% for row in table.rows %}<tr>{% for cell in row %}<td>{{ cell }}</td>{% endfor %}</tr>{% endfor %}</tbody>
          </table>
        </div>
      </section>
      <section class="comp-cat" id="badges">
        <h2>Badges</h2>
        <div class="comp-demo">
          {% for b in badges %}<span class="badge badge-{{ b.kind }}">{{ b.label }}</span>{% endfor %}
        </div>
      </section>
<section class="comp-cat" id="data-display">
  <h2>Data display</h2>

  <!-- Description list -->
  <div class="comp-demo">
    <dl class="desc-list">
      <dt>Name</dt>
      <dd>AkurAI Framework</dd>
      <dt>Version</dt>
      <dd>0.1.0</dd>
      <dt>Status</dt>
      <dd><span class="badge">Stable</span></dd>
      <dt>License</dt>
      <dd>MIT</dd>
    </dl>
  </div>

  <!-- Metric -->
  <div class="comp-demo">
    <div class="metric">
      <span class="metric-value">12,480</span>
      <span class="metric-label">Requests</span>
      <span class="metric-delta is-up">▲ 8.2%</span>
    </div>
    <div class="metric">
      <span class="metric-value">142 ms</span>
      <span class="metric-label">Avg latency</span>
      <span class="metric-delta is-down">▼ 3.1%</span>
    </div>
    <div class="metric">
      <span class="metric-value">99.98%</span>
      <span class="metric-label">Uptime</span>
      <span class="metric-delta is-up">▲ 0.4%</span>
    </div>
  </div>

  <!-- Tag / chip -->
  <div class="comp-demo">
    <span class="tag">rust</span>
    <span class="tag">no-build</span>
    <span class="tag">sqlite</span>
    <span class="tag">
      semantic-search
      <button class="tag-remove" type="button" aria-label="Remove semantic-search">&times;</button>
    </span>
    <span class="tag">
      dark-theme
      <button class="tag-remove" type="button" aria-label="Remove dark-theme">&times;</button>
    </span>
  </div>

  <!-- Avatar -->
  <div class="comp-demo">
    <span class="avatar avatar-sm" role="img" aria-label="Óli Búi">ÓB</span>
    <span class="avatar" role="img" aria-label="Klara">KL</span>
    <span class="avatar avatar-lg avatar-status" role="img" aria-label="Jeeves, online">JV</span>
    <span class="avatar-group" role="group" aria-label="Team members">
      <span class="avatar" role="img" aria-label="Anna">AN</span>
      <span class="avatar" role="img" aria-label="Björn">BJ</span>
      <span class="avatar" role="img" aria-label="Caro">CA</span>
      <span class="avatar avatar-more" role="img" aria-label="3 more members">+3</span>
    </span>
  </div>

  <!-- Code block -->
  <div class="comp-demo">
    <div class="code-block">
      <div class="code-block-bar">
        <span class="code-block-name">main.rs</span>
        <button class="code-block-copy" type="button" data-display-copy>Copy</button>
      </div>
      <pre><code>fn main() {
    println!("AkurAI Framework — single binary, zero deps");
}</code></pre>
    </div>
  </div>

</section>
      <h2 class="comp-group" id="g-feedback">Feedback</h2>
      <section class="comp-cat" id="alerts">
        <h2>Alerts</h2>
        <div class="comp-demo stack">
          {% for a in alerts %}
          <div class="alert alert-{{ a.kind }}"><strong>{{ a.title }}</strong> <span>{{ a.text }}</span></div>
          {% endfor %}
        </div>
      </section>
<!-- ============================================================
     Feedback components showcase
     ============================================================ -->

<section class="comp-cat" id="toast">
  <h2>Toast / notification</h2>
  <div class="comp-demo stack">
    <p class="muted small">Toasts stack in a fixed corner region and auto-dismiss after ~4s. Click to spawn one.</p>
    <button type="button" class="btn" id="toast-demo-btn">Spawn toast</button>

    <!-- Static reference examples -->
    <div class="toast toast-success" role="status">
      <span class="toast-icon" aria-hidden="true">✓</span>
      <span class="toast-title">Saved</span>
      <button type="button" class="toast-close" aria-label="Dismiss notification">&times;</button>
      <span class="toast-text">Your changes were saved successfully.</span>
    </div>

    <div class="toast toast-info" role="status">
      <span class="toast-icon" aria-hidden="true">i</span>
      <span class="toast-title">Heads up</span>
      <button type="button" class="toast-close" aria-label="Dismiss notification">&times;</button>
      <span class="toast-text">A new version is available.</span>
    </div>

    <div class="toast toast-warning" role="status">
      <span class="toast-icon" aria-hidden="true">!</span>
      <span class="toast-title">Almost full</span>
      <button type="button" class="toast-close" aria-label="Dismiss notification">&times;</button>
      <span class="toast-text">Storage is at 92% capacity.</span>
    </div>

    <div class="toast toast-danger" role="status">
      <span class="toast-icon" aria-hidden="true">✕</span>
      <span class="toast-title">Upload failed</span>
      <button type="button" class="toast-close" aria-label="Dismiss notification">&times;</button>
      <span class="toast-text">The connection was lost. Try again.</span>
    </div>
  </div>

  <!-- Live region: JS-spawned toasts mount here -->
  <div class="toast-region" id="feedback-toast-region" aria-live="polite" aria-atomic="false"></div>
</section>

<section class="comp-cat" id="banner">
  <h2>Banner</h2>
  <div class="comp-demo stack">
    <div class="banner banner-info" role="status">
      <span class="banner-icon" aria-hidden="true">i</span>
      <span class="banner-text"><strong>Maintenance:</strong> scheduled downtime Sunday 02:00–03:00 UTC.</span>
    </div>

    <div class="banner banner-warning" role="status">
      <span class="banner-icon" aria-hidden="true">!</span>
      <span class="banner-text"><strong>Trial ending:</strong> 3 days left on your plan.</span>
    </div>

    <div class="banner banner-danger" role="alert" data-feedback-dismissible>
      <span class="banner-icon" aria-hidden="true">✕</span>
      <span class="banner-text"><strong>Action required:</strong> verify your email to keep your account active.</span>
      <button type="button" class="banner-close" aria-label="Dismiss banner">&times;</button>
    </div>
  </div>
</section>

<section class="comp-cat" id="progress">
  <h2>Progress</h2>
  <div class="comp-demo stack">
    <div>
      <p class="small muted">Determinate (66%)</p>
      <div class="progress" role="progressbar" aria-valuenow="66" aria-valuemin="0" aria-valuemax="100" aria-label="Upload progress" style="--progress-value:66%">
        <span class="progress-bar"></span>
      </div>
    </div>

    <div>
      <p class="small muted">Indeterminate</p>
      <div class="progress progress-indeterminate" role="progressbar" aria-label="Loading" aria-valuetext="Loading">
        <span class="progress-bar"></span>
      </div>
    </div>

    <div>
      <p class="small muted">Ring (75%)</p>
      <div class="progress-ring" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100" aria-label="Completion" style="--progress-value:75%">
        <span class="progress-ring-label">75%</span>
      </div>
    </div>
  </div>
</section>

<section class="comp-cat" id="spinner">
  <h2>Spinner</h2>
  <div class="comp-demo">
    <span class="spinner spinner-sm" role="status"><span class="visually-hidden">Loading</span></span>
    <span class="spinner spinner-md" role="status"><span class="visually-hidden">Loading</span></span>
    <span class="spinner spinner-lg" role="status"><span class="visually-hidden">Loading</span></span>
  </div>
</section>

<section class="comp-cat" id="skeleton">
  <h2>Skeleton</h2>
  <div class="comp-demo stack" aria-busy="true">
    <div class="card" style="display:flex;gap:1rem;align-items:center">
      <span class="skeleton skeleton-avatar" aria-hidden="true"></span>
      <div style="flex:1">
        <span class="skeleton skeleton-line" aria-hidden="true"></span>
        <span class="skeleton skeleton-line skeleton-line-sm" aria-hidden="true"></span>
      </div>
    </div>
    <span class="skeleton skeleton-card" aria-hidden="true"></span>
    <span class="visually-hidden">Loading content…</span>
  </div>
</section>

<section class="comp-cat" id="empty">
  <h2>Empty state</h2>
  <div class="comp-demo">
    <div class="empty">
      <span class="empty-icon" aria-hidden="true">📭</span>
      <p class="empty-title">No projects yet</p>
      <p class="empty-text">Create your first project to start tracking work and collaborating with your team.</p>
      <button type="button" class="btn">New project</button>
    </div>
  </div>
</section>
      <h2 class="comp-group" id="g-navigation">Navigation</h2>
<section class="comp-cat" id="tabs">
  <h2>Tabs</h2>
  <div class="comp-demo">
    <div class="tabs" role="tablist" aria-label="Account settings">
      <button class="tab" role="tab" id="tab-profile" aria-controls="panel-profile" aria-selected="true">Profile</button>
      <button class="tab" role="tab" id="tab-billing" aria-controls="panel-billing" aria-selected="false">Billing</button>
      <button class="tab" role="tab" id="tab-team" aria-controls="panel-team" aria-selected="false">Team</button>
    </div>
    <div class="tabpanel" role="tabpanel" id="panel-profile" aria-labelledby="tab-profile" tabindex="0">
      <p class="muted">Your profile details and public identity live here.</p>
    </div>
    <div class="tabpanel" role="tabpanel" id="panel-billing" aria-labelledby="tab-billing" tabindex="0" hidden>
      <p class="muted">Manage payment methods and invoices.</p>
    </div>
    <div class="tabpanel" role="tabpanel" id="panel-team" aria-labelledby="tab-team" tabindex="0" hidden>
      <p class="muted">Invite members and assign roles.</p>
    </div>
  </div>
</section>

<section class="comp-cat" id="breadcrumbs">
  <h2>Breadcrumbs</h2>
  <div class="comp-demo">
    <nav aria-label="Breadcrumb">
      <ol class="crumbs">
        <li><a href="#">Home</a></li>
        <li><span class="crumbs-sep" aria-hidden="true">/</span><a href="#">Components</a></li>
        <li><span class="crumbs-sep" aria-hidden="true">/</span><a href="#">Navigation</a></li>
        <li><span class="crumbs-sep" aria-hidden="true">/</span><span aria-current="page">Breadcrumbs</span></li>
      </ol>
    </nav>
  </div>
</section>

<section class="comp-cat" id="pagination">
  <h2>Pagination</h2>
  <div class="comp-demo">
    <nav class="pager" aria-label="Pagination">
      <ul>
        <li><span class="pager-disabled" aria-disabled="true">Prev</span></li>
        <li><a href="#" aria-current="page">1</a></li>
        <li><a href="#">2</a></li>
        <li><a href="#">3</a></li>
        <li><a href="#">4</a></li>
        <li><a href="#">5</a></li>
        <li><a href="#" aria-label="Next page">Next</a></li>
      </ul>
    </nav>
  </div>
</section>

<section class="comp-cat" id="steps">
  <h2>Steps / Stepper</h2>
  <div class="comp-demo">
    <ol class="steps" aria-label="Progress">
      <li class="step is-done">
        <span class="step-marker" aria-hidden="true"></span>
        <span class="step-label">Account <span class="small muted">(done)</span></span>
      </li>
      <li class="step is-done">
        <span class="step-marker" aria-hidden="true"></span>
        <span class="step-label">Profile <span class="small muted">(done)</span></span>
      </li>
      <li class="step is-current" aria-current="step">
        <span class="step-marker" aria-hidden="true"></span>
        <span class="step-label">Payment</span>
      </li>
      <li class="step">
        <span class="step-marker" aria-hidden="true"></span>
        <span class="step-label">Confirm</span>
      </li>
    </ol>
  </div>
</section>

<section class="comp-cat" id="navlist">
  <h2>Menu list</h2>
  <div class="comp-demo">
    <nav aria-label="Settings">
      <ul class="navlist">
        <li><a href="#">General</a></li>
        <li><a href="#" aria-current="page">Security</a></li>
        <li><a href="#">Notifications</a></li>
        <li><a href="#">Integrations</a></li>
        <li><a href="#">Billing</a></li>
      </ul>
    </nav>
  </div>
</section>
      <h2 class="comp-group" id="g-overlays">Overlays</h2>
<section class="comp-cat" id="overlays">
  <h2>Overlays</h2>

  <!-- ---------- Modal / dialog ---------- -->
  <div class="comp-demo stack">
    <h3 class="muted small">Modal / dialog</h3>
    <div>
      <button class="btn btn-primary" data-open-modal="demo-modal">Open modal</button>
    </div>

    <dialog id="demo-modal" class="modal" aria-labelledby="demo-modal-title">
      <div class="modal-head">
        <h4 class="modal-title" id="demo-modal-title">Confirm deployment</h4>
        <button class="modal-close" data-close-modal aria-label="Close dialog">&times;</button>
      </div>
      <div class="modal-body">
        <p>You're about to ship the current build to production. This runs the release
          engine and restarts the service.</p>
        <p>Anyone connected will see a brief reconnect. Continue?</p>
      </div>
      <div class="modal-foot">
        <button class="btn" data-close-modal>Cancel</button>
        <button class="btn btn-primary" data-close-modal>Deploy</button>
      </div>
    </dialog>
  </div>

  <!-- ---------- Drawer / sheet ---------- -->
  <div class="comp-demo stack">
    <h3 class="muted small">Drawer / sheet</h3>
    <div>
      <button class="btn" data-open-drawer="demo-drawer">Open drawer</button>
    </div>

    <div id="demo-drawer" class="drawer" aria-hidden="true">
      <div class="drawer-backdrop" data-close-drawer></div>
      <aside class="drawer-panel" role="dialog" aria-modal="true" aria-labelledby="demo-drawer-title">
        <div class="drawer-head">
          <h4 class="drawer-title" id="demo-drawer-title">Filters</h4>
          <button class="modal-close" data-close-drawer aria-label="Close drawer">&times;</button>
        </div>
        <div class="drawer-body">
          <p>Refine the result set. Changes apply live.</p>
          <label for="drawer-q">Search</label>
          <input id="drawer-q" type="text" placeholder="Type to filter…">
          <label for="drawer-sort">Sort by</label>
          <select id="drawer-sort">
            <option>Most recent</option>
            <option>Name</option>
            <option>Size</option>
          </select>
        </div>
        <div class="drawer-foot">
          <button class="btn" data-close-drawer>Cancel</button>
          <button class="btn btn-primary" data-close-drawer>Apply</button>
        </div>
      </aside>
    </div>
  </div>

  <!-- ---------- Popover ---------- -->
  <div class="comp-demo stack">
    <h3 class="muted small">Popover</h3>
    <details class="popover">
      <summary class="btn">Account options</summary>
      <div class="popover-panel" role="group" aria-label="Account options">
        <p class="popover-title">Signed in as Óli</p>
        <p>Switch the active workspace or sign out below.</p>
        <label for="pop-ws" class="small">Workspace</label>
        <select id="pop-ws">
          <option>AkurAI</option>
          <option>localai</option>
        </select>
      </div>
    </details>
  </div>

  <!-- ---------- Tooltip ---------- -->
  <div class="comp-demo">
    <h3 class="muted small">Tooltip</h3>
    <span class="tooltip">
      <button class="btn" aria-describedby="tip-sync">Sync now</button>
      <span class="tooltip-tip" role="tooltip" id="tip-sync">
        Pulls the latest records from all connected sources.
      </span>
    </span>
  </div>

</section>
      <h2 class="comp-group" id="g-utilities">Utilities</h2>
      <section class="comp-cat" id="disclosure">
        <h2>Disclosure</h2>
        <div class="comp-demo">
          <details><summary>What is a disclosure?</summary><p class="muted">A native expandable section — zero JavaScript.</p></details>
        </div>
      </section>
    </main>
{% include "footer" %}