
A documentation-site header with a collapsing secondary row, breadcrumb promotion, ⌘K search and version switching
@shadcnstore
import { Navbar5 } from '@/components/blocks/marketing/navbars/navbar-5/components/navbar-5'
/**
* Nav links, breadcrumb, versions and the search index live in `data/navbar-5-docs.ts`.
*
* The header is `sticky`, so `html { scroll-padding-top }` should clear it for in-page anchors —
* same contract as `navbar-3`.
*
* The page below is deliberately a real documentation article rather than a spacer. Everything
* this header does — the secondary row collapsing, the breadcrumb being promoted into the bar,
* the search box shrinking to an icon — only happens once you are scrolled past the top, so a
* placeholder page shows none of it and the block reads as a plain bar.
*/
export default function Page() {
return (
<div className="flex min-h-svh w-full flex-col">
<Navbar5 />
<main className="mx-auto w-full max-w-3xl flex-1 px-4 py-12 sm:px-6">
<p className="text-muted-foreground font-mono text-xs tracking-[0.14em] uppercase">API · Production data</p>
<h1 className="mt-3 text-3xl font-semibold tracking-tight sm:text-4xl">Production data</h1>
<p className="text-muted-foreground mt-4 text-lg text-pretty">
Read interval-level generation, consumption and export figures for any site on the account. Scroll and the
header condenses: the section row folds away and the breadcrumb moves up into the bar.
</p>
<div className="mt-10 flex flex-col gap-10">
{[
{
heading: 'Authentication',
body: 'Every request is authenticated with a site-scoped key. Keys are issued per environment and never expire on their own — rotate them from the dashboard, and revoke the previous key once traffic has moved across.',
code: 'curl https://api.solaris.dev/v3/sites/ste_8f21/production \\\n -H "Authorization: Bearer sk_live_..."',
},
{
heading: 'Intervals',
body: 'Readings are returned at five-minute resolution for the last 90 days and hourly beyond that. Ask for a window wider than a year and the response is downsampled to daily totals rather than truncated.',
code: 'GET /v3/sites/:id/production?from=2026-08-01&to=2026-08-17&resolution=hour',
},
{
heading: 'Gaps and backfill',
body: 'An inverter that loses connectivity leaves a gap rather than a zero, so a missing reading is never mistaken for a night. When the device reconnects it backfills, and the affected intervals are re-emitted on the webhook.',
code: '{\n "interval": "2026-08-14T11:05:00Z",\n "watt_hours": null,\n "state": "missing"\n}',
},
{
heading: 'Rate limits',
body: 'Sixty requests a minute per key, burst to a hundred. The remaining budget is on every response, and a 429 carries the seconds to wait — read it rather than backing off blindly.',
code: 'X-RateLimit-Remaining: 41\nX-RateLimit-Reset: 27',
},
].map(section => (
<section key={section.heading} className="flex flex-col gap-3">
<h2 className="text-xl font-semibold tracking-tight">{section.heading}</h2>
<p className="text-muted-foreground text-pretty">{section.body}</p>
<pre className="bg-muted/60 border-border overflow-x-auto rounded-lg border p-4 font-mono text-xs leading-relaxed">
{section.code}
</pre>
</section>
))}
</div>
</main>
</div>
)
}

























