---
name: srvo chrome canonical v1
status: active
hosted_at: https://assets.srvo.io/chrome/v1/
---

# srvo chrome v1 — design contract

Single source of truth for the persistent header + footer + burger nav across srvo-family sites. Sites import this CSS+JS pair; markup follows the contract below.

## What this is

- `chrome.css` — header, footer, burger styles. CSS variables let each site set accent colors.
- `chrome.js` — burger toggle behavior. Self-initializing; idempotent.
- This file — markup contract every consuming site must follow.

## How to consume (any site)

Add to `<head>`:

```html
<link rel="stylesheet" href="https://assets.srvo.io/chrome/v1/chrome.css">
```

Add before `</body>`:

```html
<script src="https://assets.srvo.io/chrome/v1/chrome.js" defer></script>
```

Optional `:root` overrides (only if the site's brand differs from the srvo defaults):

```css
:root {
  --warm: #da9123;        /* primary accent */
  --warm2: #c47e18;       /* hover accent */
  --text: #1a1916;
  --bg: #f5f2ec;
  --border: #e5dfd2;
  --muted: #6b6860;
}
```

## Required markup

### Header

```html
<nav class="srvo-chrome">
  <a href="/" class="nav-logo">
    <img src="/srvo-mark.png" alt="" class="nav-logo-mark">
    <span class="nav-logo-text">{wordmark}</span>
  </a>

  <ul class="nav-links" id="primary-nav">
    <li><a href="#section-a">section a</a></li>
    <li><a href="#section-b">section b</a></li>
    <!-- Optional submenu pattern -->
    <li class="nav-item has-submenu">
      <a href="/parent">parent</a>
      <ul class="nav-submenu">
        <li class="nav-submenu-heading">group label</li>
        <li><a href="/child">child link</a></li>
      </ul>
    </li>
  </ul>

  <!-- Optional right-side block: CTA + burger; or just burger -->
  <div class="nav-right">
    <a href="https://cal.com/srvocontrol/discovery-call" target="_blank" rel="noopener" class="nav-cta">Book a Call</a>
    <button class="nav-toggle" type="button" aria-label="Toggle menu" aria-expanded="false" aria-controls="primary-nav">
      <span class="nav-toggle-line"></span>
      <span class="nav-toggle-line"></span>
      <span class="nav-toggle-line"></span>
    </button>
  </div>
</nav>
```

If no CTA: skip `.nav-right` and put the toggle button directly inside `<nav>` after `<ul>`.

### Footer

```html
<footer class="srvo-chrome">
  <div class="footer-left">
    <span class="footer-brand">{site} by <a href="https://srvo.io" target="_blank" rel="noopener">srvo</a></span>
    <span class="footer-links">
      <a href="/page-a">Page A</a>
      <a href="/page-b">Page B</a>
    </span>
  </div>
  <div class="footer-center">
    <a href="https://srvo.io/consulting" target="_blank" rel="noopener">Consulting</a>
    <a href="https://srvo.io/control-systems" target="_blank" rel="noopener">Control systems</a>
    <a href="https://www.linkedin.com/company/srvo-control" target="_blank" rel="noopener">LinkedIn</a>
  </div>
  <p class="footer-copyright">© 2026 srvo · New York, NY</p>
</footer>
```

`footer-left` slot is per-site (brand + site-specific page links).
`footer-center` is canonical srvo cross-promotion — keep these three identical across all srvo-family sites.
`footer-copyright` is canonical wording.

## Hard rules

1. **Class is `srvo-chrome`** on both `<nav>` and `<footer>`. The CSS+JS only target this class so they can't conflict with site-specific styles.
2. **No site-specific overrides of `.nav-toggle`, `.nav-toggle-line`, or burger animation.** If you need a different animation, ship a chrome v2 instead of overriding.
3. **No personal PII in the chrome surface.** "anthony" / personal-LinkedIn / personal email never appear in nav or footer. (See CLAUDE.md "Public-site PII".)
4. **Wordmark casing is lowercase** for srvo / kit / mycelium / prism / signal. Title-Case is OK as a noun in body content but not in the chrome wordmark slot. (See `feedback_wordmark_casing.md`.)
5. **Cross-domain links** in `.footer-center` and any cross-product `.nav-submenu` items use `target="_blank" rel="noopener"`. (See `feedback_cross_subdomain_new_tab.md`.)
6. **Each site keeps its own logomark.** The `<img class="nav-logo-mark">` `src` is per-site (e.g. `signal-line-art-transparent.png` for signal, `casette-logo-transparent.png` for prism, `srvo-mark.png` only for srvo.io itself). NEVER swap a site's logomark to `srvo-mark.png` during migration — it's a brand regression. The chrome canonical only governs *layout + behavior*, not brand assets.

## Versioning

The hosted path is `assets.srvo.io/chrome/v1/`. When chrome behavior changes substantially (new markup contract, breaking class changes), ship `v2/` and have sites opt in by updating the URL. Both versions can coexist indefinitely — old sites pin to v1, new sites move to v2.

Bug fixes / non-breaking improvements ship in-place to `v1/` without a version bump.

## Site-specific exceptions

- **kit.srvo.io** — does NOT consume canonical chrome. Reason: auth-aware nav (5-link cluster vs Sign-in pill) doesn't fit the contract. Visual contract is mirrored in kit's own `style.css`. Revisit when kit's auth flow stabilizes.
- **prism.srvo.io receiver** — Python landing.html via `~/docker/msgflow/capture-receiver/`. Consumes via `<link>` like static-HTML sites.

## Companion artifacts

- Memory: `~/.claude/projects/-home-anthony/memory/feedback_check_layout_context_before_copying.md` — why we set `display: flex` explicitly in mobile @media.
- Project doc: `~/vaults/system/projects/srvo-chrome-canonical.md` — long-form vision, decision history, planned v2.
