Skip to main content
Clever Ops

Progress Spine Navbar

A reading navbar for long pages, a hairline progress spine under the bar fills as you scroll, section labels light up as you pass them, and the bar keeps out of the way.

Preview & code

Loading Progress Spine Navbar preview

Installation

pnpm dlx shadcn@latest add @cleverui/navbar-progress-spine

Requires the @cleverui registry in your components.json, a one-off, two-line setup.

Usage

tsx
import { NavbarProgressSpine } from '@/components/blocks/navbar-progress-spine'
Exampletsx
import { NavbarProgressSpine } from '@/components/blocks/navbar-progress-spine'

const SECTIONS = [
  { id: 'abstract', label: 'Abstract' },
  { id: 'architecture', label: 'Architecture' },
  { id: 'latency', label: 'Latency budget' },
  { id: 'rollout', label: 'Rollout' },
  { id: 'appendix', label: 'Appendix' },
] as const

export default function NavbarProgressSpineDemo() {
  return (
    <div className="min-h-[320vh]">
      <NavbarProgressSpine
        brand={
          <span className="inline-flex items-baseline gap-1.5">
            Ledger
            <span className="font-mono text-[10px] uppercase tracking-[0.2em] text-muted-foreground">
              RFC
            </span>
          </span>
        }
        sections={[...SECTIONS]}
        cta={{ label: 'Share draft', href: '#share' }}
      />

      <article className="mx-auto max-w-2xl px-4 pt-28 sm:px-6 sm:pt-32">
        <p className="font-mono text-[11px] uppercase tracking-[0.2em] text-muted-foreground sm:text-xs">
          Engineering · RFC-1842
        </p>
        <h1 className="mt-4 text-balance text-3xl font-semibold tracking-tight sm:text-4xl">
          Streaming config sync for multi-region control planes
        </h1>
        <p className="mt-4 text-base leading-relaxed text-muted-foreground">
          Scroll the page, the spine under the bar tracks progress, section labels light as you pass
          them, and the bar tucks away on scroll-down so it does not fight the prose.
        </p>

        {SECTIONS.map((section, i) => (
          <section key={section.id} id={section.id} className="scroll-mt-20 pt-16 sm:pt-20">
            <p className="font-mono text-[11px] uppercase tracking-[0.2em] text-muted-foreground sm:text-xs">
              {String(i + 1).padStart(2, '0')}
            </p>
            <h2 className="mt-2 text-2xl font-semibold tracking-tight">{section.label}</h2>
            <div className="mt-6 space-y-4 text-sm leading-relaxed text-muted-foreground sm:text-base">
              {i === 0 && (
                <>
                  <p>
                    Control planes currently poll region agents every 30 seconds. Under load, that
                    cadence produces stale routes and a 2–4 minute recovery window after a partial
                    outage. This RFC proposes a bidirectional stream with ordered snapshots.
                  </p>
                  <p>
                    Goals: sub-second propagation of config deltas, resumable sessions after reconnect,
                    and a hard cap of 12 KB/s average bandwidth per agent.
                  </p>
                </>
              )}
              {i === 1 && (
                <>
                  <p>
                    Each region runs a thin edge proxy that holds an open gRPC stream to the coordinator.
                    Snapshots are versioned with a monotonic epoch; deltas carry a causal vector so
                    agents can reject out-of-order frames without a full resync.
                  </p>
                  <p>
                    The coordinator shards by tenant hash. Failover promotes a warm standby using the
                    last acknowledged epoch from a majority of agents in that shard.
                  </p>
                </>
              )}
              {i === 2 && (
                <>
                  <p>
                    End-to-end budget from commit to agent apply is 800 ms at p99 inside a region and
                    1.6 s across continents. Encoding stays protobuf; compression is zstd level 3 only
                    when a frame exceeds 4 KB.
                  </p>
                  <p>
                    Backpressure: if an agent lags more than 32 frames, the stream downgrades to
                    snapshot-only mode until the catch-up window closes.
                  </p>
                </>
              )}
              {i === 3 && (
                <>
                  <p>
                    Phase 1 ships behind a tenant flag for internal services. Phase 2 dual-writes poll
                    and stream for two weeks, then cuts poll for tenants under 500 agents. Phase 3
                    retires the poll path.
                  </p>
                  <p>
                    Rollback is a single coordinator flag that re-enables poll and drains streams over
                    60 seconds.
                  </p>
                </>
              )}
              {i === 4 && (
                <>
                  <p>
                    Open questions: whether fan-out should use a dedicated pub/sub plane for tenants
                    above 2,000 agents, and how we surface epoch lag in the existing ops dashboard.
                  </p>
                  <p>
                    References: internal design notes on vector clocks (DN-441), the edge-proxy
                    reliability report from Q1, and the bandwidth study from the Tokyo PoP trial.
                  </p>
                </>
              )}
            </div>
            {/* Structural filler so sections are long enough to track */}
            <div className="mt-10 space-y-3" aria-hidden="true">
              {Array.from({ length: 3 }, (_, j) => (
                <div key={j} className="h-16 rounded-2xl border border-border/40 bg-muted/40" />
              ))}
            </div>
          </section>
        ))}
      </article>
    </div>
  )
}

API reference

NavbarProgressSpine accepts the following props.

PropTypeDefaultDescription
brandReact.ReactNode'CleverUI'
brandHrefstring'/'
sections*{ label: string; id: string }[]in-page anchors tracked by scroll position
cta{ label: string; href: string }

…plus everything from Omit<React.HTMLAttributes<HTMLElement>, 'onDrag' | 'onDragStart' | 'onDragEnd' | 'onAnimationStart'>: className, event handlers, aria attributes and the rest pass straight through.

Frequently asked questions

How do I install the Progress Spine Navbar component?

Register the @cleverui registry in your components.json ("@cleverui": "https://cleverops.com.au/r/{name}.json"), then run `npx shadcn@latest add @cleverui/navbar-progress-spine`. The shadcn CLI copies the source into your project, you own the code from that point. You can also copy the source directly from this page.

What dependencies does Progress Spine Navbar require?

Progress Spine Navbar uses motion on top of React and Tailwind CSS. You don't need to install it manually, the shadcn CLI resolves and installs npm dependencies automatically when you add the component.

Can I theme Progress Spine Navbar to match my brand?

Yes. The component is styled entirely with Tailwind utilities over standard design tokens (primary, background, muted, border), so it inherits your existing shadcn/ui theme automatically. Change your CSS variables and the component follows, no source edits needed for palette, radius, or fonts.

Want this built for you?

CleverUI is built by the Clever Ops web team. If you'd rather ship a hand-coded, fast, custom website than assemble one, we build them for Australian businesses every week.

Explore web development services