From 69b039769130a77871b4a4ca09027a7797a8387b Mon Sep 17 00:00:00 2001 From: 0thernet Date: Sun, 27 Sep 2026 18:25:41 -0400 Subject: [PATCH 1/6] Recover quiet Gobstopper homepage and mobile layout --- site/app/_components/site-chrome.tsx | 30 +- site/app/globals.css | 189 +---------- site/app/hero-field.tsx | 98 ------ site/app/hero-graphic.tsx | 153 --------- site/app/layout.tsx | 2 +- site/app/page.tsx | 456 +++++++++++++-------------- 6 files changed, 235 insertions(+), 693 deletions(-) delete mode 100644 site/app/hero-field.tsx delete mode 100644 site/app/hero-graphic.tsx diff --git a/site/app/_components/site-chrome.tsx b/site/app/_components/site-chrome.tsx index b638a307..2185597e 100644 --- a/site/app/_components/site-chrome.tsx +++ b/site/app/_components/site-chrome.tsx @@ -17,6 +17,14 @@ import { supportProfile } from "../support-profile"; // eslint-disable-next-line @next/next/no-img-element const productMark = ; +const headerLinks: readonly { href: string; label: string; section?: string }[] = [ + { href: "/docs", label: "Docs", section: "/docs" }, + { href: "/benchmarks", label: "Benchmarks", section: "/benchmarks" }, + { href: "/compare/claude-code-compact", label: "Compare", section: "/compare" }, + { href: "/blog", label: "Blog", section: "/blog" }, + { href: GITHUB_URL, label: "GitHub" }, +]; + export function SiteHeader({ path }: Readonly<{ path?: CanonicalPagePath }>) { return ( <> @@ -30,22 +38,12 @@ export function SiteHeader({ path }: Readonly<{ path?: CanonicalPagePath }>) { brand="Gobstopper" brandMark="/marks/gobstopper.svg" brandLabel="Gobstopper home" - className={ - path === "/" - ? "site-header hraness-material-chrome" - : "site-header" - } - links={[ - { href: "/#model", label: "Model" }, - { href: "/#interfaces", label: "Interfaces" }, - { href: "/docs", label: "Docs" }, - { href: "/methodology", label: "Methodology" }, - { href: "/benchmarks", label: "Benchmarks" }, - { href: "/compare/claude-code-compact", label: "Compare" }, - { href: "/blog", label: "Blog" }, - { href: ARCHITECTURE_URL, label: "Architecture" }, - { href: GITHUB_URL, label: "GitHub" }, - ]} + className="site-header hraness-material-chrome" + links={headerLinks.map(({ href, label, section }) => ({ + href, + label, + current: path !== undefined && section !== undefined && path.startsWith(section), + }))} /> ); diff --git a/site/app/globals.css b/site/app/globals.css index 033a46f7..1d7c96d0 100644 --- a/site/app/globals.css +++ b/site/app/globals.css @@ -17,8 +17,6 @@ :root { --hraness-site-accent: var(--primary); --hraness-site-accent-ink: var(--primary-foreground); - --inverse-background: #14202a; - --gobstopper-code-foreground: #eef2ea; --font-heading: var(--font-text); font-synthesis: none; line-height: 1.55; @@ -70,39 +68,9 @@ a:focus-visible { block-size: 1.25em; } -.gobstopper-marketing-hero .hraness-marketing-hero__heading { - max-inline-size: 22ch; -} - -.hraness-marketing-stats { - --hraness-marketing-fact-columns: 4; -} - -.transcript { - white-space: pre-wrap; - overflow-wrap: anywhere; - border-radius: 0; -} - -.hraness-marketing-proof-frame__content > .transcript { - padding: 1.15rem 1.25rem; -} - -.record-link, -.interface-link { - margin: 0; - font-size: 0.95rem; - font-weight: 500; -} - -.hraness-marketing-section__body > .record-link { - justify-self: start; -} - /* Links inside body copy stay underlined; the grammar's buttons do not. */ -.record-link a, -.interface-link a, .install-note a, +.gob-proof__note a, .hraness-marketing-maker__links a, .hraness-marketing-question__answer a { color: var(--foreground); @@ -111,31 +79,13 @@ a:focus-visible { text-underline-offset: 0.18em; } -.record-link a:hover, -.interface-link a:hover, .install-note a:hover, +.gob-proof__note a:hover, .hraness-marketing-maker__links a:hover, .hraness-marketing-question__answer a:hover { text-decoration-color: currentColor; } -/* The trace section: the heading group stays at the top of its column and - * follows the reader while the trace and record scroll past. */ -#trace[data-layout="split"] { - align-items: start; -} - -@media (min-width: 48.01rem) { - #trace > .hraness-marketing-section__heading-group { - position: sticky; - inset-block-start: 5rem; - } -} - -.hraness-marketing-interface pre { - flex: 1 1 auto; -} - .install-command { white-space: pre; } @@ -221,12 +171,6 @@ a { text-underline-offset: 0.2em; } .document-page article ol { list-style: decimal; padding-left: 1.5rem; margin: 1rem 0; } .document-page article li + li { margin-top: 0.5rem; } -/* The product's command transcript retains its fixed code contrast. */ -.gobstopper-marketing-hero .hraness-marketing-proof-frame { - --hraness-marketing-inverse: var(--inverse-background); - --hraness-marketing-inverse-ink: var(--gobstopper-code-foreground); -} - /* The existing grammar owns layout and controls. Lantern supplies only material paint; these bridges keep old compiled peers and their focus rules intact. */ [data-hraness-material="lantern"] .hraness-marketing-header.hraness-material-chrome { @@ -235,20 +179,6 @@ a { text-underline-offset: 0.2em; } background: var(--hraness-material-chrome-paint, var(--hraness-material-plane)); border-block-end-color: var(--hraness-material-seam); } -@media (max-width: 48rem) { - /* Wrapped navigation has a variable height; keep anchor headings unobscured. */ - [data-hraness-material="lantern"] .hraness-marketing-header.hraness-material-chrome { - position: static; - } -} -[data-hraness-marketing-preset="editorial"] .hraness-material-wall > .hraness-marketing-hero { - padding-inline: var(--hraness-marketing-gutter); -} -[data-hraness-material="lantern"] .hraness-marketing-proof-frame.hraness-material-pane { - --hraness-marketing-line: var(--hraness-material-seam); - --hraness-marketing-surface: var(--hraness-material-plane); - box-shadow: var(--hraness-material-lift); -} /* A framed component already draws its own boundary; a ruled section directly after it would stack a second hairline on the card edge. */ @@ -280,8 +210,6 @@ a { text-underline-offset: 0.2em; } color: var(--hraness-material-ink); } -.gobstopper-topic-icon { display: block; width: 88px; height: 88px; margin: 0 0 18px; } - .gob-agent-marks { display: flex; flex-wrap: wrap; gap: 18px 30px; align-items: center; } @@ -290,119 +218,6 @@ a { text-underline-offset: 0.2em; } margin-block-end: 2rem; } -/* ── Hero: ambient compaction field ─────────────────────────────────────── */ -.gob-opening { position: relative; overflow: clip; } -.gob-opening .gobstopper-marketing-hero { position: relative; z-index: 1; } -/* The shared backdrop is measured against the hero column; this opening lets - the field span the full wall so the haze dies at the viewport edges. */ -.gob-opening .hraness-marketing-hero-backdrop { margin-inline: calc(50% - 50vw); } -.gob-opening .gobstopper-marketing-hero::before { - content: ""; position: absolute; inset: -2rem -4rem; z-index: -1; pointer-events: none; - background: radial-gradient(ellipse 72% 64% at 50% 55%, color-mix(in srgb, var(--background) 82%, transparent), color-mix(in srgb, var(--background) 50%, transparent) 58%, transparent); -} -.gob-field { pointer-events: none; z-index: 0; position: absolute; inset: 0; overflow: clip; } -.gob-field::after { - content: ""; pointer-events: none; position: absolute; inset: 0; - background: - linear-gradient(to right, - var(--background), - color-mix(in srgb, var(--background) 78%, transparent) 5%, - color-mix(in srgb, var(--background) 42%, transparent) 11%, - color-mix(in srgb, var(--background) 15%, transparent) 18%, - transparent 25%, - transparent 75%, - color-mix(in srgb, var(--background) 15%, transparent) 82%, - color-mix(in srgb, var(--background) 42%, transparent) 89%, - color-mix(in srgb, var(--background) 78%, transparent) 95%, - var(--background)), - linear-gradient(to bottom, var(--background), transparent 20%, transparent 84%, var(--background)); -} -.gob-edges { position: absolute; inset: 0; inline-size: 100%; block-size: 100%; } -.gob-edge { - fill: none; stroke: var(--gob-edge-color, color-mix(in srgb, var(--muted) 55%, transparent)); - stroke-width: 1.1px; stroke-dasharray: 3 4; vector-effect: non-scaling-stroke; - opacity: calc(.3 + var(--hraness-hero-proximity, 0) * .7); transition: opacity .45s; -} -.gob-edge--pulse { stroke-dasharray: 5 55; stroke-dashoffset: calc(var(--hraness-hero-proximity, 0) * -24px); } -.gob-edge-label { - position: absolute; translate: -50% -50%; padding: .12rem .4rem; border-radius: 999px; - background: color-mix(in srgb, var(--hraness-material-plane) 78%, transparent); - color: var(--muted); font: italic .5625rem var(--font-mono); letter-spacing: .02em; - white-space: nowrap; opacity: calc(.25 + var(--hraness-hero-proximity, 0) * .75); transition: opacity .45s; -} -.gob-field-note { - position: absolute; left: var(--x); top: var(--y); inline-size: var(--w); - translate: -50% -50%; rotate: var(--r, 0deg); pointer-events: none; - padding: .8rem .95rem; border: 1px solid var(--hraness-material-seam); border-radius: .8rem; - background: color-mix(in srgb, var(--hraness-material-plane) 90%, transparent); - box-shadow: var(--hraness-material-lift); - opacity: calc(.46 + var(--hraness-hero-proximity, 0) * .54); - filter: blur(calc((1 - var(--hraness-hero-proximity, 0)) * 1.9px)); - transform: translate(var(--hraness-hero-drift-x, 0px), var(--hraness-hero-drift-y, 0px)); -} -.gob-field-note-type { - display: inline-block; margin-block-end: .45rem; padding: .1rem .42rem; border-radius: 999px; - background: color-mix(in srgb, var(--gob-note-accent, var(--hraness-site-accent)) 12%, transparent); - color: var(--gob-note-accent, var(--hraness-site-accent)); - font: 600 .5625rem var(--font-mono); letter-spacing: .09em; text-transform: uppercase; -} -.gob-field-note[data-type="session"] { --gob-note-accent: light-dark(#2b5fbf, #7ea4f0); } -.gob-field-note[data-type="snapshot"] { --gob-note-accent: light-dark(#8b631f, #d6b670); } -.gob-field-note[data-type="elision"] { --gob-note-accent: light-dark(#1f6f54, #6fc2a0); } -.gob-field-note[data-type="digest"] { --gob-note-accent: light-dark(#386345, #a7c397); } -.gob-field-note[data-type="threshold"] { --gob-note-accent: light-dark(#8a4a2c, #d88d64); } -.gob-field-note[data-type="event"] { --gob-note-accent: light-dark(#6d5a8a, #a793cf); } -.gob-field-note[data-type="verify"] { --gob-note-accent: light-dark(#4a7a78, #7fb5b2); } -.gob-field-note[data-type="provider"] { --gob-note-accent: light-dark(#2b5fbf, #7ea4f0); } -.gob-field-note[data-type="undo"] { --gob-note-accent: var(--muted); } -.gob-field-note[data-type="strategy"] { --gob-note-accent: light-dark(#4a7a78, #7fb5b2); } -.gob-field-note-title { margin: 0 0 .3rem; font: 600 .8125rem/1.25 var(--font-text); letter-spacing: -.005em; } -.gob-field-note[data-type="undo"] .gob-field-note-title { font-family: var(--font-mono); font-weight: 500; } -.gob-field-note-body { margin: 0; color: var(--muted); font-size: .6875rem; line-height: 1.5; } -.gob-field-note[data-type="undo"] .gob-field-note-body { white-space: pre-line; font-family: var(--font-mono); } -.gob-field-note-tags { display: flex; flex-wrap: wrap; gap: .3rem .45rem; margin-block-start: .55rem; } -.gob-field-note-tags span { color: var(--muted); font: .5625rem var(--font-mono); letter-spacing: .02em; } -@media (prefers-reduced-motion: reduce) { - .gob-field-note { transform: none; } - .gob-edge, .gob-edge-label, .gob-field-note { transition: none; } -} -@media (forced-colors: active) { .gob-field { display: none; } } - -/* ── Hero: context-occupancy sawtooth ───────────────────────────────────── */ -.gob-sawtooth { - padding: 1rem 1.15rem .9rem; - border-bottom: 1px solid var(--line); - cursor: ew-resize; touch-action: pan-y; -} -.gob-sawtooth-head { display: flex; flex-wrap: wrap; justify-content: space-between; gap: .4rem 1rem; align-items: baseline; } -.gob-sawtooth-title { font: .68rem var(--font-mono); letter-spacing: .08em; text-transform: uppercase; color: var(--muted); } -.gob-sawtooth-readout { font: .72rem var(--font-mono); color: var(--foreground); white-space: nowrap; } -.gob-sawtooth-chart { display: block; width: 100%; height: auto; margin-block: .4rem .2rem; } -.gob-sawtooth-grid { stroke: var(--line); stroke-width: .5; stroke-dasharray: 2 5; } -.gob-sawtooth-tick { fill: var(--muted); font: .55rem var(--font-mono); } -.gob-sawtooth-axislabel { fill: var(--muted); font: .55rem var(--font-mono); letter-spacing: .04em; } -.gob-sawtooth-floor { fill: color-mix(in srgb, var(--hraness-site-accent) 7%, transparent); } -.gob-sawtooth-trigger { stroke: light-dark(#8a4a2c, #d88d64); stroke-width: 1; stroke-dasharray: 4 4; } -.gob-sawtooth-provider { fill: none; stroke: var(--muted); stroke-width: 1.5; stroke-dasharray: 6 4; } -.gob-sawtooth-series { fill: none; stroke: var(--hraness-site-accent); stroke-width: 2.2; stroke-linejoin: round; stroke-linecap: round; } -.gob-sawtooth-event path { fill: var(--hraness-site-accent); } -.gob-sawtooth-event text { fill: var(--muted); font: .52rem var(--font-mono); } -.gob-sawtooth-playhead { stroke: var(--foreground); stroke-width: 1; opacity: .5; } -.gob-sawtooth-dot--gob { fill: var(--hraness-site-accent); } -.gob-sawtooth-dot--pro { fill: var(--muted); } -.gob-sawtooth-legend { display: flex; flex-wrap: wrap; gap: .3rem 1.1rem; font-size: .7rem; color: var(--muted); } -.gob-sawtooth-legend span { display: inline-flex; align-items: center; gap: .4rem; } -.gob-sawtooth-swatch { display: inline-block; width: 1.1rem; height: .14rem; border-radius: 999px; } -.gob-sawtooth-swatch--pro { background: var(--muted); } -.gob-sawtooth-swatch--gob { background: var(--hraness-site-accent); } - -/* A deliberately larger hero than the shared h1 token, in the same face. */ -.gobstopper-marketing-hero .hraness-marketing-hero__heading { font-size: clamp(2.8rem, 4.8vw, 4.5rem); line-height: 1.06; letter-spacing: -.05em; } .document-page { font-size: 1rem; line-height: 1.75; } .document-page :is(h1, h2, h3) { letter-spacing: -.025em; } -/* Keep the appearance panel inside the viewport when navigation wraps. */ -@media (max-width: 48rem) { - [data-hraness-material="lantern"] .site-header.hraness-material-chrome { position: relative; } - .site-header .hraness-marketing-header__actions { margin-inline-start: auto; } -} diff --git a/site/app/hero-field.tsx b/site/app/hero-field.tsx deleted file mode 100644 index 89878647..00000000 --- a/site/app/hero-field.tsx +++ /dev/null @@ -1,98 +0,0 @@ -import type { CSSProperties } from "react"; - -type FieldNote = { - id: string; - type: "session" | "snapshot" | "elision" | "digest" | "threshold" | "event" | "verify" | "provider" | "undo" | "strategy"; - title: string; - body: string; - x: number; - y: number; - rotate: number; - width: number; - tags?: string[]; -}; - -const notes: FieldNote[] = [ - { id: "claude", type: "session", title: "claude session 034…", body: "Live, provider-served. ~333k context; native compaction left it alone.", x: 7, y: 24, rotate: 1.4, width: 184 }, - { id: "codex", type: "session", title: "codex session", body: "Idle. Its own JSONL dialect, parsed into the same record model.", x: 47, y: 10, rotate: -1.2, width: 178 }, - { id: "trigger", type: "threshold", title: "trigger 250k", body: "A plan stages below the line; a validated copy publishes on the cross.", x: 84, y: 13, rotate: 1.7, width: 182 }, - { id: "snapshot", type: "snapshot", title: "vault snap_7d3e", body: "Content-addressed. Taken before a single byte is rewritten.", x: 3, y: 56, rotate: -1.6, width: 186 }, - { id: "elide", type: "elision", title: "elide ×43", body: "Stale tool outputs stubbed in the copy; no record deleted, linkage intact.", x: 31, y: 40, rotate: -0.8, width: 196 }, - { id: "digest", type: "digest", title: "digest injected", body: "A compact state card carries the conversation forward.", x: 62, y: 49, rotate: 0.9, width: 180 }, - { id: "verify", type: "verify", title: "verify clean", body: "Parent chains, ordinals, and structure checked after every rewrite.", x: 92, y: 60, rotate: -1.1, width: 190 }, - { id: "provider", type: "provider", title: "provider /compact", body: "Provider compaction stays the provider's own control; released builds leave it off.", x: 96, y: 34, rotate: 0.6, width: 188 }, - { id: "undo", type: "undo", title: "$ gobstopper undo", body: "prepares archived content\nunder a fresh session identity", x: 13, y: 80, rotate: -2, width: 198 }, - { id: "event", type: "event", title: "compaction-events-v1", body: "Best-effort events: snapshot refs and available measurements.", x: 48, y: 84, rotate: 1.5, width: 196 }, - { id: "strategy", type: "strategy", title: "strategy auto", body: "Picks by transcript shape: elide, structured, scored, or provider delegation.", x: 78, y: 87, rotate: -2.2, width: 196 }, -]; - -const edges = [ - { from: "trigger", to: "claude", label: "watches", pulse: true }, - { from: "claude", to: "snapshot", label: "snapshots first" }, - { from: "snapshot", to: "elide", label: "guards" }, - { from: "elide", to: "digest", label: "carries state", pulse: true }, - { from: "digest", to: "verify", label: "checks" }, - { from: "provider", to: "claude", label: "delegates" }, - { from: "codex", to: "elide", label: "candidate" }, - { from: "digest", to: "event", label: "emits" }, - { from: "undo", to: "snapshot", label: "restores" }, - { from: "strategy", to: "elide", label: "selects", pulse: true }, - { from: "undo", to: "event", label: "replays" }, - { from: "verify", to: "provider", label: "returns to" }, -]; - -const noteById = new Map(notes.map((note) => [note.id, note])); - -function edgePath(from: FieldNote, to: FieldNote) { - const midX = (from.x + to.x) / 2; - const bend = Math.min(10, 0.5 * Math.abs(from.y - to.y) + 5); - const topY = Math.min(from.y, to.y) - bend; - return `M ${from.x} ${from.y} Q ${midX} ${topY} ${to.x} ${to.y}`; -} - -function edgeMid(from: FieldNote, to: FieldNote) { - const midX = (from.x + to.x) / 2; - const bend = Math.min(10, 0.5 * Math.abs(from.y - to.y) + 5); - const topY = Math.min(from.y, to.y) - bend; - return [(from.x + 2 * midX + to.x) / 4, (from.y + 2 * topY + to.y) / 4] as const; -} - -/** Product-owned routing artwork. The shared HeroBackdrop owns pointer light, - * proximity, offscreen suspension, and reduced-motion behavior. */ -export function HeroField() { - return ( - - ); -} diff --git a/site/app/hero-graphic.tsx b/site/app/hero-graphic.tsx deleted file mode 100644 index 4784a6b7..00000000 --- a/site/app/hero-graphic.tsx +++ /dev/null @@ -1,153 +0,0 @@ -"use client"; - -import { useEffect, useRef, useState } from "react"; - -// Illustrative sawtooth: context occupancy per turn under two policies. -// The provider compacts once, late, near the top of the window; a 250k/40k -// Gobstopper policy compacts at every crossing of the trigger line. -const TURNS = 28; -const RISE = 34; // tokens per turn, in thousands -const FLOOR = 40; -const TRIGGER = 250; -const CEILING = 1000; -const PROVIDER_DROP_AT = 26.5; -const PROVIDER_AFTER = 90; -const PERIOD = (TRIGGER - FLOOR) / RISE; - -function gobstopperAt(turn: number) { - return FLOOR + (turn % PERIOD) * RISE; -} - -function providerAt(turn: number) { - if (turn < PROVIDER_DROP_AT) return Math.min(920, FLOOR + turn * RISE); - return PROVIDER_AFTER + (turn - PROVIDER_DROP_AT) * RISE; -} - -const W = 720; -const H = 252; -const PAD_L = 46; -const PAD_R = 14; -const PAD_T = 16; -const PAD_B = 30; -const plotW = W - PAD_L - PAD_R; -const plotH = H - PAD_T - PAD_B; - -const xFor = (turn: number) => PAD_L + (turn / TURNS) * plotW; -const yFor = (k: number) => PAD_T + plotH - (k / CEILING) * plotH; - -function gobstopperPath() { - const points: string[] = [`M ${xFor(0)} ${yFor(FLOOR)}`]; - let ctx = FLOOR; - for (let t = 0; t <= TURNS; t += 0.5) { - const next = FLOOR + (t % PERIOD) * RISE; - if (next < ctx) { - // Compaction: drop vertically to the floor at this turn. - points.push(`L ${xFor(t)} ${yFor(FLOOR)}`); - } - ctx = next; - points.push(`L ${xFor(t)} ${yFor(ctx)}`); - } - return points.join(" "); -} - -function providerPath() { - const points: string[] = [`M ${xFor(0)} ${yFor(providerAt(0))}`]; - for (let t = 0.5; t <= TURNS; t += 0.5) { - const prev = providerAt(t - 0.5); - const next = providerAt(t); - if (next < prev) points.push(`L ${xFor(t)} ${yFor(next)}`); - points.push(`L ${xFor(t)} ${yFor(next)}`); - } - return points.join(" "); -} - -// Compaction-event ticks: each Gobstopper drop. -const dropTurns: number[] = []; -for (let t = PERIOD; t <= TURNS; t += PERIOD) dropTurns.push(t); -const dropLabels = ["elide ×43", "compact", "elide ×38", "compact"]; - -const GOB_PATH = gobstopperPath(); -const PROVIDER_PATH = providerPath(); - -/** - * The hero's context-occupancy sawtooth. A playhead sweeps across the chart; - * pointer position scrubs it and the readout reports both policies' context - * at that turn. Idle motion resumes a few seconds after the pointer rests. - */ -export function HeroGraphic() { - const [frac, setFrac] = useState(0.62); - const lastPointer = useRef(-1e4); - const frame = useRef(null); - - useEffect(() => { - if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return; - let raf = 0; - const tick = () => { - if (performance.now() - lastPointer.current > 3200) { - const t = performance.now() / 1000; - setFrac(0.5 + 0.46 * Math.sin(t * 0.21)); - } - raf = requestAnimationFrame(tick); - }; - raf = requestAnimationFrame(tick); - return () => cancelAnimationFrame(raf); - }, []); - - const onMove = (event: React.PointerEvent) => { - const rect = frame.current?.getBoundingClientRect(); - if (rect === undefined || rect.width === 0) return; - lastPointer.current = performance.now(); - setFrac(Math.min(1, Math.max(0, (event.clientX - rect.left) / rect.width))); - }; - - const turn = frac * TURNS; - const gob = gobstopperAt(turn); - const pro = providerAt(turn); - const px = PAD_L + frac * plotW; - - return ( -
-
- context occupancy · 1M-token window - -
- - {/* Window guides */} - {[0, 250, 500, 750, 1000].map((k) => ( - - - {k === 0 ? "0" : `${k}k`} - - ))} - {/* Trigger line and floor band */} - - - trigger {TRIGGER}k - floor {FLOOR}k - {/* Series */} - - - {/* Compaction events */} - {dropTurns.map((t, i) => ( - - - {dropLabels[i] !== undefined && ( - {dropLabels[i]} - )} - - ))} - {/* Playhead */} - - - - turns → - -
- provider: one late compaction - gobstopper: every crossing, early -
-
- ); -} diff --git a/site/app/layout.tsx b/site/app/layout.tsx index c0fc1de2..db55c018 100644 --- a/site/app/layout.tsx +++ b/site/app/layout.tsx @@ -143,7 +143,7 @@ export default function RootLayout({ children, }: Readonly<{ children: React.ReactNode }>) { return ( - + {/* eslint-disable-next-line @next/next/no-sync-scripts */}