Layouts

Full-page shell structures for admin dashboards, authentication pages, settings panels, and content areas.

Dashboard Shell

The primary admin panel layout. A fixed-width sidebar sits on the left; the right side contains a sticky topbar and a scrollable main content area.

wb-sidebar
wb-navbar (sticky topbar)
wb-sidebar-brand wb-sidebar-nav
wb-dashboard-main
<div class="wb-dashboard-shell">

  <!-- Sidebar -->
  <aside class="wb-sidebar">
    <div class="wb-sidebar-brand">
      <a href="/">My App</a>
    </div>
    <nav class="wb-sidebar-nav">
      <a href="/dashboard" class="wb-sidebar-link is-active">Dashboard</a>
      <a href="/users"     class="wb-sidebar-link">Users</a>
      <a href="/settings"  class="wb-sidebar-link">Settings</a>
    </nav>
  </aside>

  <!-- Main body -->
  <div class="wb-dashboard-body">

    <!-- Top navigation bar -->
    <header class="wb-navbar">
      <button class="wb-btn wb-btn-ghost wb-btn-sm"
              data-wb-toggle="sidebar">☰</button>
      <div style="flex:1"></div>
      <span class="wb-avatar wb-avatar-sm">JD</span>
    </header>

    <!-- Scrollable content -->
    <main class="wb-dashboard-main">
      <div class="wb-container">
        <h1>Page title</h1>
      </div>
    </main>

  </div>
</div>

Sidebar collapse (mobile)

The sidebar hides on mobile. data-wb-toggle="sidebar" on any button opens it with a backdrop overlay. WBSidebar handles this automatically.

<!-- Hamburger in navbar -->
<button data-wb-toggle="sidebar">☰ Menu</button>

<!-- Or JS -->
WBSidebar.open();
WBSidebar.close();

Sidebar nav groups

Use wb-nav-group for collapsible sections within the sidebar.

<nav class="wb-sidebar-nav">
  <a href="#" class="wb-sidebar-link is-active">Dashboard</a>

  <div class="wb-nav-group">
    <button class="wb-nav-group-trigger">
      Users
      <svg class="wb-nav-group-chevron" ...>...</svg>
    </button>
    <div class="wb-nav-group-body">
      <a href="#" class="wb-sidebar-link">All Users</a>
      <a href="#" class="wb-sidebar-link">Roles</a>
      <a href="#" class="wb-sidebar-link">Permissions</a>
    </div>
  </div>

  <a href="#" class="wb-sidebar-link">Settings</a>
</nav>

<!-- Accordion mode: closes siblings when one group opens -->
<nav class="wb-sidebar-nav" data-wb-nav-group-accordion>
  ...
</nav>

Auth Shell

Centered card layout for login, register, and password reset pages.

wb-auth (full screen)
↓ centered
wb-auth-card
<div class="wb-auth">
  <div class="wb-auth-card">

    <div class="wb-auth-logo">
      <!-- Logo here -->
    </div>

    <h1 class="wb-auth-title">Sign in to your account</h1>
    <p class="wb-auth-subtitle">Welcome back. Enter your credentials.</p>

    <form class="wb-auth-form">
      <div class="wb-field">
        <label class="wb-label">Email</label>
        <input type="email" class="wb-input" autocomplete="email">
      </div>
      <div class="wb-field">
        <label class="wb-label">Password</label>
        <input type="password" class="wb-input" autocomplete="current-password">
      </div>
      <button type="submit" class="wb-btn wb-btn-primary" style="width:100%">
        Sign in
      </button>
    </form>

    <p class="wb-auth-footer">
      Don't have an account? <a href="/register">Sign up</a>
    </p>

  </div>
</div>

Settings Shell

Two-column layout for settings pages — a sticky left nav and a content area. Often used inside the dashboard shell's main content area.

