",
+ "css": ".ds-chrome { font-family: ui-sans-serif, system-ui, sans-serif; text-align: center; } .ds-wordmark { display: inline-block; padding: 1.5rem 0; font-size: 1.875rem; font-weight: 700; letter-spacing: -0.025em; color: oklch(37.2% 0.044 257.287); text-decoration: none; } .ds-footer { padding-top: 2rem; font-size: 0.875rem; line-height: 1.429; color: oklch(55.4% 0.046 257.417); } .ds-footer > div + div { margin-top: 0.75rem; } .ds-footer-link { display: inline-flex; align-items: center; gap: 0.375rem; color: inherit; text-decoration: none; transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1); } .ds-footer-link:hover { color: oklch(51.1% 0.262 276.966); text-decoration: underline; } .ds-footer-link:focus-visible { outline: none; box-shadow: 0 0 0 2px oklch(58.5% 0.233 277.117); border-radius: 0.25rem; }"
+ }
+ ],
+ "narrative": {
+ "northStar": "The Arrivals Board",
+ "overview": "httphq is a board you watch, not a console you operate. Requests land at the top of the stream, get colour-coded by class, and expire. The whole visual system is built so a developer working in another window can glance over and read the board — status first, detail on approach — then go back to what they were doing. Everything that isn't the arriving traffic is chassis: a slate field, white panels, hairline seams, and exactly one indigo control per view.\n\nThe register is precise, quiet and fast. Restraint here is not minimalism as a style choice; it is what makes the board readable. The interface never claims more than it can prove, never decorates a value it captured, and never puts a second thing in colour next to a method badge. Type is system-native and loads instantly — there is no webfont anywhere, and that is a feature of a tool whose entire promise is being usable within seconds of arrival.\n\nFour looks are rejected outright, and all four are confirmed prohibitions rather than taste: marketing-SaaS gloss (gradient meshes, floating mockups, testimonial carousels), the dense enterprise console (dark chrome, packed toolbars, panels nested in panels), terminal cosplay (green-on-black, ASCII framing, faux-CRT effects), and playful dev-tool mascotry (cartoon characters, blob illustrations, jokey empty states). Monospace appears throughout, but as evidence handling — never as costume.",
+ "keyCharacteristics": [
+ "A slate-50 field with white panels; hairline seams, not shadows, make the edges",
+ "One indigo action per view; every other control is a slate outline or bare text",
+ "Full-spectrum colour is spent entirely on the seven HTTP-method badges",
+ "Everything the client sent is monospace; everything httphq says is sans",
+ "A single breakpoint (40rem) governs the entire responsive system",
+ "Liveness is signalled in the browser chrome — tab title count, favicon dot — not by animating the page"
+ ],
+ "rules": [
+ {
+ "name": "The Borrowed Palette Rule",
+ "body": "The four syntax colours are a vendored theme, not system tokens. Never restyle individual hljs-* classes to bring them closer to the slate-and-indigo world — either swap the whole theme or leave it alone. A half-retinted syntax palette reads as a bug in the highlighter.",
+ "section": "colors"
+ },
+ {
+ "name": "The Board Rule",
+ "body": "Full-spectrum colour belongs to the method badge and nothing else. If a new element wants blue, emerald, amber, violet or sky, the answer is no — that vocabulary means \"this is the class of traffic that arrived\", and every additional user dilutes the only colour-coding on the page.",
+ "section": "colors"
+ },
+ {
+ "name": "The One Indigo Rule",
+ "body": "At most one indigo-filled control exists per view. On the home page it is Create endpoint; on the endpoint page it is Send; on contact it is Send message. Everything else that is actionable is a slate outline or bare label ink that turns indigo on hover.",
+ "section": "colors"
+ },
+ {
+ "name": "The Wash-and-Ink Rule",
+ "body": "Coloured chips are always a ~97%-lightness wash carrying a ~50%-lightness ink of the same hue. There are no saturated fills with white text anywhere except the single primary button.",
+ "section": "colors"
+ },
+ {
+ "name": "The Rose Is Removal Rule",
+ "body": "Rose means something is about to be destroyed — the Delete all button, the per-request delete hover, the DELETE badge. Its one sanctioned exception is the unread dot painted onto the favicon, where it means \"traffic landed while you were away\". Rose is never used for form validation or generic error text.",
+ "section": "colors"
+ },
+ {
+ "name": "The Evidence Rule",
+ "body": "Anything the user's client actually sent is set in monospace; anything httphq says about it is set in sans. A captured value never appears in sans, and interface copy never borrows mono for flavour.",
+ "section": "typography"
+ },
+ {
+ "name": "The Two Uppercase Rule",
+ "body": "Uppercase exists in exactly two places: field labels and method badges. Both are 0.75rem with +0.025em tracking. Nothing else in the system is uppercased — not buttons, not navigation, not headings.",
+ "section": "typography"
+ },
+ {
+ "name": "The Hairline-First Rule",
+ "body": "If a surface needs to be distinguished, give it a hairline seam before you give it a shadow. A panel with no border and a heavier shadow is wrong in this system even when it looks fine in isolation.",
+ "section": "elevation"
+ },
+ {
+ "name": "The Shadow-Is-A-Response Rule",
+ "body": "Nothing above the resting whisper exists at rest. shadow-md appears only as a hover response; there is no shadow-lg or above anywhere, and adding one would break the flatness the board depends on.",
+ "section": "elevation"
+ },
+ {
+ "name": "The Three Radii Rule",
+ "body": "0.25 for data, 0.375 for controls, 0.5 for panels. A new element takes the radius of the category it belongs to, not the radius that looks best next to its neighbour.",
+ "section": "shapes"
+ },
+ {
+ "name": "The Dashed-Means-Waiting Rule",
+ "body": "A dashed border means a container that is correctly empty and expecting content. It is used once — the waiting state — and must never be borrowed for a disabled, errored, or drop-target surface.",
+ "section": "shapes"
+ }
+ ],
+ "dos": [
+ "Do put every new surface on the board field with a panel-white fill, a 1px hairline seam, and the resting whisper shadow. That trio is the system's default surface.",
+ "Do set anything the client sent in monospace at 0.75rem, and anything httphq says in sans.",
+ "Do give a new region an uppercase 0.75rem/500/+0.025em label ink heading, and separate its rows with hairline-faint rules instead of nesting another bordered box.",
+ "Do pair outline: none with a visible focus-visible ring every single time — 2px signal-indigo-lit plus a white offset ring on buttons, 1px focus-indigo plus a border shift on fields.",
+ "Do take the radius from the category: 0.25rem for data, 0.375rem for controls, 0.5rem for panels.",
+ "Do design to the 40rem breakpoint alone, stacking below it and going horizontal above it.",
+ "Do keep icons at 24×24 viewBox, stroke-width 2, fill none, aria-hidden, beside a text label.",
+ "Do signal background activity in the tab title and favicon rather than in the page."
+ ],
+ "donts": [
+ "Don't spend blue, emerald, amber, violet or sky on anything but a method badge. That spectrum is the traffic classification and nothing else.",
+ "Don't add a second indigo-filled button to a view. One primary action per screen, every other control outlined or bare.",
+ "Don't introduce a saturated fill with white text; coloured chips are a ~97% wash with a ~50% ink of the same hue.",
+ "Don't use rose for validation errors or generic failure text — rose means removal, plus the unread favicon dot.",
+ "Don't reach past the hover lift for elevation. There is no shadow-lg in this system, and a borderless card with a bigger shadow is wrong here even when it looks fine alone.",
+ "Don't add a webfont. The system stack is a performance commitment on a tool whose promise is a working URL in seconds.",
+ "Don't add a second breakpoint. If a layout can't resolve with sm alone, simplify the layout.",
+ "Don't uppercase anything that isn't a field label or a method badge.",
+ "Don't borrow the dashed border for disabled, errored, or drop-target surfaces; it means \"correctly empty, expecting content\".",
+ "Don't animate the page to announce arrivals, auto-scroll the stream, or add a second looping animation beside the waiting ellipsis.",
+ "Don't half-migrate the accent toward the mark's periwinkle. Until that convergence is done deliberately across the mark, favicons and UI together, signal-indigo remains the interface accent everywhere."
+ ]
+ }
+}
diff --git a/.impeccable/live/config.json b/.impeccable/live/config.json
new file mode 100644
index 0000000..d9ceb1b
--- /dev/null
+++ b/.impeccable/live/config.json
@@ -0,0 +1,6 @@
+{
+ "files": ["src/views/layouts/main.html"],
+ "insertBefore": "