Page

Summary

The outside-in anatomy of a complete Soma page. The shell frames every screen (navbar, sidebar, content region), and inside the content region a page composes top-to-bottom: an optional breadcrumb trail, the page header (title, description, actions), the content itself, and the footer for small print. The content takes one of two shapes: widgets on the grid (on Soma's tinted page, widgets are the surfaces), or a page panel: one full-width rounded translucent card holding the whole content area, with optional nav and sidebar cells, for pages that read as a single document rather than a dashboard. Landmark roles come from the elements: the navbar in a <header> (banner), the content in <main>, the footer in <footer> (contentinfo). Screen-reader users jump between them directly.

When to use

RegionRole
.soma-shellRoot grid holding navbar + sidebar + content. One per document.
<header class="soma-navbar">The banner landmark: brand, global nav, search, actions (Navbar; live in the Shell demo).
<aside class="soma-sidebar">App navigation; collapses below 900px.
<main class="soma-shell-content">The main landmark. Width modes and the grid are on Page layout.
.soma-page-header / .soma-page-titleThe page's own heading block (Page header).
.soma-page-panelThe main content surface: a full-width card between page header and footer, when the content is one document rather than a widget dashboard.
<footer class="soma-footer">Small print at the end of the content: link list + copyright in .soma-footer-body.

Examples

Entire page

The full skeleton at reduced scale — navbar (brand, global nav, actions; full anatomy on Navbar), sidebar, page header, content, footer:

Nware Portal
an

Dashboard

Everything running on Project X.

Deployments 50
Services 12

Page panel

The content as one full-width card (page header above, footer below):

Release notes

0.1.0 — the first release: the complete component substrate, three themes, RTL, and 42 locale packs. Content on a panel reads as one document, with no widget seams.

Panel with nav and sidebar

Optional cells compose in any combination and stack on narrow viewports:

General

The content cell flexes to fill whatever the nav and sidebar leave; all three share the panel's surface with hairline dividers between them.

Entire page: complete document

The same page as the demo above, as a complete document you can save and open. It consumes the CDN build, so there is no install and no build step. Swap the pinned /cdn/0.1.0/… paths for /cdn/soma.css / /cdn/soma.umd.cjs to track the latest release instead.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Dashboard — Nware Portal</title>
    <link rel="stylesheet" href="https://soma.nware.io/cdn/0.1.0/soma.css" />
    <script src="https://soma.nware.io/cdn/0.1.0/soma.umd.cjs"></script>
  </head>
  <body>
    <div class="soma-shell">
      <header class="soma-navbar">
        <span class="soma-navbar-brand">Nware <strong>Portal</strong></span>
        <nav class="soma-navbar-nav" aria-label="Primary">
          <ul>
            <li><a href="#" aria-current="page">Dashboard</a></li>
            <li><a href="#">Deployments</a></li>
          </ul>
        </nav>
        <div class="soma-navbar-secondary">
          <button class="soma-navbar-action" aria-label="Notifications">
            <span class="soma-icon soma-icon-bell"></span>
          </button>
          <span class="soma-avatar soma-avatar-small soma-avatar-initials">an</span>
        </div>
      </header>
      <aside class="soma-sidebar">
        <nav class="soma-sidebar-nav" aria-label="Main">
          <span class="soma-sidebar-heading">Apps</span>
          <a class="soma-sidebar-link soma-active" href="#">Dashboard</a>
          <a class="soma-sidebar-link" href="#">Deployments</a>
        </nav>
      </aside>
      <main class="soma-shell-content">

        <div class="soma-page-header">
          <div class="soma-page-header-main">
            <h1 class="soma-page-title">Dashboard</h1>
            <p>Everything running on Project X.</p>
          </div>
          <div class="soma-page-header-actions">
            <button class="soma-button soma-button-primary">Deploy</button>
          </div>
        </div>

        <div class="soma-grid">
          <section class="soma-widget soma-col-6">
            <div class="soma-widget-body">
              <div class="soma-stat">
                <span class="soma-stat-label">Deployments</span>
                <span class="soma-stat-value">50</span>
              </div>
            </div>
          </section>
          <section class="soma-widget soma-col-6">
            <div class="soma-widget-body">
              <div class="soma-stat">
                <span class="soma-stat-label">Services</span>
                <span class="soma-stat-value">12</span>
              </div>
            </div>
          </section>
        </div>

        <footer class="soma-footer">
          <div class="soma-footer-body">
            <ul>
              <li><a href="#">Docs</a></li>
              <li><a href="#">Status</a></li>
              <li>v0.1.0</li>
            </ul>
            <p>© 2026 Nware Labs · Apache-2.0</p>
          </div>
        </footer>

      </main>
    </div>
  </body>
</html>

HTML

The complete document skeleton. This is what a server-rendered portal page emits:

<body>
  <div class="soma-shell">
    <header class="soma-navbar">…</header>
    <aside class="soma-sidebar">…</aside>
    <main class="soma-shell-content">

      <nav class="soma-breadcrumbs" aria-label="Breadcrumbs">…</nav>

      <div class="soma-page-header">
        <div class="soma-page-header-main">
          <h1 class="soma-page-title">Dashboard</h1>
        </div>
        <div class="soma-page-header-actions">…</div>
      </div>

      <div class="soma-grid">
        <section class="soma-widget soma-col-6">…</section>
        <section class="soma-widget soma-col-6">…</section>
      </div>

      <footer class="soma-footer">
        <div class="soma-footer-body">
          <ul><li><a href="…">Docs</a></li><li>v0.1.0</li></ul>
          <p>© 2026 Nware Labs</p>
        </div>
      </footer>

    </main>
  </div>
</body>

A <footer> inside <main> is deliberately not a landmark — the small print belongs to the page's content flow. Put the footer element directly inside <body> instead when it should be a jump-target contentinfo landmark of its own.

The panel-based variant swaps the widget grid for one content card; nav and sidebar cells are optional and compose in any combination:

<main class="soma-shell-content">

  <div class="soma-page-header">…</div>

  <div class="soma-page-panel">
    <nav class="soma-page-panel-nav soma-nav-vertical" aria-label="Section">
      <a class="soma-nav-item" aria-current="page" href="…">General</a>
      <a class="soma-nav-item" href="…">Members</a>
    </nav>
    <section class="soma-page-panel-content">
      …the page's document content…
    </section>
    <aside class="soma-page-panel-sidebar">
      …related material…
    </aside>
  </div>

  <footer class="soma-footer">…</footer>

</main>

CSS classes

ClassEffect
.soma-page-panelThe full-width content card: translucent widget surface, rounded corners, soft shadow. Cells inside lay out side by side and stack below 768px.
.soma-page-panel-nav240px navigation cell with an inline-end divider. Combine with .soma-nav-vertical for the standard link list.
.soma-page-panel-contentThe flexing main cell. It takes whatever the nav and sidebar leave.
.soma-page-panel-sidebar35% sidebar cell with an inline-start divider; narrows to 30% when a nav cell is present.
.soma-page-panel-itemPadding-free flexing cell for full-bleed content (tables, media).
.soma-footerMuted, centred small print with generous top spacing.
.soma-footer-bodyThe content block: a <ul> renders as an inline, middot-separated link list; paragraphs stack below it.
Shell / header / layout classesDocumented on their own pages: Shell, Page header, Page layout, Widgets.

JavaScript

None — the page skeleton is pure CSS. Auto-init wires whatever interactive components the page contains (sidebar groups, dropdown triggers, messages, …) on DOMContentLoaded.