wb-settings-nav
(sticky)
wb-settings-body
<div class="wb-settings-shell">

  <!-- Left nav -->
  <nav class="wb-settings-nav">
    <a href="#profile"   class="wb-settings-nav-link is-active">Profile</a>
    <a href="#security"  class="wb-settings-nav-link">Security</a>
    <a href="#billing"   class="wb-settings-nav-link">Billing</a>
    <a href="#team"      class="wb-settings-nav-link">Team</a>
  </nav>

  <!-- Content -->
  <div class="wb-settings-body">

    <section class="wb-settings-section" id="profile">
      <h2 class="wb-settings-title">Profile</h2>
      <p class="wb-settings-desc">Manage your public profile information.</p>
      <!-- form fields -->
    </section>

    <section class="wb-settings-section" id="security">
      <h2 class="wb-settings-title">Security</h2>
      <p class="wb-settings-desc">Update your password and 2FA settings.</p>
      <!-- form fields -->
    </section>

  </div>
</div>

Content Shell

Single-column layout with a sticky header, scrollable body, and optional footer. Useful for detail pages, forms, and full-page editors inside the dashboard main area.

wb-content-header (sticky)
wb-content-body (scrollable)
wb-content-footer (optional)
<div class="wb-content-shell">

  <div class="wb-content-header">
    <h2 class="wb-content-title">Edit user</h2>
    <div class="wb-content-actions">
      <button class="wb-btn wb-btn-ghost wb-btn-sm">Discard</button>
      <button class="wb-btn wb-btn-primary wb-btn-sm">Save changes</button>
    </div>
  </div>

  <div class="wb-content-body">
    <!-- form / content here -->
  </div>

  <div class="wb-content-footer">
    <!-- optional pagination / status -->
  </div>

</div>

Container & Section

Basic content-width constraint and vertical spacing helpers.

ClassDescription
wb-containerMax-width container (--wb-content-w, default 1200px), centered with auto margins
wb-container-smNarrow container (--wb-content-sm, default 720px)
wb-sectionVertical padding block (--wb-s10 top/bottom)
wb-stackFlex column with gap for stacking form fields or cards
<!-- Constrain content width -->
<div class="wb-container">
  ...
</div>

<!-- Narrow content (forms, article) -->
<div class="wb-container-sm">
  ...
</div>

<!-- Vertical section spacing -->
<section class="wb-section">
  <div class="wb-container">
    ...
  </div>
</section>

<!-- Stack layout -->
<div class="wb-stack">
  <div class="wb-field">...</div>
  <div class="wb-field">...</div>
  <button class="wb-btn wb-btn-primary">Submit</button>
</div>

Toolbar

Horizontal bar for page-level actions — typically placed between the page title and the content table.

<div class="wb-toolbar">
  <div class="wb-toolbar-start">
    <h2 class="wb-toolbar-title">Users <span class="wb-badge">248</span></h2>
  </div>
  <div class="wb-toolbar-end">
    <button class="wb-btn wb-btn-outline wb-btn-sm">Export</button>
    <button class="wb-btn wb-btn-primary wb-btn-sm">+ New user</button>
  </div>
</div>

<!-- Bulk action bar (shown when rows are selected) -->
<div class="wb-toolbar wb-toolbar-bulk">
  <span>3 selected</span>
  <button class="wb-btn wb-btn-danger wb-btn-sm">Delete selected</button>
</div>

Command Palette

Full-screen search/command overlay triggered by Cmd+K / Ctrl+K. Register it once; WebBlocks handles keyboard, search, and navigation.

<!-- HTML -->
<div class="wb-cmd-backdrop" id="my-cmd">
  <div class="wb-cmd-dialog">
    <div class="wb-cmd-header">
      <svg class="wb-cmd-search-icon">...</svg>
      <input type="text" class="wb-cmd-input" placeholder="Search or type a command…">
      <kbd class="wb-cmd-esc">Esc</kbd>
    </div>
    <div class="wb-cmd-results">
      <div class="wb-cmd-group">
        <div class="wb-cmd-group-label">Pages</div>
        <a href="/dashboard" class="wb-cmd-result">Dashboard</a>
        <a href="/users"     class="wb-cmd-result">Users</a>
        <a href="/settings"  class="wb-cmd-result">Settings</a>
      </div>
    </div>
  </div>
</div>

<!-- JS -->
<script>
WBCommandPalette.register('#my-cmd');
</script>

See the JavaScript API page for the full register() options including onSearch.

Esc